Create a Payout
POSThttps://api.cleverhub.co/api/v1/payouts
Initiate a batch payout to multiple recipients using either PayID or BSB-enabled accounts. This API enables efficient bulk payment processing, allowing merchants to handle payouts to multiple recipients in a single request.
If a payout fails due to insufficient funds and the is_retry
flag is set to true, the system will continue to attempt processing until sufficient funds become available, either through a balance top-up or new incoming payments.
Payment statuses:
- created: Payout created and pending further processing.
- processing: Payout has been topped up to the corresponding PayID and is currently being processed.
- scheduled: Waiting for funds to be debited from the payer's account; the payout is scheduled but not yet executed.
- completed: Payout completed successfully for the entire batch. Note that individual transaction failures do not affect the completion status of the overall batch.
Important notes:
- If using a phone number as the PayID, prefix it with the country code, separated by a dash. For example:
+61-412345678
. - PayIDs using email addresses must be in lowercase (e.g.,
johnwick@gmail.com
). - Either
payid
or bothbsb
andaccount_number
are required. You cannot use bothpayid
andbsb/account_number
in the same request for a single transaction.
Request
- application/json
Bodyrequired
payout_transaction_details object[]required
Scheduled date and time for the payout transaction. This date-time is in UTC.
2024-01-01T10:00:00
Brief description of the payout purpose.
Possible values: >= 5 characters
and <= 140 characters
Monthly payout for January
Indicates if the system should retry the payout in case of insufficient funds. Default is false. If set to true, the system will continue to try until the balance is sufficient, either through top-up or new payments.
false
true
A custom identifier provided by the merchant for tracking purposes.
custom-payout-id-123
URL that Hello Clever will invoke when the status of the transaction changes. The client must expose a TLS 1.2-secured endpoint with a certificate from a well-known commercial certificate authority. Self-signed or internally signed certificates are not accepted.
https://merchant.example.com/payout_status_callback
Authorization header value for securing the callback request to the specified endpoint.
Bearer your_secret_token
Responses
- 200
- 400
- 401
- 404
- 422
Payout batch created successfully.
- application/json
- Schema
- Example (auto)
Schema
created
: The payout has been created but not yet processed.processing
: The payout is currently being processed.scheduled
: The payout is scheduled for a future date.completed
: The payout has been completed successfully.expired
: The payout has expired.
A unique identifier assigned to the payout payment, used for tracking and referencing purposes within the system.
12345
A unique UUID assigned to the payout payment, providing a globally unique reference for the transaction.
550e8400-e29b-41d4-a716-446655440000
A description of the payout payment, providing context or additional information such as the purpose of the payout.
Payout for invoice #12345
The PayID used for topping up the payout payment, allowing for easy routing of funds to the correct recipient.
sample@payid.com
The total amount of all transactions included in the payout, providing the complete value being paid out.
1000.00
The total amount that has been refunded to the payee, if applicable.
100.00
The total number of transactions within the payout that failed to complete successfully.
2
The date and time when the payout transaction is scheduled to occur, expressed in UTC.
2024-12-31T23:59:59Z
The current status of the payout payment. Possible values include:
Possible values: [created
, processing
, scheduled
, completed
, expired
]
processing
A URL for downloading an attachment related to the payout payment, such as a receipt or transaction details.
https://example.com/download/payout_attachment
payout_notification object
An error code associated with the payout, indicating any issues that occurred during processing.
HC_PAYOUT1
A description of the error encountered during the payout process, providing context for troubleshooting.
Insufficient funds to payout. Please top up balance in the dashboard.
Indicates whether the payout is being retried after a previous failure.
false
A custom identifier for the payout, provided by the merchant for tracking and reference purposes.
custom-payout-id-6789
payout_transactions object[]
{
"id": 12345,
"uuid": "550e8400-e29b-41d4-a716-446655440000",
"description": "Payout for invoice #12345",
"payid": "sample@payid.com",
"total_amount": "1000.00",
"total_refund": "100.00",
"total_failed_transactions": "2",
"scheduled_at": "2024-12-31T23:59:59Z",
"status": "processing",
"export_url": "https://example.com/download/payout_attachment",
"payout_notification": {
"endpoint_url": "https://merchant.com/payout_callback",
"authorization_header": "Bearer your_token"
},
"error_code": "HC_PAYOUT1",
"error_message": "Insufficient funds to payout. Please top up balance in the dashboard.",
"is_retry": false,
"external_id": "custom-payout-id-6789",
"payout_transactions": [
{
"id": 123,
"balance_id": "550e8400-e29b-41d4-a716-446655441111",
"payee": "John Doe",
"payid": "payee@payid.com",
"payid_type": "EMAIL",
"bsb": "123456",
"account_number": "987654321",
"amount": "500.00",
"status": "settled",
"error_message": "Payment failed due to insufficient funds.",
"created_at": "2024-01-01T00:00:00Z"
}
]
}
Bad Request
Unauthorized
Not Found
Unprocessable Entity
Callbacks
- POST payoutCallback
POST{$request.body#/endpoint_url}
- application/json
Body
PayoutObject
created
: The payout has been created but not yet processed.processing
: The payout is currently being processed.scheduled
: The payout is scheduled for a future date.completed
: The payout has been completed successfully.expired
: The payout has expired.
A unique identifier assigned to the payout payment, used for tracking and referencing purposes within the system.
12345
A unique UUID assigned to the payout payment, providing a globally unique reference for the transaction.
550e8400-e29b-41d4-a716-446655440000
A description of the payout payment, providing context or additional information such as the purpose of the payout.
Payout for invoice #12345
The PayID used for topping up the payout payment, allowing for easy routing of funds to the correct recipient.
sample@payid.com
The total amount of all transactions included in the payout, providing the complete value being paid out.
1000.00
The total amount that has been refunded to the payee, if applicable.
100.00
The total number of transactions within the payout that failed to complete successfully.
2
The date and time when the payout transaction is scheduled to occur, expressed in UTC.
2024-12-31T23:59:59Z
The current status of the payout payment. Possible values include:
Possible values: [created
, processing
, scheduled
, completed
, expired
]
processing
A URL for downloading an attachment related to the payout payment, such as a receipt or transaction details.
https://example.com/download/payout_attachment
payout_notification object
An error code associated with the payout, indicating any issues that occurred during processing.
HC_PAYOUT1
A description of the error encountered during the payout process, providing context for troubleshooting.
Insufficient funds to payout. Please top up balance in the dashboard.
Indicates whether the payout is being retried after a previous failure.
false
A custom identifier for the payout, provided by the merchant for tracking and reference purposes.
custom-payout-id-6789
payout_transactions object[]
Callbacks Responses
- 200
- 400
- 401
Callback received successfully
Bad request
Unauthorized
- csharp
- curl
- dart
- go
- http
- java
- javascript
- kotlin
- c
- nodejs
- objective-c
- ocaml
- php
- powershell
- python
- r
- ruby
- rust
- shell
- swift
- HTTPCLIENT
- RESTSHARP
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Post, "https://api.cleverhub.co/api/v1/payouts");
request.Headers.Add("Accept", "application/json");
var content = new StringContent("{\n \"payout_transaction_details\": [\n {\n \"payee\": \"John Doe\",\n \"address\": \"123 Example Street, Sydney, NSW 2000\",\n \"email\": \"john.doe@example.com\",\n \"amount\": 150,\n \"payid\": \"john.doe@example.com\",\n \"payid_type\": \"email\",\n \"bsb\": \"123456\",\n \"account_number\": \"987654321\"\n }\n ],\n \"scheduled_at\": \"2024-01-01T10:00:00\",\n \"description\": \"Monthly payout for January\",\n \"is_retry\": true,\n \"external_id\": \"custom-payout-id-123\",\n \"endpoint_url\": \"https://merchant.example.com/payout_status_callback\",\n \"authorization_header\": \"Bearer your_secret_token\"\n}", null, "application/json");
request.Content = content;
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
Console.WriteLine(await response.Content.ReadAsStringAsync());