Referência da API

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.

CampoTipoNotas
slugstringp. ex. openai, anthropic
namestringNome de exibição
websitestring | null
pricingUrlstring | nullA própria página de preços do fornecedor
officialbooleanSe é a listagem oficial do fabricante (ver Introdução)
modelsnumberNúmero de modelos deste fornecedor

GET /api/v1/models

Lista paginada de modelos.

ParâmetroTipoPredefiniçãoNotas
qstring—Correspondência de texto livre com o slug e o nome de exibição
providerstring—Slugs de fornecedores separados por vírgulas, p. ex. openai,anthropic
confidencestring—Um de verified, high, medium, low, unverified
limitnumber501–500
cursorstring—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âmetroTipoPadrãoNotas
qstring—Correspondência de texto livre contra o slug e o nome. Sem ele, o início do catálogo
limitnumber101–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âmetroTipoPredefiniçãoNotas
daysnumber30Janela retrospetiva
limitnumber100Linhas máximas (limitado a 500)
providerstring—Só as alterações deste fornecedor (o seu slug)
modelstring—Só as alterações deste modelo (o seu slug, sem o fornecedor)
qstring—Texto livre: procura por slug e por nome visível, do modelo e do seu fornecedor (2026-09-17)
kindstringos quatro de mercadoUm 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ívelSignificado
verifiedConfirmado diretamente na própria página de preços do fornecedor
highForte concordância entre fontes independentes
mediumAlguma concordância, ou uma única fonte razoavelmente fiável
lowEvidência fraca ou parcial
unverifiedAinda 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.

Referência da API