Ir para o conteúdo principal
← Voltar para documentação

Referência da API

Endpoints REST para o plugin DHRU e integrações diretas.

Referência da API

Base URL: https://triapay.net. Requisições server-to-server autenticam com Authorization: Bearer <api_key>. Sessões de navegador usam o cookie definido por /auth/login mais um token CSRF de /auth/csrf.

Autenticação

Dois níveis de chave por conta:

Prefixo Uso
pk_live_* Produção. Não pode ser revelada após a criação. Rotacione para substituir.
pk_test_* Sandbox. Visível no dashboard. Apenas endpoints de sandbox.

Rotacione chaves e webhook secrets na página Integration. A rotação exige email OTP.

Criar ordem

POST /api/v1/orders
Authorization: Bearer pk_live_...
Content-Type: application/json

{
  "invoiceId": 12345,
  "userId": 678,
  "baseAmount": "10.00",
  "currency": "USD",
  "chain": "bep20",
  "asset": "USDT",
  "idempotencyKey": "01HT8X1V...-uuid",
  "returnUrl": "https://shop.example.com/orders/12345"
}
Field Tipo Observações
invoiceId int Seu invoice id do DHRU.
userId int User id do DHRU para atribuição do crédito.
baseAmount string String decimal. Um pequeno sufixo é adicionado ao valor para crypto chains.
currency string Moeda de origem.
chain enum trc20 | bep20 | binance_pay. BEP20 e TRC20 também aceitam transferências internas (off-chain) da Binance para o mesmo endereço de depósito.
asset enum USDT | USDC. TRC20 aceita só USDT.
idempotencyKey string UUID. Requisições repetidas com o mesmo payload retornam a mesma ordem.
returnUrl string Destino do redirect após a ordem terminar.

Resposta

{
  "orderId": 4711,
  "checkoutToken": "ck_a8f3...",
  "checkoutUrl": "https://triapay.net/checkout/ck_a8f3...",
  "expectedAmount": "10.0001",
  "matchCode": 1,
  "expiresAt": "2026-05-08T05:30:00Z",
  "status": "pending"
}

Redirecione o cliente para checkoutUrl. Use expectedAmount como o valor exato que o cliente deve enviar.

Status da ordem

GET /api/v1/orders/{idempotencyKey}/status
Authorization: Bearer pk_live_...
{
  "orderId": 4711,
  "status": "credited",
  "txHash": "0xabc...",
  "matchedAmount": "10.0001",
  "creditedAt": "2026-05-08T05:18:42Z"
}

Os estados da ordem formam uma state machine black-box:

  • pending — aguardando pagamento.
  • matched — fundos recebidos, crédito em andamento.
  • credited — sucesso terminal. Webhook confirmado.
  • expired — terminal. O cliente não pagou a tempo.
  • failed — terminal. A entrega do webhook esgotou as tentativas.
  • overpaid — terminal. O cliente enviou mais do que o esperado. A ordem é creditada e marcada para revisão manual.

Chegadas tardias (liquidação da chain após expiresAt) não são creditadas automaticamente. Recupere-as em Admin → Orphan transactions.

Helpers de sandbox

Disponíveis somente com pk_test_*. Force estados terminais sem esperar a liquidação da chain:

POST /api/v1/sandbox/orders/{idempotencyKey}/force-match
POST /api/v1/sandbox/orders/{idempotencyKey}/force-credit
POST /api/v1/sandbox/orders/{idempotencyKey}/force-expire
POST /api/v1/sandbox/webhook/replay

Body vazio. Retorna a ordem atualizada. Webhooks de sandbox incluem X-Payment-Mode: sandbox; o plugin DHRU incluído corta esses sem creditar nenhuma fatura.

Checkout para o cliente

Autenticação somente por token. Usada pela página de checkout hospedada:

GET  /api/v1/checkout/{token}/status
GET  /api/v1/checkout/{token}/methods
POST /api/v1/checkout/{token}/select-method

Body de select-method: {"chain": "bep20", "asset": "USDT"}. Retorna a ordem com endereço de depósito, valor esperado, QR data URI e match code.

Erros

Envelope JSON; o status HTTP reflete a classe:

{ "error": "invalid_credentials", "code": "unauthorized" }
HTTP code Quando
400 validation_error Payload em formato inválido, campos obrigatórios ausentes.
401 unauthorized Bearer ou sessão ausente ou inválida.
403 forbidden IP fora da allowlist, key live em endpoint somente sandbox.
404 not_found Token expirado, idempotency key desconhecida.
409 conflict Idempotency-key reutilizada com payload diferente.
429 rate_limited Respeite o header Retry-After (segundos).
500 internal Erro do servidor. Tente novamente com backoff.

Os rate limits são aplicados por conta. Respeite Retry-After a cada 429.

Idempotência

Toda requisição que muda estado exige um idempotencyKey. Repetir a mesma key com o mesmo payload retorna a ordem original. Repetir a mesma key com payload diferente retorna:

{ "error": "idempotency_payload_mismatch", "code": "conflict" }

Gere a key como um UUIDv4 por fatura e persista do seu lado para que retries após uma falha de rede não causem cobrança em dobro.


Precisa de mais?

Qualquer coisa além desta página está disponível sob acordo de parceria. Fale com a gente pelo WhatsApp na home.