# rate-limit-radar — Methodology

Every cell on this site comes from one of the public docs URLs below. We re-fetch every 6 hours, persist every snapshot, and diff against the previous successful scrape.

| Provider | Source URL | Fetch frequency |
|---|---|---|
| Anthropic | https://docs.anthropic.com/en/api/rate-limits | every 6h |
| Cerebras | https://inference-docs.cerebras.ai/support/rate-limits | every 6h |
| DeepSeek | https://api-docs.deepseek.com/quick_start/rate_limit | every 6h |
| Fireworks AI | https://docs.fireworks.ai/guides/quotas_usage/rate-limits | every 6h |
| Google AI Studio | https://ai.google.dev/gemini-api/docs/rate-limits | every 6h |
| Groq | https://console.groq.com/docs/rate-limits | every 6h |
| Mistral La Plateforme | https://docs.mistral.ai/deployment/laplateforme/tier/ | every 6h |
| OpenAI | https://platform.openai.com/docs/guides/rate-limits | every 6h |
| Together AI | https://docs.together.ai/docs/rate-limits | every 6h |
| xAI | https://docs.x.ai/docs/models | every 6h |

## Parsing rules
- Each fetcher uses real cheerio HTML parsing. There are **no** seed numbers, fallbacks, or hard-coded limit values anywhere in this codebase.
- If a provider blocks scraping or restructures their page, that fetcher returns `status="parse_error"` and the provider is shown with a red badge on the dashboard until a human updates the parser.
- Cells display whatever the docs page said verbatim (e.g. "30,000", "No limit", "—"); a parsed numeric form is stored alongside for sorting only.

## Diffing
After each successful scrape, the radar compares the new `(provider, tier, model_class, dimension)` rows against the previous successful scrape for that provider and emits `change_event` rows for any row that was added, removed, increased, decreased, or renamed. Those events drive the changes feed and the RSS / JSON Feed endpoints.