Ask for an invitation
Menu

API reference

Payouts

A payout sends funds from a merchant wallet to a saved address: kind: "payout" to someone else, kind: "withdrawal" to one of the merchant's own addresses. Like a refund, a payout can only be requested by the API and is approved in the dashboard with a passkey (Money out).

  • The destination must be a saved address with status: "active" (approved and past its 24-hour wait).
  • If destination is on another network or in another asset than source, the payout is delivered through Relay (delivery.rail: "relay"): one send from the merchant's wallet to a Relay deposit address, Relay's fee taken from the amount moved, so the merchant needs fee money only on the network it sends from.
  • Network fee: on Bitcoin, Litecoin and Dogecoin it comes out of the amount. On the EVM networks, Solana and TRON the merchant's fee account pays; if it is too low the request fails with fee_account_low, which says exactly how much of which coin is missing.
  • A wallet that has never sent (status: "address_ready") is deployed as part of the first approved payout; the same approval covers both.
  • Tier limits: Unverified, US$1,000 a day to others, single payouts only; Verified, US$100,000 a day and batches of up to 200 rows. A tier never limits a withdrawal to the merchant's own saved address.
  • The amount is reserved (balance.reserved) from request until the payout is confirmed, failed or cancelled. unknown keeps the reserve until evidence settles it (no timer ends it); never re-request a payout that is unknown.
  • A request nobody approves within 7 days lapses back to draft with pending_reason: "approval_lapsed" and its reserve is released. Send it for approval again with POST /v1/payouts/{id}/submit, or cancel it.

The payout object

JSON

{
  "id": "po_351ggq5kz6kxwpfrhp5qh3b0",
  "object": "payout",
  "livemode": true,
  "created": "2026-10-12T09:30:00.000Z",
  "updated": "2026-10-12T09:30:00.000Z",
  "kind": "payout",
  "status": "awaiting_approval",
  "pending_reason": null,
  "batch": null,
  "source": {
    "wallet": "wal_bsfw07hymawmda7gg8jsyy3g",
    "asset": "base:usdc",
    "amount": "250.000000"
  },
  "destination": {
    "saved_address": "dst_92jw0br3z1bzkk45ddjqcm6q",
    "address": "0xD1220A0cf47c7B9Be7A2E6BA89F429762e7b9aDb",
    "network": "base",
    "asset": "base:usdc"
  },
  "delivery": {
    "rail": "direct",
    "amount_estimated": "250.000000",
    "route_fee": null,
    "fee_bearer": null
  },
  "value": {
    "amount": "250.00",
    "currency": "USD"
  },
  "description": "October green beans",
  "reference": "PO-2210",
  "network_fee": null,
  "requested_by": {
    "type": "api_key",
    "id": "key_6e3gg2c6ea176xxdek2nar6v"
  },
  "approved_by": null,
  "approval_url": "https://merchant.orrerie.com/approve/po_351ggq5kz6kxwpfrhp5qh3b0",
  "approval_expires_at": "2026-10-19T09:30:00.000Z",
  "transaction_hash": null,
  "failure_code": null,
  "cancellation_reason": null,
  "approved_at": null,
  "sent_at": null,
  "confirmed_at": null,
  "metadata": {
    "supplier_id": "s_19"
  }
}
Table: The payout object
FieldMeaning
pending_reasonFor a draft: approval_lapsed. Otherwise null.
kindpayout: to someone else. withdrawal: to one of the merchant's own saved addresses. Values: payout, withdrawal.
approval_urlDashboard page where an Owner or Finance member approves with a passkey. The API can never approve.
statusOne of draft, awaiting_approval, signed, sent, confirmed, failed, unknown, cancelled.

The payout_batch object

JSON

{
  "id": "pob_b1xkj45rqwdaf7j2bc94pef3",
  "object": "payout_batch",
  "livemode": true,
  "created": "2026-10-12T09:40:00.000Z",
  "status": "awaiting_approval",
  "description": "October contractor payments",
  "row_count": 2,
  "total_value": {
    "amount": "1700.00",
    "currency": "USD"
  },
  "counts": {
    "draft": 0,
    "awaiting_approval": 2,
    "signed": 0,
    "sent": 0,
    "confirmed": 0,
    "failed": 0,
    "unknown": 0,
    "cancelled": 0
  },
  "payouts": [
    "po_crs9tp390f2yjremph9m0npb",
    "po_kyrcy0h8t43wvedbxe5v40bp"
  ],
  "requested_by": {
    "type": "api_key",
    "id": "key_6e3gg2c6ea176xxdek2nar6v"
  },
  "approved_by": null,
  "approval_url": "https://merchant.orrerie.com/approve/pob_b1xkj45rqwdaf7j2bc94pef3",
  "approval_expires_at": "2026-10-19T09:40:00.000Z",
  "approved_at": null,
  "completed_at": null,
  "cancellation_reason": null,
  "metadata": {}
}
Table: The payout_batch object
FieldMeaning
statusOne of draft, awaiting_approval, processing, completed, completed_with_failures, needs_attention, cancelled.

