amount you pass is the merchant amount, and your program’s cardholder fees are charged on top of it. The amount on the resulting transaction is therefore the merchant amount plus fees, in the same way a real transaction reports it. See Amounts for the full breakdown.
Fees apply on the same terms as in production. An ATM withdrawal is charged the domestic or the cross-border tier depending on merchant.country, a purchase in another currency is charged the FX markup, and an account with its own override is charged that instead. To exercise a fee, pass channel: ATM or an originalCurrency other than your billing currency; for the cross-border ATM tier, also pass a merchant.country other than your card program’s.
A simulation is deliberately predictable about what it charges: omitting channel runs as ECOMMERCE and omitting merchant.country places the merchant in your card program’s own country. A request that names neither therefore carries no fees, and the same request always charges the same amount.
For the underlying status transitions and what to expect on each event, see Lifecycle.
Scenario 1: Authorization and clearing
- Create a card with
type: VIRTUAL - Simulate authorization with a
cardIdandamount - Confirm
CARD_TRANSACTION_CREATEDwebhook received withstatus: PENDING - Simulate clearing with the
transactionId - Confirm
CARD_TRANSACTION_UPDATEDwebhook received withstatus: CLEARED
Scenario 2: Declined transaction
- Create a card
- Simulate decline with a
cardId,amount, and optionaldeclineReason(defaults toINSUFFICIENT_BALANCE) - Confirm
CARD_TRANSACTION_CREATEDwebhook received withstatus: DECLINED
declineReason.
Scenario 3: Decline against a frozen card
- Freeze a card
- Confirm
CARD_STATUS_UPDATEDwebhook received withstatus: FROZEN - Simulate authorization (confirm it is declined)
- Unfreeze a card
- Confirm
CARD_STATUS_UPDATEDwebhook received withstatus: ACTIVE
Scenario 4: Refund on a cleared transaction
- Create a card
- Simulate authorization
- Simulate clearing with the
transactionId - Simulate refund with the
transactionId - Confirm
CARD_TRANSACTION_UPDATEDwebhook received
Scenario 5: External authorization
Applies to External authorization mode projects only. In Managed projects, Reap decides the authorization and there is no endpoint to call.
CARD_AUTHORIZATION_REQUEST to your registered authorization endpoint and authorizes based on the decision you return. See The authorization request for the contract.
- Register your authorization endpoint (a webhook with
mode: REQUEST) and create a card - Simulate authorization with a
cardIdandamount - Your endpoint receives a
CARD_AUTHORIZATION_REQUEST; return{ "decision": "APPROVE" }or a decline - Confirm the
CARD_TRANSACTION_CREATEDwebhook reflects your decision:status: PENDINGon approve,status: DECLINEDon decline
Scenario 6: Authorization with 3DS challenge (WEBHOOK)
Use this when the card uses3dsChallengeMethod: WEBHOOK and you need to exercise the challenge → respond → transaction path end-to-end.
- Create a card with
3dsChallengeMethod: WEBHOOK(or update an existing card) - Simulate authorization with 3DS with a
cardIdandamount - Confirm
CARD_3DS_CHALLENGE_CREATED— there is noCARD_TRANSACTION_CREATEDyet - Respond to 3DS challenge with
approve: trueorfalse - On approve, confirm
CARD_TRANSACTION_CREATEDwithstatus: PENDING. On reject, the challenge becomesREJECTEDand no transaction is created (same as production — a rejected 3DS never produces a network authorization).
Scenario 7: Detected fraud alert
- Create a card
- Simulate authorization with
triggerFraudAlert: true - Confirm
CARD_TRANSACTION_CREATEDwebhook received withstatus: PENDING - Confirm
CARD_FRAUD_ALERT_CREATEDwebhook received withorigin: DETECTEDandstatus: PENDING - Respond to alert with confirm or decline
Simulating card statuses
To force a card into a status that is otherwise hard to trigger (BLOCKED, EXPIRED), see Simulating card statuses.