Overview
When a card purchase is declined, the API call that reports it still succeeds. You get HTTP200, and the decline travels inside the response body in the decline_reason object.
Decline codes and API error codes are two separate catalogs. A decline code never appears in the code field of an error response, and an error code never appears in decline_reason.
Where you see it
The decline_reason object
REST responses carry three fields:string
The decline code. This is the only field you should branch on.
string
A short human-readable label for the code. Suitable for display, not for parsing.
string
A longer human-readable sentence. It repeats
simple_reason when no additional detail was recorded.response_code and description, which duplicate code and simple_reason. Those two exist for backwards compatibility with older integrations — read code and simple_reason instead.
decline_reason can be null
decline_reason is nullable. It is null both when no reason was recorded for the decline and when the recorded reason is not one that CryptoMate exposes. Nothing in the response tells those two cases apart.
detailed_reason is not a contract
detailed_reason is free text written for humans. Its wording changes without notice, it differs in shape between codes, and for some codes it is a copy of simple_reason.
Decline codes
Balance
Spending limits
Velocity rules
Risk evaluation
Card security
Merchant category
Processing
C020 is a broad bucket, not a specific cause. It is not limited to declines that arrived without an identifiable reason — a decline can surface as C020 even when a more specific cause exists upstream. Treat it as “could not be processed”.Unknown
Declines that block the card
Two codes report that the card was blocked as part of the decline:M210 and C101. A blocked card declines every subsequent purchase until you unblock it. Every other code in this catalog leaves the card usable.

