authorize and reconcile paths the issuer would call in production.
Production returns 404 on these paths.
/sandbox/internal-accounts/{id}/fund.
Issuance suffixes (platformCardId)
The last three characters ofplatformCardId (or cardholderId when
platformCardId is omitted) control how POST /cards resolves:
| Suffix | Behavior |
|---|---|
001 | Stays PENDING_ISSUE indefinitely (test the polling path) |
002 | Issuer provisioning rejected → state: CLOSED, stateReason: "ISSUER_REJECTED" |
005 | Delayed activation (~30s) before the CARD.STATE_CHANGE webhook fires |
| any other | Instant activation → state: ACTIVE, last4 deterministic from the suffix |
Funding-source suffixes (accountId)
Binding a funding source resolves based on the last three characters ofaccountId:
| Suffix | Behavior |
|---|---|
002 | FUNDING_SOURCE_INELIGIBLE (insufficient balance check) |
003 | FUNDING_SOURCE_INELIGIBLE (account closed) |
| any other | Success |
Authorization simulate
merchant.descriptor:
| Suffix | Outcome |
|---|---|
002 | Decline — INSUFFICIENT_FUNDS (the pull on the funding source fails) |
003 | Decline — CARD_PAUSED (use against a FROZEN card to verify) |
005 | Delayed pull (~30s) — exercises the PENDING → CONFIRMED path |
006 | Pull succeeds but the confirmation event reports FAILED — exercises the high-urgency EXCEPTION alert |
| any other | Approved |
CardTransaction.
Clearing simulate
amount > authorizedAmountexercises the over-auth post-hoc pull path (restaurant tip / tip-on-top).amount = 0exercisesAUTHORIZATION_EXPIRY— the auth expires with no clearing posted.
Return simulate
REFUNDED; a partial refund keeps
it SETTLED with a non-zero refundedAmount.
End-to-end happy path
A simple Sandbox loop that exercises issue → activate → auth → clear → refund:CARD.STATE_CHANGE or
CARD.FUNDING_SOURCE_CHANGE webhooks plus transaction webhooks for
the simulated authorization, clearing, and return — wire those into
your local webhook handler to validate end-to-end.