curl --request POST \
--url https://api.sand.etherfuse.com/organization/{organizationId}/order \
--header 'Authorization: <api-key>' \
--header 'Content-Type: application/json' \
--data '
{
"quoteId": "5e6f7a8b-9c0d-4e1f-8a2b-3c4d5e6f7a8b",
"memo": "Invoice 1042"
}
'const options = {
method: 'POST',
headers: {Authorization: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({quoteId: '5e6f7a8b-9c0d-4e1f-8a2b-3c4d5e6f7a8b', memo: 'Invoice 1042'})
};
fetch('https://api.sand.etherfuse.com/organization/{organizationId}/order', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.sand.etherfuse.com/organization/{organizationId}/order"
payload = {
"quoteId": "5e6f7a8b-9c0d-4e1f-8a2b-3c4d5e6f7a8b",
"memo": "Invoice 1042"
}
headers = {
"Authorization": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"id": "5e6f7a8b-9c0d-4e1f-8a2b-3c4d5e6f7a8b",
"organizationId": "7a8b9c0d-1e2f-4a3b-8c4d-5e6f7a8b9c0d",
"status": "created",
"memo": "Invoice 1042",
"source": {
"paymentAccountId": "3f9a2c1e-5b7d-4e8f-9a01-2b3c4d5e6f70",
"amount": "1000",
"asset": "MXN",
"rail": "spei",
"accountLabel": "Operating account"
},
"destination": {
"paymentAccountId": "8c1d2e3f-4a5b-4c6d-8e7f-901a2b3c4d5e",
"amount": "54.120000",
"asset": "USDC:GA5ZSEJYB37JRC5AVCIA5MOP4RHTM335X2KGX3IHOJAPP5RE34K4KZVN",
"rail": "stellar",
"accountLabel": "Treasury wallet"
},
"fees": [
{
"type": "transactionFee",
"amount": "2.50",
"asset": "MXN",
"bps": 25
}
],
"returnedDeposits": [],
"fundingInstructions": {
"rail": "spei",
"reference": "1000042",
"destination": {
"expiresAt": null,
"clabe": "646180000000000009",
"bankName": "Ejemplo Banco",
"recipientName": "Ejemplo Receptor"
},
"fundingDeadline": "2026-09-29T17:05:02Z"
},
"claimInstructions": null,
"createdAt": "2026-09-28T17:05:02.114Z",
"updatedAt": "2026-09-28T17:05:02.114Z",
"completedAt": null
}{
"id": "5e6f7a8b-9c0d-4e1f-8a2b-3c4d5e6f7a8b",
"organizationId": "7a8b9c0d-1e2f-4a3b-8c4d-5e6f7a8b9c0d",
"status": "created",
"memo": "Invoice 1042",
"source": {
"paymentAccountId": "3f9a2c1e-5b7d-4e8f-9a01-2b3c4d5e6f70",
"amount": "1000",
"asset": "MXN",
"rail": "spei",
"accountLabel": "Operating account"
},
"destination": {
"paymentAccountId": "8c1d2e3f-4a5b-4c6d-8e7f-901a2b3c4d5e",
"amount": "54.120000",
"asset": "USDC:GA5ZSEJYB37JRC5AVCIA5MOP4RHTM335X2KGX3IHOJAPP5RE34K4KZVN",
"rail": "stellar",
"accountLabel": "Treasury wallet"
},
"fees": [
{
"type": "transactionFee",
"amount": "2.50",
"asset": "MXN",
"bps": 25
}
],
"returnedDeposits": [],
"fundingInstructions": {
"rail": "spei",
"reference": "1000042",
"destination": {
"expiresAt": null,
"clabe": "646180000000000009",
"bankName": "Ejemplo Banco",
"recipientName": "Ejemplo Receptor"
},
"fundingDeadline": "2026-09-29T17:05:02Z"
},
"claimInstructions": null,
"createdAt": "2026-09-28T17:05:02.114Z",
"updatedAt": "2026-09-28T17:05:02.114Z",
"completedAt": null
}{
"type": "https://docs.etherfuse.com/ramp/v2/errors/quote-expired",
"title": "Quote expired",
"status": 400,
"detail": "quote 5e6f7a8b-9c0d-4e1f-8a2b-3c4d5e6f7a8b has expired or does not exist",
"instance": "tag:etherfuse.com,2026-08-28:R2-10120/0b1c2d3e-4f50-4a6b-8c7d-9e0f1a2b3c4d",
"errors": [
{
"pointer": "#/accountDetails/clabe",
"detail": "This field is required."
}
],
"required": [
"<string>"
],
"missing": [
"<string>"
]
}{
"type": "https://docs.etherfuse.com/ramp/v2/errors/quote-expired",
"title": "Quote expired",
"status": 400,
"detail": "quote 5e6f7a8b-9c0d-4e1f-8a2b-3c4d5e6f7a8b has expired or does not exist",
"instance": "tag:etherfuse.com,2026-08-28:R2-10120/0b1c2d3e-4f50-4a6b-8c7d-9e0f1a2b3c4d",
"errors": [
{
"pointer": "#/accountDetails/clabe",
"detail": "This field is required."
}
],
"required": [
"<string>"
],
"missing": [
"<string>"
]
}{
"type": "https://docs.etherfuse.com/ramp/v2/errors/quote-expired",
"title": "Quote expired",
"status": 400,
"detail": "quote 5e6f7a8b-9c0d-4e1f-8a2b-3c4d5e6f7a8b has expired or does not exist",
"instance": "tag:etherfuse.com,2026-08-28:R2-10120/0b1c2d3e-4f50-4a6b-8c7d-9e0f1a2b3c4d",
"errors": [
{
"pointer": "#/accountDetails/clabe",
"detail": "This field is required."
}
],
"required": [
"<string>"
],
"missing": [
"<string>"
]
}{
"type": "https://docs.etherfuse.com/ramp/v2/errors/quote-expired",
"title": "Quote expired",
"status": 400,
"detail": "quote 5e6f7a8b-9c0d-4e1f-8a2b-3c4d5e6f7a8b has expired or does not exist",
"instance": "tag:etherfuse.com,2026-08-28:R2-10120/0b1c2d3e-4f50-4a6b-8c7d-9e0f1a2b3c4d",
"errors": [
{
"pointer": "#/accountDetails/clabe",
"detail": "This field is required."
}
],
"required": [
"<string>"
],
"missing": [
"<string>"
]
}{
"type": "https://docs.etherfuse.com/ramp/v2/errors/quote-expired",
"title": "Quote expired",
"status": 400,
"detail": "quote 5e6f7a8b-9c0d-4e1f-8a2b-3c4d5e6f7a8b has expired or does not exist",
"instance": "tag:etherfuse.com,2026-08-28:R2-10120/0b1c2d3e-4f50-4a6b-8c7d-9e0f1a2b3c4d",
"errors": [
{
"pointer": "#/accountDetails/clabe",
"detail": "This field is required."
}
],
"required": [
"<string>"
],
"missing": [
"<string>"
]
}{
"type": "https://docs.etherfuse.com/ramp/v2/errors/quote-expired",
"title": "Quote expired",
"status": 400,
"detail": "quote 5e6f7a8b-9c0d-4e1f-8a2b-3c4d5e6f7a8b has expired or does not exist",
"instance": "tag:etherfuse.com,2026-08-28:R2-10120/0b1c2d3e-4f50-4a6b-8c7d-9e0f1a2b3c4d",
"errors": [
{
"pointer": "#/accountDetails/clabe",
"detail": "This field is required."
}
],
"required": [
"<string>"
],
"missing": [
"<string>"
]
}Create order
Creates an order from a quote and returns the full order. Use the organizationId the quote was created with. The order belongs to that organization, even when a payment account on it belongs to your API key’s organization. The order’s organizationId, GET /orders filtered by organizationId, and reporting all show it under that organization, so quote and order under the organization you want it reported under. The order’s id is the quoteId.
One quote makes one order. Sending the same quoteId again returns the existing order with 200, even after the quote has expired, so a retry never creates a second order. If two requests with the same quoteId arrive at the same time, one gets 201 and the other gets 409 conflict; read the order to get it.
One waiting order per amount. On SPEI, a deposit is matched to an order by the account and the amount. If another order on the same source account is already waiting for the same amount, the request fails with 409 pending-order-same-amount. Fund or cancel that order, or quote a different amount.
On spei and pix, fundingInstructions.reference is set when the order is created. An order funded on a chain has no reference. fundingInstructions.destination is absent until the funding details are available. Subscribe to orderUpdated to receive the order when they arrive, or read the order again.
curl --request POST \
--url https://api.sand.etherfuse.com/organization/{organizationId}/order \
--header 'Authorization: <api-key>' \
--header 'Content-Type: application/json' \
--data '
{
"quoteId": "5e6f7a8b-9c0d-4e1f-8a2b-3c4d5e6f7a8b",
"memo": "Invoice 1042"
}
'const options = {
method: 'POST',
headers: {Authorization: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({quoteId: '5e6f7a8b-9c0d-4e1f-8a2b-3c4d5e6f7a8b', memo: 'Invoice 1042'})
};
fetch('https://api.sand.etherfuse.com/organization/{organizationId}/order', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.sand.etherfuse.com/organization/{organizationId}/order"
payload = {
"quoteId": "5e6f7a8b-9c0d-4e1f-8a2b-3c4d5e6f7a8b",
"memo": "Invoice 1042"
}
headers = {
"Authorization": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"id": "5e6f7a8b-9c0d-4e1f-8a2b-3c4d5e6f7a8b",
"organizationId": "7a8b9c0d-1e2f-4a3b-8c4d-5e6f7a8b9c0d",
"status": "created",
"memo": "Invoice 1042",
"source": {
"paymentAccountId": "3f9a2c1e-5b7d-4e8f-9a01-2b3c4d5e6f70",
"amount": "1000",
"asset": "MXN",
"rail": "spei",
"accountLabel": "Operating account"
},
"destination": {
"paymentAccountId": "8c1d2e3f-4a5b-4c6d-8e7f-901a2b3c4d5e",
"amount": "54.120000",
"asset": "USDC:GA5ZSEJYB37JRC5AVCIA5MOP4RHTM335X2KGX3IHOJAPP5RE34K4KZVN",
"rail": "stellar",
"accountLabel": "Treasury wallet"
},
"fees": [
{
"type": "transactionFee",
"amount": "2.50",
"asset": "MXN",
"bps": 25
}
],
"returnedDeposits": [],
"fundingInstructions": {
"rail": "spei",
"reference": "1000042",
"destination": {
"expiresAt": null,
"clabe": "646180000000000009",
"bankName": "Ejemplo Banco",
"recipientName": "Ejemplo Receptor"
},
"fundingDeadline": "2026-09-29T17:05:02Z"
},
"claimInstructions": null,
"createdAt": "2026-09-28T17:05:02.114Z",
"updatedAt": "2026-09-28T17:05:02.114Z",
"completedAt": null
}{
"id": "5e6f7a8b-9c0d-4e1f-8a2b-3c4d5e6f7a8b",
"organizationId": "7a8b9c0d-1e2f-4a3b-8c4d-5e6f7a8b9c0d",
"status": "created",
"memo": "Invoice 1042",
"source": {
"paymentAccountId": "3f9a2c1e-5b7d-4e8f-9a01-2b3c4d5e6f70",
"amount": "1000",
"asset": "MXN",
"rail": "spei",
"accountLabel": "Operating account"
},
"destination": {
"paymentAccountId": "8c1d2e3f-4a5b-4c6d-8e7f-901a2b3c4d5e",
"amount": "54.120000",
"asset": "USDC:GA5ZSEJYB37JRC5AVCIA5MOP4RHTM335X2KGX3IHOJAPP5RE34K4KZVN",
"rail": "stellar",
"accountLabel": "Treasury wallet"
},
"fees": [
{
"type": "transactionFee",
"amount": "2.50",
"asset": "MXN",
"bps": 25
}
],
"returnedDeposits": [],
"fundingInstructions": {
"rail": "spei",
"reference": "1000042",
"destination": {
"expiresAt": null,
"clabe": "646180000000000009",
"bankName": "Ejemplo Banco",
"recipientName": "Ejemplo Receptor"
},
"fundingDeadline": "2026-09-29T17:05:02Z"
},
"claimInstructions": null,
"createdAt": "2026-09-28T17:05:02.114Z",
"updatedAt": "2026-09-28T17:05:02.114Z",
"completedAt": null
}{
"type": "https://docs.etherfuse.com/ramp/v2/errors/quote-expired",
"title": "Quote expired",
"status": 400,
"detail": "quote 5e6f7a8b-9c0d-4e1f-8a2b-3c4d5e6f7a8b has expired or does not exist",
"instance": "tag:etherfuse.com,2026-08-28:R2-10120/0b1c2d3e-4f50-4a6b-8c7d-9e0f1a2b3c4d",
"errors": [
{
"pointer": "#/accountDetails/clabe",
"detail": "This field is required."
}
],
"required": [
"<string>"
],
"missing": [
"<string>"
]
}{
"type": "https://docs.etherfuse.com/ramp/v2/errors/quote-expired",
"title": "Quote expired",
"status": 400,
"detail": "quote 5e6f7a8b-9c0d-4e1f-8a2b-3c4d5e6f7a8b has expired or does not exist",
"instance": "tag:etherfuse.com,2026-08-28:R2-10120/0b1c2d3e-4f50-4a6b-8c7d-9e0f1a2b3c4d",
"errors": [
{
"pointer": "#/accountDetails/clabe",
"detail": "This field is required."
}
],
"required": [
"<string>"
],
"missing": [
"<string>"
]
}{
"type": "https://docs.etherfuse.com/ramp/v2/errors/quote-expired",
"title": "Quote expired",
"status": 400,
"detail": "quote 5e6f7a8b-9c0d-4e1f-8a2b-3c4d5e6f7a8b has expired or does not exist",
"instance": "tag:etherfuse.com,2026-08-28:R2-10120/0b1c2d3e-4f50-4a6b-8c7d-9e0f1a2b3c4d",
"errors": [
{
"pointer": "#/accountDetails/clabe",
"detail": "This field is required."
}
],
"required": [
"<string>"
],
"missing": [
"<string>"
]
}{
"type": "https://docs.etherfuse.com/ramp/v2/errors/quote-expired",
"title": "Quote expired",
"status": 400,
"detail": "quote 5e6f7a8b-9c0d-4e1f-8a2b-3c4d5e6f7a8b has expired or does not exist",
"instance": "tag:etherfuse.com,2026-08-28:R2-10120/0b1c2d3e-4f50-4a6b-8c7d-9e0f1a2b3c4d",
"errors": [
{
"pointer": "#/accountDetails/clabe",
"detail": "This field is required."
}
],
"required": [
"<string>"
],
"missing": [
"<string>"
]
}{
"type": "https://docs.etherfuse.com/ramp/v2/errors/quote-expired",
"title": "Quote expired",
"status": 400,
"detail": "quote 5e6f7a8b-9c0d-4e1f-8a2b-3c4d5e6f7a8b has expired or does not exist",
"instance": "tag:etherfuse.com,2026-08-28:R2-10120/0b1c2d3e-4f50-4a6b-8c7d-9e0f1a2b3c4d",
"errors": [
{
"pointer": "#/accountDetails/clabe",
"detail": "This field is required."
}
],
"required": [
"<string>"
],
"missing": [
"<string>"
]
}{
"type": "https://docs.etherfuse.com/ramp/v2/errors/quote-expired",
"title": "Quote expired",
"status": 400,
"detail": "quote 5e6f7a8b-9c0d-4e1f-8a2b-3c4d5e6f7a8b has expired or does not exist",
"instance": "tag:etherfuse.com,2026-08-28:R2-10120/0b1c2d3e-4f50-4a6b-8c7d-9e0f1a2b3c4d",
"errors": [
{
"pointer": "#/accountDetails/clabe",
"detail": "This field is required."
}
],
"required": [
"<string>"
],
"missing": [
"<string>"
]
}Authorizations
API key sent in the Authorization header, with no Bearer prefix.
Path Parameters
The organization this call acts for: your API key's organization or one of its customer organizations. Any other id returns 404 not-found.
Body
Response
An order already exists for this quote. Returns that order.
The order id. Equal to the quoteId it was created from.
The organization the order belongs to.
created: waiting for the source funds. funded: source funds received. sourcingLiquidity: source funds received, and the payout is waiting while we add funds to our payout account, usually by the next business day. It usually happens only for larger orders, and generally only for payouts to a bank account. The order stays in this status until it is completed or failed. claimable: delivered, waiting for the customer to claim; see claimInstructions. completed: delivered. failed: could not be completed; see failure. canceled: canceled before completion. refunded: the order ended and we sent its source funds back. A returned deposit in returnedDeposits does not end the order.
created, funded, sourcingLiquidity, claimable, completed, failed, canceled, refunded Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Deposits we sent back because they did not match the order, oldest first: a deposit from the order's source wallet for the wrong amount, or a bank transfer with this order's reference for the wrong amount. The order stays open and waits for a deposit that matches. We return at most one deposit from a wallet per order, and only a single transfer of the order's asset from the source wallet. A second wrong deposit, or a deposit with more than one transfer, sender or asset, is held for our team and not sent back automatically. We never send back a deposit from any other wallet. Empty when we returned nothing.
Show child attributes
Show child attributes
How the source funds the order.
Show child attributes
Show child attributes
Set while the order is claimable. Otherwise null. Always null for an embedded wallet, whose claim is the order's authorization.
Show child attributes
Show child attributes
Present only when status is failed.
Show child attributes
Show child attributes
Set while the order waits for the account holder to approve a transfer we built: a funding authorization while the order is created, and a claim authorization while it is claimable. Otherwise null. Approve it with POST /organization/{organizationId}/order/{id}/authorization.
Show child attributes
Show child attributes
{
"id": "9a8b7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d",
"reason": "funding",
"method": {
"kind": "signature",
"algorithm": "es256",
"message": "eyJvcmRlcklkIjoiNWU2ZjdhOGIifQ"
},
"expiresAt": "2026-09-28T17:20:00Z"
}