Skip to main content

Issue a payout (OCT / MoneySend) 🧼🧶

Direct Payment API

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.

  1. Authenticate — attach your Bearer token and Integrator ID (X-Integrator-ID) to the request headers.
  2. 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.
  3. Set intent: transfer, channel: ecommerce, and sender.configuration_id to your PAYSTRAX configuration, and purchase_data.is_direct_credit: true, then send the request. What was "and custom_data.credit_type to direct_credit🧶🧶🧶🧶🧶🧶🧶🧶"?
  4. A successful payout returns status: pending and an id — save it as your payment_id.

Let's try to do a payout 🧶🧶🧶🧶​

note

Keep in mind that:

  • receiver holds the destination card; sender holds the configuration_id — the reverse of a sale.
  • custom_data.credit_type is direct_credit🧶🧶🧶🧶🧶🧶🧶🧶.
  • 3DS is not applicable — omit custom_data.authentication.
  • All purchase_data.billing and purchase_data.customer fields 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.

Request body
{
"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:

FieldPurpose
idPayment ID — used for GET, reverse, and webhooks

For more in depth details check Payment status transitions and Response ID Fields.

🧶 Try for yourself

Try it

Call this flow directly in the API Reference — select the Payout example.

  • POST Create Direct payment