TOMÉ.
API & MCP
Documentação

API & MCP.

Três funções do Tomé funcionam por integração: o Valide seu XML (pré-envio de informe ao Fundos.net) e o Export por administradora (o consolidado dos fundos — FIDC, FII e FIF — em planilha, direto pro seu cruzamento), com a chave de API tome_…; e a Planilha viva (DY real 12m, P/VP e PL de um FII direto no seu Google Sheets ou Excel, seção 6), com uma chave própria tomeplan_…. No seu pipeline interno, num script agendado ou direto de um agente de IA via MCP. Mesmo motor das interfaces, mesmos dados, mesmas regras.

1 · Autenticação — sua chave de API
1.

Crie sua conta (ou entre) no Tomé.

2.

Na página Sua conta, seção "Chave de API", clique em gerar chave. A chave (tome_…) aparece uma única vez — guarde num cofre de segredos. Gerar outra revoga a anterior.

3.

Envie a chave em toda requisição, no header Authorization: Bearer <chave>. A mesma chave vale pra API e pro MCP.

2 · API REST
POST /api/v1/validar-xml

Multipart, com o XML do informe no campo arquivo. O nome do arquivo é ignorado de propósito (não o usamos pra nada). Teto: 5 MB.

curl -X POST https://www.agentetome.com/api/v1/validar-xml \
  -H "Authorization: Bearer tome_SUA_CHAVE" \
  -F "arquivo=@informe_mensal.xml"

Resposta — o laudo em 4 níveis (mesmo da interface):

{
  "ok": true,                       // false = problema hard-estrutural (HTTP 422)
  "leiaute": "6.6",                 // versão do leiaute detectada no documento
  "provavel_recusa": [ ... ],       // 🔴 o que tende a travar o envio no protocolo
  "schema_fnet":     { ... },       // 🟠 estrutura vs leiaute (esquema derivado)
  "vale_conferir":   [ ... ],       // 🟡 contas internas que não fecham
  "informacao":      [ ... ],       // 🔵 fatos que valem registro (ex.: PL negativo)
  "composicao":      { ... },       // classes de cota: soma vs PL declarado
  "contadores": { "qt_bloqueante": 0, "qt_conferir": 0, "qt_ok": 5, ... }
}
HTTPSignificado
200Laudo emitido (pode conter apontamentos 🟡/🔵)
422Laudo emitido com problema hard-estrutural (🔴 — ex.: o arquivo é uma página HTML, não o XML)
401Chave ausente/inválida/revogada
413Arquivo acima de 5 MB
429Limite de uso da chave (padrão 30/min) — honre o Retry-After
503Motor indisponível — tente de novo
3 · MCP (Model Context Protocol)

Pra agentes de IA (Claude, e qualquer cliente MCP por HTTP): o Tomé expõe um servidor MCP com a tool validar_informe_xml. Endpoint único, JSON-RPC 2.0:

POST https://www.agentetome.com/api/mcp
Authorization: Bearer tome_SUA_CHAVE
Content-Type: application/json

Métodos: initialize, tools/list e tools/call. A tool recebe o XML em base64:

{
  "jsonrpc": "2.0", "id": 1, "method": "tools/call",
  "params": {
    "name": "validar_informe_xml",
    "arguments": { "xml_base64": "<conteúdo do XML em base64>" }
  }
}

A resposta vem em result.content[0].text com o MESMO laudo JSON da API (e isError: true quando o problema é hard-estrutural). Exemplo de configuração num cliente MCP genérico por HTTP:

{
  "mcpServers": {
    "tome-valide-xml": {
      "url": "https://www.agentetome.com/api/mcp",
      "headers": { "Authorization": "Bearer tome_SUA_CHAVE" }
    }
  }
}
4 · Export por administradora

