Power BI e Excel
Como ler balancetes e conciliações do TOPO no Power BI ou no Excel, por REST ou GraphQL.
Esta página é para quem monta relatórios de BI com os dados do TOPO. Ela mostra como ler as rotas de leitura no Power BI e no Excel (Power Query), por REST e por GraphQL. Nada aqui altera dados no TOPO.
O que você precisa
- Uma chave de API com os escopos de leitura que o relatório usa. Peça ao suporte TOPO por um chamado. Para um painel de conciliações, por exemplo:
companies:read,trial_balances:readereconciliations:read. Para GraphQL,analytics:read. - O endereço da API do ambiente:
https://api.topocontabil.com.brem produção.
As respostas vêm planas, uma coluna por campo, para o Power Query montar a tabela sem expandir registros aninhados.
REST, com paginação
Cada rota de leitura devolve uma página: data traz as linhas e pagination traz page, limit, total e pages. Peça páginas de 100 linhas (limit=100) e repita até pagination.pages.
Exemplo com curl, conciliações da empresa 12 em agosto de 2026:
curl -s "$TOPO_API/api/v1/reconciliations?companyId=12&period=2026-08&limit=100&page=1" \
-H "X-API-Key: $TOPO_CHAVE"Cada linha traz a conta, o status, o responsável atual, o prazo, a situação do prazo e os saldos:
{
"id": 5120,
"empresaId": 12,
"empresaNome": "Transportes Exemplo Ltda",
"competencia": "2026-08",
"contaCodigo": "1.1.01.001",
"contaDescricao": "Caixa Geral",
"status": "IN_ELABORATION",
"responsavelNome": "Mariana Souza",
"responsavelPapel": "Elaborador",
"prazo": "2026-09-05T00:00:00.000Z",
"slaStatus": "ON_TIME",
"saldoContabil": 1150.5,
"saldoConciliado": 1150.5,
"diferenca": 0,
"ajustes": 0
}No Power BI ou no Excel (Power Query)
- No Power BI, crie um parâmetro chamado
ChaveTopocom a chave. No Excel, guarde a chave numa célula nomeada e leia comExcel.CurrentWorkbook(), ou use um parâmetro do Power Query. - Abra Obter dados > Consulta em branco > Editor avançado e cole a consulta abaixo. Ela lê todas as páginas de conciliações de uma competência.
let
Base = "https://api.topocontabil.com.br",
Pagina = (n as number) =>
Json.Document(Web.Contents(Base, [
RelativePath = "api/v1/reconciliations",
Query = [period = "2026-08", limit = "100", page = Number.ToText(n)],
Headers = [#"X-API-Key" = ChaveTopo]
])),
Primeira = Pagina(1),
Total = Primeira[pagination][pages],
Paginas = List.Transform({1..Total}, each if _ = 1 then Primeira else Pagina(_)),
Linhas = List.Combine(List.Transform(Paginas, each _[data])),
Tabela = Table.FromRecords(Linhas)
in
Tabela- Quando o Power BI pedir a credencial da fonte, escolha Anônimo: a chave já vai no cabeçalho
X-API-Key. - Para outra tabela, troque o
RelativePathe oQuery:api/v1/trial-balances(balancetes),api/v1/companies(empresas) ouapi/v1/trial-balances/318/lines(linhas do balancete 318).
Uma atualização do relatório faz uma chamada por página. Com 30 chamadas por minuto por rota, uma tabela de até 3.000 linhas atualiza dentro do limite. Acima disso, filtre por empresa ou competência. Veja limites.
GraphQL
A rota POST /api/v1/graphql traz os mesmos dados numa chamada só, escolhendo os campos. Ela é só de leitura.
curl -s -X POST "$TOPO_API/api/v1/graphql" \
-H "X-API-Key: $TOPO_CHAVE" \
-H "Content-Type: application/json" \
-d '{"query":"query Saldos($empresa: Int!, $competencia: String!) { balancetes(companyId: $empresa, period: $competencia) { data { id competencia status linhas } } }","variables":{"empresa":12,"competencia":"2026-08"}}'Resultado esperado:
{
"data": {
"balancetes": {
"data": [{ "id": 318, "competencia": "2026-08", "status": "RELEASED", "linhas": 474 }]
}
}
}As consultas disponíveis são empresas, planosDeContas, contas, balancetes, linhasDoBalancete e conciliacoes, com os mesmos filtros (companyId, period) e a mesma paginação (page, limit) da REST.
No Power Query, mande o GraphQL com Web.Contents e a opção Content, que faz a chamada virar POST:
Json.Document(Web.Contents("https://api.topocontabil.com.br", [
RelativePath = "api/v1/graphql",
Headers = [#"X-API-Key" = ChaveTopo, #"Content-Type" = "application/json"],
Content = Text.ToBinary("{""query"":""{ empresas(limit: 100) { data { id razaoSocial cnpj } } }""}")
]))Quando der errado
| Sintoma | Causa provável | O que fazer |
|---|---|---|
| 401 no Power BI | Chave errada ou parâmetro vazio. | Confira o parâmetro ChaveTopo. |
403 Escopo insuficiente | A chave não tem o escopo da tabela. | Abra um chamado e peça ao suporte TOPO o escopo que falta. |
| 429 na atualização | Páginas demais em um minuto. | Filtre a consulta ou espace as atualizações. |
400 COMPLEXIDADE_EXCEDIDA no GraphQL | Consulta pede dados demais. | Peça menos campos ou limit menor. |