Requirements
- A Dots account with an App and API credentials.
- Each user in the batch must already exist in your workspace and be allowed to receive payouts on the selected rail.
- Every batch item must set
fund=true, which moves funds before the payout is issued. - Plan to handle partial failures by inspecting each item’s
error_codeanderror_message.
1. Build the batch payload
Each batch contains a sharedmetadata object and a list of payout items. Every item must use a unique idempotency_key; duplicates are rejected during validation.
Batch-level fields
| Field | Required | Description |
|---|---|---|
items | ✅ | Array of payout requests. Min 1, max 5,000 items. |
idempotency_key | Optional | UUID to prevent duplicate batch submissions. |
metadata | Optional | Attach custom context (string or key/value object) to the batch. |
Item fields
| Field | Required | Description |
|---|---|---|
user_id | ✅ | Target user’s ID. |
amount | ✅ | Amount in cents to pay the user. |
platform | ✅ | Rail to use (for example ach, paypal, venmo, default). |
account_id | Optional | ACH / bank account to use when a user has multiple accounts on the same rail. |
idempotency_key | ✅ | UUID to deduplicate this specific payout. Must be unique within the batch. |
fund | ✅ (true) | Batch payouts currently require true. Transfers funds before issuing the payout. |
tax_exempt | Optional | Exclude the payout from 1099 calculations. |
payout_fee_party | Optional | Override who pays fees (user or platform). |
metadata | Optional | Custom context specific to the item. Returned in results for easy reconciliation. |
2. Create the batch
UsePOST /v2/payout-batches with your App credentials. Reuse the same idempotency_key to safely retry the request.
created → processing → paying_out → completed as transfers are issued.
3. Track batch processing
Check the batch summary
PollGET /v2/payout-batches/{payout_batch_id} to monitor the batch-level status and metadata.
Retrieve per-item results
CallGET /v2/payout-batches/{payout_batch_id}/results for detailed outcomes. Set include_request=true to echo the original request payload for each item.
transfer.status to reconcile payouts that succeeded (settled / processing) versus those that require follow-up. Items that fail keep their error_code and can be retried with a new idempotency key once the underlying issue is resolved.
4. List historical batches
GET /v2/payout-batches returns paginated batches created by your App. Use limit, starting_after, and ending_before to page through older entries.
Best practices
- Use idempotency everywhere: Provide both batch- and item-level keys so you can safely retry without creating duplicate payouts.
- Handle partial failures: Inspect each item’s
error_code/error_messageand requeue only the failed items with new idempotency keys. - Monitor transfers: Subscribe to payout and transfer webhooks to track asynchronous status changes beyond the initial batch response.
- Respect rate limits: Large batches may take time to execute; poll no more than once every few seconds and back off when the batch is still
processing.
What’s next?
- Configure webhooks to receive live updates as payouts are processed.
- Review idempotency guidance to design safe retry logic.