O mesmo pacote da página /exportar, sem humano clicando em download: o consolidado dos fundos de uma administradora (1 linha por fundo×competência, chave de junção CNPJ de 14 dígitos como texto + competência YYYY-MM), satélites de classes e aging (FIDC) e a visão de qualidade operacional. Dado 100% público (CVM/FNET), schema versionado (v1: coluna não some nem renomeia; adição só no fim), célula vazia = não declarado.

GET /api/v1/export/admin
curl -L -o export-ot.zip \
  -H "Authorization: Bearer tome_SUA_CHAVE" \
  "https://www.agentetome.com/api/v1/export/admin?admin=oliveira%20trust&formato=csv&corte=competencia&competencia=2026-06"
ParâmetroValoresNota
adminnome ou CNPJ (14 dígitos)obrigatório. Nome casa o grupo de grafias da administradora (ex.: as 4 razões sociais da mesma casa); o manifest lista o que casou.
formatocsv | xlsxcsv = ZIP de CSVs com manifest.json dentro (pipeline); xlsx = Excel multi-aba com aba leia_me (humano). Default xlsx.
corterecente | competenciarecente (default) = última competência declarada de cada fundo; competencia = fechamento de um mês — fundo que não entregou vira linha com status_entrega.
competenciaYYYY-MMsó com corte=competencia; default = competência mais recente da base.

Resposta — o arquivo binário (Content-Disposition: attachment). O header X-Tome-Export-Cache: hit|miss conta se veio do cache do dia (repetir o mesmo pedido no mesmo dia não custa nada). O contrato do pacote — grafias que casaram, janela de dados, notas de método, contagem de linhas por arquivo — vai no manifest.json (dentro do ZIP) e também em endpoint próprio, útil pra checar antes de baixar (ou quando consome XLSX):

curl -H "Authorization: Bearer tome_SUA_CHAVE" \
  "https://www.agentetome.com/api/v1/export/admin/manifest?admin=oliveira%20trust&corte=recente"
HTTPSignificado
200Arquivo (ou manifest) entregue
400admin ausente ou competencia fora de YYYY-MM
401Chave ausente/inválida/revogada
404Nenhum fundo dessa administradora na base
429Limite de export da chave (padrão 10/hora, compartilhado com a tool MCP) ou fila de geração cheia — honre o Retry-After
503Geração passou do teto de tempo — tente de novo
Tool MCP exportar_admin

No mesmo servidor MCP da seção 3 (mesmo endpoint, mesma chave). A tool recebe admin / corte / competencia / formato e devolve um link de download temporário (validade 1h) — nunca o binário dentro do JSON:

{
  "jsonrpc": "2.0", "id": 2, "method": "tools/call",
  "params": {
    "name": "exportar_admin",
    "arguments": { "admin": "oliveira trust", "corte": "recente", "formato": "csv" }
  }
}

Resposta (em result.content[0].text):

{
  "arquivo": "tome-export-oliveira-trust-foto-atual-2026-07-22.zip",
  "formato": "zip_de_csvs",
  "tamanho_bytes": 118742,
  "link_download": "https://www.agentetome.com/api/export/download?t=eyJ…",
  "expira_em": "2026-07-22T18:40:00.000Z",
  "como_baixar": "GET simples no link (sem header de auth — a assinatura no token é a credencial; validade 1h).",
  "manifest": { "schema_versao": 1, "filtro": { … }, "arquivos": { … }, "notas_metodo": { … } }
}

O link é assinado (HMAC) e expira em 1 hora; qualquer um com o link baixa o arquivo dentro da validade — trate-o como o próprio arquivo. A geração conta no limite de 10/hora da chave; o download pelo link, não.

5 · Limites honestos
Este check é preventivo, não o validador oficial. Ele cobre hoje o informe mensal de FIDC (leiaute FNET). A CVM não publica o XSD oficial do informe — a conferência de estrutura usa um esquema que derivamos do leiaute publicado. Passar aqui reduz muito o risco de recusa e de reapresentação, mas não garante o aceite do Fundos.net. O laudo aponta FATOS do documento ("as faixas somam X, o total declara Y"), nunca veredito regulatório.

