Webhook amounts
Keep the original transaction amount and currency for purchase display. Use the local account total and currency for holds and postings. Keep settlement values and the fee breakdown to explain how the amounts relate.
This reference covers every amount, currency and rate field in the authorization, presentment and 3D Secure code payloads. Start with the action table, then look up the exact JSON path or open a worked example.
Which value to use
| What you are doing | Read this value and take this action |
|---|---|
Display the purchase or withdrawal | Keep amount_transaction with currency_transaction. For the FX example, this is USD 49.99; its EUR 45.00 local total is a separate value. |
Decide on a debit authorization | Read the type and phase, retain the original amount/currency, and process every local account entry. Reserve the required local total once before approval; return HTTP 200 for approval or HTTP 403 for decline with the corresponding JSON status. See response examples. |
Process approved confirmation | Save the outcome on the same authorization id. Keep the existing purchase hold. The negative amount on confirmation is authorization data; it does not post a debit or create another hold. |
Process declined confirmation | Save the received outcome and release any provisional hold for that request. Do not decide from the sign of amount_transaction alone. |
Process a matched reversal | Release the eligible unposted hold, bounded by the remaining reservation. A reversal is not a posted refund. |
Process a presentment | Post each signed accounts_local[].account_amount once, in its own account_currency; release the entire remaining matched hold in the same accounting operation. |
Explain an FX purchase or ATM fee | Keep transaction and settlement values, local totals, rates and fee components. In the examples, fees are already in the local total. |
Handle a 3D Secure amount | Use it as authentication context. Authorization and clearing decide the later financial effects. |
The purchase reservation rule applies to debit transaction types. Return, Reversal and technical messages have different actions; see authorization types. This guide assumes the client ledger owns the reservation under your program setup.
Sign note: in these purchase examples, the initial request has positive local amounts and the approval confirmation has negative amounts. The confirmation does not post a debit. A positive reversal amount releases the eligible hold; a credit presentment posts a credit. Read the phase and authtype before using the sign.
Authorization fields
These fields are at the top level of the authorization webhook, beside accounts_local.
| Exact field path | Meaning and implementation |
|---|---|
amount_transaction | Amount in the original transaction currency. Use: Display the original purchase or cash amount with currency_transaction; do not use it as the local hold. |
currency_transaction | Currency of amount_transaction. Use: Keep the currency beside the original amount. |
amount_settlement | Authorization amount expressed in settlement currency. Use: Keep it for reconciliation with currency_settlement. It can differ from the local total and change between request and confirmation. |
currency_settlement | Currency of amount_settlement. Use: Keep it beside the settlement amount. This field does not confirm completed settlement. |
rate | Conversion metadata between the original transaction currency and settlement currency. Use: Preserve the received value. The schema does not specify a universal multiplication direction or rounding formula; use the supplied local amount. |
Local account fields
accounts_local is an array on both authorization and presentment messages. The full path matters: accounts_local[].account_amount is the local total; amount_transaction is the original transaction amount.
| Exact field path | Meaning and implementation |
|---|---|
accounts_local[].account_id | Account identifier on this local entry. Use: Resolve it through the configured card/account mapping. Process entries independently; do not assume index 0 or use this value as a global customer identifier. |
accounts_local[].account_currency | Currency of the local account amount. Use: Reserve or post in this currency. Never sum different currencies into one balance. |
accounts_local[].account_amount | Local account total supplied for this message. Use: For an initial debit decision, reserve the required local total once. At approved confirmation keep/update an open hold under the agreed flow rule. At presentment post the signed local movement once and release the whole matched hold, even when the presentment is smaller. |
accounts_local[].account_local_rate | Conversion metadata described by the schema as settlement-to-local currency conversion. Use: Separate from top-level rate. Preserve it rather than reconstructing the local amount. The presentment schema reuses the same description without defining a separate conversion formula. |
accounts_local[].fee_amount | Combined fees for this local account entry. At ATM clearing it includes the Fee (ATM fee) and Markup components. An FX purchase without an ATM fee can contain markup alone.Use: Keep the total for display and reconciliation; it is already included in account_amount, not an extra posting. There is no separate fee_currency field. |
Presentment fields
A presentment supplies the local movement to post and a settlement_details breakdown. It has no top-level amount_transaction, amount_settlement, transaction/settlement currency pair or rate field.
| Exact field path | Meaning and implementation |
|---|---|
settlement_details[].entryType | Component category: Transaction, Fee, Markup or Interchange. Use: Use for the clearing breakdown and reconciliation; a component is not a second customer posting. |
settlement_details[].currency | Currency of this component. Use: For EUR cards, the Transaction component uses EUR, matching accounts_local[].account_currency. Read each component with its amount. |
settlement_details[].amount | Signed amount of this clearing component in its own currency. Use: Preserve its sign. Components do not define a general summation formula for the local account movement. |
sign | Debit or Credit classification of the presentment. Use: accounts_local[].account_amount already carries the posting sign in these examples. Do not negate it again because sign is Debit. |
| Component type | What it describes |
|---|---|
Transaction | Principal component in the local account currency (EUR for EUR cards). It can be positive even when the local posting is a debit. |
Fee | ATM fee. This separate clearing component contributes to the local total fees. |
Markup | Markup shown separately from the ATM fee. It also contributes to the local total fees. |
Interchange | Interchange component when supplied. Its presence does not by itself instruct an extra customer fee; use the local movement and agreed fee contract. |
The complete examples below demonstrate Transaction, Fee and Markup. Interchange is a supported schema value; none of these selected messages contains it.
3D Secure amount fields
The POST /v1/3ds2code callback carries authentication context separately from the authorization webhook.
| Exact field path | Meaning and implementation |
|---|---|
transaction_details[].amount | Transaction amount supplied as 3D Secure authentication context. Use: Display with transaction_details[].currency as appropriate for the authentication journey. Receiving this callback alone does not reserve funds or post a transaction. |
transaction_details[].currency | Currency of this authentication-context amount. Use: Keep it beside transaction_details[].amount; it is not an account or clearing amount. |
Purchase in one currency
Merchant 1 charges EUR 10.65. Request and confirmation share the authorization id; the presentment has a separate id and refers to that authorization.
| Message | Values to read | Ledger action |
|---|---|---|
Decision request | Empty response_code; local account_amount: 10.65 | Reserve EUR 10.65 before approving. Posted movement: EUR 0.00. |
Approved confirmation | Same id; response_code: "Approved"; local account_amount: -10.65 | Keep EUR 10.65 held. Posted movement: EUR 0.00. |
Presentment | authorization_id points to the approval; local account_amount: -10.65 | Post EUR -10.65 once and release the full EUR 10.65 hold. |
Request reserves EUR 10.65. Confirmation keeps the hold. Presentment posts EUR -10.65 once and releases the full hold.
Complete webhook messages
Download these complete messages (JSON)
Identifiers, merchant names, approval codes, dates and locations are fictional. Financial values, field types and references are preserved.
FX purchase with markup
Merchant 2 charges USD 49.99 against a EUR account. The fee is included in the EUR 45.00 local total.
| Field | Request | Approved confirmation |
|---|---|---|
amount_transaction / currency_transaction | USD +49.99 | USD -49.99 |
amount_settlement / currency_settlement | EUR +45.00 | EUR -44.78 |
accounts_local[0].account_amount | EUR +45.00 | EUR -45.00 |
accounts_local[0].fee_amount | EUR +0.22 | EUR -0.22 |
rate | 0.89577920 | 0.8957792 |
accounts_local[0].account_local_rate | 0.89577920 | 1 |
At presentment, Transaction is EUR +44.78 and Markup is EUR -0.22. The EUR 45.00 local total includes EUR 44.78 principal and EUR 0.22 markup. The settlement and local account currencies are both EUR, with local rate 1. Reserve EUR 45.00, then post EUR -45.00 once. Adding 0.22 again would double-count the markup.
USD 49.99 purchase: EUR 45.00 local total includes EUR 0.22 markup. Confirmation does not post; clearing posts EUR -45.00 once.
Complete webhook messages
Download these complete messages (JSON)
Complete webhook examples. Identifiers, merchant names, approval codes, dates and locations are fictional.
ATM withdrawal with FX and a fee
Merchant 12 dispenses CHF 200.00. Reserve EUR 223.18, including EUR 7.96 in fee components. Approved confirmation keeps that hold; cash presentment posts EUR -223.18 once.
| Field | Request | Approved confirmation |
|---|---|---|
amount_transaction / currency_transaction | CHF +200.00 | CHF -200.00 |
amount_settlement / currency_settlement | EUR +223.18 | EUR -215.22 |
accounts_local[0].account_amount | EUR +223.18 | EUR -223.18 |
accounts_local[0].fee_amount | EUR +7.96 | EUR -7.96 |
rate | 1.0761 | 1.0761 |
accounts_local[0].account_local_rate | 1.0761 | 1 |
| Presentment component | Exact received amount | Included magnitude in this example |
|---|---|---|
Transaction | EUR +215.22 | EUR 215.22 |
Fee (ATM fee) | EUR -6.88 | EUR 6.88 |
Markup | EUR -1.08 | EUR 1.08 |
Local account total | EUR -223.18 | EUR 223.18 |
The two fee components are shown separately in settlement_details:
- ATM fee:
entryType: "Fee", EUR -6.88. - Markup:
entryType: "Markup", EUR -1.08. - Combined local fees:
accounts_local[0].fee_amount: -7.96, equal to -6.88 + -1.08 in this same-currency example.
The local debit of EUR -223.18 already includes both fees. Its magnitudes are 215.22 + 6.88 + 1.08 = 223.18; do not post another EUR 7.96. The principal's positive component sign does not change the supplied negative posting sign. Use the complete ATM messages below to check the whole sequence.
CHF 200.00 withdrawal: hold EUR 223.18, including fee EUR 6.88 and markup EUR 1.08. Clearing posts EUR -223.18 once.
Complete webhook messages
Download these complete messages (JSON)
Identifiers, merchant names, approval codes, dates and locations are fictional. Financial values, field types and references are preserved.
Declined purchase
Merchant 8 requests EUR 135.60. The request has local amount 135.60 and top-level rate: 0; a zero rate does not make this a zero-value request. The confirmation reports Insufficient funds and local amount 0, although the top-level transaction amount is -135.6.
Record the decline, release any provisional hold and post EUR 0.00. The outcome and lifecycle phase determine the action; the negative transaction amount does not prove approval.
Declined confirmation has local amount zero. Release any provisional hold; do not post a debit.
Complete webhook messages
Download these complete messages (JSON)
Identifiers, merchant names, approval codes, dates and locations are fictional. Financial values, field types and references are preserved.
Full reversal including the fee
Merchant 9 authorizes GEL 7.30. The initial local total is EUR 2.55 and includes a EUR 0.01 fee. Approved confirmation has local amount -2.55 and fee -0.01; the matched reversal has local amount 2.55 and fee 0.01.
Release up to EUR 2.55 of the eligible remaining hold. The positive reversal amount releases a reservation; it does not post a credit. The request's rate: 0.01 is conversion metadata, not the hold amount.
Approval holds EUR 2.55 including the fee. A full reversal releases the eligible remaining EUR 2.55 without posting a refund.
Complete webhook messages
Download these complete messages (JSON)
Identifiers, merchant names, approval codes, dates and locations are fictional. Financial values, field types and references are preserved.
Smaller presentment
Merchant 7 authorizes EUR 6.50 and clears EUR 6.00. Release the full EUR 6.50 hold and post EUR -6.00 once. The unused EUR 0.50 becomes available again; EUR 0.00 remains held. A later distinct presentment is posted separately without reopening this hold.
EUR 6.50 approved; EUR 6.00 cleared. Release the whole hold; EUR 0.50 becomes available again and EUR 0.00 remains held.
Complete webhook messages
Download these complete messages (JSON)
Identifiers, merchant names, approval codes, dates and locations are fictional. Financial values, field types and references are preserved.
Refund
Merchant 10 sends authtype: "Return" with local amount +177.17. Record the return authorization and its approval. There is no purchase hold and no posted refund yet.
When the credit presentment arrives, post EUR +177.17 once. Its authorization_id identifies the return authorization, which need not identify the original purchase.
Return approval does not post a refund. Credit presentment posts EUR +177.17 once.
Complete webhook messages
Download these complete messages (JSON)
Identifiers, merchant names, approval codes, dates and locations are fictional. Financial values, field types and references are preserved.
Implementation checks
Read the full path, currency, transaction type and phase together. Use decimal arithmetic or currency-aware minor units, preserve rates exactly, and process every local account entry independently.
Keep the first decision response for retries. A confirmation with the same id is a later lifecycle phase; each distinct presentment id is a distinct financial event. Confirmations, reversals and presentments must each apply their effect once.
For further cases, use amount changes and matching, multiple and late clearings, or the complete use-case index.