Schedule a payment
A payment to a saved recipient that runs once on a future date (frequency: once) or repeats.
Step-up for customer sessions, like any payout.
The next run always exists as a transfer with status: scheduled (next_transfer_id), so it shows in
Transactions and can be skipped. On its date (08:00 Africa/Lagos) that transfer goes through the same checks as
POST /transfers — balance, limits, risk, approval threshold — and then becomes processing,
pending_approval, or failed (failure.code: insufficient_balance when the balance doesn’t cover it:
“Scheduled payments leave on their date if the balance covers them”). The following run is then scheduled.
The business is emailed the day before each run (Notifications).
422 schedule_in_past if the first run date is not in the future.
Error codes: invalid_api_key, parameter_invalid, parameter_missing, resource_not_found, scope_missing, step_up_required, csrf_token_invalid, idempotency_key_reused, schedule_in_past, business_frozen, business_not_approved, rate_limited.
Authorizations
Server API key, scoped. pk_test_ keys hit the sandbox tenant.
Headers
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.
1 - 255Step-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.
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
Display name.
80rcp_…, a saved active recipient.
acc_… to pay from.
An amount in minor units (kobo, cents) with its currency. Never a decimal.
When it runs. Examples: "Every Monday" = weekly, day_of_week: monday; "Monthly, on the 28th" = monthly,
day_of_month: 28; "Every 3 months" = monthly, interval: 3. Runs at 08:00 Africa/Lagos. A
day_of_month past the end of a month runs on the month's last day.
Narration on every run.
60Up to 20 string keys (≤ 40 chars) with string values (≤ 500 chars). Returned on the resource and its events.
Response
Scheduled.
A payment to a saved recipient on a schedule.
sch_…
Always scheduled_payment.
"scheduled_payment"e.g. "Warehouse rent".
80State of the schedule itself (its runs are transfers with MovementStatus). completed when a once
schedule has run or end_on has passed.
active, paused, canceled, completed rcp_…
Enough of a PanoFlow account to show it ("Naira · Main · ••••6789"). Full account in the Accounts API.
An amount in minor units (kobo, cents) with its currency. Never a decimal.
When it runs. Examples: "Every Monday" = weekly, day_of_week: monday; "Monthly, on the 28th" = monthly,
day_of_month: 28; "Every 3 months" = monthly, interval: 3. Runs at 08:00 Africa/Lagos. A
day_of_month past the end of a month runs on the month's last day.
Human text, e.g. "Every 3 months", "Every Monday", "Monthly, on the 28th".
Runs so far.
x >= 0Who did something. Shown in activity, approvals and the audit log.
RFC 3339, UTC.
"2026-10-27T08:41:00Z"
RFC 3339, UTC.
"2026-10-27T08:41:00Z"
The recipient's display name.
The recipient's account.
Narration on every run.
Next run date. Omitted when paused, canceled or completed.
"2026-11-07"
The scheduled transfer for the next run.
The most recent run, with its transfer's ISO 8583 outcome (ResponseOutcome).
Up to 20 string keys (≤ 40 chars) with string values (≤ 500 chars). Returned on the resource and its events.