Exchange BRL → USDT
Convert reais into USDT. You request a quote, confirm the order, pay the generated PIX, and the USDT is transferred to the wallet registered on the exchange account. All amounts are in reais (BRL).
Flow
POST /api/cambio/cotacaoreturns the price and aquoteIdthat is valid for a few seconds (lockSeconds).POST /api/cambio/ordensaccepts the quote, creates the order and returns the PIX copy-and-paste code.- Pay the PIX before
expiresAt. - Poll
GET /api/cambio/ordens/{id}until the status isDONE, which comes with thetxHashof the USDT transfer.
Quotes expire quickly (about 15 seconds). If you prefer, call POST /api/cambio/ordens directly with amount: the quote and the order are made in the same call.
Headers
The same as every other endpoint. See Authentication.
| Parametro | Tipo | Descricao |
|---|---|---|
Content-Type* | header | application/json |
X-Client-Id* | header | Client ID of your API credential |
X-API-Key* | header | API Key of your API credential |
Content-Typeapplication/json
X-Client-IdClient ID of your API credential
X-API-KeyAPI Key of your API credential
1. Get a quote
/api/cambio/cotacao| Parametro | Tipo | Descricao |
|---|---|---|
amount* | number | Amount in reais to convert, with up to two decimal places (e.g. 60000.00). Minimum US$ 10,000 and maximum US$ 1,000,000 per order, converted to reais at the current price (roughly R$ 55 thousand to R$ 5.5 million). Above the maximum, split it into more than one order. |
amountAmount in reais to convert, with up to two decimal places (e.g. 60000.00). Minimum US$ 10,000 and maximum US$ 1,000,000 per order, converted to reais at the current price (roughly R$ 55 thousand to R$ 5.5 million). Above the maximum, split it into more than one order.
{ "amount": 60000.00}{ "quoteId": "3f1c2b9e-6a1d-4f7e-9c2a-1b2c3d4e5f60", "amountBrl": 60000.00, "price": 5.5417, "estimatedUsdt": 10827.00, "lockSeconds": 15, "expiresAt": "2026-10-30T15:00:20Z"}| Parametro | Tipo | Descricao |
|---|---|---|
price | number | Reais per 1 USDT. |
estimatedUsdt | number | amount / price, rounded down to 2 decimal places. |
lockSeconds | number | How many seconds the quote is valid for. |
priceReais per 1 USDT.
estimatedUsdtamount / price, rounded down to 2 decimal places.
lockSecondsHow many seconds the quote is valid for.
2. Create an order
/api/cambio/ordens| Parametro | Tipo | Descricao |
|---|---|---|
quoteId | string | Quote from /api/cambio/cotacao. Required if amount is not sent. |
amount | number | Amount in reais. Use it instead of quoteId to quote and accept in the same call. |
externalId | string | Your own order identifier (up to 64 characters). Sending the same externalId again returns the same order instead of creating another one. |
quoteIdQuote from /api/cambio/cotacao. Required if amount is not sent.
amountAmount in reais. Use it instead of quoteId to quote and accept in the same call.
externalIdYour own order identifier (up to 64 characters). Sending the same externalId again returns the same order instead of creating another one.
{ "quoteId": "3f1c2b9e-6a1d-4f7e-9c2a-1b2c3d4e5f60", "externalId": "order-001"}{ "id": 128, "externalId": "order-001", "status": "PENDING", "amountBrl": 60000.00, "price": 5.5417, "totalUsdt": 10827.00, "quoteId": "3f1c2b9e-6a1d-4f7e-9c2a-1b2c3d4e5f60", "pix": [ { "sequence": 1, "amountBrl": 60000.00, "status": "PENDING", "qrCode": "00020101021226...6304ABCD", "qrCodeImageUrl": null, "txid": "f3a9c1d27e8b4f60a1", "expiresAt": "2026-10-31T11:55:00.000000Z" } ], "walletAddress": null, "txHash": null, "scanLink": null, "error": null, "createdAt": "2026-10-30T15:00:05Z", "updatedAt": "2026-10-30T15:00:08Z"}The PIX is usually ready within a few seconds. If pix is empty or has status CREATING, fetch the order again in a few seconds. On a 502 error, look the order up by id (or repeat the call with the same externalId) before trying another one.
3. Get an order
/api/cambio/ordens/{id}Refreshes the order and returns it in the same format as the creation response. Once the USDT is transferred, the status becomes DONE and walletAddress, txHash and scanLink are filled in.
{ "id": 128, "status": "DONE", "totalUsdt": 10827.00, "walletAddress": "TXyz...", "txHash": "9f2c...", "scanLink": "https://tronscan.org/#/transaction/9f2c..."}4. List orders
/api/cambio/ordens?page=1&pageSize=20| Parametro | Tipo | Descricao |
|---|---|---|
page | number | Page, starting at 1 (default 1). |
pageSize | number | Items per page, from 1 to 100 (default 20). |
pagePage, starting at 1 (default 1).
pageSizeItems per page, from 1 to 100 (default 20).
{ "page": 1, "pageSize": 20, "total": 1, "data": [ { "id": 128, "externalId": "order-001", "status": "PENDING", "...": "..." } ]}Order status
| Parametro | Tipo | Descricao |
|---|---|---|
CREATING | status | The order is being registered. |
PENDING | status | Order created, waiting for the PIX payment. |
DONE | status | PIX received and USDT transferred (see txHash). |
FAILED | status | The order was not created; the reason is in error. |
CREATINGThe order is being registered.
PENDINGOrder created, waiting for the PIX payment.
DONEPIX received and USDT transferred (see txHash).
FAILEDThe order was not created; the reason is in error.
Errors
| Parametro | Tipo | Descricao |
|---|---|---|
400 | http | Invalid amount, or neither quoteId nor amount was sent. |
401 / 403 | http | Missing credential or no access to the company. |
404 | http | Order not found for your company. |
422 | http | Quote rejected or expired: request a new quote. Outside the limits (US$ 10,000 to US$ 1,000,000), providerMessage states the minimum or maximum in reais. |
502 | http | The exchange desk did not respond. Look the order up before repeating. |
503 | http | Exchange is unavailable right now. |
400Invalid amount, or neither quoteId nor amount was sent.
401 / 403Missing credential or no access to the company.
404Order not found for your company.
422Quote rejected or expired: request a new quote. Outside the limits (US$ 10,000 to US$ 1,000,000), providerMessage states the minimum or maximum in reais.
502The exchange desk did not respond. Look the order up before repeating.
503Exchange is unavailable right now.