AI Rate Card

Documentation

Everything in one place: what AI Rate Card is, the open data, the API and the MCP server, how to cite it, and how a provider joins.

Contents

What AI Rate Card is

AI Rate Card lists the prices of AI models - language, image, speech and other models - as their providers publish them. The prices are collected from the providers' own public pricing pages and APIs - or, for providers whose terms do not allow automated collection, from the open dataset models.dev - and checked daily.

When two sources disagree about a price, the site does not pick one silently: the offer is marked as a conflict until the difference is resolved.

The prices here are for information only. The provider's own page is the authority: check the price there before you buy.

Questions, corrections and requests: hello@airatecard.com.

How the prices are collected →

API and MCP: getting started

Two ways to get the prices by machine instead of by eye. You can try both right now, without signing up or paying.

Ask your AI assistant (MCP)

For people who use Claude, ChatGPT or Cursor. Connect the site once, and the assistant looks up the current prices itself when you ask in plain words. No programming.

  1. Copy the server's address: https://airatecard.com/mcp
  2. Add it to your assistant as a connector - where to click in each app is written in the MCP server section below.
  3. Ask in plain words, for example:
    • Which is the cheapest model with a context of at least 128K tokens?
    • Compare the prices of Llama 3.1 8B at different providers.
    • What will 10 M input and 2 M output tokens a month cost with GPT OSS 120B?

Get the data in a program (API)

For developers: plain HTTP requests, the answer in JSON. You can start right away without a key; a free personal key widens the per-minute window (the table below).

  1. Try a request without a key - copy it into a terminal: the 5 cheapest text-model offers.
    curl -s 'https://airatecard.com/v1/offers?category=llm&pricing=usage&limit=5'
  2. Need more rows? Sign in, create a key in your account under API keys and send it in the X-API-Key header.
  3. Every request with its parameters: /openapi.json (Postman and client generators read it).

The main requests

GET /v1/offers?category=llm&pricing=usage&limit=5offers with prices; the same filters as the Models page
GET /v1/models?category=llmmodels and their best price
GET /v1/models/{model_id}one model with all its offers
GET /v1/cost?model={model_id}&input_tokens=10000000&output_tokens=2000000what your workload costs at each provider of a model
GET /v1/compare?models={a},{b}two to four models side by side
GET /v1/analytics/cheapest?task=text&n=5the cheapest for a task (text, image, speech...)
GET /v1/models/{model_id}/historya model's price history (90 days)
GET /v1/articlesthe site's articles
GET /v1/metaabout the catalog: when it was updated, how many offers

How the prices are collected

Every price on AI Rate Card comes from a provider's own public pricing page or API, where the provider's terms allow automated collection, and otherwise from models.dev - an open dataset of model prices published under the MIT licence (Copyright (c) 2025 models.dev; licence text at /static/licenses/models.dev.txt). Never an estimate; checked daily.

“No data” means no offer with a price was found yet for that model at that provider. “Free” means the provider's own page states the offer costs nothing. “Withdrawn” means the offer used to be on the provider's page but is no longer listed there; it stays on the site with its last known price, marked withdrawn, so its history is not lost.

Every price change is kept: the full history of an offer, and of the whole market day by day, is on its own page and on /market.

Data

AI Rate Card is for looking and choosing, not for bulk copying: there is no file of the whole catalog or its price history. Open a model's or offer's own card to cite it, or ask /v1 or the MCP server for current prices, page by page.

How to cite

REST API

The public JSON API for agents and scripts: no key needed to read it, a personal key only raises the limit.

  • /v1
  • /openapi.json
curl -s 'https://airatecard.com/v1/offers?max_price_input=1&cur=USD'

Paging

/v1/offers and /v1/models answer at most 50 rows a page (25 by default); page with offset and limit, or narrow the question with filters - or take the whole catalog in one file from /export.

Analytics

Current prices by task, not by model type - what a buyer actually wants done: cheapest, dearest and median for embedding, image, moderation, rerank, stt, text, tts, video, vision. scope narrows to a task's own category (specialized) or the multimodal models that qualify instead (universal); component picks input_tokens, output_tokens or the task's own unit.

