Cumbuca Gateway API
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 /consent-management/v1/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:
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 /consent-management/v1/consents/{consentId}) é, 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: toda conexão trafega sobre um handshake TLS mutuamente autenticado contra a CA da Cumbuca.
- Token de acesso Bearer: obtido em
POST /auth/v1/tokene enviado comoAuthorization: Bearer <access_token>em cada chamada. Obrigatório para todos os endpoints desta referência, exceto os próprios endpoints de autenticação.
Além dessas duas camadas, o único estado que o cliente carrega de uma chamada para a próxima é o consentId, que delimita a requisição a um consentimento autorizado específico.
- O cliente chama
POST /auth/v1/tokenvia mTLS com suas credenciais. A resposta traz umaccess_token, umexpires_inde curta duração e umrefresh_tokende longa duração. - O cliente envia
Authorization: Bearer <access_token>em cada chamada subsequente. - Quando o token de acesso expira, o cliente chama
POST /auth/v1/tokencomgrant_type=refresh_tokenpara obter um novo token de acesso sem reapresentar as credenciais.
client_id também precisa estar provisionado do lado da Cumbuca. Até lá, você ainda consegue obter tokens, mas toda outra chamada falha com 401 UNAUTHORIZED e o detalhe client_id is not provisioned. Se você vir esse detalhe, contate a Cumbuca para concluir o provisionamento; o token em si está correto.
- O cliente chama
POST /consent-management/v1/consentsvia mTLS com um token Bearer válido. - No
201, a Cumbuca retorna o payload regulado (data.consentId,data.redirectUrl,data.consent). - O cliente persiste o
data.consentIdpara uso posterior. - O usuário é redirecionado para
data.callbackApplicationUri, autoriza o consentimento no banco e é redirecionado de volta.
Em cada chamada subsequente a um endpoint protegido por consentimento (as leituras de dados sob /open-finance/... e a própria consulta do consentimento), o cliente deve:
- Enviar
Authorization: Bearer <access_token>. - Enviar o
consentIdno headerx-consent-id. - Enviar
x-authorisation-server-ididentificando a instituição de destino.
A Cumbuca resolve o chamador a partir do client_id presente no token Bearer e encaminha a requisição para a API regulada sob a identidade desse cliente. A resposta upstream flui de volta para o cliente sem alterações.
x-consent-id é necessário? Todo endpoint que opera sobre um consentimento existente, ou seja, todo endpoint exceto GET /consent-management/v1/participants (sem consentimento envolvido) e POST /consent-management/v1/consents (a chamada que cria o consentimento).
client_id presente no token Bearer). Toda chamada é executada sob essa identidade, então um cliente não consegue atuar sobre os dados de outro cliente. O mTLS continua sendo um requisito de transporte em toda conexão (inclusive POST /auth/v1/token); ele não é usado para verificações por consentimento.
Headers Comuns
Toda requisição à API parceira utiliza alguma combinação dos seguintes headers:
| Header | Obrigatório quando | Valor |
|---|---|---|
Authorization | Todo endpoint exceto POST /auth/v1/token (que usa HTTP Basic) | Bearer <access_token> obtido no endpoint de token |
x-authorisation-server-id | Toda chamada regulada (exceto autenticação e GET /consent-management/v1/participants) | ID do Servidor de Autorização da instituição de destino (obtido no diretório) |
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.
| Header | Significado |
|---|---|
x-nexus-request-id | Id de correlação (UUIDv7) presente em toda resposta, de sucesso ou erro, e propagado aos serviços upstream. Registre-o em seus logs e cite-o em chamados de suporte. |
x-nexus-error-source | Presente em toda resposta de erro: client: o gateway rejeitou sua requisição ou credenciais (autenticação, validação, limite de requisições, 404); upstream: o banco / um serviço upstream retornou o erro ou falhou, incluindo 4xx repassados do banco; gateway: a própria Cumbuca falhou. Use-o para classificar falhas sem analisar o corpo. |
| Código | HTTP | Significado | Retentar? |
|---|---|---|---|
UNAUTHORIZED | 401 | Token Bearer ausente, malformado ou expirado, ou o client_id do token não está provisionado | Não; corrija credenciais / provisionamento |
INVALID_CLIENT | 401 | Credenciais Basic ausentes ou inválidas no POST /auth/v1/token | Não |
INVALID_GRANT | 400 | Requisição de token falhou: refresh_token inválido, expirado ou reutilizado, ou o servidor de autorização está indisponível | Apenas quando o detalhe for "authorization server unavailable" ou "token request failed" (problemas transitórios do servidor de autorização) |
INVALID_REQUEST | 400 | Corpo malformado ou campo / header obrigatório ausente | Não |
UNSUPPORTED_GRANT_TYPE | 400 | grant_type diferente de client_credentials / refresh_token | Não |
UNSUPPORTED_MEDIA_TYPE | 415 | Corpo com content-type diferente de JSON / form-urlencoded | Não |
RATE_LIMITED | 429 | Limite de requisições por cliente excedido; veja Limites de requisições | Sim, após retry-after |
NOT_FOUND | 404 | Nenhuma rota corresponde à requisição (retornado apenas a chamadores autenticados) | Não |
INTERNAL_ERROR | 500 | Falha inesperada do gateway | Sim, com backoff |
OPUS_ERROR | status do upstream | O upstream retornou um erro cujo corpo não pôde ser repassado como está | Depende do status |
OPUS_UNAVAILABLE | 502 | Falha de transporte ou timeout em direção ao upstream | Sim (transitório) |
REGISTER_ERROR | status do upstream | O repositório de reciprocidade retornou um erro com corpo vazio ou ilegível | Depende do status |
REGISTER_UNAVAILABLE | 502 | O repositório de reciprocidade está inacessível | Sim (transitório) |
UPSTREAM_ERROR | 502 | O portal de gestão de consentimentos retornou uma resposta não-2xx | Sim (transitório) |
UPSTREAM_UNAVAILABLE | 502 | O portal de gestão de consentimentos está inacessível | Sim (transitório) |
POST /openid/authorize retornam 422 com o corpo {"error", "error_description"}, o único erro desta API que não usa o envelope errors[] acima.
Limites de Requisições
As requisições são limitadas por client_id em uma janela de tempo fixa compartilhada entre todos os endpoints autenticados por Bearer da API (consentimentos, leituras de dados, tudo). Quando o limite é excedido, a API retorna 429 com o código RATE_LIMITED e um header de resposta retry-after com o número inteiro de segundos até a janela reiniciar; respeite-o antes de retentar.
POST /auth/v1/tokennão é limitado por taxa.- Nenhum header
x-ratelimit-*é emitido em respostas de sucesso; o único sinal é o próprio 429. - Os limites são configurados por ambiente (padrão de 600 requisições por 60 s). Não fixe suposições no código; baseie o backoff no
retry-after.
Timeouts e Retentativas
Chamadas encaminhadas ao banco detentor dos dados operam sob um orçamento de upstream de aproximadamente 30 segundos; esgotado esse tempo, o gateway responde 502 (OPUS_UNAVAILABLE). Configure timeouts de pelo menos ~35 segundos no seu cliente ou você truncará respostas lentas porém bem-sucedidas.
- GETs podem ser retentados pelo próprio gateway, apenas em falhas de conexão (máximo de 2 retentativas, ou seja, até 3 tentativas no total, sem backoff), e são seguros para você retentar também.
- Escritas nunca são retentadas pelo gateway. Um
502em um POST ou PATCH é indeterminado: a operação pode ou não ter chegado ao banco. Reconcilie com um GET em vez de retentar às cegas: após uma falha ambígua noPOST /consent-management/v1/consents, consulte o consentimento antes de criar um novo. - Não há suporte a chave de idempotência; implemente sua própria deduplicação para escritas.
- Erros
502/*_UNAVAILABLEsão transitórios e retentáveis. Atenção: uma indisponibilidade do servidor de autorização noPOST /auth/v1/tokenaparece como400 INVALID_GRANT("authorization server unavailable"), não como um 5xx.
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 suas credenciais via mTLS. Guarde oaccess_tokenretornado para as chamadas abaixo e orefresh_tokenpara quando o token de acesso expirar (chame este mesmo endpoint comgrant_type=refresh_token). Toda chamada a partir daqui deve carregarAuthorization: Bearer <access_token>. -
Escolha o banco do usuário: chame
GET /consent-management/v1/participants?role=DADOS&familyType=accountspara deixar o diretório filtrar no servidor:role=DADOSmantém apenas as instituições de compartilhamento de dados efamilyType=accountsmantém apenas as que expõem as APIs de contas que você vai consultar abaixo. 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. -
Conclua a autorização: quando o banco redirecionar de volta para o seu
callbackApplicationUri, capture a query string completa (ela contémcode,id_tokenestate). Envie-a paraPOST /openid/authorizeno campodatado body. Uma resposta204 No Contentsignifica que a Cumbuca validou o código com o banco e o consentimento está sendo autorizado. -
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 usando o fluxo Client Credentials ou Refresh Token. Este endpoint não usa o token Bearer; em vez disso, envie as credenciais do seu cliente como Authorization: Basic base64(client_id:client_secret).
Content-Type | obrigatório application/x-www-form-urlencoded |
Authorization | obrigatório Basic <base64(client_id:client_secret)> |
| Campo | Valor |
|---|---|
grant_type | obrigatório client_credentials ou refresh_token |
scope | Opcional: lista de escopos separados por espaço. Aplica-se apenas ao client_credentials. |
refresh_token | Obrigatório quando grant_type for refresh_token. O 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=client_credentials
{
"access_token": "eyJhbGciOiJSUzI1NiJ9...",
"token_type": "Bearer",
"expires_in": 3600,
"refresh_token": "dGhpcyBpcyBhIHJlZnJlc2ggdG9rZW4...",
"refresh_expires_in": 2592000
}
Authorization: Bearer <access_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 |
role query | Filtra entradas cujos OrgDomainRoleClaims contenham o role informado; ex.: DADOS (dados) ou CONTA (pagamentos). Os tipos de role estão sujeitos a mudanças; verifique a spec do diretório para a lista atual. |
familyType query | Filtra entradas cujos ApiResources contenham o ApiFamilyType informado; ex.: accounts, credit-cards-accounts. |
[
{
"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." }]
}
]
POST/openid/authorize
Conclui o loop de autorização OAuth 2.0. Após o provedor de dados redirecionar o usuário de volta para o seu callbackApplicationUri, envie a query string completa do callback aqui para que a Cumbuca troque o código de autorização por tokens e finalize o consentimento. Retorna 204 No Content em caso de sucesso.
Authorization | obrigatório Token Bearer |
x-authorisation-server-id | obrigatório |
{
"data": "code=LxSev...&id_token=eyJ...&state=dXJu..."
}
{
"error": "authorization_failed",
"error_description": "authorization could not be completed"
}
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.
Authorization | obrigatório Bearer <access_token> |
x-authorisation-server-id | obrigatório |
{
"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?..."
}
}
businessEntity) criado com um id de servidor de autorização passa a AUTHORISED, a Cumbuca realiza automaticamente uma única leitura de GET /open-finance/customers/v2/personal/identifications usando esse consentimento e registra o dado retornado para reciprocidade. Para viabilizá-la, quando a sua instituição não delega a reciprocidade (o padrão), a Cumbuca adiciona automaticamente a permission CUSTOMERS_PERSONAL_IDENTIFICATIONS_READ ao consentimento, que é o que autoriza essa leitura. A leitura é cobrável e aparece nos logs do banco segundos após a autorização, ainda que você não a tenha emitido. Ela nunca altera as respostas da sua API, e os registros que você mesmo escrever via PUT /personal/identifications/register sempre têm precedência. Veja o guia de reciprocidade.
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 |
Authorization | obrigatório Bearer <access_token> |
x-authorisation-server-id | obrigatório |
{
"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.
Ciclo de vida do consentimento. Além da criação e da consulta, três operações de ciclo de vida estão disponíveis na referência da API: DELETE /consent-management/v1/consents/{consentId} revoga o consentimento (retorna 204); POST .../consents/{consentId}/authorisation-retry gera uma nova redirectUrl quando a tentativa original de autorização caducou (ex.: o usuário abandonou o redirecionamento ao banco); e POST .../consents/{consentId}/extends renova a expiração de um consentimento AUTHORISED. Apenas este POST exige adicionalmente os headers x-customer-user-agent e x-fapi-customer-ip-address, e um GET no mesmo caminho lista o histórico de extensões.
Consumo de Dados (Fase 2) - GETs Autenticados
Todos os endpoints nesta seção seguem o mesmo formato:
- Método: GET
- Headers:
Authorization: Bearer <access_token>,x-authorisation-server-id,x-consent-id - Resposta:
{ "data": [...] }(formato regulado do OF Brasil) - Retentativas: leituras de dados são cobráveis; veja Limites de requisições e Timeouts e retentativas antes de adicionar lógica 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 |
Reciprocidade
Como receptor de dados, você também deve disponibilizar ao ecossistema os dados cadastrais dos seus próprios correntistas (reciprocidade). A escrita abaixo popula o repositório de reciprocidade que a Cumbuca serve em seu nome: uma vez registrado o cliente, outros participantes do Open Finance que consultarem sua instituição recebem uma verificação positiva de correntista e os dados de identificação registrados.
PUT/personal/identifications/register
Registra (ou atualiza) o registro de identificação pessoal de um dos seus correntistas. As escritas são upserts idempotentes chaveados pelo CPF do cliente e atribuídos ao client_id do seu token Bearer. Chame-o quando um cliente se tornar correntista e sempre que seus dados cadastrais mudarem. Os registros que você escreve aqui sempre têm precedência sobre o registro automático de reciprocidade do gateway.
Authorization | obrigatório Bearer <access_token> |
content-type | obrigatório application/json |
{
"data": { "cpf": "12345678901" }
}
Gestão de Consentimentos
Permite que o usuário final visualize, gerencie e revogue todos os consentimentos que autorizou para o cliente. A chamada retorna uma URL de uso único; redirecione o usuário para lá a fim de abrir o portal de gestão. Veja também Reciprocidade para a escrita de registro que mantém os dados dos seus próprios correntistas disponíveis ao ecossistema.
POST/management/result
Retorna uma URL de uso único com um token de sessão embutido. Redirecione o usuário final para essa URL para acessar o portal de gestão de consentimentos. Você chama este endpoint no gateway (mesma URL base e mesmo token Bearer de todos os outros endpoints desta referência); a Cumbuca então assina internamente um JWT PS256 e o entrega ao portal de gestão de consentimentos em seu nome, de modo que a sua integração nunca manipula o JWT.
Authorization | obrigatório Bearer <access_token> |
content-type | obrigatório application/json |
{
"document": "12345678901",
"representativeCpf": "98765432100"
}
| Campo | Tipo | Observações |
|---|---|---|
document | string | obrigatório CPF (11 dígitos) ou CNPJ (14 dígitos) do usuário final |
representativeCpf | string | opcional CPF do representante; usado apenas quando document é um CNPJ e um representante de pessoa jurídica atua em nome da empresa |
{
"redirectUrl": "https://.../management/?token=..."
}
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 |