Direct API Integration¶
Payout – API Integration¶
This page provides guidance for integrating Payouts using the Direct API approach. Payouts allow you to transfer funds directly to a beneficiary's bank account.
Your platform is responsible for:
- Collecting beneficiary bank account details (account number, account name, IFSC code for INR)
- Initiating the payout request with the correct beneficiary type and data
- Handling asynchronous webhook callbacks for final transaction status
- Verifying the transaction status via the Transaction Status API
Beneficiary Type¶
When initiating a payout request, specify the beneficiary type in the beneficiary.type field:
| Type | Description |
|---|---|
bank_account |
Bank account transfer (required for INR payouts) |
Required Beneficiary Data (INR Bank Account)¶
Each INR payout must include the following fields in beneficiary.data:
| Field | Type | Required | Description |
|---|---|---|---|
account_number |
string | Yes | Beneficiary bank account number |
account_name |
string | Yes | Full name of the account holder |
ifsc |
string | Yes | IFSC code — Indian Financial System Code identifying the bank and branch (e.g., SBIN0001234) |
bank_code |
string | No | Bank code |
bank_name |
string | No | Name of the bank |
bank_branch |
string | No | Branch name |
bank_address |
string | No | Bank address |
bank_city |
string | No | City of the bank branch |
bank_state |
string | No | State of the bank branch |
mobile |
string | No | Beneficiary mobile number |
Example Request¶
{
"terminal_id": "TERM001",
"reference": "PAYOUT-INR-20260319-001",
"description": "INR payout to beneficiary bank account",
"currency": "INR",
"amount": 10000,
"beneficiary": {
"type": "bank_account",
"data": {
"account_number": "000133524852",
"account_name": "Test User",
"ifsc": "SBIN0001234"
}
},
"customer": {
"first_name": "John",
"last_name": "Doe",
"email": "john.doe@example.com"
},
"customer_ip": "192.168.1.1"
}
The
amountis in minor units. For INR,10000represents 100.00 INR.
Example Response (Pending)¶
{
"result": {
"id": "PyTxAbCdEfGhIjKlMnOp",
"merchant_id": "0000000000000fpg-dev",
"order_id": "ORD_PAYOUT_20260319_001",
"terminal_id": "TERM001",
"reference": "PAYOUT-INR-20260319-001",
"description": "INR payout to beneficiary bank account",
"currency": "INR",
"amount": 10000,
"customer": {
"first_name": "John",
"last_name": "Doe",
"email": "john.doe@example.com"
},
"processing_result": {
"payment_provider_id": "PP_T365",
"payment_provider_account_id": "PPACCT_INR001"
},
"approved": false,
"pending": true,
"channel": "ecommerce",
"transaction_type": "PAYOUT",
"status": "PENDING",
"payment_method": {
"method": "****4852",
"type": "payout_upi",
"masked": "****4852"
},
"normalized_amount": 10000,
"errors": []
},
"action": null,
"redirect": null,
"form_submit": null
}
Example Response (Approved)¶
{
"result": {
"id": "PyTxAbCdEfGhIjKlMnOp",
"merchant_id": "0000000000000fpg-dev",
"order_id": "ORD_PAYOUT_20260319_001",
"terminal_id": "TERM001",
"reference": "PAYOUT-INR-20260319-001",
"description": "INR payout to beneficiary bank account",
"currency": "INR",
"amount": 10000,
"customer": {
"first_name": "John",
"last_name": "Doe",
"email": "john.doe@example.com"
},
"processing_result": {
"payment_provider_id": "PP_T365",
"payment_provider_account_id": "PPACCT_INR001",
"approval_code": "AUTH789",
"reference_number": "REF_PAYOUT_001"
},
"approved": true,
"pending": false,
"channel": "ecommerce",
"transaction_type": "PAYOUT",
"status": "APPROVED",
"payment_method": {
"method": "****4852",
"type": "payout_upi",
"masked": "****4852"
},
"normalized_amount": 10000,
"errors": []
},
"action": null,
"redirect": null,
"form_submit": null
}
Payment Gateway API - Payout 1.0.0¶
This API processes payout transactions — push payments that transfer funds directly to a beneficiary's bank account or mobile wallet.
Access Token: Obtain an access token via OpenID Connect using your client credentials (client_id and client_secret are available in your merchant dashboard). See the Authentication guide for details.
Process Payout Transaction: The /api/transactions/payout endpoint initiates a payout and returns detailed response data.
Important: This endpoint requires an Authorization header with a valid Bearer token.
INR Payouts: For Indian Rupee payouts, the beneficiary must include an IFSC code (Indian Financial System Code) to identify the destination bank branch. The beneficiary.type must be bank_account.
Servers¶
| Description | URL |
|---|---|
| https://api.example.com | https://api.example.com |
Endpoints¶
POST /api/transactions/payout¶
Execute Payout Transaction
Description
Execute a payout transaction to transfer funds to a beneficiary's bank account.
Requirements:
- An Authorization header with a valid Bearer token is required.
- The beneficiary object must specify the destination type and account details.
- For INR payouts, the ifsc field is mandatory in the beneficiary data.
Key characteristics:
- No 3D Secure authentication — the action, redirect, and form_submit fields in the response will always be null.
- Payouts may be processed asynchronously. The initial response may have status PENDING, with the final status delivered via webhook.
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
bearerAuth |
header | string | N/A | No | JWT Bearer token |
Request body
{
"terminal_id": "string",
"reference": "string",
"description": "string",
"currency": "INR",
"amount": 208,
"beneficiary": {
"type": "bank_account",
"data": {
"account_number": "000133524852",
"account_name": "Test User",
"ifsc": "SBIN0001234",
"bank_code": "string",
"bank_name": "string",
"bank_branch": "string",
"bank_address": "string",
"bank_city": "string",
"bank_state": "string",
"mobile": "string"
}
},
"customer": {
"first_name": "string",
"last_name": "string",
"address": "string",
"city": "string",
"country": "string",
"postal_code": "string",
"email": "string",
"phone": "string",
"id": "string"
},
"metadata": {},
"return_url": "string",
"error_url": "string",
"cancel_url": "string",
"options": {},
"customer_ip": "192.168.1.1"
}
Schema of the request body
{
"type": "object",
"description": "Request to initiate a payout transaction.",
"properties": {
"terminal_id": {
"type": "string",
"description": "Terminal identifier. The terminal must be configured to support payout transactions.",
"minLength": 5,
"maxLength": 20
},
"reference": {
"type": "string",
"description": "Unique payout reference per terminal (max 40 chars). Idempotent — if an order for this reference already exists with the same amount and currency, the existing transaction is returned. Different amount/currency will result in a validation error.\n",
"minLength": 1,
"maxLength": 80
},
"description": {
"type": "string",
"description": "Human-readable payout description.",
"minLength": 1,
"maxLength": 100
},
"currency": {
"type": "string",
"description": "ISO 4217 currency code (e.g., INR, EUR, USD).",
"example": "INR",
"minLength": 3,
"maxLength": 3
},
"amount": {
"type": "integer",
"format": "int64",
"description": "Payout amount in minor units (e.g., 10000 = 100.00 INR)."
},
"beneficiary": {
"$ref": "#/components/schemas/BeneficiaryDto"
},
"customer": {
"$ref": "#/components/schemas/CustomerDto"
},
"metadata": {
"type": "object",
"additionalProperties": true,
"description": "Arbitrary key-value metadata for the payout transaction."
},
"return_url": {
"type": "string",
"description": "URL to redirect the customer to after a successful payout."
},
"error_url": {
"type": "string",
"description": "URL to redirect the customer to after a failed payout."
},
"cancel_url": {
"type": "string",
"description": "URL to redirect the customer to after a canceled payout."
},
"options": {
"type": "object",
"additionalProperties": true,
"description": "Provider-specific or payout-type-specific options."
},
"customer_ip": {
"type": "string",
"description": "Customer IP address. Defaults to the request IP if not provided.",
"example": "192.168.1.1"
}
},
"required": [
"terminal_id",
"reference",
"description",
"currency",
"amount",
"beneficiary"
]
}
Responses
{
"result": {
"id": "PyTxAbCdEfGhIjKlMnOp",
"merchant_id": "0000000000000fpg-dev",
"order_id": "ORD_PAYOUT_20260319_001",
"terminal_id": "TERM001",
"reference": "PAYOUT-INR-20260319-001",
"description": "INR payout to beneficiary bank account",
"currency": "INR",
"amount": 10000,
"customer": {
"first_name": "John",
"last_name": "Doe",
"email": "john.doe@example.com"
},
"processing_result": {
"payment_provider_id": "PP_T365",
"payment_provider_account_id": "PPACCT_INR001",
"approval_code": "AUTH789",
"reference_number": "REF_PAYOUT_001"
},
"approved": true,
"pending": false,
"channel": "ecommerce",
"transaction_type": "PAYOUT",
"status": "APPROVED",
"payment_method": {
"method": "****4852",
"type": "payout_upi",
"masked": "****4852"
},
"normalized_amount": 10000,
"errors": []
},
"action": null,
"redirect": null,
"form_submit": null
}
{
"result": {
"id": "PyTxPeNdInGhIjKlMnOp",
"merchant_id": "0000000000000fpg-dev",
"order_id": "ORD_PAYOUT_20260319_002",
"terminal_id": "TERM001",
"reference": "PAYOUT-INR-20260319-002",
"description": "INR payout to beneficiary",
"currency": "INR",
"amount": 50000,
"customer": {
"first_name": "Jane",
"last_name": "Smith",
"email": "jane.smith@example.com"
},
"processing_result": {
"payment_provider_id": "PP_T365",
"payment_provider_account_id": "PPACCT_INR001"
},
"approved": false,
"pending": true,
"channel": "ecommerce",
"transaction_type": "PAYOUT",
"status": "PENDING",
"payment_method": {
"method": "****7890",
"type": "payout_upi",
"masked": "****7890"
},
"normalized_amount": 50000,
"errors": []
},
"action": null,
"redirect": null,
"form_submit": null
}
{
"result": {
"id": "PyTxDcLnEdGhIjKlMnOp",
"merchant_id": "0000000000000fpg-dev",
"order_id": "ORD_PAYOUT_20260319_003",
"terminal_id": "TERM001",
"reference": "PAYOUT-INR-20260319-003",
"description": "INR payout declined",
"currency": "INR",
"amount": 25000,
"customer": {
"first_name": "Alex",
"last_name": "Johnson",
"email": "alex.johnson@example.com"
},
"processing_result": {
"payment_provider_id": "PP_T365",
"payment_provider_account_id": "PPACCT_INR001"
},
"approved": false,
"pending": false,
"channel": "ecommerce",
"transaction_type": "PAYOUT",
"status": "DECLINED",
"payment_method": {
"method": "****3456",
"type": "payout_upi",
"masked": "****3456"
},
"normalized_amount": 25000,
"errors": []
},
"action": null,
"redirect": null,
"form_submit": null
}
Schema of the response body
{
"type": "object",
"properties": {
"result": {
"$ref": "#/components/schemas/ExtendedTransactionDto",
"description": "Extended transaction details."
},
"action": {
"type": "object",
"nullable": true,
"description": "Always null for payout transactions (no 3DS authentication required)."
},
"redirect": {
"type": "object",
"nullable": true,
"description": "Always null for payout transactions (no redirect required)."
},
"form_submit": {
"type": "object",
"nullable": true,
"description": "Always null for payout transactions (no form submission required)."
}
},
"description": "Response payload for a payout transaction."
}
{
"errors": [
{
"message": "The size of \"reference\" must be less than or equal to 80. The given size is 100",
"params": [
"reference",
"80",
"100"
],
"property": "reference"
}
],
"method": "POST",
"status": 422
}
Schema of the response body
{
"type": "object",
"properties": {
"errors": {
"type": "array",
"items": {
"type": "object",
"properties": {
"message": {
"type": "string"
},
"params": {
"type": "array",
"items": {
"type": "string"
}
},
"property": {
"type": "string"
}
}
}
},
"method": {
"type": "string"
},
"status": {
"type": "integer"
}
}
}
{
"error": "Unauthorized"
}
Schema of the response body
{
"type": "object",
"properties": {
"error": {
"type": "string"
}
}
}
Schemas¶
BeneficiaryBankAccountData¶
| Name | Type | Description |
|---|---|---|
account_name |
string | Full name of the account holder. |
account_number |
string | Beneficiary bank account number. |
bank_address |
string | Bank address. |
bank_branch |
string | Branch name. |
bank_city |
string | City of the bank branch. |
bank_code |
string | Bank code. |
bank_name |
string | Name of the bank. |
bank_state |
string | State of the bank branch. |
ifsc |
string | IFSC code (Indian Financial System Code). Required for INR payouts. Identifies the bank and branch. |
mobile |
string | Beneficiary mobile number. |
BeneficiaryDto¶
| Name | Type | Description |
|---|---|---|
data |
BeneficiaryBankAccountData | |
type |
string | Beneficiary type. Determines the expected fields in `data`. |
CustomerDto¶
| Name | Type | Description |
|---|---|---|
address |
string | null | |
city |
string | null | |
country |
string | null | |
email |
string | null | |
first_name |
string | null | |
id |
string | null | |
last_name |
string | null | |
phone |
string | null | |
postal_code |
string | null |
ExecuteTransactionResponseDto¶
| Name | Type | Description |
|---|---|---|
action |
Always null for payout transactions (no 3DS authentication required). | |
form_submit |
Always null for payout transactions (no form submission required). | |
redirect |
Always null for payout transactions (no redirect required). | |
result |
ExtendedTransactionDto | Extended transaction details. |
ExtendedTransactionDto¶
| Name | Type | Description |
|---|---|---|
amount |
integer(int64) | |
approved |
boolean | |
channel |
string | |
currency |
string | |
customer |
CustomerDto | |
description |
string | |
errors |
Array<> | |
id |
string | |
merchant_id |
string | |
normalized_amount |
integer(int64) | |
order_id |
string | |
payment_method |
PaymentMethodDataDto | |
pending |
boolean | |
processing_result |
ProcessingResultDto | |
redirect_url |
string | null | |
reference |
string | |
status |
TransactionStatus | |
terminal_id |
string | |
transaction_type |
string |
PaymentMethodDataDto¶
| Name | Type | Description |
|---|---|---|
brand |
string | null | |
hash |
string | null | |
masked |
string | Masked account number (last 4 digits visible). |
method |
string | Masked account identifier. |
token |
string | null | |
type |
string | Payment method type (e.g., payout_upi). |
PayoutRequestDto¶
| Name | Type | Description |
|---|---|---|
amount |
integer(int64) | Payout amount in minor units (e.g., 10000 = 100.00 INR). |
beneficiary |
BeneficiaryDto | |
cancel_url |
string | URL to redirect the customer to after a canceled payout. |
currency |
string | ISO 4217 currency code (e.g., INR, EUR, USD). |
customer |
CustomerDto | |
customer_ip |
string | Customer IP address. Defaults to the request IP if not provided. |
description |
string | Human-readable payout description. |
error_url |
string | URL to redirect the customer to after a failed payout. |
metadata |
Arbitrary key-value metadata for the payout transaction. | |
options |
Provider-specific or payout-type-specific options. | |
reference |
string | Unique payout reference per terminal (max 40 chars). Idempotent — if an order for this reference already exists with the same amount and currency, the existing transaction is returned. Different amount/currency will result in a validation error. |
return_url |
string | URL to redirect the customer to after a successful payout. |
terminal_id |
string | Terminal identifier. The terminal must be configured to support payout transactions. |
ProcessingResultDto¶
TransactionStatus¶
Type: string
Security schemes¶
| Name | Type | Scheme | Description |
|---|---|---|---|
| bearerAuth | http | bearer |