Receipts
Receipts
Bead payment methods require a small number of fields beyond what you already include on a standard card receipt. This page covers what's required, what's additionally available, and how delivery works.
Required fields
The following fields must be included on all Bead payment receipts when applicable:
Payment method
Always
amounts.paid.inPaymentCurrency.currency.name on GET /Payments/{id} (e.g. Bitcoin Lightning)
Final payment status
Always
statusCode on the payment object
Exchange rate
When a crypto-to-fiat conversion occurs
conversions[].executedExchangeRate on GET /Payments/{id}
Fields your existing receipt already covers — date, time, amount, merchant name, taxes, support contact — do not need to change.
The conversions array
The conversions field is returned as an array on GET /Payments/{id} and in the payment result webhook payload. It is present on completed crypto payments and absent on non-crypto payments.
Array size: By design, conversions will contain exactly one entry for any given payment today. The array type is forward-looking; the system mutates a single conversion entry through its lifecycle rather than appending new ones. You can safely treat it as single-entry, but the defensive pattern below is recommended so your integration is robust to any future changes.
Conversion statusCode
Each entry in conversions has its own statusCode field — this is separate from the payment's top-level statusCode. The conversion statusCode values are:
quoted
A rate has been locked for the payment, but the funds have not yet settled
executed
The conversion has completed and the exchange rate is final
completed
The conversion and settlement are fully resolved
cancelled
The conversion was cancelled (e.g. payment expired or was invalid)
Only read executedExchangeRate once statusCode is executed or completed. Before that state, this field is zero/default and does not reflect a real rate.
Reading the exchange rate
The recommended pattern for reading the exchange rate from the conversions array:
Check that
conversionsis non-empty.Find the entry where
statusCodeis"executed"or"completed". In practice there is only one entry, but keying offstatusCoderather than position is the correct approach.Read
executedExchangeRatefrom that entry.
Example (JavaScript):
Field reference
statusCode
Conversion lifecycle state. Read other fields only when this is executed or completed.
quotedExchangeRate
The rate locked at the time the payment was created.
presentedExchangeRate
The rate shown to the payer at checkout.
executedExchangeRate
The realized settlement rate. Use this for receipt display. Today this matches the quoted/presented rate in all normal payment flows; it may differ in edge cases involving payment exceptions (underpaid, cancelled, expired) where funds convert before reaching a suspense wallet.
Additional fields available
The following fields are available from GET /Payments/{id} and are useful to include on receipts for crypto payments, but are not required by Bead.
Payment code
paymentCode
Unique identifier for the payment
Payment date/time
receivedTime
ISO 8601 timestamp
Crypto amount paid
amounts.paid.inPaymentCurrency.amount
Amount in the payment currency
Crypto asset
amounts.paid.inPaymentCurrency.currency.code
e.g. BTC
Requested fiat amount
amounts.requested.inRequestedCurrency.amount
The amount the merchant requested
Requested fiat currency
amounts.requested.inRequestedCurrency.currency.code
e.g. USD
When to issue the receipt
Generate or finalize the receipt after the payment reaches a final state. All fields above are available from a single call: GET /Payments/{id}. The payment result webhook also includes conversions[], so you can read the exchange rate directly from the webhook payload without a follow-up GET call. See Payment Statuses for the complete list of final states.
Receipt delivery
Integrator-delivered (default): You deliver the receipt to the consumer using your existing channels — printed, email, SMS, in-app, or portal.
Bead-delivered (optional): Enable emailReceipt and/or smsReceipt on the Create Payment request to have Bead send the receipt directly to the consumer. When enabled, you do not need to send a separate consumer receipt. You remain responsible for merchant-side records, back-office retrievability, and retaining receipt records and delivery evidence for at least 7 years.
Retention
Retain receipts and evidence of delivery or access for at least 7 years and make them available on request for audit or regulatory review.
Last updated