v1.0

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).

⚠️
PCI DSS required. Because card data is handled server-to-server, you must be PCI DSS compliant or handle only tokenised card data. Contact [email protected] to discuss your compliance posture before going live.

Credentials & Environments#

Before you get an account, you must provide the following data to CentaPay:

DataDescription
IP listIP addresses from which your server will send requests. Requests from un-whitelisted IPs are rejected silently.
Callback URLURL that will receive transaction result notifications (webhooks). Maximum 255 characters. Mandatory if your account supports 3D Secure.
Contact emailEmail of the person who will monitor transactions, conduct refunds, and handle operational queries.

You will receive the following credentials:

CredentialDescriptionWhere 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
🔒
Store PASSWORD securely. Use an environment variable or secrets manager. Never hardcode it in source files or commit it to version control.
ℹ️
Credential rotation. There is no self-service PASSWORD rotation. To rotate your PASSWORD — following a personnel change, suspected compromise, or as a periodic security measure — contact [email protected]. CentaPay will issue a new PASSWORD and coordinate the switchover window with you. We recommend rotating credentials at least annually and immediately after any suspected exposure.

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.

ProtocolUsed ForEndpoint
S2S CARDCard payments, Apple Pay, Google Pay, CREDIT2CARD payoutshttps://{PAYMENT_URL}/post
ℹ️
All requests must use 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.

🔒
The 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

ℹ️
If the formula contains optional parameters that you do not send in the request, please ignore that parameter for the hash.
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#

ActionFormulaKey Inputs
SALE (card)Formula 1email + PASSWORD + card first6/last4
SALE (card_token)Formula 1 variantemail + PASSWORD + card_token
SALE (digital wallet)Formula 8email + PASSWORD only
CAPTUREFormula 2email + PASSWORD + trans_id + card
CREDITVOIDFormula 2email + PASSWORD + trans_id + card
VOIDFormula 2email + PASSWORD + trans_id + card
RECURRING_SALEFormula 1email + PASSWORD + card first6/last4
RETRYFormula 1email + PASSWORD + card first6/last4
CREDIT2CARDFormula 5PASSWORD + card first6/last4
CREDIT2CARD callbackFormula 6PASSWORD + trans_id + card
GET_TRANS_STATUSFormula 2 (or 6 for CREDIT2CARD)See formula
GET_TRANS_DETAILSFormula 2 (or 6 for CREDIT2CARD)See formula
GET_TRANS_STATUS_BY_ORDERFormula 7 (or 6 for CREDIT2CARD)email + PASSWORD + order_id + card
CREATE_SCHEDULEFormula 3PASSWORD only
Other schedule opsFormula 4schedule_id + PASSWORD
Callback (all except CREDIT2CARD, VOID)Formula 2email + PASSWORD + trans_id + card
Callback (CREDIT2CARD)Formula 6PASSWORD + trans_id + card
Callback (VOID)Void signaturetrans_id + PASSWORD
ℹ️
The interactive Hash Calculator in the Testing section lets you generate test hashes during development.
ℹ️
Order IDs and duplicates. 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.
ℹ️
Rate limits. The platform does not impose fixed global rate limits. Transaction limits, including daily limits per merchant identifier, are configured for each client during onboarding and can be adjusted on request.

Callback Parameters by Action#

SALE Callback (Success)

ParameterDescription
actionSALE
resultSUCCESS
statusPENDING / PREPARE / SETTLED
order_idYour order ID
trans_idCentaPay transaction ID
trans_dateTimestamp (YYYY-MM-DD hh:mm:ss)
amountTransaction amount
currencyCurrency code
cardMasked PAN (e.g. 411111****1111). For wallets: decrypted token PAN.
card_expiration_dateCard expiry
descriptorStatement descriptor
hashCallback signature — verify with Formula 2
recurring_tokenIf recurring_init=Y was sent
schedule_idIf schedule used
card_tokenIf req_token=Y was sent
digital_walletgooglepay or applepay (if wallet used)
pan_typeDPAN or FPAN (wallet transactions)
exchange_rateFX rate (if currency exchange applied)
exchange_rate_baseBase conversion rate (double conversion)
exchange_currencyOriginal currency
exchange_amountOriginal amount
custom_dataEchoed 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)

