API & data
QuotaLedger publishes its entire dataset as two static JSON files. They are free, require no key, and are served over HTTPS with permissive CORS so you can fetch them directly from a browser, a server, or an AI agent. There is no rate limit, but the data refreshes roughly once a day — polling more than once an hour wastes your bandwidth and ours.
Endpoints
GET https://quotaledger.com/data/limits.jsonThe current snapshot: every tracked vendor and plan, with prices and the exact published limit notes.
GET https://quotaledger.com/data/changelog.jsonAn append-only feed of every change we have observed since the baseline — price changes, plan additions and removals, limit-note edits, and renames.
Versioning & stability
- Stable URLs. The two paths above will not move. If a breaking schema change is ever required, it will ship at a new versioned path (e.g.
/data/v2/limits.json) and the current path will keep working. - Schema version.
limits.jsoncarries a top-levelschema_versionfield. The current version is0.1. Additive fields (new optional keys) can appear without a version bump; removals or renames will bump it. - Freshness. Read
generated_at(top level) and each vendor'sretrieved_atto know how current a value is. Both are UTC ISO-8601. - Append-only changelog. Existing changelog records are never edited or deleted, so you can safely store the last
tsyou saw and pull only newer entries.
Schema — limits.json
Top-level object:
| Field | Type | Description |
|---|---|---|
| schema_version | string | Dataset schema version (currently "0.1"). |
| generated_at | string | UTC ISO-8601 timestamp of this snapshot. |
| method | string | How the snapshot was produced (provenance note). |
| vendors | array | List of vendor objects (below). |
Each vendor object:
| Field | Type | Description |
|---|---|---|
| id | string | Stable slug (e.g. "claude", "github-copilot"). Use this as a key. |
| name | string | Human-readable vendor/product name. |
| source_url | string | The vendor pricing page the snapshot was taken from. |
| retrieved_at | string | UTC ISO-8601 time this vendor was last fetched. |
| currency | string | Currency of the prices for this vendor ("USD" or "CAD"). |
| currency_note | string? | Optional. Present when prices geo-localize; explains the canonical-vs-displayed currency. |
| plans | array | List of plan objects (below). |
| observations | array? | Optional analyst notes (model lineups, quota mechanics, caveats). |
Each plan object:
| Field | Type | Description |
|---|---|---|
| id | string | Stable slug within the vendor (e.g. "pro", "max"). |
| name | string | Plan name as published. |
| price_month | number|null | Headline monthly price in the vendor's currency. null when usage-based / no fixed seat fee. |
| price_detail | string? | Optional. Billing nuance (annual vs monthly, "from", per-seat, etc.). |
| limit_notes | array | The plan's published limits, preserved verbatim from the vendor. This is the citable core. |
Schema — changelog.json
A JSON array of change records, oldest first. Each record:
| Field | Type | Description |
|---|---|---|
| ts | string | UTC ISO-8601 time the change was recorded. |
| vendor | string | Vendor id, or "*" for dataset-wide events (e.g. baseline). |
| plan | string|null | Plan id the change applies to, or null for vendor-level changes. |
| change | string | One of: price_month_changed, price_detail_changed, name_changed, limit_note_added, limit_note_removed, plan_added, plan_removed, vendor_added, vendor_removed, vendor_renamed, source_url_changed, baseline_created. |
| old | any|null | Previous value (null for additions). |
| new | any|null | New value (null for removals). |
Example
Fetch the current price of Cursor Pro and the most recent change:
const limits = await (await fetch("https://quotaledger.com/data/limits.json")).json();
const cursor = limits.vendors.find(v => v.id === "cursor");
const pro = cursor.plans.find(p => p.id === "pro");
console.log(pro.name, pro.price_month, cursor.currency); // -> "Pro" 20 "USD"
const log = await (await fetch("https://quotaledger.com/data/changelog.json")).json();
console.log(log.at(-1)); // most recent observed change
currency and currency_note before comparing prices across vendors. Some vendors geo-localize their consumer pricing pages; where that happens we retain the canonical USD value and document the localized display in currency_note.
How to cite
Please do — citations are how this stays useful. Suggested format:
QuotaLedger. "AI plan limits dataset." https://quotaledger.com, retrieved YYYY-MM-DD.
When you quote a specific limit, prefer the verbatim limit_notes text and link the vendor's source_url alongside ours so readers can verify it. The data is free to use; attribution keeps the ledger honest and discoverable.