IntroduçãoAPIs
IntroduçãoAPIs
  1. APIs
  • GraphQL API
  • Ativos
  1. APIs

Ativos

API de Cessões#

API REST para registro, consulta e acompanhamento do ciclo de vida de cessões de direitos creditórios (duplicatas, notas fiscais, debêntures e demais títulos representativos de crédito) destinadas à tokenização em estruturas TIDC.
O registro de uma cessão via API é o evento que dispara o mint do NFT representativo do recebível na rede blockchain configurada pelo fundo (Polygon, Base ou Arbitrum). Toda a cadeia de eventos posteriores — tokenização, liquidação, vencimento, recompra — é refletida tanto no banco de dados quanto on-chain.

Sumário#

Ambientes
Autenticação
Convenções
Formato de dados
Idempotência
Paginação
Tratamento de erros
O objeto Cessão
Endpoints
Criar cessão
Criar cessões em lote
Consultar cessão
Listar cessões
Atualizar status da cessão
Estados da cessão
Webhooks
Códigos de erro
Limites de uso
Changelog
Suporte

Ambientes#

AmbienteURL baseObservações
Sandboxhttps://api.sandbox.tokenone.com.br/v1Testes de integração. Cessões são mintadas em testnets (Polygon Amoy etc.).
Produçãohttps://api.tokenone.com.br/v1Operação real. Requer credenciais aprovadas pelo time comercial.
Recomendamos que toda integração seja validada em Sandbox antes da promoção para Produção. As contas e CNPJs de Sandbox são isolados — dados de produção não vazam para o ambiente de testes e vice-versa.

Autenticação#

A API utiliza OAuth 2.0 client credentials. Cada parceiro recebe um par client_id / client_secret no onboarding.

Obtenção do token#

Resposta:
{
  "access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...",
  "token_type": "Bearer",
  "expires_in": 3600,
  "scope": "cessoes:write cessoes:read"
}

Uso do token#

Inclua o token no header Authorization de toda requisição:

Escopos disponíveis#

EscopoPermissão
cessoes:readConsultar cessões e listagens
cessoes:writeCriar cessões e atualizar status
webhooks:manageGerenciar inscrições em webhooks
Tokens têm validade de 1 hora. Recomendamos cachear o token e renovar somente quando próximo da expiração — não solicite um token novo a cada requisição.

Convenções#

Formato de dados#

Encoding: application/json; charset=utf-8
Datas: ISO 8601 no formato YYYY-MM-DD (datas) ou YYYY-MM-DDTHH:mm:ssZ (timestamps, sempre em UTC)
Valores monetários: número decimal com até 2 casas após o ponto. Use ponto como separador decimal, nunca vírgula. Não envie como string.
CNPJ: 14 dígitos sem máscara (45678901000123, e não 45.678.901/0001-23)
Moeda: padrão ISO 4217 (BRL, USD)

Idempotência#

Toda requisição POST aceita o header Idempotency-Key com um UUID gerado pelo cliente. Em caso de reenvio (timeout, falha de rede), a API retornará exatamente a mesma resposta da primeira chamada sem criar registro duplicado.
A chave é válida por 24 horas. Após esse prazo, uma nova requisição com a mesma chave gerará um novo registro.

Paginação#

Endpoints de listagem usam paginação por cursor:
ParâmetroTipoDefaultMáximoDescrição
limitinteger50200Quantidade de registros por página
cursorstring——Cursor opaco devolvido pela página anterior
A resposta inclui o objeto meta:
{
  "data": [...],
  "meta": {
    "tem_proxima_pagina": true,
    "proximo_cursor": "eyJpZCI6IjEyM2U0NTY3In0",
    "total_estimado": 1247
  }
}

Tratamento de erros#

Erros seguem a especificação RFC 7807 — Problem Details for HTTP APIs:
{
  "type": "https://docs.tokenone.com.br/errors/cnpj-invalido",
  "title": "CNPJ inválido",
  "status": 422,
  "detail": "O dígito verificador do CNPJ do sacado não confere",
  "instance": "/v1/cessoes",
  "campo": "cnpj_sacado",
  "request_id": "req_8a2f1b3c9d4e5f6a"
}
Sempre inclua o request_id em comunicações com o suporte da TokenOne — ele permite localizar a chamada exata nos logs.

O objeto Cessão#

{
  "id_cessao": "f7d3a91e-2b8c-4e5f-9a01-3c8d7e6f2a14",
  "numero_documento": "NF000148",
  "tipo_documento": "NOTA_FISCAL",
  "cnpj_cedente": "45678901000123",
  "cnpj_sacado": "11111111000101",
  "valor_futuro": 57286.48,
  "valor_presente": 54822.10,
  "taxa_desconto_aa": 0.2680,
  "prazo_dias": 61,
  "data_cessao": "2025-11-15",
  "data_vencimento": "2026-01-15",
  "data_pagamento": null,
  "rating": "A",
  "moeda": "BRL",
  "status": "TOKENIZADA",
  "lastro": {
    "url": "https://docs.tokenone.com.br/nf/abc123.pdf",
    "hash_sha256": "9af15b3e7c4d2a..."
  },
  "tokenizacao": {
    "rede": "polygon",
    "contrato": "0xAb12cD34eF56...",
    "token_id": "1247",
    "tx_hash": "0x8f7e6d5c4b3a...",
    "status_onchain": "MINTADA",
    "mintada_em": "2025-11-15T14:23:08Z"
  },
  "metadados": {
    "fundo_destino": "TIDC-PRIVATE-CREDIT-I",
    "tranche": "SENIOR"
  },
  "criado_em": "2025-11-15T14:22:31Z",
  "atualizado_em": "2025-11-15T14:23:08Z"
}