Privacidade por construção: o XML entra, é analisado em memória e descartado — não guardamos o arquivo, o CNPJ nem os valores. O que fica registrado (pra operação do serviço) são só contadores e códigos de regra, sem conteúdo. Nada é enviado à CVM por aqui.

No export: a base cobre o que a CVM/FNET publica e o Tomé já ingeriu — fundo ausente aparece como ausência, e ausência também é informação. No corte recente os meses variam por fundo por design (a coluna competencia acompanha toda linha); dias_atraso usa régua aproximada declarada no manifest. Todo número carrega o informe_id de origem — nada é estimado, nada é preenchido.

Na planilha viva: os limites da chave tomeplan_… estão na tabela da seção 6 — cada teto explicado com o porquê, e as mensagens de erro exatamente como aparecem na célula da sua planilha.

6 · Planilha viva (Google Sheets / Excel)

O dado do Tomé DENTRO da sua planilha, atualizando sozinho: DY real 12 meses (soma dos rendimentos por cota em 12 meses fechados ÷ preço B3 — não o DY declarado), P/VP, PL e as flags de honestidade, tudo com fonte por linha. Zero raspagem de site: é a mesma base pública (CVM/FNET + B3 COTAHIST) do chat, servida em CSV por um SELECT.

1.

Na página Sua conta, seção "Planilha / API", gere sua chave de planilha (tomeplan_…). Ela é separada da chave de API principal, só-leitura e vale só nestas rotas — foi feita pra viver numa URL de planilha; revogar uma não afeta a outra.

2.

Cole a fórmula no Google Sheets (a conta já entrega a fórmula pronta, com a sua chave embutida):

=IMPORTDATA("https://www.agentetome.com/api/v1/ticker/XPML11.csv?chave=tomeplan_SUA_CHAVE&locale=br")
3.

Troque XPML11 pelo fundo que você quiser. Pra puxar de uma vez todos os fundos que você acompanha no Tomé (1 linha por fundo, mesmas colunas):

=IMPORTDATA("https://www.agentetome.com/api/v1/watchlist.csv?chave=tomeplan_SUA_CHAVE&locale=br")

locale=br: com ele o CSV sai com ; de separador e vírgula decimal — o formato que um Sheets/Excel em português entende como NÚMERO. Sem o parâmetro, o CSV é o padrão RFC (, + ponto decimal) — num Sheets pt-BR os números virariam texto (pegadinha clássica do IMPORTDATA). Excel: mesma URL em Dados → Da Web (ou =WEBSERVICE+Power Query) — funciona igual.

Teste sem conta (demo)

Quer ver funcionando antes de criar conta? Este endpoint é aberto e devolve 1 fundo fixo (XPML11), com dado real:

=IMPORTDATA("https://www.agentetome.com/api/v1/ticker/demo.csv?locale=br")
GET /api/v1/ticker/<TICKER>.csv  ·  .json  ·  GET /api/v1/watchlist.csv

A chave vai na URL (?chave=tomeplan_…) — o IMPORTDATA não envia headers — ou, pra scripts, no header Authorization: Bearer tomeplan_…. A variante .json devolve os mesmos campos com status HTTP real (integração séria usa ela). Cache de 15 minutos do nosso lado (o dado muda 1×/dia); o Google ainda aplica um cache próprio de até ~1h no IMPORTDATA — a planilha pode levar até uma hora pra refletir o dado novo, por conta dele.

Colunas (contrato v1 — coluna não some nem renomeia; adição só no fim):

