Seats Frog guide
Data for assistants and developers
Read Seats Frog without a browser, account or API key. Use the same public facts and source links that travellers see on our pages.
For an assistant
Connect with tools
Let your assistant discover and call the available research tools. Start with the MCP guide and ready-to-copy prompts.
Connect your assistant →For your code
Fetch public JSON
No key or browser session required. Start with the aircraft catalog, then follow a layout’s data URL.
For assistants that support tools, use the Seats Frog MCP connection guide. For direct retrieval, use the public JSON feeds below.
Find and cite an answer
- Search /search.json for pages, or read /data/aircraft.json for aircraft, published ranges and available airline layouts.
- Follow a layout’s
data_urlto/data/seatmaps/{airline}/{slug}. These GET endpoints return JSON withschema_version: 1. The catalog supplies exact slugs; do not infer them from an airline code. - Select the airline, aircraft and cabin configuration before recommending a seat. Each row’s
cabinis the zero-based index incabins; cabins include their deck and row bounds. Exclude seat slots withmissing: true. - Cite the returned
citation_urland originalsource_url. Includechecked_onwhen available.updated_atis a record edit date, not proof of a new source check.
From a catalog entry to a seat recommendation
This example follows the returned URL instead of constructing a layout slug. Run in JavaScript with fetch support.
const catalogResponse = await fetch("https://www.seatsfrog.com/data/aircraft.json");
if (!catalogResponse.ok) throw new Error("Catalog unavailable");
const catalog = await catalogResponse.json();
const aircraft = catalog.aircraft.find(a => a.slug === "747-8");
const layout = aircraft?.layouts.find(l => l.airline === "Korean Air");
if (!layout) throw new Error("Layout not recorded");
const response = await fetch(layout.data_url);
if (!response.ok) throw new Error("Seat map unavailable");
const map = await response.json();
const seats = map.rows.flatMap(row =>
row.seats.filter(seat => !seat.missing).map(seat => ({
...seat, cabin: map.cabins[row.cabin], citation: map.citation_url
}))
);Fields to keep with every answer
- citation_url / source_url
- The Seats Frog page to cite and its original source. Preserve both.
- checked_on / updated_at
- Source check date versus record edit date. Do not treat an edit as a fresh verification.
- rows[].cabin / cabins[].deck
- Join the zero-based cabin index to its cabin and deck. Names can repeat across decks.
- rating / reasons / features
- Keep the reasoning with the recommendation. Missing values mean unknown, not a positive rating.
Interpretation and uncertainty
Ratings and reasons are editorial guidance. A “standard” seat is not a guarantee of comfort. Missing measurements and null ranges mean unknown, not zero. Pitch, width and recline are inches; published range uses kilometres. A named seat product or window warning applies only to the recorded configuration.
Aircraft outlines and regular window spacing are schematic. Only explicit window warnings establish a recorded missing or misaligned window. Lavatory-to-seat ratios inferred from location are estimates and facilities may serve more than one class. Confirm the assigned aircraft and seat with the airline before travel.
Published range is not a dispatch calculation. The range feed identifies its source, checked date and basis; reserve assumptions remain unverified. Neither a map circle nor a custom range establishes EASA reserve compliance or available nonstop service.
Fetching and discovery
JSON feeds support cross-origin reads and five-minute caching. A 404 means no matching layout; a 503 means a temporary failure, not an empty catalog. Respect Retry-After and cache successful responses. No credentials are needed and these endpoints cannot change data.
Text directory · Page sitemap · Sources, ratings and corrections