Skip to main content

Detailed payment response for API integrations.

payment_id
string
required

Unique identifier for the payment.

Example:

"pay_1a2b3c4d5e"

status
enum<string>
required

Current status of the payment. created: the charge exists and no attempt has succeeded yet. processing: an attempt is in flight and is being verified. succeeded: the payment is confirmed and settled in full. accepted: an underpayment or overpayment was accepted as final settlement. failed: the payment failed and no funds were captured. expired: the payment window elapsed before any payment arrived. cancelled: cancelled before completion. refunded: the full amount was returned to the customer. partially_refunded: part of the amount was returned to the customer. auto_refunded: we automatically returned the full amount to the customer. underpaid: the customer paid less than the amount owed. overpaid: the customer paid more than the amount owed.

Available options:
created,
processing,
succeeded,
accepted,
failed,
expired,
cancelled,
refunded,
partially_refunded,
auto_refunded,
underpaid,
overpaid
Example:

"succeeded"

amount
string
required

Requested amount in currency.

Example:

"10.00"

currency
string
required

Payment currency code.

Example:

"USD"

created_at
string<date-time>
required

Creation timestamp.

Example:

"2026-04-27T12:00:00Z"

updated_at
string<date-time>
required

Last update timestamp.

Example:

"2026-04-27T12:00:05Z"

reference
string | null

Checkout reference when available.

Example:

"order_9876"

billing_reason
enum<string>

Why this payment exists. purchase: a one-time purchase. subscription_create: the first cycle of a new subscription. subscription_cycle: a subscription renewal. subscription_update: an off-cycle charge from a mid-cycle plan change (proration).

Available options:
purchase,
subscription_create,
subscription_cycle,
subscription_update
Example:

"purchase"

checkout_id
string | null

Checkout identifier, when linked.

Example:

"chk_8T9u0V1w2X3y4Z5a"

is_refundable
boolean | null

Whether this payment can currently be refunded.

Example:

true

amount_paid
string | null

Amount received so far.

Example:

"10.00"

amount_remaining
string | null

Remaining amount still expected.

Example:

"0.00"

fee_usd
string | null

Processing fee for this payment, converted to USD and expressed as a decimal string. null until the payment settles.

Example:

"0.59"

fees
object | null

The processing fee on this payment, in the currency it was charged in. Prefer this over fee_usd when the payment was not collected in USD: fee_usd is a conversion of the same fee, this is the amount actually taken. null on a payment that carries no processing fee. See Fees.

merchant_bears_cost
boolean | null

Whether merchant bears processing cost.

Example:

true

platform_fee
string | null

What the platform took out of this sale, beside the gross it was taken from, in the base currency of the sale. null when the charge carried no platform fee, and on a charge that split the sale with transfer_data.amount instead. See Platform fees.

Example:

null

destination_amount
string | null

The seller's contracted share of this sale, in the base currency of the sale. Null on a charge that carries no split, and on one that split the sale with platform_fee instead.

Example:

null

fee_paid_by
enum<string> | null

Who Bachs's processing fee actually came from on this charge, read back from the ledger posting rather than a flag decided in advance. merchant: the fee came out of the charge. platform: the platform's own balance covered it. On a destination charge this never reads platform; the fee always comes from the charge there. See Processing fees.

Available options:
merchant,
platform
Example:

"merchant"

payment_method
string | null

How the payment was collected, usually named by rail and currency together, such as USD_CARD, NGN_CARD, NGN_BANK_TRANSFER, MOMO_GHS, or CRYPTO. A payment requested with a general method name can return BANK_TRANSFER or MOBILE_MONEY, so accept both forms for the same rail; null means the payment never reached a provider.

Example:

"NGN_BANK_TRANSFER"

channel
string | null

Origin channel (for example api).

Example:

"checkout"

narration
string | null

payment description/narration.

Example:

"Pro plan"

meta
object | null

Public metadata stored for this payment.

Example:
message
string | null

Human-readable payment message derived from status.

Example:

"Successful"

customer
object | null

Customer information when available.

line_items
object[] | null

The line items this payment covers.

subscription_id
string | null

The subscription this payment belongs to, or null for a one-time purchase.

Example:

null

invoice
object | null

The invoice this payment collected. Present only for subscription payments; null for one-time purchases.

refunds
string[] | null

IDs of any refunds issued for this payment. null if no refund has been created.

Example:
status_history
object[] | null

Chronological list of status changes for this payment.

payment_method_details
object | null

Who paid and how, read from the attempt that succeeded. Returned on a single payment and on the collection.succeeded webhook, not on the payment list. null on payments taken before this field existed, and on payment methods that tell us nothing about the payer.

The shape is keyed by type. For bank_transfer, the bank_transfer object carries sender_name, sender_bank, sender_bank_code, sender_account_number (the full account the money came from, which you need to send money back to the sender), session_id (the interbank reference for the transfer) and narration. Which of those are present depends on what the sending bank passed on, so treat each as optional. It also carries a virtual_account object naming the account number the money landed in: id, account_number, bank_name, type (permanent for an account you keep, one_time for a number created for a single checkout) and expires_at.

Example:
completed_at
string<date-time> | null

Completion timestamp when available.

Example:

"2026-04-27T12:00:05Z"