The dog and cat travel rules of 37 airlines, in JSON, with no sign-up and no key. The same data that powers the comparison engine on this site, with the official source and verification date next to every airline.
Base URL — https://www.puppyonair.com/api/v1
Authentication — none. Format — JSON UTF-8. CORS — open, callable from the browser. Limit — 300 requests per hour per IP address.
What a response looks like
Every response has the same three top-level keys: meta about the request,
license with the terms of use, data with the content. The licence
travels inside the response on purpose: whoever integrates the API should not have to look
elsewhere to find out what they are allowed to do.
{
"meta": {
"api_version": "1.1",
"generated_at": "2026-08-28T00:00:00Z",
"total": 22,
"count": 22,
"limit": 50,
"offset": 0,
"sort": "score"
},
"license": {
"name": "CC BY 4.0",
"url": "https://creativecommons.org/licenses/by/4.0/",
"attribution": "Puppyonair — https://www.puppyonair.com"
},
"data": [
{
"id": "LH",
"name": "Lufthansa",
"hub": "FRA",
"score": 99,
"cabin": {
"allowed": true,
"max_kg": 8,
"carrier": "55 x 40 x 23 cm",
"carrier_cm": {
"l": 55,
"w": 40,
"h": 23
},
"fee_min_eur": 60,
"fee_max_eur": 120
},
"hold": {
"allowed": true,
"max_kg": 75
},
"airports_served": 178,
"policy_source": "https://www.lufthansa.com/de/en/animals-as-additional-carry-on-baggage",
"href": "/api/v1/airlines/LH"
}
]
}
Endpoints
GET /api/v1
Machine-readable index of the endpoints. A good starting point.
curl https://www.puppyonair.com/api/v1
GET /api/v1/meta
Version, licence, counts, when the data was last regenerated and when the official pages were last checked automatically.
curl https://www.puppyonair.com/api/v1/meta
GET /api/v1/airlines
List of airlines, sorted by pet-friendly score. Compact payload: the full list of airports served is only in the single-airline detail.
| Parameter | Meaning |
|---|---|
cabin=1 | only airlines that allow pets in the cabin |
hold=1 | only airlines that allow the hold |
min_kg=8 | minimum weight allowed in cabin, pet plus carrier |
airport=FCO | only airlines serving that airport |
country=IT | only airlines serving at least one airport in that country (ISO 3166-1 alpha-2) |
q=luft | search by name |
sort=score|name|max_kg | sort order, defaults to score |
limit / offset | pagination, 200 per page maximum |
curl 'https://www.puppyonair.com/api/v1/airlines?cabin=1&min_kg=8&sort=max_kg'
GET /api/v1/airlines/{id}
One airline, with the full cabin and hold policy, the score broken down, the airports served with city and country, the official source and the review average.
curl https://www.puppyonair.com/api/v1/airlines/LH
GET /api/v1/airports/{iata}
One airport and the airlines serving it, sorted by score.
curl https://www.puppyonair.com/api/v1/airports/FCO
GET /api/v1/routes/{from}/{to}
The airlines serving both airports, with the best cabin option highlighted. The form /routes/MXP-BCN works too.
curl https://www.puppyonair.com/api/v1/routes/MXP/BCN
Careful: this means “this airline serves both airports”, not “there is a direct flight tomorrow”.
GET /api/v1/changelog
Changes detected automatically on the official policy pages of the monitored airlines. Each entry says the page changed, not what changed: read it as “needs re-checking”.
| Parameter | Meaning |
|---|---|
airline=LH | filter by airline |
limit | 200 maximum |
curl https://www.puppyonair.com/api/v1/changelog
GET /api/v1/reviews
Approved reviews from people who flew with a pet, plus per-airline averages. No personal data: only the display name the author chose.
| Parameter | Meaning |
|---|---|
airline=LH | filter by airline |
limit | 200 maximum |
curl https://www.puppyonair.com/api/v1/reviews?airline=LH
GET /api/v1/flight-reports
Dated, moderated evidence about pet space, gate checks and carrier fit by aircraft and seat.
| Parameter | Meaning |
|---|---|
airline=ITA | filter by airline |
airport=FCO | origin or destination |
aircraft=A320 | aircraft family or model |
seat_type=standard | standard, bulkhead, exit or premium |
curl 'https://www.puppyonair.com/api/v1/flight-reports?airline=ITA&aircraft=A320'
POST /api/v1/flight-reports
Submit structured evidence. Every submission remains pending until moderated; personal data is not accepted.
POST /api/v1/watch
Request a Trip Watch for an airline and future trip. The alert activates only after email confirmation (double opt-in).
Limits and caching
The cap is 300 requests per hour per IP. Every response carries
X-RateLimit-Limit, X-RateLimit-Remaining and
X-RateLimit-Reset; past the limit you get a 429 with
Retry-After.
Responses over static data carry an ETag and
Cache-Control: max-age=3600. Sending the ETag back with
If-None-Match returns a 304 that costs no bandwidth.
curl -H 'If-None-Match: "a1b2c3d4e5f6"' \
https://www.puppyonair.com/api/v1/airlines
# HTTP/1.1 304 Not Modified
If you need the whole dataset, do not loop over the endpoints: there is a full JSON dump, a single file, regenerated with the data, served as a static asset and outside the rate limit.
Errors
| Code | When |
|---|---|
400 | malformed parameter: an IATA code that is not three letters, a route with the same origin and destination |
404 | unknown airline, airport or endpoint. The body lists the valid values when there are few of them |
405 | method not supported by that endpoint; Flight Confidence submissions accept POST |
429 | hourly limit exceeded |
503 | data not generated on the server yet |
Licence and citation
The data is released under Creative Commons Attribution 4.0. You may use, republish and adapt it, commercially too, on one condition: credit the source with a link.
Puppyonair, "Airline pet policies",
https://www.puppyonair.com/api (accessed DD/MM/YYYY),
CC BY 4.0 licence.
If you are writing a piece and need a figure that is not exposed here, get in touch: most of the time the data exists and simply is not published yet.
Where the data comes from, and what it is not
Every airline has a policy_source field with the URL of the official page and a
policy_verified_on field with the date that page was read by hand and compared
with the values published here. Airlines with monitored: true are also checked
automatically: when the official page changes, the change lands in the
update log.
This data does not replace confirmation from the airline. Policies change, cabin pet slots are capped per flight, and some rules depend on the route rather than the airline. Use it to orient yourself and rule out the impossible options, then confirm before you buy.
Frequently asked questions
- Do I need a key? No. No sign-up, no token.
- Can I use it in a commercial product? Yes, CC BY 4.0 allows it. Attribution with a link is required.
- How often does the data change? On every regeneration, typically when an official policy changes. The exact date is in
meta.generated_at. - Does it cover every airline in the world? No: 35, picked among those flying to and from Italy. Others are added when there is an official source to cite.
- Can I download everything instead of calling the API? Yes, the JSON dump exists for that.