ColunaO que é (significado honesto)
ticker · cnpj · nomeIdentificação. CNPJ vem como TEXTO entre aspas (zero à esquerda é sagrado).
preco_b3 · pregaoFechamento mais recente (B3 COTAHIST) e a data do pregão. Fundo sem cotação = células vazias.
dy_real_12m_pctSoma dos RENDIMENTOS por cota em 12 meses-calendário FECHADOS ÷ preço B3 × 100. Não é o DY declarado do informe; o mês corrente parcial nunca entra.
soma_rendimentos_12m · n_pagamentos_12m · meses_distintosO numerador aberto: R$/cota somado, quantos pagamentos, em quantos meses distintos.
janela_completafalse = a soma NÃO cobre 12 meses (cobertura em expansão — ausência não prova que o fundo não distribuiu). Não rotule como "12 meses" quando for false.
soma_amortizacoes_12mDevolução de principal na janela (R$/cota). NÃO é renda e fica FORA do DY — reportada à parte pra nunca esconder devolução de capital.
p_vp · vpc · plPreço ÷ valor patrimonial da cota (VPC declarado no informe mensal vigente), o VPC e o PL.
competencia_informe · fonte_informe_idA fonte: competência e id do informe FNET de onde saíram VPC/PL. Rastreabilidade viaja no dado.
dy_zero_suspeitotrue = na janela há mês com DY declarado zero e rendimentos a distribuir materiais no balanço — o DY declarado tende a subestimar; o DY real é a leitura mais fiel.
atualizado_emQuando a base foi materializada (UTC).

Célula vazia = valor não declarado — nunca inventamos 0. Nenhuma coluna de recomendação, nota ou score: a pré-análise é sua. Cobertura v1: FII (551 fundos com DY real na base) — FIDC/FIF/CRI-CRA na planilha viva ficam pra uma v2 com colunas próprias por classe.

Limites (e o porquê de cada um):

LimiteValorPor quê
Por chave, por hora60O IMPORTDATA re-busca ~1×/hora — 60/h acomoda uma planilha com dezenas de abas.
Por chave, por dia300Planilha de 30 abas aberta as ~10h de um dia útil; nega bot 24/7.
Fundos distintos por dia50Watchlist cheia (30) + consultas avulsas. Repetir o MESMO fundo não consome.
Por IP, por hora1202 contas reais atrás do mesmo NAT cabem; farm de contas não escala.

Varredura automatizada da base (muitos fundos em sequência alfabética) suspende a chave na hora — você reativa sozinho na sua conta na primeira vez. O seu uso do dia (requisições e fundos distintos) fica visível na conta, antes de qualquer limite bater.

Erros — legíveis na célula. As rotas .csv respondem HTTP 200 com uma única célula em português (o Sheets mostraria só "Error: resource at url…"); as rotas .json respondem o status real (401/403/404/429/503) com {codigo, mensagem}. As mensagens, exatamente como aparecem na planilha:

SituaçãoCélula que você vê.json
Chave ausenteTomé: falta a chave na URL. Copie a fórmula pronta em agentetome.com/conta (seção Planilha / API).401 chave_ausente
Chave inválida/revogadaTomé: chave inválida ou revogada. Gere uma nova em agentetome.com/conta.401 chave_invalida
Chave principal (tome_) usada aquiTomé: essa é a chave de API principal (tome_). A planilha usa a chave dedicada tomeplan_ — gere em agentetome.com/conta.401 chave_escopo
Chave suspensaTomé: chave suspensa por uso automatizado. Reative em agentetome.com/conta.403 chave_suspensa
Limite por horaTomé: limite de consultas por hora atingido. A planilha volta a atualizar na próxima hora.429 limite_hora
Limite diário / fundos distintosTomé: limite diário atingido (300 consultas ou 50 fundos). Veja seu uso em agentetome.com/conta.429 limite_dia
Ticker não encontradoTomé: ticker VGIA99 não encontrado na base.404 ticker_desconhecido
Sobrecarga / manutençãoTomé: serviço momentaneamente sobrecarregado. Sua planilha atualiza sozinha em breve.503 sobrecarga

Uso próprio; redistribuição comercial do CSV é proibida. O dado é público e de graça no próprio site — a fonte (fonte_informe_id, competencia_informe, pregao) viaja em cada linha.

Dúvidas ou um caso de uso que a API ainda não cobre? Pergunta pro Tomé no chat — as conversas são lidas por gente.