curl -s 'https://airatecard.com/v1/analytics/cheapest?task=text&n=5'
curl -s 'https://airatecard.com/v1/analytics/dearest?task=image&n=5'
curl -s 'https://airatecard.com/v1/analytics/median?task=vision&n=5'

Access levels

Pages are open to everyone and every search engine or AI assistant. Machines can start without a key; a free personal key (sign up with a login and a password, no e-mail, then account -> API keys; send it as the header X-API-Key) widens the per-minute window.

Without sign-inFree
Pages, articles, filters, comparison, calculatorseverythingeverything
Download a table: rows a file, files an hour100000 rows, 20 an hour100000 rows, 60 an hour
API for developers: requests a minute (no daily cap)60/min120/min
Price history through the APIup to 90 days, one model a requestup to 90 days, one model a request

Limits and license

There are no daily caps: only per-minute windows against abuse (the table above), wider with a free personal key (account -> API keys, header X-API-Key). Every answer has X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset and X-Daily-Rows-Remaining; over a limit the answer is 429 with Retry-After. License: CC BY 4.0: the catalog, the downloads, the API answers and the 90-day price history are free to use, quote and redistribute, including commercially, with attribution to AI Rate Card (airatecard.com) and a link to the card or page the numbers came from.

How to cite

Every API and MCP answer carries a "cite" line, every download ends with one: name AI Rate Card, link the card or model page you used and give the date its price was checked - "Source: AI Rate Card, https://airatecard.com/c/offer:<id>, prices checked YYYY-MM-DD".

Export by a filter

GET /export returns the offers matching a filter as JSON, CSV, YAML or Excel: current prices only, in USD. Open data (CC BY), no sign-in: the whole catalog in one file, up to 20 downloads an hour per address (more with an account). The parameters are those of the Models page - build a filter there, open Download and copy the address. Every file ends with the line "Source: AI Rate Card, ..." to cite.

curl -s 'https://airatecard.com/export?format=json&category=llm&r_in=0-1&r_ctx=128k-&limit=100'
curl -s 'https://airatecard.com/export?format=csv&provider=deepinfra&provider=together&sort=price_input'
curl -s 'https://airatecard.com/export?format=yaml&name_q=qwen&input_modality=image'

Try it

format: json | csv | yaml; ranges as one value "from-to" (r_in, r_out, r_ctx, r_mo, r_params ...; 128k and 1m allowed); repeat provider, region, input_modality ... for several values; sort and desc as on the page.

MCP server

A remote MCP server (Streamable HTTP), read-only. It answers price questions with the tools cheapest_for_workload (the cheapest for a whole job, with ready presets: chatbot, coding_agent, rag, summarization, long_context, vision, embedding_index, trial), search_offers, get_model_prices, cheapest, compare_models, estimate_cost and get_card - every result carries the card's URL to cite. It works without a key; with a personal key (X-API-Key header) it gives more rows, like the API. Ready prompts for the user: cheapest_for_my_job, where_is_model_cheapest, compare_models.

https://airatecard.com/mcp

Claude.ai / Claude Desktop

Settings → Connectors → Add custom connector, then paste this URL:

https://airatecard.com/mcp

Claude Code

claude mcp add --transport http ai-rate-card https://airatecard.com/mcp

ChatGPT

Settings → Connectors (developer mode), add a custom connector with this URL:

https://airatecard.com/mcp

Cursor / VS Code

Add this to your mcp.json:

{
  "mcpServers": {
    "ai-rate-card": {
      "url": "https://airatecard.com/mcp"
    }
  }
}

Any MCP client

One JSON-RPC 2.0 message over HTTP, no session needed:

curl -s https://airatecard.com/mcp \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"cheapest","arguments":{"category":"llm"}}}'

Connect your own agent

Any agent that speaks MCP - on any framework or API - connects to the same server. Choose by the limits you need:

  • No key: https://airatecard.com/mcp - guest limits, nothing to set up.
  • Your own agent with your limits: https://airatecard.com/mcp and a personal key from your account (API keys), sent as Authorization: Bearer or X-API-Key: .
  • An agent that works for many people, each under their own account: https://airatecard.com/mcp/account with OAuth - see the section above.

