Split Payment
Distribute a single transaction's payout across a primary account and multiple sub-accounts using Split Payments.
Split Payment
API Version: 3.0.0
Split Payments let you distribute a single transaction's payout across a primary account and multiple sub-accounts in one smooth transaction. This simplifies fund allocation, making it easy to pay out multiple recipients from a single customer payment.
Use class: "ECOM" with action: "SALE" or "AUTH". See Class by API for the full mapping.
Navigate to Developers → API Keys → Add new API key → Select Hosted Solution in the Channel Dropdown to generate your API credentials.
Split Payments must be enabled on your merchant account before use. Contact PayOrc support to activate this feature and obtain your Split IDs.
How It Works
- Configure Split IDs — Each sub-account (recipient) has a unique Split ID assigned by PayOrc.
- Pass split rules in
custom_data— Specify the split type (percentage or flat amount) and value for each recipient. - Customer pays the full amount — The customer pays the total order amount as usual.
- PayOrc distributes funds — After settlement, PayOrc automatically splits the payout across all configured accounts.
Endpoint
| Method | URL |
|---|---|
| POST | https://api.payorc.com/orders/v1/create |
Please use the test credentials for sandbox testing.
Headers
| Header | Type | Required | Description |
|---|---|---|---|
merchant-key | String | Yes | Your merchant API key (e.g., live-D111PIS13YK) |
merchant-secret | String | Yes | Your merchant API secret (e.g., sec-JI11G0P13Z0) |
Content-Type | String | Yes | Must be application/json |
Request Body — Top-Level Fields
All fields are nested inside a top-level data object: { "data": { ... } }. Same schema as Payment Request API — only custom_data carries split rules.
| Field | Type | Required | Description |
|---|---|---|---|
class | String | Yes | Must be ECOM |
action | String | Yes | SALE or AUTH — see Transaction Actions |
capture_method | String | No | AUTOMATIC or MANUAL — only when action is AUTH. Default: AUTOMATIC if omitted. Ignored for SALE |
payment_token | String | No | Not used for ECOM |
customer_details | Object | Yes | Customer information — see Customer Details |
order_details | Object | Yes | Order amount, currency, and description — see Order Details |
billing_details | Object | Yes | Billing address — see Billing Details |
shipping_details | Object | Yes | Shipping address — see Shipping Details |
items | Array | No | Line items — see Items |
urls | Object | Yes | Redirect and webhook URLs — see URLs |
parameters | Array | No | Merchant metadata echoed in webhooks — see Parameters |
custom_data | Array | Yes | Split payment rules — see Custom Data (Split Rules) |
Same request body as Payment Request API. Include urls.webhook_url the same way. Only custom_data differs for split rules.
Custom Data (Split Rules)
custom_data is an array of objects. Enable split mode with alpha, then define rules in beta through epsilon.
| Array element | Required | Format | Example | Meaning |
|---|---|---|---|---|
{ "alpha": "..." } | Yes | |SPLIT_PAYMENT | "|SPLIT_PAYMENT" | Enables split payment mode |
{ "beta": "..." } | Yes | |{id},{type},{value} | "|100,P,2" | 2% to Split ID 100 |
{ "gamma": "..." } | No | |{id},{type},{value} | "|101,F,50" | Flat 50 to Split ID 101 |
{ "delta": "..." } | No | |{id},{type},{value} | "|102,F,25" | Flat 25 to Split ID 102 |
{ "epsilon": "..." } | No | |{id},{type},{value} | "|103,P,1" | 1% to Split ID 103 |
- Split payments work in live mode only.
P= percentage of order amount;F= flat amount in order currency.- Split IDs are provided by PayOrc after you configure sub-accounts.
- See Custom Data for combined MID Group + Split format.
Customer Details
The customer_details object is required. Individual fields may be empty strings if not available at order creation.
| Field | Type | Required | Description |
|---|---|---|---|
m_customer_id | String | No | Your internal customer identifier |
name | String | Yes* | Customer's full name (first and last name) — may be "" |
email | String | Yes* | Customer's email address — may be "" |
mobile | String | No | Customer's mobile phone number (digits only) |
code | String | No | Country dialing code (e.g., 91 for India, 971 for UAE) |
* Required by schema; pass an empty string if not available.
Order Details
| Field | Type | Required | Description |
|---|---|---|---|
m_order_id | String | No | Your internal order identifier |
amount | Number | Yes | Order amount — minimum 1 (e.g., 60.20) |
convenience_fee | Number | Yes* | Additional fee — may be 0 or "" |
quantity | Number | Yes* | Number of items — may be ""; defaults to 1 in processing |
currency | String | Yes | ISO 4217 currency code (e.g., AED, USD, EUR, GBP, INR) |
description | String | Yes* | Human-readable order description — may be "" |
return_url | String | No | Optional return URL stored with the order |
* Required by schema; pass an empty string or 0 if not applicable.
The amount field must be a number without currency symbols, commas, or spaces. Minimum value is 1.
Billing Details
The billing_details object is required. Fields may be empty strings if not collected.
| Field | Type | Required | Description |
|---|---|---|---|
address_line1 | String | Yes* | Billing address line 1 — may be "" |
address_line2 | String | Yes* | Billing address line 2 — may be "" |
city | String | Yes* | Billing city — may be "" |
province | String | Yes* | Billing state or province — may be "" |
country | String | Yes* | ISO 3166-1 alpha-2 country code (e.g., AE) — may be "" |
pin | String | Yes* | Billing postal/ZIP code — may be "" |
Shipping Details
The shipping_details object is required. Fields may be empty strings if not collected.
| Field | Type | Required | Description |
|---|---|---|---|
shipping_name | String | Yes* | Recipient's full name — may be "" |
shipping_email | String | Yes* | Recipient's email — may be "" |
shipping_code | String | No | Country dialing code for shipping mobile |
shipping_mobile | String | No | Recipient's phone number (digits only) |
address_line1 | String | Yes* | Shipping address line 1 — may be "" |
address_line2 | String | Yes* | Shipping address line 2 — may be "" |
city | String | Yes* | Shipping city — may be "" |
province | String | Yes* | Shipping state or province — may be "" |
country | String | Yes* | ISO 3166-1 alpha-2 country code — may be "" |
pin | String | Yes* | Shipping postal/ZIP code — may be "" |
location_pin | String | Yes* | Google Maps location URL — may be "" |
shipping_currency | String | Yes* | ISO 4217 currency for shipping — may be "" |
shipping_amount | Number | Yes* | Shipping cost — may be 0 or "" |
Items
The items array is optional. When provided, each item supports the fields below. Use title (not name) and reference_id (not sku) — these match what the API accepts and stores.
| Field | Type | Required | Description |
|---|---|---|---|
title | String | No | Product name |
description | String | No | Product description |
quantity | Number | No | Quantity ordered (minimum 1) |
unit_price | String | No | Price per unit (e.g., "10.00") |
discount_amount | String | No | Discount applied |
reference_id | String | No | Merchant product identifier |
image_url | String | No | Product image URL |
product_url | String | No | Product page URL |
gender | String | No | Male, Female, Kids, or Other |
category | String | No | Product category |
color | String | No | Product color |
product_material | String | No | e.g., cotton, polyester |
size_type | String | No | Size type label |
size | String | No | e.g., L, XL, 12 |
brand | String | No | Brand name |
is_refundable | Boolean | No | Whether the product can be returned |
URLs
The urls object is required. Redirect URLs may be empty strings — PayOrc falls back to MID default URLs when not provided.
| Field | Type | Required | Description |
|---|---|---|---|
success | String | No | URL to redirect after successful payment |
cancel | String | No | URL to redirect if customer cancels |
failure | String | No | URL to redirect if payment fails |
webhook_url | String | No | Per-order webhook URL (HTTPS). Overrides dashboard webhook for this order when set |
You can configure a default webhook URL in the PayOrc Merchant Portal. Use urls.webhook_url to override it for a specific order. The URL must use HTTPS (localhost is allowed for testing).
Parameters
parameters is an array of objects — one object per field. PayOrc echoes these values in webhook notifications.
"parameters": [
{ "alpha": "your-value" },
{ "beta": "" },
{ "gamma": "" },
{ "delta": "" },
{ "epsilon": "" }
]| Field | Type | Required | Description |
|---|---|---|---|
alpha | String | No | Merchant-defined data |
beta | String | No | Merchant-defined data |
gamma | String | No | Merchant-defined data |
delta | String | No | Merchant-defined data |
epsilon | String | No | Merchant-defined data |
Code Examples
Replace {URL} with https://api.payorc.com/orders/v1/create, and {merchant-key} / {merchant-secret} with your actual credentials.
Example 1: Percentage-Based Split (2% to primary, flat AED 50 to sub-account)
Same full body as Payment Request API. Only custom_data differs for split rules.
curl --location --globoff 'https://api.payorc.com/orders/v1/create' \
--header 'merchant-key: {merchant-key}' \
--header 'merchant-secret: {merchant-secret}' \
--header 'Content-Type: application/json' \
--data-raw '{
"data": {
"class": "ECOM",
"action": "SALE",
"capture_method": "",
"payment_token": "",
"customer_details": {
"m_customer_id": "CUST-1234",
"name": "John Doe",
"email": "[email protected]",
"mobile": "9876543210",
"code": "91"
},
"order_details": {
"m_order_id": "SPLIT-2024-001",
"amount": 100,
"quantity": 1,
"convenience_fee": 0,
"currency": "AED",
"description": "Split payment order",
"return_url": ""
},
"billing_details": {
"address_line1": "123 Main Street",
"address_line2": "",
"city": "Dubai",
"province": "Dubai",
"country": "AE",
"pin": "54044"
},
"shipping_details": {
"shipping_name": "John Doe",
"shipping_email": "[email protected]",
"shipping_code": "",
"shipping_mobile": "",
"address_line1": "123 Main Street",
"address_line2": "",
"city": "Dubai",
"province": "Dubai",
"country": "AE",
"pin": "54044",
"location_pin": "",
"shipping_currency": "AED",
"shipping_amount": 0
},
"urls": {
"success": "https://yourdomain.com/payment/success",
"cancel": "https://yourdomain.com/payment/cancel",
"failure": "https://yourdomain.com/payment/failure",
"webhook_url": "https://yourdomain.com/webhook"
},
"parameters": [
{
"alpha": ""
},
{
"beta": ""
},
{
"gamma": ""
},
{
"delta": ""
},
{
"epsilon": ""
}
],
"custom_data": [
{
"alpha": "|SPLIT_PAYMENT"
},
{
"beta": "|100,P,2"
},
{
"gamma": "|101,F,50"
},
{
"delta": ""
},
{
"epsilon": ""
}
],
"items": [
{
"title": "Premium Plan",
"description": "Monthly subscription",
"quantity": 1,
"unit_price": "100.00",
"discount_amount": "0.00",
"reference_id": "SKU-001",
"image_url": "https://example.com/image.png",
"product_url": "https://example.com/product",
"gender": "Male",
"category": "Subscription",
"color": "",
"product_material": "",
"size_type": "",
"size": "",
"brand": "PayOrc",
"is_refundable": true
}
]
}
}'Response — Success (200)
{
"status": "SUCCESS",
"status_code": 00,
"message": "Order created",
"p_order_id": 1000010240,
"m_order_id": "SPLIT-2023-001",
"p_request_id": 1000010200,
"order_creation_date": "15/06/2023 12:20:27",
"amount": "AED 100.00",
"payment_link": "https://checkout.payorc.com/pay/xxxxx",
"iframe_link": "https://checkout.payorc.com/iframe/xxxxx"
}Response Fields
| Field | Type | Description |
|---|---|---|
status | String | SUCCESS or fail |
status_code | Number | 00 for success |
message | String | Human-readable message |
p_order_id | Number | PayOrc's internal order ID |
m_order_id | String | Your merchant order ID (echoed back) |
p_request_id | Number | PayOrc request tracking ID |
order_creation_date | String | Timestamp of order creation |
amount | String | Formatted amount with currency |
payment_link | String | Full-page hosted payment URL |
iframe_link | String | Embeddable iframe payment URL |
Response — Error (4xx)
{
"message": "Invalid merchant key and secret",
"status": "fail",
"code": "401"
}