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.

https://api.cofri.digital

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
Assinatura opcional de corpo (HMAC): se a sua chave de API tiver um segredo configurado, você pode assinar o corpo da requisição com 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
}
HTTPCódigoQuando acontece
400VALIDATION_ERRORParâmetro obrigatório ausente ou mal formatado
401UNAUTHORIZEDToken ausente, inválido ou expirado
401INVALID_API_KEYChave de API inexistente ou revogada
403FORBIDDENPermissão insuficiente ou conta não verificada
404NOT_FOUNDRecurso não encontrado
422VALIDATION_ERRORDados válidos no formato, mas reprovados por regra de negócio
422INSUFFICIENT_FUNDSSaldo insuficiente para a operação
422INVALID_ADDRESSEndereço de destino não existe na Rede Ares
422ASSET_NOT_FOUNDAtivo inexistente ou desativado
429RATE_LIMIT_EXCEEDEDLimite de requisições excedido (cabeçalho Retry-After)
500INTERNAL_ERRORErro 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 }
}
Ativo suportado: hoje a Rede Ares opera apenas com DePix (paridade 1:1 com o Real). Outros símbolos existem no schema por herança histórica, mas estão desativados.

Conta

POST/auth/loginAutenticar e obter tokens
CampoTipoDescrição
emailstringobrigatórioE-mail cadastrado
passwordstringobrigatórioSenha 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.

POST/auth/registerCriar conta e carteira
CampoTipoDescrição
emailstringobrigatórioE-mail válido, único
passwordstringobrigatórioMínimo 8 caracteres
namestringobrigatórioNome 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.

POST/auth/verify-emailConfirmar e-mail e logar
CampoTipoDescrição
tokenstringobrigatórioToken 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.

POST/auth/refreshRenovar o access token
CampoTipoDescrição
refresh_tokenstringobrigatórioTambém aceito via Authorization: Bearer
# Resposta 200
{ "status": true, "data": { "access_token": "eyJ...", "token_type": "Bearer", "expires_in": 3600 } }
GET/auth/meDados do usuário autenticado
🔒 Bearer token

Retorna {"user": {...}}. Perfil pode ser atualizado em PUT /user/profile (name, phone, company_name) e a senha em POST /user/change-password.

Carteira

GET/wallet/balanceSaldo em todos os ativos
🔒 Bearer token
# 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.

GET/wallet/assetsAtivos ativos na plataforma
🔒 Bearer token
# Resposta 200
{ "status": true, "data": [
  { "symbol": "DePix", "name": "DePix", "precision": 8,
    "withdrawal_fee_flat": 100, "withdrawal_fee_percent": 0.001, "min_withdrawal": 100000000 }
] }
GET/wallet/address?asset=DePixEndereço de recebimento
🔒 Bearer token

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.

POST/wallet/api-keysCriar chave de API
🔒 Bearer token
CampoTipoDescrição
namestringobrigatórioNome descritivo da chave
permissionsarrayopcionalPadrão ["read"]
ip_whitelistarrayopcionalRestringe 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.

POST/deposit/createPreparar endereço de depósito
🔒 Bearer token
CampoTipoDescrição
assetstringopcionalPadrão DePix
# Resposta 201
{ "status": true, "data": {
  "address": "ares14rywca3ntxugbzd8wj3vwa9g79b40nsadb1", "asset": "DePix",
  "network": "ares", "min_deposit": null, "qr_code": "ares:ares14ry..."
} }
GET/deposit/status/{id}Status de um depósito
🔒 Bearer token

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.

GET/deposit/listHistórico de depósitos
🔒 Bearer token

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.

GET/withdraw/fee?asset=DePix&amount=100000000Estimar taxa antes de enviar
🔒 Bearer token
# Resposta 200
{ "status": true, "data": { "fee": 100100, "asset": "DePix", "amount": 100000000, "net": 99899900 } }
POST/withdraw/send-codeEnviar código de confirmação por e-mail
🔒 Bearer token

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.

POST/withdraw/createEnviar DePix para outro endereço
🔒 Bearer token
CampoTipoDescrição
codestringobrigatórioCódigo de /withdraw/send-code
assetstringobrigatórioEx.: DePix
amountintegerobrigatórioBase units (8 casas). Ex.: 1 DePix = 100000000
addressstringobrigatórioEndereç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.

GET/withdraw/listHistórico de envios
🔒 Bearer token

Paginado, filtro opcional status.

POST/withdraw/cancelCancelar envio pendente
🔒 Bearer token
CampoTipoDescrição
withdrawal_idstringobrigatórioSó 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.

GET/market/feesTaxas vigentes (público)
# Resposta 200
{ "status": true, "data": { "buy_fee_percent": 3.00, "buy_fee_fixed": 2.00, "sell_fee_percent": 3.00 } }
POST/market/buyGerar cobrança Pix para comprar DePix
🔒 Bearer token
CampoTipoDescrição
amountfloatobrigatórioValor em BRL — mín. R$ 5,00, máx. R$ 5.000,00
documentstringopcional*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.

POST/market/sellLiquidar DePix por Pix
🔒 Bearer token
CampoTipoDescrição
amountfloatobrigatórioQuantidade de DePix a liquidar
pix_key_typestringobrigatórioCPF, CNPJ, EMAIL, PHONE ou EVP
pix_keystringobrigatórioChave Pix de destino
documentstringopcional*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" } }
Aprovação manual: toda liquidação passa por conferência da COFRI antes do Pix ser enviado — o saldo em DePix fica bloqueado (não disponível, mas também não perdido) até a confirmação. Valor líquido mínimo: R$ 2,00.

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.

POST/ares/address/createGerar endereço sem conta
# 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.

POST/ares/purchase/createComprar DePix sem conta
CampoTipoDescrição
addressstringobrigatórioEndereço Ares de destino
amount_brlfloatobrigatórioMá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.

GET/ares/balance/{address}Consultar saldo público
# 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.

GET/receipt/{txid} · /liquidacao/{txid}Comprovante público de transação

/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.

POST/webhook/createRegistrar endpoint
🔒 Bearer token
CampoTipoDescrição
namestringobrigatórioNome descritivo
urlstringobrigatórioHTTPS obrigatório
eventsarrayobrigatórioVer 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.

Evento ativo hoje: apenas 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 · /webhook/list · /webhook/logsGerenciar assinaturas
🔒 Bearer token

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