Skip to main content

📄 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 the DAPI_ prefix: the codes on this page appear in the code field of the response envelope and always carry the DAPI_ prefix. Two other families do not, because they appear inside the business payload rather than the envelope: the card order’s data.errorCode (see Card application error codes) and the KYC ticket’s data.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 every DAPI_* 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_ERROR can be retried after a back-off; retrying DAPI_OPERATION_NOT_SUPPORT or DAPI_PERMISSION_DENIED is 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_EXPIRED needs 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_EXISTS and *_NOT_UNIQUE are 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_UNIQUE usually 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; with DAPI_TICKET_REF_REPEATED, use the existing ticket; DAPI_TICKET_APPLY_LIMIT_EXCEEDED needs 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.
KYC rejection reasons are returned through the KYC ticket’s data.errorCode / errorMessage; the full mapping is in KYC reject codes, so the direction of a resubmission can only be inferred from the ticket status and its text.

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_EXCEEDED needs 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 profileId in customer-facing card issuance (the enterprise balance query uses the synonymous field cardProfileId). There is no online query endpoint today; DCS assigns the value offline. Do not use the internal alias categoryId in 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 boolean freeze (true freezes, false unfreezes). 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_REJECT usually 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.

Next steps

Once you have identified the error code, return to Transaction records to understand how Auth, Outstanding and Transaction relate, or go to Sandbox simulation to replay a declined authorization in the test environment.