Ask for an invitation
Menu

API reference

Orders

The order is the single payable object: every invoice, every use of a payment link, every point-of-sale charge and every subscription period creates exactly one order. You can also create orders directly and build your own payment page with the instruction endpoints below (you then show the address and QR code yourself).

The states, in the order an object moves through them. Where a step lists several, the object takes one of them.

  1. openNothing seen
  2. processingA payment has been seen
  3. paid or underpaid or overpaid or expired or cancelled

refunded and partially_refunded are boolean flags on a paid order. An order becomes paid only when the merchant wallet's own chain read shows the delivery with the amount; a provider's word never does it. Credit within 0.5% below the price, or within 0.5% (at least US$0.05) above it, counts as paid. Three transitions surprise integrators: an expired or cancelled order goes back to processing if money arrives for it within the 30-day late window (an address cannot be recalled, so money is never ignored); a paid order can become overpaid by a duplicate payment; and a paid order can fall back if a payment is undone by the chain (order.payment_reverted, order.unpaid).

The order object

JSON

{
  "id": "ord_0zymngngvf12b8b2cra7tb8e",
  "object": "order",
  "livemode": true,
  "created": "2026-10-11T14:03:22.418Z",
  "updated": "2026-10-11T14:09:55.764Z",
  "status": "paid",
  "source": "checkout",
  "amount": "21.99",
  "currency": "USD",
  "value": {
    "amount": "21.99",
    "currency": "USD"
  },
  "fx": null,
  "description": "Order #1042",
  "reference": "1042",
  "customer": "cus_8ea07c40qsvv19f7rgmeb8ha",
  "customer_email": "jane@example.com",
  "line_items": [
    {
      "name": "Ethiopia Yirgacheffe, 1 kg",
      "quantity": 1,
      "unit_amount": "21.99",
      "amount": "21.99",
      "price": "price_mbk5s5r45kwheaq89dbmk2gz"
    }
  ],
  "settlement": {
    "mode": "convert",
    "asset": "base:usdc",
    "amount_expected": "21.990000",
    "amount_received": "21.990000",
    "wallet": "wal_bsfw07hymawmda7gg8jsyy3g"
  },
  "fee_bearer": "payer",
  "amount_paid": "21.99",
  "amount_due": "0.00",
  "amount_refunded": "0.00",
  "paid_late": false,
  "accepted_short": false,
  "refunded": false,
  "partially_refunded": false,
  "finalized": true,
  "has_unconfirmed": false,
  "screening_hold": false,
  "screening": {
    "status": "clear"
  },
  "provider_refund_received": false,
  "overpayment": null,
  "rails_allowed": [
    "orrerie_app",
    "relay",
    "direct"
  ],
  "accept": [],
  "app_pay_allowed": true,
  "active_instruction": null,
  "instructions": [
    "pin_h73hkjr8dyp4zymaet5e2gbv"
  ],
  "payments": [
    "pay_2pe50hae6w2jk4sp1rcq5pae"
  ],
  "checkout_session": "cs_z7ek5wj68fyz80j7bz1eq4e0",
  "payment_link": null,
  "invoice": null,
  "subscription": null,
  "pos_device": null,
  "receipt": "rcpt_ppaxx20nbqv0kqgkwcxcc5xh",
  "expires_at": "2026-10-11T15:03:22.418Z",
  "paid_at": "2026-10-11T14:09:55.764Z",
  "cancelled_at": null,
  "metadata": {
    "cart_id": "c_7781"
  }
}
Table: The order object
FieldMeaning
statusThe order state. paid and overpaid mean the full amount arrived with the confirmations its network needs, which is when you fulfil; a payment undone on its chain can still take the order back (order.unpaid), and finalized says when the network can no longer undo it; underpaid can still become paid by a top-up; refunds are flags, not states. Values: open, processing, paid, underpaid, overpaid, expired, cancelled.
sourceWhat created the order. Values: api, checkout, payment_link, invoice, pos, subscription.
amountThe price, a decimal string in the pricing currency.
currencyThe pricing currency: an upper-case ISO 4217 code (USD) or an asset id (bitcoin:btc).
valueThe order's US-dollar value when it was created. Tier limits are measured on this figure.
fxnull for USD and crypto pricing. For another fiat currency: {rate, as_of}, the daily reference rate frozen on the order at creation.
referenceYour own order number. Up to 200 characters. Shown on the receipt.
settlementWhat the merchant wallet is expected to receive and what it did receive, proved by the wallet's own chain read.
fee_bearerWho pays the route fee on the relay rail. payer: the payer's amount includes it and the merchant receives the price to the unit. merchant: the payer pays the list price and the order is paid when at least 98% arrives. Values: payer, merchant.
amount_paidValue credited to the order so far, in the pricing currency.
amount_dueWhat is still missing, in the pricing currency. 0.00 when paid.
paid_latetrue when the payment that completed the order arrived after its instruction expired.
accepted_shorttrue when the merchant accepted a short payment as full.
finalizedfalse while a high-value order is paid at the confirmation count but its payments are not yet final on the network (Ethereum and the rollups above US$10,000); order.finalized follows. true otherwise.
has_unconfirmedThe engine's flag behind finalized: a credited payment is confirmed but below the higher bar.
screening_holdA payer address was flagged by screening.
provider_refund_receivedRelay returned a deposit for this order to the merchant's own wallet on the payer's network; the payer is usually owed a refund.
acceptAsset ids (and orrerie_app) this order accepts. Empty: everything the merchant has switched on.
overpaymentnull, or {amount, asset, resolution} where resolution is null, refunded or kept_as_credit.
rails_allowedRails the payer may use for this order.
app_pay_allowedWhether the checkout shows the Pay with Orrerie button. Set by a merchant-level rule only Orrerie can change.
active_instructionThe one live payment instruction, or null.
expires_atWhen an unpaid order stops accepting new instructions.

