Live API console — authenticate, test, and explore the PayRails Payout API in real time.
| Environment | Live Demo |
| Base URL | https://api.payrails.in/api/v1 |
| Authentication | x-api-key |
| Demo Amount | ₹100 (Fixed — server-side constant) |
| Payment Mode | IMPS |
| Beneficiary | Fixed test beneficiary (hardcoded on server) |
x-api-key header. No OAuth, no login session required.| Base URL | https://api.payrails.in/api/v1 |
| Auth method | x-api-key request header |
| Content type | application/json |
| Protocol | HTTPS only |
Content-Type: application/json Accept: application/json x-api-key: YOUR_API_KEY X-Idempotency-Key: <uuid> ← recommended
X-Idempotency-Key per payout request.
If you submit the same key within 48 hours and a payout was already created, the original response is returned immediately
— no duplicate payout is created. Use a UUID or timestamp-based key generated server-side.
Follow this sequence for every payout.
Everything you need to send your first payout in under 5 minutes.
x-api-key from PayRails. Include it on every request.GET /payouts/walletavailable_balance ≥ payout amount.POST /payoutsplatform_payout_id returned in the response. You will need it for status polling.GET /payouts/{platform_payout_id}Check your available balance before creating a payout. Attempting a payout with insufficient funds returns an error without creating any record.
{
"currency": "INR",
"total_balance": 50000,
"reserved_balance": 3000,
"available_balance":47000,
"payouts_enabled": true,
"is_frozen": false
}
| Field | Type | Description |
|---|---|---|
| available_balance | number | Immediately usable funds. Formula: total_balance − reserved_balance. |
| reserved_balance | number | Funds locked for in-flight payouts not yet settled. |
| total_balance | number | Full balance including reserved funds. |
| payouts_enabled | boolean | False when payouts are administratively disabled. |
| is_frozen | boolean | True when wallet is frozen — all payout attempts will be rejected. |
The live card below calls this exact endpoint and displays your real-time balance.
Wallet balance is checked automatically before each payout creation.
Initiates a real-money bank transfer. The payout begins processing immediately after successful creation.
| Field | Required | Type | Validation / Notes |
|---|---|---|---|
| amount | Required | number | Positive number. Must not exceed the merchant single-payout limit. |
| mode | Required | string | IMPS · NEFT · RTGS · UPI |
| beneficiary.name | Required | string | Non-empty string. |
| beneficiary.account_number | Required | string | 6–18 digits. Encrypted before storage — never stored in plaintext. |
| beneficiary.ifsc | Required | string | 11-char IFSC code. Pattern: ABCD0123456 |
| beneficiary.account_type | Optional | string | Default SAVINGS. Allowed: SAVINGS CURRENT SALARY NRE NRO |
| beneficiary.bank_name | Optional | string | Stored for reference. No validation. |
| beneficiary.mobile | Optional | string | Stored as-is. No format validation. |
| beneficiary.email | Optional | string | Stored as-is. No format validation. |
| merchant_ref | Optional | string | Your reference ID. Not required to be unique. |
All payouts from this console go to the beneficiary below. These values are hardcoded constants on the server and cannot be changed from the browser.
After creating a payout, use this endpoint to check its current status. Poll until the status reaches a terminal state.
{
"platform_payout_id": "PPX...",
"platform_request_id": "PRQ...",
"merchant_reference": "DEMO_...",
"status": "SUCCESS",
"amount": 100,
"currency": "INR",
"mode": "IMPS",
"provider_reference": "COLT12345",
"bank_reference_number": "HDFC9876",
"failure_reason": null,
"created_at": "...",
"updated_at": "..."
}
status is a terminal value. The live polling card above uses this exact API automatically.A payout transitions through these states. Poll the Status API until a terminal state is reached.
CANCELLED EXPIRED RETRY_PENDING REVERSED have no further transitions.
FAILED is not terminal — an admin may issue a retry.
SUCCESS may transition to REVERSED if the bank reverses the transfer.
EXPIRED means the polling window exceeded 24 h without a definitive outcome; wallet reservation is not automatically released.
POST /payouts request body. No separate beneficiary management step is required.
In your production integration, include the beneficiary's bank details in every payout request as shown in the
Create Payout API section above. The fields you need are:
name, account_number, ifsc, account_type,
and optionally bank_name, mobile, and email.
All values are encrypted before storage and the account number is never returned in plaintext.
All errors from the payout backend. Every field is from the actual implementation.
| HTTP | Error / Condition | Cause | Resolution |
|---|---|---|---|
| 400 | PAYOUT_API_DISABLED | Merchant's payout_mode is not API_ENABLED. | Contact PayRails support to enable API payouts. |
| 400 | amount must be positive | amount is 0, negative, or not a number. | Send a positive numeric amount. |
| 400 | mode must be one of… | Invalid mode value. | Use IMPS, NEFT, RTGS, or UPI. |
| 400 | beneficiary.account_number invalid | Not 6–18 digits. | Validate before submission. |
| 400 | beneficiary.ifsc invalid | Does not match [A-Z]{4}0[A-Z0-9]{6}. | Use a valid 11-char IFSC code. |
| 400 | Insufficient balance | available_balance < amount. | Check wallet before submitting. |
| 400 | Wallet frozen | Wallet is frozen by admin. | Contact PayRails support. |
| 400 | Daily limit exceeded | Merchant daily payout limit reached. | Wait for the next IST business day or request a limit increase. |
| 400 | Mode not allowed | Requested mode not in merchant's allowed list. | Use a permitted mode or contact support. |
| 403 | IP_NOT_ALLOWED | Caller IP not in the merchant IP whitelist. | Add your server IP via the admin portal. |
| 503 | IDEMPOTENCY_STORE_UNAVAILABLE | Idempotency Redis store unavailable. | Retry with backoff. Do not change your idempotency key. |
| 503 | PAYOUTS_SYSTEM_DISABLED | Global kill-switch active. | Contact PayRails support. |
| 429 | Rate limit exceeded | More than 10 payout creation requests in 60 seconds. | Implement exponential backoff. |
Copy-paste ready examples. Replace YOUR_API_KEY with your actual key.
curl -X GET \\ 'https://api.payrails.in/api/v1/payouts/wallet' \\ -H 'x-api-key: YOUR_API_KEY' \\ -H 'Accept: application/json'
curl -X POST \\
'https://api.payrails.in/api/v1/payouts' \\
-H 'Content-Type: application/json' \\
-H 'Accept: application/json' \\
-H 'x-api-key: YOUR_API_KEY' \\
-H 'X-Idempotency-Key: unique-request-id-here' \\
-d '{
"amount": 100,
"beneficiary": {
"name": "Beneficiary Name",
"account_number": "1234567890",
"ifsc": "HDFC0001234",
"account_type": "SAVINGS",
"bank_name": "HDFC Bank",
"mobile": "9876543210",
"email": "payee@example.com"
},
"mode": "IMPS",
"merchant_ref": "YOUR_REF_001"
}'
curl -X GET \\ 'https://api.payrails.in/api/v1/payouts/PPX_REPLACE_WITH_PLATFORM_PAYOUT_ID' \\ -H 'x-api-key: YOUR_API_KEY' \\ -H 'Accept: application/json'
Verify each item before going live with PayRails Payout API.
x-api-key securely on the server. Never expose it in the browser or mobile app.GET /payouts/wallet and verify available_balance ≥ amount before creating a payout.merchant_ref for every payout (e.g. your internal order ID).X-Idempotency-Key for every new payout request.platform_payout_id returned by POST /payouts immediately after creation.GET /payouts/{platform_payout_id} every 3–5 seconds until the status is terminal.FAILED: log the failure_reason. An admin can issue a retry if appropriate.EXPIRED: the wallet reservation is not automatically released. Contact PayRails support.SUCCESS: confirm the bank_reference_number for reconciliation.This demo executes real payouts against the live API. To prevent exposing private banking information, the page enforces a strict two-model architecture.
$execPayload which goes directly to CURLOPT_POSTFIELDS. They are never passed to any HTML rendering function.PayRails Test PayeeXXXXXX432198XXXXXX21support@payrails.in