Skip to main content
  • Option 1: Sumsub Share Token — the user has already been verified in your own Sumsub account, so you hand the Share Token to DCS and upload no document files;
  • Option 2: document file upload — you collect the documents yourself and upload them to DCS.
Both options create the same kind of KYC ticket, with an identical status machine, query API and webhook.

📄 Guide

Whether you are an exchange, a wallet or a platform, you can submit a user’s KYC information to DCS in a single API call. This is a required step before you can issue a card to that user. As a card issuer licensed by the Monetary Authority of Singapore (MAS), DCS receives the data securely, assesses risk against anti-money laundering (AML) rules, and returns the verification result through a webhook.

Who does what

Prerequisites

  • You hold the Enterprise ApiKey / SecretKey — see the Authentication guide.
  • You have created the user and hold their customerId — see Create a user.
  • On the Sumsub route: you have set up a sharing partner relationship between your own Sumsub account and DCS (see the KYC vendor notes) and hold the user’s Share Token.
  • On the upload route: you have the user’s identity document to hand (an ID card, passport or driving license, for example), plus a proof of address if one is required.

Choosing between the two options

How DCS tells them apart: when the document-file fields (identifyProofList / addressProofList) are left empty, DCS skips validating them; when they are supplied, they are checked against the enumerations and the length limits. sumsubShareToken is passed downstream with the request and used to pull the data the user has already had verified in Sumsub. Both may appear in the same request, in which case the downstream risk service decides which one prevails. Either way you must submit career information (kycCareerInfo) — that part is required on both routes.

Option 1: Sumsub Share Token

Minimum request

POST /open-api/kyc-ticket/v1/apply-kyc
On the Sumsub route you can leave identifyProofList / addressProofList empty. sumsubShareToken is passed downstream, where it is used to fetch the documents the user has already had verified in Sumsub.

Option 2: document file upload

Step 1: upload the document files

Identity and address documents are not embedded in the application request itself. Instead you request an S3 pre-upload link, PUT the file to it, and quote the returned objectKey in the application. Call POST /open-api/intent-ticket/v1/generate-pre-upload-url with businessType set to CREATE_CARD_KYC:
The response carries a temporary upload URL and an objectKey for each file. After you PUT the file to the URL, keep the objectKey: it is what goes into the identityProofUrl / addressProofUrl field in the next step, not the full URL.

Step 2: submit the KYC application

POST /open-api/kyc-ticket/v1/apply-kyc

Request fields at a glance

Common fields (both options)

Field specific to option 1

Fields used by option 2

Spelling note: the outer list field is spelled identifyProofList (identify), while its nested fields start with identityProof* (identity). The prefixes differ, so pass each field exactly as spelled in this table.
identifyProofList and its nested identityProofType / identityProofIssuedCountry are all optional at the endpoint level, which is what allows the Sumsub route to send nothing but sumsubShareToken. On the upload route, however, all three are required in practice: verification cannot complete without them.
identifyProofList[] identity document addressProofList[] address document

kycCareerInfo career information (required on both options)

Career information is sensitive data. If you want it encrypted end to end, serialise kycCareerInfo to JSON, encrypt it with AES-GCM, put the ciphertext in kycCareerInfoEncryption and the IV in encryptionIV; the plaintext kycCareerInfo can then be omitted. The fields above are validated against server-side enumerations rather than accepting arbitrary strings. For the full set of values, see the KYC application parameter dictionary.

Response

Every /open-api/ endpoint shares the same response envelope, { code, message, messageDetail, data }. On success, data carries the newly created KYC ticket:
About the envelope: judge success or failure by code (SYS_SUCCESS, for example); message is a short caption. messageDetail is an optional display object (with message / title / type / icon / action / linkTitle / linkUrl) meant for front-end prompts, and should never be used to decide whether a call succeeded.
Note that HTTP 200 with code=SYS_SUCCESS only means the application has been accepted, not that KYC has passed. After a successful submission status is normally INIT, and you get the final outcome from the query API or the webhook.

Following up on the result

Once submitted, the KYC ticket moves through the statuses below. Both options share the same status machine. When status=REJECTED, both the Query KYC endpoint and the KYC_TICKET webhook return an errorCode and an errorMessage giving the reason. For how to handle each one, see KYC reject codes. Prefer webhook subscriptions over polling for status updates; see Webhook events and schema.

Next steps

Once KYC is PASSED, go to the card issuing flow to issue the user a card. If the status is stuck at NEED_VERIFY, start with the face verification page and walk the user through the face scan.