Create an order
Create an On-Ramp order and return payment instructions. On success, the endpoint returns HTTP 200 and the new order has status AWAITING_PAYMENT.
The payer must transfer fiatAmount MXN to paymentInfo.clabe before expiresAt.
The provider sets the order price in real time. It can differ from the quote. The order creation response is authoritative.
Pass exactly one of fiatAmount and cryptoAmount.
When you create an order by fiatAmount, the provider confirms the USDT amount to be credited. The credited amount is the cryptoAmount in the response. Before the provider confirms, cryptoAmount can be empty.
An empty paymentInfo means the provider has not yet confirmed the collection. Retry the order creation with the same Idempotency-Key, or retrieve the order later.
If the provider rejects the request, the order is set to FAILED. A replay with the same Idempotency-Key returns that FAILED order.
Payer KYC is only forwarded to the provider. Stabo does not store it, and does not return the ID number or contact details in responses.
The payer's receive account must already be open. See the Open a receive account endpoint. If it is not open, order creation returns "receive account being opened" and does not create an order.
bearerAuthAuthorizationBearer <token>The access_token obtained from POST /oauth2/token. Header format: Authorization: Bearer {accessToken}. The merchant identity comes from the token. The request body does not accept merchant or tenant fields.
Idempotency-Key*stringUnique request identifier, up to 128 characters. We recommend a UUID. If the key already exists within the same merchant, the original order is returned and no new order is created
length <= 128application/json- body
referenceNo?stringMerchant order number, returned as is. Up to 64 characters
length <= 64country*"MX"Fixed to MX
"MX"fiatCurrency*"MXN"Fixed to MXN
"MXN"cryptoCurrency*"USDT"Fixed to USDT
"USDT"fiatAmount?stringMXN amount paid by the payer. Must be greater than 0, with up to 2 decimal places. Pass either this or cryptoAmount. Accepts a number or a string. We recommend a string
cryptoAmount?stringUSDT amount the merchant wants credited. Must be greater than 0. Pass either this or fiatAmount. Accepts a number or a string. We recommend a string
payerId*stringUnique payer identifier on the merchant side. Generated by the merchant, 1 to 64 characters, letters, digits, _, and - only. Do not use personal information such as email addresses, phone numbers, or ID numbers. The same payerId under the same merchant always maps to the same CLABE
^[A-Za-z0-9_-]{1,64}$payer*Payer KYC information.
payerAccount*Payer's bank account.
remark?stringRemark. Up to 255 characters
length <= 255Returns the order. All payer information in the example is fictitious.
application/json- response
code?integerBusiness status code
message?stringtraceId?stringRequest trace ID. Provide it when you contact technical support
data?On-Ramp order. Order creation, order queries, and Webhooks use the same structure.
curl -X POST 'https://api.test.stabofx.com/openapi/v1/collections/on-ramp/orders' \ -H 'Idempotency-Key: 7f9c2a1e-0b6d-4c2f-9d7e-1a2b3c4d5e6f' \ -H 'Content-Type: application/json' \ -d '{ "referenceNo": "merchant-order-0001", "country": "MX", "fiatCurrency": "MXN", "cryptoCurrency": "USDT", "cryptoAmount": "50.000000", "payerId": "payer-0001", "payer": { "name": "Juan Perez Lopez", "email": "juan@example.com", "phone": "+5215512345678", "country": "MX", "address": "Av. Reforma 1, Ciudad de Mexico", "dateOfBirth": "1990-01-31", "idType": "NATIONAL_ID", "idNumber": "XEXX010101HNEXXXA4" }, "payerAccount": { "accountType": "BANK", "accountNumber": "012180001234567891", "accountName": "Juan Perez Lopez" }, "remark": "optional"}'{ "code": 200, "message": "OK", "traceId": "trace-uuid-string", "data": { "orderId": "bco_8f3k2m9q1x7z4t6w", "referenceNo": "merchant-order-0001", "status": "AWAITING_PAYMENT", "country": "MX", "fiatCurrency": "MXN", "fiatAmount": "954.77", "fiatFee": "13.50", "cryptoCurrency": "USDT", "cryptoAmount": "50.000000", "price": "18.8253", "paymentInfo": { "method": "SPEI", "clabe": "706180000000000001", "reference": "REF123456" }, "payer": { "name": "Juan Perez Lopez" }, "expiresAt": "2026-11-01T06:15:00Z", "createdAt": "2026-11-01T10:15:00+08:00", "completedAt": null, "failureReason": null }}Get a quote GET
Get a reference price. A quote does not lock the price. The final price is the one in the order creation response. Quotes support MXN amounts only. You can create an order by MXN (`fiatAmount`) or USDT (`cryptoAmount`) amount. A quote does not generate a quote ID. You do not need to pass quote information when you create an order.
Retrieve an order GET
Retrieve an order by its Stabo order ID. The response structure is the same as the order creation response. You can only retrieve On-Ramp orders of your own merchant account. Other orders return "order not found". Use Webhooks as the primary channel and order queries as a fallback. If you poll, wait at least 30 seconds between requests, and stop when the order reaches a final status. If a Webhook and an order query disagree, the order query result is authoritative.