Processing Payouts — How the flow works
In addition to payments Our platform provides a seamless way to process payouts to your users. With a single API call that includes type: 'payout', you can initiate payouts, collect recipient details through a secure hosted form, and receive real-time status updates via webhooks.
The term 'Payout' will be used further in the documentation - this is a regular Payment with the type 'payout'.
Figure 1 – Payout flow from initiation to completion.
- Payout initiated
The merchant initiates a payout from their system. - Create payout
Your back-end callsPOST /api/paymentswith the amount, currency, andtype: 'payout'to get the payout formurl. - Hosted Payout Form
You redirect the user to the Payout Form where they can securely enter their payout method details. - Return to your site
We redirect the user back to yourredirectUrl, carrying the payment ID so you can show the payout status. - Poll if you wish
You can retrieve the payment withGET /api/payments/:idto see whether it ispending,succeededorfailed. - Webhook push
As soon as the status becomes final, we POST a webhook to the URL you supplied, signed with the token for verification.
With just one API call (including the required type: 'payout' parameter) and one webhook, you have everything you need to process payouts, update your records, and provide a seamless experience to your users.
Payouts API
The Payouts API lets you send money to users in your web apps.
Preparation
- Get a token in the Merchant Dashboard, enable the “Payout” checkbox when generating the token. Keep this token on your server — never expose it in frontend code.
- Call every endpoint over HTTPS and add the header:
Authorization: Bearer <your-token> - ‼️ Always include
type: 'payout'when composing in your request body to indicate this is a payout transaction. By default, the payment type is'payin'. - (Optional) Add an Idempotency-Key header with a UUID v4 to prevent duplicate payouts if you need to retry the request.
Step 1 — Create a payout
Endpoint
POST /api/payments
Content-Type: application/json
Required body fields
| Field | Type | Example | Description |
|---|---|---|---|
amount | string, decimal | "10.00" | Use a dot as the decimal separator. |
currency | string, ISO 4217 | "EUR" | Three capital letters. |
type | string | "payout" | Must be set to "payout" to indicate this is a payout transaction. |
Optional body fields
| Field | Type | Purpose |
|---|---|---|
description | string, max 255 chars | Shown to the recipient and in your dashboard. |
metadata | object, max 4KB | Any JSON object (max 4KB when serialized). Arrays and null values are not allowed in the root. |
externalId | string, max 255 chars | Your unique identifier for this payment. Useful for mapping our payment ID to your internal ID. |
redirectUrl | URL, max 2KB | Where to return the user after filling in the payment details. Must be HTTPS |
webhookUrl | URL, max 2KB | Overrides the default webhook just for this payout. Must be HTTPS. |
cURL example
curl -X POST https://example.com/api/payments \ -H "Authorization: Bearer tk_test_n4912345faza90aefk4c3awf" \ -H "Idempotency-Key: 3e3f3796-4c3a-41e2-a90a-2c0f3e20b0a1" \ -H "Content-Type: application/json" \ -d '{ "externalId": "3e3f3796-4c3a-41e2-a90a-2c0f3e20b0a1", "amount": "10.00", "currency": "EUR", "type": "payout", "description": "Order #1456", "customer": { "id": "550e8400-e29b-41d4-a716-446655440000", "name": "User Name" }, "metadata": { "orderId": 1456 } }'
Response 201 Created / 200 OK
{ "id": "pay_a1b2c3d4", "status": "pending", "url": "https://example.com/checkin/pay_a1b2c3d4", "externalId": "3e3f3796-4c3a-41e2-a90a-2c0f3e20b0a1", "amount": "10.00", "currency": "EUR", "description": "Order #1456", "metadata": { "orderId": 1456 }, "createdAt": "2025-05-27T14:25:00Z" }
Fields not echoed back: redirectUrl, customer, webhookUrl.
What next?
- Open
urlin the browser or WebView — the user sees the hosted checkin page. - After filling in the details, we redirect the user to your
redirectUrl(if you specified one). - We send a webhook with the final status (
succeeded/failed). - Repeat the same JSON with the same or no
Idempotency-Key: you’ll always get the same response, never a duplicate charge.
Other sections
- Service - more information about service work
- Payform - more information about custom payment chechout page
- Payoutform - more information about custom payout checkin page