Campos#

CampoTipoObrigatórioDescrição
id_cessaoUUIDgeradoIdentificador único da cessão (gerado pela TokenOne)
numero_documentostringsimNúmero do documento de origem (NF, duplicata etc.)
tipo_documentoenumsimNOTA_FISCAL, DUPLICATA, CCB, CRA, CRI, DEBENTURE
cnpj_cedentestring(14)simCNPJ do cedente (originador do crédito), apenas dígitos
cnpj_sacadostring(14)simCNPJ do sacado (devedor)
valor_futurodecimalsimValor de face — montante que o sacado pagará no vencimento
valor_presentedecimalsimValor pago pelo cessionário na data da cessão (≤ valor_futuro)
taxa_desconto_aadecimalcalculadoTaxa de desconto anual implícita (calculada pela API)
prazo_diasintegercalculadoDias corridos entre data_cessao e data_vencimento
data_cessaodatesimData em que o direito creditório foi transferido
data_vencimentodatesimData em que o sacado deve liquidar o título
data_pagamentodatenãoData efetiva da liquidação (preenchida via PATCH)
ratingenumsimA, B, C, D, E
moedastring(3)nãoISO 4217. Default BRL
statusenumgeradoVer Estados da cessão
lastro.urlstringsimURL pública (signed URL) do documento que lastreia o crédito
lastro.hash_sha256string(64)simHash SHA-256 hexadecimal do arquivo de lastro (garante integridade)
tokenizacaoobjectgeradoEstado da operação on-chain (preenchido após o mint)
metadadosobjectnãoCampos customizados livres (até 16 chaves, 256 chars por valor)

Endpoints#

Criar cessão#

Registra uma nova cessão e dispara o processo de tokenização.

Request#

Respostas#

201 Created — Cessão registrada. O mint on-chain ocorre de forma assíncrona; acompanhe pelo webhook cessao.tokenizada ou pelo endpoint de consulta.
{
  "id_cessao": "f7d3a91e-2b8c-4e5f-9a01-3c8d7e6f2a14",
  "numero_documento": "NF000148",
  "status": "REGISTRADA",
  "taxa_desconto_aa": 0.2680,
  "prazo_dias": 61,
  "tokenizacao": {
    "rede": "polygon",
    "contrato": "0xAb12cD34eF56...",
    "token_id": null,
    "tx_hash": null,
    "status_onchain": "PENDENTE_MINT"
  },
  "criado_em": "2025-11-15T14:22:31Z",
  "_links": {
    "self": "/v1/cessoes/f7d3a91e-2b8c-4e5f-9a01-3c8d7e6f2a14"
  }
}
409 Conflict — Já existe cessão para a tupla (numero_documento, cnpj_cedente, data_cessao).
422 Unprocessable Entity — Validação falhou (CNPJ inválido, valor_presente > valor_futuro, datas inconsistentes etc.).

Criar cessões em lote#

Para volumes maiores, registra até 500 cessões em uma única chamada. Cada item é validado individualmente; itens inválidos não bloqueiam os demais.

Request#

{
  "lote_id": "lote-banrisul-2025-11-15-001",
  "cessoes": [
    { "numero_documento": "NF000148", "...": "..." },
    { "numero_documento": "NF000149", "...": "..." }
  ]
}

Resposta 207 Multi-Status#

{
  "lote_id": "lote-banrisul-2025-11-15-001",
  "total": 2,
  "sucesso": 1,
  "falha": 1,
  "resultados": [
    {
      "indice": 0,
      "numero_documento": "NF000148",
      "status_http": 201,
      "id_cessao": "f7d3a91e-2b8c-4e5f-9a01-3c8d7e6f2a14"
    },
    {
      "indice": 1,
      "numero_documento": "NF000149",
      "status_http": 422,
      "erro": {
        "type": "https://docs.tokenone.com.br/errors/cnpj-invalido",
        "title": "CNPJ inválido",
        "campo": "cnpj_sacado"
      }
    }
  ]
}
Reprocesse apenas os itens com falha; não reenvie o lote inteiro.

Consultar cessão#

Resposta 200 OK#

Retorna o objeto Cessão completo.

Listar cessões#

Parâmetros de query#