The examples read the key from the environment variable AIRATECARD_KEY - never put a key in code or in a URL. Without a key, drop the Authorization line.

Anthropic API (Messages, MCP connector)

import os, anthropic

client = anthropic.Anthropic()
resp = client.beta.messages.create(
    model="claude-opus-5-5", max_tokens=1000,
    messages=[{"role": "user", "content": "Cheapest model with 128K context?"}],
    mcp_servers=[{"type": "url", "url": "https://airatecard.com/mcp", "name": "airatecard",
                  "authorization_token": os.environ["AIRATECARD_KEY"]}],
    tools=[{"type": "mcp_toolset", "mcp_server_name": "airatecard"}],
    betas=["mcp-client-2025-11-20"],
)
print(resp.content)

OpenAI API (Responses, remote MCP)

import os
from openai import OpenAI

resp = OpenAI().responses.create(
    model="YOUR_MODEL",
    input="Cheapest model with 128K context?",
    tools=[{"type": "mcp", "server_label": "airatecard", "server_url": "https://airatecard.com/mcp",
            "authorization": os.environ["AIRATECARD_KEY"], "require_approval": "never"}],
)
print(resp.output_text)

Claude Agent SDK (Python)

import asyncio, os
from claude_agent_sdk import query, ClaudeAgentOptions, ResultMessage

options = ClaudeAgentOptions(
    mcp_servers={"airatecard": {"type": "http", "url": "https://airatecard.com/mcp",
                                "headers": {"Authorization": "Bearer " + os.environ["AIRATECARD_KEY"]}}},
    allowed_tools=["mcp__airatecard__*"],
)

async def main():
    async for m in query(prompt="Cheapest model with 128K context?", options=options):
        if isinstance(m, ResultMessage):
            print(m.result)

asyncio.run(main())

OpenAI Agents SDK (Python)

import asyncio, os
from agents import Agent, Runner
from agents.mcp import MCPServerStreamableHttp

async def main():
    async with MCPServerStreamableHttp(name="airatecard", params={"url": "https://airatecard.com/mcp",
            "headers": {"Authorization": "Bearer " + os.environ["AIRATECARD_KEY"]}}) as prices:
        agent = Agent(name="buyer", instructions="Answer with AI Rate Card prices and cite them.",
                      mcp_servers=[prices])
        print((await Runner.run(agent, "Cheapest model with 128K context?")).final_output)

asyncio.run(main())

LangChain / LangGraph (langchain-mcp-adapters)

import asyncio, os
from langchain_mcp_adapters.client import MultiServerMCPClient

async def main():
    client = MultiServerMCPClient({"airatecard": {
        "url": "https://airatecard.com/mcp", "transport": "streamable_http",
        "headers": {"Authorization": "Bearer " + os.environ["AIRATECARD_KEY"]}}})
    tools = await client.get_tools()      # give them to your agent, e.g. create_react_agent(model, tools)
    print([t.name for t in tools])

asyncio.run(main())

MCP SDK (Python, official)

import asyncio, os
from mcp import ClientSession
from mcp.client.streamable_http import streamablehttp_client

async def main():
    headers = {"Authorization": "Bearer " + os.environ["AIRATECARD_KEY"]}
    async with streamablehttp_client("https://airatecard.com/mcp", headers=headers) as (read, write, _):
        async with ClientSession(read, write) as s:
            await s.initialize()
            res = await s.call_tool("cheapest", {"category": "llm", "limit": 3})
            print(res.content[0].text)

asyncio.run(main())

MCP SDK (TypeScript, official)

import { Client } from "@modelcontextprotocol/sdk/client/index.js";
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";

const transport = new StreamableHTTPClientTransport(new URL("https://airatecard.com/mcp"), {
  requestInit: { headers: { Authorization: `Bearer ${process.env.AIRATECARD_KEY}` } },
});
const client = new Client({ name: "my-agent", version: "1.0.0" });
await client.connect(transport);
console.log(await client.callTool({ name: "cheapest", arguments: { category: "llm", limit: 3 } }));