⚠️
Reduced field set. Declined callbacks do not include 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.
ParameterDescription
actionSALE
resultDECLINED
statusDECLINED
order_idYour order ID
trans_idCentaPay transaction ID
trans_dateTimestamp
decline_reasonHuman-readable decline reason
custom_dataEchoed custom data from request
digital_walletgooglepay or applepay (if wallet used)
pan_typeDPAN or FPAN (wallet transactions)
hashCallback signature — verify with Formula 2

CAPTURE Callback

OutcomeParameters
Successaction: CAPTURE, result: SUCCESS, status: SETTLED, order_id, trans_id, amount, trans_date, descriptor, currency, hash (Formula 2). Extended data fields* if configured.
Declinedaction: CAPTURE, result: DECLINED, status: PENDING, order_id, trans_id, decline_reason, hash
Undefinedaction: 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

OutcomeParameters
Successaction: VOID, result: SUCCESS, status: VOID, order_id, trans_id, trans_date, hash. Extended data fields* if configured.
Declinedaction: VOID, result: DECLINED, status: SETTLED, order_id, trans_id, trans_date, decline_reason, hash
Undefinedaction: VOID, result: UNDEFINED, status: PENDING / SETTLED, order_id, trans_id, trans_date, hash
ℹ️
Void signature (VOID callbacks): 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.

OutcomeParameters
Successaction: CREDIT2CARD, result: SUCCESS, status: SETTLED, order_id, trans_id, trans_date, hash (Formula 6). Extended data fields* if configured.
Declinedaction: CREDIT2CARD, result: DECLINED, status: DECLINED, order_id, trans_id, trans_date, decline_reason, hash (Formula 6)
Undefinedaction: 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#

POSThttps://{PAYMENT_URL}/post
ParameterFormatReqNotes
actionSALEY
client_keyUUIDY
channel_id≤16 charsNSub-account routing
order_id≤255 charsYYour unique ID
order_amountNumberYInteger for KZT/UZS. Float XX.XX for USD. 0 allowed with auth=Y
order_currency3-letterYKZT, UZS, USD
order_description≤1024 charsY
card_numberPANY*Optional if card_token or payment_token
card_exp_monthMMY*
card_exp_yearYYYYY*
card_cvv23-4 digitsY**Optional if payment_token
card_token64 charsNReplaces card fields
digital_walletgooglepay/applepayNPair with payment_token
payment_tokenStringNFrom Apple/Google Pay
payer_first_name≤32 charsY
payer_last_name≤32 charsY
payer_middle_name≤32 charsN
payer_birth_dateyyyy-MM-ddN
payer_address≤255 charsY
payer_address2≤255 charsN
payer_house_number≤9 charsN
payer_country2-letterYISO 3166-1
payer_state≤32 charsN
payer_city≤40 charsY
payer_district≤32 charsN
payer_zip≤10 charsY
payer_email≤256 charsY
payer_phone≤32 charsY
payer_phone_country_codeStringN
payer_ipIPv4/IPv6Y
term_url_3dsURL ≤1024Y3DS return URL
term_url_target≤1024N_blank/_self/_parent/_top/iframe name
authY/NNY = AUTH only (DMS)
req_tokenY/NNRequest card token
recurring_initY/NNInit recurring sequence
schedule_idStringNLink to schedule
parametersObjectNAcquirer-specific extra fields
custom_dataObjectNEchoed in callback
hashMD5 hexYFormula 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

resultstatusKey Response Fields
SUCCESSSETTLED / PENDING / PREPAREorder_id, trans_id, trans_date, descriptor, amount, currency, card_token*, recurring_token*, schedule_id*, digital_wallet, pan_type

Response — 3DS Redirect

resultstatusKey Response Fields
REDIRECT3DS / REDIRECTorder_id, trans_id, trans_date, descriptor, amount, currency, redirect_url, redirect_params, redirect_method, digital_wallet, pan_type

