Airbnb Listing API — One Listing, Host and Price
Documentation menu
FetchLayer FetchLayer API

Read one listing in full

Read one listing in full by its numeric id or its `airbnb.com/rooms/…` URL: title, description, property and room type, guest capacity, location, amenities, photos, the aggregate rating **with its per-category breakdown**, and the host's public profile — name, photo, Superhost and verified status, rating, years hosting, response rate and response time. **Dates are optional, and the two routes that take them behave differently on purpose.** `/search-listings` **always prices**: with no dates it prices every result for the source's own default stay window and reports that window back on `checkIn`/`checkOut` plus a note. `/listing-detail` **does not**: with no dates `listing.price` is **`null`** and a note says to pass `checkIn` and `checkOut` to price a stay. A search has to price to be a search; a detail read will not invent a stay you did not ask about. Read one route's behaviour onto the other and a `null` price looks like a broken listing when it is the documented answer. `price` is a structured object, not a number: `{total, perNight, nights, taxesAndFees, originalTotal, qualifier, note}`, where `total`, `perNight`, `taxesAndFees` and `originalTotal` are each `{amount, currency, formatted}`. `originalTotal` above `total` means a discount is applied — a measured example is `originalTotal: {amount: 1083.09}` against `total: {amount: 940.47}`. `taxesAndFees` is broken out rather than folded into the total, and `nights` is the stay length the figures cover. Any of the money fields can be `null` when the source did not publish it. **Dates here price a stay; they are not a calendar.** A stay that cannot be priced returns `price: null` with a note that it may be unavailable for those dates — which tells you about those dates and nothing else. For which nights are open, use [`/listing-availability`](/documentation/airbnb/endpoints/listing-availability), which returns the calendar night by night. **An id that names no listing is a 404 with a message** — `{"error":"no listing was found for id \"1\""}` — not a 503. A wrong id is a wrong request, so there is nothing to retry; a stay that simply cannot be priced is still a 200, with `price: null` and a note. Billing: 1 credit per page fetched, reported as `pagesFetched`. Measured on 17 September 2026: `{"listing":"33579922"}` returned 200 in 0.96-1.19s across three runs.

POST /listing-detail Listings
https://api.fetchlayer.dev/airbnb/listing-detail
OpenAPI JSON

Headers

Authorization string required

Bearer token — your FetchLayer API key.

Parameters

listing string required

A listing: its `airbnb.com/rooms/…` URL, or its numeric id. The only required field.

checkIn string optional

Stay start date, YYYY-MM-DD. Optional — **without it, `listing.price` is null by design** and a note says so. Must be given together with `checkOut`.

checkOut string optional

Stay end date, YYYY-MM-DD. Required if `checkIn` is given, and vice versa.

adults integer optional

Adult guests to price the stay for, up to 50. Only used when `checkIn`/`checkOut` are given.

format string optional

Envelope format: json or markdown. (default: json)

Response Fields

listing-detail

Read one listing in full

transport string

The source. "airbnb".

notes string[]

Caveats and completeness statements you can act on, in plain words. On /listing-reviews this is where the "10 of the 52" line lives; on the priced routes it is where the stay window used for pricing is stated; on /listing-availability it is where the booking-window warning lives — read it before reading a run of closed nights as a closure.

pagesFetched number

Pages read, and what the request is billed at: 1 credit per page. A page costs the same whether it comes back full or half empty. /resolve-url reports 0 and is free.

listing.id string

The listing's numeric id.

listing.url string

Its canonical `airbnb.com/rooms/…` address.

listing.title string

The listing title as published by the host.

listing.propertyType string

The property kind in the source's own vocabulary, e.g. "APARTMENT".

listing.roomType string

What is being let, e.g. "ENTIRE_HOME".

listing.personCapacity number

How many guests the listing takes.

listing.descriptionHtml string

The host's full description, with the source's own markup preserved — measured at 3,330 characters on the example listing, against the one-line teaser a search row carries.

listing.location object

`{area, coordinates: {latitude, longitude}, isExactLocation}`. **Check `isExactLocation`**: it was `false` on the listing measured, meaning the coordinates are the approximate ones the source publishes before a booking, not the front door.

listing.rating object

`{average, count, categories}`. `categories` is the per-category breakdown as `[{category, average}]`, measured as ACCURACY, CLEANLINESS, CHECKIN, LOCATION, COMMUNICATION and VALUE. **This is where per-category ratings live** — individual reviews from /listing-reviews carry a single overall `rating`, not a breakdown.

listing.host object

`{id, name, profilePictureUrl, isSuperhost, isVerified, rating: {average, count}, yearsHosting, monthsHosting, responseRate, responseTime, about, stats, highlights}`. `responseRate` and `responseTime` are the source's own phrases ("Response rate: 100%", "Responds within an hour"), `stats` is `[{label, value}]`, and `highlights` is the host's own profile lines.

listing.amenities object[]

`[{title, available, group}]`. `title` is the source's own wording and can carry detail ("Fast wifi – 232 Mbps", "43 inch HDTV with standard cable"). `available: false` marks an amenity the listing explicitly does not have, so absence and refusal are different answers.

listing.photos object[]

`[{url, caption}]` — 26 on the listing measured, against the six a search row carries. `caption` is null where the host wrote none.

listing.highlights string[]

The source's own highlight lines for the listing. Empty on the listing measured.