HTTP (curl, JSON-RPC)

curl -s https://airatecard.com/mcp \
  -H "Authorization: Bearer $AIRATECARD_KEY" -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call",
       "params":{"name":"cheapest","arguments":{"category":"llm","limit":3}}}'

Good to know

One key per agent: then you can revoke one without stopping the others. Over a limit the server answers 429 with Retry-After - wait that many seconds, do not rotate keys. Every tool result carries a cite line and a card_url: have the agent quote it. The tools: search_offers, get_model_prices, cheapest, compare_models, estimate_cost, get_card, cheapest_models, dearest_models, median_models, list_articles.

Your account in AI assistants and agents (OAuth)

The MCP server has two addresses. https://airatecard.com/mcp works for everyone without signing in, with the guest limits. https://airatecard.com/mcp/account works under your AI Rate Card account: your limits (Free or Pro), and you see and revoke the access in your account. You sign in once, on this site - the assistant never sees your password.

Claude.ai / Claude Desktop

Settings → Connectors → Add custom connector, paste the address below. Leave the OAuth client on “Register automatically”. Claude opens this site's sign-in page: sign in and press Allow.

https://airatecard.com/mcp/account

ChatGPT

Settings → Connectors (developer mode) → create a connector with the address below and OAuth authentication. ChatGPT opens this site's sign-in page: sign in and press Allow.

https://airatecard.com/mcp/account

Claude Code

Add the server, then type /mcp inside Claude Code and choose Authenticate: the browser opens this site's sign-in page.

claude mcp add --transport http ai-rate-card-account https://airatecard.com/mcp/account

Cursor / VS Code

Cursor, VS Code and other MCP clients with OAuth: put the address in mcp.json; the client opens this site's sign-in page on the first call.

{
  "mcpServers": {
    "ai-rate-card-account": {
      "url": "https://airatecard.com/mcp/account"
    }
  }
}

Scripts and terminal agents: a code instead of a browser

A program without a browser uses the device flow (RFC 8628): it asks for a code, you open the address it shows on any device, sign in, check the code and press Allow, and the program gets its token. The four requests:

# 1. register your program once - keep the client_id
curl -s -X POST https://airatecard.com/oauth2/register -H 'Content-Type: application/json' \
  -d '{"client_name":"my script","token_endpoint_auth_method":"none","scope":"api offline_access",
       "grant_types":["urn:ietf:params:oauth:grant-type:device_code","refresh_token"]}'

# 2. ask for a code; open verification_uri_complete, sign in, press Allow
curl -s -X POST https://airatecard.com/oauth2/device/auth -d 'client_id=<client_id>&scope=api%20offline_access'

# 3. every few seconds until access_token comes
curl -s -X POST https://airatecard.com/oauth2/token -d 'grant_type=urn:ietf:params:oauth:grant-type:device_code' \
  -d 'device_code=<device_code>&client_id=<client_id>'

# 4. use it
curl -s https://airatecard.com/v1/meta -H 'Authorization: Bearer <access_token>'

Tokens, limits and revoking

Send the token as the header Authorization: Bearer <token> on /v1 and /mcp/account. It lives one hour; renew it with grant_type=refresh_token (the refresh token lives 30 days, until you revoke it). It counts with your account's limits, like a personal key. Every app you allowed is listed in your account under Connected apps, where one click revokes it and its tokens.

For agents: /auth.md. Standard metadata: /.well-known/oauth-authorization-server and /.well-known/oauth-protected-resource/mcp/account. Prefer a fixed key? Make one in your account under API keys and send it as X-API-Key.

llms.txt

A plain-text guide for AI agents, the llmstxt.org convention: what the site is, the API and the MCP server, and how to cite it - at /llms.txt (also /.well-known/llms.txt). The current cheapest offer of the most offered models, one line each, is at /llms-full.txt.

How to cite

CC BY 4.0: the catalog, the downloads, the API answers and the 90-day price history are free to use, quote and redistribute, including commercially, with attribution to AI Rate Card (airatecard.com) and a link to the card or page the numbers came from.

