Skip to content

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

  1. Search /search.json for pages, or read /data/aircraft.json for aircraft, published ranges and available airline layouts.
  2. Follow a layout’s data_url to /data/seatmaps/{airline}/{slug}. These GET endpoints return JSON with schema_version: 1. The catalog supplies exact slugs; do not infer them from an airline code.
  3. Select the airline, aircraft and cabin configuration before recommending a seat. Each row’s cabin is the zero-based index in cabins; cabins include their deck and row bounds. Exclude seat slots with missing: true.
  4. Cite the returned citation_url and original source_url. Include checked_on when available. updated_at is 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