EDistribution API

Get access#

What has to exist before your first request#

  1. An account record#

    Your commercial entity — the thing we contract with and bill.

  2. 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.

  3. An API credential#

    The key itself, plus your callback signing secret.

What you supply#

For the account:

FieldRequiredNotes
NameYesYour registered entity name
Contact personYes
Email, phoneStrongly advisedWhere we reach you about credit and invoices
City, stateNo
GSTINNoOmit 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:

SettingDefaultNotes
ChannelRequired. Determines which listings, filters, promotions and bank offers you see. There is no default
Credit limit0A limit of zero refuses every booking. Agree a real number
Credit terms (days)15Drives dueDate on your invoices
Billing cycleMONTHLYWith an anchor day, default 1
Overdue grace (days)7Past this, an overdue balance puts you on hold and booking stops
Bill-to name and addressSnapshotted onto every invoice at issue
Rate limit overridesPlatform defaultSee 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.

Issued credential
{
  "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:

  1. 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.
  2. 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:

  1. 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.

  2. Deploy#

    Ship the new key everywhere.

  3. Revoke#

    Ask us to revoke the old credential by its id. It stops authenticating immediately — every request with it returns 401.

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 DISABLEDNo API access at all. Every request returns 401, exactly as an unknown key does
Account on holdReads 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.