Issue №02012h ago

Documentation

The JSON API

Plain static files served from CloudFront with Access-Control-Allow-Origin: *. Refreshed by the collector Lambda every six hours; CloudFront cache TTL is 5 minutes.

/api/models.jsonGET · application/json

Full normalized list, one entry per (provider, model). Each entry has a canonicalId you can use to join across providers.

Array<{
  canonicalId: string,
  provider: "bedrock" | "vertex" | "openrouter",
  providerModelId: string,
  displayName: string,
  family: string,
  publisher?: string,
  modality?: string[],
  contextWindow?: number,
  pricingStatus: "known" | "unknown",
  pricingInputPer1M?: number,
  pricingOutputPer1M?: number,
  pricingCurrency?: "USD",
  available: boolean,
  region?: string,
  firstSeenAt: string,
  lastSeenAt: string
}>
/api/models-by-provider.jsonGET · application/json

Same data, pre-grouped by provider. Faster than filtering models.json yourself.

{
  bedrock:    Model[],
  vertex:     Model[],
  openrouter: Model[]
}
/api/models-by-family.jsonGET · application/json

Pre-grouped by detected family (claude, gemini, qwen, deepseek, kimi, …). Use the family key "other" for long-tail models that don't match a known family.

{
  claude:   Model[],
  gemini:   Model[],
  qwen:     Model[],
  /* … */
}
/api/diff-latest.jsonGET · application/json

Models added or removed between the previous run and the current one. Empty arrays on first run; populated thereafter.

{
  since:       string,         // ISO timestamp of the prior run
  added:       Entry[],
  removed:     Entry[],
  newFamilies: string[]
}
/api/meta.jsonGET · application/json

Collection metadata.

{
  lastRun:       string,    // ISO timestamp
  counts:        { bedrock, vertex, openrouter, total },
  schemaVersion: "1"
}