fries.wtf API
Which fast food actually feeds you, per dollar.
Nutrition-per-dollar rankings across 33 US chains and 13 metro areas — plus an exact optimiser that answers “cheapest way to hit 60g of protein under $12” with real menu items. REST and MCP.
Straight about coverage: we hold published nutrition for around 7,000 items, but an item can only be ranked once we also have a collected price for it, and that is 2,131 today across 26 chains. Seven further chains are nutrition-only for now. Coverage grows as collection runs.
Why this is hard to get elsewhere
Nutrition data is published. Prices are not — they live inside each chain’s ordering system, per store, and there is no maintained national feed. We collect them ourselves, per metro, and have been recording the history since July 2026.
What you get back is the index: rankings, value and health scores, protein per dollar, and solved meal plans. That analysis is the product. We do not resell raw price lists.
How accurate is this, honestly
Prices are best-effort estimates, not quotes. They are collected per metro area from publicly published menus, and a given restaurant may charge something different — franchise pricing varies store to store, promotions come and go, and menus change between our collections.
They are not real-time. Each chain is re-collected periodically, not
continuously, so any given figure may be days old. Every response carries a generated_at
timestamp so you can judge for yourself.
Nutrition comes from the chains' own published figures and is as accurate as what they publish, which is to say: fine for comparison, not for clinical use.
What we are confident in is the comparison. If our data says one item gives twice the protein per dollar as another, that relationship holds even when the absolute cents are stale. Build on the ranking, not on the decimal.
Endpoints
Base URL https://fries.wtf/v1.php · auth via ?key= or
Authorization: Bearer
endpoint=rankings
Items ranked by your chosen metric, with the full index attached.
curl "https://fries.wtf/v1.php?endpoint=rankings&metric=protein_per_dollar®ion=CHI&limit=5&key=YOUR_KEY"
| param | values |
|---|---|
metric | value · protein_per_dollar · calories_per_dollar · health · protein_density |
region | NYC, CHI, LA, SF, ATL, HOU, PHX, SEA, DEN, MIA, MSP, SGF, or US |
chain | optional chain id, e.g. panera |
limit | 1–250, default 50 |
min_calories | quality floor, default 100 — set 0 to disable |
min_protein | quality floor in grams, default 5 for protein metrics and 0 otherwise |
The floors exist because ratio metrics are otherwise won by condiment cups — a 3g sauce for $0.35 beats every real meal on protein-per-dollar and is a useless answer. They are metric-aware (a protein floor would be wrong for calories-per-dollar) and you can switch them off.
endpoint=plan
The differentiated one. Exact search — not a heuristic — for the cheapest combination of real menu items reaching a protein target inside a budget and calorie cap, solved per chain.
curl "https://fries.wtf/v1.php?endpoint=plan&protein=60&budget=12®ion=US&key=YOUR_KEY"
{
"plans": [
{ "chain": "panera",
"combo": [ { "name": "Asiago Everything Bagel", "qty": 4 } ],
"totals": { "cost": 8.76, "protein": 60, "calories": 1480 } }
]
}
Also accepts calories (cap), include_treats, and
max_per_item — default 2. The unconstrained cheapest basket is often four
copies of one item: correct, but not a meal. Raise it if you want the true optimum.
endpoint=history
Price movement over time, as a matched-basket index. Only items observed on at least two distinct days are counted, so a changing menu cannot masquerade as inflation — the same reasoning behind a fixed CPI basket. The index is rebased to 100 at the first observed day.
curl "https://fries.wtf/v1.php?endpoint=history®ion=NYC&days=30&key=YOUR_KEY"
{
"chains": [
{ "chain": "little-caesars", "basket_size": 77,
"from": "2026-07-20", "to": "2026-07-21",
"index_now": 102.42, "change_pct": 2.42, "series": [ ... ] }
]
}
Read this before relying on it. Collection began 19 July 2026, so the series is currently about nine days deep and most chains show no movement at all — which is the honest result, not a broken endpoint. This is a long-run dataset in its first week. It is worth having because nobody can go back and collect the days they missed, but it is not yet a trend product and we will not pretend otherwise.
endpoint=chains
Coverage list with item counts. Call it first if you are unsure which chain ids are valid.
MCP — for agents
The same data as a Model Context Protocol server, so an agent can discover and call it directly.
initialize and tools/list work without a key, so you can inspect it before
signing up.
{
"mcpServers": {
"fries": {
"type": "http",
"url": "https://fries.wtf/mcp.php?key=YOUR_KEY"
}
}
}
Tools: fastfood_rankings, fastfood_plan, fastfood_chains.
Machine-readable spec
OpenAPI 3.1 at https://fries.wtf/openapi.json — import it
into Postman, Insomnia, or a client generator.
What exists today, and what does not
Working now: rankings, the meal-cost optimiser, chain coverage, all of it over REST and MCP, with per-key metering and quotas.
Built but young: the price-history index works and is documented above, but the series only began on 19 July 2026. Nine days is enough to prove the method and not enough to draw conclusions from. Treat it as an asset that compounds rather than one you buy today.
Honest limits: prices are collected per metro and move between collections, so per-dollar figures are for comparison, not quotes. Four chains are excluded entirely because obtaining their prices would mean defeating their bot protection, which we will not do.
Pricing
Free
$0
- 100 calls / month
- All endpoints
- Attribution required
Starter
$19/mo
- 5,000 calls / month
- All endpoints + MCP
- Email support
Pro
$99/mo
- 50,000 calls / month
- Priority support
- Price-history index
- Input on what we collect next
Custom
Talk
- Bulk or unmetered
- Named metros
- Commercial terms
Billing is not yet automated. Request a key below and we will set you up manually — which also means we will actually read what you are building and can shape the data around it.