The payment_option object

JSON

{
  "object": "payment_option",
  "asset": "ethereum:usdc",
  "network": "ethereum",
  "symbol": "USDC",
  "rail": "relay",
  "amount_mode": "exact",
  "available": true,
  "unavailable_reason": null,
  "estimated_pay_amount": "22.410000",
  "estimated_route_fee": {
    "amount": "0.42",
    "currency": "USD",
    "bearer": "payer"
  },
  "confirmations_required": 12,
  "estimated_seconds": 180
}

The payment_instruction object

JSON

{
  "id": "pin_h73hkjr8dyp4zymaet5e2gbv",
  "object": "payment_instruction",
  "livemode": true,
  "created": "2026-10-11T14:04:10.902Z",
  "order": "ord_0zymngngvf12b8b2cra7tb8e",
  "status": "waiting",
  "rail": "relay",
  "rail_reason": "default",
  "provider": "relay",
  "provider_request_id": "0x6b1f3c0e9a2d47f58c1b0e7d2a9f4c3b5e8d1a0f7c6b9e2d4a3f1c0b8e7d6a5f",
  "recipient_kind": "wallet",
  "recipient": "0x5aAeb6053F3E94C9b9A09f33669435E7Ef1BeAed",
  "refund_to": "0x5aAeb6053F3E94C9b9A09f33669435E7Ef1BeAed",
  "refund_wallet_protected": true,
  "pay_asset": "ethereum:usdc",
  "pay_amount": "22.410000",
  "amount_mode": "exact",
  "address": {
    "id": "addr_x76q8chyjk6j34he4jrcbb7v",
    "address": "0xfB6916095ca1df60bB79Ce92cE3Ea74c37c5d359",
    "network": "ethereum",
    "owner": "provider",
    "solana_pay_reference": null,
    "derivation": null
  },
  "payment_uri": "ethereum:0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48@1/transfer?address=0xfB6916095ca1df60bB79Ce92cE3Ea74c37c5d359&uint256=22410000",
  "quote": {
    "id": "qt_0fymhdf3w7nem8m9f6rfjtgw",
    "price_amount": "21.99",
    "price_currency": "USD",
    "rate": "1.000200",
    "route_fee": {
      "amount": "0.42",
      "currency": "USD",
      "bearer": "payer"
    },
    "created": "2026-10-11T14:04:10.902Z",
    "expires_at": "2026-10-11T14:19:10.902Z"
  },
  "settle_asset": "base:usdc",
  "settle_amount_expected": "21.990000",
  "confirmations_required": 12,
  "in_transit_notice": "While a payment is being routed it is held by Relay, a separate company. Orrerie never holds it.",
  "wrong_asset_warning": "Send only USDC on Ethereum to this address. Anything else may be lost.",
  "expires_at": "2026-10-11T14:19:10.902Z",
  "late_until": "2026-11-10T14:19:10.902Z",
  "failure_code": null,
  "test_simulation_url": null
}
Table: The payment_instruction object
FieldMeaning
statuswaiting: nothing seen. detected: the payer's transfer was seen. delivered: the value reached the merchant wallet. refunded_by_provider: the provider returned the deposit. failed. expired: the 15-minute window passed with nothing seen. Values: waiting, detected, delivered, refunded_by_provider, failed, expired.
railThe way this order's money travels. Never changes after creation. Values: orrerie_app, relay, direct.
rail_reasonWhy that rail (the states every object uses).
recipient, refund_to, recipient_kind, provider_request_id, refund_wallet_protectedWhere the routing provider was told to deliver and to refund, signed by the merchant's own worker before the provider was called (the states every object uses). A merchant's server should compare recipient with its wallet address from GET /v1/wallets.
amount_modeexact: the address accepts exactly pay_amount. open: any amount is re-priced on arrival. Values: exact, open.
addressThe deposit address. owner is provider (a Relay address unique to this order) or merchant (the merchant wallet's own address or script). null on the orrerie_app rail and in test mode.
payment_uriThe string encoded in the QR code.
late_untilA payment arriving before this time is still credited to the order as a late payment.
test_simulation_urlTest mode only: the page that simulates a payment. Test mode never shows a real address.

Every field

Fields of the order object

Fields of the order object
FieldTypeMeaning
screeningobjectThe sanctions screening of the paying address or addresses.
screening.statusstringOne of pending, clear, review, blocked, unchecked, reviewed.
tipstringPoint-of-sale tip inside amount, as a decimal string. 0.00 otherwise.
idstringUnique identifier: the object prefix, an underscore, 24 lower-case Crockford base32 characters.
objectstringThe type of this object.
livemodebooleantrue for live mode (real money); false for test mode (simulated payments).
createdstring (date-time)When the object was created. RFC 3339, UTC, milliseconds.
updatedstring (date-time)When the object last changed.
statusstringThe order state. paid and overpaid mean the full amount arrived with the confirmations its network needs, which is when you fulfil; a payment undone on its chain can still take the order back (order.unpaid), and finalized says when the network can no longer undo it; underpaid can still become paid by a top-up; refunds are flags, not states. One of open, processing, paid, underpaid, overpaid, expired, cancelled.
sourcestringWhat created the order. One of api, checkout, payment_link, invoice, pos, subscription.
amountstringThe price, a decimal string in the pricing currency.
currencystringThe pricing currency: an upper-case ISO 4217 code (USD) or an asset id (bitcoin:btc).
valueobjectThe order's US-dollar value when it was created. Tier limits are measured on this figure.
value.amountstringThe order's value in US dollars when it was created, a decimal string.
value.currencystringAlways USD.
fxobject or nullnull for USD and crypto pricing. For another fiat currency: {rate, as_of}, the daily reference rate frozen on the order at creation.
descriptionstring or nullShown to the payer above the amount; null for none.
referencestring or nullYour own order number. Up to 200 characters. Shown on the receipt.
customerobjectThe cus_ id of the order's customer, or the customer object when expanded; null for none.
customer_emailstring or nullThe email given for the order, kept encrypted; null when none was given. No receipt is emailed in this release.
line_itemsarray of objectsWhat the order is for, when it was priced from items; empty when it was priced from an amount.
line_items[].namestringThe item's name, as shown to the payer.
line_items[].quantityintegerHow many of the item.
line_items[].unit_amountstringThe price of one, a decimal string in the order's currency.
line_items[].amountstringThe line's total: quantity times the unit amount.
line_items[].pricestring or nullThe price_ id the line was made from; null for a line given by name and amount.
settlementobjectWhat the merchant wallet is expected to receive and what it did receive, proved by the wallet's own chain read.
settlement.modestringconvert: the payment is delivered in the settlement asset. keep: it stays in the asset it was paid in.
settlement.assetstring or nullThe asset the merchant wallet receives; null while mode is keep and nothing was paid.
settlement.amount_expectedstring or nullWhat the merchant wallet should receive, in the settlement asset; null while not yet known.
settlement.amount_receivedstring or nullWhat the merchant wallet received, proved by its own chain read; null until something arrives.
settlement.walletstring or nullThe wal_ id of the merchant wallet that receives the money; null while not yet known.
settlement.recipient_kindstringwallet: the merchant's wallet. fee_account: a fee-account top-up. One of wallet, fee_account.
fee_bearerstringWho pays the route fee on the relay rail. payer: the payer's amount includes it and the merchant receives the price to the unit. merchant: the payer pays the list price and the order is paid when at least 98% arrives. One of payer, merchant.
amount_paidstringValue credited to the order so far, in the pricing currency.
amount_duestringWhat is still missing, in the pricing currency. 0.00 when paid.
amount_refundedstringWhat was refunded so far, in the pricing currency.
paid_latebooleantrue when the payment that completed the order arrived after its instruction expired.
accepted_shortbooleantrue when the merchant accepted a short payment as full.
refundedbooleantrue when everything paid has been refunded.
partially_refundedbooleantrue when some, not all, of what was paid has been refunded.
finalizedbooleanfalse while a high-value order is paid at the confirmation count but its payments are not yet final on the network (Ethereum and the rollups above US$10,000); order.finalized follows. true otherwise.
has_unconfirmedbooleanThe engine's flag behind finalized: a credited payment is confirmed but below the higher bar.
screening_holdbooleanA payer address was flagged by screening.
provider_refund_receivedbooleanRelay returned a deposit for this order to the merchant's own wallet on the payer's network; the payer is usually owed a refund.
overpaymentobject or nullnull, or {amount, asset, resolution} where resolution is null, refunded or kept_as_credit.
rails_allowedarray of stringsRails the payer may use for this order.
acceptarray of stringsAsset ids (and orrerie_app) this order accepts. Empty: everything the merchant has switched on.
app_pay_allowedbooleanWhether the checkout shows the Pay with Orrerie button. Set by a merchant-level rule only Orrerie can change.
active_instructionstring or nullThe one live payment instruction, or null.
instructionsarray of objectsThe order's payment instructions, oldest first: their ids, or the objects when expanded.
paymentsarray of objectsThe payments credited to the order, oldest first: their ids, or the objects when expanded.
checkout_sessionobjectThe checkout session the order was made with, or the object when expanded; null for none.
payment_linkobjectThe payment link that made the order, or the object when expanded; null for none.
invoiceobjectThe invoice the order pays, or the object when expanded; null for none.
subscriptionobjectThe subscription whose period the order is, or the object when expanded; null for none.
pos_devicestring or nullThe pos_ id of the till that took the order; null for any other order.
receiptobjectThe order's receipt, or the object when expanded; null until the order is paid.
expires_atstring (date-time)When an unpaid order stops accepting new instructions.
paid_atstring (date-time) or nullWhen the order became paid; null until then.
cancelled_atstring or nullWhen the order was cancelled; null unless it was.
metadataobjectUp to 50 keys of your own data. Key up to 40 characters, value a string up to 500 characters. Never used by Orrerie; never put secrets or personal data here.

Fields of the payment_option object

Fields of the payment_option object
FieldTypeMeaning
objectstringThe type of this object.
assetstringThe asset id the payer may pay with.
networkstringThe network the asset is on.
symbolstringThe asset's symbol, as payers know it.
railstringHow this asset would be paid: orrerie_app, relay or direct.
amount_modestringexact: the address takes exactly the amount shown. open: any amount is priced on arrival.
availablebooleantrue when the payer can pick this asset now.
unavailable_reasonstring or nullWhy the asset cannot be picked now; null while it is available.
estimated_pay_amountstring or nullAbout what the payer would send, in the asset; null when no figure can be given.
estimated_route_feeobject or nullAbout what routing would cost, in US dollars; null on the direct rail or when not known.
estimated_route_fee.amountstringThe fee, a decimal string.
estimated_route_fee.currencystringAlways USD.
estimated_route_fee.bearerstringWho pays it: payer or merchant.
confirmations_requiredintegerHow many confirmations a payment in this asset needs before it counts.
estimated_secondsinteger or nullAbout how long the payment takes to arrive, in seconds; null when not known.

Fields of the payment_instruction object

Fields of the payment_instruction object
FieldTypeMeaning
rail_reasonstringWhy this rail was used. One of payer_chose_app, merchant_direct_only, relay_no_route, below_relay_minimum, same_asset_utxo, default, payer_chose_after_relay_refusal, provider_refund_counted.
recipient_kindstringwallet: the merchant's wallet. fee_account: a fee-account top-up. One of wallet, fee_account.
recipientstring or nullThe address the routing provider was told to deliver to, signed by the merchant's own worker before the provider was called. null on the direct rail.
refund_tostring or nullThe address the routing provider was told to refund to: the merchant's wallet on the payer's network.
refund_wallet_protectedbooleanfalse when refund_to is an un-activated Solana or TRON wallet.
provider_request_idstring or nullThe routing provider's request id, so the request can be looked up there.
idstringUnique identifier: the object prefix, an underscore, 24 lower-case Crockford base32 characters.
objectstringThe type of this object.
livemodebooleantrue for live mode (real money); false for test mode (simulated payments).
createdstring (date-time)When the object was created. RFC 3339, UTC, milliseconds.
orderstringThe ord_ id of the order the instruction pays.
statusstringwaiting: nothing seen. detected: the payer's transfer was seen. delivered: the value reached the merchant wallet. refunded_by_provider: the provider returned the deposit. failed. expired: the 15-minute window passed with nothing seen. One of waiting, detected, delivered, refunded_by_provider, failed, expired.
railstringThe way this order's money travels. Never changes after creation. One of orrerie_app, relay, direct.
providerstring or nullWho routes the payment: relay on the relay rail; null on the others.
pay_assetstringThe asset the payer sends.
pay_amountstringExactly what the payer sends, in the asset's own units.
amount_modestringexact: the address accepts exactly pay_amount. open: any amount is re-priced on arrival. One of exact, open.
addressobject or nullThe deposit address. owner is provider (a Relay address unique to this order) or merchant (the merchant wallet's own address or script). null on the orrerie_app rail and in test mode.
address.idstringThe addr_ id of the deposit address.
address.addressstringThe address the payer sends to.
address.networkstringThe network of the address.
address.ownerstringprovider: a Relay address unique to this order. merchant: the merchant wallet's own address or script.
address.solana_pay_referencestring or nullThe Solana Pay reference key that ties a payment to this order; null on other networks.
address.derivationobject or nullA fresh per-order two-of-three script on Bitcoin, Litecoin or Dogecoin (direct rail): the child index of the three account keys and the script form, so your own server can derive the address again from the three xpubs of your recovery kit and check it. null on every other address.
payment_uristring or nullThe string encoded in the QR code.
quoteobjectThe price the instruction was made at.
quote.idstringThe qt_ id of the quote.
quote.price_amountstringThe order's amount the quote covers, in the pricing currency.
quote.price_currencystringThe order's pricing currency.
quote.ratestringThe asset's price in the pricing currency the quote used.
quote.route_feeobjectThe routing fee inside the quote, in US dollars, and who pays it.
quote.createdstring (date-time)When the quote was made.
quote.expires_atstring (date-time)When the quote stops being honoured.
settle_assetstringThe asset the merchant wallet receives.
settle_amount_expectedstringWhat the merchant wallet should receive, in the settlement asset.
confirmations_requiredintegerHow many confirmations the payment needs before it counts.
in_transit_noticestring or nullThe sentence the payer is shown while a routed payment is on its way; null on the direct rail.
wrong_asset_warningstring or nullThe warning shown beside the address; null when there is none.
expires_atstring (date-time)When the address stops being shown for new payments.
late_untilstring (date-time)A payment arriving before this time is still credited to the order as a late payment.
failure_codestring or nullWhy the instruction failed; null unless status is failed.
test_simulation_urlstring or nullTest mode only: the page that simulates a payment. Test mode never shows a real address.

Endpoints

Events

Webhook events whose data.object is an object of this page.