Visão geral
A API pública vive sob /api/v1. É só de leitura, não requer chave de API
nem autenticação, e tem limite de débito por IP de cliente (300
pedidos/minuto por predefinição). O CORS está totalmente aberto
(Access-Control-Allow-Origin: *) — este é um conjunto de dados público
sem cookies nem credenciais a proteger.
curl https://aiapipricing.slxd.app/api/v1/models
Invólucro da resposta
Toda resposta bem-sucedida tem esta forma:
{
"data": /* the endpoint's payload */,
"meta": {
"datasetVersion": "2026-08-19T03:00:00.000Z",
"generatedAt": "2026-08-19T03:00:00.000Z"
/* endpoint-specific fields, e.g. count, nextCursor */
}
}
meta.datasetVersion é o carimbo temporal da execução de ingestão que
produziu os dados — o mesmo valor do cabeçalho de resposta
x-dataset-version. Duas respostas com o mesmo datasetVersion foram
calculadas a partir da mesma execução e podem ser comparadas diretamente
com segurança.
Cache
As respostas transportam um ETag fraco que cobre tanto a versão do
conjunto de dados como a query string exata, mais Cache-Control: public, max-age=<n>, s-maxage=3600, stale-while-revalidate=86400. Envie
If-None-Match em pedidos repetidos — uma correspondência devolve
304 Not Modified sem corpo, o que é bem mais barato do que voltar a
obter os dados. max-age varia por endpoint (ver abaixo); um único modelo
ou o registo de fontes, que mudam com menos frequência, ficam em cache por
mais tempo do que a lista de modelos.
Erros
Os erros seguem o formato RFC 9457
problem details (Content-Type: application/problem+json):
{ "type": "about:blank", "title": "Model not found", "status": 404, "detail": "openai/made-up-model" }
Um 429 transporta ainda um cabeçalho Retry-After.
Endpoints
GET /api/v1/meta
Resumo do conjunto de dados: contagens e a última execução de ingestão.
Útil como verificação de saúde ou para ler o datasetVersion atual sem
obter mais nada. max-age=60.
{
"data": {
"datasetVersion": "2026-08-19T03:00:00.000Z",
"generatedAt": "2026-08-19T03:00:00.000Z",
"models": 842,
"providers": 37,
"prices": 3110,
"lastRun": { "id": "128", "status": "ok", "finishedAt": "2026-08-19T03:00:00.000Z" },
"rates": { "contractVersion": 2, "officialSources": ["official_scrape"] }
}
}
GET /api/v1/providers
Todos os fornecedores do catálogo, com a respetiva contagem de modelos.
São as casas que fabricam os modelos. Quem revende — Vertex, Bedrock, Azure, OpenRouter, o catálogo da Alibaba, um plano de subscrição — é um canal de venda e não um fornecedor, por isso não aparece aqui: o mesmo modelo é um só modelo, vendido a vários preços.
| Campo | Tipo | Notas |
|---|---|---|
slug | string | p. ex. openai, anthropic |
name | string | Nome de exibição |
website | string | null | |
pricingUrl | string | null | A própria página de preços do fornecedor |
official | boolean | Se é a listagem oficial do fabricante (ver Introdução) |
models | number | Número de modelos deste fornecedor |
GET /api/v1/models
Lista paginada de modelos.
| Parâmetro | Tipo | Predefinição | Notas |
|---|---|---|---|
q | string | — | Correspondência de texto livre com o slug e o nome de exibição |
provider | string | — | Slugs de fornecedores separados por vírgulas, p. ex. openai,anthropic |
confidence | string | — | Um de verified, high, medium, low, unverified |
limit | number | 50 | 1–500 |
cursor | string | — | Cursor opaco do meta.nextCursor de uma resposta anterior |
A paginação é baseada em keyset (nunca em offset), pelo que se mantém
rápida para além de milhares de linhas. meta.nextCursor é null na
última página.
curl "https://aiapipricing.slxd.app/api/v1/models?provider=anthropic&limit=20"
Cada modelo em data tem esta forma (a mesma forma devolvida por GET /api/v1/models/{provider}/{model} e GET /api/v1/compare):
{
"id": "anthropic/claude-sonnet-4-5",
"provider": "anthropic",
"slug": "claude-sonnet-4-5",
"name": "Claude Sonnet 4.5",
"family": "claude-4",
"contextWindow": 200000,
"maxOutputTokens": 64000,
"openWeights": false,
"firstSeenAt": "2026-02-11T00:00:00.000Z",
"lifecycle": { "state": "active", "releasedOn": "2026-02-11", "deprecatedOn": null, "retiresOn": null },
"prices": [
{
"label": "Input",
"direction": "input",
"modality": "text",
"tier": "standard",
"cache": "none",
"contextMin": 0,
"contextMax": null,
"qualifiers": {},
"amount": 3,
"displayUnit": "per 1M tokens",
"denomination": "currency",
"currency": "USD",
"confidence": "verified",
"confidenceScore": 0.95,
"sources": ["anthropic-pricing-page"],
"dissenting": [],
"disputed": false,
"fallbackAmount": null,
"effectiveFrom": "2026-02-11T00:00:00.000Z",
"staleSince": null
}
]
}
amount está sempre em unidades de exibição (por exemplo, dólares por
milhão de tokens), nunca em unidades base brutas — quem compara 3 com
0.000003 já perdeu.
Duas dimensões de preço podem partilhar o mesmo label — a pesquisa web é
cobrada por tamanho de contexto e as três chamam-se «Web search» — por isso as
que coincidiriam dentro do mesmo modelo são distinguidas pelos seus
qualificadores: Web search (context size: high). O objeto qualifiers em
bruto continua disponível para uso estruturado.
GET /api/v1/models/search
Sugestões para um campo de busca: o mesmo filtro e a mesma ordem de GET /api/v1/models, mas apenas o que um seletor precisa — o id e como se lê. Use
enquanto se completa o nome de um modelo; para os preços, GET /api/v1/models.
| Parâmetro | Tipo | Padrão | Notas |
|---|---|---|---|
q | string | — | Correspondência de texto livre contra o slug e o nome. Sem ele, o início do catálogo |
limit | number | 10 | 1–50 |
{
"data": [
{ "id": "anthropic/claude-sonnet-4-5", "label": "Claude Sonnet 4.5 · Anthropic" }
],
"meta": { "count": 1 }
}
O rótulo leva o provedor porque o mesmo modelo aparece sob vários gateways, e o nome sozinho se repete.
GET /api/v1/models/{provider}/{model}
Um único modelo por slug de fornecedor e slug de modelo, p. ex.
/api/v1/models/anthropic/claude-sonnet-4-5. 404 (problem detail) se
desconhecido. max-age=3600.
Por omissão, os preços são os de quem fabrica o modelo. Com ?channel= obtêm-se os de quem o revende — um de direct, vertex, bedrock, azure, alibaba, openrouter, coding_plan, token_plan, other. Um canal que não vende este modelo devolve a ficha com prices vazio; um canal que não existe devolve 400.
curl "https://aiapipricing.slxd.app/api/v1/models/anthropic/claude-opus-5?channel=bedrock"
GET /api/v1/models/{provider}/{model}/history
O histórico de preços desse modelo — um ponto por alteração, não um
por dia, uma vez que os preços são funções em degrau. Adicione from /
to (datas ISO, inclusivas) para restringir o intervalo. max-age=3600.
Uma série por dimensão de preço, não por rótulo: duas dimensões podem
partilhar o nome (a pesquisa web é cobrada por tamanho de contexto e as três
chamam-se «Web search»), por isso as séries que coincidiriam são distinguidas
pelos seus qualificadores — Web search (context size: high). Dentro de uma
série, os pontos consecutivos com o mesmo valor são fundidos no primeiro:
repetir um valor não é uma alteração.
Cada ponto é [data, valor], com a data em YYYY-MM-DD. Se um preço mudou
duas vezes no mesmo dia, devolvem-se os dois pontos com a mesma data, por
ordem: fundi-los esconderia uma alteração de preço que aconteceu mesmo.
{
"data": [
{ "label": "Input", "displayUnit": "per 1M tokens", "points": [["2026-02-11", 3], ["2026-06-01", 2.5]] }
],
"meta": { "model": "anthropic/claude-sonnet-4-5", "granularity": "change" }
}
GET /api/v1/compare?models=
Preços lado a lado para 2 a 8 modelos, separados por vírgulas em
provider/slug:
curl "https://aiapipricing.slxd.app/api/v1/compare?models=openai/gpt-5,anthropic/claude-opus-5"
data é um array com a mesma forma de modelo que /api/v1/models, pela
ordem encontrada (ids desconhecidos são descartados silenciosamente —
verifique meta.found face a meta.requested). 400 se forem indicados
menos de dois ids. Os montantes faturados em créditos nunca são
convertidos em dinheiro, portanto um modelo faturado em créditos não é
comparável a um faturado por token pelo amount bruto.
GET /api/v1/changes
Movimentos de mercado recentes, do mais recente para o mais antigo: subidas,
descidas, remoções e mudanças de unidade. O equivalente em JSON de
/changes.xml, com os mesmos filtros.
Por predefinição não inclui altas de catálogo (price_added,
coverage_added, reference_changed): essas são "Novidades no catálogo",
não uma alteração de preço, e só aparecem aqui se forem pedidas
explicitamente com kind.
| Parâmetro | Tipo | Predefinição | Notas |
|---|---|---|---|
days | number | 30 | Janela retrospetiva |
limit | number | 100 | Linhas máximas (limitado a 500) |
provider | string | — | Só as alterações deste fornecedor (o seu slug) |
model | string | — | Só as alterações deste modelo (o seu slug, sem o fornecedor) |
q | string | — | Texto livre: procura por slug e por nome visível, do modelo e do seu fornecedor (2026-09-17) |
kind | string | os quatro de mercado | Um ou vários, separados por vírgula: price_increase, price_decrease, price_removed, unit_change, price_added, coverage_added, reference_changed. Um valor desconhecido dá 400. |
{
"data": [
{
"kind": "price_increase",
"model": "openai/gpt-5",
"modelName": "GPT-5",
"providerName": "OpenAI",
"label": "Output",
"oldAmount": 10,
"newAmount": 12,
"deltaPct": 20,
"occurredAt": "2026-08-01T00:00:00.000Z"
}
]
}
GET /api/v1/sources
Todas as fontes de dados configuradas e o respetivo estado — peso,
licença, se é fidedigna, quando teve sucesso pela última vez, e o seu
último erro, caso exista. É assim que se avalia o quanto se pode confiar
num preço, para além do campo confidence por preço. max-age=900.
{
"data": [
{
"source": "anthropic-pricing-page",
"name": "Anthropic pricing page",
"license": null,
"homepage": "https://www.anthropic.com/pricing",
"weight": 10,
"authoritative": true,
"lastSuccessAt": "2026-08-19T03:00:00.000Z",
"lastError": null,
"rowsLastRun": 24
}
]
}
GET /api/v1/rates
A taxa de custo de cada modelo faturável, restringida ao que um
sistema de faturação precisa: tokens de texto, nível padrão, sem cache,
sem intervalo de contexto — um número por direção. Este é o endpoint que a
suite SLXD consome para faturar créditos de IA; a margem pertence à plataforma
(custo × 2 com um mínimo de 1 crédito por operação, só o facto vive aqui.
max-age=3600.
Filtro opcional ?provider=anthropic,openai (até 50). Sem paginação de
propósito: quem consome quer tudo de uma vez, e o ETag evita que seja
reenviado enquanto o conjunto de dados não mudar. Um modelo ao qual falte
uma direção é excluído — a ausência é preferível a um preço pela metade.
{
"data": [
{
"id": "anthropic/claude-opus-5",
"provider": "anthropic",
"slug": "claude-opus-5",
"currency": "USD",
"inputPerMTok": 15,
"outputPerMTok": 75,
"cachedInputPerMTok": 1.5,
"confidence": "verified",
"confidenceScore": 95,
"agreeingSources": ["models_dev", "official_scrape"],
"sourceCount": 2,
"official": true,
"disputed": false,
"staleSince": null,
"aliases": ["claude-opus-5-20260101"]
}
]
}
Versão 2 do contrato (2026-09-17). Cada tarifa passa a declarar também de
onde vem, para que quem fatura com ela possa decidir por política:
confidenceScore (0-100), agreeingSources (as fontes que sustentam as duas
direções, não a união das duas), sourceCount (quantas se pronunciaram sobre
a perna mais fraca), official (a própria página de preços do fabricante está
entre elas) e disputed. São campos novos: nada foi renomeado, e um
cliente da versão 1 continua a ler o mesmo. GET /api/v1/meta devolve a versão
do contrato e que fontes contam como oficiais (rates.contractVersion,
rates.officialSources), para não manter essa tabela à mão.
O endpoint não filtra por confiança: publica o facto inteiro e a política é
de quem consome. A suite SLXD, desde 2026-09-17, só fatura créditos contra
tarifas verified ou official e recorre ao seu catálogo estático para o
resto.
Níveis de confiança
Todo preço transporta uma confidence e um confidenceScore, além das
fontes que concordam (sources) e discordam (dissenting):
| Nível | Significado |
|---|---|
verified | Confirmado diretamente na própria página de preços do fornecedor |
high | Forte concordância entre fontes independentes |
medium | Alguma concordância, ou uma única fonte razoavelmente fiável |
low | Evidência fraca ou parcial |
unverified | Ainda não corroborado — tratar com cautela |
disputed: true significa que pelo menos uma fonte discorda ativamente do
amount publicado; fallbackAmount (quando presente) é o que o catálogo
mostraria se a fonte principal falhasse.
Ver também
O mesmo catálogo pode ser consultado por um assistente de IA através do conector MCP, que espelha estes endpoints um a um para que um modelo nunca cite um preço diferente do desta API.