API reference#
Credentials, hash formulas, every action and its parameters, callback parameters, error codes and PCI scope.
Integration Model#
CentaPay uses a Server-to-Server (S2S) API only. Your server submits payment requests directly to our platform. Results are delivered both synchronously (JSON response) and asynchronously (callback to your webhook).
Credentials & Environments#
Before you get an account, you must provide the following data to CentaPay:
| Data | Description |
|---|---|
| IP list | IP addresses from which your server will send requests. Requests from un-whitelisted IPs are rejected silently. |
| Callback URL | URL that will receive transaction result notifications (webhooks). Maximum 255 characters. Mandatory if your account supports 3D Secure. |
| Contact email | Email of the person who will monitor transactions, conduct refunds, and handle operational queries. |
You will receive the following credentials:
| Credential | Description | Where Used |
|---|---|---|
CLIENT_KEY |
Unique key identifying your account (UUID format). Corresponds to the Merchant key field in the admin panel. | Sent as a POST parameter on every request |
PASSWORD |
Secret used only to generate the hash signature. Corresponds to the Password field in the admin panel. |
Hash calculation only — never sent over the wire |
PAYMENT_URL |
Base endpoint URL for your account (different for sandbox and production). | All API requests |
Protocol Mapping#
CentaPay maps specific protocol types to each merchant account. You cannot process payments until the relevant protocol has been mapped by CentaPay's operations team during onboarding. Confirm with your account manager before testing.
| Protocol | Used For | Endpoint |
|---|---|---|
| S2S CARD | Card payments, Apple Pay, Google Pay, CREDIT2CARD payouts | https://{PAYMENT_URL}/post |
Content-Type: application/x-www-form-urlencoded. Responses are JSON-encoded.IP Whitelisting & Callbacks#
Requests from un-whitelisted IP addresses are rejected without a response. If you are testing from a development machine with a dynamic IP, use a tunnelling tool like ngrok for callbacks and let your account manager know your IPs need frequent updating during sandbox testing.
Authentication#
CentaPay uses MD5-based request signing. Every API request includes a hash parameter — a signature computed from specific request fields and your account password. There are no Bearer tokens or API key headers.
How It Works#
The hash is computed by reversing specific field values, concatenating them with your PASSWORD, converting to uppercase, then taking the MD5 digest. The exact formula varies by action — see the table below.
PASSWORD never leaves your server. Only the resulting hash is transmitted. If a formula references optional parameters that you do not send in the request, omit them from the hash calculation.Formula Reference#
In all formulas below, strrev() means reverse the string, strtoupper() means convert to uppercase, and md5() means compute the MD5 hex digest.
Formula 1 — SALE, RETRY, RECURRING_SALE
md5(strtoupper( strrev(email) . PASSWORD . strrev(substr(card_number, 0, 6) . substr(card_number, -4)) ))
function hashFormula1(string $email, string $password, string $cardNumber): string
{
$cardPart = substr($cardNumber, 0, 6) . substr($cardNumber, -4);
$raw = strrev($email) . $password . strrev($cardPart);
return md5(strtoupper($raw));
}import hashlib
def hash_formula_1(email: str, password: str, card_number: str) -> str:
card_part = card_number[:6] + card_number[-4:]
raw = email[::-1] + password + card_part[::-1]
return hashlib.md5(raw.upper().encode()).hexdigest()const crypto = require('crypto');
function hashFormula1(email, password, cardNumber) {
const cardPart = cardNumber.slice(0, 6) + cardNumber.slice(-4);
const raw = strrev(email) + password + strrev(cardPart);
return crypto.createHash('md5').update(raw.toUpperCase()).digest('hex');
}
function strrev(s) { return s.split('').reverse().join(''); }When card_token is provided instead of card data:
md5(strtoupper( strrev(email) . PASSWORD . strrev(card_token) ))
When digital_wallet is used (Apple Pay / Google Pay) — Formula 8:
md5(strtoupper( strrev(email) . PASSWORD ))
Formula 2 — CAPTURE, CREDITVOID, VOID, GET_TRANS_STATUS, Callback verification
md5(strtoupper( strrev(email) . PASSWORD . trans_id . strrev(substr(card_number, 0, 6) . substr(card_number, -4)) ))
function hashFormula2(string $email, string $password, string $transId, string $cardNumber): string
{
$cardPart = substr($cardNumber, 0, 6) . substr($cardNumber, -4);
$raw = strrev($email) . $password . $transId . strrev($cardPart);
return md5(strtoupper($raw));
}
// For callback verification, use the card mask from the callback
// (first 6 + last 4 digits visible in the masked PAN)def hash_formula_2(email: str, password: str, trans_id: str, card_number: str) -> str:
card_part = card_number[:6] + card_number[-4:]
raw = email[::-1] + password + trans_id + card_part[::-1]
return hashlib.md5(raw.upper().encode()).hexdigest()function hashFormula2(email, password, transId, cardNumber) {
const cardPart = cardNumber.slice(0, 6) + cardNumber.slice(-4);
const raw = strrev(email) + password + transId + strrev(cardPart);
return crypto.createHash('md5').update(raw.toUpperCase()).digest('hex');
}Formula 3 — CREATE_SCHEDULE
md5(strtoupper(strrev(PASSWORD)))
Formula 4 — PAUSE / RUN / DELETE / SCHEDULE_INFO / DESCHEDULE
md5(strtoupper(strrev(schedule_id + PASSWORD)))
Formula 5 — CREDIT2CARD
md5(strtoupper( PASSWORD . strrev(substr(card_number, 0, 6) . substr(card_number, -4)) )) // With card_token instead: md5(strtoupper(PASSWORD . strrev(card_token)))
Formula 6 — CREDIT2CARD callbacks & GET_TRANS_STATUS (for CREDIT2CARD)
md5(strtoupper( PASSWORD . trans_id . strrev(substr(card_number, 0, 6) . substr(card_number, -4)) ))
Formula 7 — GET_TRANS_STATUS_BY_ORDER
md5(strtoupper( strrev(email) . PASSWORD . order_id . strrev(substr(card_number, 0, 6) . substr(card_number, -4)) ))
Void signature (VOID callbacks)
hash = md5(strtoupper(strrev(trans_id)) . PASSWORD)
Validates VOID callback hashes only - the VOID request itself signs with Formula 2. Unlike Formulas 1-8, the Void signature is a plain MD5 with no SHA1 wrapper.
Formula Quick Reference#
| Action | Formula | Key Inputs |
|---|---|---|
| SALE (card) | Formula 1 | email + PASSWORD + card first6/last4 |
| SALE (card_token) | Formula 1 variant | email + PASSWORD + card_token |
| SALE (digital wallet) | Formula 8 | email + PASSWORD only |
| CAPTURE | Formula 2 | email + PASSWORD + trans_id + card |
| CREDITVOID | Formula 2 | email + PASSWORD + trans_id + card |
| VOID | Formula 2 | email + PASSWORD + trans_id + card |
| RECURRING_SALE | Formula 1 | email + PASSWORD + card first6/last4 |
| RETRY | Formula 1 | email + PASSWORD + card first6/last4 |
| CREDIT2CARD | Formula 5 | PASSWORD + card first6/last4 |
| CREDIT2CARD callback | Formula 6 | PASSWORD + trans_id + card |
| GET_TRANS_STATUS | Formula 2 (or 6 for CREDIT2CARD) | See formula |
| GET_TRANS_DETAILS | Formula 2 (or 6 for CREDIT2CARD) | See formula |
| GET_TRANS_STATUS_BY_ORDER | Formula 7 (or 6 for CREDIT2CARD) | email + PASSWORD + order_id + card |
| CREATE_SCHEDULE | Formula 3 | PASSWORD only |
| Other schedule ops | Formula 4 | schedule_id + PASSWORD |
| Callback (all except CREDIT2CARD, VOID) | Formula 2 | email + PASSWORD + trans_id + card |
| Callback (CREDIT2CARD) | Formula 6 | PASSWORD + trans_id + card |
| Callback (VOID) | Void signature | trans_id + PASSWORD |
order_id must be unique per payment. Submitting a request with an already-used order_id returns error_code 400 (duplicate request). If an outcome is uncertain - timeout, network failure - do not resubmit blindly: query GET_TRANS_STATUS_BY_ORDER first, and treat the callback as the authoritative outcome, especially when cascading is enabled, since one payment request can create multiple intermediate transactions.Callback Parameters by Action#
SALE Callback (Success)
| Parameter | Description |
|---|---|
action | SALE |
result | SUCCESS |
status | PENDING / PREPARE / SETTLED |
order_id | Your order ID |
trans_id | CentaPay transaction ID |
trans_date | Timestamp (YYYY-MM-DD hh:mm:ss) |
amount | Transaction amount |
currency | Currency code |
card | Masked PAN (e.g. 411111****1111). For wallets: decrypted token PAN. |
card_expiration_date | Card expiry |
descriptor | Statement descriptor |
hash | Callback signature — verify with Formula 2 |
recurring_token | If recurring_init=Y was sent |
schedule_id | If schedule used |
card_token | If req_token=Y was sent |
digital_wallet | googlepay or applepay (if wallet used) |
pan_type | DPAN or FPAN (wallet transactions) |
exchange_rate | FX rate (if currency exchange applied) |
exchange_rate_base | Base conversion rate (double conversion) |
exchange_currency | Original currency |
exchange_amount | Original amount |
custom_data | Echoed custom data from request |
connector_name*, rrn*, approval_code*, gateway_id*, merchant_name*, issuer_country*, brand*, arn*, extended_data* | See Extended Callback Data |
SALE Callback (Declined)
card, card_expiration_date, descriptor, amount, currency, card_token, recurring_token, or extended data. You must use the card mask and email stored from your original request when verifying the callback hash.| Parameter | Description |
|---|---|
action | SALE |
result | DECLINED |
status | DECLINED |
order_id | Your order ID |
trans_id | CentaPay transaction ID |
trans_date | Timestamp |
decline_reason | Human-readable decline reason |
custom_data | Echoed custom data from request |
digital_wallet | googlepay or applepay (if wallet used) |
pan_type | DPAN or FPAN (wallet transactions) |
hash | Callback signature — verify with Formula 2 |
CAPTURE Callback
| Outcome | Parameters |
|---|---|
| Success | action: CAPTURE, result: SUCCESS, status: SETTLED, order_id, trans_id, amount, trans_date, descriptor, currency, hash (Formula 2). Extended data fields* if configured. |
| Declined | action: CAPTURE, result: DECLINED, status: PENDING, order_id, trans_id, decline_reason, hash |
| Undefined | action: CAPTURE, result: UNDEFINED, status: PENDING, order_id, trans_id, trans_date, descriptor, amount, currency, hash |
CREDITVOID Callback
Success: action, result: SUCCESS, status (REFUND/REVERSAL/SETTLED), order_id, trans_id, creditvoid_date, amount, hash (Formula 2). Extended data fields* if configured.
Declined: action, result: DECLINED, order_id, trans_id, decline_reason, hash (Formula 2).
Undefined: result: UNDEFINED, status: SETTLED, order_id, trans_id, creditvoid_date, amount, hash (Formula 2).
VOID Callback
| Outcome | Parameters |
|---|---|
| Success | action: VOID, result: SUCCESS, status: VOID, order_id, trans_id, trans_date, hash. Extended data fields* if configured. |
| Declined | action: VOID, result: DECLINED, status: SETTLED, order_id, trans_id, trans_date, decline_reason, hash |
| Undefined | action: VOID, result: UNDEFINED, status: PENDING / SETTLED, order_id, trans_id, trans_date, hash |
md5(strtoupper(strrev(trans_id)) . PASSWORD). Validates VOID callback hashes only - the VOID request itself signs with Formula 2. Unlike Formulas 1-8, the Void signature is a plain MD5 with no SHA1 wrapper.CREDIT2CARD Callback
Uses Formula 6 for hash (not Formula 2). This is the only action with a different callback hash formula.
| Outcome | Parameters |
|---|---|
| Success | action: CREDIT2CARD, result: SUCCESS, status: SETTLED, order_id, trans_id, trans_date, hash (Formula 6). Extended data fields* if configured. |
| Declined | action: CREDIT2CARD, result: DECLINED, status: DECLINED, order_id, trans_id, trans_date, decline_reason, hash (Formula 6) |
| Undefined | action: CREDIT2CARD, result: UNDEFINED, status: PREPARE, order_id, trans_id, trans_date, hash (Formula 6) |
* Extended data fields are included if configured in admin panel (Configuration → Protocol Mappings → "Add Extended Data to Callback").
API Reference — SALE#
https://{PAYMENT_URL}/post| Parameter | Format | Req | Notes |
|---|---|---|---|
action | SALE | Y | |
client_key | UUID | Y | |
channel_id | ≤16 chars | N | Sub-account routing |
order_id | ≤255 chars | Y | Your unique ID |
order_amount | Number | Y | Integer for KZT/UZS. Float XX.XX for USD. 0 allowed with auth=Y |
order_currency | 3-letter | Y | KZT, UZS, USD |
order_description | ≤1024 chars | Y | |
card_number | PAN | Y* | Optional if card_token or payment_token |
card_exp_month | MM | Y* | |
card_exp_year | YYYY | Y* | |
card_cvv2 | 3-4 digits | Y** | Optional if payment_token |
card_token | 64 chars | N | Replaces card fields |
digital_wallet | googlepay/applepay | N | Pair with payment_token |
payment_token | String | N | From Apple/Google Pay |
payer_first_name | ≤32 chars | Y | |
payer_last_name | ≤32 chars | Y | |
payer_middle_name | ≤32 chars | N | |
payer_birth_date | yyyy-MM-dd | N | |
payer_address | ≤255 chars | Y | |
payer_address2 | ≤255 chars | N | |
payer_house_number | ≤9 chars | N | |
payer_country | 2-letter | Y | ISO 3166-1 |
payer_state | ≤32 chars | N | |
payer_city | ≤40 chars | Y | |
payer_district | ≤32 chars | N | |
payer_zip | ≤10 chars | Y | |
payer_email | ≤256 chars | Y | |
payer_phone | ≤32 chars | Y | |
payer_phone_country_code | String | N | |
payer_ip | IPv4/IPv6 | Y | |
term_url_3ds | URL ≤1024 | Y | 3DS return URL |
term_url_target | ≤1024 | N | _blank/_self/_parent/_top/iframe name |
auth | Y/N | N | Y = AUTH only (DMS) |
req_token | Y/N | N | Request card token |
recurring_init | Y/N | N | Init recurring sequence |
schedule_id | String | N | Link to schedule |
parameters | Object | N | Acquirer-specific extra fields |
custom_data | Object | N | Echoed in callback |
hash | MD5 hex | Y | Formula 1 (cards), Formula 8 (wallets) |
* Optional if card_token or payment_token provided. ** Optional if payment_token provided.
Parameter precedence: If card_token and card data are both sent, card_token is ignored. If req_token and card_token are both sent, req_token is ignored. If payment_token and card data are both sent, payment_token is ignored. If card_token is specified, payment_token is ignored.
Response — Success
result | status | Key Response Fields |
|---|---|---|
| SUCCESS | SETTLED / PENDING / PREPARE | order_id, trans_id, trans_date, descriptor, amount, currency, card_token*, recurring_token*, schedule_id*, digital_wallet, pan_type |
Response — 3DS Redirect
result | status | Key Response Fields |
|---|---|---|
| REDIRECT | 3DS / REDIRECT | order_id, trans_id, trans_date, descriptor, amount, currency, redirect_url, redirect_params, redirect_method, digital_wallet, pan_type |
Response — Declined
result | status | Key Response Fields |
|---|---|---|
| DECLINED | DECLINED | order_id, trans_id, trans_date, descriptor, amount, currency, decline_reason, digital_wallet, pan_type |
Response — Undefined
result | status | Key Response Fields |
|---|---|---|
| UNDEFINED | PENDING / PREPARE | order_id, trans_id, trans_date, descriptor, amount, currency, digital_wallet, pan_type — await callback |
API Reference — CAPTURE#
https://{PAYMENT_URL}/post| Parameter | Format | Req | Notes |
|---|---|---|---|
action | CAPTURE | Y | |
client_key | UUID | Y | |
trans_id | UUID | Y | From SALE (auth) response |
amount | Number | N | Omit for full capture. One partial capture allowed. |
hash | MD5 hex | Y | Formula 2 |
Response
SUCCESS → status: SETTLED. DECLINED → status: PENDING + decline_reason. UNDEFINED → status: PENDING.
All responses include: action, result, status, order_id, trans_id, trans_date, descriptor, amount, currency.
API Reference — CREDITVOID#
https://{PAYMENT_URL}/post| Parameter | Format | Req | Notes |
|---|---|---|---|
action | CREDITVOID | Y | |
client_key | UUID | Y | |
trans_id | UUID | Y | |
amount | Number | N | Omit for full refund. Multiple partials allowed. |
hash | MD5 hex | Y | Formula 2 |
Response
Synchronous: result: ACCEPTED. Callback: SUCCESS with status: REFUND/REVERSAL (full) or SETTLED (partial). DECLINED includes decline_reason.
API Reference — VOID#
https://{PAYMENT_URL}/post| Parameter | Format | Req | Notes |
|---|---|---|---|
action | VOID | Y | |
client_key | UUID | Y | |
trans_id | ≤255 chars | Y | |
hash | MD5 hex | Y | Formula 2 |
Response
result | status | Notes |
|---|---|---|
| SUCCESS | VOID | Transaction voided successfully |
| DECLINED | SETTLED | Void rejected — includes decline_reason. Original transaction remains settled. |
| UNDEFINED | PENDING / SETTLED | Status undetermined — await callback for final result |
Same-day only. Applies to SALE, CAPTURE, RECURRING_SALE in SETTLED status.
md5(strtoupper(strrev(trans_id)) . PASSWORD). Validates VOID callback hashes only - the VOID request itself signs with Formula 2. Unlike Formulas 1-8, the Void signature is a plain MD5 with no SHA1 wrapper.API Reference — CREDIT2CARD#
https://{PAYMENT_URL}/post| Parameter | Format | Req | Notes |
|---|---|---|---|
action | CREDIT2CARD | Y | |
client_key | UUID | Y | |
channel_id | ≤16 chars | N | Sub-account |
order_id | ≤255 chars | Y | |
order_amount | Number | Y | |
order_currency | 3-letter | Y | |
order_description | ≤1024 chars | Y | |
card_number | PAN | Y | Recipient card |
payee_first_name | ≤32 chars | N | Recipient name |
payee_last_name | ≤32 chars | N | |
payee_middle_name | ≤32 chars | N | |
payee_birth_date | yyyy-MM-dd | N | |
payee_address | ≤255 chars | N | |
payee_address2 | ≤255 chars | N | |
payee_country | 2-letter | N | |
payee_state | ≤32 chars | N | |
payee_city | ≤32 chars | N | |
payee_zip | ≤10 chars | N | |
payee_email | ≤256 chars | N | |
payee_phone | ≤32 chars | N | |
payer_first_name | ≤32 chars | N | Sender name |
payer_last_name | ≤32 chars | N | |
payer_middle_name | ≤32 chars | N | |
payer_birth_date | yyyy-MM-dd | N | |
payer_address | ≤255 chars | N | |
payer_address2 | ≤255 chars | N | |
payer_country | 2-letter | N | |
payer_state | ≤32 chars | N | |
payer_city | ≤32 chars | N | |
payer_zip | ≤10 chars | N | |
payer_email | ≤256 chars | N | |
payer_phone | ≤32 chars | N | |
payer_ip | IPv4 | N | |
parameters | Object | N | Acquirer-specific |
hash | MD5 hex | Y | Formula 5. Callback uses Formula 6. |
amount or currency on SUCCESS. All responses return: action, result, status, order_id, trans_id, trans_date.result | status | Additional Fields |
|---|---|---|
| SUCCESS | SETTLED | descriptor |
| DECLINED | DECLINED | decline_reason |
| UNDEFINED | PREPARE | descriptor (if available) |
Test card: 4601541833776519.
API Reference — GET_TRANS_STATUS#
https://{PAYMENT_URL}/post| Parameter | Format | Req | Notes |
|---|---|---|---|
action | GET_TRANS_STATUS | Y | |
client_key | UUID | Y | |
trans_id | UUID | Y | |
hash | MD5 hex | Y | Formula 2 (Formula 6 for CREDIT2CARD) |
Response: status (3DS/REDIRECT/PENDING/PREPARE/DECLINED/SETTLED/REVERSAL/REFUND/VOID/CHARGEBACK), decline_reason, recurring_token, schedule_id, digital_wallet, arn* if configured.
API Reference — GET_TRANS_DETAILS#
https://{PAYMENT_URL}/post| Parameter | Format | Req | Notes |
|---|---|---|---|
action | GET_TRANS_DETAILS | Y | |
client_key | UUID | Y | |
trans_id | UUID | Y | |
hash | MD5 hex | Y | Formula 2 (Formula 6 for CREDIT2CARD) |
Response includes: name, mail, ip, amount, currency, card (masked), decline_reason if declined, recurring_token, schedule_id, pan_type, digital_wallet, arn* if configured, transactions[] array (each with date, type, status, amount).
API Reference — GET_TRANS_STATUS_BY_ORDER#
https://{PAYMENT_URL}/post| Parameter | Format | Req | Notes |
|---|---|---|---|
action | GET_TRANS_STATUS_BY_ORDER | Y | |
client_key | UUID | Y | |
order_id | ≤255 chars | Y | Your order ID |
hash | MD5 hex | Y | Formula 7 (Formula 6 for CREDIT2CARD) |
Response: status (3DS/REDIRECT/PENDING/PREPARE/DECLINED/SETTLED/REVERSAL/REFUND/VOID/CHARGEBACK), decline_reason if declined, recurring_token, schedule_id, digital_wallet if applicable. With cascading enabled, returns most recent transaction only.
API Reference — CHARGEBACK#
Callback-only — not merchant-initiated. See Chargebacks for the full callback schema.
API Reference — RECURRING_SALE#
https://{PAYMENT_URL}/post| Parameter | Format | Req | Notes |
|---|---|---|---|
action | RECURRING_SALE | Y | |
client_key | UUID | Y | |
order_id | ≤255 chars | Y | New unique order ID |
order_amount | Number | Y | |
order_description | ≤1024 chars | Y | |
recurring_first_trans_id | UUID | Y | trans_id of initial transaction |
recurring_token | UUID | Y | Token from initial transaction |
schedule_id | String | N | Link to a schedule |
auth | Y/N | N | AUTH only (DMS) |
custom_data | Object | N | Overrides initial SALE custom_data |
hash | MD5 hex | Y | Formula 1 |
Response identical to SALE but action=RECURRING_SALE. Bypasses 3DS.
API Reference — RETRY#
https://{PAYMENT_URL}/post| Parameter | Format | Req | Notes |
|---|---|---|---|
action | RETRY | Y | |
client_key | UUID | Y | |
trans_id | UUID | Y | Declined recurring trans_id |
hash | MD5 hex | Y | Formula 1 |
Sync: result: ACCEPTED, order_id, trans_id. Only for soft declines.
Callback Parameters
Success: action: RETRY, result: SUCCESS, status: SETTLED, order_id, trans_id, amount, currency, hash (Formula 2).
Declined: action: RETRY, result: DECLINED, status: DECLINED, order_id, trans_id, amount, currency, decline_reason, hash (Formula 2).
API Reference — Schedule Operations#
All schedule actions use POST https://{PAYMENT_URL}/post.
CREATE_SCHEDULE
| Parameter | Format | Req | Notes |
|---|---|---|---|
action | CREATE_SCHEDULE | Y | |
client_key | UUID | Y | |
name | ≤100 chars | Y | Schedule name |
interval_length | Number >0 | Y | e.g. 15 for every 15 days |
interval_unit | day/month | Y | |
day_of_month | 1-31 | N | Only if interval_unit=month. 29/30/31 → last day if month shorter. |
payments_count | Number | Y | Total payments in schedule |
delays | Number | N | Intervals to skip before starting |
hash | MD5 hex | Y | Formula 3 |
Response: schedule_id.
PAUSE_SCHEDULE
| Parameter | Req | Notes |
|---|---|---|
action = PAUSE_SCHEDULE | Y | |
client_key | Y | |
schedule_id | Y | |
hash | Y | Formula 4 |
RUN_SCHEDULE
Same parameters as PAUSE_SCHEDULE with action=RUN_SCHEDULE. Resumes paused schedule.
DELETE_SCHEDULE
Same parameters with action=DELETE_SCHEDULE. Permanently removes schedule.
SCHEDULE_INFO
Same parameters with action=SCHEDULE_INFO. Returns: name, interval_length, interval_unit, day_of_month, payments_count, delays, paused (Y/N).
DESCHEDULE
| Parameter | Req | Notes |
|---|---|---|
action = DESCHEDULE | Y | |
client_key | Y | |
recurring_token | Y | From initial transaction |
schedule_id | Y | |
hash | Y | Formula 4 |
Error & Decline Codes#
When a request fails validation, the synchronous response contains:
{
"result": "ERROR",
"error_message": "Description of the error",
"error_code": 204002
}Error Code Reference
| Code | Description | Category |
|---|---|---|
400 | Duplicate request (order_id already used) | Validation |
204002 | Enabled merchant mappings or MIDs not found | Configuration |
204003 | Payment type not supported | Configuration |
204004 | Payment method not supported | Configuration |
204005 | Payment action not supported | Configuration |
204006 | Payment system/brand not supported | Configuration |
204007 | Day MID limit is not set or exceeded | Limits |
204008 | Day merchant mapping limit is not set or exceeded | Limits |
204009 | Payment type not found | Configuration |
204010 | Payment method not found | Configuration |
204011 | Payment system/brand not found | Configuration |
204012 | Payment currency not found | Configuration |
204013 | Payment action not found | Configuration |
204014 | Month MID limit exceeded | Limits |
204015 | Week merchant mapping limit exceeded | Limits |
208001 | Payment not found | Transaction |
208002 | Cannot request 3DS for payment not in 3DS status | Transaction |
208003 | Cannot capture payment not in PENDING status | Transaction |
208004 | Capture amount exceeds auth amount | Transaction |
208005 | Cannot refund payment not in SETTLED or PENDING status | Transaction |
208006 | Refund amount exceeds payment amount | Transaction |
208008 | Reversal amount exceeds payment amount | Transaction |
208009 | Partial reversal not allowed | Transaction |
208010 | Chargeback amount exceeds payment amount | Transaction |
205005 | Card token is invalid or not found | Token |
205006 | Card token is expired | Token |
205007 | Card token is not accessible | Token |
400 | Duplicate request | Validation |
100000 | Previous payment not completed | Validation |
decline_reason field for DECLINED transactions. These are human-readable strings from the issuer or risk engine — not codes. Common examples: "Insufficient funds", "Card expired", "Do not honor".Hash Calculator#
Generate test hashes during development. The PASSWORD is processed client-side only — do not use in production.
Formula 1 — SALE (card)
Formula 2 — CAPTURE / CREDITVOID / VOID / Callback
Formula 5 — CREDIT2CARD
Formula 8 — Digital Wallets (Apple Pay / Google Pay)
Request Builder#
Build a complete SALE request with auto-generated hash and cURL command. Enter your sandbox credentials and card details below.
PCI DSS#
| Integration Type | PCI Requirement |
|---|---|
| S2S with raw card data | PCI DSS SAQ D or full on-site assessment |
| S2S with Apple Pay / Google Pay tokens | Reduced scope — confirm with your QSA |
S2S with CentaPay card token (card_token) | Reduced scope for subsequent charges (initial charge still requires raw card data) |