Sent in real time when a cardholder initiates a transaction.
Sent in real time when a cardholder initiates a transaction. Unlike notification webhooks, this is a synchronous request — Altery waits for your response to decide whether to approve or decline the transaction.
To reduce the total authorization time, Altery performs its own authorization checks in parallel with the partner decision request. The transaction is approved only if both Altery and you approve the authorization. If either Altery or you decline, the authorization will be declined.
Response time is criticalYour endpoint must respond within 2 seconds. If it does not respond within this required timeout, the transaction will be automatically declined. No retries are triggered for this webhook type.
Authorization requests are not retried. Each CardAuthorizationRequest is a single real-time decision, and a missing or late response is treated as a decline.
Request Payload Fields
| Field | Type | Description |
|---|---|---|
authorizationId | string (UUID) | Unique identifier for this authorization request |
cardId | string (UUID) | ID of the card being used |
transactionAmount | number | Amount in the transaction currency |
transactionCurrencyCode | string | Transaction currency (ISO 4217, e.g. GBP) |
accountAmount | number | Equivalent amount in the card account currency |
accountCurrencyCode | string | Card account currency (ISO 4217, e.g. EUR) |
merchantId | string | Merchant identifier assigned by the card scheme |
merchantName | string | Merchant name |
merchantCategoryCode | string | MCC — merchant category code |
merchantCity | string | City where the merchant is located |
entryModeType | string | How the card was presented (e.g. Contactless, Chip, Irrelevant) |
isDeclined | boolean | Pre-decline flag set by Altery before forwarding to you |
createdAt | string (ISO 8601) | Timestamp when the authorization was created |
date | string (ISO 8601) | Transaction date as reported by the card scheme |
Sample Request Payload
{
"event":"CardAuthorizationRequest",
"authorizationId": "fd01ce3c-0799-43be-b4cd-b95dd107d4d8",
"cardId": "f16ba382-eb42-481a-b08f-c57bdc9aae24",
"transactionAmount": 800,
"transactionCurrencyCode": "GBP",
"accountAmount": 1000,
"accountCurrencyCode": "EUR",
"merchantId": "SHP00000000057",
"merchantName": "aliexpress.com",
"merchantCategoryCode": "5651",
"merchantCity": "London",
"entryModeType": "Irrelevant",
"isDeclined": true,
"createdAt": "2019-08-24T14:15:22Z",
"date": "2019-08-24T14:15:22Z"
}Response Format
Your endpoint must return HTTP 200 with the following JSON body:
| Field | Type | Description |
|---|---|---|
authorize | string | "true" to approve, "false" to decline |
errorCode | number | 0 for approved. For declines, use a decline reason code (see below) |
errorMsgs | array | Optional array of error message strings for logging |
Sample Response — Approved
{
"authorize": "true",
"errorCode": 0,
"errorMsgs": []
}Sample Response — Declined
{
"authorize": "false",
"errorCode": 21,
"errorMsgs": ["Not sufficient funds"]
}Decline Behavior
The transaction will be declined in any of the following cases:
| Condition | Result |
|---|---|
| Non-200 HTTP status code | Declined |
errorCode is not 0 | Declined |
authorize is not "true" | Declined |
No retriesUnlike notification webhooks,
CardAuthorizationRequestis never retried. Each authorization is a single real-time decision.
Decline Reason Codes
When declining a transaction, set errorCode to the appropriate value from the table below.
Altery uses these exact codes internally when reporting decline reasons to the card scheme. While using them is not mandatory, we strongly recommend aligning with this format to ensure consistent reporting across the full transaction flow.
| Code | Name | Description |
|---|---|---|
0 | TechnicalError | Generic technical error — also used for approved transactions |
1 | UnsupportedMerchant | Merchant is not supported |
2 | DeclineByMerchant | Declined at merchant level |
3 | CVC2orCVV2Incorrect | Card security code is incorrect |
4 | CardNotEffective | Card is not yet effective |
5 | ContactlessPaymentsSwitchedOff | Contactless payments are disabled on this card |
6 | ExceedsContactlessPaymentsDailyLimit | Contactless daily limit exceeded |
7 | ExceedsContactlessPaymentsMonthlyLimit | Contactless monthly limit exceeded |
8 | ExceedsContactlessPaymentsTransactionLimit | Contactless per-transaction limit exceeded |
9 | ExceedsInternetPurchasePaymentsDailyLimit | Online payments daily limit exceeded |
10 | ExceedsInternetPurchasePaymentsMonthlyLimit | Online payments monthly limit exceeded |
11 | ExceedsInternetPurchasePaymentsTransactionLimit | Online payments per-transaction limit exceeded |
12 | ExceedsPurchasesDailyLimit | Purchase daily limit exceeded |
13 | ExceedsPurchasesMonthlyLimit | Purchase monthly limit exceeded |
14 | ExceedsPurchasesTransactionLimit | Purchase per-transaction limit exceeded |
15 | ExceedsWithdrawalAmountLimit | Withdrawal amount limit exceeded |
16 | ExceedsWithdrawalsDailyLimit | Withdrawal daily limit exceeded |
17 | ExceedsWithdrawalsMonthlyLimit | Withdrawal monthly limit exceeded |
18 | ExceedsWithdrawalsTransactionLimit | Withdrawal per-transaction limit exceeded |
19 | ExpiredCard | Card has expired |
20 | InternetPurchasePaymentsSwitchedOff | Online payments are disabled on this card |
21 | NotSufficientFunds | Insufficient balance |
22 | PurchasesSwitchedOff | Purchases are disabled on this card |
23 | WithdrawalsSwitchedOff | Withdrawals are disabled on this card |
24 | CardNotActive | Card is not active |
25 | VirtualCardsNotSupported | Virtual cards are not accepted by this merchant |
26 | CardBlockedAfterIncorrectPin | Card is blocked due to too many incorrect PIN attempts |
27 | ExceedsLimit | Generic limit exceeded |
28 | PhysicalCardsNotSupported | Physical cards are not accepted by this merchant |
29 | InCorrectExpiryDate | Card expiry date is incorrect |
