Transactions
/
Webhook amounts

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 doingRead 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 pathMeaning 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 pathMeaning 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 pathMeaning 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 typeWhat 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 pathMeaning 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.

MessageValues to readLedger 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.

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

FieldRequestApproved 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 componentExact received amountIncluded 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.

Built with