invoice.paid
The invoice is paid. settlement tracks the release of the funds to the master wallet.
cTpeWay sends this event as an HTTP POST to every webhook endpoint subscribed to it. Verify the signature before you trust the body: see Webhooks.
Payload
Section titled “Payload”| Field | Type | Description |
|---|---|---|
id |
string | Unique event id, evt_…. Use it to deduplicate deliveries. |
type |
string | Always invoice.paid. |
api_version |
string | Always v1. |
created |
integer | Unix time in seconds. |
livemode |
boolean | false for events from the test environment. |
data |
object | |
data. |
object | |
data. |
string | |
data. |
integer | |
data. |
string | One of open, pending, underpaid, paid, expired, canceled, refunded. |
data. |
array of strings | Values: overpaid, late, underpaid_accepted, partially_refunded. |
data. |
string | One of fiat, crypto. |
data. optional |
object | |
data. |
string | |
data. |
string | A decimal number written as a string, with up to 8 decimal places. |
data. |
array of objects | |
data. |
string | |
data. |
string | |
data. |
string | |
data. |
string | |
data. optional |
string | |
data. |
integer | |
data. optional |
string | Set once the option is selected (fiat invoices). A quoted amount is rounded up to display_decimals, so the amount shown to the payer is exactly the amount that pays the invoice. A whole number written as a string of digits. |
data. optional |
integer | Present with amount_due: the decimals it is stated with. amount_due is a whole number of 10^(decimals − display_decimals) base units; equal to decimals when the amount is exact to the base unit (crypto invoices). |
data. optional |
string | Price of one unit of the asset in the invoice currency at lock time. A decimal number written as a string, with up to 8 decimal places. |
data. optional |
string (date-time) | Until when amount_due holds. Afterwards the payer takes a new quote; the invoice lives on. |
data. optional |
string | |
data. optional |
string | Solana tokens: the address’s associated token account, where the token is held. |
data. optional |
string (date-time) | |
data. |
string | Sum of confirmed payments to this option. A whole number written as a string of digits. |
data. |
string | Sum of detected, unconfirmed payments to this option. A whole number written as a string of digits. |
data. optional |
string | |
data. optional |
string | |
data. |
integer | |
data. optional |
string | |
data. optional |
string | The customer the merchant named when creating the invoice. |
data. optional |
string | |
data. optional |
map of string to string | |
data. |
string (date-time) | |
data. |
string (date-time) | |
data. |
string (date-time) | |
data. optional |
string (date-time) | |
data. optional |
string (date-time) | |
data. optional |
string (date-time) | |
data. optional |
string (date-time) | When the invoice became refunded. |
data. optional |
object | |
data. |
string | |
data. |
string | One of detected, confirmed, orphaned, dropped. |
data. optional |
string | |
data. optional |
string | |
data. optional |
string | |
data. |
string | |
data. |
string | |
data. |
string | |
data. optional |
string | |
data. |
integer | |
data. |
string | |
data. optional |
string | |
data. optional |
string | The transaction that paid. Absent while the payment is known only from a balance change (detected_by: balance) and its transaction has not been identified; payment.transaction_attached announces it. A simulated payment (test mode, simulated: true) carries its sim_… id here. |
data. optional |
integer | Position of the transfer inside the transaction. Present exactly when tx_hash is. |
data. |
string | A whole number written as a string of digits. |
data. |
integer | |
data. optional |
integer | |
data. optional |
string | |
data. optional |
string | Value at the price snapshot taken at confirmation. A decimal number written as a string, with up to 8 decimal places. |
data. |
boolean | Confirmed after the invoice had expired or been canceled. |
data. |
boolean | |
data. |
string | How the payment was found, fixed when it is first seen: poll (its transaction was seen while watching the address), hint (its transaction was reported through the checkout and found on the network), balance (the address’s balance rose; the transaction is identified later, and tx_hash is absent until then), simulated (test mode). One of poll, hint, balance, simulated. |
data. |
string (date-time) | |
data. optional |
string (date-time) | |
data. optional |
object | |
data. |
string | |
data. |
string | One of pending, held, releasing, released, failed, reverted. |
data. optional |
object | |
data. |
string | |
data. |
string | One of pending, held, releasing, released, failed, reverted. |
A field marked optional can be missing from a payload.
Example
Section titled “Example”{ "id": "string", "type": "invoice.paid", "api_version": "v1", "created": 0, "livemode": true, "data": { "object": { "id": "string", "number": 0, "status": "paid", "outcome_flags": [ "overpaid" ], "kind": "fiat", "price": { "currency": "string", "amount": "10.00" }, "options": [ { "id": "string", "network": "string", "asset": "string", "asset_id": "string", "contract": "string", "decimals": 0, "amount_due": "1000000", "display_decimals": 0, "rate": "10.00", "quote_expires_at": "2026-01-01T00:00:00.000Z", "address": "string", "token_account": "string", "selected_at": "2026-01-01T00:00:00.000Z", "amount_paid": "1000000", "amount_detected": "1000000" } ], "selected_option_id": "string", "paid_option_id": "string", "tolerance_bps": 0, "order_id": "string", "customer_email": "string", "description": "string", "metadata": {}, "expires_at": "2026-01-01T00:00:00.000Z", "pre_selection_expires_at": "2026-01-01T00:00:00.000Z", "created_at": "2026-01-01T00:00:00.000Z", "paid_at": "2026-01-01T00:00:00.000Z", "expired_at": "2026-01-01T00:00:00.000Z", "canceled_at": "2026-01-01T00:00:00.000Z", "refunded_at": "2026-01-01T00:00:00.000Z", "payment": { "id": "string", "status": "detected", "invoice_id": "string", "option_id": "string", "deposit_address_id": "string", "network": "string", "asset": "string", "asset_id": "string", "contract": "string", "decimals": 0, "address": "string", "from_address": "string", "tx_hash": "string", "tx_index": 0, "amount": "1000000", "confirmations": 0, "block_height": 0, "block_hash": "string", "usd_value": "10.00", "late": true, "simulated": true, "detected_by": "poll", "detected_at": "2026-01-01T00:00:00.000Z", "confirmed_at": "2026-01-01T00:00:00.000Z", "settlement": { "id": "string", "status": "pending" } }, "settlement": { "id": "string", "status": "pending" } } }}The values are placeholders generated from the schema. They show the shape, not real data.

