Use the data
Everything on this site is generated from one dataset: 155 airlines, 370 allowance rows and 193 sources. That dataset is downloadable today. A read-only API and an MCP server are built on the same rows and are described below, but they are not reachable yet — this page says so plainly rather than letting you find out from a failed request.
Status at a glance
| Path | Available | Note |
|---|---|---|
| CSV download | Yes | Three files, CC BY 4.0 |
| Read-only API | Yes | api.bagcomply.com — two routes, same contentHash as this page. |
| MCP server | Yes | 7 tools live at mcp.bagcomply.com (streamable HTTP, no auth). |
Subdomain status checked 2026-10-25.
The dataset
Four entities, one row per record. The CSV bundle carries three of them; the fourth is served through the API envelope.
| Entity | Records | CSV rows | What it is |
|---|---|---|---|
airline | 155 | 370 | One row per allowance, so an airline with four tiers appears four times. Conditions are flattened into an applies_to column. |
source | 193 | 193 | The page each figure was copied from, with its verbatim excerpt, evidence tier and collection date. |
specialItem | 2 | — | Regulatory and industry baselines for batteries and power banks. Not in the CSV bundle yet — available through the API envelope only. |
luggageProduct | 24 | 24 | Manufacturer-published case dimensions, with the measurement basis and a verification flag per product. |
Licence: CC BY 4.0. Attribution text and a ready-made citation are below. Every row carries
its source_url, evidence_tier, checked_on and needs_review, so a derived table can be audited back to the airline page it came from.
The API
Read-only JSON over HTTPS, no key, no rate-limit account. The shape below is what the deployed handler returns — it is written up here so that an integrator can build against the contract before the host resolves.
| Endpoint | Returns |
|---|---|
GET / | Service description, the entity list, and the data-status contract explained below. |
GET /api/v1/:entity | All records for one entity, with a count and the metadata envelope. |
GET /api/v1/:entity/:id | One record, or { item: null } with a 404 — a missing id is never an empty object. |
Every response carries the same four metadata fields: apiVersion, contentHash, disclaimer and (on list endpoints) count. contentHash is the same hash
printed on the download page, so a consumer can prove that an API response and a CSV file came from the same
build. Add ?lang=zh for localised name fields where a translation exists.
The MCP server
7 tools over the Model Context Protocol, backed by the same rows and the same judgement
engine as the website. The point of the tool split is that each one returns something quotable on its own,
rather than a paginated blob the model has to slice.
MCP tools and what each answers Tool Name Answers list_airlines List / search airlines Which airlines are covered, and what their IATA codes are. get_airline Get one airline's baggage rules Every allowance row for one airline, with conditions and sources. search_baggage_rules Search baggage-rule rows across airlines The flat allowance table with filters for tier, cabin and free text. Each row is quotable on its own. check_baggage Check whether a bag fits A verdict for one bag against one airline, from the same engine the site uses. check_special_item Check a power bank or spare battery A verdict for a battery or power bank against the recorded limits. compare_airlines Compare two airlines' baggage rules Two airlines side by side, condition by condition. answer_query Route a natural-language question Convenience entry that dispatches to one of the tools above and returns its full payload.
answer_query is a convenience router, not a second contract: it dispatches to one of the six
atomic tools and returns that tool's full payload under result, plus a routed block saying which tool it chose. Integrate against the atomic tools; use the router only
when the question is already in natural language.
What every consumer must pass through
This is the part that is easy to drop and expensive to get wrong. Four facts travel with the data and must
reach the end reader unchanged:
-
needsReview — per record. True means the airline's figures are still awaiting
manual verification against its own page. Today this is true for 155
of 155 airlines. A verdict drawn from such a record is preliminary, and labelling it otherwise
is the one thing this dataset exists to prevent.
-
evidenceTier — per source. official-unverified means an official
page was read but not independently checked; only the *-verified tiers count as verified.
Today 25 of 193 sources are at a verified tier.
-
null is not zero. A null limit means the airline does not publish that figure.
Coercing it to 0 turns "unknown" into "nothing allowed", which is the opposite claim.
- A missing row is not a permissive rule. Where no rule is recorded for a condition, the
correct output is "not enough information", not "no restriction". The site's own checker returns four
distinct answers for this reason.
Citing and correcting
Suggested citation:
BagComply. Airline cabin and checked baggage allowance dataset. Retrieved 2026-10-25 from
https://bagcomply.com/data/. Licensed CC BY 4.0.
Cite the download page rather than a versioned file path: the files are rebuilt whenever the data changes, and
citing the page keeps the reader pointed at the current rows. If you need to pin a build, record the contentHash your copy carries — it identifies the exact dataset.
Corrections are the point of publishing sources. If a row disagrees with the airline's own page, write to editorial@bagcomply.com
with the airline, the URL and what the page says; the
editorial policy describes how a
correction is recorded rather than silently overwritten.
What the dataset does not contain
-
No enforcement data. We do not measure or score how strictly an airline applies its own rules, and nothing
here should be read as such a score.
-
No checked-baggage allowance rows yet: the checked tier set is empty, so a checked-bag query returns "rule
not found" rather than a verdict.
-
No prices, no seat maps, no route data, and no personal data of any kind. The API takes no key and sets no
cookie.
-
Product dimensions are manufacturer figures, not measurements we took: 12 of 24 products have been checked against the brand's own page, and only those can drive
a deterministic fit check.
Download the dataset · Collection and checking method · Data insights