Customers

Create + manage end-user records on the Remittances API. The customer represents one of your end-users (e.g. a Pouch app user) for whom you’re moving money.

The customer object

{
  "object": "customer",
  "id": "ckcust_xxxxxxxxxxxx",
  "customer_reference": "pouch-user-12345",
  "interac_email": "user@pouch.app",
  "status": "verified",
  "env": "live",
  "created_at": "2026-01-15T10:00:00Z"
}

Status values

StatusDescription
pendingCustomer created, awaiting KYC verification
verifiedKYC approved by our regulated verification partner; customer can transact
rejectedKYC rejected — see admin tooling for rejection reason
closedCustomer closed (rare — initiated by you or Technest)

The upstream rail’s internal customer_id is NOT exposed in the public API — Swappr translates it server-side on every payout/VIBAN call. You always reference customers by Swappr’s id (cuid) or customer_reference (your opaque ID).


Create a customer

POST /v1/customers

Creates a customer in our DB + provisions one upstream at our regulated KYC partner. Subsequent KYC docs + verification happen via separate endpoints.

Request

{
  "type": "individual",
  "first_name": "Adaeze",
  "last_name": "Okonkwo",
  "email": "adaeze@example.com",
  "country": "CA",
  "id_type": "passport",
  "id_number": "AB1234567",
  "phone": "+14165550100",
  "dob": "1992-10-15",
  "street": "100 King Street",
  "city": "Toronto",
  "state": "ON",
  "zip_code": "M5V 0E0",
  "tin": "123456789",
  "customer_reference": "pouch-user-12345",
  "interac_email": "adaeze@gmail.com"
}

Required fields

FieldNotes
typeindividual | business
emailCustomer’s email
countryISO 3166-1 alpha-2 (NG, CA, GB, US)
id_typeSee country allowlist
id_numberNational ID, passport, drivers’ license number, or business reg #
tinTax ID — country-specific format
customer_referenceYour unique ID for this customer. One per merchant.
zip_codePostal code per country format

For type=individual: first_name, last_name, dob. For type=business: business_name.

Optional fields

phone, street, city, state, interac_email (CAD-only), id_expiry_date, id_issue_date.

Country-specific TIN format

CountryFormat
NGTIN: 10 digits OR variant with regulator prefix
CASIN: 9 digits
GBUTR: 10 digits
USSSN: 9 digits OR EIN for businesses

Example

curl https://api.swappr.me/v1/customers \
  -H "Authorization: Bearer sk_test_..." \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
    "type": "individual",
    "first_name": "Adaeze",
    "last_name": "Okonkwo",
    "email": "adaeze@example.com",
    "country": "CA",
    "id_type": "passport",
    "id_number": "AB1234567",
    "phone": "+14165550100",
    "dob": "1992-10-15",
    "street": "100 King Street",
    "city": "Toronto",
    "state": "ON",
    "zip_code": "M5V 0E0",
    "tin": "123456789",
    "customer_reference": "pouch-user-12345",
    "interac_email": "adaeze@gmail.com"
  }'

Response

201 Created with the customer object on first create, OR 200 OK if the customer_reference already existed (idempotent replay).

Errors

CodeHTTPCause
country_not_supported400Country not in NG/CA/GB/US
invalid_field400id_type / tin / zip_code format mismatch
customer_already_exists409customer_reference + email already used
interac_email_taken409Same interac_email already on another customer
provider_error502Upstream rail unreachable; retry with same idempotency key

List customers

GET /v1/customers

Cursor-paginated.

ParamNotes
limit1-100, default 50
starting_afterCursor
statusFilter — pending | verified | rejected | closed
qSearch by customer_reference, interac_email, or display name (case-insensitive)

Retrieve a customer

GET /v1/customers/{id}

Accepts cuid OR customer_reference.


Update a customer

PATCH /v1/customers/{id}

Narrow scope — only non-identity fields can be updated:

  • email, phone, street, city, state, zip_code, dob, id_expiry_date

Identity fields (name, country, id_type, id_number, tin) are immutable once the customer has been provisioned upstream. If you need to change them, the customer must be rejected + you create a fresh one with a new customer_reference.

Request

{
  "phone": "+14165550199",
  "street": "200 Bay Street",
  "city": "Toronto"
}

Response

200 OK with updated customer.