Validate a batch file or rows
Checks a Pay many file without creating anything, for the summary and the “Rows 12 and 27 need fixing”
warning. Send the CSV as multipart/form-data (file), or JSON with either csv (pasted rows) or rows.
CSV format (the template): header recipient_name,account_number,bank,amount_ngn,narration, one payment per
line. amount_ngn is in naira (e.g. 450000 or 450000.00), not kobo, because people fill it in a
spreadsheet; every amount in the response is Money in kobo. bank is matched against bank names and
aliases from GET /banks. Lines are numbered from 1 after the header.
Each row is checked for: name present, a 10-digit numeric account number, a known bank, an amount above zero
and within the per-payment limit, narration length. Rows that fail are returned in skipped_rows with a
reason and a customer-safe message. Names are not enquired here; each row is name-enquired when the
batch runs and a failure shows on that row’s transfer.
A file that can’t be read at all (empty, not CSV, no rows under the header) is 422 batch_row_invalid with
details.fatal. More rows than the plan allows is 422 batch_too_large (details.max_rows).
Error codes: invalid_api_key, parameter_invalid, parameter_missing, resource_not_found, scope_missing, csrf_token_invalid, batch_row_invalid, batch_too_large, rate_limited.
Authorizations
Server API key, scoped. pk_test_ keys hit the sandbox tenant.
Headers
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.
128Body
Multipart body for validate and create with a CSV file.
Response
The validation result.
Result of POST /batches/validate. Nothing is created.
Always batch_validation.
"batch_validation"Enough of a PanoFlow account to show it ("Naira · Main · ••••6789"). Full account in the Accounts API.
Rows read (excluding the header).
Rows that can be paid.
Rows that will be skipped.
Sum of the valid rows.
Fees for the valid rows.
Source available balance after total + fees ("Available after this batch"). Negative means it can't be covered.
True when creating it will return pending_approval for this caller.
Rows that can be paid, in file order.
Rows that can't be paid, with reasons.
As sent.