Selo de estado:
Preview— referência dos contratos transversais das rotas/api/v1/**. Atualizado em 2026-09-06.
Página de referência para tudo que é comum às integrações: formato de erro, códigos HTTP, limites, rate limit, paginação, idempotência e o estado dos webhooks.
Disponibilidade#
- Aplica-se a todas as rotas
/api/v1/**. As superfícies estão em estados distintos: OData e Embed =Preview; API de consulta REST = fora de GA.
Permissões#
- Ver Autenticação. Erros de permissão retornam
401(credencial) ou403(papel/escopo insuficiente).
Formato de erro#
Toda falha responde JSON com uma mensagem em português e o código HTTP correspondente:
{ "error": "Mensagem explicando o que aconteceu." }O OData acrescenta o cabeçalho OData-Version: 4.0. Respostas de sucesso e de
erro trazem X-Ingestia-Access-Scope: workspace e os cabeçalhos de CORS.
Catálogo de códigos HTTP#
| Código | Significado | Causas típicas |
|---|---|---|
200 | OK | leitura bem-sucedida |
204 | No Content | resposta ao pré-flight OPTIONS (CORS) |
400 | Requisição inválida | JSON malformado, sql ausente, $skiptoken inválido, paginação além do teto |
401 | Não autenticado | chave ausente, inválida ou revogada |
402 | Pagamento necessário | workspace inadimplente/suspenso — extração paga bloqueada |
403 | Proibido | papel/escopo insuficiente, SQL não-SELECT, referência fora do workspace/marts |
404 | Não encontrado | EntitySet OData inexistente (também protege contra enumeração) |
429 | Muitas requisições | estourou o rate limit (traz Retry-After) |
501 | Não implementado | operação OData fora do subset suportado (filtro/opção) |
502 | Erro no datalake | falha ao executar a consulta |
503 | Indisponível | datalake não provisionado, nuvem própria caída, ou limitador de requisições indisponível (traz Retry-After) |
Sobre o
503do limitador: as rotas/api/v1executam processamento pago no datalake. Se o serviço de rate limit ficar indisponível, a API nega (503) em vez de liberar sem teto (comportamento fail-closed). Respeite oRetry-After.
Rate limit#
Limites por janela de 1 minuto, aplicados por chave e por workspace (uma chave vazada não fura o teto do workspace):
| Bucket | Por chave | Por workspace |
|---|---|---|
Leitura (OData, tables) | 120/min | 240/min |
SQL livre (query) | 60/min | 120/min |
- Estouro →
429comRetry-After: 60. - Limitador indisponível →
503comRetry-After: 60(fail-closed). - Os buckets de API são separados do BI nativo — consumo externo não degrada a plataforma.
Paginação#
REST (/api/v1/tables/{dataset}/{table}): por limit/offset.
limitpadrão 100, máximo 1000;offseté o deslocamento.- A resposta traz
nextOffset(ounullno fim).
OData (server-driven):
- Páginas de até 1.000 linhas com
@odata.nextLink; siga o link exatamente (carrega um$skiptokenopaco). Token adulterado →400. Prefer: odata.maxpagesize=Nreduz a página (teto 1.000); respondePreference-Applied.- Profundidade máxima: 1.000.000 de linhas por consulta; acima →
400orientando a filtrar (cada página varre a tabela inteira no datalake).
Idempotência#
- Toda a API é somente leitura — não há endpoint de escrita. Requisições
GET(e oPOST /query, que só envia umSELECT) são idempotentes por natureza: repetir a chamada não altera estado. - Consultas idênticas (mesma versão do workspace) servem do cache com custo R$ 0; a invalidação por pipeline/DML garante que nunca se serve dado velho.
- Não há cabeçalho
Idempotency-Keyhoje (não é necessário sem escrita). Um mecanismo de idempotência para operações de escrita só existiria junto de uma futura API de escrita (Roadmap).
Webhooks#
- Não há, hoje, uma API pública de assinatura de webhooks (eventos do
workspace enviados ao seu endpoint) — está no
Roadmap. - Para reagir a mudanças de dados hoje, use polling do feed OData (ex.: refresh incremental no Power BI) ou as assinaturas/alertas do próprio produto (e-mail/WhatsApp, conforme o plano).
- Os endpoints de webhook existentes na plataforma são entradas internas de integração de cobrança/marketing, não uma API para desenvolvedores.
Custo#
- Só extração de linhas custa; autenticar, listar tabelas e ler
$metadatanão disparam job pago. O valor emx-ingestia-cost-brlé uma projeção. LIMIT/OFFSET/paginação não reduzem bytes lidos no datalake — filtre e agregue para pagar menos.
Segurança#
- Escopo por workspace em todas as rotas; PII fora da API; somente leitura.
- Erros nunca vazam credenciais nem SQL de outro workspace;
404em EntitySet inexistente evita enumeração.
Limites (resumo)#
- Página REST: máx 1000 linhas; página OData: máx 1000; profundidade OData: máx 1.000.000 linhas/consulta.
- Rate limit conforme a tabela acima.
- Sem API de escrita; sem webhooks públicos; chave de nível workspace.
Troubleshooting#
| Sintoma | Causa provável | O que fazer |
|---|---|---|
402 | workspace inadimplente/suspenso | regularize o pagamento no app |
429 | rate limit | respeite Retry-After; reduza paralelismo |
503 com Retry-After | limitador indisponível ou datalake não provisionado | aguarde e repita; confirme provisionamento |
501 (OData) | operação fora do subset | simplifique o filtro (ver OData) |
400 na paginação | passou do teto de 1M linhas ou $skiptoken inválido | filtre os dados; siga o @odata.nextLink |
Próximos passos: API de consulta · OData/Power BI · Troubleshooting.
Estado & evidência: contratos transversais das rotas /api/v1 (rate limit
fail-closed, paginação, formato de erro). Fonte: matriz de estados do produto.