For developers, newsrooms and AI assistants

Public API

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 URLhttps://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.

ParameterMeaning
cabin=1only airlines that allow pets in the cabin
hold=1only airlines that allow the hold
min_kg=8minimum weight allowed in cabin, pet plus carrier
airport=FCOonly airlines serving that airport
country=ITonly airlines serving at least one airport in that country (ISO 3166-1 alpha-2)
q=luftsearch by name
sort=score|name|max_kgsort order, defaults to score
limit / offsetpagination, 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”.

ParameterMeaning
airline=LHfilter by airline
limit200 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.

ParameterMeaning
airline=LHfilter by airline
limit200 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.

ParameterMeaning
airline=ITAfilter by airline
airport=FCOorigin or destination
aircraft=A320aircraft family or model
seat_type=standardstandard, 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

CodeWhen
400malformed parameter: an IATA code that is not three letters, a route with the same origin and destination
404unknown airline, airport or endpoint. The body lists the valid values when there are few of them
405method not supported by that endpoint; Flight Confidence submissions accept POST
429hourly limit exceeded
503data 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

Search a flight with your pet