Get access#
What has to exist before your first request#
An account record#
Your commercial entity — the thing we contract with and bill.
A distribution configuration on it#
Which channel you see, your credit limit, your billing terms. Without this no key can be issued at all, so it is not an afterthought.
An API credential#
The key itself, plus your callback signing secret.
What you supply#
For the account:
| Field | Required | Notes |
|---|---|---|
| Name | Yes | Your registered entity name |
| Contact person | Yes | |
| Email, phone | Strongly advised | Where we reach you about credit and invoices |
| City, state | No | |
| GSTIN | No | Omit only if genuinely unregistered. It is snapshotted onto every invoice as billToGstin; without it your invoices carry no buyer GSTIN and you cannot claim input credit |
For the distribution configuration, agreed commercially rather than submitted on a form:
| Setting | Default | Notes |
|---|---|---|
| Channel | — | Required. Determines which listings, filters, promotions and bank offers you see. There is no default |
| Credit limit | 0 | A limit of zero refuses every booking. Agree a real number |
| Credit terms (days) | 15 | Drives dueDate on your invoices |
| Billing cycle | MONTHLY | With an anchor day, default 1 |
| Overdue grace (days) | 7 | Past this, an overdue balance puts you on hold and booking stops |
| Bill-to name and address | — | Snapshotted onto every invoice at issue |
| Rate limit overrides | Platform default | See Rate limits |
What you get back#
Two secrets, in one response, once.
apiKey starts dk_live_ and is shown exactly once — we store only a SHA-256 hash, so it is not recoverable by you, by us, or by support.
keyPrefix is the first 12 characters. Safe to log and to display; GET /v1/ping echoes it back so you can confirm which key a deployment holds.
callbackSigningSecret starts whsec_ and is also shown once. You only need it if you use callbacks.
id is what we revoke by.
{
"id": "0f1c9e2a-3b47-4b1e-9d55-0e2a7c8f1b23",
"keyPrefix": "dk_live_9fQ",
"apiKey": "dk_live_9fQx7Kd2m1RtY0vBn4pLcJ8sWaZeH3uG6iO5yT7rXk",
"callbackSigningSecret": "whsec_7bQ1x9KdmR2tY0vBn4pLcJ8sWaZeH3uG6iO5yT7rXk",
"createdAt": "2026-07-29T09:15:22Z"
}And one non-secret: your Razorpay public key id#
Issued separately from the response above. You need it to open Checkout against an invoice's razorpayOrderId — see Invoices.
It is a per-integrator constant rather than per-invoice, which is why no API response carries it. It is a public value and safe to ship in a browser bundle, unlike either secret above.
The callback signing secret#
Two things about it that are easy to get wrong:
- It belongs to the account, not to the key. Issuing a second API key returns the same signing secret rather than rotating it — deliberately, so minting a key never silently breaks a callback receiver that is already running.
- There is no rotation endpoint. Once generated it is fixed. Changing it is a conversation with us, not an API call.
Without a secret on file, supplying a callbackUrl on a booking is rejected with 400. We will not send unsigned callbacks.
If you lose your API key#
There is no recovery and no rotation endpoint. Roll it instead, in this order:
Issue#
Ask us for a new credential. You get a new
dk_live_key; the signing secret is unchanged, so your callback receiver keeps working.Deploy#
Ship the new key everywhere.
Revoke#
Ask us to revoke the old credential by its
id. It stops authenticating immediately — every request with it returns401.
An account can hold several active credentials at once, which is what makes this zero-downtime. Revoking before deploying is the way to take yourself offline.
Multiple keys, on purpose #
Issue a separate credential per deployment — production, staging, the nightly catalogue sync.
Each carries its own keyPrefix, so a log line tells you which one made a call. Each has its own rate-limit bucket, so a runaway batch job cannot starve your live booking path. And each can be revoked without touching the others.
Two ways to be blocked#
They are not the same thing and the symptoms differ:
| What happens | |
|---|---|
Distribution status DISABLED | No API access at all. Every request returns 401, exactly as an unknown key does |
| Account on hold | Reads all work. Only booking is refused, with 402 and reasonCode: "ACCOUNT_ON_HOLD". This is what an unpaid overdue balance past your grace period produces — pay the invoice to clear it |
Next#
Authenticate and call GET /v1/ping, then walk the Quickstart.