Selo de estado:
Preview— feed OData v4, sem SLA. Disponível em Preview para Power BI/Excel. Atualizado em 2026-09-08. Fonte de estado: matriz de estados do produto.
Duas funções na mesma rota:
entity = "$metadata"→ documento EDMX (XML) com os tipos EDM das colunas.entity = "<tabela>"→ página do EntitySet com paginação server-driven.
Resumo#
| Método · rota | GET /api/v1/odata/{entity} |
| Base | https://ingestia.io |
| Auth | Chave de API (Authorization: Bearer ou ?api_key=) |
| Papel (RBAC) | exportação de dados (member+); chave de dados = owner |
| Custo | bytes reais processados no datalake; $count=true roda COUNT(*) adicional |
| Estados | 200 · 400 · 401 · 403 · 404 · 429 · 402 · 501 · 503 |
Opções OData suportadas (pushdown honesto)#
| Opção | Vira | Observação |
|---|---|---|
$select | projeção de colunas | reduz bytes lidos |
$filter | eq/ne/gt/ge/lt/le, and/or/not, contains/startswith/endswith | fora do subset → 501 |
$orderby | ORDER BY | ordem total (paginação estável) |
$top / $skip | limite/deslocamento | página de até 1.000 linhas |
$count=true | @odata.count | COUNT(*) contado no custo |
Prefer: odata.maxpagesize=N | reduz a página | responde Preference-Applied |
Nunca ignoramos um filtro
Uma opção fora do subset ($expand, $apply, $search, $compute, lambdas
any/all, aritmética em filtro) responde 501 explícito com o que é
suportado — resultado errado silencioso seria pior.
Exemplo — $metadata#
curl -H "Authorization: Bearer ing_live_EXEMPLO" \
https://ingestia.io/api/v1/odata/\$metadataconst res = await fetch("https://ingestia.io/api/v1/odata/$metadata", {
headers: { Authorization: "Bearer ing_live_EXEMPLO" },
});
const edmxXml = await res.text;import requests
res = requests.get(
"https://ingestia.io/api/v1/odata/$metadata",
headers={"Authorization": "Bearer ing_live_EXEMPLO"},
)
edmx_xml = res.textExemplo — página de uma entidade#
curl -H "Authorization: Bearer ing_live_EXEMPLO" \
"https://ingestia.io/api/v1/odata/vendas?\$select=data,total&\$filter=data ge 2026-01-01&\$orderby=data&\$count=true"const params = new URLSearchParams({
"$select": "data,total",
"$filter": "data ge 2026-01-01",
"$orderby": "data",
"$count": "true",
});
const res = await fetch(`https://ingestia.io/api/v1/odata/vendas?${params}`, {
headers: { Authorization: "Bearer ing_live_EXEMPLO" },
});
const pagina = await res.json;import requests
res = requests.get(
"https://ingestia.io/api/v1/odata/vendas",
params={
"$select": "data,total",
"$filter": "data ge 2026-01-01",
"$orderby": "data",
"$count": "true",
},
headers={"Authorization": "Bearer ing_live_EXEMPLO"},
)
pagina = res.jsonResposta 200 (página)#
{
"@odata.context": "https://ingestia.io/api/v1/odata/$metadata#vendas",
"@odata.count": 12345,
"value": [ { "data": "2026-01-02", "total": 987.65 } ],
"@odata.nextLink": "https://ingestia.io/api/v1/odata/vendas?...$skiptoken=..."
}Siga o
@odata.nextLink exatamente
O link carrega um $skiptoken opaco. Um token adulterado responde 400.
Power BI/Excel seguem o nextLink automaticamente até o fim.
Erros#
| Código | Quando |
|---|---|
400 | $skiptoken inválido / paginação acima de 1.000.000 de linhas |
401 | chave ausente/inválida |
403 | papel/escopo insuficiente |
404 | EntitySet inexistente (também evita enumeração) |
501 | opção OData fora do subset |
429 · 402 | rate limit / inadimplência |
503 | datalake não provisionado / nuvem própria caída |
Custo#
- Cobra pelos bytes reais;
$select/$filterreduzem o que é lido (pushdown). - Cada chamada deixa o custo atribuído na auditoria
(
api.odata.read, com bytes, página e chave).
Segurança#
- Somente leitura, escopo por workspace; colunas PII e
STRUCT/RECORDfora do feed. Nuvem própria caída →503(nunca coleção vazia, que o Excel leria como "a tabela esvaziou").
Relacionados#
Última revisão: 2026-09-08. Estado & evidência: OData v4 =
Preview. Fonte: matriz de estados do produto.