Transmissora de Dados - Ambiente Sandbox

O que é a Transmissora de Dados

No Open Finance Brasil, a transmissora de dados é a instituição financeira onde o usuário mantém suas contas e produtos, e cujos dados serão compartilhados com outra instituição. É ela que autentica o usuário, exibe os termos do consentimento de dados e dá a aprovação final para que a receptora consuma as informações.

Durante a jornada de compartilhamento, após a receptora (sua aplicação, via Celcoin) criar o consentimento de dados, o usuário é obrigatoriamente redirecionado para o ambiente da transmissora para autenticação e aprovação. Somente após essa etapa o consentimento passa para o status AUTHORISED, o token do consentimento pode ser gerado e os dados podem ser consultados.

flowchart LR
    A["🏢 Receptora (sua aplicação via Celcoin)"] -->|"Cria consentimento POST /baas/v1/open/dat/consents"| B["🔐 Transmissora (detentora dos dados)"]
    B -->|"Usuário aprova → consentimento AUTHORISED"| A
    A -->|"Gera token do consentimento e consulta dados GET /baas/v1/open/dat/..."| B

    style A fill:#c6e2f5,stroke:#2980b9,color:#333
    style B fill:#d5f5d5,stroke:#27ae60,color:#333
ℹ️

Mesma instituição simulada do ITP. No sandbox, a transmissora de dados é a mesma instituição simulada usada nas jornadas de pagamento: o Bricks Demo. A diferença está no consentimento criado (de dados, e não de pagamento) e nas chamadas feitas depois da aprovação. Para a visão da detentora de contas nas jornadas de pagamento, consulte Detentora de Contas - Ambiente Sandbox.


Ambiente Sandbox — Bricks Demo

Para testes e homologação, a Celcoin disponibiliza o ambiente Bricks Demo, uma instituição simulada e completa que permite realizar todo o fluxo de autorização de consentimentos sem nenhuma integração bancária real.

InformaçãoValor
NomeFinansystech Banking Demo Auth Server
brandId66f4d9e296f18bc4606e1618
AmbienteSandbox (Bricks Demo)
Base URL da transmissorahttps://api-openfinance.opb.bricks.demo.fsapps.io
Base URL de autenticação ({{base_url}})https://sandbox.openfinance.celcoin.com.br
Base URL da API de dados ({{api_url}})https://sandbox.openfinance.celcoin.com.br
CPF do usuário de teste12345678909

O brandId da transmissora deve ser usado no campo brandId ao criar o consentimento de dados em ambiente sandbox. Caso queira localizá-lo pela API, consulte as marcas do tipo DATA (veja a Etapa API 1).

Credenciais de Homologação

Usuário: user01
Senha:   12345678

Essas credenciais representam o usuário de teste na transmissora Bricks Demo. Use-as em ambas as formas de aprovação: via navegador e via API.


Formas de Aprovação

Existem duas formas de completar a jornada de autorização do consentimento de dados no ambiente sandbox:

FormaQuando usar
Via navegadorTestes manuais, validação de UX, demonstrações
Via API (Postman)Automação, testes de integração, desenvolvimento

Em ambas, os passos antes e depois da aprovação são os mesmos: obter o token da aplicação, criar o consentimento, aprovar na transmissora, gerar o token do consentimento e consultar os dados.


Pré-requisito — Token da aplicação

POST {{base_url}}/v5/token

Gera o application_token, usado nas chamadas de consentimento. Utilize o client_id e o client_secret da sua aplicação.

POST {{base_url}}/v5/token
Content-Type: application/x-www-form-urlencoded

Request Body (x-www-form-urlencoded)

CampoValor
grant_typeclient_credentials
client_id{{client_id}}
client_secret{{client_secret}}

O script de teste salva o token automaticamente:

const jsonData = JSON.parse(responseBody);
if (jsonData.access_token) {
  pm.environment.set("application_token", jsonData.access_token);
}

Forma 1 — Aprovação via Navegador

Passo a passo

1. Gere o consentimento chamando POST /baas/v1/open/dat/consents com o brandId da transmissora (detalhes na Etapa API 2).

2. Copie a authorizationUrl retornada no response. Ela terá um formato parecido com:

https://api-openfinance.opb.bricks.demo.fsapps.io/orgs/bricks/auth?client_id=CSYrcp9dzeRdUWbuXLFiF&request_uri=urn%3Aietf%3Aparams%3Aoauth%3Arequest_uri%3A82A3zcrbiqhoh15jCL78A

3. Abra a URL no navegador. A página da transmissora Bricks Demo será exibida com os detalhes do consentimento.

