Skip to main content
POST
Create a batch

Authorizations

Authorization
string
header
required

Server API key, scoped. pk_test_ keys hit the sandbox tenant.

Headers

Idempotency-Key
string
required

Required on money-moving POSTs. Same key + same body replays the first response; same key + different body returns 409 idempotency_key_reused. Kept 7 days.

Required string length: 1 - 255
X-Step-Up-Token
string

Step-up proof (2FA within the last 5 minutes, from POST /v1/auth/step-up). Required when the caller is a customer session and the request would send money to someone else (payouts, batches, scheduled payments); missing or stale returns 403 step_up_required. Not used for own_account transfers, API keys or agent tokens. Same header as the shared StepUpToken parameter, which is unconditionally required.

X-Request-Id
string

Optional client correlation id, up to 128 characters. It is not echoed: the response's X-Request-Id is always our own req_… id. We log your value with the request as client_request_id, so support can find a request by either id. A longer value is refused with 400 parameter_invalid.

Maximum string length: 128

Body

Multipart body for validate and create with a CSV file.

file
string
required

The CSV, in the template format.

source_account_id
string
required

acc_… to pay from.

skip_invalid_rows
boolean
default:false

Create only. Skip invalid rows instead of failing the whole batch.

reason
string

Create only. Shown to the approver.

Maximum string length: 500

Response

Created and waiting for approval (pending_approval, with approval).

A Pay many batch. Its rows are transfers with batch_id.

id
string
required

bat_…

object
string
required

Always batch.

Allowed value: "batch"
status
enum<string>
required

Lifecycle shared by every money-moving resource (CONVENTIONS §8). UI labels: completed → "Settled", pending_approval → "Pending approval".

Available options:
draft,
pending_approval,
scheduled,
processing,
completed,
failed,
rejected,
canceled,
reversed
source_account
object
required

Enough of a PanoFlow account to show it ("Naira · Main · ••••6789"). Full account in the Accounts API.

total
object
required

Sum of the rows being paid.

fee_total
object
required

Sum of the rows' fees.

counts
object
required

How many of the batch's rows are in each state.

created_by
object
required

Who did something. Shown in activity, approvals and the audit log.

created_at
string<date-time>
required

RFC 3339, UTC.

Example:

"2026-10-27T08:41:00Z"

updated_at
string<date-time>
required

RFC 3339, UTC.

Example:

"2026-10-27T08:41:00Z"

status_reason
enum<string>

Sub-state of a batch's status. Clients must tolerate new values.

Available options:
awaiting_approval,
sending,
all_items_completed,
some_items_failed,
all_items_failed,
rejected_by_approver,
canceled_by_user,
approval_expired
file_name
string

File name, or "Pasted rows".

skipped_rows
object[]

Rows that were skipped and will never be paid. Returned on GET /batches/{id}; omitted in lists.

approval
object

The batch's approval, when it needed one.

reason
string

Why it was made (shown to the approver).

completed_at
string<date-time>

When the last row became final.

Example:

"2026-10-27T08:41:00Z"

metadata
object

Up to 20 string keys (≤ 40 chars) with string values (≤ 500 chars). Returned on the resource and its events.