Documentação da API COFRI
A API da COFRI dá acesso programático à custódia de DePix na Rede Ares — o ledger interno de liquidação da COFRI, sem dependência de blockchain pública. Todas as respostas são JSON.
Autenticação
A maioria dos endpoints exige um token JWT, obtido via /auth/login (usuário) e enviado em todo request autenticado. Integrações servidor-a-servidor podem usar uma chave de API apenas para o endpoint de emissão de token.
# Autenticado como usuário Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... # Integração servidor-a-servidor (somente /auth/generate-token) X-API-Key: sua_chave_de_api
X-Cofri-Signature: sha256=HMAC-SHA256(corpo, segredo). A assinatura só é validada quando o cabeçalho está presente — não é obrigatória para chamar a API.O token de acesso expira em 1 hora. Use /auth/refresh com o refresh token (válido por 7 dias) para obter um novo, sem precisar logar de novo.
Erros & Limites
Toda resposta de erro segue o mesmo formato:
{
"status": false,
"message": "Descrição legível do erro",
"code": "VALIDATION_ERROR",
"errors": { "campo": "detalhe" },
"timestamp": 1735689600
}
| HTTP | Código | Quando acontece |
|---|---|---|
| 400 | VALIDATION_ERROR | Parâmetro obrigatório ausente ou mal formatado |
| 401 | UNAUTHORIZED | Token ausente, inválido ou expirado |
| 401 | INVALID_API_KEY | Chave de API inexistente ou revogada |
| 403 | FORBIDDEN | Permissão insuficiente ou conta não verificada |
| 404 | NOT_FOUND | Recurso não encontrado |
| 422 | VALIDATION_ERROR | Dados válidos no formato, mas reprovados por regra de negócio |
| 422 | INSUFFICIENT_FUNDS | Saldo insuficiente para a operação |
| 422 | INVALID_ADDRESS | Endereço de destino não existe na Rede Ares |
| 422 | ASSET_NOT_FOUND | Ativo inexistente ou desativado |
| 429 | RATE_LIMIT_EXCEEDED | Limite de requisições excedido (cabeçalho Retry-After) |
| 500 | INTERNAL_ERROR | Erro interno |
Listas paginadas aceitam page (padrão 1) e limit (padrão 20, máximo 100), e retornam um bloco meta:
{
"status": true, "data": [ ... ],
"meta": { "total": 42, "page": 1, "limit": 20, "total_pages": 3, "has_next": true, "has_prev": false }
}
DePix (paridade 1:1 com o Real). Outros símbolos existem no schema por herança histórica, mas estão desativados.Conta
| Campo | Tipo | Descrição | |
|---|---|---|---|
| string | obrigatório | E-mail cadastrado | |
| password | string | obrigatório | Senha da conta |
# Requisição curl -X POST https://api.cofri.digital/auth/login \ -H "Content-Type: application/json" \ -d '{"email":"cliente@exemplo.com","password":"minha-senha"}' # Resposta 200 { "status": true, "data": { "access_token": "eyJhbGciOi...", "refresh_token": "eyJhbGciOi...", "token_type": "Bearer", "expires_in": 3600, "user": { "id": "...", "email": "cliente@exemplo.com", "name": "...", "role": "user" } } }
Limite: 5 tentativas a cada 5 minutos por IP. Conta com e-mail ainda não verificado retorna 403 com needs_verification: true.
| Campo | Tipo | Descrição | |
|---|---|---|---|
| string | obrigatório | E-mail válido, único | |
| password | string | obrigatório | Mínimo 8 caracteres |
| name | string | obrigatório | Nome completo |
# Resposta 201 { "status": true, "message": "Account created. Please verify your email.", "data": { "needs_verification": true, "email": "cliente@exemplo.com" } }
Provisiona a carteira na Rede Ares e uma chave de API padrão automaticamente. Um e-mail de verificação é enviado — a conta só consegue logar depois de confirmada.
| Campo | Tipo | Descrição | |
|---|---|---|---|
| token | string | obrigatório | Token do link recebido por e-mail |
Resposta igual à do login (já retorna access_token/refresh_token). Link expirado retorna 422 com expired: true — use /auth/resend-verification para gerar um novo.
| Campo | Tipo | Descrição | |
|---|---|---|---|
| refresh_token | string | obrigatório | Também aceito via Authorization: Bearer |
# Resposta 200 { "status": true, "data": { "access_token": "eyJ...", "token_type": "Bearer", "expires_in": 3600 } }
Retorna {"user": {...}}. Perfil pode ser atualizado em PUT /user/profile (name, phone, company_name) e a senha em POST /user/change-password.
Carteira
# Resposta 200 { "status": true, "data": { "wallet_id": "550e8400-e29b-41d4-a716-...", "balances": [ { "asset": "DePix", "available": 500000000, "pending": 0, "locked": 0, "available_formatted": "5.00" } ] } }
Valores em available/pending/locked vêm em base units (8 casas decimais); available_formatted já vem pronto para exibição.
# Resposta 200 { "status": true, "data": [ { "symbol": "DePix", "name": "DePix", "precision": 8, "withdrawal_fee_flat": 100, "withdrawal_fee_percent": 0.001, "min_withdrawal": 100000000 } ] }
Retorna o endereço existente ou gera um na primeira chamada. Use POST /wallet/new-address para forçar um endereço novo (não reaproveita o atual).
# Resposta 200 { "status": true, "data": { "address": "ares14rywca3ntxugbzd8wj3vwa9g79b40nsadb1", "asset": "DePix" } }
Endereços na Rede Ares usam o prefixo ares1... e são validados contra o próprio ledger da COFRI antes de qualquer envio ser aceito.
| Campo | Tipo | Descrição | |
|---|---|---|---|
| name | string | obrigatório | Nome descritivo da chave |
| permissions | array | opcional | Padrão ["read"] |
| ip_whitelist | array | opcional | Restringe a IPs específicos |
GET /wallet/api-keys lista as chaves ativas (sem o segredo); DELETE /wallet/api-keys/{id} revoga. O secret só aparece uma vez, na criação.
Depósitos (Pix → DePix)
Depósito aqui significa gerar um endereço Ares e — fora da API, via app ou o widget de compra — pagar via Pix para receber DePix. Para gerar a cobrança Pix propriamente dita, veja Comprar DePix.
| Campo | Tipo | Descrição | |
|---|---|---|---|
| asset | string | opcional | Padrão DePix |
# Resposta 201 { "status": true, "data": { "address": "ares14rywca3ntxugbzd8wj3vwa9g79b40nsadb1", "asset": "DePix", "network": "ares", "min_deposit": null, "qr_code": "ares:ares14ry..." } }
Retorna {id, asset, address, amount, txid, source, status, created_at, credited_at}. status é pending, confirmed, failed ou expired — sem etapa de confirmação de bloco, o crédito é imediato assim que o Pix é confirmado.
Paginado. Filtros opcionais: status, asset.
Envios na Rede Ares
Transferência instantânea entre carteiras da Rede Ares — sem broadcast, sem confirmação de bloco. A taxa é descontada do próprio valor enviado: quem recebe fica com o valor líquido.
# Resposta 200 { "status": true, "data": { "fee": 100100, "asset": "DePix", "amount": 100000000, "net": 99899900 } }
Sem parâmetros. Gera um código de 6 dígitos (válido por 10 minutos) exigido em /withdraw/create. Limite: 5 a cada 5 minutos.
| Campo | Tipo | Descrição | |
|---|---|---|---|
| code | string | obrigatório | Código de /withdraw/send-code |
| asset | string | obrigatório | Ex.: DePix |
| amount | integer | obrigatório | Base units (8 casas). Ex.: 1 DePix = 100000000 |
| address | string | obrigatório | Endereço Ares de destino (precisa existir) |
# Requisição curl -X POST https://api.cofri.digital/withdraw/create \ -H "Authorization: Bearer TOKEN" \ -H "Content-Type: application/json" \ -d '{"code":"482913","asset":"DePix","amount":100000000,"address":"ares1p8x9j2m..."}' # Resposta 201 { "status": true, "message": "Envio realizado", "data": { "id": "f47ac10b-...", "asset": "DePix", "destination_address": "ares1p8x9j2m...", "amount": 100000000, "fee": 100100, "status": "confirmed", "created_at": "2026-07-08 10:00:00" } }
Endereço de destino inexistente retorna 422 INVALID_ADDRESS. Sem etapa de confirmação — o status já sai confirmed.
Paginado, filtro opcional status.
| Campo | Tipo | Descrição | |
|---|---|---|---|
| withdrawal_id | string | obrigatório | Só funciona com status pending/processing |
Libera o saldo bloqueado e dispara o webhook withdrawal.cancelled.
Compra e venda via Pix
Fluxo de conversão entre Real (Pix) e DePix. Comprar emite DePix novo (lastreado 1:1 pelo Pix recebido); vender resgata e destrói o DePix correspondente, pagando o cliente via Pix — não é uma transferência na Rede Ares.
# Resposta 200 { "status": true, "data": { "buy_fee_percent": 3.00, "buy_fee_fixed": 2.00, "sell_fee_percent": 3.00 } }
| Campo | Tipo | Descrição | |
|---|---|---|---|
| amount | float | obrigatório | Valor em BRL — mín. R$ 5,00, máx. R$ 5.000,00 |
| document | string | opcional* | CPF/CNPJ — obrigatório na primeira compra |
# Resposta 201 { "status": true, "data": { "order_id": "...", "qr_code": "00020126...", "amount": 100.00, "fee": 5.00, "net_amount": 95.00, "asset": "DePix", "status": "pending" } }
Acompanhe com GET /market/buy/status/{id} (status pending → completed) ou histórico em GET /market/buy/list. O DePix cai na carteira poucos minutos após a confirmação do Pix.
| Campo | Tipo | Descrição | |
|---|---|---|---|
| amount | float | obrigatório | Quantidade de DePix a liquidar |
| pix_key_type | string | obrigatório | CPF, CNPJ, EMAIL, PHONE ou EVP |
| pix_key | string | obrigatório | Chave Pix de destino |
| document | string | opcional* | CPF/CNPJ — obrigatório se ainda não cadastrado |
# Resposta 201 { "status": true, "message": "Solicitação de venda criada. O pagamento PIX será enviado em breve.", "data": { "order_id": "...", "net_brl": 96.90, "status": "pending" } }
Consulte o comprovante da liquidação (valores, taxa, status) via comprovante público usando o order_id como referência.
Endpoints públicos (sem login)
Permitem que qualquer pessoa compre DePix e consulte saldos/comprovantes sem criar conta — pensado para valores baixos, com limites de AML por endereço.
# Resposta 201 { "status": true, "data": { "address": "ares1xc5qezh9j6byqmpe53jbs8a2944...", "claim_token": "a1b2c3..." } }
claim_token aparece uma única vez — guarde-o para futuramente vincular este endereço a uma conta registrada.
| Campo | Tipo | Descrição | |
|---|---|---|---|
| address | string | obrigatório | Endereço Ares de destino |
| amount_brl | float | obrigatório | Máx. R$ 10,00 por compra; R$ 30,00/dia por endereço |
Retorna QR Pix (qr_code, qr_image). Acompanhe com GET /ares/purchase/status/{id} — o DePix cai no endereço em até 10 minutos após a confirmação.
# Resposta 200 { "status": true, "data": { "address": "ares1xc5...", "asset": "DePix", "available": 500000000, "available_formatted": "5.00" } }
Sem dados pessoais — apenas saldo do endereço. Limite: 30 consultas por minuto por IP.
/receipt/{txid} é usado para transferências e depósitos na Rede Ares (formato de explorador: origem, destino, status). /liquidacao/{txid} é usado para vendas de DePix por Pix (formato de comprovante COFRI: valor bruto, taxa, valor pago, chave Pix mascarada). Nenhum dos dois expõe e-mail, CPF ou nome — apenas dados da operação em si.
Webhooks
Receba notificações em tempo real em vez de fazer polling. Toda entrega inclui X-Cofri-Signature: sha256=HMAC-SHA256(corpo, seu_segredo) para você validar a origem.
| Campo | Tipo | Descrição | |
|---|---|---|---|
| name | string | obrigatório | Nome descritivo |
| url | string | obrigatório | HTTPS obrigatório |
| events | array | obrigatório | Ver eventos disponíveis abaixo |
# Payload de entrega { "event": "withdrawal.cancelled", "created": 1735689600, "data": { "withdrawal_id": "..." } }
secret retorna uma única vez, na criação — use-o para validar X-Cofri-Signature.
withdrawal.cancelled é de fato disparado em produção. Os demais tipos (deposit.confirmed, withdrawal.confirmed, balance.updated etc.) são aceitos na assinatura para compatibilidade futura, mas ainda não são emitidos — não dependa deles ainda. Para saber quando um depósito ou compra foi confirmado, use os endpoints de status/polling correspondentes.GET /webhook/events lista os tipos aceitos; GET /webhook/list lista seus webhooks cadastrados; GET /webhook/logs mostra o histórico de entregas; POST /webhook/test dispara uma entrega sintética imediata; POST /webhook/retry reenvia uma entrega específica; DELETE /webhook/{id} remove.
COFRI API v1.0.0 · 2026