Skip to content

Go-live checklist

Go through this in the sandbox before you ask for live keys. Each item is something we see go wrong.

  • Every request is signed by your server, with a new nonce each time, the clock on NTP.
  • You hash and send the same bytes; GET and empty-body POSTs hash the empty string.
  • Every command carries an Idempotency-Key stored with your order, and a retry reuses it (idempotency).
  • merchant_order_id and merchant_payout_id are your own unique ids.
  • Timeouts and 503 are retried with the same key; 400, 404, 409 and 422 are not (errors).
  • 429 and payment_busy wait Retry-After.
  • Amounts are strings with two decimals: "2500.00", never a float.
  • You ship only on succeeded — not on processing, not on the payer returning to return_url.
  • Unknown customer_action.kind and unknown stage values do not break you: send the payer to checkout_url.
  • Host-to-host: you show the exact amount, hide the account at expires_at, never cache it.
  • You tested .00, .21 and .13 in the sandbox, and a cancellation.
  • Your endpoint is public HTTPS on 443 or 8443 and answers 2xx within 15 seconds.
  • You verify every event with a Standard Webhooks library, over the raw body.
  • You act once per webhook-id and ignore an older version (ordering).
  • A daily job reconciles open orders by reading them.
  • You check available before large payouts, and handle insufficient_available_balance.
  • A payout’s fee is on top: your player gets amount.
  • After a lost answer you find a payout by merchant_payout_id.
  • Secrets are in a secret store, one key per server (key security).
  • Sandbox and live keys are in separate environments.
  • You know how to replace a key and roll the webhook secret.

Ask your account manager for live access. You get the live API address and sign in to the live console, where you create live keys (mka_…) and set the live webhook endpoint — nothing carries over from the sandbox. Make one small real payment end to end before opening to players.