userId is a reference id, not a UUID
Every customer id this API returns is a cus_-prefixed reference id —
cus_PWEhqXkPKpWXiFd96jGq. The internal UUID is never exposed: a response filter
rewrites it before the body leaves the server.
That id is what create returns and
what goes in every /api/v0/customer/{userId} URL.
The individual’s verification-provider applicant id is no longer returned —
sumsubApplicantId has been removed from every response. A business still returns
companyApplicantId and each beneficiaries[].applicantId, which is the uboRef
for that owner’s document uploads.Two customer types, the same endpoints
There is also an import path: if you have already verified the customer
elsewhere, pass a
shareToken instead of the full payload.
Base URL
Every endpoint lives under
/api/v0/customer.
Authentication
One header. There is no login step and no secret to send.401 with ERRCORE_1004. A key without the
customers permission returns 403 with ERRCORE_1005 on every call.
Fields that are not part of the contract
currency itself is returned by get and update.
Content types
application/json
Create and update take
application/json; any other body type returns 415. Get,
list, kyc-link and delete take no body and accept any Content-Type.multipart/form-data
A file part named
document, plus text form fields.Rate limiting
The limit is set per API key: 60 requests per minute unless a different limit is configured for your account. Exceeding it returns429 and the request is not
processed — retry in the next minute window.
Correlation id
Every response carries anX-Request-ID header, except a 401 authentication
failure, which carries none. Log it, and quote it when reporting a problem so the
backend can trace that exact request.
Validate everything, then create
On create the whole payload — identity, questionnaire and custom fields — is validated before anything is written. If a single field is wrong the request is rejected with400 and nothing is created. It is all-or-nothing, so a failed create
leaves no partial customer behind. All field, questionnaire and custom-field errors
come back together in errors[], each with its own ERRCUS_* code and the
offending field.
Duplicate email (ERRCUS_1600), duplicate phone (ERRCUS_1601), restricted country
(ERRCUS_1605) and a reused share token are checked afterwards, one at a time,
and only once the fields are valid. This applies to create and update.
On update the questionnaire can’t be sent at all (400 ERRCUS_1303). An update must
carry at least one updatable field with a non-blank value — otherwise it is
400 ERRCUS_1502.