Cumbuca Gateway API — Início rápido
Referência para a API de compartilhamento de dados do Cumbuca Open Finance: diretório de participantes, ciclo de vida do consentimento de compartilhamento de dados, endpoints de consumo de dados da Fase 2 e o portal compartilhado de gestão de consentimentos.
Contexto — Open Finance Brasil
Esta seção é uma introdução de alto nível para leitores que não conhecem o ecossistema. Se você já sabe como o Open Finance Brasil funciona, vá direto para Visão geral.
O que é o Open Finance Brasil
O Open Finance Brasil é um programa regulado pelo Banco Central que permite que clientes (pessoas físicas e jurídicas) compartilhem seus dados financeiros entre instituições de forma padronizada e segura. A mesma ideia que impulsionou a interoperabilidade do Pix é aplicada ao restante da estrutura financeira: contas, cartões, crédito, investimentos e câmbio.
O Banco Central (BACEN) define as regras e publica as APIs reguladas; um Conselho Deliberativo coordenado por uma estrutura de governança de toda a indústria as operacionaliza por meio de grupos de trabalho (segurança, experiência do cliente, infraestrutura etc.). A conformidade não é opcional — toda instituição regulada deve expor as APIs padrão da forma como a especificação define.
Papéis de participação
Cada instituição participa do ecossistema em um ou mais papéis. Para o compartilhamento de dados, os papéis se dividem em um lado passivo (detém os dados) e um lado ativo (solicita os dados):
| Papel | Descrição |
|---|---|
| Transmissor de Dados passivo | Tipicamente bancos; atende requisições de dados em nome de clientes que consentiram. |
| Receptor de Dados ativo | Tipicamente fintechs / assessores; solicita dados de clientes para viabilizar seu produto. |
Uma instituição pode ter múltiplos papéis simultaneamente (dados e pagamentos). Para esta referência de compartilhamento de dados, a tag relevante no diretório de participantes é DADOS — é o que você verá filtrado em GET /participants.
Cliente vs. servidor no protocolo. A divisão passivo/ativo se alinha diretamente com a divisão cliente/servidor do OAuth. O Receptor de Dados desempenha o papel de cliente OAuth — ele se registra via DCR, solicita autorização, detém o token de acesso e realiza as chamadas de API. O Transmissor de Dados desempenha o papel de Servidor de Autorização (AS) e servidor de recursos — ele autentica o usuário, emite consentimentos e tokens, e serve os endpoints regulados. Portanto, quando você ler "AS" na especificação FAPI-BR, pense no banco que detém os dados do cliente; quando ler "cliente", pense na fintech que conduz a integração.
Fases de implementação
O programa foi implementado em quatro fases. Os rótulos ainda são usados em todo lugar na especificação e nas conversas:
- Fase 1 — Dados Abertos. Informações públicas, sem necessidade de consentimento, sobre instituições, produtos, tarifas e agências.
- Fase 2 — Dados do Cliente. Compartilhamento consentido de dados de propriedade do cliente: contas, cartões, operações de crédito, investimentos e câmbio. A maioria dos GETs que você encontrará em Consumo de Dados pertence a esta fase.
- Fase 3 — Serviços. Iniciação de pagamentos e portabilidade de crédito (fora do escopo desta referência).
- Fase 4 — Extensões. Refinamentos contínuos das fases anteriores.
Como as instituições se comunicam
Dois padrões transversais regem cada requisição entre instituições:
- mTLS (TLS mútuo). Ambos os lados apresentam certificados X.509 emitidos por ACs aprovadas (CertiSign, Serpro, Soluti). O handshake TLS em si é a primeira camada de autenticação — uma instituição que não está no diretório não consegue nem abrir uma conexão.
- Assinatura de mensagens (JWS). Corpos de requisição e resposta sensíveis (como a recuperação de consentimento recorrente) são encapsulados em um JWS compacto — o corpo é uma string
header.payload.signatureem base64url, assinada com um certificado de assinatura separado. Isso garante a integridade de ponta a ponta, mesmo quando a mensagem passa por proxies.
Esses dois combinados implementam o perfil de segurança FAPI-BR — uma versão regional brasileira do padrão Financial-grade API da OpenID Foundation. Sobre o FAPI-BR, os blocos de construção padrão OAuth 2.0 / OIDC são utilizados:
- DCR (Dynamic Client Registration) — as instituições registram seus clientes OAuth de forma programática.
- PAR (Pushed Authorisation Request) — a requisição de autorização é pré-registrada no lado do detentor, de modo que a URL de redirecionamento que o usuário vê é curta, assinada e à prova de adulteração.
- Fluxo de redirecionamento OIDC — o usuário é enviado ao banco do detentor, autentica-se, autoriza e é redirecionado de volta para o
callbackApplicationUrido iniciador.
Para integrações pela primeira vez, toda essa orquestração — consulta ao diretório, DCR, troca de tokens, PAR, handshake mTLS — ocorre a cada chamada. São muitas partes móveis.
Fluxo simplificado de requisição — juntando as peças para uma leitura típica de dados autorizada:
┌─────────────────────┐ ┌──────────────────────┐
│ Cliente │ │ Diretório │
│ (navegador / app) │ │ (Open Finance BR) │
└──────────┬──────────┘ └──────────┬───────────┘
│ │
│ 1. clica em "conectar banco" │ (lista participantes
▼ │ ativos, certificados,
┌─────────────────────┐ 0. descoberta (GET lista) ────▶ metadados)
│ Cliente │◀────────────────────────────────┤
│ (Receptor) │ │
│ lado ativo │ └──────────────┘
│ ─ cliente OAuth ─ │
└──────────┬──────────┘
│
│ 2. DCR + PAR + criação do consentimento
│ (mTLS + JWS, via HTTPS)
▼
┌─────────────────────┐ 3. redirect do navegador ──▶ ┌─────────────┐
│ Servidor de │ usuário autentica e │ Cliente │
│ Autorização (AS) │ autoriza o consentimento │ autoriza │
│ Transmissor │◀───── 4. callback ───────────────│ no AS │
│ de Dados │ └─────────────┘
│ lado passivo │
│ ─ servidor OAuth ─ │
└──────────┬──────────┘
│
│ 5. chamada de API autorizada
│ (mTLS + token de acesso + payload JWS)
▼
┌─────────────────────┐
│ Servidor de │ 6. resposta (assinada com JWS
│ recursos no AS │ para endpoints sensíveis)
└─────────────────────┘
Cada seta entre cliente e AS usa mTLS. Etapas que expõem dados privados (etapas 2 e 5/6) também carregam payloads assinados com JWS. O navegador do cliente só está envolvido nas etapas 3 e 4 — o redirecionamento que dispara a autenticação e traz o usuário de volta.
O consentimento no centro
Toda leitura de dados entre instituições é ancorada em um consentimento. O consentimento é um artefato regulado criado no lado do detentor e vinculado a:
- O documento de identificação do cliente (CPF ou CNPJ).
- As permissões sendo autorizadas.
- Uma janela de expiração.
- A instituição ativa (o receptor de dados) que o solicitou.
Até que o consentimento esteja no estado AUTHORISED, nenhum recurso protegido pode ser lido. Após expirar, o detentor recusará a chamada. Monitorar o estado do consentimento e reagir a ele — veja GET /consents/v1/consents/{id} — é, portanto, central para qualquer integração.
O papel da Cumbuca
A Cumbuca atua como a infraestrutura regulatória para instituições que desejam participar como receptores de dados sem precisar construir toda a pilha FAPI-BR internamente. A estrutura de dois prefixos que você verá ao longo desta referência reflete isso:
/consent-management/...— camada de orquestração da Cumbuca. Uma única chamada HTTP encadeia internamente DCR → token → criação do consentimento → PAR → URL de redirecionamento, de modo que o integrador lida com apenas uma requisição por operação de negócio./open-finance/...— proxy transparente para as APIs reguladas. mTLS e verificação JWS das respostas ocorrem dentro do proxy.
O restante deste documento é a referência da API dessas duas camadas.
Visão geral
A superfície da API está organizada em três grupos, todos servidos sob o mesmo PARTNER_BASE_URL, salvo indicação em contrário:
/consent-management/...— endpoints de orquestração da Cumbuca. Encadeiam internamente DCR → Token → Criação de consentimento → PAR → URL de redirecionamento, de modo que o cliente precisa chamar apenas um endpoint HTTP por operação de negócio./open-finance/...— proxy transparente para as APIs reguladas do Open Finance Brasil. mTLS, assinatura JWS de requisições/respostas e outras partes da infraestrutura regulatória são tratadas pelo proxy.https://[sandbox.]directory.openbankingbrasil.org.br/participants— Diretório oficial de participantes do OF Brasil. Exposto pela API da Cumbuca como/consent-management/v1/participants.
Como o Acesso Funciona
A autenticação na API da Cumbuca é construída em duas camadas: mTLS em cada conexão e um JWS por consentimento emitido pela Cumbuca quando o consentimento é criado e apresentado pelo cliente em cada chamada protegida subsequente.
- O cliente chama
POST /consent-management/v1/consentsvia mTLS usando um certificado emitido pela CA da Cumbuca. - No
201, a Cumbuca retorna o payload regulado (data.consentId,data.redirectUrl,data.consent) e adiciona um cabeçalho de resposta customizado:x-cumbuca-consent-token. - O cliente persiste o
x-cumbuca-consent-tokenjunto aoconsentIdpara uso posterior. - O usuário é redirecionado para
data.callbackApplicationUri, autoriza o consentimento no banco e é redirecionado de volta.
O token é um JWT assinado (JWS) emitido pela Cumbuca e vincula o consentimento à identidade mTLS do cliente:
sub— oserialNumberdo certificado mTLS do cliente (tipicamente o CNPJ do cliente).consentId— mesmo valor dedata.consentIdda resposta upstream.- Sem claim
exp— o tempo de vida do token é vinculado ao próprio consentimento.
Em cada chamada subsequente a um endpoint protegido por consentimento (as leituras de dados sob /open-finance/...), o cliente deve:
- Usar o mesmo certificado mTLS que foi usado para inicializar o consentimento.
- Enviar
x-cumbuca-consent-tokencom o JWS persistido na etapa de inicialização. - Enviar
x-consent-idex-authorisation-server-idnormalmente.
A Cumbuca então realiza três verificações antes de encaminhar a chamada para a API regulada:
- O JWS é assinado por uma chave pré-configurada no ambiente da Cumbuca.
subcorresponde aoserialNumberdo certificado mTLS na conexão atual.- O
consentIddentro do JWS corresponde ao headerx-consent-id.
Se as três verificações passarem, a resposta upstream flui de volta para o cliente sem alterações.
x-cumbuca-consent-token exceto os dois que não operam sobre um consentimento existente: GET /participants e POST /consents/v1/consents (que é a chamada que emite o token).
sub com serialNumber vincula cada chamada protegida de volta à identidade mTLS exata que criou originalmente o consentimento.
Headers Comuns
Toda requisição à API parceira utiliza alguma combinação dos seguintes headers:
| Header | Obrigatório quando | Valor |
|---|---|---|
Authorization | Sempre | Bearer <token> — token de acesso obtido em POST /auth/v1/token |
x-authorisation-server-id | Toda chamada exceto GET /participants | ID do Servidor de Autorização da instituição de destino (obtido no diretório) |
x-cumbuca-consent-token | Toda chamada protegida (ou seja, todo endpoint exceto GET /participants e POST /consents/v1/consents) | JWS retornado no header de resposta da chamada de criação do consentimento |
x-consent-id | Leituras de dados da Fase 2 | consentId retornado pela chamada de criação do consentimento |
content-type | POSTs com corpo JSON | application/json |
Formato de Erros
A API retorna erros como JSON no corpo da resposta para qualquer status HTTP não-2xx. O formato segue o padrão regulado do Open Finance Brasil:
{
"errors": [
{
"code": "INVALID_REQUEST",
"title": "Validation failed",
"detail": "data.payment.amount must be a string"
}
]
}
Múltiplas entradas em errors[] são possíveis quando várias falhas de validação são reportadas na mesma resposta.
URIs de Callback
Os endpoints de criação de consentimento aceitam um callbackApplicationUri no corpo da requisição. Após o usuário autorizar (ou rejeitar) o consentimento no banco, o banco o redireciona de volta para essa URI com parâmetros de status na query string. Cada fluxo de negócio usa convencionalmente seu próprio caminho de callback para que o handler de redirecionamento consiga rotear adequadamente:
| Fluxo | callbackApplicationUri sugerida |
|---|---|
| Compartilhamento de dados | https://<your-host>/consent/callback |
Início Rápido — Compartilhamento de Dados
Fluxo completo para leitura de dados da conta bancária de um usuário: solicitar consentimento, escolher uma conta e obter suas transações.
-
Obtenha um token de acesso — chame
POST /auth/v1/tokencom seuclient_ideclient_secretusando o fluxo Client Credentials. Inclua oaccess_tokenretornado comoAuthorization: Bearer <token>em todas as requisições seguintes. -
Escolha o banco do usuário — chame
GET /consent-management/v1/participantse filtre pelo papelDADOS. Capture oauthorisationServerIdescolhido. -
Crie o consentimento de compartilhamento de dados — chame
POST /consent-management/v1/consentscom o documento do usuário e as permissões necessárias (no mínimoACCOUNTS_READ,ACCOUNTS_TRANSACTIONS_READeRESOURCES_READ). Você receberá de volta umconsentIde umaredirectUrl. -
Envie o usuário ao banco — redirecione o navegador para a
redirectUrlretornada. O usuário autentica e autoriza o compartilhamento no site do banco e é redirecionado de volta para seucallbackApplicationUri. -
Confirme que o consentimento está autorizado — quando o callback chegar, chame
GET /consent-management/v1/consents/{consentId}e verifique sestatus == "AUTHORISED". Se forREJECTED, pare aqui e exiba um erro. -
Liste as contas do usuário — chame
GET /open-finance/accounts/v2/accountscom oconsentIdautorizado no headerx-consent-id. Escolha oaccountIdque deseja consultar (por exemplo, a primeira conta corrente). -
Leia as transações — chame
GET /open-finance/accounts/v2/accounts/{accountId}/transactionsusando os mesmos headers. A resposta contém o histórico de transações emdata[].
Autenticação
Toda requisição à Cumbuca Gateway API requer um token Bearer OAuth 2.0 no header Authorization. Obtenha um token chamando POST /auth/v1/token com as credenciais do seu cliente antes de qualquer outra chamada. Os tokens têm vida curta — reutilize-os até o vencimento e depois solicite um novo.
POST/auth/v1/token
Emite um token de acesso Bearer usando o fluxo Client Credentials do OAuth 2.0. As credenciais são enviadas via HTTP Basic auth (base64(client_id:client_secret)), a forma canônica do OAuth.
Content-Type | obrigatório application/x-www-form-urlencoded |
Authorization | obrigatório Basic <base64(client_id:client_secret)> |
| Campo | Valor |
|---|---|
grant_type | client_credentials |
scope | Opcional — lista de escopos separados por espaço |
POST /auth/v1/token
Content-Type: application/x-www-form-urlencoded
Authorization: Basic <base64(client_id:client_secret)>
grant_type=client_credentials
{
"access_token": "eyJhbGciOiJSUzI1NiJ9...",
"token_type": "Bearer",
"expires_in": 3600,
"refresh_token": "dGhpcyBpcyBhIHJlZnJlc2ggdG9rZW4...",
"refresh_token_expires_in": 2592000
}
Authorization: Bearer <access_token>
POST/auth/v1/token grant refresh_token
A renovação do token de acesso usa o mesmo endpoint de token, com o grant refresh_token do OAuth 2.0 — não há um path separado. Envie o refresh token como campo de formulário; as credenciais do cliente continuam no header HTTP Basic. Pode também rotacionar o próprio refresh token.
Content-Type | obrigatório application/x-www-form-urlencoded |
Authorization | obrigatório Basic <base64(client_id:client_secret)> |
| Campo | Valor |
|---|---|
grant_type | refresh_token |
refresh_token | O refresh token retornado em uma resposta anterior |
POST /auth/v1/token
Content-Type: application/x-www-form-urlencoded
Authorization: Basic <base64(client_id:client_secret)>
grant_type=refresh_token&refresh_token=<seu-refresh-token>
Diretório
GET/consent-management/v1/participants
Retorna todas as instituições registradas no diretório de participantes do Open Finance Brasil. Os clientes devem filtrar pelos papéis que lhes interessam — tipicamente DADOS (dados) e CONTA (pagamentos) — e pela claim Status == "Active".
Authorization | obrigatório Token Bearer |
[
{
"CustomerFriendlyName": "Banco X",
"CustomerFriendlyLogoUri": "https://...",
"AuthorisationServerIds": ["asid-uuid"],
"OrgDomainRoleClaims": [
{ "Role": "DADOS", "Status": "Active" },
{ "Role": "CONTA", "Status": "Active" }
],
"ApiResources": [{ "ApiFamilyType": "accounts" }],
"Organisations": [{ "RegisteredName": "BANCO X S.A." }]
}
]
Consentimento de Compartilhamento de Dados
POST/consent-management/v1/consents
Cria um consentimento de compartilhamento de dados (Fase 2). Retorna um consentId e uma redirectUrl para a qual o usuário final deve ser redirecionado a fim de autorizar o consentimento no banco detentor dos dados.
x-authorisation-server-id | obrigatório |
x-cumbuca-consent-token | Token JWS vinculado a este consentimento e à identidade mTLS do chamador. Persista-o — toda chamada subsequente contra este consentimento vai requê-lo. Veja Como o Acesso Funciona. |
{
"data": {
"callbackApplicationUri": "https://.../consent/callback",
"loggedUser": {
"document": { "identification": "12345678901", "rel": "CPF" }
},
"businessEntity": { // opcional — quando o usuário logado atua como representante de pessoa jurídica
"document": { "identification": "12345678000199", "rel": "CNPJ" }
},
"permissions": [
"ACCOUNTS_READ", "ACCOUNTS_BALANCES_READ",
"RESOURCES_READ"
],
"expirationDateTime": "2026-05-28T15:10:00Z"
}
}
| Campo | Tipo | Observações |
|---|---|---|
data.callbackApplicationUri | string | obrigatório URI absoluta |
data.loggedUser.document.identification | string | obrigatório CPF ou CNPJ (somente dígitos) |
data.loggedUser.document.rel | enum | obrigatório "CPF" ou "CNPJ" |
data.businessEntity | object | opcional Presente quando o usuário logado representa uma pessoa jurídica |
data.permissions | string[] | obrigatório Strings de permissão reguladas do OF; veja apêndice |
data.expirationDateTime | ISO 8601 | obrigatório Tempo de vida máximo do consentimento |
{
"data": {
"consentId": "urn:cumbuca:C123ABC...",
"redirectUrl": "https://auth.bank.example/oauth2/authorize?..."
}
}
GET/consent-management/v1/consents/{consentId}
Retorna o estado atual de um consentimento de compartilhamento de dados: status (AWAITING_AUTHORISATION, AUTHORISED, REJECTED, CONSUMED), permissões e expiração. Útil para polling após o usuário ser redirecionado de volta do banco e para exibir o estado do consentimento em telas de gestão.
consentId | obrigatório ID retornado pela chamada de criação do consentimento |
x-authorisation-server-id | obrigatório |
x-cumbuca-consent-token | obrigatório JWS retornado quando o consentimento foi criado |
{
"data": {
"consentId": "urn:raidiambank:c4bb1a06-8dcf-4935-9696-b40bf6911f50",
"consent": {
"data": {
"consentId": "urn:raidiambank:c4bb1a06-...",
"status": "AUTHORISED",
"creationDateTime": "2026-01-29T16:34:29Z",
"statusUpdateDateTime": "2026-01-29T16:34:41Z",
"expirationDateTime": "2026-07-29T16:34:27Z",
"permissions": ["ACCOUNTS_READ", "ACCOUNTS_BALANCES_READ", "RESOURCES_READ"]
},
"links": { "self": "https://matls-api.<bank>/open-finance/consents/v3/consents/<consentId>" },
"meta": { "requestDateTime": "2026-01-29T16:35:00Z" }
}
}
}
data.consent externo é o payload regulado literal retornado pelo banco detentor dos dados (com suas próprias seções data / links / meta conforme a especificação do OF Brasil), e o data.consentId externo é um campo de conveniência adicionado pela camada de orquestração para que os chamadores não precisem acessar data.consent.data.consentId.
Consumo de Dados (Fase 2) — GETs Autenticados
Todos os endpoints nesta seção seguem o mesmo formato:
- Método: GET
- Headers:
x-authorisation-server-id,x-consent-id,x-cumbuca-consent-token - Resposta:
{ "data": [...] }— formato regulado do OF Brasil - Retentativas: leituras de dados são cobráveis e podem ter limites de taxa; trate-as como não idempotentes para fins de retentativa.
Clientes
| Endpoint | Observações |
|---|---|
GET /open-finance/customers/v2/personal/identifications | Identificação de pessoa física |
GET /open-finance/customers/v2/business/identifications | Identificação de pessoa jurídica |
GET /open-finance/customers/v2/personal/financial-relations | Relacionamentos financeiros de pessoa física |
GET /open-finance/customers/v2/business/financial-relations | Relacionamentos financeiros de pessoa jurídica |
GET /open-finance/customers/v2/personal/qualifications | Qualificações de pessoa física (renda etc.) |
GET /open-finance/customers/v2/business/qualifications | Qualificações de pessoa jurídica |
Contas (Corrente / Poupança)
| Endpoint | Observações |
|---|---|
GET /open-finance/accounts/v2/accounts | Listar contas |
GET /open-finance/accounts/v2/accounts/{accountId} | Detalhes da conta |
GET /open-finance/accounts/v2/accounts/{accountId}/balances | Saldos |
GET /open-finance/accounts/v2/accounts/{accountId}/overdraft-limits | Limites de cheque especial |
GET /open-finance/accounts/v2/accounts/{accountId}/transactions | Transações |
Cartões de Crédito
| Endpoint | Observações |
|---|---|
GET /open-finance/credit-cards-accounts/v2/accounts | Listar contas de cartão |
GET /open-finance/credit-cards-accounts/v2/accounts/{id} | Detalhes da conta de cartão |
GET /open-finance/credit-cards-accounts/v2/accounts/{id}/bills | Faturas |
GET /open-finance/credit-cards-accounts/v2/accounts/{id}/bills/{billId}/transactions | Transações da fatura |
GET /open-finance/credit-cards-accounts/v2/accounts/{id}/limits | Limites do cartão |
GET /open-finance/credit-cards-accounts/v2/accounts/{id}/transactions | Transações do cartão |
Operações de Crédito (4 famílias)
Formato genérico para os escopos loans, financings, invoice-financings e unarranged-accounts-overdraft:
Endpoint (com {scope}) | Observações |
|---|---|
GET /open-finance/{scope}/v2/contracts | Listar contratos |
GET /open-finance/{scope}/v2/contracts/{contractId} | Detalhes do contrato |
GET /open-finance/{scope}/v2/contracts/{contractId}/payments | Histórico de pagamentos |
GET /open-finance/{scope}/v2/contracts/{contractId}/scheduled-instalments | Parcelas programadas |
GET /open-finance/{scope}/v2/contracts/{contractId}/warranties | Garantias / colaterais |
Investimentos (5 famílias)
Escopos: bank-fixed-incomes, credit-fixed-incomes, variable-incomes, treasure-titles, funds.
| Endpoint | Observações |
|---|---|
GET /open-finance/{scope}/v1/investments | Listar investimentos |
GET /open-finance/{scope}/v1/investments/{id} | Detalhes do investimento |
GET /open-finance/{scope}/v1/investments/{id}/balances | Saldos |
GET /open-finance/{scope}/v1/investments/{id}/transactions | Transações históricas |
GET /open-finance/{scope}/v1/investments/{id}/transactions-current | Transações do período atual |
Câmbio (FX)
| Endpoint | Observações |
|---|---|
GET /open-finance/exchanges/v1/operations | Listar operações de câmbio |
GET /open-finance/exchanges/v1/operations/{operationId} | Detalhes da operação |
GET /open-finance/exchanges/v1/operations/{operationId}/events | Eventos da operação |
Recursos (descoberta)
| Endpoint | Observações |
|---|---|
GET /open-finance/resources/v3/resources | Lista todos os recursos aos quais o consentimento concede acesso |
Gestão de Consentimentos (Portal Compartilhado)
Diferente do restante da API, o portal de gestão de consentimentos é servido por uma URL base separada e não utiliza os headers de autenticação padrão (mTLS + x-cumbuca-consent-token). Em vez disso, o cliente constrói um JWT assinado com PS256 e o envia via POST como corpo bruto da requisição com content-type: application/jwt. A resposta contém uma redirectUrl para a qual o usuário final deve ser enviado a fim de visualizar, gerenciar e revogar seus consentimentos.
Visão geral do fluxo
- O usuário final solicita acesso para "gerenciar meus consentimentos".
- O cliente obtém o CPF ou CNPJ do usuário (e, quando aplicável, o CPF do representante para fluxos de pessoa jurídica).
- O cliente constrói as claims do JWT — o formato depende se o usuário é pessoa física ou jurídica.
- O JWT é assinado com PS256 usando uma chave privada cujo
kidfoi pré-registrado no serviço de consentimento compartilhado. - O cliente envia via POST o JWS compacto para o endpoint de consentimento compartilhado.
- O serviço retorna uma URL de uso único com a sessão embutida nela. O usuário final é redirecionado para essa URL.
JWT — claims & assinatura
{
"alg": "PS256",
"typ": "JWT",
"kid": "<key-id-registered-with-cumbuca>"
}
{
"jti": "01956c8e-...",
"iat": 1748448000,
"cpf": "12345678901",
"brandId": "<your-brand-id>",
"name": "Open Finance Brasil"
}
jti— identificador único do JWT (UUIDv7 recomendado).iat— segundos em epoch, data de emissão.name— string constante.
{
"jti": "01956c8e-...",
"iat": 1748448000,
"cnpj": "12345678000199",
"brandId": "<your-brand-id>",
"name": "Open Finance Brasil",
"cpf": "12345678901"
}
Assine o mapa de claims com a chave privada registrada (PS256) e serialize como JWS compacto. Resultado:
eyJhbGciOiJQUzI1NiIsImtpZCI6IjwuLi4-IiwidHlwIjoiSldUIn0.<payload>.<signature>
POST{SHARED_CONSENT_URL}/management/result
Valida o JWT assinado e retorna uma URL de uso único com um token de sessão embutido. O usuário final deve ser redirecionado para essa URL para acessar o portal de gestão de consentimentos.
content-type | obrigatório application/jwt |
x-authorisation-server-id ou x-cumbuca-consent-token é enviado — o próprio JWT assinado é o mecanismo de autenticação. A confiança está ancorada no kid registrado no serviço de consentimento compartilhado.
eyJhbGciOiJQUzI1NiIsImtpZCI6IjwuLi4-IiwidHlwIjoiSldUIn0.eyJqdGkiOiIuLi4iLCJpYXQiOjE3NDg0NDgwMDAsImNwZiI6IjEyMzQ1Njc4OTAxIiwiYnJhbmRJZCI6IjwuLi4-IiwibmFtZSI6Ik9wZW4gRmluYW5jZSBCcmFzaWwifQ.<signature>
{
"redirectUrl": "https://shared-consent.../management/?token=..."
}
| Condição | Tratamento sugerido |
|---|---|
| Documento inválido (nem 11 nem 14 dígitos válidos) | Rejeitar antes de assinar; exibir um erro amigável ao usuário |
| Chave de assinatura ausente ou não configurada | Erro de configuração; a chamada não deve ser tentada |
| Resposta HTTP não-2xx do serviço de consentimento compartilhado | Expor o payload de erro do parceiro |
| Resposta 2xx sem campo de URL de redirecionamento reconhecido | Tratar como formato de resposta inesperado |
Apêndice
Mapeamento de permissões
O Open Finance Brasil organiza as permissões por categoria de dados e agrupamento (a unidade granular de compartilhamento que o usuário autoriza). Cada agrupamento mapeia para um conjunto de strings de permissão reguladas. RESOURCES_READ deve sempre ser incluído ao criar um consentimento de compartilhamento de dados.
| Role | Categoria de dados | Agrupamento | Permissions |
|---|---|---|---|
DADOS |
Cadastro | Dados Cadastrais PF | CUSTOMERS_PERSONAL_IDENTIFICATIONS_READ |
RESOURCES_READ | |||
| Informações complementares PF | CUSTOMERS_PERSONAL_ADITTIONALINFO_READ |
||
RESOURCES_READ | |||
| Dados Cadastrais PJ | CUSTOMERS_BUSINESS_IDENTIFICATIONS_READ |
||
RESOURCES_READ | |||
| Informações complementares PJ | CUSTOMERS_BUSINESS_ADITTIONALINFO_READ |
||
RESOURCES_READ | |||
| Contas | Saldos | ACCOUNTS_READ |
|
ACCOUNTS_BALANCES_READ | |||
RESOURCES_READ | |||
| Limites | ACCOUNTS_READ |
||
ACCOUNTS_OVERDRAFT_LIMITS_READ | |||
RESOURCES_READ | |||
| Extratos | ACCOUNTS_READ |
||
ACCOUNTS_TRANSACTIONS_READ | |||
RESOURCES_READ | |||
| Cartão de Crédito | Limites | CREDIT_CARDS_ACCOUNTS_READ |
|
CREDIT_CARDS_ACCOUNTS_LIMITS_READ | |||
RESOURCES_READ | |||
| Transações | CREDIT_CARDS_ACCOUNTS_READ |
||
CREDIT_CARDS_ACCOUNTS_TRANSACTIONS_READ | |||
RESOURCES_READ | |||
| Faturas | CREDIT_CARDS_ACCOUNTS_READ |
||
CREDIT_CARDS_ACCOUNTS_BILLS_READCREDIT_CARDS_ACCOUNTS_BILLS_TRANSACTIONS_READ | |||
RESOURCES_READ | |||
DADOS |
Operações de Crédito | Dados do Contrato | LOANS_READ |
LOANS_WARRANTIES_READ | |||
LOANS_SCHEDULED_INSTALMENTS_READ | |||
LOANS_PAYMENTS_READ | |||
FINANCINGS_READ | |||
FINANCINGS_WARRANTIES_READ | |||
FINANCINGS_SCHEDULED_INSTALMENTS_READ | |||
FINANCINGS_PAYMENTS_READ | |||
UNARRANGED_ACCOUNTS_OVERDRAFT_READ | |||
UNARRANGED_ACCOUNTS_OVERDRAFT_WARRANTIES_READ | |||
UNARRANGED_ACCOUNTS_OVERDRAFT_SCHEDULED_INSTALMENTS_READ | |||
UNARRANGED_ACCOUNTS_OVERDRAFT_PAYMENTS_READ | |||
INVOICE_FINANCINGS_READ | |||
INVOICE_FINANCINGS_WARRANTIES_READ | |||
INVOICE_FINANCINGS_SCHEDULED_INSTALMENTS_READ | |||
INVOICE_FINANCINGS_PAYMENTS_READ | |||
RESOURCES_READ | |||
DADOS |
Investimento | Dados da Operação | BANK_FIXED_INCOMES_READ |
CREDIT_FIXED_INCOMES_READ | |||
FUNDS_READ | |||
VARIABLE_INCOMES_READ | |||
TREASURE_TITLES_READ | |||
RESOURCES_READ | |||
DADOS |
Câmbio | Dados da Operação | EXCHANGES_READ |
RESOURCES_READ |