Going live
View as MarkdownYou build entirely in test mode, then swap to live keys. Nothing else in your code changes. This checklist covers the switch.
Before you flip#
Read the full list once: Integration hard rules (also on the reference checkout).
- Charges: a successful charge returns
status: "succeeded"; you store theid. - Declines: a test decline (an amount below 1.00,
"amount": 99; the sandbox has no decline card) is handled gracefully (you branch oncode, not crash). Buyer UI shows a generic message, never raw fraud reasons. See Testing and Errors. - 3-D Secure:
status: "requires_action"is handled; you complete the step-up and resubmit the same charge withthree_ds.session_idadded (never client cavv/eci). See 3-D Secure. - Client IP: browser +
pk_charge (buyer peer), serversk_charge with the buyer'sdevice_session, or, if you proxy/check, bodyip= shopper. A server charge without a session is never scored on (or blocked by) your egress IP; it just has no buyer IP. See Charges → Client IP. - PAN: only
ev:orwp:v1:tokens on charges; raw digits never hit the API. - Idempotency: every charge and refund sends a stable
Idempotency-Keyper order (not a new UUID on every Pay click). -
/check/ decision token: not pre-approval; token optional but strict if sent; sendcard_bin+last4when you have them. See Decision token. - Device signals: fingerprint / Kount present when CSP allows; empty fails open (sale still runs). See Device data.
- Keys:
sk_server-only;pk_+ Allowed Domains for browser. Mode on the key, not body. - Refunds: full and partial refunds work; you verify with
GET /v1/refunds/:id. - Rate limits: you back off on
429honoringRetry-After. See Rate limits. - Webhooks: your endpoint is registered, verifies signatures,
returns
2xxfast, and is idempotent (dedupes on the event/charge id). - Versioning: your key is pinned to a version.
The switch#
- Create live keys in the dashboard (
pk_live_…/sk_live_…/rk_live_…). Use a restricted key (rk_) scoped to only what each service needs, not a full secret key, wherever possible. See Authentication. - Move secrets to your secret manager. Never commit a live
sk_/rk_key. - Configure your live webhook endpoint and store its signing secret.
- Set an IP allowlist on server keys if your infrastructure has stable egress IPs.
- Swap the key prefix in your config from
_test_to_live_. Done.
After launch#
- Monitor the
Request-Idon failures and keep them for support. - Reconcile periodically with
GET /v1/charges(and/v1/events) so a missed webhook never leaves your records out of sync. - Roll keys with the dashboard's roll action. The old key keeps working during a short grace window so deploys can drain without an outage.
- Need higher rate limits for your live volume? Contact support.
