📄 Guide
Whether the platform you are integrating is an exchange, a wallet or something else, you can rely on one standardised set of error codes to locate a problem fast: every DCS API response uses the same format, and decline reasons under Partner-Managed come back as stable error codes that your own system can branch on and turn into user guidance. As a licensed issuer with its own BIN, DCS keeps error semantics consistent across authorization, settlement and reconciliation. This page groups the error codes into buckets by scenario and, for each bucket, adds guidance on whether to retry, what the user should do and whether documents can be resubmitted. It helps you separate system-level errors, parameter and business validation errors and declines under Partner-Managed.The common response envelope
Every endpoint, successful or not, returns the same outer JSON envelope:
Judge success or failure by
code (SYS_SUCCESS on success, one of the DAPI_* codes on this page on failure). Do not branch on the message text, and do not assume messageDetail is always populated.
About theDAPI_prefix: the codes on this page appear in thecodefield of the response envelope and always carry theDAPI_prefix. Two other families do not, because they appear inside the business payload rather than the envelope: the card order’sdata.errorCode(see Card application error codes) and the KYC ticket’sdata.errorCode(see KYC rejection codes). Pick the right form based on where the value comes from.
The division of labour between
messageDetail and message, and whether messageDetail is mandatory on failure, is not yet settled in the documentation.Error codes by bucket
The tables below sort everyDAPI_* code from the published error code list into buckets by scenario. Each bucket carries one set of handling guidance, and any code that needs a note of its own is called out inside its bucket.
1. System-level errors (the partner cannot fix these)
- Retry?
DAPI_SYSTEM_ERRORcan be retried after a back-off; retryingDAPI_OPERATION_NOT_SUPPORTorDAPI_PERMISSION_DENIEDis pointless. - What the user should do: show the end user a message along the lines of “the system is busy, please try again later”.
- Resubmit documents? Not applicable.
- Partner action: if it persists, contact DCS to investigate and confirm which capabilities your account has been enabled for.
2. Authentication and signature errors
- Retry? Yes, once the authentication headers are corrected;
DAPI_TIMESTAMP_EXPIREDneeds a fresh timestamp and a new signature. - What the user should do: nothing, this is a server-side configuration issue on the partner side.
- Resubmit documents? Not applicable.
- Partner action: check the authentication headers and the signing rules item by item; see Authentication and signing.
The nonce range is
[10000, 99999], and it is used together with the request timestamp for replay protection. Callers must not reuse a nonce, and should maintain a separate idempotency key for business write operations.3. Parameter and permission validation errors
- Retry? Yes, once the parameters are corrected.
- What the user should do: nothing, this is a server-side integration issue.
- Resubmit documents? Not applicable.
- Partner action: correct the request body against the parameter table of the endpoint concerned.
4. User and enterprise errors
- Retry? Format errors (
*_INVALID) can be retried once corrected;*_ALREADY_EXISTSand*_NOT_UNIQUEare idempotency or uniqueness conflicts, so use the existing record instead of creating another. - What the user should do: if the email or phone is malformed or already taken, guide the user to change it or confirm ownership.
- Resubmit documents? Not applicable, these are creation-time validations.
- Partner action:
DAPI_CUSTOMER_REF_NOT_UNIQUEusually comes from a duplicate submission; query the existing user instead.
5. KYC, ticket and EDD errors
- Retry? With
DAPI_EXIST_ONGOING_TICKET_ERROR, wait for the existing ticket to close before starting another; withDAPI_TICKET_REF_REPEATED, use the existing ticket;DAPI_TICKET_APPLY_LIMIT_EXCEEDEDneeds a back-off before retrying, so do not resend immediately. - What the user should do: when KYC does not pass, guide the user to supply what the rejection reason asks for (POI or POA). A failed POA does not require a new Sumsub token; use the supplementary endpoint directly.
- Resubmit documents? Yes. A KYC or EDD rejection normally lets the user supplement or update the materials and submit again.
- Partner action: for the KYC flow and its state machine, see KYC flow.
6. Card order and card configuration errors
- Retry? Configuration errors (unsupported profile, layout or country code) need the configuration confirmed on the DCS side first, then a retry; for
*_REF_ALREADY_EXISTS, use the existing order;DAPI_CARD_APPLY_LIMIT_EXCEEDEDneeds a back-off before retrying, so do not resend immediately. - What the user should do: usually nothing. Where a region is not supported, tell the user this card type is not available in their location for now.
- Resubmit documents? Not applicable.
- Partner action: use
profileIdin customer-facing card issuance (the enterprise balance query uses the synonymous fieldcardProfileId). There is no online query endpoint today; DCS assigns the value offline. Do not use the internal aliascategoryIdin a customer-facing integration.
7. Card management and card status errors
- Retry? State mismatch errors require moving the card into the right state before retrying; blind retries achieve nothing. The card state machine is in Card management.
- What the user should do: on a PIN format error, prompt the user to enter four digits again; a card awaiting activation must be activated by the user first.
- Resubmit documents? Not applicable.
- Partner action: freeze and unfreeze share one endpoint,
POST /open-api/card/v1/freeze, distinguished by the booleanfreeze(truefreezes,falseunfreezes). Confirm the current card state before calling it.
8. Hosted page errors
- Retry? Yes, once the hosted page parameters are corrected.
- What the user should do: nothing, this is a parameter issue in how the partner generated the link.
- Resubmit documents? Not applicable.
Declines under Partner-Managed (the important part)
Under Partner-Managed, the spending limits belong to the partner and the partner makes the authorization decision in real time. When a cardholder pays, DCS forwards the authorization request to the partner’s authorization callback URL (auth_url) and the partner approves or declines. When an authorization is declined, the reason is returned in the rejectReason field of the AUTHORISATION_RESULT webhook and the daily authorization report, always carrying the DAPI_ prefix (production example: "approveFlag":"D","rejectReason":"DAPI_SYSTEM_ERROR"). The complete enumeration:
The check order is fixed: card status → KYC spending restriction → velocity limit → enterprise callback → fund hold; when several conditions are hit at once, only the first one is returned.
- Retry? An authorization decline is the outcome of a single transaction; the cardholder has to start again at the merchant. The partner must not retry the same authorization request server-side.
- What the user should do:
DAPI_AUTH_ENTERPRISE_REJECTusually means insufficient limit or a risk rule on the partner side, so the partner should explain it to the end user under its own rules (insufficient balance, over limit and so on). - Resubmit documents? Not applicable.
- Partner action: for a timeout decline (
*_TIMEOUT_REJECT), investigate the response latency of your authorization callback. In production the synchronous response window is 2.5 seconds, and the partner must reply within it.
The authorization request and response fields and the signing rules are in the authorization callback; for where
rejectReason sits in the report files, see the authorization report. Finer business reasons such as insufficient balance, over-limit and restricted MCC are determined and recorded by the partner inside its own authorization logic.
