Orqpay

Invoice lifecycle

Statuses, timers, and what each signal means for fulfillment.

Create an invoice with POST /v1/invoices. The customer pays on hosted checkout (checkoutUrl). Track progress with webhooks (preferred) or status polling.

Happy path

CREATED → CONFIRMING → PAID → SETTLED
  1. You create the invoice → customer opens checkout and chooses network/token
  2. Payment detected → CONFIRMING / invoice.payment_detected
  3. Payment confirmed within the checkout window → PAID / invoice.paid (fulfill here)
  4. Settlement finishes → SETTLED / invoice.settled (accounting)

Statuses

StatusMeaning
CREATEDWaiting for payment
CONFIRMINGPayment seen; waiting for confirmation
PAIDPaid on time — safe to fulfill
UNDERPAIDPartial payment; top-up window open
EXPIRED_UNDERPAIDTop-up window ended still short
LATE_PAIDPaid after checkout expired — funds accepted, not standard fulfillment
OVERPAIDAmount above required — contact support if needed
SETTLEDSettlement complete — accounting confirmation
EXPIREDNo payment before checkout expired

Timers

TimerDurationStarts
Checkout window1 hourInvoice creation
Underpaid top-up30 minutesFirst partial payment

Payment that confirms after the 1h window becomes LATE_PAID, not PAID.

What to fulfill on

SignalFulfill goods?
invoice.paid / PAIDYes
invoice.late_paid / LATE_PAIDNo (unless you explicitly choose to)
invoice.settled / SETTLEDAccounting only
invoice.underpaidWait for top-up
invoice.expired / invoice.expired_underpaidClose the order

Polling (optional)

Prefer webhooks. If you must poll:

curl http://api.localhost:4000/v1/invoices/<id>/status \
  -H "Authorization: Bearer test_..."

Returns status, amount, amountReceived, and expiresAt.

Full detail: Get invoice.

Amounts and checkout

  • Amounts are decimal strings in major units (up to 6 decimal places). "10.50" = 10.50 USDC/USDT.
  • Customers choose network/token at checkout unless you lock them with networkId and/or token on create.
  • Prefer sending customers to checkoutUrl. If you show deposit addresses yourself, show the network name and only the listed tokens for that address.

Important

Do not fulfill on invoice.payment_detected alone. Wait for invoice.paid. If a payment is later invalidated, you receive invoice.payment_invalidated — reconcile carefully.

On this page