Issue a payout (OCT / MoneySend) 🧼🧶
Use payouts to send funds to a payment card.
Payouts are used for approved push-to-card use cases such as marketplace disbursements, gig-economy payouts, insurance payments, and other card-based disbursements. The card is the payout destination(receiver), and the PAYSTRAX configuration is the funding source (sender).
PAYSTRAX automatically routes the payment through the correct card network based on the destination card — Visa cards use Original Credit Transactions (OCT), and Mastercard cards use MoneySend.
This flow is separate from refunds linked to an existing payment. To return funds against a completed sale, use Refund a payment instead.
How it works 🧶🧶🧶🧶🧶🧶🧶​
Direct credit must be enabled on your configuration before you can use this flow — confirm this with PAYSTRAX if you haven't already.
- Authenticate — attach your Bearer token and Integrator ID (
X-Integrator-ID) to the request headers. - Card details for the payout destination go in
receiver.custom_data— PAN, expiry, and holder name. It's the same endpoint as Accept a payment, just with the card and configuration roles swapped. - Set
intent: transfer,channel: ecommerce, andsender.configuration_idto your PAYSTRAX configuration, andpurchase_data.is_direct_credit: true, then send the request. What was "andcustom_data.credit_typetodirect_credit🧶🧶🧶🧶🧶🧶🧶🧶"? - A successful payout returns
status: pendingand anid— save it as yourpayment_id.
Let's try to do a payout 🧶🧶🧶🧶​
Keep in mind that:
receiverholds the destination card;senderholds theconfiguration_id— the reverse of a sale.custom_data.credit_typeisdirect_credit🧶🧶🧶🧶🧶🧶🧶🧶.- 3DS is not applicable — omit
custom_data.authentication. - All
purchase_data.billingandpurchase_data.customerfields are required.
Here's the smallest valid request for issuing a payout — set intent: transfer and purchase_data.is_direct_credit: true and provide the sender/recieved details directly.
Comments below follow popular API clients' JSON syntax for readability — strip them before sending via curl, fetch, or another HTTP client.
{
"amount": 500, // Your amount in minor units
"currency": "EUR", // Your currency
"receiver": { // Represent the receiver in this operation
"type": "credit_card",
"custom_data": {
"pan": "5341260000000056",
"expiry_month": "12",
"expiry_year": "2033",
"holder_name": "GUNNY GUNN"
}
},
"sender": {
"configuration_id": "<CONFIGURATION_ID>" //PSP/acquirer configuration identifier.
},
"routing": {
"payment_flow": "credit_card" //?????????????
},
"intent": "transfer", // This intent is used to debit funds
"channel": "ecommerce", // Sale channel (e.g. `ecommerce`, `moto`)
"custom_data": {
"authentication": {
"cvc": "123"
}
},
"descriptors": {
"reconciliation": "MTID-123456"
},
"purchase_data": {
"is_direct_credit": true, // Direct credit must be enabled on your configuration.
"billing": {
"street": "Main Street",
"house_number": "1",
"city": "City",
"state_or_province": "State",
"country": "UK",
"postal_code": "101"
},
"customer": {
"first_name": "Name",
"last_name": "Name",
"email": "email@email.com",
"mobile_phone": "+447777777777",
"ipv4": "000.0.000.00"
}
}
}
[TODO] Check the HTTP response — the desired status is 201, meaning the request was accepted. The response body also includes status: pending, since the payout is queued for network processing. Save these fields to later trace the payment:
| Field | Purpose |
|---|---|
id | Payment ID — used for GET, reverse, and webhooks |
For more in depth details check Payment status transitions and Response ID Fields.
🧶 Try for yourself
Call this flow directly in the API Reference — select the Payout example.
- POST Create Direct payment