Skip to main content
Batch Payouts let you create up to 5,000 payouts for different users with one request. The batch executes each payout independently, giving every item its own transfer, status, and idempotency guarantees while still letting you manage the workflow as a unit.

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_code and error_message.

1. Build the batch payload

Each batch contains a shared metadata object and a list of payout items. Every item must use a unique idempotency_key; duplicates are rejected during validation.

Batch-level fields

Item fields

2. Create the batch

Use POST /v2/payout-batches with your App credentials. Reuse the same idempotency_key to safely retry the request.
The batch is queued for execution immediately. Statuses progress from createdprocessingpaying_outcompleted as transfers are issued.

3. Track batch processing

Check the batch summary

Poll GET /v2/payout-batches/{payout_batch_id} to monitor the batch-level status and metadata.

Retrieve per-item results

Call GET /v2/payout-batches/{payout_batch_id}/results for detailed outcomes. Set include_request=true to echo the original request payload for each item.
Use the per-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_message and 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?