Test mode

A full sandbox behind your sk_test_ key: every endpoint, the real fee engine, real webhooks — zero real money.

What's identical to live

  • Every endpoint, request shape, response shape, and error code.
  • The fee engine — including any negotiated pricing on your account.
  • Idempotency semantics, rate limits, and webhook signing.

What's different

  • Money is pretend. Fund with the faucet instead of deposits: POST /test/credit (max $100,000/call, 60/hour). Deposit addresses are live-only.
  • Cards are synthetic. Issuance always succeeds instantly; card numbers are deterministic 4242… PANs that pass checksum validation but exist on no network.
  • Spend is simulated. No merchant can charge a test card — you drive transactions yourself:
simulate a purchase or a decline
curl -X POST https://www.primcard.io/api/partner/v1/test/cards/CARD_ID/simulate-transaction \
  -H "Authorization: Bearer sk_test_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "type": "purchase", "amount": 1250 }'   # or "decline"

A simulation runs the real settlement pipeline: transaction fees post, the card balance moves, GET /cards/{id}/transactions shows it, and the card.transaction.created webhook fires — so your integration sees exactly what production will send.

Test and live are hermetically separate: separate balances, separate cards, separate idempotency keyspace. A test card id used with a live key is simply 404. Webhook payloads carry "mode": "test" so one endpoint can serve both.