API do observatório de preços de modelos

Dados públicos de preços de modelos de IA servidos pelo OpenRouter, coletados e armazenados pelo DELIGUS. Valores em dólar americano por 1 milhão de tokens. Timestamps em ISO-8601 UTC. Nenhuma chave de API é necessária.

Endpoints

GET /api/public/openrouter/models

Lista de modelos com preço padrão. Parâmetros: nenhum.

{
  "models": [
    {
      "id": "anthropic/claude-sonnet-4",
      "name": "Claude Sonnet 4",
      "provider": "anthropic",
      "promptPerMillion": 3,
      "completionPerMillion": 15,
      "cachePerMillion": 0.3
    }
  ]
}
GET /api/public/openrouter/models/:slug

Estado atual de um modelo. :slug é o id OpenRouter (pode conter barras, por exemplo anthropic/claude-sonnet-4).

{
  "canonicalSlug": "anthropic/claude-sonnet-4",
  "id": "anthropic/claude-sonnet-4",
  "name": "Claude Sonnet 4",
  "provider": "anthropic",
  "promptPerMillion": 3,
  "completionPerMillion": 15,
  "cachePerMillion": 0.3,
  "fetchedAt": "2026-08-10T12:00:00.000Z"
}
GET /api/public/openrouter/models/:slug/endpoints

Endpoints por provider. Parâmetros: zdr (true filtra apenas endpoints ZDR).

{
  "canonicalSlug": "anthropic/claude-sonnet-4",
  "modelName": "Claude Sonnet 4",
  "endpoints": [
    {
      "providerName": "host-z",
      "tag": "fp8",
      "quantization": "fp8",
      "promptPerMillion": 2.5,
      "completionPerMillion": 12,
      "cachePerMillion": 0.25,
      "contextLength": 8000,
      "maxCompletionTokens": 4000,
      "supportsImplicitCaching": true,
      "zdr": true
    }
  ]
}
GET /api/public/openrouter/models/:slug/history

Histórico de preços de 30 dias, deduplicado por minuto. Parâmetros: providerName, resolution (minute|hour|day), from/to (ISO-8601, janela máxima de 90 dias), limit (1 a 5000), offset, order (asc|desc).

{
  "canonicalSlug": "anthropic/claude-sonnet-4",
  "snapshots": [
    {
      "capturedAt": "2026-08-10T12:00:00.000Z",
      "promptPerMillion": 3,
      "completionPerMillion": 15,
      "cachePerMillion": 0.3,
      "providerName": ""
    }
  ],
  "meta": { "total": 1, "count": 1, "limit": 5000, "offset": 0, "from": "...", "to": "...", "resolution": "minute", "truncated": false }
}
GET /api/public/openrouter/price-events

Eventos de queda de preço detectados no histórico. Parâmetros: min_discount (1 a 95, padrão 5), providerName, modelId, from/to, limit (1 a 200, padrão 50), offset, order (discount|recent).

{
  "events": [
    {
      "modelId": "anthropic/claude-sonnet-4",
      "providerName": "host-z",
      "type": "price_drop",
      "startedAt": "2026-08-01T00:00:00.000Z",
      "ongoing": true,
      "referenceInput": 3,
      "minimumInput": 2.5,
      "maximumDiscountPercent": 16.67,
      "latestInput": 2.5
    }
  ],
  "count": 1,
  "generatedAt": "2026-08-10T12:00:00.000Z"
}
GET /api/public/openrouter/zdr-endpoints

Lista de endpoints ZDR (Zero Data Retention). Parâmetros: nenhum.

{
  "endpoints": [
    {
      "modelName": "Claude Sonnet 4",
      "providerName": "host-z",
      "tag": "fp8",
      "promptPerMillion": 2.5,
      "completionPerMillion": 12,
      "cachePerMillion": 0.25
    }
  ],
  "count": 1,
  "cachedAt": "2026-08-10T12:00:00.000Z"
}

Unidades e timestamps

Todos os campos de preço são em dólar americano por 1 milhão de tokens (USD/1M), sem arredondamento. Um modelo gratuito tem input e output iguais a 0.

Timestamps usam ISO-8601 em UTC. O campo capturedAt é truncado ao minuto, o que gera deduplicação de observações dentro do mesmo minuto.

Preço de referência

O preço de referência de um modelo é o preço padrão divulgado pelo OpenRouter, observado sem provider específico. No histórico, ele corresponde ao snapshot com providerName vazio. É a base usada para calcular variação e detectar quedas.

Eventos de queda usam apenas observações com provider específico. O evento começa quando o input cai abaixo do snapshot anterior e termina quando o preço volta a subir. O desconto máximo é medido em relação ao preço imediatamente anterior à queda.

Códigos de erro

Códigos de erro da API
HTTPCódigoSignificado
400INVALID_RANGEIntervalo de datas inválido ou maior que 90 dias
400INVALID_LIMITLimite fora da faixa permitida
400INVALID_OFFSETOffset negativo ou não numérico
400INVALID_ORDEROrdem diferente de asc, desc, discount ou recent
400INVALID_MIN_DISCOUNTDesconto mínimo fora da faixa de 1 a 95
400INVALID_PROVIDER_NAMENome de provider inválido
400INVALID_MODEL_IDIdentificador de modelo inválido
400INVALID_RESOLUTIONResolução diferente de minute, hour ou day
404MODEL_NOT_FOUNDModelo desconhecido para o OpenRouter
502OPENROUTER_UNAVAILABLEFalha de comunicação com o OpenRouter
503OPENROUTER_UNAVAILABLEOpenRouter limitou ou falhou na requisição

Navegação