{"openapi":"3.1.0","info":{"title":"MobiTM Partner API","version":"1.0.0","description":"One API for Vendor Payout, Bank Verification · Penniless, Bank Verification · Penny Drop. Every call carries `X-Client-Id` and `X-Client-Secret`; each live key works only from the server IP it was created for, test keys reach the sandbox from anywhere.\n\n`reference_id` is yours and unique: sending the same request again returns the original and never pays twice. If a call times out, retry with the same `reference_id`, never a new one.\n\nLists of values (statuses, failure reasons, error codes, event types) can grow inside v1: treat a value you do not know safely, as the Versioning guide describes.\n\nWhen encryption is on for your account, bodies travel as `{ \"encrypted_data\": … }`, AES-256-GCM with a key per API key: see the Encryption page.\n\nEvery response carries `X-Request-Id`; quote it to support."},"servers":[{"url":"/api/partner/v1","description":"Relative to the host that served this document."}],"security":[{"ClientId":[],"ClientSecret":[]}],"tags":[{"name":"Account","description":"Check your keys and read your wallet. Shared by every product."},{"name":"Webhooks","description":"Signed events about what you started. Shared by every product."},{"name":"Transfers","description":"Send a bank transfer by IMPS or NEFT, then follow it until it succeeds or fails."},{"name":"Bank verification · Penniless","description":"Ask the account's bank whether the account exists and who holds it, without moving any money."},{"name":"Bank verification · Penny drop","description":"Credit ₹1 to the account to prove it exists and get the holder's name; works at every bank."}],"x-tagGroups":[{"name":"Platform","tags":["Account","Webhooks"]},{"name":"Vendor Payout","x-product":"vendor_payout","tags":["Transfers"]},{"name":"Bank Verification · Penniless","x-product":"bank_verify","tags":["Bank verification · Penniless"]},{"name":"Bank Verification · Penny Drop","x-product":"bank_verify_penny_drop","tags":["Bank verification · Penny drop"]}],"x-pages":[{"id":"get-started","title":"Get started","summary":"Everything you need before your first call.","sections":[{"id":"how-it-works","title":"How it works","body":"- One API for every product, at `/api/partner/v1`\n- JSON over HTTPS; send `Content-Type: application/json` with a body\n- Money fields are rupee strings with two decimals: `\"2500.00\"`\n- Times are Indian Standard Time, ISO 8601\n- Every response carries `X-Request-Id`: quote it to support"},{"id":"keys","title":"Keys","sample":"ping","body":"- Send `X-Client-Id` and `X-Client-Secret` on every call\n- Test keys (`ck_test_…`) reach the sandbox from anywhere\n- Each live key (`ck_live_…`) works only from the one approved server IP it was created for\n- A secret is shown once, when its key is created, with the key's encryption key\n- Rotating a key keeps the old secret working for 24 hours\n\n> **Keep the secret on your server.** Never put it in an app, a browser or a code repository."},{"id":"server-ips","title":"Server IPs","body":"- Add up to 2 addresses your servers call from, on the Developer page\n- An admin approves each one\n- Create one live key per approved IP: it works from that IP and no other\n- One address per entry, IPv4 or IPv6; no ranges\n- Removing an IP revokes its live key\n- Test keys ignore the list"},{"id":"sandbox","title":"Sandbox","body":"- Test keys call the same endpoints as live keys\n- Nothing moves: sandbox rows are kept apart from live ones\n- Webhooks still arrive, with `environment: sandbox`\n- The sandbox balance is always ₹10,00,000.00\n- Each product lists the test values that pick an outcome"},{"id":"going-live","title":"Going live","body":"1. Build and test with a test key\n2. Add your production server IP and wait for approval\n3. Have your KYC approved\n4. Request go-live on the Developer page\n5. Create a live key for each approved server IP and keep it apart from the test key\n\n> **Live keys move real money.** Keep test and live keys in separate environment variables."}],"group":"Platform"},{"id":"encryption","title":"Encryption","summary":"When encryption is on for your account, request and response bodies travel encrypted.","sections":[{"id":"when-on","title":"When it is on","body":"- Encryption is switched on per account; the Developer page says whether yours is\n- While it is on, every body you send must be encrypted and every answer comes back encrypted, sandbox and live alike\n- Each key has its own encryption key, shown once beside its secret\n- Headers, the path and the query string are not encrypted; HTTPS protects them\n\n> **Keep the encryption key with the secret.** Never put either in an app, a browser or a code repository."},{"id":"how","title":"Encrypt and decrypt","sample":"encryption","body":"1. Decode your encryption key from base64: 32 bytes, for AES-256-GCM\n2. Pick 12 random bytes as the IV, new for every body: never reuse one\n3. Encrypt the JSON text and keep the 16-byte tag\n4. Send `{ \"encrypted_data\": base64(IV + ciphertext + tag) }` and nothing else\n5. Decrypt every answer the same way: the first 12 bytes are its IV, the last 16 its tag\n\n- In Postman, set the collection's `encryption_key` variable: requests are encrypted for you and the Visualize tab shows each answer decrypted"},{"id":"plain-answers","title":"Answers that stay plain","body":"- We answer in plain when we could not open your request: a failed sign-in, `encryption_required`, `invalid_encrypted_payload` and `encryption_key_missing`\n- So read every answer one way: if it has `encrypted_data`, decrypt it; if it has `error`, it is already plain\n\n> **Never fall back to plain.** A plain body is refused while encryption is on."},{"id":"try-it","title":"Try it","kind":"encryption-tool"}],"group":"Platform"},{"id":"account","title":"Account","summary":"Check your keys and read your wallet. Shared by every product.","operations":["ping","getBalance"],"group":"Platform"},{"id":"webhooks","title":"Webhooks","summary":"We call your server when something you started finishes.","sections":[{"id":"set-up","title":"Set up","body":"- One https URL per account, set on the Developer page\n- It must be a public address: local and private ones are refused\n- The signing secret is shown once, when you add the URL\n- **Send test event** on the Developer page checks the whole path"},{"id":"verify","title":"Verify every request","sample":"webhook-verify","body":"- HMAC-SHA256 of `{X-Webhook-Timestamp}.{raw body}`, keyed with your signing secret\n- Compare it with each `v1=` value in `X-Webhook-Signature`\n- Reject a timestamp more than 5 minutes from your clock\n- After a secret rotation, both secrets sign for 24 hours"},{"id":"delivery","title":"Delivery and retries","body":"- Answer any 2xx within 10 seconds\n- Anything else is retried for about two days\n- Delivery is at least once: dedupe on the event `id`\n- Order is not guaranteed: when in doubt, read the resource\n- New event types may appear: ignore one you do not handle"},{"id":"while-off","title":"While the webhook is off","body":"> **Events are not kept while it is off.** Results that finish then are never sent; read them with the product's GET call."},{"id":"event-types","title":"Event types","kind":"events-index"}],"events":["webhook.test"],"group":"Platform"},{"id":"errors-limits","title":"Errors and limits","summary":"What an error looks like, and what to do about each one.","sections":[{"id":"format","title":"Error format","sample":"error","body":"- Every error is `{ \"error\": { \"code\", \"message\" }, \"request_id\" }`\n- The HTTP status is real: 4xx is yours to fix, 5xx is ours\n- Act on `code`; `message` is for people and may change\n- New codes may appear: handle an unknown one by its status"},{"id":"rate-limits","title":"Rate limits","body":"- Each account has a per-minute limit: 60 calls unless agreed otherwise\n- Past it: `429 rate_limited`, with `Retry-After` in seconds\n- Wait that long, then send the same request again"},{"id":"service-hours","title":"Service hours","body":"- A product can have service hours for your account, set per day of the week; the Developer page shows them\n- Outside them a send answers `503 outside_service_hours`\n- `Retry-After` says when it opens, and no money is held\n- Reads keep working"},{"id":"failed-sign-ins","title":"Failed sign-ins","body":"- 10 wrong secrets for one key within 5 minutes lock that key\n- 20 failed attempts lock the address they came from\n- Both answer `429 too_many_failed_attempts` until the 5 minutes end\n- Calls from your approved IPs are never locked out"},{"id":"error-codes","title":"Every error code","kind":"error-table"}],"group":"Platform"},{"id":"versions","title":"Changes and versions","summary":"How v1 can change, and how to write code that keeps working.","sections":[{"id":"what-can-change","title":"What can change inside v1","body":"- New endpoints and new products\n- New optional fields in requests and responses\n- New values in a list: statuses, failure reasons, error codes, event types"},{"id":"keep-working","title":"Keep your code working","body":"- Ignore fields you do not know\n- Treat an unknown `status` as still processing and keep checking\n- Handle an unknown error `code` by its HTTP status\n- Ignore an event `type` you do not handle"},{"id":"new-version","title":"What waits for a new version","body":"- Renaming or removing a field\n- Changing a type, or tightening a rule\n- Announced ahead, with both versions served while you move"}],"group":"Platform"},{"id":"vendor-payout","title":"Overview","heading":"Vendor Payout","summary":"Send money to any bank account in India by IMPS or NEFT, and follow each transfer to the end.","sections":[{"id":"lifecycle","title":"How a transfer moves","sample":"getTransfer","body":"- `processing`: amount + fee are held and the bank is working on it\n- `success`: it reached the account; `utr` is the bank's reference\n- `failed`: amount + fee are back in your wallet; `failure_reason` says why\n- A transfer can stay `processing` for hours\n\n> **Never send a processing transfer again.** Wait for its webhook, or keep checking it."},{"id":"duplicates","title":"Retries and duplicates","sample":"createTransfer","body":"- `reference_id` is yours: one per transfer, case-sensitive\n- Same `reference_id`, same body: the original transfer (`200`), never a second payment\n- Same `reference_id`, different body: `409 reference_conflict`\n- On a timeout, **retry** with the same `reference_id`, never a new one"},{"id":"results","title":"Hearing the result","body":"- The `transfer.success` or `transfer.failed` webhook (recommended)\n- Or `GET /transfers/{reference_id}` until the status is final"}],"events":["transfer.success","transfer.failed"],"group":"Vendor Payout"},{"id":"send-transfer","title":"Send a transfer","operations":["createTransfer"],"sections":[{"id":"sandbox","title":"Try it in the sandbox","body":"With a test key the amount picks the outcome:\n- `101`: failed at once (failure_reason: declined)\n- `102`: processing, then success after 2 minutes\n- `103`: processing, then failed after 2 minutes\n- `104`: processing, and never resolves\n- `105`: 402 insufficient_balance; nothing is created\n- `106`: 503 sandbox_retry_later; a retry with the same reference_id then succeeds\n- Any other amount: success at once"}],"group":"Vendor Payout"},{"id":"check-transfer","title":"Check a transfer","operations":["getTransfer"],"group":"Vendor Payout"},{"id":"bank-verification-penniless","title":"Overview","heading":"Bank Verification · Penniless","summary":"Ask the account's bank whether the account exists and who holds it, without moving any money.","sections":[{"id":"penniless-how","title":"How it works","body":"- No money moves: the bank is asked directly\n- About 60 large banks support it: HDFC, SBI, ICICI, Axis, Kotak, PNB, Canara, Union and more\n- A bank without it answers `mode_not_supported`, free: verify the account again with the Penny Drop API"},{"id":"penniless-results","title":"What you get back","sample":"getPennilessVerification","body":"- `success`: the account exists; `account_holder_name` is the bank's, and `name_match` scores your `name` against it\n- `failed`: `failure_reason` says why, and `retryable` says whether a new attempt can help\n- `processing` (`202`): the bank has not answered yet; read it back with the same `reference_id`\n\n> **A low score is not a failure.** Decide yourself what `name_match` is good enough; `matched` is true from 70."},{"id":"penniless-fees","title":"Fees","body":"- This API has its own price on your account\n- The fee is held when you call, then taken whenever the banking network charges for the answer: every `success`, and most failures, such as `invalid_account`, `account_closed` and some `bank_unavailable` answers\n- Nothing is taken when we refuse the call, for `mode_not_supported`, for a repeat within 24 hours, for a `bank_unavailable` answer the network did not charge for, or when support cancels it\n- `fee` on each answer is exactly what was taken; `0.00` means nothing"},{"id":"penniless-duplicates","title":"Retries, duplicates and repeats","sample":"verifyBankAccountPenniless","body":"- Same `reference_id`, same body: the original answer (`200`), never a second fee\n- Same `reference_id`, different body or the other API: `409 reference_conflict`\n- The same account and IFSC again on this API within 24 hours, with a new `reference_id`: your earlier answer, `reused: true`, free\n- Banks allow one check per account a day: a repeat outside that rule answers `verification_limit_reached`"}],"group":"Bank Verification · Penniless"},{"id":"verify-bank-account-penniless","title":"Verify a bank account","operations":["verifyBankAccountPenniless"],"sections":[{"id":"penniless-sandbox","title":"Try it in the sandbox","body":"With a test key the account number's last four digits pick the outcome:\n- ending `0002`: failed at once (failure_reason: invalid_account), fee taken\n- ending `0003`: failed at once (failure_reason: account_closed), fee taken\n- ending `0004`: failed at once (failure_reason: bank_unavailable, retryable), no fee\n- ending `0005`: processing (202), then success after 2 minutes\n- ending `0006`: failed (failure_reason: mode_not_supported), no fee, on the penniless API; success on the penny drop API\n- ending `0007`: 402 insufficient_balance; nothing is created\n- Any other account: success at once, holder `SANDBOX ACCOUNT HOLDER`"}],"group":"Bank Verification · Penniless"},{"id":"check-bank-verification-penniless","title":"Check a verification","operations":["getPennilessVerification"],"group":"Bank Verification · Penniless"},{"id":"bank-verification-penny-drop","title":"Overview","heading":"Bank Verification · Penny Drop","summary":"Credit ₹1 to the account to prove it exists and get the holder's name; works at every bank.","sections":[{"id":"penny-drop-how","title":"How it works","body":"- ₹1 is credited to the account, so it works at every bank, including co-operative and regional ones\n- Its own price on your account, usually above penniless"},{"id":"penny-drop-results","title":"What you get back","sample":"getPennyDropVerification","body":"- `success`: the account exists; `account_holder_name` is the bank's, and `name_match` scores your `name` against it\n- `failed`: `failure_reason` says why, and `retryable` says whether a new attempt can help\n- `processing` (`202`): the bank has not answered yet; read it back with the same `reference_id`\n\n> **A low score is not a failure.** Decide yourself what `name_match` is good enough; `matched` is true from 70."},{"id":"penny-drop-fees","title":"Fees","body":"- This API has its own price on your account\n- The fee is held when you call, then taken whenever the banking network charges for the answer: every `success`, and most failures, such as `invalid_account`, `account_closed` and some `bank_unavailable` answers\n- Nothing is taken when we refuse the call, for `mode_not_supported`, for a repeat within 24 hours, for a `bank_unavailable` answer the network did not charge for, or when support cancels it\n- `fee` on each answer is exactly what was taken; `0.00` means nothing"},{"id":"penny-drop-duplicates","title":"Retries, duplicates and repeats","sample":"verifyBankAccountPennyDrop","body":"- Same `reference_id`, same body: the original answer (`200`), never a second fee\n- Same `reference_id`, different body or the other API: `409 reference_conflict`\n- The same account and IFSC again on this API within 24 hours, with a new `reference_id`: your earlier answer, `reused: true`, free\n- Banks allow one check per account a day: a repeat outside that rule answers `verification_limit_reached`"}],"group":"Bank Verification · Penny Drop"},{"id":"verify-bank-account-penny-drop","title":"Verify a bank account","operations":["verifyBankAccountPennyDrop"],"sections":[{"id":"penny-drop-sandbox","title":"Try it in the sandbox","body":"With a test key the account number's last four digits pick the outcome:\n- ending `0002`: failed at once (failure_reason: invalid_account), fee taken\n- ending `0003`: failed at once (failure_reason: account_closed), fee taken\n- ending `0004`: failed at once (failure_reason: bank_unavailable, retryable), no fee\n- ending `0005`: processing (202), then success after 2 minutes\n- ending `0006`: failed (failure_reason: mode_not_supported), no fee, on the penniless API; success on the penny drop API\n- ending `0007`: 402 insufficient_balance; nothing is created\n- Any other account: success at once, holder `SANDBOX ACCOUNT HOLDER`"}],"group":"Bank Verification · Penny Drop"},{"id":"check-bank-verification-penny-drop","title":"Check a verification","operations":["getPennyDropVerification"],"group":"Bank Verification · Penny Drop"}],"paths":{"/ping":{"get":{"tags":["Account"],"operationId":"ping","summary":"Check your keys","description":"Answers with the key you called with, so you can check keys and server IPs before the first real call.","x-glance":["Works with test and live keys","Tells you which key and environment you called with","Calls nothing else and moves no money"],"responses":{"200":{"description":"The key works.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ping"},"examples":{"ping":{"value":{"client_id":"ck_test_9fK2mQ7xR4tW8bZ1C3dE","environment":"test","merchant_id":"MBTM00012","status":"sandbox","request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}}}}}},"401":{"description":"`missing_credentials`: X-Client-Id or X-Client-Secret is missing.\n\n`invalid_credentials`: The client id or secret is wrong, or the key was revoked or has expired.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"missing_credentials":{"summary":"X-Client-Id or X-Client-Secret is missing.","value":{"error":{"code":"missing_credentials","message":"X-Client-Id or X-Client-Secret is missing."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"invalid_credentials":{"summary":"The client id or secret is wrong, or the key was revoked or has expired.","value":{"error":{"code":"invalid_credentials","message":"The client id or secret is wrong, or the key was revoked or has expired."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}}}}}},"403":{"description":"`client_on_hold`: API access is on hold.\n\n`api_access_disabled`: API access is not enabled for your account.\n\n`encryption_key_missing`: Encryption is on for your account, but this key was made before encryption and has no encryption key. Answered in plain.\n\n`live_not_approved`: A live key was used before go-live was approved.\n\n`ip_not_allowed`: A live key was used from a server IP other than the one it was created for.\n\n`forbidden`: This call is not allowed for your account.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"client_on_hold":{"summary":"API access is on hold.","value":{"error":{"code":"client_on_hold","message":"API access is on hold."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"api_access_disabled":{"summary":"API access is not enabled for your account.","value":{"error":{"code":"api_access_disabled","message":"API access is not enabled for your account."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"encryption_key_missing":{"summary":"Encryption is on for your account, but this key was made before encryption and has no encryption key. Answered in plain.","value":{"error":{"code":"encryption_key_missing","message":"Encryption is on for your account, but this key was made before encryption and has no encryption key. Answered in plain."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"live_not_approved":{"summary":"A live key was used before go-live was approved.","value":{"error":{"code":"live_not_approved","message":"A live key was used before go-live was approved."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"ip_not_allowed":{"summary":"A live key was used from a server IP other than the one it was created for.","value":{"error":{"code":"ip_not_allowed","message":"A live key was used from a server IP other than the one it was created for."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"forbidden":{"summary":"This call is not allowed for your account.","value":{"error":{"code":"forbidden","message":"This call is not allowed for your account."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}}}}}},"405":{"description":"`method_not_allowed`: Only GET and POST are accepted.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"method_not_allowed":{"summary":"Only GET and POST are accepted.","value":{"error":{"code":"method_not_allowed","message":"Only GET and POST are accepted."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}}}}}},"409":{"description":"`conflict`: The request conflicts with the current state.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"conflict":{"summary":"The request conflicts with the current state.","value":{"error":{"code":"conflict","message":"The request conflicts with the current state."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}}}}}},"413":{"description":"`payload_too_large`: The body is larger than 256 KB.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"payload_too_large":{"summary":"The body is larger than 256 KB.","value":{"error":{"code":"payload_too_large","message":"The body is larger than 256 KB."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}}}}}},"429":{"description":"`rate_limited`: Too many calls this minute.\n\n`too_many_failed_attempts`: Too many wrong secrets from your IP or for your client id.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"rate_limited":{"summary":"Too many calls this minute.","value":{"error":{"code":"rate_limited","message":"Too many calls this minute."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"too_many_failed_attempts":{"summary":"Too many wrong secrets from your IP or for your client id.","value":{"error":{"code":"too_many_failed_attempts","message":"Too many wrong secrets from your IP or for your client id."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}}}}}},"500":{"description":"`internal_error`: Something went wrong on our side.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"internal_error":{"summary":"Something went wrong on our side.","value":{"error":{"code":"internal_error","message":"Something went wrong on our side."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}}}}}},"502":{"description":"`bad_gateway`: The API could not be reached for a moment.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"bad_gateway":{"summary":"The API could not be reached for a moment.","value":{"error":{"code":"bad_gateway","message":"The API could not be reached for a moment."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}}}}}}}}},"/balance":{"get":{"tags":["Account"],"operationId":"getBalance","summary":"Wallet balance","description":"Your wallet as every product sees it.","x-glance":["One wallet for every product","available + in flight + lien is your wallet total","Test keys always see ₹10,00,000.00"],"responses":{"200":{"description":"Your wallet.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Balance"},"examples":{"balance":{"value":{"available_balance":"48250.00","in_flight_balance":"2505.90","lien_balance":"0.00","currency":"INR","as_of":"2026-10-01T10:31:02+05:30"}}}}}},"401":{"description":"`missing_credentials`: X-Client-Id or X-Client-Secret is missing.\n\n`invalid_credentials`: The client id or secret is wrong, or the key was revoked or has expired.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"missing_credentials":{"summary":"X-Client-Id or X-Client-Secret is missing.","value":{"error":{"code":"missing_credentials","message":"X-Client-Id or X-Client-Secret is missing."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"invalid_credentials":{"summary":"The client id or secret is wrong, or the key was revoked or has expired.","value":{"error":{"code":"invalid_credentials","message":"The client id or secret is wrong, or the key was revoked or has expired."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}}}}}},"403":{"description":"`client_on_hold`: API access is on hold.\n\n`api_access_disabled`: API access is not enabled for your account.\n\n`encryption_key_missing`: Encryption is on for your account, but this key was made before encryption and has no encryption key. Answered in plain.\n\n`live_not_approved`: A live key was used before go-live was approved.\n\n`ip_not_allowed`: A live key was used from a server IP other than the one it was created for.\n\n`forbidden`: This call is not allowed for your account.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"client_on_hold":{"summary":"API access is on hold.","value":{"error":{"code":"client_on_hold","message":"API access is on hold."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"api_access_disabled":{"summary":"API access is not enabled for your account.","value":{"error":{"code":"api_access_disabled","message":"API access is not enabled for your account."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"encryption_key_missing":{"summary":"Encryption is on for your account, but this key was made before encryption and has no encryption key. Answered in plain.","value":{"error":{"code":"encryption_key_missing","message":"Encryption is on for your account, but this key was made before encryption and has no encryption key. Answered in plain."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"live_not_approved":{"summary":"A live key was used before go-live was approved.","value":{"error":{"code":"live_not_approved","message":"A live key was used before go-live was approved."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"ip_not_allowed":{"summary":"A live key was used from a server IP other than the one it was created for.","value":{"error":{"code":"ip_not_allowed","message":"A live key was used from a server IP other than the one it was created for."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"forbidden":{"summary":"This call is not allowed for your account.","value":{"error":{"code":"forbidden","message":"This call is not allowed for your account."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}}}}}},"405":{"description":"`method_not_allowed`: Only GET and POST are accepted.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"method_not_allowed":{"summary":"Only GET and POST are accepted.","value":{"error":{"code":"method_not_allowed","message":"Only GET and POST are accepted."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}}}}}},"409":{"description":"`conflict`: The request conflicts with the current state.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"conflict":{"summary":"The request conflicts with the current state.","value":{"error":{"code":"conflict","message":"The request conflicts with the current state."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}}}}}},"413":{"description":"`payload_too_large`: The body is larger than 256 KB.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"payload_too_large":{"summary":"The body is larger than 256 KB.","value":{"error":{"code":"payload_too_large","message":"The body is larger than 256 KB."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}}}}}},"429":{"description":"`rate_limited`: Too many calls this minute.\n\n`too_many_failed_attempts`: Too many wrong secrets from your IP or for your client id.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"rate_limited":{"summary":"Too many calls this minute.","value":{"error":{"code":"rate_limited","message":"Too many calls this minute."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"too_many_failed_attempts":{"summary":"Too many wrong secrets from your IP or for your client id.","value":{"error":{"code":"too_many_failed_attempts","message":"Too many wrong secrets from your IP or for your client id."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}}}}}},"500":{"description":"`internal_error`: Something went wrong on our side.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"internal_error":{"summary":"Something went wrong on our side.","value":{"error":{"code":"internal_error","message":"Something went wrong on our side."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}}}}}},"502":{"description":"`bad_gateway`: The API could not be reached for a moment.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"bad_gateway":{"summary":"The API could not be reached for a moment.","value":{"error":{"code":"bad_gateway","message":"The API could not be reached for a moment."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}}}}}}}}},"/transfers":{"post":{"tags":["Transfers"],"operationId":"createTransfer","summary":"Send a transfer","description":"Holds amount + fee from your wallet, then sends the money by IMPS or NEFT.","x-glance":["Holds amount + fee from your wallet, then sends","The same `reference_id` again returns the original transfer, never a second payment","Needs Vendor Payout enabled for your account","Test keys move no money: the amount picks the outcome"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransferRequest"},"examples":{"imps":{"value":{"reference_id":"INV-1001","amount":"2500","mode":"IMPS","beneficiary":{"name":"Ravi Kumar","account_number":"50100012345678","ifsc":"HDFC0001234"}}}}}}},"responses":{"200":{"description":"The same request again: the original transfer, unchanged.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Transfer"},"examples":{"replayed":{"value":{"transfer_id":"MBTM-TRF2610011030451A2B3C4D5E","reference_id":"INV-1001","status":"success","amount":"2500.00","fee":"5.90","fee_gst":"0.90","total_debit":"2505.90","mode":"IMPS","beneficiary":{"name":"Ravi Kumar","account_number":"XXXXXXXX5678","ifsc":"HDFC0001234","bank_name":"HDFC Bank"},"utr":"625920403204","failure_reason":null,"created_at":"2026-10-01T10:30:45+05:30","completed_at":"2026-10-01T10:30:47+05:30"}}}}}},"202":{"description":"A new transfer.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Transfer"},"examples":{"created":{"value":{"transfer_id":"MBTM-TRF2610011030451A2B3C4D5E","reference_id":"INV-1001","status":"success","amount":"2500.00","fee":"5.90","fee_gst":"0.90","total_debit":"2505.90","mode":"IMPS","beneficiary":{"name":"Ravi Kumar","account_number":"XXXXXXXX5678","ifsc":"HDFC0001234","bank_name":"HDFC Bank"},"utr":"625920403204","failure_reason":null,"created_at":"2026-10-01T10:30:45+05:30","completed_at":"2026-10-01T10:30:47+05:30"}}}}}},"400":{"description":"`invalid_json`: The body is not valid JSON.\n\n`encryption_required`: Encryption is on for your account and the body was not only encrypted_data. Answered in plain.\n\n`invalid_encrypted_payload`: encrypted_data could not be decrypted: a different key, the IV or tag in the wrong place, or a damaged value. Answered in plain.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_json":{"summary":"The body is not valid JSON.","value":{"error":{"code":"invalid_json","message":"The body is not valid JSON."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"encryption_required":{"summary":"Encryption is on for your account and the body was not only encrypted_data. Answered in plain.","value":{"error":{"code":"encryption_required","message":"Encryption is on for your account and the body was not only encrypted_data. Answered in plain."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"invalid_encrypted_payload":{"summary":"encrypted_data could not be decrypted: a different key, the IV or tag in the wrong place, or a damaged value. Answered in plain.","value":{"error":{"code":"invalid_encrypted_payload","message":"encrypted_data could not be decrypted: a different key, the IV or tag in the wrong place, or a damaged value. Answered in plain."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}}}}}},"401":{"description":"`missing_credentials`: X-Client-Id or X-Client-Secret is missing.\n\n`invalid_credentials`: The client id or secret is wrong, or the key was revoked or has expired.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"missing_credentials":{"summary":"X-Client-Id or X-Client-Secret is missing.","value":{"error":{"code":"missing_credentials","message":"X-Client-Id or X-Client-Secret is missing."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"invalid_credentials":{"summary":"The client id or secret is wrong, or the key was revoked or has expired.","value":{"error":{"code":"invalid_credentials","message":"The client id or secret is wrong, or the key was revoked or has expired."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}}}}}},"402":{"description":"`insufficient_balance`: Your wallet cannot cover what this call costs: a transfer's amount + fee, or a verification's fee. Nothing was held.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"insufficient_balance":{"summary":"Your wallet cannot cover what this call costs: a transfer's amount + fee, or a verification's fee. Nothing was held.","value":{"error":{"code":"insufficient_balance","message":"Your wallet cannot cover what this call costs: a transfer's amount + fee, or a verification's fee. Nothing was held."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}}}}}},"403":{"description":"`client_on_hold`: API access is on hold.\n\n`api_access_disabled`: API access is not enabled for your account.\n\n`encryption_key_missing`: Encryption is on for your account, but this key was made before encryption and has no encryption key. Answered in plain.\n\n`kyc_not_approved`: Your KYC is not approved, so live transfers and verifications are paused. Reads and balance still work.\n\n`live_not_approved`: A live key was used before go-live was approved.\n\n`ip_not_allowed`: A live key was used from a server IP other than the one it was created for.\n\n`product_disabled`: This product is not enabled for your account.\n\n`service_not_enabled`: This service is not enabled for your account.\n\n`forbidden`: This call is not allowed for your account.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"client_on_hold":{"summary":"API access is on hold.","value":{"error":{"code":"client_on_hold","message":"API access is on hold."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"api_access_disabled":{"summary":"API access is not enabled for your account.","value":{"error":{"code":"api_access_disabled","message":"API access is not enabled for your account."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"encryption_key_missing":{"summary":"Encryption is on for your account, but this key was made before encryption and has no encryption key. Answered in plain.","value":{"error":{"code":"encryption_key_missing","message":"Encryption is on for your account, but this key was made before encryption and has no encryption key. Answered in plain."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"kyc_not_approved":{"summary":"Your KYC is not approved, so live transfers and verifications are paused. Reads and balance still work.","value":{"error":{"code":"kyc_not_approved","message":"Your KYC is not approved, so live transfers and verifications are paused. Reads and balance still work."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"live_not_approved":{"summary":"A live key was used before go-live was approved.","value":{"error":{"code":"live_not_approved","message":"A live key was used before go-live was approved."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"ip_not_allowed":{"summary":"A live key was used from a server IP other than the one it was created for.","value":{"error":{"code":"ip_not_allowed","message":"A live key was used from a server IP other than the one it was created for."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"product_disabled":{"summary":"This product is not enabled for your account.","value":{"error":{"code":"product_disabled","message":"This product is not enabled for your account."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"service_not_enabled":{"summary":"This service is not enabled for your account.","value":{"error":{"code":"service_not_enabled","message":"This service is not enabled for your account."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"forbidden":{"summary":"This call is not allowed for your account.","value":{"error":{"code":"forbidden","message":"This call is not allowed for your account."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}}}}}},"405":{"description":"`method_not_allowed`: Only GET and POST are accepted.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"method_not_allowed":{"summary":"Only GET and POST are accepted.","value":{"error":{"code":"method_not_allowed","message":"Only GET and POST are accepted."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}}}}}},"409":{"description":"`reference_conflict`: This reference_id was already used for a different request.\n\n`conflict`: The request conflicts with the current state.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"reference_conflict":{"summary":"This reference_id was already used for a different request.","value":{"error":{"code":"reference_conflict","message":"This reference_id was already used for a different request."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"conflict":{"summary":"The request conflicts with the current state.","value":{"error":{"code":"conflict","message":"The request conflicts with the current state."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}}}}}},"413":{"description":"`payload_too_large`: The body is larger than 256 KB.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"payload_too_large":{"summary":"The body is larger than 256 KB.","value":{"error":{"code":"payload_too_large","message":"The body is larger than 256 KB."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}}}}}},"422":{"description":"`validation_failed`: A field is missing or malformed; the message names it.\n\n`amount_out_of_range`: The amount is below the smallest or above the largest amount priced for your account; the message names the range.\n\n`daily_limit_exceeded`: Today's transfers plus this one pass your daily limit.\n\n`weekly_limit_exceeded`: This week's transfers plus this one pass your weekly limit.\n\n`monthly_limit_exceeded`: This month's transfers plus this one pass your monthly limit.\n\n`bank_not_identified`: The bank for this IFSC could not be identified.\n\n`sender_profile_incomplete`: Your account needs a valid mobile number and name before it can send money.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"validation_failed":{"summary":"A field is missing or malformed; the message names it.","value":{"error":{"code":"validation_failed","message":"A field is missing or malformed; the message names it."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"amount_out_of_range":{"summary":"The amount is below the smallest or above the largest amount priced for your account; the message names the range.","value":{"error":{"code":"amount_out_of_range","message":"The amount is below the smallest or above the largest amount priced for your account; the message names the range."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"daily_limit_exceeded":{"summary":"Today's transfers plus this one pass your daily limit.","value":{"error":{"code":"daily_limit_exceeded","message":"Today's transfers plus this one pass your daily limit."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"weekly_limit_exceeded":{"summary":"This week's transfers plus this one pass your weekly limit.","value":{"error":{"code":"weekly_limit_exceeded","message":"This week's transfers plus this one pass your weekly limit."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"monthly_limit_exceeded":{"summary":"This month's transfers plus this one pass your monthly limit.","value":{"error":{"code":"monthly_limit_exceeded","message":"This month's transfers plus this one pass your monthly limit."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"bank_not_identified":{"summary":"The bank for this IFSC could not be identified.","value":{"error":{"code":"bank_not_identified","message":"The bank for this IFSC could not be identified."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"sender_profile_incomplete":{"summary":"Your account needs a valid mobile number and name before it can send money.","value":{"error":{"code":"sender_profile_incomplete","message":"Your account needs a valid mobile number and name before it can send money."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}}}}}},"429":{"description":"`rate_limited`: Too many calls this minute.\n\n`too_many_failed_attempts`: Too many wrong secrets from your IP or for your client id.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"rate_limited":{"summary":"Too many calls this minute.","value":{"error":{"code":"rate_limited","message":"Too many calls this minute."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"too_many_failed_attempts":{"summary":"Too many wrong secrets from your IP or for your client id.","value":{"error":{"code":"too_many_failed_attempts","message":"Too many wrong secrets from your IP or for your client id."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}}}}}},"500":{"description":"`internal_error`: Something went wrong on our side.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"internal_error":{"summary":"Something went wrong on our side.","value":{"error":{"code":"internal_error","message":"Something went wrong on our side."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}}}}}},"502":{"description":"`bad_gateway`: The API could not be reached for a moment.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"bad_gateway":{"summary":"The API could not be reached for a moment.","value":{"error":{"code":"bad_gateway","message":"The API could not be reached for a moment."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}}}}}},"503":{"description":"`service_unavailable`: The service is switched off or under maintenance. Nothing was held.\n\n`outside_service_hours`: The service is closed at this hour for your account; the message names the next opening. Nothing was held.\n\n`product_unavailable`: This product is switched off for everyone right now. Nothing was held.\n\n`vendor_unavailable`: No bank channel is available right now. Nothing was held.\n\n`pricing_not_configured`: Pricing is not configured for your account, or for this amount or mode. Nothing was held.\n\n`pricing_unavailable`: Pricing could not be read right now. Nothing was held.\n\n`ifsc_lookup_unavailable`: The IFSC could not be checked right now. No money was held.\n\n`sandbox_retry_later`: Sandbox only (amount 106): a simulated outage.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"service_unavailable":{"summary":"The service is switched off or under maintenance. Nothing was held.","value":{"error":{"code":"service_unavailable","message":"The service is switched off or under maintenance. Nothing was held."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"outside_service_hours":{"summary":"The service is closed at this hour for your account; the message names the next opening. Nothing was held.","value":{"error":{"code":"outside_service_hours","message":"The service is closed at this hour for your account; the message names the next opening. Nothing was held."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"product_unavailable":{"summary":"This product is switched off for everyone right now. Nothing was held.","value":{"error":{"code":"product_unavailable","message":"This product is switched off for everyone right now. Nothing was held."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"vendor_unavailable":{"summary":"No bank channel is available right now. Nothing was held.","value":{"error":{"code":"vendor_unavailable","message":"No bank channel is available right now. Nothing was held."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"pricing_not_configured":{"summary":"Pricing is not configured for your account, or for this amount or mode. Nothing was held.","value":{"error":{"code":"pricing_not_configured","message":"Pricing is not configured for your account, or for this amount or mode. Nothing was held."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"pricing_unavailable":{"summary":"Pricing could not be read right now. Nothing was held.","value":{"error":{"code":"pricing_unavailable","message":"Pricing could not be read right now. Nothing was held."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"ifsc_lookup_unavailable":{"summary":"The IFSC could not be checked right now. No money was held.","value":{"error":{"code":"ifsc_lookup_unavailable","message":"The IFSC could not be checked right now. No money was held."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"sandbox_retry_later":{"summary":"Sandbox only (amount 106): a simulated outage.","value":{"error":{"code":"sandbox_retry_later","message":"Sandbox only (amount 106): a simulated outage."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}}}}}}}}},"/transfers/{reference_id}":{"get":{"tags":["Transfers"],"operationId":"getTransfer","summary":"Check a transfer","description":"Reads one transfer by the `reference_id` you sent it with.","x-glance":["Works at any time, including while the transfer is processing","A `processing` transfer can take hours: keep checking, never send it again","Test keys read sandbox transfers only"],"parameters":[{"name":"reference_id","in":"path","required":true,"description":"The `reference_id` you sent the transfer with.","schema":{"type":"string","pattern":"^[A-Za-z0-9._-]{1,64}$","x-rule":"1–64 characters"}}],"responses":{"200":{"description":"The transfer.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Transfer"},"examples":{"transfer":{"value":{"transfer_id":"MBTM-TRF2610011030451A2B3C4D5E","reference_id":"INV-1001","status":"success","amount":"2500.00","fee":"5.90","fee_gst":"0.90","total_debit":"2505.90","mode":"IMPS","beneficiary":{"name":"Ravi Kumar","account_number":"XXXXXXXX5678","ifsc":"HDFC0001234","bank_name":"HDFC Bank"},"utr":"625920403204","failure_reason":null,"created_at":"2026-10-01T10:30:45+05:30","completed_at":"2026-10-01T10:30:47+05:30"}}}}}},"401":{"description":"`missing_credentials`: X-Client-Id or X-Client-Secret is missing.\n\n`invalid_credentials`: The client id or secret is wrong, or the key was revoked or has expired.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"missing_credentials":{"summary":"X-Client-Id or X-Client-Secret is missing.","value":{"error":{"code":"missing_credentials","message":"X-Client-Id or X-Client-Secret is missing."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"invalid_credentials":{"summary":"The client id or secret is wrong, or the key was revoked or has expired.","value":{"error":{"code":"invalid_credentials","message":"The client id or secret is wrong, or the key was revoked or has expired."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}}}}}},"403":{"description":"`client_on_hold`: API access is on hold.\n\n`api_access_disabled`: API access is not enabled for your account.\n\n`encryption_key_missing`: Encryption is on for your account, but this key was made before encryption and has no encryption key. Answered in plain.\n\n`live_not_approved`: A live key was used before go-live was approved.\n\n`ip_not_allowed`: A live key was used from a server IP other than the one it was created for.\n\n`forbidden`: This call is not allowed for your account.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"client_on_hold":{"summary":"API access is on hold.","value":{"error":{"code":"client_on_hold","message":"API access is on hold."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"api_access_disabled":{"summary":"API access is not enabled for your account.","value":{"error":{"code":"api_access_disabled","message":"API access is not enabled for your account."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"encryption_key_missing":{"summary":"Encryption is on for your account, but this key was made before encryption and has no encryption key. Answered in plain.","value":{"error":{"code":"encryption_key_missing","message":"Encryption is on for your account, but this key was made before encryption and has no encryption key. Answered in plain."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"live_not_approved":{"summary":"A live key was used before go-live was approved.","value":{"error":{"code":"live_not_approved","message":"A live key was used before go-live was approved."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"ip_not_allowed":{"summary":"A live key was used from a server IP other than the one it was created for.","value":{"error":{"code":"ip_not_allowed","message":"A live key was used from a server IP other than the one it was created for."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"forbidden":{"summary":"This call is not allowed for your account.","value":{"error":{"code":"forbidden","message":"This call is not allowed for your account."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}}}}}},"404":{"description":"`not_found`: Nothing was sent with this reference_id, or there is no such endpoint.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"not_found":{"summary":"Nothing was sent with this reference_id, or there is no such endpoint.","value":{"error":{"code":"not_found","message":"Nothing was sent with this reference_id, or there is no such endpoint."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}}}}}},"405":{"description":"`method_not_allowed`: Only GET and POST are accepted.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"method_not_allowed":{"summary":"Only GET and POST are accepted.","value":{"error":{"code":"method_not_allowed","message":"Only GET and POST are accepted."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}}}}}},"409":{"description":"`conflict`: The request conflicts with the current state.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"conflict":{"summary":"The request conflicts with the current state.","value":{"error":{"code":"conflict","message":"The request conflicts with the current state."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}}}}}},"413":{"description":"`payload_too_large`: The body is larger than 256 KB.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"payload_too_large":{"summary":"The body is larger than 256 KB.","value":{"error":{"code":"payload_too_large","message":"The body is larger than 256 KB."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}}}}}},"429":{"description":"`rate_limited`: Too many calls this minute.\n\n`too_many_failed_attempts`: Too many wrong secrets from your IP or for your client id.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"rate_limited":{"summary":"Too many calls this minute.","value":{"error":{"code":"rate_limited","message":"Too many calls this minute."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"too_many_failed_attempts":{"summary":"Too many wrong secrets from your IP or for your client id.","value":{"error":{"code":"too_many_failed_attempts","message":"Too many wrong secrets from your IP or for your client id."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}}}}}},"500":{"description":"`internal_error`: Something went wrong on our side.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"internal_error":{"summary":"Something went wrong on our side.","value":{"error":{"code":"internal_error","message":"Something went wrong on our side."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}}}}}},"502":{"description":"`bad_gateway`: The API could not be reached for a moment.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"bad_gateway":{"summary":"The API could not be reached for a moment.","value":{"error":{"code":"bad_gateway","message":"The API could not be reached for a moment."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}}}}}}}}},"/verifications/bank-account/penniless":{"post":{"tags":["Bank verification · Penniless"],"operationId":"verifyBankAccountPenniless","summary":"Verify a bank account","description":"Ask the account's bank whether the account exists and who holds it, without moving any money. Scores the name you send against the bank's.","x-glance":["Answers in seconds; a `202` means the bank has not answered yet, so read it back","The fee is held first and taken only when the answer is charged to us; `fee` says which","The same account again within 24 hours returns your earlier answer, free","Needs the Bank Verification · Penniless API enabled for your account","Test keys reach no bank: the account number's last four digits pick the outcome"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BankVerificationRequest"},"examples":{"verify":{"value":{"reference_id":"VER-1001","account_number":"50100012345678","ifsc":"HDFC0001234","name":"Ravi Kumar","consent":true}}}}}},"responses":{"200":{"description":"The bank's answer, or the same request again: the original answer, unchanged.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BankVerification"},"examples":{"success":{"value":{"verification_id":"MBTM-BAV2610211405091A2B3C4D5E","reference_id":"VER-1001","status":"success","account_number":"XXXXXXXX5678","ifsc":"HDFC0001234","bank_name":"HDFC Bank","mode":"penniless","account_holder_name":"RAVI KUMAR","name_match":{"score":100,"matched":true},"bank_reference":"629313723708","failure_reason":null,"retryable":false,"fee":"2.95","fee_gst":"0.45","reused":false,"created_at":"2026-10-21T14:05:09+05:30","completed_at":"2026-10-21T14:05:11+05:30"}},"failed":{"value":{"verification_id":"MBTM-BAV2610211405091A2B3C4D5E","reference_id":"VER-1001","status":"failed","account_number":"XXXXXXXX5678","ifsc":"HDFC0001234","bank_name":"HDFC Bank","mode":"penniless","account_holder_name":null,"name_match":null,"bank_reference":null,"failure_reason":"invalid_account","retryable":false,"fee":"2.95","fee_gst":"0.45","reused":false,"created_at":"2026-10-21T14:05:09+05:30","completed_at":"2026-10-21T14:05:11+05:30"}}}}}},"202":{"description":"The bank has not answered yet: read it back with the same reference_id.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BankVerification"},"examples":{"processing":{"value":{"verification_id":"MBTM-BAV2610211405091A2B3C4D5E","reference_id":"VER-1001","status":"processing","account_number":"XXXXXXXX5678","ifsc":"HDFC0001234","bank_name":"HDFC Bank","mode":"penniless","account_holder_name":null,"name_match":null,"bank_reference":null,"failure_reason":null,"retryable":false,"fee":"2.95","fee_gst":"0.45","reused":false,"created_at":"2026-10-21T14:05:09+05:30","completed_at":null}}}}}},"400":{"description":"`invalid_json`: The body is not valid JSON.\n\n`encryption_required`: Encryption is on for your account and the body was not only encrypted_data. Answered in plain.\n\n`invalid_encrypted_payload`: encrypted_data could not be decrypted: a different key, the IV or tag in the wrong place, or a damaged value. Answered in plain.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_json":{"summary":"The body is not valid JSON.","value":{"error":{"code":"invalid_json","message":"The body is not valid JSON."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"encryption_required":{"summary":"Encryption is on for your account and the body was not only encrypted_data. Answered in plain.","value":{"error":{"code":"encryption_required","message":"Encryption is on for your account and the body was not only encrypted_data. Answered in plain."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"invalid_encrypted_payload":{"summary":"encrypted_data could not be decrypted: a different key, the IV or tag in the wrong place, or a damaged value. Answered in plain.","value":{"error":{"code":"invalid_encrypted_payload","message":"encrypted_data could not be decrypted: a different key, the IV or tag in the wrong place, or a damaged value. Answered in plain."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}}}}}},"401":{"description":"`missing_credentials`: X-Client-Id or X-Client-Secret is missing.\n\n`invalid_credentials`: The client id or secret is wrong, or the key was revoked or has expired.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"missing_credentials":{"summary":"X-Client-Id or X-Client-Secret is missing.","value":{"error":{"code":"missing_credentials","message":"X-Client-Id or X-Client-Secret is missing."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"invalid_credentials":{"summary":"The client id or secret is wrong, or the key was revoked or has expired.","value":{"error":{"code":"invalid_credentials","message":"The client id or secret is wrong, or the key was revoked or has expired."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}}}}}},"402":{"description":"`insufficient_balance`: Your wallet cannot cover what this call costs: a transfer's amount + fee, or a verification's fee. Nothing was held.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"insufficient_balance":{"summary":"Your wallet cannot cover what this call costs: a transfer's amount + fee, or a verification's fee. Nothing was held.","value":{"error":{"code":"insufficient_balance","message":"Your wallet cannot cover what this call costs: a transfer's amount + fee, or a verification's fee. Nothing was held."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}}}}}},"403":{"description":"`client_on_hold`: API access is on hold.\n\n`api_access_disabled`: API access is not enabled for your account.\n\n`encryption_key_missing`: Encryption is on for your account, but this key was made before encryption and has no encryption key. Answered in plain.\n\n`kyc_not_approved`: Your KYC is not approved, so live transfers and verifications are paused. Reads and balance still work.\n\n`live_not_approved`: A live key was used before go-live was approved.\n\n`ip_not_allowed`: A live key was used from a server IP other than the one it was created for.\n\n`product_disabled`: This product is not enabled for your account.\n\n`service_not_enabled`: This service is not enabled for your account.\n\n`forbidden`: This call is not allowed for your account.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"client_on_hold":{"summary":"API access is on hold.","value":{"error":{"code":"client_on_hold","message":"API access is on hold."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"api_access_disabled":{"summary":"API access is not enabled for your account.","value":{"error":{"code":"api_access_disabled","message":"API access is not enabled for your account."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"encryption_key_missing":{"summary":"Encryption is on for your account, but this key was made before encryption and has no encryption key. Answered in plain.","value":{"error":{"code":"encryption_key_missing","message":"Encryption is on for your account, but this key was made before encryption and has no encryption key. Answered in plain."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"kyc_not_approved":{"summary":"Your KYC is not approved, so live transfers and verifications are paused. Reads and balance still work.","value":{"error":{"code":"kyc_not_approved","message":"Your KYC is not approved, so live transfers and verifications are paused. Reads and balance still work."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"live_not_approved":{"summary":"A live key was used before go-live was approved.","value":{"error":{"code":"live_not_approved","message":"A live key was used before go-live was approved."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"ip_not_allowed":{"summary":"A live key was used from a server IP other than the one it was created for.","value":{"error":{"code":"ip_not_allowed","message":"A live key was used from a server IP other than the one it was created for."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"product_disabled":{"summary":"This product is not enabled for your account.","value":{"error":{"code":"product_disabled","message":"This product is not enabled for your account."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"service_not_enabled":{"summary":"This service is not enabled for your account.","value":{"error":{"code":"service_not_enabled","message":"This service is not enabled for your account."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"forbidden":{"summary":"This call is not allowed for your account.","value":{"error":{"code":"forbidden","message":"This call is not allowed for your account."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}}}}}},"405":{"description":"`method_not_allowed`: Only GET and POST are accepted.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"method_not_allowed":{"summary":"Only GET and POST are accepted.","value":{"error":{"code":"method_not_allowed","message":"Only GET and POST are accepted."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}}}}}},"409":{"description":"`reference_conflict`: This reference_id was already used for a different request.\n\n`conflict`: The request conflicts with the current state.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"reference_conflict":{"summary":"This reference_id was already used for a different request.","value":{"error":{"code":"reference_conflict","message":"This reference_id was already used for a different request."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"conflict":{"summary":"The request conflicts with the current state.","value":{"error":{"code":"conflict","message":"The request conflicts with the current state."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}}}}}},"413":{"description":"`payload_too_large`: The body is larger than 256 KB.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"payload_too_large":{"summary":"The body is larger than 256 KB.","value":{"error":{"code":"payload_too_large","message":"The body is larger than 256 KB."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}}}}}},"422":{"description":"`validation_failed`: A field is missing or malformed; the message names it.\n\n`bank_not_identified`: The bank for this IFSC could not be identified.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"validation_failed":{"summary":"A field is missing or malformed; the message names it.","value":{"error":{"code":"validation_failed","message":"A field is missing or malformed; the message names it."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"bank_not_identified":{"summary":"The bank for this IFSC could not be identified.","value":{"error":{"code":"bank_not_identified","message":"The bank for this IFSC could not be identified."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}}}}}},"429":{"description":"`rate_limited`: Too many calls this minute.\n\n`too_many_failed_attempts`: Too many wrong secrets from your IP or for your client id.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"rate_limited":{"summary":"Too many calls this minute.","value":{"error":{"code":"rate_limited","message":"Too many calls this minute."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"too_many_failed_attempts":{"summary":"Too many wrong secrets from your IP or for your client id.","value":{"error":{"code":"too_many_failed_attempts","message":"Too many wrong secrets from your IP or for your client id."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}}}}}},"500":{"description":"`internal_error`: Something went wrong on our side.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"internal_error":{"summary":"Something went wrong on our side.","value":{"error":{"code":"internal_error","message":"Something went wrong on our side."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}}}}}},"502":{"description":"`bad_gateway`: The API could not be reached for a moment.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"bad_gateway":{"summary":"The API could not be reached for a moment.","value":{"error":{"code":"bad_gateway","message":"The API could not be reached for a moment."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}}}}}},"503":{"description":"`service_unavailable`: The service is switched off or under maintenance. Nothing was held.\n\n`outside_service_hours`: The service is closed at this hour for your account; the message names the next opening. Nothing was held.\n\n`product_unavailable`: This product is switched off for everyone right now. Nothing was held.\n\n`vendor_unavailable`: No bank channel is available right now. Nothing was held.\n\n`pricing_not_configured`: Pricing is not configured for your account, or for this amount or mode. Nothing was held.\n\n`pricing_unavailable`: Pricing could not be read right now. Nothing was held.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"service_unavailable":{"summary":"The service is switched off or under maintenance. Nothing was held.","value":{"error":{"code":"service_unavailable","message":"The service is switched off or under maintenance. Nothing was held."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"outside_service_hours":{"summary":"The service is closed at this hour for your account; the message names the next opening. Nothing was held.","value":{"error":{"code":"outside_service_hours","message":"The service is closed at this hour for your account; the message names the next opening. Nothing was held."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"product_unavailable":{"summary":"This product is switched off for everyone right now. Nothing was held.","value":{"error":{"code":"product_unavailable","message":"This product is switched off for everyone right now. Nothing was held."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"vendor_unavailable":{"summary":"No bank channel is available right now. Nothing was held.","value":{"error":{"code":"vendor_unavailable","message":"No bank channel is available right now. Nothing was held."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"pricing_not_configured":{"summary":"Pricing is not configured for your account, or for this amount or mode. Nothing was held.","value":{"error":{"code":"pricing_not_configured","message":"Pricing is not configured for your account, or for this amount or mode. Nothing was held."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"pricing_unavailable":{"summary":"Pricing could not be read right now. Nothing was held.","value":{"error":{"code":"pricing_unavailable","message":"Pricing could not be read right now. Nothing was held."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}}}}}}}}},"/verifications/bank-account/penniless/{reference_id}":{"get":{"tags":["Bank verification · Penniless"],"operationId":"getPennilessVerification","summary":"Check a verification","description":"Reads one verification made on this API by the `reference_id` you sent it with.","x-glance":["Works at any time, including while the verification is processing","Reads this API's verifications only; test keys read sandbox ones only"],"parameters":[{"name":"reference_id","in":"path","required":true,"description":"The `reference_id` you sent the verification with.","schema":{"type":"string","pattern":"^[A-Za-z0-9._-]{1,64}$","x-rule":"1–64 characters"}}],"responses":{"200":{"description":"The verification.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BankVerification"},"examples":{"verification":{"value":{"verification_id":"MBTM-BAV2610211405091A2B3C4D5E","reference_id":"VER-1001","status":"success","account_number":"XXXXXXXX5678","ifsc":"HDFC0001234","bank_name":"HDFC Bank","mode":"penniless","account_holder_name":"RAVI KUMAR","name_match":{"score":100,"matched":true},"bank_reference":"629313723708","failure_reason":null,"retryable":false,"fee":"2.95","fee_gst":"0.45","reused":false,"created_at":"2026-10-21T14:05:09+05:30","completed_at":"2026-10-21T14:05:11+05:30"}}}}}},"401":{"description":"`missing_credentials`: X-Client-Id or X-Client-Secret is missing.\n\n`invalid_credentials`: The client id or secret is wrong, or the key was revoked or has expired.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"missing_credentials":{"summary":"X-Client-Id or X-Client-Secret is missing.","value":{"error":{"code":"missing_credentials","message":"X-Client-Id or X-Client-Secret is missing."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"invalid_credentials":{"summary":"The client id or secret is wrong, or the key was revoked or has expired.","value":{"error":{"code":"invalid_credentials","message":"The client id or secret is wrong, or the key was revoked or has expired."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}}}}}},"403":{"description":"`client_on_hold`: API access is on hold.\n\n`api_access_disabled`: API access is not enabled for your account.\n\n`encryption_key_missing`: Encryption is on for your account, but this key was made before encryption and has no encryption key. Answered in plain.\n\n`live_not_approved`: A live key was used before go-live was approved.\n\n`ip_not_allowed`: A live key was used from a server IP other than the one it was created for.\n\n`forbidden`: This call is not allowed for your account.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"client_on_hold":{"summary":"API access is on hold.","value":{"error":{"code":"client_on_hold","message":"API access is on hold."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"api_access_disabled":{"summary":"API access is not enabled for your account.","value":{"error":{"code":"api_access_disabled","message":"API access is not enabled for your account."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"encryption_key_missing":{"summary":"Encryption is on for your account, but this key was made before encryption and has no encryption key. Answered in plain.","value":{"error":{"code":"encryption_key_missing","message":"Encryption is on for your account, but this key was made before encryption and has no encryption key. Answered in plain."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"live_not_approved":{"summary":"A live key was used before go-live was approved.","value":{"error":{"code":"live_not_approved","message":"A live key was used before go-live was approved."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"ip_not_allowed":{"summary":"A live key was used from a server IP other than the one it was created for.","value":{"error":{"code":"ip_not_allowed","message":"A live key was used from a server IP other than the one it was created for."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"forbidden":{"summary":"This call is not allowed for your account.","value":{"error":{"code":"forbidden","message":"This call is not allowed for your account."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}}}}}},"404":{"description":"`not_found`: Nothing was sent with this reference_id, or there is no such endpoint.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"not_found":{"summary":"Nothing was sent with this reference_id, or there is no such endpoint.","value":{"error":{"code":"not_found","message":"Nothing was sent with this reference_id, or there is no such endpoint."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}}}}}},"405":{"description":"`method_not_allowed`: Only GET and POST are accepted.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"method_not_allowed":{"summary":"Only GET and POST are accepted.","value":{"error":{"code":"method_not_allowed","message":"Only GET and POST are accepted."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}}}}}},"409":{"description":"`conflict`: The request conflicts with the current state.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"conflict":{"summary":"The request conflicts with the current state.","value":{"error":{"code":"conflict","message":"The request conflicts with the current state."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}}}}}},"413":{"description":"`payload_too_large`: The body is larger than 256 KB.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"payload_too_large":{"summary":"The body is larger than 256 KB.","value":{"error":{"code":"payload_too_large","message":"The body is larger than 256 KB."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}}}}}},"429":{"description":"`rate_limited`: Too many calls this minute.\n\n`too_many_failed_attempts`: Too many wrong secrets from your IP or for your client id.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"rate_limited":{"summary":"Too many calls this minute.","value":{"error":{"code":"rate_limited","message":"Too many calls this minute."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"too_many_failed_attempts":{"summary":"Too many wrong secrets from your IP or for your client id.","value":{"error":{"code":"too_many_failed_attempts","message":"Too many wrong secrets from your IP or for your client id."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}}}}}},"500":{"description":"`internal_error`: Something went wrong on our side.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"internal_error":{"summary":"Something went wrong on our side.","value":{"error":{"code":"internal_error","message":"Something went wrong on our side."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}}}}}},"502":{"description":"`bad_gateway`: The API could not be reached for a moment.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"bad_gateway":{"summary":"The API could not be reached for a moment.","value":{"error":{"code":"bad_gateway","message":"The API could not be reached for a moment."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}}}}}}}}},"/verifications/bank-account/penny-drop":{"post":{"tags":["Bank verification · Penny drop"],"operationId":"verifyBankAccountPennyDrop","summary":"Verify a bank account","description":"Credit ₹1 to the account to prove it exists and get the holder's name; works at every bank. Scores the name you send against the bank's.","x-glance":["Answers in seconds; a `202` means the bank has not answered yet, so read it back","The fee is held first and taken only when the answer is charged to us; `fee` says which","The same account again within 24 hours returns your earlier answer, free","Needs the Bank Verification · Penny Drop API enabled for your account","Test keys reach no bank: the account number's last four digits pick the outcome"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BankVerificationRequest"},"examples":{"verify":{"value":{"reference_id":"VER-1001","account_number":"50100012345678","ifsc":"HDFC0001234","name":"Ravi Kumar","consent":true}}}}}},"responses":{"200":{"description":"The bank's answer, or the same request again: the original answer, unchanged.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BankVerification"},"examples":{"success":{"value":{"verification_id":"MBTM-BAV2610211405091A2B3C4D5E","reference_id":"VER-1001","status":"success","account_number":"XXXXXXXX5678","ifsc":"HDFC0001234","bank_name":"HDFC Bank","mode":"penny_drop","account_holder_name":"RAVI KUMAR","name_match":{"score":100,"matched":true},"bank_reference":"629313723708","failure_reason":null,"retryable":false,"fee":"2.95","fee_gst":"0.45","reused":false,"created_at":"2026-10-21T14:05:09+05:30","completed_at":"2026-10-21T14:05:11+05:30"}},"failed":{"value":{"verification_id":"MBTM-BAV2610211405091A2B3C4D5E","reference_id":"VER-1001","status":"failed","account_number":"XXXXXXXX5678","ifsc":"HDFC0001234","bank_name":"HDFC Bank","mode":"penny_drop","account_holder_name":null,"name_match":null,"bank_reference":null,"failure_reason":"invalid_account","retryable":false,"fee":"2.95","fee_gst":"0.45","reused":false,"created_at":"2026-10-21T14:05:09+05:30","completed_at":"2026-10-21T14:05:11+05:30"}}}}}},"202":{"description":"The bank has not answered yet: read it back with the same reference_id.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BankVerification"},"examples":{"processing":{"value":{"verification_id":"MBTM-BAV2610211405091A2B3C4D5E","reference_id":"VER-1001","status":"processing","account_number":"XXXXXXXX5678","ifsc":"HDFC0001234","bank_name":"HDFC Bank","mode":"penny_drop","account_holder_name":null,"name_match":null,"bank_reference":null,"failure_reason":null,"retryable":false,"fee":"2.95","fee_gst":"0.45","reused":false,"created_at":"2026-10-21T14:05:09+05:30","completed_at":null}}}}}},"400":{"description":"`invalid_json`: The body is not valid JSON.\n\n`encryption_required`: Encryption is on for your account and the body was not only encrypted_data. Answered in plain.\n\n`invalid_encrypted_payload`: encrypted_data could not be decrypted: a different key, the IV or tag in the wrong place, or a damaged value. Answered in plain.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_json":{"summary":"The body is not valid JSON.","value":{"error":{"code":"invalid_json","message":"The body is not valid JSON."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"encryption_required":{"summary":"Encryption is on for your account and the body was not only encrypted_data. Answered in plain.","value":{"error":{"code":"encryption_required","message":"Encryption is on for your account and the body was not only encrypted_data. Answered in plain."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"invalid_encrypted_payload":{"summary":"encrypted_data could not be decrypted: a different key, the IV or tag in the wrong place, or a damaged value. Answered in plain.","value":{"error":{"code":"invalid_encrypted_payload","message":"encrypted_data could not be decrypted: a different key, the IV or tag in the wrong place, or a damaged value. Answered in plain."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}}}}}},"401":{"description":"`missing_credentials`: X-Client-Id or X-Client-Secret is missing.\n\n`invalid_credentials`: The client id or secret is wrong, or the key was revoked or has expired.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"missing_credentials":{"summary":"X-Client-Id or X-Client-Secret is missing.","value":{"error":{"code":"missing_credentials","message":"X-Client-Id or X-Client-Secret is missing."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"invalid_credentials":{"summary":"The client id or secret is wrong, or the key was revoked or has expired.","value":{"error":{"code":"invalid_credentials","message":"The client id or secret is wrong, or the key was revoked or has expired."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}}}}}},"402":{"description":"`insufficient_balance`: Your wallet cannot cover what this call costs: a transfer's amount + fee, or a verification's fee. Nothing was held.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"insufficient_balance":{"summary":"Your wallet cannot cover what this call costs: a transfer's amount + fee, or a verification's fee. Nothing was held.","value":{"error":{"code":"insufficient_balance","message":"Your wallet cannot cover what this call costs: a transfer's amount + fee, or a verification's fee. Nothing was held."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}}}}}},"403":{"description":"`client_on_hold`: API access is on hold.\n\n`api_access_disabled`: API access is not enabled for your account.\n\n`encryption_key_missing`: Encryption is on for your account, but this key was made before encryption and has no encryption key. Answered in plain.\n\n`kyc_not_approved`: Your KYC is not approved, so live transfers and verifications are paused. Reads and balance still work.\n\n`live_not_approved`: A live key was used before go-live was approved.\n\n`ip_not_allowed`: A live key was used from a server IP other than the one it was created for.\n\n`product_disabled`: This product is not enabled for your account.\n\n`service_not_enabled`: This service is not enabled for your account.\n\n`forbidden`: This call is not allowed for your account.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"client_on_hold":{"summary":"API access is on hold.","value":{"error":{"code":"client_on_hold","message":"API access is on hold."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"api_access_disabled":{"summary":"API access is not enabled for your account.","value":{"error":{"code":"api_access_disabled","message":"API access is not enabled for your account."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"encryption_key_missing":{"summary":"Encryption is on for your account, but this key was made before encryption and has no encryption key. Answered in plain.","value":{"error":{"code":"encryption_key_missing","message":"Encryption is on for your account, but this key was made before encryption and has no encryption key. Answered in plain."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"kyc_not_approved":{"summary":"Your KYC is not approved, so live transfers and verifications are paused. Reads and balance still work.","value":{"error":{"code":"kyc_not_approved","message":"Your KYC is not approved, so live transfers and verifications are paused. Reads and balance still work."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"live_not_approved":{"summary":"A live key was used before go-live was approved.","value":{"error":{"code":"live_not_approved","message":"A live key was used before go-live was approved."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"ip_not_allowed":{"summary":"A live key was used from a server IP other than the one it was created for.","value":{"error":{"code":"ip_not_allowed","message":"A live key was used from a server IP other than the one it was created for."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"product_disabled":{"summary":"This product is not enabled for your account.","value":{"error":{"code":"product_disabled","message":"This product is not enabled for your account."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"service_not_enabled":{"summary":"This service is not enabled for your account.","value":{"error":{"code":"service_not_enabled","message":"This service is not enabled for your account."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"forbidden":{"summary":"This call is not allowed for your account.","value":{"error":{"code":"forbidden","message":"This call is not allowed for your account."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}}}}}},"405":{"description":"`method_not_allowed`: Only GET and POST are accepted.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"method_not_allowed":{"summary":"Only GET and POST are accepted.","value":{"error":{"code":"method_not_allowed","message":"Only GET and POST are accepted."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}}}}}},"409":{"description":"`reference_conflict`: This reference_id was already used for a different request.\n\n`conflict`: The request conflicts with the current state.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"reference_conflict":{"summary":"This reference_id was already used for a different request.","value":{"error":{"code":"reference_conflict","message":"This reference_id was already used for a different request."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"conflict":{"summary":"The request conflicts with the current state.","value":{"error":{"code":"conflict","message":"The request conflicts with the current state."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}}}}}},"413":{"description":"`payload_too_large`: The body is larger than 256 KB.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"payload_too_large":{"summary":"The body is larger than 256 KB.","value":{"error":{"code":"payload_too_large","message":"The body is larger than 256 KB."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}}}}}},"422":{"description":"`validation_failed`: A field is missing or malformed; the message names it.\n\n`bank_not_identified`: The bank for this IFSC could not be identified.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"validation_failed":{"summary":"A field is missing or malformed; the message names it.","value":{"error":{"code":"validation_failed","message":"A field is missing or malformed; the message names it."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"bank_not_identified":{"summary":"The bank for this IFSC could not be identified.","value":{"error":{"code":"bank_not_identified","message":"The bank for this IFSC could not be identified."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}}}}}},"429":{"description":"`rate_limited`: Too many calls this minute.\n\n`too_many_failed_attempts`: Too many wrong secrets from your IP or for your client id.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"rate_limited":{"summary":"Too many calls this minute.","value":{"error":{"code":"rate_limited","message":"Too many calls this minute."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"too_many_failed_attempts":{"summary":"Too many wrong secrets from your IP or for your client id.","value":{"error":{"code":"too_many_failed_attempts","message":"Too many wrong secrets from your IP or for your client id."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}}}}}},"500":{"description":"`internal_error`: Something went wrong on our side.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"internal_error":{"summary":"Something went wrong on our side.","value":{"error":{"code":"internal_error","message":"Something went wrong on our side."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}}}}}},"502":{"description":"`bad_gateway`: The API could not be reached for a moment.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"bad_gateway":{"summary":"The API could not be reached for a moment.","value":{"error":{"code":"bad_gateway","message":"The API could not be reached for a moment."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}}}}}},"503":{"description":"`service_unavailable`: The service is switched off or under maintenance. Nothing was held.\n\n`outside_service_hours`: The service is closed at this hour for your account; the message names the next opening. Nothing was held.\n\n`product_unavailable`: This product is switched off for everyone right now. Nothing was held.\n\n`vendor_unavailable`: No bank channel is available right now. Nothing was held.\n\n`pricing_not_configured`: Pricing is not configured for your account, or for this amount or mode. Nothing was held.\n\n`pricing_unavailable`: Pricing could not be read right now. Nothing was held.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"service_unavailable":{"summary":"The service is switched off or under maintenance. Nothing was held.","value":{"error":{"code":"service_unavailable","message":"The service is switched off or under maintenance. Nothing was held."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"outside_service_hours":{"summary":"The service is closed at this hour for your account; the message names the next opening. Nothing was held.","value":{"error":{"code":"outside_service_hours","message":"The service is closed at this hour for your account; the message names the next opening. Nothing was held."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"product_unavailable":{"summary":"This product is switched off for everyone right now. Nothing was held.","value":{"error":{"code":"product_unavailable","message":"This product is switched off for everyone right now. Nothing was held."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"vendor_unavailable":{"summary":"No bank channel is available right now. Nothing was held.","value":{"error":{"code":"vendor_unavailable","message":"No bank channel is available right now. Nothing was held."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"pricing_not_configured":{"summary":"Pricing is not configured for your account, or for this amount or mode. Nothing was held.","value":{"error":{"code":"pricing_not_configured","message":"Pricing is not configured for your account, or for this amount or mode. Nothing was held."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"pricing_unavailable":{"summary":"Pricing could not be read right now. Nothing was held.","value":{"error":{"code":"pricing_unavailable","message":"Pricing could not be read right now. Nothing was held."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}}}}}}}}},"/verifications/bank-account/penny-drop/{reference_id}":{"get":{"tags":["Bank verification · Penny drop"],"operationId":"getPennyDropVerification","summary":"Check a verification","description":"Reads one verification made on this API by the `reference_id` you sent it with.","x-glance":["Works at any time, including while the verification is processing","Reads this API's verifications only; test keys read sandbox ones only"],"parameters":[{"name":"reference_id","in":"path","required":true,"description":"The `reference_id` you sent the verification with.","schema":{"type":"string","pattern":"^[A-Za-z0-9._-]{1,64}$","x-rule":"1–64 characters"}}],"responses":{"200":{"description":"The verification.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BankVerification"},"examples":{"verification":{"value":{"verification_id":"MBTM-BAV2610211405091A2B3C4D5E","reference_id":"VER-1001","status":"success","account_number":"XXXXXXXX5678","ifsc":"HDFC0001234","bank_name":"HDFC Bank","mode":"penny_drop","account_holder_name":"RAVI KUMAR","name_match":{"score":100,"matched":true},"bank_reference":"629313723708","failure_reason":null,"retryable":false,"fee":"2.95","fee_gst":"0.45","reused":false,"created_at":"2026-10-21T14:05:09+05:30","completed_at":"2026-10-21T14:05:11+05:30"}}}}}},"401":{"description":"`missing_credentials`: X-Client-Id or X-Client-Secret is missing.\n\n`invalid_credentials`: The client id or secret is wrong, or the key was revoked or has expired.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"missing_credentials":{"summary":"X-Client-Id or X-Client-Secret is missing.","value":{"error":{"code":"missing_credentials","message":"X-Client-Id or X-Client-Secret is missing."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"invalid_credentials":{"summary":"The client id or secret is wrong, or the key was revoked or has expired.","value":{"error":{"code":"invalid_credentials","message":"The client id or secret is wrong, or the key was revoked or has expired."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}}}}}},"403":{"description":"`client_on_hold`: API access is on hold.\n\n`api_access_disabled`: API access is not enabled for your account.\n\n`encryption_key_missing`: Encryption is on for your account, but this key was made before encryption and has no encryption key. Answered in plain.\n\n`live_not_approved`: A live key was used before go-live was approved.\n\n`ip_not_allowed`: A live key was used from a server IP other than the one it was created for.\n\n`forbidden`: This call is not allowed for your account.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"client_on_hold":{"summary":"API access is on hold.","value":{"error":{"code":"client_on_hold","message":"API access is on hold."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"api_access_disabled":{"summary":"API access is not enabled for your account.","value":{"error":{"code":"api_access_disabled","message":"API access is not enabled for your account."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"encryption_key_missing":{"summary":"Encryption is on for your account, but this key was made before encryption and has no encryption key. Answered in plain.","value":{"error":{"code":"encryption_key_missing","message":"Encryption is on for your account, but this key was made before encryption and has no encryption key. Answered in plain."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"live_not_approved":{"summary":"A live key was used before go-live was approved.","value":{"error":{"code":"live_not_approved","message":"A live key was used before go-live was approved."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"ip_not_allowed":{"summary":"A live key was used from a server IP other than the one it was created for.","value":{"error":{"code":"ip_not_allowed","message":"A live key was used from a server IP other than the one it was created for."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"forbidden":{"summary":"This call is not allowed for your account.","value":{"error":{"code":"forbidden","message":"This call is not allowed for your account."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}}}}}},"404":{"description":"`not_found`: Nothing was sent with this reference_id, or there is no such endpoint.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"not_found":{"summary":"Nothing was sent with this reference_id, or there is no such endpoint.","value":{"error":{"code":"not_found","message":"Nothing was sent with this reference_id, or there is no such endpoint."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}}}}}},"405":{"description":"`method_not_allowed`: Only GET and POST are accepted.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"method_not_allowed":{"summary":"Only GET and POST are accepted.","value":{"error":{"code":"method_not_allowed","message":"Only GET and POST are accepted."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}}}}}},"409":{"description":"`conflict`: The request conflicts with the current state.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"conflict":{"summary":"The request conflicts with the current state.","value":{"error":{"code":"conflict","message":"The request conflicts with the current state."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}}}}}},"413":{"description":"`payload_too_large`: The body is larger than 256 KB.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"payload_too_large":{"summary":"The body is larger than 256 KB.","value":{"error":{"code":"payload_too_large","message":"The body is larger than 256 KB."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}}}}}},"429":{"description":"`rate_limited`: Too many calls this minute.\n\n`too_many_failed_attempts`: Too many wrong secrets from your IP or for your client id.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"rate_limited":{"summary":"Too many calls this minute.","value":{"error":{"code":"rate_limited","message":"Too many calls this minute."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}},"too_many_failed_attempts":{"summary":"Too many wrong secrets from your IP or for your client id.","value":{"error":{"code":"too_many_failed_attempts","message":"Too many wrong secrets from your IP or for your client id."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}}}}}},"500":{"description":"`internal_error`: Something went wrong on our side.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"internal_error":{"summary":"Something went wrong on our side.","value":{"error":{"code":"internal_error","message":"Something went wrong on our side."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}}}}}},"502":{"description":"`bad_gateway`: The API could not be reached for a moment.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"bad_gateway":{"summary":"The API could not be reached for a moment.","value":{"error":{"code":"bad_gateway","message":"The API could not be reached for a moment."},"request_id":"b5a1c2d4-7e1f-4f0a-9a6b-1c2d3e4f5a6b"}}}}}}}}}},"webhooks":{"transfer.success":{"post":{"tags":["Transfers"],"summary":"A transfer reached the beneficiary","description":"Sent to your webhook URL, signed as described in `x-webhook-signing`. Answer any 2xx within 10 seconds; anything else is retried for about two days. Dedupe on the event `id`: delivery is at least once.","parameters":[{"name":"X-Webhook-Id","in":"header","required":true,"schema":{"type":"string"},"description":"The event id; the same on every retry."},{"name":"X-Webhook-Timestamp","in":"header","required":true,"schema":{"type":"string"},"description":"Unix seconds when this attempt was signed."},{"name":"X-Webhook-Signature","in":"header","required":true,"schema":{"type":"string"},"description":"`v1=<hex>`; during a secret rotation, two comma-separated values."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEvent"},"examples":{"transfer.success":{"value":{"id":"evt_3f0c9a8b7d6e4f1a2b3c4d5e6f708192","type":"transfer.success","created_at":"2026-10-01T10:30:47+05:30","environment":"live","data":{"transfer":{"transfer_id":"MBTM-TRF2610011030451A2B3C4D5E","reference_id":"INV-1001","status":"success","amount":"2500.00","fee":"5.90","fee_gst":"0.90","total_debit":"2505.90","mode":"IMPS","beneficiary":{"name":"Ravi Kumar","account_number":"XXXXXXXX5678","ifsc":"HDFC0001234","bank_name":"HDFC Bank"},"utr":"625920403204","failure_reason":null,"created_at":"2026-10-01T10:30:45+05:30","completed_at":"2026-10-01T10:30:47+05:30"}}}}}}}},"responses":{"200":{"description":"Received. Any 2xx works."}}}},"transfer.failed":{"post":{"tags":["Transfers"],"summary":"A transfer failed; amount + fee are back in your wallet","description":"Sent to your webhook URL, signed as described in `x-webhook-signing`. Answer any 2xx within 10 seconds; anything else is retried for about two days. Dedupe on the event `id`: delivery is at least once.","parameters":[{"name":"X-Webhook-Id","in":"header","required":true,"schema":{"type":"string"},"description":"The event id; the same on every retry."},{"name":"X-Webhook-Timestamp","in":"header","required":true,"schema":{"type":"string"},"description":"Unix seconds when this attempt was signed."},{"name":"X-Webhook-Signature","in":"header","required":true,"schema":{"type":"string"},"description":"`v1=<hex>`; during a secret rotation, two comma-separated values."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEvent"},"examples":{"transfer.failed":{"value":{"id":"evt_3f0c9a8b7d6e4f1a2b3c4d5e6f708192","type":"transfer.failed","created_at":"2026-10-01T10:30:47+05:30","environment":"live","data":{"transfer":{"transfer_id":"MBTM-TRF2610011030451A2B3C4D5E","reference_id":"INV-1001","status":"failed","amount":"2500.00","fee":"5.90","fee_gst":"0.90","total_debit":"0.00","mode":"IMPS","beneficiary":{"name":"Ravi Kumar","account_number":"XXXXXXXX5678","ifsc":"HDFC0001234","bank_name":"HDFC Bank"},"utr":null,"failure_reason":"declined","created_at":"2026-10-01T10:30:45+05:30","completed_at":"2026-10-01T10:30:47+05:30"}}}}}}}},"responses":{"200":{"description":"Received. Any 2xx works."}}}},"webhook.test":{"post":{"tags":["Webhooks"],"summary":"A test event from the Developer page","description":"Sent to your webhook URL, signed as described in `x-webhook-signing`. Answer any 2xx within 10 seconds; anything else is retried for about two days. Dedupe on the event `id`: delivery is at least once.","parameters":[{"name":"X-Webhook-Id","in":"header","required":true,"schema":{"type":"string"},"description":"The event id; the same on every retry."},{"name":"X-Webhook-Timestamp","in":"header","required":true,"schema":{"type":"string"},"description":"Unix seconds when this attempt was signed."},{"name":"X-Webhook-Signature","in":"header","required":true,"schema":{"type":"string"},"description":"`v1=<hex>`; during a secret rotation, two comma-separated values."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEvent"},"examples":{"webhook.test":{"value":{"id":"evt_3f0c9a8b7d6e4f1a2b3c4d5e6f708192","type":"webhook.test","created_at":"2026-10-01T10:30:47+05:30","environment":"live","data":{"message":"A test event."}}}}}}},"responses":{"200":{"description":"Received. Any 2xx works."}}}}},"components":{"securitySchemes":{"ClientId":{"type":"apiKey","in":"header","name":"X-Client-Id"},"ClientSecret":{"type":"apiKey","in":"header","name":"X-Client-Secret"}},"headers":{"RetryAfter":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RequestId":{"description":"Our id for this call. Send your own `X-Request-Id` and it is kept.","schema":{"type":"string"}}},"schemas":{"TransferRequest":{"type":"object","required":["reference_id","amount","beneficiary"],"properties":{"reference_id":{"type":"string","pattern":"^(?=.*[A-Za-z0-9])[A-Za-z0-9._-]{1,64}$","description":"Yours: one per transfer, case-sensitive.","x-rule":"1–64 characters: letters, digits, `.` `_` `-`; at least one letter or digit"},"amount":{"oneOf":[{"type":"string","pattern":"^\\d{1,10}(\\.0{1,2})?$"},{"type":"integer","minimum":1}],"description":"Rupees to send.","x-rule":"Whole rupees, at least 1: `2500` or `\"2500.00\"`"},"mode":{"type":"string","enum":["IMPS","NEFT"],"default":"IMPS","description":"IMPS settles in seconds; NEFT in the bank's batches."},"beneficiary":{"type":"object","required":["name","account_number","ifsc"],"description":"Who receives the money.","properties":{"name":{"type":"string","maxLength":120,"description":"The account holder's name."},"account_number":{"type":"string","pattern":"^\\d{9,18}$","description":"The beneficiary's account number.","x-rule":"9–18 digits; spaces and dashes are ignored"},"ifsc":{"type":"string","pattern":"^[A-Z]{4}0[A-Z0-9]{6}$","description":"The beneficiary branch's IFSC.","x-rule":"11 characters, the fifth is 0 (`HDFC0001234`); any case"}}}}},"Transfer":{"type":"object","properties":{"transfer_id":{"type":"string","description":"Our reference for the transfer."},"reference_id":{"type":"string","description":"The `reference_id` you sent."},"status":{"type":"string","enum":["processing","success","failed"],"description":"Where it is. Values may be added: treat an unknown one as still processing."},"amount":{"type":"string","description":"What the beneficiary receives."},"fee":{"type":"string","description":"Our fee, GST included."},"fee_gst":{"type":"string","description":"The GST inside `fee`, never added to it."},"total_debit":{"type":"string","description":"amount + fee; 0.00 once a failure has released it."},"mode":{"type":"string","enum":["IMPS","NEFT"],"description":"How it was sent."},"beneficiary":{"type":"object","description":"Who receives the money.","properties":{"name":{"type":"string","description":"As you sent it."},"account_number":{"type":"string","description":"Masked to the last four digits."},"ifsc":{"type":"string","description":"As you sent it, upper-case."},"bank_name":{"type":"string","description":"Looked up from the IFSC."}}},"utr":{"type":["string","null"],"description":"The bank's reference once it succeeds; null before."},"failure_reason":{"type":["string","null"],"enum":["declined","cancelled_by_support",null],"description":"Why it failed; null unless `failed`. Values may be added."},"created_at":{"type":"string","format":"date-time","description":"When we accepted it, IST."},"completed_at":{"type":["string","null"],"format":"date-time","description":"When it became `success` or `failed`; null while processing."},"environment":{"type":"string","enum":["sandbox"],"description":"Present only on sandbox responses."}}},"BankVerificationRequest":{"type":"object","required":["reference_id","account_number","ifsc","consent"],"properties":{"reference_id":{"type":"string","pattern":"^(?=.*[A-Za-z0-9])[A-Za-z0-9._-]{1,64}$","description":"Yours: one per verification, case-sensitive.","x-rule":"1–64 characters: letters, digits, `.` `_` `-`; at least one letter or digit"},"account_number":{"type":"string","pattern":"^\\d{6,20}$","description":"The account number exactly as on the passbook or cheque. Sent to the bank as given.","x-rule":"A string of 6–20 digits, leading zeros kept; spaces and dashes are ignored"},"ifsc":{"type":"string","pattern":"^[A-Z]{4}0[A-Z0-9]{6}$","description":"The account's branch IFSC.","x-rule":"11 characters, the fifth is 0 (`HDFC0001234`); any case"},"name":{"type":"string","pattern":"^(?=.*[A-Za-z])[A-Za-z0-9 &.,'()/-]{2,100}$","description":"The name you expect on the account. Optional; without it there is no `name_match`.","x-rule":"2–100 characters: letters, digits, spaces and `& . , ' ( ) / -`; at least one letter"},"consent":{"type":"boolean","enum":[true],"description":"That the account holder agreed to this check. Must be `true`."}}},"BankVerification":{"type":"object","properties":{"verification_id":{"type":"string","description":"Our reference for the verification."},"reference_id":{"type":"string","description":"The `reference_id` you sent."},"status":{"type":"string","enum":["processing","success","failed"],"description":"`success`: the account exists and the bank named its holder. Values may be added: treat an unknown one as still processing."},"account_number":{"type":"string","description":"Masked to the last four digits."},"ifsc":{"type":"string","description":"As you sent it, upper-case."},"bank_name":{"type":["string","null"],"description":"Looked up from the IFSC; null when the directory could not be read."},"mode":{"type":"string","enum":["penniless","penny_drop"],"description":"Which API answered it."},"account_holder_name":{"type":["string","null"],"description":"The holder's name as the bank gives it; null unless `success`."},"name_match":{"type":["object","null"],"description":"How close your `name` is to the bank's; null when you sent no name or there is no holder name.","properties":{"score":{"type":"integer","description":"0–100; word order and titles are ignored."},"matched":{"type":"boolean","description":"`score` is 70 or more."}}},"bank_reference":{"type":["string","null"],"description":"The bank's reference for the check, when it gives one."},"failure_reason":{"type":["string","null"],"enum":["invalid_account","account_closed","account_frozen","account_restricted","invalid_ifsc","mode_not_supported","verification_limit_reached","suspected_fraud","bank_unavailable","bank_declined","verification_unavailable","cancelled_by_support",null],"description":"Why it failed; null unless `failed`. Values may be added: treat an unknown one as `bank_declined`."},"retryable":{"type":"boolean","description":"A new verification may succeed: now, after 24 hours for `verification_limit_reached`, or on the Penny Drop API for `mode_not_supported`."},"fee":{"type":"string","description":"Our fee, GST included: exactly what this answer cost you; 0.00 when nothing was taken."},"fee_gst":{"type":"string","description":"The GST inside `fee`, never added to it."},"reused":{"type":"boolean","description":"This is your own earlier answer for the account, repeated free."},"created_at":{"type":"string","format":"date-time","description":"When we accepted it, IST."},"completed_at":{"type":["string","null"],"format":"date-time","description":"When it became `success` or `failed`; null while processing."},"environment":{"type":"string","enum":["sandbox"],"description":"Present only on sandbox responses."}}},"Balance":{"type":"object","properties":{"available_balance":{"type":"string","description":"What you can spend now."},"in_flight_balance":{"type":"string","description":"Held for transfers still processing."},"lien_balance":{"type":"string","description":"Set aside by support (a lien): not spendable until support releases it. Available + in flight + lien is your wallet total."},"currency":{"type":"string","enum":["INR"],"description":"Always INR."},"as_of":{"type":"string","format":"date-time","description":"When the balance was read, IST."},"environment":{"type":"string","enum":["sandbox"],"description":"Present only on sandbox responses."}}},"Ping":{"type":"object","properties":{"client_id":{"type":"string","description":"The key you called with."},"environment":{"type":"string","enum":["test","live"],"description":"`test` for a test key, `live` for a live key."},"merchant_id":{"type":"string","description":"Your merchant ID."},"status":{"type":"string","description":"Your API account's status: `sandbox` until go-live, then `live`."},"request_id":{"type":"string","description":"Our id for this call."}}},"Error":{"type":"object","properties":{"error":{"type":"object","description":"What went wrong.","properties":{"code":{"type":"string","description":"Stable and machine-readable: act on this. Codes may be added."},"message":{"type":"string","description":"For people; the wording may change."}}},"request_id":{"type":["string","null"],"description":"Our id for this call; quote it to support."}}},"WebhookEvent":{"type":"object","properties":{"id":{"type":"string","description":"Dedupe on this: the same on every retry."},"type":{"type":"string","enum":["transfer.success","transfer.failed","webhook.test"],"description":"What happened. Types may be added: ignore one you do not handle."},"created_at":{"type":"string","format":"date-time","description":"When it happened, IST."},"environment":{"type":"string","enum":["live","sandbox"],"description":"From the key that started it."},"data":{"type":"object","description":"The resource the event is about.","properties":{"transfer":{"$ref":"#/components/schemas/Transfer","description":"The transfer, exactly as `GET /transfers/{reference_id}` returns it."},"message":{"type":"string","description":"Only on `webhook.test`."}}}}}}},"x-errors":[{"code":"invalid_json","status":400,"on":"send","meaning":"The body is not valid JSON.","action":"Send a JSON body with Content-Type: application/json."},{"code":"encryption_required","status":400,"on":"send","meaning":"Encryption is on for your account and the body was not only encrypted_data. Answered in plain.","action":"Encrypt the body with your key's encryption key and send it as encrypted_data."},{"code":"invalid_encrypted_payload","status":400,"on":"send","meaning":"encrypted_data could not be decrypted: a different key, the IV or tag in the wrong place, or a damaged value. Answered in plain.","action":"Encrypt with the encryption key that belongs to the client id you send; check it on the Encryption page's Try it."},{"code":"missing_credentials","status":401,"on":"all","meaning":"X-Client-Id or X-Client-Secret is missing.","action":"Send both headers on every call."},{"code":"invalid_credentials","status":401,"on":"all","meaning":"The client id or secret is wrong, or the key was revoked or has expired.","action":"Check the key on the Developer page. Rotate it if the secret is lost."},{"code":"insufficient_balance","status":402,"on":"send","meaning":"Your wallet cannot cover what this call costs: a transfer's amount + fee, or a verification's fee. Nothing was held.","action":"Top up, then retry with the same reference_id."},{"code":"client_on_hold","status":403,"on":"all","meaning":"API access is on hold.","action":"Contact support."},{"code":"api_access_disabled","status":403,"on":"all","meaning":"API access is not enabled for your account.","action":"Contact support to have it switched on."},{"code":"encryption_key_missing","status":403,"on":"all","meaning":"Encryption is on for your account, but this key was made before encryption and has no encryption key. Answered in plain.","action":"Rotate the key on the Developer page: the new one comes with its encryption key."},{"code":"kyc_not_approved","status":403,"on":"send","meaning":"Your KYC is not approved, so live transfers and verifications are paused. Reads and balance still work.","action":"Finish KYC on the dashboard, or contact support."},{"code":"live_not_approved","status":403,"on":"all","meaning":"A live key was used before go-live was approved.","action":"Use a test key until go-live is approved."},{"code":"ip_not_allowed","status":403,"on":"all","meaning":"A live key was used from a server IP other than the one it was created for.","action":"Call from that key's server, or create a live key for this server's approved IP on the Developer page."},{"code":"product_disabled","status":403,"on":"send","meaning":"This product is not enabled for your account.","action":"Contact support."},{"code":"service_not_enabled","status":403,"on":"send","meaning":"This service is not enabled for your account.","action":"Contact support."},{"code":"forbidden","status":403,"on":"all","meaning":"This call is not allowed for your account.","action":"Contact support."},{"code":"not_found","status":404,"on":"read","meaning":"Nothing was sent with this reference_id, or there is no such endpoint.","action":"Check the reference_id and the path."},{"code":"reference_conflict","status":409,"on":"send","meaning":"This reference_id was already used for a different request.","action":"Use a new reference_id for a new request."},{"code":"conflict","status":409,"on":"all","meaning":"The request conflicts with the current state.","action":"Read the current state, then retry."},{"code":"validation_failed","status":422,"on":"send","meaning":"A field is missing or malformed; the message names it.","action":"Fix the field and send again."},{"code":"amount_out_of_range","status":422,"on":"send","products":["vendor_payout"],"meaning":"The amount is below the smallest or above the largest amount priced for your account; the message names the range.","action":"Send an amount inside the range."},{"code":"daily_limit_exceeded","status":422,"on":"send","products":["vendor_payout"],"meaning":"Today's transfers plus this one pass your daily limit.","action":"Wait for midnight IST."},{"code":"weekly_limit_exceeded","status":422,"on":"send","products":["vendor_payout"],"meaning":"This week's transfers plus this one pass your weekly limit.","action":"Wait for Monday, midnight IST."},{"code":"monthly_limit_exceeded","status":422,"on":"send","products":["vendor_payout"],"meaning":"This month's transfers plus this one pass your monthly limit.","action":"Wait for the 1st, midnight IST."},{"code":"bank_not_identified","status":422,"on":"send","meaning":"The bank for this IFSC could not be identified.","action":"Use the branch IFSC from the passbook or cheque."},{"code":"sender_profile_incomplete","status":422,"on":"send","products":["vendor_payout"],"meaning":"Your account needs a valid mobile number and name before it can send money.","action":"Contact support."},{"code":"rate_limited","status":429,"on":"all","meaning":"Too many calls this minute.","action":"Wait for the Retry-After header."},{"code":"too_many_failed_attempts","status":429,"on":"all","meaning":"Too many wrong secrets from your IP or for your client id.","action":"Fix the secret, then wait for the Retry-After header."},{"code":"internal_error","status":500,"on":"all","meaning":"Something went wrong on our side.","action":"Read it back by its reference_id before sending it again."},{"code":"service_unavailable","status":503,"on":"send","meaning":"The service is switched off or under maintenance. Nothing was held.","action":"Retry later with the same reference_id."},{"code":"outside_service_hours","status":503,"on":"send","meaning":"The service is closed at this hour for your account; the message names the next opening. Nothing was held.","action":"Retry after the Retry-After header, with the same reference_id."},{"code":"product_unavailable","status":503,"on":"send","meaning":"This product is switched off for everyone right now. Nothing was held.","action":"Retry later with the same reference_id."},{"code":"vendor_unavailable","status":503,"on":"send","meaning":"No bank channel is available right now. Nothing was held.","action":"Retry later with the same reference_id."},{"code":"pricing_not_configured","status":503,"on":"send","meaning":"Pricing is not configured for your account, or for this amount or mode. Nothing was held.","action":"Contact support."},{"code":"pricing_unavailable","status":503,"on":"send","meaning":"Pricing could not be read right now. Nothing was held.","action":"Retry with the same reference_id."},{"code":"ifsc_lookup_unavailable","status":503,"on":"send","products":["vendor_payout"],"meaning":"The IFSC could not be checked right now. No money was held.","action":"Retry with the same reference_id."},{"code":"sandbox_retry_later","status":503,"on":"send","products":["vendor_payout"],"meaning":"Sandbox only (amount 106): a simulated outage.","action":"Retry with the same reference_id; it succeeds."},{"code":"method_not_allowed","status":405,"on":"edge","meaning":"Only GET and POST are accepted.","action":"Use the method the reference shows."},{"code":"payload_too_large","status":413,"on":"edge","meaning":"The body is larger than 256 KB.","action":"Send a smaller body."},{"code":"bad_gateway","status":502,"on":"edge","meaning":"The API could not be reached for a moment.","action":"Read it back by its reference_id, then retry with the same one."}],"x-sandbox":{"description":"Test keys call the same endpoints. Nothing moves; rows are kept apart from live transfers and emit webhooks with environment: sandbox.","balance":"1000000.00","settleAfterSeconds":120,"testAmounts":[{"amount":101,"outcome":"failed at once (failure_reason: declined)"},{"amount":102,"outcome":"processing, then success after 2 minutes"},{"amount":103,"outcome":"processing, then failed after 2 minutes"},{"amount":104,"outcome":"processing, and never resolves"},{"amount":105,"outcome":"402 insufficient_balance; nothing is created"},{"amount":106,"outcome":"503 sandbox_retry_later; a retry with the same reference_id then succeeds"},{"amount":"any other","outcome":"success at once"}]},"x-webhook-signing":{"algorithm":"HMAC-SHA256, hex","signedContent":"{X-Webhook-Timestamp}.{raw request body}","header":"X-Webhook-Signature: v1=<hex>[,v1=<hex>]","toleranceSeconds":300,"rotation":"For 24 hours after a rotation every event carries a signature for each secret; accept the request if any one matches."}}