Environments
Two data planes behind one API, chosen entirely by your key's prefix. There are no separate hostnames and no separate accounts.
Keepable runs two isolated data planes:
- Sandbox: synthetic data, mocked side-effects, free. Keys are
kpk_test_. - Live: real recipients, real seals, billed. Keys are
kpk_live_.
The plane is chosen by the key prefix, nothing else. Base URL, endpoints, and request shapes are identical. To switch environments, switch the key.
# Sandbox
GET https://api.keepable.co/sender/v2/me
Authorization: Bearer kpk_test_...
###
# Live
GET https://api.keepable.co/sender/v2/me
Authorization: Bearer kpk_live_...Nothing else in the request says which plane you are on, and that is deliberate: a credential that says live alongside a header that says sandbox is a question no request should be able to ask, and the answer decides whether a real send gets billed.
Confirm which plane you are on
GET https://api.keepable.co/sender/v2/me
Authorization: Bearer {{KEEPABLE_TOKEN}}{ "organization_id": "org_01J8ZQ4T", "plane": "sandbox", "tier": "standard", "approved": false }What differs
| Concern | Sandbox | Live |
|---|---|---|
| Recipients | Synthetic; nothing reaches a real person | Real, NIN-verified people |
| Plan runs | Free | Debit the prepaid wallet |
| Seals and covenants | Produced, verifiable within the plane | Produced, publicly verifiable |
| KYB approval | Not required | Required before any send |
| Identity checks | Mocked | Real, and metered |
Ids never cross planes. A cor_... minted in sandbox does not resolve against a
live key, and nothing you did in sandbox appears in a live list.
Sandbox is usable before approval, which is the point of it: you can build and test the entire integration while your KYB is still in the queue.