For AI agents there is /llms.txt and the public API at /v1 - look, compare and cite, never a bulk copy of the catalog or its price history.

Source: AI Rate Card, https://airatecard.com/en/c/offer:<id>

For providers

Free listing, done by you in the cabinet. The order of every list is by price only - money never moves a provider up.

How to join: six steps, about 15 minutes

Listing is free and done by you, in your cabinet, in about 15 minutes - no letters, no waiting for us:

  1. Create an account on the site - a login and a password, no e-mail.
  2. Press "Add a new provider" and type your company's name and site.
  3. Prove the domain is yours: a one-line file under /.well-known/, a DNS TXT record or a meta tag - and press "Check now".
  4. Type your models and prices in the form; it makes your models.yaml.
  5. Put that file on your site at /.well-known/airatecard-models.yaml and press "Check the file".
  6. Press "Publish": the collector switches you on automatically, usually within 10 minutes.

After that the file is read once a day: change a price in it and the catalog follows the next day. Your models appear on the site, in the API (/v1) and in the MCP server for AI assistants, with your own pages linked.

Add a new provider Step by step, with examples

Where your prices come from

Your prices come from one place only - your own site, so there are never two versions of the truth:

In the cabinet a confirmed provider sets only the look of its cards, sees its analytics and asks for a recheck of its page; prices are never typed in by hand or sent by API.

Already in the catalog?

Many providers are listed already: we read their public pricing pages. Open your card on "Providers" and press "This is my company" - prove the domain, and you manage the card: the look, analytics, a recheck of your prices. Prefer a file to your pricing page? After that, publish models.yaml the same way and tell the collector its address in the cabinet.

For AI agents: the whole path through the API and MCP

Every step of the cabinet's wizard is also a call: an agent working for a provider can start the listing, verify the domain, check the files, publish and later read its offers and ask for a recheck - with the same checks and the same texts. Prices never go through the API: the provider publishes models.yaml on its own site, the API only orchestrates. Every answer carries next_action (what to do next) and, on a problem, problems[] with the file, line, model, field, value, code, message and a hint.

How the agent signs its calls

The public calls (check-domain, validate) need nothing. The rest act for the person's account, either way: a personal key the person makes in the account (API keys) and gives to the agent - X-API-Key: <key> or Authorization: Bearer <key>; or OAuth with the scope `provider` (the consent page tells the person what the agent may do; a token with only `api` gets 403). The agent may act only for the organizations the person belongs to.

The calls, in order

RESTMCP (/mcp/account)
GET /v1/provider/check-domain?domain=public: the key, whether the catalog lists a seller on the domain (then claim_url), what to publishprovider_start tells the same
POST /v1/provider/validatepublic: body = models.yaml text, or JSON {"models": ..., "seller": ..., "domain": ...} -> ok, problems[], previewvalidate_provider_files
GET /v1/methe account: organizations, verified sellers, applications and their next_actionprovider_whoami
POST /v1/provider/applications{name, domain, org_id?, verification: file|dns|meta} -> 201 the application (200 when the domain was started before); 409 with the claim link for a listed domainprovider_start
GET /v1/provider/applications/{id}steps (company, domain, files, publish) with status and problems, verification (token and where it goes), files.models_url, urls, next_actionprovider_status
POST /v1/provider/applications/{id}/verify-domain[{verification}] -> result verified | not_found, looked_at, expectedprovider_verify_domain
POST /v1/provider/applications/{id}/check-files[{models_url}] -> ok, fetched, problems[], preview[]provider_check_files
POST /v1/provider/applications/{id}/publishreads the file again, queues the provider -> 202 {status: queued, eta_s, poll}; 409 with why when not verified or the file has problemsprovider_publish
GET /v1/provider/sellers/{key}a verified seller as the cabinet shows it: the file and its last read, policy, services, last recheckprovider_seller
GET /v1/provider/sellers/{key}/offersits offers: prices, context, max output, status (active | pending | rejected | problem), card urlprovider_offers
POST /v1/provider/sellers/{key}/recheckread the source now, once a day (429 + Retry-After before that)provider_recheck
GET /v1/provider/sellers/{key}/analytics?days=&format=json|csvthe premium analytics-

