Skip to main content
After your underwriting model approves a loan, you call this endpoint to disburse the funds. We coordinate the OPay payout to the user’s wallet or directly to their bank.

Create a disbursement

Body

string
required
The user receiving the disbursement.
string
required
Amount in kobo. String-encoded BigInt to preserve precision.
string
required
One of:
  • WALLET — Land in the user’s Guild wallet. They can then withdraw or use it directly.
  • BANK_DIRECT — Land directly in the user’s verified payout bank account. Skips the wallet.
string
required
Your internal loan/credit reference. We include it in the audit row and the webhook.
string
Free-text purpose tag for your internal tracking. Optional. Examples: tool_equipment_loan, inventory_advance, working_capital.
object
Optional. Arbitrary key-value pairs for your records.

Required headers

string
required
Bearer <api_key> with write:disbursements scope.
string
required
Required for disbursements (write operations). Use a fresh UUID per logical disbursement; same UUID per retry of that disbursement.

Example

Response 201

string
ULID prefixed dis_.
string
One of PENDING, DELIVERED, FAILED.
string
User receiving.
string
As requested.
string
As requested.
string
Your reference.
string
As supplied.
string
ISO-8601.
object
As supplied.
For WALLET destination, the response is typically DELIVERED synchronously — the wallet credit is internal. For BANK_DIRECT destination, the response is typically PENDING and resolves to DELIVERED (or FAILED) via webhook once OPay’s payout completes.

Error cases

Get a disbursement

Response 200

Same shape as the creation response, with the current status. For a settled disbursement, additional fields appear:
string
ISO-8601 of when the funds landed.
string
The OPay transaction reference (audit trail).
string
If FAILED, the reason.

List disbursements

Query parameters

string
Filter to one user.
string
Filter by status.
string
ISO-8601 inclusive lower bound on createdAt.
string
ISO-8601 exclusive upper bound on createdAt.
integer
default:"50"
Max 200.
string
For pagination.

Response 200

Cursor-paginated list.

Lifecycle webhooks

Subscribe to disbursement.delivered and disbursement.failed events to receive push notifications when status changes. See Webhooks.

Settlement timing

A disbursement that’s been PENDING for over 5 minutes is unusual. We surface it in the dashboard and you can also poll the GET endpoint.

Webhooks

Push notifications for delivery and failure.

Repayments

How repayments come back to you via direct debit.