Create a payment order
Declare a payment order — "send X of asset Y to address Z on chain C." fromUserId must be the system user id returned by the user endpoints, not the user label. TBMC validates the recipient wallet, sender KYB status, and amount, then returns the funding wallet for the inbound asset/chain. Once the inbound transfer lands on-chain, the order moves through its lifecycle (FUNDED → LOCKED → … → DISTRIBUTED) and TBMC delivers the requested outbound asset at par. Pricing is a fixed fee — not slippage.
Both settlement modes take the same request body: omit mode or pass "standard" to settle in the next netting window, or pass mode: "instant" with the quoteId from POST /quotes to settle instantly. Instant payments require the Instant Payment capability on your account. An Instant order returns a deposit address for every asset your account supports, or 503 if any of them is momentarily unavailable — the payout destination accepts exactly the assets listed, so a partial set would refuse a later deposit. Retry on 503.
To create the order under one of your subaccounts, pass subaccountId. An Instant order takes its account from the quote it cites, so pass subaccountId to POST /quotes instead — sending one here is rejected with a 400 rather than ignored.
Body
- Type: stringassetrequired
See https://docs.bettermoney.com/asset-support for supported values.
- Type: stringfrom
User Id requiredSystem user id returned by the user endpoints. Do not pass the user label.
- Type: stringto
Address required - Type: stringto
Chain requiredSee https://docs.bettermoney.com/asset-support for supported values.
- Type: numberamount
Usd greater than:0multiple of:0.0001deprecatedDeprecated: the amount as a JSON number, accepted only with
feeCollection: "invoiced", where the deposit and the payout are the same. SendfundingAmountUsdorpayoutAmountUsdinstead. - beneficiary
Required when collection is enabled, the funding amount is $3,000 or more, and the sender and recipient are different users. Omit for exempt payments. See https://docs.bettermoney.com/travel-rule.
Required when collection is enabled, the funding amount is $3,000 or more, and the sender and recipient are different users. Omit for exempt payments. See https://docs.bettermoney.com/travel-rule.
- dateType: stringFormat: date
Of Birth requiredIndividual beneficiary’s date of birth, YYYY-MM-DD. Must not be in the future.
- familyType: string
Name min length:1max length:200requiredIndividual beneficiary’s family name.
- givenType: string
Name min length:1max length:200requiredIndividual beneficiary’s given name.
- isType: boolean
Self Hosted requiredWhether the beneficiary controls the destination wallet without a wallet provider.
- locationType: objectrequiredProperties: 2
Individual beneficiary’s country and subdivision of residence.
- typeenumconst:individualrequired
- legalType: string
Entity Identifier max length:512Legal entity identifier (LEI) of the wallet provider, not the beneficiary. Required for hosted wallets; omit or pass an empty string for self-hosted wallets. Find it with GET /travel-rule/vasps.
- Type: stringFormat: date-timeexpires
At When the order stops accepting funds. Required for
standard, not accepted forinstant— an Instant order gets a server-set funding window. - Type: "invoiced" or "deducted"enumfee
Collection How TBMC’s fee is collected.
invoiced(the default) bills it on the monthly invoice and the recipient receives the full amount.deductedtakes it out of the payment: the recipient receives the funding amount minus the fee. - Type: stringfunding
Amount Usd What you will deposit, as a USD decimal string with up to 4 places. Under
deductedthe recipient receives this minus the fee. - Type: stringidempotency
Key min length:1max length:255 - Type: stringmemo
- Type: "standard" or "instant"enummode
Settlement mode. Omit — or pass
standard— to settle in the next netting window.
Responses
- application/json
- application/json
- application/json
- application/json
- application/json
- application/json
- application/json
- application/json
- application/json
curl https://api.bettermoney.com/api/v1/payment \
--request POST \
--header 'Content-Type: application/json' \
--data '{
"fromUserId": "9f8c1b7e-5d3a-4c21-9a6f-1e2d3c4b5a60",
"toAddress": "0x742d35Cc6634C0532925a3b844Bc454e4438f44e",
"toChain": "ethereum",
"asset": "USDC",
"amountUsd": 250,
"memo": "invoice 1042",
"expiresAt": "2026-08-01T00:00:00Z"
}'
{
"paymentOrderId": "string",
"paymentOrder": {
"returnDetailsReason": "RETURN_DETAILS_MISSING",
"id": "string",
"rulesetId": "123e4567-e89b-12d3-a456-426614174000",
"mode": "standard",
"senderAccountId": "123e4567-e89b-12d3-a456-426614174000",
"fromUserId": null,
"status": "AWAITING_FUNDS",
"version": -9007199254740991,
"asset": "string",
"toChain": "string",
"toAddress": "string",
"fundingAmountUsd": "string",
"payoutAmountUsd": "string",
"feeUsd": "string",
"feeBps": 0,
"feeCollection": "invoiced",
"memo": null,
"idempotencyKey": "string",
"payoutDestinationId": "123e4567-e89b-12d3-a456-426614174000",
"instantFeeBps": 0,
"quoteId": "string",
"quoteFeeBps": 0,
"estimatedSettlementAt": "2026-10-22T14:42:28.555Z",
"createdAt": "2026-10-22T14:42:28.555Z",
"expiresAt": "2026-10-22T14:42:28.555Z",
"receivedTotal": 0,
"inboundTransfers": [
{
"returnBlockReason": "RETURN_DETAILS_MISSING",
"sender": "string",
"amountUsd": 0,
"chain": "string",
"asset": "string",
"transactionHash": "string",
"observedAt": "2026-10-22T14:42:28.555Z",
"status": "PENDING_VERIFICATION",
"version": -9007199254740991,
"refundReference": "string",
"refundTransactionHash": "string"
}
],
"canceledAt": "2026-10-22T14:42:28.555Z",
"cancelReason": "string",
"cancelRequestedAt": "2026-10-22T14:42:28.555Z",
"refundReason": "string",
"refundedAt": "2026-10-22T14:42:28.555Z",
"refundTransactionHash": "string",
"distributionReference": "string",
"settlementReference": "string",
"distributionTransactionHash": "string",
"distributionExecutedAt": "2026-10-22T14:42:28.555Z",
"settledAt": "2026-10-22T14:42:28.555Z",
"underfundToleranceUsd": 1
},
"depositAddresses": [
{
"chain": "string",
"symbol": "string",
"address": "string"
}
]
}