curl --request POST \
--url https://api.sand.etherfuse.com/organization/{organizationId}/order/{id}/authorization \
--header 'Authorization: <api-key>' \
--header 'Content-Type: application/json' \
--data '
{
"id": "9a8b7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d",
"signature": "3045022100..."
}
'const options = {
method: 'POST',
headers: {Authorization: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({id: '9a8b7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d', signature: '3045022100...'})
};
fetch('https://api.sand.etherfuse.com/organization/{organizationId}/order/{id}/authorization', 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/{id}/authorization"
payload = {
"id": "9a8b7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d",
"signature": "3045022100..."
}
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
}
],
"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>"
]
}Submit authorization
Approves the order’s pending authorization and returns the order. Sign the UTF-8 bytes of authorization.method.message with the P-256 key registered as the embedded wallet’s signerPublicKey, using ECDSA with SHA-256, and send the signature hex-encoded, as DER or as the 128-character r||s form WebCrypto produces.
We verify the signature, then move the funds (reason funding) or claim them (reason claim). authorization is null on the returned order, and orderUpdated follows as the order progresses.
An authorization expires at expiresAt. We then replace it with a new one with a new id. Read the order again and sign the new message.
curl --request POST \
--url https://api.sand.etherfuse.com/organization/{organizationId}/order/{id}/authorization \
--header 'Authorization: <api-key>' \
--header 'Content-Type: application/json' \
--data '
{
"id": "9a8b7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d",
"signature": "3045022100..."
}
'const options = {
method: 'POST',
headers: {Authorization: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({id: '9a8b7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d', signature: '3045022100...'})
};
fetch('https://api.sand.etherfuse.com/organization/{organizationId}/order/{id}/authorization', 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/{id}/authorization"
payload = {
"id": "9a8b7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d",
"signature": "3045022100..."
}
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
}
],
"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>"
]
}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.
The order id, which is the quoteId it was created from.
Body
Response
The 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. 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 source funds were returned.
created, funded, claimable, completed, failed, canceled, refunded Show child attributes
Show child attributes
Show child attributes
Show child attributes
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.
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. 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"
}