listing.price string

**Null when no dates were given** — that is the documented answer, not a failure — and null again when the stay could not be priced, with a note saying it may be unavailable for those dates. Otherwise the structured object: `price` is a structured object, not a number: `{total, perNight, nights, taxesAndFees, originalTotal, qualifier, note}`, where `total`, `perNight`, `taxesAndFees` and `originalTotal` are each `{amount, currency, formatted}`. `originalTotal` above `total` means a discount is applied — a measured example is `originalTotal: {amount: 1083.09}` against `total: {amount: 940.47}`. `taxesAndFees` is broken out rather than folded into the total, and `nights` is the stay length the figures cover. Any of the money fields can be `null` when the source did not publish it.

listing.price.total object

`{amount, currency, formatted}` — the whole stay, e.g. `{amount: 1245, currency: "USD", formatted: "$1,245"}`.

listing.price.perNight object

`{amount, currency, formatted}` — the per-night figure, e.g. `{amount: 301.93, currency: "USD", formatted: "$301.93"}`.

listing.price.nights number

How many nights the figures cover.

listing.price.taxesAndFees object

`{amount, currency, formatted}`, broken out rather than folded into `total`. Null when the source published no separate figure.

listing.price.originalTotal object

The pre-discount total when one is published, in the same money shape. Above `total` means a discount is applied; null means there is none to report. Measured: `{amount: 1083.09}` against a `total` of `{amount: 940.47}`.

listing.price.qualifier string

What the figures are qualified as, in the source's own words — "total" or "for 4 nights".

listing.price.note string

Whatever the source printed alongside the price, verbatim, e.g. "Pay $0 today with no extra fees." or the room name on a hotel row. Null when there was none.

listing.checkIn string

The stay start the price is for, echoed back. Null when no dates were given.

listing.checkOut string

The stay end, on the same terms.

Request

curl -X POST "https://api.fetchlayer.dev/airbnb/listing-detail" \
  -H "Authorization: Bearer ss-your-key" \
  -H "Content-Type: application/json" \
  -d '{"listing":"33579922","checkIn":"2026-12-08","checkOut":"2026-12-12","adults":2}'

Response

{
  "transport": "airbnb",
  "notes": [],
  "pagesFetched": 1,
  "listing": {
    "id": "33579922",
    "url": "https://www.airbnb.com/rooms/33579922",
    "title": "Chiado chic 2 bedroom 2 bathroom apt, top location",
    "propertyType": "APARTMENT",
    "roomType": "ENTIRE_HOME",
    "personCapacity": 5,
    "descriptionHtml": "Situated on Rua da Misericórdia, linking the vibrant neighborhoods of Chiado and Principe Real, my apartment features 2 bedrooms and 2 bathrooms. …",
    "location": {
      "area": "Lisbon",
      "coordinates": {
        "latitude": 38.7132,
        "longitude": -9.14376
      },
      "isExactLocation": false
    },
    "rating": {
      "average": 4.95,
      "count": 465,
      "categories": [
        {
          "category": "ACCURACY",
          "average": 4.95
        },
        {
          "category": "CLEANLINESS",
          "average": 4.91
        },
        {
          "category": "CHECKIN",
          "average": 4.95
        },
        {
          "category": "LOCATION",
          "average": 4.97
        },
        {
          "category": "COMMUNICATION",
          "average": 4.97
        },
        {
          "category": "VALUE",
          "average": 4.87
        }
      ]
    },
    "host": {
      "id": "RGVtYW5kVXNlcjoyNTMwMjk0Mzc=",
      "name": "Mario",
      "profilePictureUrl": "https://a0.muscache.com/im/pictures/user/User/original/85aa5987-1821-473e-bdd6-1fcc95bc794d.jpeg",
      "isSuperhost": true,
      "isVerified": true,
      "rating": {
        "average": 4.95,
        "count": 465
      },
      "yearsHosting": 7,
      "monthsHosting": 5,
      "responseRate": "Response rate: 100%",
      "responseTime": "Responds within an hour",
      "stats": [
        {
          "label": "Reviews",
          "value": "465"
        },
        {
          "label": "Rating",
          "value": "4.95"
        },
        {
          "label": "Years hosting",
          "value": "7"
        }
      ],
      "highlights": [
        "Born in the 60s",
        "Favorite song in high school: The Logical Song - Supertramp"
      ]
    },
    "amenities": [
      {
        "title": "Kitchen",
        "available": true,
        "group": null
      },
      {
        "title": "Fast wifi – 232 Mbps",
        "available": true,
        "group": null
      }
    ],
    "photos": [
      {
        "url": "https://a0.muscache.com/im/pictures/6ae6f001-a512-474b-96ce-bd7852242a3e.jpg",
        "caption": null
      }
    ],
    "highlights": [],
    "price": {
      "total": {
        "amount": 1245,
        "currency": "USD",
        "formatted": "$1,245"
      },
      "originalTotal": null,
      "perNight": {
        "amount": 301.93,
        "currency": "USD",
        "formatted": "$301.93"
      },
      "nights": 4,
      "taxesAndFees": {
        "amount": 36.7,
        "currency": "USD",
        "formatted": "$36.70"
      },
      "qualifier": "total",
      "note": "Pay $0 today with no extra fees."
    },
    "checkIn": "2026-12-08",
    "checkOut": "2026-12-12"
  }
}