Reciprocidade

Como a Cumbuca Gateway API cumpre o dever de reciprocidade do Open Finance, responder às consultas de outros participantes sobre os seus correntistas, nos dois modos de operação: sem delegação, em que a Cumbuca armazena os cadastros e responde por você, e com delegação, em que cada consulta é encaminhada ao vivo, via mTLS, para um serviço que você mesmo opera.

O que é Reciprocidade

Participar do Open Finance Brasil como receptor de dados traz consigo um dever de reciprocidade: outros participantes podem perguntar se um determinado documento pertence a um correntista da sua instituição e ler os dados cadastrais (identificação) desse cliente. A Cumbuca cumpre esse dever de duas formas, definidas por uma única configuração de instância, a delegação.

Com e sem delegação

Sem delegação (delegação desativada), o padrão. A Cumbuca armazena os cadastros dos clientes que conhece (pelo registro automático que segue um consentimento autorizado, ou pelas escritas PUT /personal/identifications/register e PUT /business/identifications/register) e responde ela mesma às consultas do ecossistema, a partir do próprio armazenamento. O seu serviço não é chamado.

Ecossistema OF instituição solicitante Cumbuca armazenamento 1 consulta de correntista / identificação 2 resposta do próprio armazenamento

Com delegação (delegação ativada). A Cumbuca não armazena nada. Toda consulta de reciprocidade é encaminhada ao vivo, via mTLS, para um serviço que você implementa e opera. Ele passa a ser a fonte da verdade.

Ecossistema OF instituição solicitante Cumbuca gateway (nada salvo) SEU serviço fonte da verdade 1 consulta de correntista / identificação 2 encaminha ao vivo mTLS 3 resposta 4 repassa (nada armazenado)
Por instância, tudo ou nada. A delegação é uma configuração de toda a sua instância Cumbuca, acordada no onboarding. Ela vale para todos os clients do tenant: não é possível delegar um client e manter outro armazenado na Cumbuca.

Comparação

Sem delegaçãoCom delegação
Onde vivem os dados dos clientesArmazenados na CumbucaNo seu serviço; nada armazenado na Cumbuca
Quem responde às consultas do ecossistemaA Cumbuca, a partir do próprio armazenamentoSeu serviço, uma chamada ao vivo por consulta
Registro automático pós-consentimentoExecutado (detalhes)Ignorado (detalhes)
PUT /personal/identifications/register
PUT /business/identifications/register
201: registro armazenado422: sempre recusado (detalhes)
Endpoints que o seu serviço expõeNenhumQuatro, mais três se você atende clientes PJ (contrato)
Dependência de disponibilidadeNenhuma sobre seus sistemasUma indisponibilidade do seu serviço falha as consultas de reciprocidade do tenant (detalhes)

Registro Automático (sem delegação)

Quando a instância não delega, é a própria Cumbuca que precisa conhecer os seus correntistas para responder às consultas de reciprocidade. Ela popula esse armazenamento automaticamente, sem nenhuma ação do parceiro, a partir dos consentimentos de compartilhamento de dados criados pela sua instância:

  1. Ao criar um consentimento de compartilhamento, a Cumbuca passa a acompanhá-lo.
  2. O Open Finance não notifica mudança de status, então a Cumbuca faz polling do consentimento até ele chegar a AUTHORISED (ou expirar, quando o ecossistema recusa consentimentos não autorizados em ~1 h).
  3. Uma vez autorizado, a Cumbuca lê as identificações do cliente pelo próprio consentimento (leitura billable) e grava cada registro no seu armazenamento, com x-data-source: internal. Um consentimento de pessoa física alimenta /personal/identifications; um consentimento de pessoa jurídica (que carrega businessEntity) alimenta /business/identifications.

Os dois são independentes: um consentimento que concede as duas permissions registra ambos, e uma falha em um lado nunca bloqueia o outro.

Open Finance consentimento + leitura Cumbuca gateway Armazenamento da Cumbuca 1 consentimento criado + CUSTOMERS_PERSONAL_IDENTIFICATIONS_READ 2 polling do status até AUTHORISED 3 lê /personal/identifications (billable) 4 grava cada registro x-data-source: internal

O registro é idempotente, então reexecuções são inofensivas. Para os registros de pessoa física, um dado escrito por você (via PUT /personal/identifications/register, com origem tenant) tem precedência sobre o registro automático interno e nunca é sobrescrito por ele.

Registros de pessoa jurídica não têm precedência por origem. Diferente do armazenamento de pessoa física, o de pessoa jurídica não classifica as escritas por origem: vale a última que chegar, sua ou do registro automático. Se você mantém os cadastros PJ por conta própria, espere que um consentimento de pessoa jurídica autorizado os atualize.

Permissions obrigatórias