4. Clique em "Simular login e aprovação". O ambiente Bricks Demo realiza automaticamente o login com o usuário de teste e exibe a tela de aprovação do consentimento de dados.

5. Confirme a aprovação. O usuário é redirecionado para a URL de retorno do consentimento.

6. Confira se o consentimento está AUTHORISED (GET /baas/v1/open/dat/consents, filtrando por filter.status=AUTHORISED) e siga para Gerar token do consentimento.

⚠️

A authorizationUrl expira em 60 minutos. Abra-a no navegador logo após recebê-la.


Forma 2 — Aprovação via API (Postman)

Esta forma é utilizada para automação e integração. O fluxo simula programaticamente as mesmas etapas que ocorrem no navegador, por meio de três chamadas sequenciais à API da transmissora Bricks Demo, entre a criação do consentimento e a geração do token.

Variáveis necessárias na Collection

VariávelOrigemDescrição
base_urlEnvironmentBase URL de autenticação (/v5/token)
api_urlEnvironmentBase URL da API de dados (/baas/v1/open/*)
client_id / client_secretEnvironmentCredenciais da sua aplicação
RP_CLIENT_ID / RP_CLIENT_SECRETEnvironmentCredenciais usadas na geração do token do consentimento
application_tokenGet Application Token (script)Token da aplicação, usado nas chamadas de consentimento
consent_idCreate Consent / Consent ListIdentificador do consentimento de dados
authorization_urlCreate ConsentURL de autorização retornada na criação do consentimento
login_interaction_idURL Autorização (script)Extraído do header Location
consent_interaction_idLogin (script)Extraído do campo url da resposta
rpt_tokenRequest OPF Token (script)Token do consentimento, usado nas chamadas de dados
accountId, creditCardAccountId, billId, investmentId, brokerNoteId, contractIdChamadas de listagem (scripts)Identificadores usados nas chamadas de detalhe

Os scripts de teste da collection do Postman preenchem essas variáveis automaticamente a cada chamada.

Etapa API 1 — Consultar marcas de dados (opcional)

GET {{api_url}}/baas/v1/open/itp/participants/brands?type=DATA&customerFriendlyName={{nome_da_marca}}

Lista as marcas que atuam como transmissoras de dados. Use para localizar o brandId da transmissora que será usada no consentimento.

GET {{api_url}}/baas/v1/open/itp/participants/brands?type=DATA&customerFriendlyName={{nome_da_marca}}
Authorization: Bearer {{application_token}}

Etapa API 2 — Criar consentimento

POST {{api_url}}/baas/v1/open/dat/consents

Cria o consentimento de dados na Celcoin. O consentimento nasce com status AWAITING_AUTHORISATION.

POST {{api_url}}/baas/v1/open/dat/consents
Content-Type: application/json
Authorization: Bearer {{application_token}}

Request Body

{
  "brandId": "66f4d9e296f18bc4606e1618",
  "data": {
    "loggedUser": {
      "document": {
        "identification": "12345678909",
        "rel": "CPF"
      }
    },
    "permissions": [
      "ACCOUNTS_READ",
      "ACCOUNTS_OVERDRAFT_LIMITS_READ",
      "ACCOUNTS_BALANCES_READ",
      "ACCOUNTS_TRANSACTIONS_READ",
      "CREDIT_CARDS_ACCOUNTS_BILLS_READ",
      "CREDIT_CARDS_ACCOUNTS_BILLS_TRANSACTIONS_READ",
      "CREDIT_CARDS_ACCOUNTS_LIMITS_READ",
      "CREDIT_CARDS_ACCOUNTS_READ",
      "CREDIT_CARDS_ACCOUNTS_TRANSACTIONS_READ",
      "CUSTOMERS_PERSONAL_ADITTIONALINFO_READ",
      "CUSTOMERS_PERSONAL_IDENTIFICATIONS_READ",
      "BANK_FIXED_INCOMES_READ",
      "CREDIT_FIXED_INCOMES_READ",
      "FUNDS_READ",
      "VARIABLE_INCOMES_READ",
      "TREASURE_TITLES_READ",
      "RESOURCES_READ"
    ]
  }
}
⚠️

O escopo RESOURCES_READ é obrigatório em todos os consentimentos de dados. As demais permissões devem respeitar os agrupamentos descritos em Como funciona consentimento e consumo de dados. Combinações fora do agrupamento retornam HTTP 422 (COMBINACAO_PERMISSOES_INCORRETA).

Response

O response traz o id do consentimento e a authorizationUrl.

{
  "id": "CONSENT_ID_AQUI",
  "authorizationUrl": "https://api-openfinance.opb.bricks.demo.fsapps.io/orgs/bricks/auth?client_id=...&request_uri=..."
}

Salve esses valores nas variáveis consent_id e authorization_url. Se quiser automatizar, adicione este script de teste à requisição:

var jsonData = JSON.parse(responseBody);
pm.collectionVariables.set("consent_id", jsonData.id);
pm.collectionVariables.set("authorization_url", jsonData.authorizationUrl);

Etapa API 3 — URL Autorização

GET {{authorization_url}}

Acessa a authorizationUrl do consentimento. O servidor da transmissora responde com 302 Found e um interactionId no header Location.

Configuração no Postman: desabilite Follow Redirects nas configurações da requisição para capturar o header Location.

GET {{authorization_url}}

Response — HTTP 302

HTTP/1.1 302 Found
Location: https://webconsentflow.opb.bricks.demo.fsapps.io?interactionId=n2voaWPj6V8rBu59dOqy6&...

O script de teste extrai e salva o interactionId automaticamente:

var interactionId = /interactionId=(.*?)(?:&|$)/.exec(
  pm.response.headers.get("location")
)[1];
pm.collectionVariables.set("login_interaction_id", interactionId);

Etapa API 4 — Login

POST /api/bricks/consents/v1/interactions/:interactionId/login

Autentica o usuário na transmissora Bricks Demo com as credenciais de sandbox.

POST https://api-openfinance.opb.bricks.demo.fsapps.io/api/bricks/consents/v1/interactions/{{login_interaction_id}}/login
Content-Type: application/json

Request Body

{
  "username": "user01",
  "password": "12345678"
}

Response — HTTP 200

{
  "url": "https://webconsentflow.opb.bricks.demo.fsapps.io?interactionId=def456uvwXYZ&session=abc..."
}

O script de teste extrai o consent_interaction_id da URL retornada:

var jsonData = JSON.parse(responseBody);
var interactionId = /interactionId=(.*?)&/.exec(jsonData.url)[1];
pm.collectionVariables.set("consent_interaction_id", interactionId);
⚠️

O interactionId retornado aqui é diferente do login_interaction_id. É o identificador da sessão de aprovação do consentimento.

Etapa API 5 — Approve

POST /api/bricks/consents/v1/interactions/:interactionId/consent

Aprova o consentimento de dados na transmissora, completando a jornada de autorização.

POST https://api-openfinance.opb.bricks.demo.fsapps.io/api/bricks/consents/v1/interactions/{{consent_interaction_id}}/consent
Content-Type: application/json

Request Body

{}

Response — Aprovação bem-sucedida

{
  "url": "http://localhost:8080/callback?code=AUTH_CODE_AQUI&id_token=ID_TOKEN_AQUI&state=STATE_AQUI"
}

Response — Rejeição pelo usuário

{
  "url": "http://localhost:8080/callback?error=access_denied&state=STATE_AQUI"
}

Após a aprovação, confira o status do consentimento. Ele deve estar AUTHORISED:

GET {{api_url}}/baas/v1/open/dat/consents?filter.status=AUTHORISED
Authorization: Bearer {{application_token}}

A listagem aceita os filtros count, page, filter.status, filter.cpf, filter.cnpj e filter.brandId.

Etapa API 6 — Gerar token do consentimento

POST {{api_url}}/baas/v1/open/dat/token

Gera o token usado nas consultas de dados. O token é vinculado ao consentimento por meio do scope.

POST {{api_url}}/baas/v1/open/dat/token
Content-Type: application/x-www-form-urlencoded
Authorization: Bearer {{application_token}}

Request Body (x-www-form-urlencoded)

CampoValor
client_id{{RP_CLIENT_ID}}
client_secret{{RP_CLIENT_SECRET}}
scopeconsent:{{consent_id}}

O script de teste salva o token do consentimento:

var jsonData = pm.response.json();
pm.environment.set("rpt_token", jsonData.access_token);
⚠️

As chamadas de dados usam o rpt_token, e não o application_token. Cada rpt_token pertence a um único consentimento.


Diagrama Completo da Jornada de Autorização

sequenceDiagram
    participant Postman as Postman / App (Receptora)
    participant Celcoin as API Celcoin (Dados)
    participant Bricks as Transmissora Bricks Demo

    Postman->>Celcoin: POST /v5/token
    Celcoin-->>Postman: { access_token }
    Note over Postman: Salva application_token

    Postman->>Celcoin: POST /baas/v1/open/dat/consents
    Celcoin-->>Postman: { id, authorizationUrl }
    Note over Postman: Salva consent_id<br/>e authorization_url

    Postman->>Bricks: GET {{authorization_url}}<br/>(Follow Redirects: OFF)
    Bricks-->>Postman: 302 Location: ?interactionId=login_id
    Note over Postman: Salva login_interaction_id

    Postman->>Bricks: POST /interactions/login_id/login<br/>{ username, password }
    Bricks-->>Postman: { url: ?interactionId=consent_id }
    Note over Postman: Salva consent_interaction_id

    Postman->>Bricks: POST /interactions/consent_id/consent<br/>{}
    Bricks-->>Postman: { url: callback?code&id_token&state }

    Postman->>Celcoin: GET /baas/v1/open/dat/consents?filter.status=AUTHORISED
    Celcoin-->>Postman: Consentimento AUTHORISED

    Postman->>Celcoin: POST /baas/v1/open/dat/token<br/>scope=consent:{consent_id}
    Celcoin-->>Postman: { access_token }
    Note over Postman: Salva rpt_token

    Postman->>Celcoin: GET /baas/v1/open/dat/resources<br/>(Bearer rpt_token)
    Celcoin-->>Postman: Recursos consentidos
    Postman->>Celcoin: GET /baas/v1/open/dat/accounts<br/>(Bearer rpt_token)
    Celcoin-->>Postman: Dados das contas

Consultando os dados após a aprovação

Com o consentimento em AUTHORISED e o rpt_token em mãos, a receptora consulta os dados diretamente na API da Celcoin. Todas as chamadas abaixo usam Authorization: Bearer {{rpt_token}} e retornam apenas o que foi coberto pelas permissões do consentimento.

Comece sempre por Recursos Consentidos e pelas listagens: elas retornam os identificadores (accountId, creditCardAccountId, investmentId etc.) usados nas chamadas de detalhe.

GET {{api_url}}/baas/v1/open/dat/resources
Authorization: Bearer {{rpt_token}}

Contas

RequisiçãoMétodoPath
Listar contasGET/baas/v1/open/dat/accounts
Detalhe da contaGET/baas/v1/open/dat/accounts/{{accountId}}
SaldosGET/baas/v1/open/dat/accounts/{{accountId}}/balances
TransaçõesGET/baas/v1/open/dat/accounts/{{accountId}}/transactions
Transações recentesGET/baas/v1/open/dat/accounts/{{accountId}}/transactions-current
Limites de cheque especialGET/baas/v1/open/dat/accounts/{{accountId}}/overdraft-limits

A consulta de transações aceita os parâmetros fromBookingDate, toBookingDate, page e page-size.

Cartões de crédito

RequisiçãoMétodoPath
Listar contas de cartãoGET/baas/v1/open/dat/credit-cards-accounts/accounts
Detalhe da conta de cartãoGET/baas/v1/open/dat/credit-cards-accounts/accounts/{{creditCardAccountId}}
FaturasGET/baas/v1/open/dat/credit-cards-accounts/accounts/{{creditCardAccountId}}/bills
Transações da faturaGET/baas/v1/open/dat/credit-cards-accounts/accounts/{{creditCardAccountId}}/bills/{{billId}}/transactions
LimitesGET/baas/v1/open/dat/credit-cards-accounts/accounts/{{creditCardAccountId}}/limits

Dados cadastrais

Disponíveis para pessoa física (personal) e pessoa jurídica (business):

RequisiçãoMétodoPath
IdentificaçãoGET/baas/v1/open/dat/customers/{personal ou business}/identifications
QualificaçãoGET/baas/v1/open/dat/customers/{personal ou business}/qualifications
Relações financeirasGET/baas/v1/open/dat/customers/{personal ou business}/financial-relations

Investimentos

Os tipos credit-fixed-incomes, bank-fixed-incomes, treasure-titles, variable-incomes e funds seguem o mesmo padrão:

RequisiçãoMétodoPath
Listar investimentosGET/baas/v1/open/dat/{tipo}/investments
Detalhe do investimentoGET/baas/v1/open/dat/{tipo}/investments/{{investmentId}}
SaldosGET/baas/v1/open/dat/{tipo}/investments/{{investmentId}}/balances
TransaçõesGET/baas/v1/open/dat/{tipo}/investments/{{investmentId}}/transactions
Transações recentesGET/baas/v1/open/dat/{tipo}/investments/{{investmentId}}/transactions-current

Para renda variável (variable-incomes), há ainda a nota de corretagem: GET /baas/v1/open/dat/variable-incomes/investments/{{investmentId}}/broker-notes/{{brokerNoteId}}.

Operações de crédito

Os tipos loans (empréstimos) e financings (financiamentos) seguem o mesmo padrão:

RequisiçãoMétodoPath
Listar contratosGET/baas/v1/open/dat/{tipo}/contracts
Detalhe do contratoGET/baas/v1/open/dat/{tipo}/contracts/{{contractId}}
GarantiasGET/baas/v1/open/dat/{tipo}/contracts/{{contractId}}/warranties
ParcelasGET/baas/v1/open/dat/{tipo}/contracts/{{contractId}}/scheduled-instalments
PagamentosGET/baas/v1/open/dat/{tipo}/contracts/{{contractId}}/payments

Os demais grupos de dados seguem as páginas de referência de cada API em Recepção de Dados.

ℹ️

Se o escopo necessário não estiver no consentimento aprovado, a API pode responder HTTP 403 com a mensagem no resource allowed.

Gerenciando o consentimento

RequisiçãoMétodoPath
Listar consentimentosGET/baas/v1/open/dat/consents
Revogar consentimentoDELETE/baas/v1/open/dat/consents/{{consent_id}}

Ambas usam Authorization: Bearer {{application_token}}. Para repetir a jornada do zero, revogue o consentimento de teste e crie um novo.


Exemplo de Uso — Consentimento de Dados

A collection de exemplo do fluxo de dados usa as seguintes requisições:

RequisiçãoMétodoURL
Get Application TokenPOST{{base_url}}/v5/token
1.1. Request Brands DataGET{{api_url}}/baas/v1/open/itp/participants/brands?type=DATA&customerFriendlyName={{nome_da_marca}}
1.2. Create ConsentPOST{{api_url}}/baas/v1/open/dat/consents
URL AutorizaçãoGET{{authorization_url}}
LoginPOSThttps://api-openfinance.opb.bricks.demo.fsapps.io/api/bricks/consents/v1/interactions/{{login_interaction_id}}/login
ApprovePOSThttps://api-openfinance.opb.bricks.demo.fsapps.io/api/bricks/consents/v1/interactions/{{consent_interaction_id}}/consent
1.3. Consent ListGET{{api_url}}/baas/v1/open/dat/consents
2.1. Request OPF TokenPOST{{api_url}}/baas/v1/open/dat/token
ResourcesGET{{api_url}}/baas/v1/open/dat/resources
1.4. Consent RevokeDELETE{{api_url}}/baas/v1/open/dat/consents/{{consent_id}}

As requisições URL Autorização, Login e Approve são as mesmas usadas nas jornadas de pagamento, pois a instituição simulada é a mesma. A collection de dados não inclui essas três etapas, então importe-as da collection do ITP.


Estados do Consentimento de Dados

StatusSignificado
AWAITING_AUTHORISATIONConsentimento criado, aguardando a aprovação do usuário na transmissora
AUTHORISEDUsuário aprovou. A consulta de dados está liberada
REJECTEDConsentimento revogado, expirado ou rejeitado

Pontos de Atenção

⚠️

Follow Redirects deve estar desativado na requisição URL Autorização do Postman. Se estiver ativado, o Postman seguirá o redirect automaticamente e o script não conseguirá capturar o interactionId do header Location.

⚠️

Dois interactionId distintos no fluxo via API: o login_interaction_id é obtido no step de URL Autorização (header Location). O consent_interaction_id é obtido no step de Login (campo url do body). São IDs diferentes e usados em endpoints diferentes — não os confunda.

⚠️

authorizationUrl é de uso único e expira em 60 minutos. Após a aprovação ou expiração, a URL não pode mais ser usada. Gere um novo consentimento se necessário.

⚠️

Dois tokens diferentes. O application_token autentica as chamadas de consentimento (criar, listar, revogar). O rpt_token, gerado com scope=consent:{{consent_id}}, autentica as chamadas de dados. Usar o token errado causa erro de autorização.

⚠️

Gere o token só depois da aprovação. O token do consentimento depende de o consentimento estar AUTHORISED. Confira o status antes de chamar a geração do token.

⚠️

RESOURCES_READ é obrigatório. Todo consentimento de dados deve incluir o escopo de recursos. As demais permissões precisam respeitar os agrupamentos definidos. Erros de combinação retornam HTTP 422.

⚠️

Validade máxima de 1 ano. O campo expirationDateTime, quando informado, não pode estar no passado nem exceder um ano. Caso contrário, o consentimento é rejeitado com HTTP 422.

⚠️

Ambiente exclusivo para testes. O Bricks Demo não deve ser usado em produção. Em produção, o usuário seleciona sua instituição financeira real na lista de participantes e os dados vêm da transmissora real.


Did this page help you?