Response — Declined

resultstatusKey Response Fields
DECLINEDDECLINEDorder_id, trans_id, trans_date, descriptor, amount, currency, decline_reason, digital_wallet, pan_type

Response — Undefined

resultstatusKey Response Fields
UNDEFINEDPENDING / PREPAREorder_id, trans_id, trans_date, descriptor, amount, currency, digital_wallet, pan_type — await callback

API Reference — CAPTURE#

POSThttps://{PAYMENT_URL}/post
ParameterFormatReqNotes
actionCAPTUREY
client_keyUUIDY
trans_idUUIDYFrom SALE (auth) response
amountNumberNOmit for full capture. One partial capture allowed.
hashMD5 hexYFormula 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#

POSThttps://{PAYMENT_URL}/post
ParameterFormatReqNotes
actionCREDITVOIDY
client_keyUUIDY
trans_idUUIDY
amountNumberNOmit for full refund. Multiple partials allowed.
hashMD5 hexYFormula 2

Response

Synchronous: result: ACCEPTED. Callback: SUCCESS with status: REFUND/REVERSAL (full) or SETTLED (partial). DECLINED includes decline_reason.

API Reference — VOID#

POSThttps://{PAYMENT_URL}/post
ParameterFormatReqNotes
actionVOIDY
client_keyUUIDY
trans_id≤255 charsY
hashMD5 hexYFormula 2

Response

resultstatusNotes
SUCCESSVOIDTransaction voided successfully
DECLINEDSETTLEDVoid rejected — includes decline_reason. Original transaction remains settled.
UNDEFINEDPENDING / SETTLEDStatus undetermined — await callback for final result

Same-day only. Applies to SALE, CAPTURE, RECURRING_SALE in SETTLED status.

ℹ️
Void signature (VOID callbacks): 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#

POSThttps://{PAYMENT_URL}/post
ParameterFormatReqNotes
actionCREDIT2CARDY
client_keyUUIDY
channel_id≤16 charsNSub-account
order_id≤255 charsY
order_amountNumberY
order_currency3-letterY
order_description≤1024 charsY
card_numberPANYRecipient card
payee_first_name≤32 charsNRecipient name
payee_last_name≤32 charsN
payee_middle_name≤32 charsN
payee_birth_dateyyyy-MM-ddN
payee_address≤255 charsN
payee_address2≤255 charsN
payee_country2-letterN
payee_state≤32 charsN
payee_city≤32 charsN
payee_zip≤10 charsN
payee_email≤256 charsN
payee_phone≤32 charsN
payer_first_name≤32 charsNSender name
payer_last_name≤32 charsN
payer_middle_name≤32 charsN
payer_birth_dateyyyy-MM-ddN
payer_address≤255 charsN
payer_address2≤255 charsN
payer_country2-letterN
payer_state≤32 charsN
payer_city≤32 charsN
payer_zip≤10 charsN
payer_email≤256 charsN
payer_phone≤32 charsN
payer_ipIPv4N
parametersObjectNAcquirer-specific
hashMD5 hexYFormula 5. Callback uses Formula 6.
ℹ️
Reduced response fields. Unlike SALE, the CREDIT2CARD synchronous response does not include amount or currency on SUCCESS. All responses return: action, result, status, order_id, trans_id, trans_date.
resultstatusAdditional Fields
SUCCESSSETTLEDdescriptor
DECLINEDDECLINEDdecline_reason
UNDEFINEDPREPAREdescriptor (if available)

Test card: 4601541833776519.

API Reference — GET_TRANS_STATUS#

POSThttps://{PAYMENT_URL}/post
ParameterFormatReqNotes
actionGET_TRANS_STATUSY
client_keyUUIDY
trans_idUUIDY
hashMD5 hexYFormula 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#

POSThttps://{PAYMENT_URL}/post
ParameterFormatReqNotes
actionGET_TRANS_DETAILSY
client_keyUUIDY
trans_idUUIDY
hashMD5 hexYFormula 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#

