curl -X POST https://checkout.noxpay.io/v2/rfq/accept \
-H "api-key: <key>" \
-H "Content-Type: application/json" \
-d '{
"rfq_id": "NOXabc123...",
"settlement_day": "d0",
"wallet_id": "..."
}'
import requests
response = requests.post(
"https://checkout.noxpay.io/v2/rfq/accept",
headers={
"api-key": "<key>",
"Content-Type": "application/json",
},
json={
"rfq_id": "NOXabc123...",
"settlement_day": "d0",
"wallet_id": "...",
},
)
print(response.json())
const response = await fetch("https://checkout.noxpay.io/v2/rfq/accept", {
method: "POST",
headers: {
"api-key": "<key>",
"Content-Type": "application/json",
},
body: JSON.stringify({
rfq_id: "NOXabc123...",
settlement_day: "d0",
wallet_id: "...",
}),
});
const data = await response.json();
{
"rfq_id": "NOXabc123...",
"state": "DONE",
"amount_from": 1000.0,
"amount_to": 5050.0,
"rate": 5.050,
"quote_pair": "USDT (TRX)/BRL (PIX)",
"settlement_eta": "2026-07-01T19:00:00Z"
}
{ "state": "EXPIRED", "reason": "Taxa expirou e foi renovada — busque a nova cotação antes de tentar novamente" }
{ "state": "DEPRECATED", "reason": "Janela de renovação encerrada — crie uma nova conversão" }
{ "state": "REFUSED", "reason": "Saldo insuficiente" }
{ "state": "QUOTE", "reason": "Cotação indisponível no fornecedor" }
Conversions
Aceitar Conversão
POST /v2/rfq/accept — aceita uma cotação existente, escolhendo o dia de liquidação e o destino.
curl -X POST https://checkout.noxpay.io/v2/rfq/accept \
-H "api-key: <key>" \
-H "Content-Type: application/json" \
-d '{
"rfq_id": "NOXabc123...",
"settlement_day": "d0",
"wallet_id": "..."
}'
import requests
response = requests.post(
"https://checkout.noxpay.io/v2/rfq/accept",
headers={
"api-key": "<key>",
"Content-Type": "application/json",
},
json={
"rfq_id": "NOXabc123...",
"settlement_day": "d0",
"wallet_id": "...",
},
)
print(response.json())
const response = await fetch("https://checkout.noxpay.io/v2/rfq/accept", {
method: "POST",
headers: {
"api-key": "<key>",
"Content-Type": "application/json",
},
body: JSON.stringify({
rfq_id: "NOXabc123...",
settlement_day: "d0",
wallet_id: "...",
}),
});
const data = await response.json();
{
"rfq_id": "NOXabc123...",
"state": "DONE",
"amount_from": 1000.0,
"amount_to": 5050.0,
"rate": 5.050,
"quote_pair": "USDT (TRX)/BRL (PIX)",
"settlement_eta": "2026-07-01T19:00:00Z"
}
{ "state": "EXPIRED", "reason": "Taxa expirou e foi renovada — busque a nova cotação antes de tentar novamente" }
{ "state": "DEPRECATED", "reason": "Janela de renovação encerrada — crie uma nova conversão" }
{ "state": "REFUSED", "reason": "Saldo insuficiente" }
{ "state": "QUOTE", "reason": "Cotação indisponível no fornecedor" }
Aceita uma cotação criada via Criar Conversão, travando a taxa e agendando a entrega. O saldo em
Response
Este é o único endpoint da API que devolve
Quando um
from_currency precisa estar disponível no momento do aceite — ele não é reservado quando a cotação é criada.
Corpo da requisição
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
rfq_id | string | Sim | ID retornado por Criar Conversão |
settlement_day | string | Sim | "d0" ou "d1" |
wallet_id | string | Condicional | ID da wallet cripto de destino (pagamento em cripto) |
pix_key | string | Condicional | Chave Pix de destino (pagamento em BRL) |
Response 200 OK (aceito)
| Campo | Tipo | Descrição |
|---|---|---|
rfq_id | string | ID da conversão |
state | string | DONE assim que aceito |
amount_from | float | Montante confirmado enviado |
amount_to | float | Montante confirmado a receber |
rate | float | Taxa confirmada |
quote_pair | string | Par de cotação, no formato <nome exibido da origem>/<nome exibido do destino> — nomes exibidos, não códigos de moeda (ex: USDT (TRX)/BRL (PIX)) |
settlement_eta | string | Horário de liquidação confirmado (RFC 3339) |
wallet_id | string | Wallet de destino, devolvida quando o pagamento é em cripto |
pix_key | string | Chave Pix de destino, devolvida quando o pagamento é em BRL |
reason | string | Vazio em 200; carrega a explicação em caso de recusa ou falha |
state, porque é state que carrega o desfecho do aceite. Em todos os outros, leia status / substatus.
Um 200 aqui significa que a operação está travada e a entrega agendada — não significa que os fundos já chegaram. A entrega é concluída em settlement_eta; use Consultar Conversão ou o webhook para acompanhar.
Desfechos
POST /v2/rfq/accept é a única operação que compromete no fluxo de conversão, por isso tem o conjunto mais amplo de desfechos. Todos estão listados aqui.
| HTTP | Estado | Significado | Retentável? |
|---|---|---|---|
200 OK | DONE | Aceito. amount_from, amount_to, rate e settlement_eta vêm preenchidos | Finalizado |
202 Accepted | — | Ainda em avaliação — não é um aceite. reason vem vazio de propósito: é espera, não recusa | Sim, reconsultando |
400 Bad Request | — | JSON inválido, campo desconhecido, rfq_id vazio, ou settlement_day fora de d0 / d1 | Não |
401 Unauthorized | — | api-key ausente ou inválida | Não |
404 Not Found | — | A conversão não existe, ou pertence a outra conta. Os dois casos são deliberadamente indistinguíveis | Não |
409 Conflict | EXPIRED | A taxa expirou e a cotação foi renovada — releia a conversão e reenvie com a nova taxa | Sim, após reler |
410 Gone | DEPRECATED | A janela de renovação foi encerrada — crie uma nova conversão | Não |
422 Unprocessable Entity | REFUSED ou ERROR | Recusado. reason traz o motivo: saldo insuficiente, D0 indisponível, ou teto de limite | Não |
503 Service Unavailable | — | O fornecedor de cotação está indisponível. Nada foi decidido — a conversão continua em QUOTE e pode ser aceita de novo | Sim |
500 Internal Server Error | — | Falha ao reler a conversão ou seus atributos | Às vezes |
Um
202 não é sucesso. Significa que o aceite ainda está em avaliação e nenhuma decisão foi registrada. Não trate como confirmação e não reenvie o aceite — releia Consultar Conversão ou aguarde o webhook até chegar a um desfecho final.422 vem de teto de limite e não de saldo, GET /v2/rfq/{id} expõe limit_block_source para dizer qual portão barrou — operational para o teto da mesa, compliance para a escada de KYB. O campo é ausente quando a recusa foi por saldo insuficiente.
503 e 202 podem ser retentados. 409 exige uma releitura antes. 410 e 422 são finais para aquele rfq_id.
Códigos de retorno: 200, 202, 400, 401, 404, 409, 410, 422, 500, 503
curl -X POST https://checkout.noxpay.io/v2/rfq/accept \
-H "api-key: <key>" \
-H "Content-Type: application/json" \
-d '{
"rfq_id": "NOXabc123...",
"settlement_day": "d0",
"wallet_id": "..."
}'
import requests
response = requests.post(
"https://checkout.noxpay.io/v2/rfq/accept",
headers={
"api-key": "<key>",
"Content-Type": "application/json",
},
json={
"rfq_id": "NOXabc123...",
"settlement_day": "d0",
"wallet_id": "...",
},
)
print(response.json())
const response = await fetch("https://checkout.noxpay.io/v2/rfq/accept", {
method: "POST",
headers: {
"api-key": "<key>",
"Content-Type": "application/json",
},
body: JSON.stringify({
rfq_id: "NOXabc123...",
settlement_day: "d0",
wallet_id: "...",
}),
});
const data = await response.json();
{
"rfq_id": "NOXabc123...",
"state": "DONE",
"amount_from": 1000.0,
"amount_to": 5050.0,
"rate": 5.050,
"quote_pair": "USDT (TRX)/BRL (PIX)",
"settlement_eta": "2026-07-01T19:00:00Z"
}
{ "state": "EXPIRED", "reason": "Taxa expirou e foi renovada — busque a nova cotação antes de tentar novamente" }
{ "state": "DEPRECATED", "reason": "Janela de renovação encerrada — crie uma nova conversão" }
{ "state": "REFUSED", "reason": "Saldo insuficiente" }
{ "state": "QUOTE", "reason": "Cotação indisponível no fornecedor" }