O registro automático só é possível se o consentimento carregar a permission que autoriza a Cumbuca a ler os dados de identificação do cliente. Por isso, quando a instância não delega, a Cumbuca adiciona a permission correspondente automaticamente na criação do consentimento, garantindo que o cadastro de reciprocidade possa ser populado:

ConsentimentoPermission adicionada
Pessoa física (sem businessEntity)CUSTOMERS_PERSONAL_IDENTIFICATIONS_READ
Pessoa jurídica (com businessEntity)CUSTOMERS_BUSINESS_IDENTIFICATIONS_READ

Apenas a permission de identificações é adicionada. Os dados de qualificação e de relacionamento financeiro são derivados do mesmo corpo de identificações, portanto não exigem leitura separada.

Com Delegação: o Contrato do Seu Serviço

Quando a sua instância delega, você entrega à Cumbuca uma URL base no onboarding. HTTPS é obrigatório em produção e homologação. Sob essa URL base, seu serviço deve implementar os endpoints JSON POST abaixo; os caminhos são relativos a essa URL base. Os endpoints de pessoa jurídica (PJ) só são obrigatórios se a sua instituição atende clientes pessoa jurídica.

EndpointResponde com
POST /check-account-holderbooleanoobrigatório
POST /personal/identificationsarrayobrigatório
POST /personal/qualificationsobjetoobrigatório
POST /personal/financial-relationsobjetoobrigatório
POST /business/identificationsarraysó PJ
POST /business/qualificationsobjetosó PJ
POST /business/financial-relationsobjetosó PJ
Dois formatos de resposta. Identifications respondem com um array em data e usam "data": [] para "nada a informar". Qualifications e financial-relations respondem com um único objeto em data e sinalizam "sem registro para este documento" com um HTTP 404 (veja abaixo).
Headers de requisição enviados pela Cumbuca
HeaderValor
content-typeapplication/json
x-nexus-request-idId de correlação UUIDv7; registre em log e inclua em chamados de suporte

POST/check-account-holder

O gateway Cumbuca pergunta se o documento informado pertence a um correntista da sua instituição. É um requisito da integração, não a entrega dos dados de reciprocidade em si: trata-se de uma verificação de titularidade que o fluxo exige, distinta dos endpoints de identificação abaixo, que devolvem os dados cadastrais efetivamente compartilhados na reciprocidade. Seu serviço precisa expô-la para operar no Open Finance.

Corpo da requisição (enviado pela Cumbuca)
{
  "cpf": "12345678901",
  "cnpj": "12345678000199" // opcional
}
Campos do corpo
CampoTipoObservações
cpfstringobrigatório O CPF de 11 dígitos do usuário logado (a pessoa física; numa pessoa jurídica, o CPF do representante)
cnpjstringopcional O documento de pessoa jurídica, presente apenas quando acompanha o consentimento; sempre 14 dígitos
Documento de pessoa jurídica vem no campo cnpj. O campo cpf é sempre o CPF de 11 dígitos do usuário logado; o CNPJ, quando houver, chega no campo cnpj (14 dígitos).
Resposta exigida (200)
{
  "data": { "isAccountHolder": true }
}

data.isAccountHolder deve ser um booleano JSON. Um 200 cujo corpo não é JSON, ou cujo data.isAccountHolder está ausente ou não é booleano, é tratado como falha da consulta; campos extras são ignorados (veja o mapeamento de erros).

POST/personal/identifications

A Cumbuca busca no seu serviço os registros de identificação de pessoa física (personal-identifications) do Open Finance.

Corpo da requisição (enviado pela Cumbuca)
{
  "cpf": "12345678901"
}
Resposta exigida (200)
{
  "data": [
    { /* registro personal-identifications do Open Finance Brasil */ }
  ]
}

Um objeto JSON com um array data. Cada elemento já deve ser um registro personal-identifications válido do Open Finance Brasil; a Cumbuca serve o array à instituição solicitante sem alterações, envolvendo-o apenas com meta.requestDateTime. Retorne "data": [] quando não houver nada a informar.

POST/business/identificationsopcional

A Cumbuca busca no seu serviço os registros de identificação de pessoa jurídica (business-identifications) do Open Finance. Obrigatório apenas se a sua instituição atende clientes pessoa jurídica (PJ); instituições que atendem somente pessoas físicas não precisam expô-lo.

Corpo da requisição (enviado pela Cumbuca)
{
  "cnpj": "12345678000199"
}
Resposta exigida (200)
{
  "data": [
    { /* registro business-identifications do Open Finance Brasil */ }
  ]
}

Mesma semântica de /personal/identifications: um objeto JSON com um array data de registros business-identifications do OF Brasil, servidos sem alterações à instituição solicitante.

POSTQualifications e financial relations

