Skip to main content
Duro has two modes — test and live — and they are separate Postgres schemas, not a flag on a row. A test key cannot read, write, or bill anything in live.

How mode is chosen

CallerMode comes from
Secret/publishable keythe prefix (_test_ / _live_)
OAuth tokenthe client id prefix
Hosted checkoutthe token (cs_<mode>_…)
Customer portalan explicit ?mode= (defaults to live)
You never pass a mode parameter to the merchant API — it’s implied by your key. Use a test key while building, swap to a live key to go to production. The request bodies and responses are identical.
Because the data is physically partitioned, there’s no “test transaction” cluttering your live tables and no risk of a forgotten filter exposing test data to production reads. The isolation is structural. See the data model.

Going live

  1. Complete KYC in the dashboard (CAC, MEMART, status report). An unverified tenant is capped at ₦1,000,000 in total revenue.
  2. Once approved, your tenant’s tier becomes verified and the cap lifts.
  3. Mint a sk_live_ key and point your integration at it. Nothing else changes.