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.
/listing-detail Listings https://api.fetchlayer.dev/airbnb/listing-detail 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"
}
}