Quatro endpoints que compartilham um único contrato. A Cumbuca busca no seu serviço os dados de qualificação ou de relacionamento financeiro do cliente. Diferente de identifications, cada um responde com um único objeto, não com um array.

CaminhoCampo do corpo
/personal/qualificationscpfobrigatório
/personal/financial-relationscpfobrigatório
/business/qualificationscnpjsó PJ
/business/financial-relationscnpjsó PJ
Corpo da requisição (enviado pela Cumbuca)
{
  "cpf": "12345678901"    // "cnpj" nos caminhos de pessoa jurídica
}
Resposta obrigatória (200)
{
  "data": { /* objeto de qualification / financial-relations do Open Finance Brasil */ }
}

data deve ser um objeto JSON, não um array. A Cumbuca o serve à instituição solicitante sem alterações, envolvendo-o apenas com meta.requestDateTime. Um 200 cujo data seja um array ou esteja ausente falha a consulta.

Retorne 404 quando não houver registro para o documento. Aqui não existe equivalente de objeto vazio para o "data": []. A Cumbuca reconhece o seu 404 como "documento sem registro" e responde 404 à instituição solicitante, exatamente o que uma instância não delegada devolve para um documento que nunca foi registrado. Qualquer outra falha é tratada como indisponibilidade do seu lado.

mTLS no Trecho Delegado

Toda chamada da Cumbuca para o seu serviço trafega sobre TLS mútuo. Não há bearer token nem API key nesse trecho: o certificado de cliente do gateway é a única autenticação.

Orçamento de Timeout

Semântica de Falhas

Consequência operacional: enquanto o seu serviço está indisponível, as consultas de reciprocidade contra o seu tenant falham até a recuperação. Isso inclui as verificações de correntista, as leituras de identificação e as leituras de qualificação / relacionamento financeiro. A criação de consentimentos e os demais fluxos do seu lado receptor continuam funcionando normalmente: eles não passam pelo seu serviço delegado.

Mapeamento de erros

O que cada comportamento do seu serviço produz na cadeia:

Comportamento do seu serviçoResultado no gateway CumbucaO que a instituição solicitante vê
200 com o formato exato documentado200: dados encaminhados200 com os dados
Status diferente de 200Mesmo status, código DELEGATED_ERROR ("the delegated client returned an error"); seu corpo descartado500 INTERNAL_SERVER_ERROR
Timeout (> 30 s), conexão recusada, falha de TLS502 DELEGATED_UNAVAILABLE ("the delegated client is unavailable")500 INTERNAL_SERVER_ERROR
200 com corpo não-JSON ou formato errado502 DELEGATED_UNAVAILABLE500 INTERNAL_SERVER_ERROR
200 objeto JSON sem um array data (identifications)Passa pelo gateway, rejeitado adiante500 INTERNAL_SERVER_ERROR
404 em qualifications / financial-relations404: reconhecido como "documento sem registro"404, igual a uma instância não delegada

O Que Muda Quando Você Delega

Registro retorna 422

Em uma instância delegada, as duas escritas de registro voltadas ao parceiro, PUT /personal/identifications/register e PUT /business/identifications/register, são sempre recusadas: toda requisição autenticada e bem-formada recebe 422 e nada é armazenado (corpos malformados ainda recebem os genéricos 400/415, e autenticação ausente recebe 401):

HTTP/1.1 422
x-nexus-error-source: client
x-nexus-request-id: <uuidv7>

{
  "errors": [
    {
      "code": "UNKNOWN",
      "title": "Unknown Error",
      "detail": "Registration not supported for a delegated client"
    }
  ],
  "meta": { "requestDateTime": "2026-07-15T12:00:00Z" }
}

Não chame o registro em uma instância delegada; trate esse 422 como a resposta esperada e permanente.

O registro automático que popula o armazenamento da Cumbuca não se aplica quando você delega. Depois que um consentimento chega a AUTHORISED, a Cumbuca ainda tenta a gravação interna, tanto de pessoa física quanto de pessoa jurídica, mas ela é recusada com o mesmo 422 (nada é armazenado na Cumbuca) e a etapa é silenciosamente ignorada. O seu serviço é o único lugar de onde vêm os dados de reciprocidade. A Cumbuca também deixa de adicionar a permission de identificações aos consentimentos em uma instância delegada, já que nunca precisa realizar essa leitura.

LGPD - nada armazenado na Cumbuca

Com a delegação habilitada, nenhum dado cadastral de cliente para reciprocidade é retido na Cumbuca: as escritas de registro são recusadas antes da validação, e toda leitura é respondida ao vivo pelo seu serviço. Os dados pessoais tratados para reciprocidade permanecem dentro da sua infraestrutura.


Cumbuca Gateway API - Reciprocidade.