![]() |
|
| Open-Source LLM Pricing & Capability Database |
2,551 models · 83 providers · Updated weekly · Zero paid infrastructure
Every AI application needs the same data: what models exist, what they cost, and what they can do. This repo is that data — structured, validated, and open.
curl -sL https://github.com/ferro-labs/model-catalog/releases/latest/download/catalog.json | \
python3 -c "import json,sys; m=json.load(sys.stdin)['openai/gpt-4o']; print(f'GPT-4o: \${m[\"pricing\"][\"input_per_m_tokens\"]}/M input, \${m[\"pricing\"][\"output_per_m_tokens\"]}/M output, {m[\"context_window\"]:,} ctx')"GPT-4o: $2.5/M input, $10.0/M output, 128,000 ctx
| If you're building... | You can use the catalog to... |
|---|---|
| An AI gateway or proxy | Route requests by model capability, calculate costs per request |
| A cost tracker or billing system | Look up per-token pricing for any model across 83 providers |
| A coding agent (like Aider, OpenCode, Cursor) | Know which models support function calling, vision, streaming |
| An LLM comparison tool | Compare pricing and context windows across providers |
| A model selection UI | Display model metadata with accurate, up-to-date pricing |
One YAML file per model. One JSON artifact per provider. Everything cross-checked weekly.
# providers/openai/models/gpt-4o.yaml
provider: openai
model_id: gpt-4o
display_name: GPT-4o
mode: chat
context_window: 128000
max_output_tokens: 16384
pricing:
input_per_m_tokens: 2.5 # USD per 1M tokens
output_per_m_tokens: 10.0
cache_read_per_m_tokens: 1.25
cache_write_per_m_tokens: null # null = not applicable
reasoning_per_m_tokens: null
image_per_tile: null
audio_input_per_minute: null
audio_output_per_character: null
embedding_per_m_tokens: null
finetune_train_per_m_tokens: null
finetune_input_per_m_tokens: null
finetune_output_per_m_tokens: null
capabilities:
vision: true
audio_input: false
audio_output: false
function_calling: true
parallel_tool_calls: true
json_mode: true
response_schema: true
prompt_caching: true
reasoning: false
streaming: true
finetuneable: false
lifecycle:
status: ga # preview | ga | deprecated | sunset
source: https://openai.com/api/pricing
updated_at: "2026-04-30"
tier: flagship # flagship | standardmode is the provider invocation endpoint or request contract, not a capability label. Schema version 2 accepts chat, completion, responses, embedding, image, audio_in, audio_out, video, realtime, agent, ocr, rerank, moderation, and tool.
OpenAI, Anthropic, Google Gemini, AWS Bedrock, Azure, Vertex AI, Groq, Mistral, Cohere, Together AI, Fireworks, DeepInfra, DeepSeek, xAI (Grok), Meta Llama, Replicate, Perplexity, NVIDIA NIM, Hugging Face, Cerebras, SambaNova, and 60+ more.
All 83 providers with model counts
| Provider | Models | Provider | Models | |
|---|---|---|---|---|
| bedrock | 344 | anyscale | 12 | |
| fireworks | 273 | fal_ai | 12 | |
| azure | 238 | minimax | 10 | |
| vertex_ai | 172 | publicai | 9 | |
| openai | 169 | vertex_ai-video-models | 9 | |
| vercel_ai_gateway | 101 | deepseek | 8 | |
| openrouter | 85 | volcengine | 8 | |
| novita | 83 | cerebras | 7 | |
| gemini | 78 | aleph_alpha | 6 | |
| deepinfra | 67 | gigachat | 6 | |
| mistral | 46 | palm | 6 | |
| perplexity | 42 | runwayml | 6 | |
| together | 42 | sagemaker | 6 | |
| replicate | 40 | azure_openai | 5 | |
| deepgram | 36 | lemonade | 5 | |
| xai | 34 | qwen | 5 | |
| github_copilot | 31 | vertex_ai-ai21_models | 5 | |
| anthropic | 29 | amazon_nova | 4 | |
| ollama | 29 | aws_polly | 4 | |
| watsonx | 29 | cloudflare | 4 | |
| databricks | 28 | elevenlabs | 4 | |
| snowflake | 24 | heroku | 4 | |
| dashscope | 23 | meta_llama | 4 | |
| stability | 23 | ollama_cloud | 4 | |
| nanogpt | 22 | vertex_ai-qwen_models | 4 | |
| moonshot | 21 | azure_foundry | 3 | |
| lambda_ai | 20 | hugging_face | 3 | |
| cohere | 17 | nvidia_nim | 3 | |
| gmi | 17 | v0 | 3 | |
| hyperbolic | 16 | vertex_ai-deepseek_models | 3 | |
| llamagate | 16 | assemblyai | 2 | |
| nscale | 16 | featherless_ai | 2 | |
| sambanova | 16 | friendliai | 2 | |
| wandb | 16 | morph | 2 | |
| ovhcloud | 15 | nlp_cloud | 2 | |
| voyage | 15 | recraft | 2 | |
| groq | 14 | vertex_ai-openai_models | 2 | |
| gradient_ai | 13 | vertex_ai-zai_models | 2 | |
| oci | 13 | sarvam | 1 | |
| zai | 13 | vertex_ai-minimax_models | 1 | |
| ai21 | 12 | vertex_ai-moonshot_models | 1 | |
| aiml | 12 |
# Full catalog (~3 MB)
curl -sLO https://github.com/ferro-labs/model-catalog/releases/latest/download/catalog.json
# Just one provider (~50 KB each)
curl -sLO https://github.com/ferro-labs/model-catalog/releases/latest/download/providers/openai.json
# CDN mirror for the latest published dist/
curl -sLO https://catalog.ferrolabs.ai/v1/catalog.json # drift-ok
curl -sLO https://catalog.ferrolabs.ai/v1/providers/openai.json # drift-okimport json
with open("catalog.json") as f:
catalog = json.load(f)
# Look up any model
model = catalog["anthropic/claude-sonnet-4-5"]
print(f"Input: ${model['pricing']['input_per_m_tokens']}/M tokens")
print(f"Output: ${model['pricing']['output_per_m_tokens']}/M tokens")
print(f"Context: {model['context_window']:,} tokens")
print(f"Vision: {model['capabilities']['vision']}")
# Find all models with function calling under $1/M input
cheap_tool_models = {
k: v for k, v in catalog.items()
if v["capabilities"]["function_calling"]
and v["pricing"]["input_per_m_tokens"] is not None
and v["pricing"]["input_per_m_tokens"] < 1.0
}
print(f"\n{len(cheap_tool_models)} models with tool use under $1/M input")import "github.com/ferro-labs/model-catalog/catalog"
data, _ := os.ReadFile("catalog.json")
entries, _ := catalog.ReadCatalogJSON(data)
model := entries["openai/gpt-4o"]
fmt.Printf("Input: $%.2f/M tokens\n", model.Pricing.InputPerMTokens.Value)const catalog = await fetch(
"https://github.com/ferro-labs/model-catalog/releases/latest/download/catalog.json"
).then(r => r.json());
const model = catalog["openai/gpt-4o"];
console.log(`Input: $${model.pricing.input_per_m_tokens}/M tokens`);Every week, scrapers fetch pricing data from independent oracle sources and live provider model APIs, then compare against the catalog.
Oracle scrapers:
| Source | Models | What it provides |
|---|---|---|
| OpenRouter API | 368 | Real-time pricing (includes their margin — we adjust) |
| models.dev | 4,362 | Community-curated pricing and capabilities |
When both sources agree on a price that differs from ours, it's flagged as high confidence and auto-PRd. When only one source reports a diff, it's marked needs review.
Freshness checks also query provider model-list APIs when CI secrets are configured: Anthropic, OpenAI, Groq, Mistral, Together, Fireworks, DeepSeek, Cohere, xAI, and Cerebras.
Found a wrong price? A missing model? A new provider? Open a PR — it's one YAML file:
- Fork the repo
- Add or edit a file in
providers/<provider>/models/ - Open a PR — CI validates automatically
See CONTRIBUTING.md for the 5-minute walkthrough, or use the issue templates:
Most apps use 3-5 providers, not all 83. Download only what you need:
# Just OpenAI + Anthropic (~100 KB total instead of 3 MB)
curl -sLO https://github.com/ferro-labs/model-catalog/releases/latest/download/providers/openai.json
curl -sLO https://github.com/ferro-labs/model-catalog/releases/latest/download/providers/anthropic.jsonWhen Vertex AI hosts Gemini or Azure hosts OpenAI, the wrapper model inherits from the base and overrides only what differs. A single price update to GPT-4o propagates to azure/gpt-4o, azure_openai/gpt-4o, and github_copilot/gpt-4o automatically. A wrapper can override mode when its provider exposes a different endpoint contract—for example, a provider chat product wrapping a Responses-only base.
269 wrapper models currently use this pattern.
Every release includes a manifest.json with SHA-256 hashes for the full catalog and each provider slice. Verify what you downloaded matches what was published.
New releases also include manifest.json.sigstore.json, a keyless Sigstore bundle created by GitHub Actions. The manifest exposes catalog_url and each provider url as immutable paths, plus git_sha for build provenance. Verify the bundle before trusting the manifest hashes when your application depends on remote catalog updates.
ferrocat verify does both checks for you — signature first, then every hash:
ferrocat verify --url https://catalog.ferrolabs.ai # published catalog # drift-ok
ferrocat verify # local dist/It verifies the Sigstore bundle against the signing workflow identity, then confirms catalog.json and every provider slice match their manifest hashes. It exits non-zero on any mismatch, and fails closed if the signature cannot be checked — pass --skip-signature to opt into hash-only when cosign is unavailable. Signature verification requires cosign on PATH.
Tagged v2026.04.30 — you always know when the data was published. Pin a version or follow latest.
The ferrocat CLI manages the catalog locally:
ferrocat build # YAML → JSON (catalog + slices + manifest)
ferrocat validate # Check structural correctness
ferrocat lint # Detect junk keys and duplicates
ferrocat scrape # Cross-check pricing against external sources
ferrocat freshness # Check live provider model APIs for missing catalog entries
ferrocat verify # Check signature + manifest hashes before trusting artifacts
ferrocat prune --days 90 # Remove models sunset more than 90 days ago
ferrocat split catalog.json # Legacy JSON → per-model YAML (one-time migration)
ferrocat migrate-extends --wrapper azure --base openai # Convert wrappers to extends
ferrocat migrate-provenance # one-time: seed baseline sources.pricing provenancegit clone https://github.com/ferro-labs/model-catalog
cd model-catalog
make build # Generate dist/ from YAML source files
make test # Run all tests including round-trip regression
make validate # Check structural correctnessRequires Go 1.24+.
| Feature | This repo | LiteLLM | models.dev | Portkey |
|---|---|---|---|---|
| Open source | Yes | Yes (one JSON file in main repo) | Yes (separate repo) | Yes (separate repo) |
| Per-model files | Yes (YAML) | No (single 111K-line JSON) | Yes (TOML) | No (per-provider JSON) |
extends inheritance |
Yes (269 wrappers) | No | Yes | No |
| Automated cross-check scrapers | Yes (OpenRouter + models.dev) | No | No | No |
| Per-provider slices | Yes (82 files) | No | No | Yes |
| Integrity verification (SHA-256) | Yes | No | No | No |
| Auto-prune deprecated models | Yes | No (open issue) | No | No |
| Raw provider pricing (no margin) | Yes | Yes | Yes | Yes |
| Community PR contribution path | Yes (YAML + CI) | Yes (JSON, conflicts) | Yes (TOML + CI) | Yes (JSON) |
For the full technical deep-dive — repo structure, data model, extends resolution, build pipeline, scraper design, CI/CD, and Go package design — see docs/architecture.md.
- ferro-labs/ai-gateway — Open-source AI gateway (30 providers, 8 routing strategies, plugin middleware) that consumes this catalog for pricing and capability lookups
Apache-2.0 — see LICENSE.