POSThttps://{PAYMENT_URL}/post
ParameterFormatReqNotes
actionGET_TRANS_STATUS_BY_ORDERY
client_keyUUIDY
order_id≤255 charsYYour order ID
hashMD5 hexYFormula 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#

POSThttps://{PAYMENT_URL}/post
ParameterFormatReqNotes
actionRECURRING_SALEY
client_keyUUIDY
order_id≤255 charsYNew unique order ID
order_amountNumberY
order_description≤1024 charsY
recurring_first_trans_idUUIDYtrans_id of initial transaction
recurring_tokenUUIDYToken from initial transaction
schedule_idStringNLink to a schedule
authY/NNAUTH only (DMS)
custom_dataObjectNOverrides initial SALE custom_data
hashMD5 hexYFormula 1

Response identical to SALE but action=RECURRING_SALE. Bypasses 3DS.

API Reference — RETRY#

POSThttps://{PAYMENT_URL}/post
ParameterFormatReqNotes
actionRETRYY
client_keyUUIDY
trans_idUUIDYDeclined recurring trans_id
hashMD5 hexYFormula 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

ParameterFormatReqNotes
actionCREATE_SCHEDULEY
client_keyUUIDY
name≤100 charsYSchedule name
interval_lengthNumber >0Ye.g. 15 for every 15 days
interval_unitday/monthY
day_of_month1-31NOnly if interval_unit=month. 29/30/31 → last day if month shorter.
payments_countNumberYTotal payments in schedule
delaysNumberNIntervals to skip before starting
hashMD5 hexYFormula 3

Response: schedule_id.

PAUSE_SCHEDULE

ParameterReqNotes
action = PAUSE_SCHEDULEY
client_keyY
schedule_idY
hashYFormula 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

ParameterReqNotes
action = DESCHEDULEY
client_keyY
recurring_tokenYFrom initial transaction
schedule_idY
hashYFormula 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

CodeDescriptionCategory
400Duplicate request (order_id already used)Validation
204002Enabled merchant mappings or MIDs not foundConfiguration
204003Payment type not supportedConfiguration
204004Payment method not supportedConfiguration
204005Payment action not supportedConfiguration
204006Payment system/brand not supportedConfiguration
204007Day MID limit is not set or exceededLimits
204008Day merchant mapping limit is not set or exceededLimits
204009Payment type not foundConfiguration
204010Payment method not foundConfiguration
204011Payment system/brand not foundConfiguration
204012Payment currency not foundConfiguration
204013Payment action not foundConfiguration
204014Month MID limit exceededLimits
204015Week merchant mapping limit exceededLimits
208001Payment not foundTransaction
208002Cannot request 3DS for payment not in 3DS statusTransaction
208003Cannot capture payment not in PENDING statusTransaction
208004Capture amount exceeds auth amountTransaction
208005Cannot refund payment not in SETTLED or PENDING statusTransaction
208006Refund amount exceeds payment amountTransaction
208008Reversal amount exceeds payment amountTransaction
208009Partial reversal not allowedTransaction
208010Chargeback amount exceeds payment amountTransaction
205005Card token is invalid or not foundToken
205006Card token is expiredToken
205007Card token is not accessibleToken
400Duplicate requestValidation
100000Previous payment not completedValidation
ℹ️
Decline reasons are returned in the 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)




Hash will appear here…

Formula 2 — CAPTURE / CREDITVOID / VOID / Callback





Hash will appear here…

Formula 5 — CREDIT2CARD



Hash will appear here…

Formula 8 — Digital Wallets (Apple Pay / Google Pay)



Hash will appear here…

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 TypePCI Requirement
S2S with raw card dataPCI DSS SAQ D or full on-site assessment
S2S with Apple Pay / Google Pay tokensReduced scope — confirm with your QSA
S2S with CentaPay card token (card_token)Reduced scope for subsequent charges (initial charge still requires raw card data)

Compliance#

ℹ️
Merchant eligibility, prohibited services, and CentaPay's AML programme are published in full on Compliance. PSP clients retain responsibility for KYC on their sub-merchants; the AML Statement there sets out the obligations.