Every field

Fields of the payout object

Fields of the payout object
FieldTypeMeaning
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.
kindstringpayout: to someone else. withdrawal: to one of the merchant's own saved addresses. split_leg: a share of a paid order under a split rule (the API referencea). One of payout, withdrawal, split_leg.
statusstringOne of draft, awaiting_approval, signed, sent, confirmed, failed, unknown, cancelled.
pending_reasonstring or nullFor a draft: approval_lapsed. Otherwise null.
batchobjectThe pob_ id of the batch the payout belongs to, or the batch object when expanded; null for a single payout.
split_rulestring or nullThe split rule a split_leg pays a share for; null for any other payout.
orderstring or nullThe paid order a split_leg shares; null for any other payout.
sourceobjectThe merchant wallet the money leaves from.
source.walletstringThe wal_ id of that wallet.
source.assetstringThe asset that leaves it.
source.amountstringWhat leaves it, in the asset's own units.
destinationobjectWhere the money goes: always a saved address.
destination.saved_addressobjectThe dst_ id of the saved address, or the object when expanded.
destination.addressstringThe address the money is sent to.
destination.networkstringThe network of the address.
destination.assetstringThe asset the destination receives.
deliveryobjectHow the money reaches the destination.
delivery.railstringdirect: one send to the address. relay: through Relay, into another asset or network.
delivery.amount_estimatedstringAbout what the destination receives, in the destination asset.
delivery.route_feeobject or nullRelay's fee for the delivery, in US dollars; null on the direct rail.
delivery.fee_bearerstring or nullWho pays the routing fee: recipient (taken from the amount) or merchant; null on the direct rail.
valueobjectThe payout's value in US dollars when it was requested.
value.amountstringThe value, a decimal string.
value.currencystringAlways USD.
descriptionstring or nullThe merchant's description of the payout; null for none.
referencestring or nullThe merchant's own reference, for example an invoice number; null for none.
network_feeobject or nullThe network fee of the send and who pays it; null until it is known.
requested_byobjectWho asked for it: an API key or a dashboard member.
requested_by.typestringapi_key or member.
requested_by.idstringThe id of the key (key_…) or the member (mem_…) that asked.
approved_bystring or nullThe member who approved it with a passkey; null until approved.
approval_urlstring or nullDashboard page where an Owner or Finance member approves with a passkey. The API can never approve.
approval_expires_atstring (date-time)When an unapproved request lapses to draft.
transaction_hashstring or nullThe hash of the transaction that sent it; null until it is sent.
failure_codestring or nullWhy it failed (Money out lists the codes); null unless status is failed or unknown.
cancellation_reasonstring or nullWhy it was cancelled (for example cancelled_by_api or rejected_by_approver); null unless cancelled.
approved_atstring or nullWhen it was approved; null until then.
sent_atstring or nullWhen the transaction was broadcast; null until then.
confirmed_atstring or nullWhen the network's confirmation count was reached; null until then.
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 payout_batch object

Fields of the payout_batch object
FieldTypeMeaning
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.
statusstringOne of draft, awaiting_approval, processing, completed, completed_with_failures, needs_attention, cancelled.
descriptionstring or nullThe merchant's description of the batch; null for none.
row_countintegerHow many payouts the batch holds.
total_valueobjectThe batch's total value in US dollars when it was requested.
total_value.amountstringThe total, a decimal string.
total_value.currencystringAlways USD.
countsobjectHow many of the batch's payouts are in each state.
counts.draftintegerPayouts in draft.
counts.awaiting_approvalintegerPayouts waiting for approval.
counts.signedintegerPayouts signed and not yet sent.
counts.sentintegerPayouts sent and not yet confirmed.
counts.confirmedintegerPayouts confirmed.
counts.failedintegerPayouts that failed.
counts.unknownintegerPayouts whose outcome is not known yet.
counts.cancelledintegerPayouts cancelled.
payoutsarray of stringsThe po_ ids of the batch's payouts, in row order.
requested_byobjectWho asked for it: an API key or a dashboard member.
requested_by.typestringapi_key or member.
requested_by.idstringThe id of the key (key_…) or the member (mem_…) that asked.
approved_bystring or nullThe member who approved the batch with a passkey; null until approved.
approval_urlstring or nullThe dashboard page where the batch is approved with one passkey; null once it is approved, cancelled or lapsed.
approval_expires_atstring (date-time)When an unapproved batch lapses to draft.
approved_atstring or nullWhen the batch was approved; null until then.
completed_atstring or nullWhen every payout of the batch ended; null until then.
cancellation_reasonstring or nullWhy the batch 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.

Endpoints

Events

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