Developer docs
PayLink has three public HTTP APIs, each for a different reader and each with its own kind of key. The browser pages (/admin, /{tenant}/console, checkout) are for people and use LoginLink sign-in, not keys.
| API | Who uses it | Key | Base path |
|---|---|---|---|
| Payments API Guide · Reference | A merchant's own server (website, app backend). The integration you'd otherwise write for Razorpay, PayU or PhonePe, written once. | sk_test_{tenant}_…sk_live_{tenant}_… | /api/v1 |
| Tenant automation API Guide · Reference | Scripts and back-office tools that do what a merchant's team does in the console: approve UPI payments, upload bank statements, refunds, webhooks, risk rules. | tdk_{tenant}_… with chosen capabilities | /api/tenant |
| Platform API Reference | Whoever runs this PayLink installation: create and manage tenants, auto-provisioning, audit. | pdk_… from /admin → Developers | /api/admin |
Standards PayLink follows
- REST over HTTPS with JSON, described by OpenAPI 3 (payments, tenant, platform), so you can generate a client in any language.
- Bearer keys (
Authorization: Bearer …, RFC 6750). Keys are stored only as hashes and shown once; revoke any time. - Prefixed keys (
sk_test_,sk_live_,tdk_,pdk_,whsec_), the convention Stripe made common: you can tell what a key is and whether it's live at a glance, and secret scanners can spot a leaked one. The tenant slug in the key names whose it is; it is not a secret, the random part is. - Test and live separation: a test key can never touch real money.
- Idempotency keys on creates, so a retried request never makes a second payment.
- Amounts in minor units (paise) as integers, never floats. ISO 4217 currency codes.
- Signed webhooks: HMAC-SHA256 over
{timestamp}.{body}with a replay window, retried with back-off for 24 hours. - Least privilege: developer keys carry only the capabilities you tick; secret keys can't change settings.
- Errors are JSON
{ "error": "code", "error_description": "…" }with the right HTTP status.