The same through MCP

The account server https://airatecard.com/mcp/account (OAuth or a personal key as Bearer) has the same steps as tools; the open server https://airatecard.com/mcp has validate_provider_files. Call provider_whoami first and follow next_action.

A full example on a made-up domain

# 0. before anything: does the catalog know the domain, and is the file right?
curl -s 'https://airatecard.com/v1/provider/check-domain?domain=newco.example'
curl -s -X POST https://airatecard.com/v1/provider/validate?domain=newco.example --data-binary @models.yaml

# 1. start (the person's key K; the same domain again returns the same application)
curl -s -X POST https://airatecard.com/v1/provider/applications -H 'X-API-Key: am_...' -H 'Content-Type: application/json' \
  -d '{"name": "NewCo", "domain": "newco.example", "verification": "file"}'
# -> data.id = 42, data.verification = {file_url: https://newco.example/.well-known/airatecard-verify.txt,
#    file_body: airatecard-verify=...}, data.files.models_url = https://newco.example/.well-known/airatecard-models.yaml,
#    data.next_action = {action: verify_domain, how: 'put a text file at ... with the line ...'}

# 2. the provider publishes the file with that line; then:
curl -s -X POST https://airatecard.com/v1/provider/applications/42/verify-domain -H 'X-API-Key: am_...'
# -> data.result = verified (or not_found with looked_at and expected)

# 3. the provider publishes models.yaml at files.models_url; then:
curl -s -X POST https://airatecard.com/v1/provider/applications/42/check-files -H 'X-API-Key: am_...'
# -> data.ok = false, data.problems = [{file: models.yaml, line: 11, model: t1, path: prices[0].amount,
#    value: abc, code: number, message: "amount 'abc' - a number, without a currency sign", hint: 0.59}]
# fix the file, call again -> data.ok = true, data.preview = the models as the catalog will show them

# 4. publish, then poll
curl -s -X POST https://airatecard.com/v1/provider/applications/42/publish -H 'X-API-Key: am_...'
# -> 202 {status: queued, eta_s: 300, poll: .../applications/42}
curl -s https://airatecard.com/v1/provider/applications/42 -H 'X-API-Key: am_...'
# -> data.status = published, data.urls.card = https://airatecard.com/en/providers/newco

# 5. from then on: the daily run reads the file. The agent reads what the site has, or asks for a read now
curl -s https://airatecard.com/v1/provider/sellers/newco/offers -H 'X-API-Key: am_...'
curl -s -X POST https://airatecard.com/v1/provider/sellers/newco/recheck -H 'X-API-Key: am_...'

A provider that is listed already

check-domain answers in_catalog: true with claim_url - a person of the company proves the domain there ("This is my company"); after that the agent reads the seller, its offers and asks for rechecks with /v1/provider/sellers/{key}... (MCP: provider_seller, provider_offers, provider_recheck).

OpenAPI: /openapi.json (tag provider) · /auth.md · /llms.txt

Sponsorship

The listing and every price are free and the same for all. Sponsorship is a donation: it adds a badge and never changes the order.

Sponsorship

Anyone can support the site: the "Support the project" button in the account. Every $5 is one month of the gold SPONSOR badge next to your login in the header and your nickname in the discussions, and a place on the sponsors' page (if you agree). $15 is three months, $60 a year; a new contribution extends the period.

A provider: a gold SPONSOR next to its name and a gold left edge on the rows of all its models on the Models and Providers tabs, a place on the sponsors' page. $29 a month is the launch price; the first sponsors keep it after it rises.

Rules

  • Sponsorship never changes the order of cards, sorting, prices or comparison results - only the badge.
  • The site's data is open and free for everyone; sponsors help keep it that way.

How to join

  1. Sign up (a login and a password, no e-mail).
  2. A person: account, "Support the project", a period. A provider: create an organization, verify the domain, "Services" -> "Sponsorship".