ParâmetroTipoDescrição
cnpj_cedentestringFiltra por CNPJ do cedente
cnpj_sacadostringFiltra por CNPJ do sacado
statusenumFiltra por status. Aceita múltiplos: ?status=REGISTRADA,TOKENIZADA
data_cessao_iniciodateData mínima de cessão (inclusiva)
data_cessao_fimdateData máxima de cessão (inclusiva)
vence_em_diasintegerCessões a vencer nos próximos N dias
ratingenumFiltra por rating
limitintegerTamanho da página (default 50, máximo 200)
cursorstringCursor de paginação

Exemplo#


Atualizar status da cessão#

Usado principalmente para registrar liquidações, vencimentos confirmados ou cancelamentos. Transições inválidas retornam 422.

Request#

{
  "novo_status": "LIQUIDADA",
  "data_pagamento": "2026-01-14",
  "valor_recebido": 57286.48,
  "observacao": "Liquidação antecipada em 1 dia"
}

Resposta 200 OK#

Retorna o objeto Cessão atualizado.

Estados da cessão#

REGISTRADA ──► TOKENIZADA ──► LIQUIDADA
                          └─► VENCIDA ──► RECUPERADA
                          └─► CANCELADA
StatusDescrição
REGISTRADACessão validada e gravada. Mint on-chain pendente.
TOKENIZADANFT mintado com sucesso. Token está no wallet do fundo destino.
LIQUIDADASacado pagou o título integralmente. Token queimado on-chain.
VENCIDAData de vencimento ultrapassada sem pagamento.
RECUPERADACessão vencida que foi posteriormente recuperada (parcial ou totalmente).
CANCELADACessão cancelada antes da liquidação (recompra, erro de registro etc.).
Importante: a vencer não é um status. Trata-se de um filtro de consulta (vence_em_dias=N) sobre cessões TOKENIZADA cuja data_vencimento ainda não passou.

Webhooks#

Em vez de fazer polling, recomendamos assinar webhooks para receber notificações em tempo real.

Eventos disponíveis#

EventoDisparado quando…
cessao.registradaCessão validada e persistida
cessao.tokenizadaNFT mintado com sucesso na blockchain
cessao.tokenizacao_falhouMint falhou após 3 tentativas
cessao.liquidadaStatus alterado para LIQUIDADA
cessao.vencidaCessão atingiu data_vencimento sem pagamento
cessao.canceladaCessão cancelada

Inscrição#

Payload entregue#

{
  "evento": "cessao.tokenizada",
  "id_evento": "evt_8a2f1b3c9d4e5f6a",
  "ocorrido_em": "2025-11-15T14:23:08Z",
  "dados": {
    "id_cessao": "f7d3a91e-2b8c-4e5f-9a01-3c8d7e6f2a14",
    "numero_documento": "NF000148",
    "tokenizacao": {
      "rede": "polygon",
      "contrato": "0xAb12cD34eF56...",
      "token_id": "1247",
      "tx_hash": "0x8f7e6d5c4b3a..."
    }
  }
}

Verificação de assinatura#

Todo webhook inclui o header X-TokenOne-Signature com HMAC-SHA256 do corpo da requisição usando a secret configurada:
Exemplo de verificação em Node.js:

Política de reentrega#

Webhooks que retornarem status diferente de 2xx são reenviados com backoff exponencial: 1min, 5min, 30min, 2h, 6h, 24h. Após 6 tentativas, o evento é marcado como falho e disponibilizado no dashboard para reenvio manual.

Códigos de erro#

HTTPtype (slug)Significado
400requisicao-malformadaJSON inválido ou campos ausentes
401nao-autenticadoToken ausente, expirado ou inválido
403escopo-insuficienteToken não tem o escopo necessário
404recurso-nao-encontradoid_cessao não existe
409cessao-duplicadaCessão já registrada para a tupla informada
422cnpj-invalidoCNPJ não passou na validação do dígito verificador
422valor-presente-maior-que-futurovalor_presente > valor_futuro
422datas-inconsistentesdata_cessao > data_vencimento etc.
422transicao-status-invalidaTentativa de transição não permitida na máquina de estados
422hash-lastro-divergenteHash informado não bate com o do arquivo em lastro.url
429rate-limit-excedidoVeja Limites de uso
500erro-internoFalha inesperada. Reporte ao suporte com o request_id
503servico-indisponivelManutenção ou indisponibilidade temporária
A lista completa fica em docs.tokenone.com.br/errors.

Limites de uso#

PlanoRequisições/minCessões/mês
Sandbox60ilimitado
Standard30010.000
Institucional1.500sob contrato
Headers de resposta em toda chamada:
Ao receber 429, respeite o header Retry-After (em segundos).

Changelog#

v1.0.0 — 2025-11-15#

Lançamento da API de Cessões
Endpoints: criação individual e em lote, consulta, listagem, atualização de status
Webhooks para os 6 eventos do ciclo de vida
Suporte a redes Polygon, Base e Arbitrum

Suporte#

E-mail técnico: developers@tokenone.com.br
Status da plataforma: status.tokenone.com.br
Comercial e parcerias: comercial@tokenone.com.br
Para questões regulatórias relacionadas à Resolução CVM 88 e à conformidade do TIDC, contate diretamente o time jurídico da TokenOne pelo canal institucional.
Página anterior
GraphQL API
Built with