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ção | Valor |
|---|---|
| Nome | Finansystech Banking Demo Auth Server |
| brandId | 66f4d9e296f18bc4606e1618 |
| Ambiente | Sandbox (Bricks Demo) |
| Base URL da transmissora | https://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 teste | 12345678909 |
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: 12345678Essas 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:
| Forma | Quando usar |
|---|---|
| Via navegador | Testes 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-urlencodedRequest Body (x-www-form-urlencoded)
| Campo | Valor |
|---|---|
grant_type | client_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%3A82A3zcrbiqhoh15jCL78A3. 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.
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ável | Origem | Descrição |
|---|---|---|
base_url | Environment | Base URL de autenticação (/v5/token) |
api_url | Environment | Base URL da API de dados (/baas/v1/open/*) |
client_id / client_secret | Environment | Credenciais da sua aplicação |
RP_CLIENT_ID / RP_CLIENT_SECRET | Environment | Credenciais usadas na geração do token do consentimento |
application_token | Get Application Token (script) | Token da aplicação, usado nas chamadas de consentimento |
consent_id | Create Consent / Consent List | Identificador do consentimento de dados |
authorization_url | Create Consent | URL de autorização retornada na criação do consentimento |
login_interaction_id | URL Autorização (script) | Extraído do header Location |
consent_interaction_id | Login (script) | Extraído do campo url da resposta |
rpt_token | Request OPF Token (script) | Token do consentimento, usado nas chamadas de dados |
accountId, creditCardAccountId, billId, investmentId, brokerNoteId, contractId | Chamadas 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 escopoRESOURCES_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/jsonRequest 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);
OinteractionIdretornado aqui é diferente dologin_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/jsonRequest 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)
| Campo | Valor |
|---|---|
client_id | {{RP_CLIENT_ID}} |
client_secret | {{RP_CLIENT_SECRET}} |
scope | consent:{{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 orpt_token, e não oapplication_token. Cadarpt_tokenpertence 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ção | Método | Path |
|---|---|---|
| Listar contas | GET | /baas/v1/open/dat/accounts |
| Detalhe da conta | GET | /baas/v1/open/dat/accounts/{{accountId}} |
| Saldos | GET | /baas/v1/open/dat/accounts/{{accountId}}/balances |
| Transações | GET | /baas/v1/open/dat/accounts/{{accountId}}/transactions |
| Transações recentes | GET | /baas/v1/open/dat/accounts/{{accountId}}/transactions-current |
| Limites de cheque especial | GET | /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ção | Método | Path |
|---|---|---|
| Listar contas de cartão | GET | /baas/v1/open/dat/credit-cards-accounts/accounts |
| Detalhe da conta de cartão | GET | /baas/v1/open/dat/credit-cards-accounts/accounts/{{creditCardAccountId}} |
| Faturas | GET | /baas/v1/open/dat/credit-cards-accounts/accounts/{{creditCardAccountId}}/bills |
| Transações da fatura | GET | /baas/v1/open/dat/credit-cards-accounts/accounts/{{creditCardAccountId}}/bills/{{billId}}/transactions |
| Limites | GET | /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ção | Método | Path |
|---|---|---|
| Identificação | GET | /baas/v1/open/dat/customers/{personal ou business}/identifications |
| Qualificação | GET | /baas/v1/open/dat/customers/{personal ou business}/qualifications |
| Relações financeiras | GET | /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ção | Método | Path |
|---|---|---|
| Listar investimentos | GET | /baas/v1/open/dat/{tipo}/investments |
| Detalhe do investimento | GET | /baas/v1/open/dat/{tipo}/investments/{{investmentId}} |
| Saldos | GET | /baas/v1/open/dat/{tipo}/investments/{{investmentId}}/balances |
| Transações | GET | /baas/v1/open/dat/{tipo}/investments/{{investmentId}}/transactions |
| Transações recentes | GET | /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ção | Método | Path |
|---|---|---|
| Listar contratos | GET | /baas/v1/open/dat/{tipo}/contracts |
| Detalhe do contrato | GET | /baas/v1/open/dat/{tipo}/contracts/{{contractId}} |
| Garantias | GET | /baas/v1/open/dat/{tipo}/contracts/{{contractId}}/warranties |
| Parcelas | GET | /baas/v1/open/dat/{tipo}/contracts/{{contractId}}/scheduled-instalments |
| Pagamentos | GET | /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 mensagemno resource allowed.
Gerenciando o consentimento
| Requisição | Método | Path |
|---|---|---|
| Listar consentimentos | GET | /baas/v1/open/dat/consents |
| Revogar consentimento | DELETE | /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ção | Método | URL |
|---|---|---|
| Get Application Token | POST | {{base_url}}/v5/token |
| 1.1. Request Brands Data | GET | {{api_url}}/baas/v1/open/itp/participants/brands?type=DATA&customerFriendlyName={{nome_da_marca}} |
| 1.2. Create Consent | POST | {{api_url}}/baas/v1/open/dat/consents |
| URL Autorização | GET | {{authorization_url}} |
| Login | POST | https://api-openfinance.opb.bricks.demo.fsapps.io/api/bricks/consents/v1/interactions/{{login_interaction_id}}/login |
| Approve | POST | https://api-openfinance.opb.bricks.demo.fsapps.io/api/bricks/consents/v1/interactions/{{consent_interaction_id}}/consent |
| 1.3. Consent List | GET | {{api_url}}/baas/v1/open/dat/consents |
| 2.1. Request OPF Token | POST | {{api_url}}/baas/v1/open/dat/token |
| Resources | GET | {{api_url}}/baas/v1/open/dat/resources |
| 1.4. Consent Revoke | DELETE | {{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
| Status | Significado |
|---|---|
AWAITING_AUTHORISATION | Consentimento criado, aguardando a aprovação do usuário na transmissora |
AUTHORISED | Usuário aprovou. A consulta de dados está liberada |
REJECTED | Consentimento 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 ointeractionIddo headerLocation.
DoisinteractionIddistintos no fluxo via API: ologin_interaction_idé obtido no step de URL Autorização (headerLocation). Oconsent_interaction_idé obtido no step de Login (campourldo 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. Oapplication_tokenautentica as chamadas de consentimento (criar, listar, revogar). Orpt_token, gerado comscope=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 estarAUTHORISED. 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.
Updated about 1 hour ago