Online payment is not connected yet: we write to you how to send the contribution and turn the badge on by hand. Questions: hello@airatecard.com.

Our crawler

Last updated: 2026-10-10

AIRateCardBot is the crawler of AI Rate Card (https://airatecard.com). It keeps the catalog of AI model prices up to date.

What it does

  • It reads public pages and public endpoints that list models and prices, about once a day per provider.
  • It identifies itself with the User-Agent AIRateCardBot/1.0 (+https://airatecard.com/bot).
  • It follows robots.txt: rules for AIRateCardBot or for all crawlers (*) are checked before every request.
  • It keeps its request rate low.
  • It reads only what is public without logging in; it does not read private content.

What we show

On a provider's card we show the prices and a link to the provider's own site or model page. We do not publish the addresses of the pages or endpoints the bot reads.

Providers: how to control it

  • Stop it: add to your robots.txt User-agent: AIRateCardBot Disallow: / The bot stops on its next visit. Your listing stays with a link to your site, without collected prices.
  • Send prices yourself: publish your prices in our format and we read only that file. See how to add or update a provider.
  • Questions or corrections: write to providers@airatecard.com or hello@airatecard.com.

How ranking works

Last updated: 2026-10-10

This page explains how AI Rate Card orders models, offers and providers, and how paid placements are shown. It follows the transparency rules of the EU Platform-to-Business Regulation (2019/1150) and the Digital Services Act.

1. Where the prices come from

We take prices only from the providers' own sites: their public pricing pages and public APIs, or the seller.yaml/models.yaml files a provider publishes on its own domain. Every price shows its source and the date it was checked. Prices are checked every day. When two sources of the same provider disagree, the offer is marked as a conflict until the difference is resolved.

2. The default order

Lists are ordered by price, from the lowest to the highest, by the input price (for language models, the price per 1 million input tokens). Offers with the same price keep a fixed order by provider and model id, so the order does not change between visits. The Providers list is ordered by the number of models a provider offers.

Some offers are moved to the end of the list, whatever their price:

  • offers whose price we could not find ("no data");
  • prices that look wrong — for example, far from every other provider of the same model — marked with ⚠ until checked;

An offer is shown at price 0 only when the provider really offers it for free; a zero that the provider did not mark as free is treated as "no data".

You can change the order at any time by clicking a column header: price, context window, provider, date checked and others. A second click reverses the order. Filters apply to the whole list, not only to the page you see.

3. "Best price"

The best price of a model is the lowest price among its offers that are current, not marked as doubtful and not free trial plans. It is computed the same way for every provider.

4. What payment can and cannot change

Payment never changes the order of any list, the best price, the filters or the search results.

What providers can get:

  • Verified (free): the provider has confirmed that it controls its listing, for example through its domain. The listing gets a "Verified" badge and the provider can manage the look of its cards and ask for a recheck of its pricing page. The badge says who manages the listing, not that the price is better.
  • Advertising (paid, when offered): the provider's offer can be shown with its own picture, colours and a longer description, and can be shown in marked advertising places. Such content is always labelled "Ad" and names the advertiser. It is never placed in a list position it did not earn by price.

Paid placements are not offered yet.

Links to providers go through our address /go/… so that we can count the interest in each offer. We do not receive any commission for these clicks. If that ever changes, we will say so on this page and next to the links.

6. Questions and complaints

If you think an offer is shown in the wrong place, or a price is wrong, use the Report page or write to hello@airatecard.com. Providers can also correct their own data through the provider account.

FAQ

How fresh are the prices?

Checked daily, straight from the provider's own pricing page or API.

What does a price marked with a warning mean?

It looks wrong next to how that page usually reads, but is shown anyway, marked doubtful - check the provider's own page before relying on it.

What does “via X” mean?

The offer is served through another company's infrastructure (a router), not sold directly by the model's own maker; X is who it is sold through.

What are regions?

Where the provider serves that offer (data residency) - EU, US, Global... A different region is a different offer with its own price.

Why is a provider missing?

We have not collected it yet - tell us about it on /join and we will add it.