Airbnb prices for your dates, with the arithmetic behind the total
The Airbnb API returns short-term rental listings, prices and host data as clean JSON.
8 active endpoints, on 1, 2 and 3 credit tiers.
- POST/airbnb/v1/stays.search
- POST/airbnb/v1/stays.detail
- POST/airbnb/v1/host.profile
- POST/airbnb/v1/stays.reviews
- POST/airbnb/v1/stays.availability_calendar
- POST/airbnb/v1/properties.search
- POST/airbnb/v1/properties.detail
- +1 more
What Airbnb endpoints does ReefAPI ship?
8 live read endpoints. Read-only data API: no writes, no account actions, no dashboard access on the target site.
Airbnb API
3 of 8 endpoints, ready to run
Stays for a place and a date range, each row carrying the stay total, the guest-favourite badge, the rating with its review count and coordinates. Send the dates — a dateless search prices a stay the source picked, not yours.
{ "ok": true, "meta": { "api": "airbnb", "endpoint": "stays.search", "mode": "live", "latency_ms": 1374.6, "record_count": 26, "cache_hit": false }, "data": { "items": [ { "id": "1148064", "name": "Apartment in Graça", "rating": "4.91 (575)", "rating_label": "4.91 out of 5 average rating, 575 reviews", "price": "€192 total", "coordinate": { "lat": 38.7147, "lng": -9.12923 }, "badges": [ "Guest favorite" ], "subtitle": "The Hidden Hill's House/river view", "raw": { "__typename": "StaySearchResult", "avgRatingA11yLabel": "4.91 out of 5 average rating, 575 reviews", "avgRatingLocalized": "4.91 (575)", "listingParamOverrides": { "__typename": "ExploreListingParamOverrides", "adults": null, "categoryTag": null, "causeId": null, "checkin": null, "checkout": null, "children": null, "distanceInKm": null, "highlightType": null, "infants": null, "pets": null, "photoId": "11362181", "relaxedAmenityIds": [], "splitStaysLocationPrecisions": [], "splitStaysLocationsAcpIds": [], "splitStaysUuid": null, "amenities": null }, "structuredDisplayPrice": { "__typename": "StructuredDisplayPrice", "primaryLine": { "__typename": "QualifiedDisplayPriceLine", "accessibilityLabel": "€192 total", "price": "€192", "qualifier": "total", "concatQualifierLeft": false, "trailing": null }, "secondaryLine": null, "explanationData": { "__typename": "DisplayPriceExplanationData", "title": "Price details", "subtitle": null, "priceDetails": [ { "__typename": "DisplayPriceExplanationLineGroup", "items": [ { "__typename": "DefaultExplanationLineItem", "description": "2 nights x €87.60", "priceString": "€175.20", "explanationData": null }, { "__typename": "DefaultExplanationLineItem", "description": "Taxes", "priceString": "€16.00", "explanationData": null } ], "renderBorderTop": false, "collapsable": null }, { "__typename": "DisplayPriceExplanationLineGroup", "items": [ { "__typename": "HighlightExplanationLineItem", "description": "Total", "priceString": "€191.20", "explanationData": null, "originalPriceString": null, "accessibilityLabel": "€191.20 total" } ], "renderBorderTop": true, "collapsable": null } ] }, "explanationDataDisplayPosition": "PRIMARY_LINE", "displayPriceStyle": "REGULATED_TOTAL", "loggingMetadata": { "__typename": "StructuredDisplayPriceLoggingMetadata", "loggingCorrelationId": "c0b43502-0b09-4110-b1d5-a41f2fa22610" } }, "badges": [ { "__typename": "ExploreFormattedBadge", "icon": null, "loggingContext": { "__typename": "ExploreFormattedBadgeLoggingContext", "badgeType": "GUEST_FAVORITE" }, "style": "LOUD_ROUNDED_PILL", "text": "Guest favorite", "textAccessibilityLabel": "Guest favorite", "textColor": "#000000" } ], "contextualPictures": [ { "__typename": "ExplorePicture", "caption": null, "dominantSaturatedColor": null, "id": "11362181", "largeRo": null, "originalPicture": null, "picture": "https://a0.muscache.com/im/pictures/17269879/05846ec4_original.jpg", "previewEncodedPng": null, "saturatedA11yDarkColor": null, "scrimColor": null, "xlPicture": null }, { "__typename": "ExplorePicture", "caption": null, "dominantSaturatedColor": null, "id": "11362182", "largeRo": null, "originalPicture": null, "picture": "https://a0.muscache.com/im/pictures/17268995/6b88306f_original.jpg", "previewEncodedPng": null, "saturatedA11yDarkColor": null, "scrimColor": null, "xlPicture": null }, { "__typename": "ExplorePicture", "caption": null, "dominantSaturatedColor": null, "id": "11362183", "largeRo": null, "originalPicture": null, "picture": "https://a0.muscache.com/im/pictures/17267750/a83ecc4d_original.jpg", "previewEncodedPng": null, "saturatedA11yDarkColor": null, "scrimColor": null, "xlPicture": null } ], "paymentMessages": [], "title": "Apartment in Graça", "subtitle": "The Hidden Hill's House/river view", "nameLocalized": { "__typename": "UGCText", "localizedStringWithTranslationPreference": "The Hidden Hill's House/river view" }, "propertyId": null, "structuredContent": { "__typename": "ExploreStructuredContent", "distance": [], "mapCategoryInfo": null, "mapPrimaryLine": [ { "__typename": "MainSectionMessage", "body": "1 bedroom", "bodyA11yLabel": null, "bodyType": null, "fontWeight": null, "headline": null, "type": "BEDINFO" }, { "__typename": "MainSectionMessage", "body": "1 double bed", "bodyA11yLabel": null, "bodyType": null, "fontWeight": null, "headline": null, "type": "BEDINFO" }, { "__typename": "MainSectionMessage", "body": "1 bath", "bodyA11yLabel": null, "bodyType": null, "fontWeight": null, "headline": null, "type": "BATHROOMINFO" } ], "mapSecondaryLine": [], "primaryLine": [ { "__typename": "MainSectionMessage", "body": "1 bedroom", "bodyA11yLabel": null, "bodyType": null, "fontWeight": null, "headline": null, "type": "BEDINFO" }, { "__typename": "MainSectionMessage", "body": "1 double bed", "bodyA11yLabel": null, "bodyType": null, "fontWeight": null, "headline": null, "type": "BEDINFO" }, { "__typename": "MainSectionMessage", "body": "1 bath", "bodyA11yLabel": null, "bodyType": null, "fontWeight": null, "headline": null, "type": "BATHROOMINFO" } ], "secondaryLine": [ { "__typename": "MainSectionMessage", "body": "Individual host", "bodyA11yLabel": null, "bodyType": null, "fontWeight": null, "headline": null, "type": "HOSTINFO" } ], "tertiaryLine": [], "reviewSnippet": null, "explanation": [] }, "passportData": null, "demandStayListing": { "__typename": "DemandStayListing", "id": "RGVtYW5kU3RheUxpc3Rpbmc6MTE0ODA2NA==", "location": { "__typename": "DemandStayListingLocation", "coordinate": { "__typename": "Coordinate", "latitude": 38.7147, "longitude": -9.12923 } }, "description": { "__typename": "DemandStayListingDescription", "name": { "__typename": "UGCText", "localizedStringWithTranslationPreference": "The Hidden Hill's House/river view" } }, "wishlistItems": [], "nameLocale": "en" }, "priceBreakdownMessages": [] } }, { "id": "20679203", "name": "Apartment in Misericórdia", "rating": "4.89 (665)", "rating_label": "4.89 out of 5 average rating, 665 reviews", "price": "€201 total", "coordinate": { "lat": 38.7126, "lng": -9.1462 }, "badges": [ "Guest favorite" ], "subtitle": "Music Apartment in the heart of Bairro Alto!", "raw": { "__typename": "StaySearchResult", "avgRatingA11yLabel": "4.89 out of 5 average rating, 665 reviews", "avgRatingLocalized": "4.89 (665)", "listingParamOverrides": { "__typename": "ExploreListingParamOverrides", "adults": null, "categoryTag": null, "causeId": null, "checkin": null, "checkout": null, "children": null, "distanceInKm": null, "highlightType": null, "infants": null, "pets": null, "photoId": "368789676", "relaxedAmenityIds": [], "splitStaysLocationPrecisions": [], "splitStaysLocationsAcpIds": [], "splitStaysUuid": null, "amenities": null }, "structuredDisplayPrice": { "__typename": "StructuredDisplayPrice", "primaryLine": { "__typename": "QualifiedDisplayPriceLine", "accessibilityLabel": "€201 total", "price": "€201", "qualifier": "total", "concatQualifierLeft": false, "trailing": null }, "secondaryLine": null, "explanationData": { "__typename": "DisplayPriceExplanationData", "title": "Price details", "subtitle": null, "priceDetails": [ { "__typename": "DisplayPriceExplanationLineGroup", "items": [ { "__typename": "DefaultExplanationLineItem", "description": "2 nights x €92.28", "priceString": "€184.55", "explanationData": null }, { "__typename": "DefaultExplanationLineItem", "description": "Taxes", "priceString": "€16.00", "explanationData": null } ], "renderBorderTop": false, "collapsable": null }, { "__typename": "DisplayPriceExplanationLineGroup", "items": [ { "__typename": "HighlightExplanationLineItem", "description": "Total", "priceString": "€200.55", "explanationData": null, "originalPriceString": null, "accessibilityLabel": "€200.55 total" } ], "renderBorderTop": true, "collapsable": null } ] }, "explanationDataDisplayPosition": "PRIMARY_LINE", "displayPriceStyle": "REGULATED_TOTAL", "loggingMetadata": { "__typename": "StructuredDisplayPriceLoggingMetadata", "loggingCorrelationId": "011f6c72-18ca-4390-853b-7901da64bc2b" } }, "badges": [ { "__typename": "ExploreFormattedBadge", "icon": null, "loggingContext": { "__typename": "ExploreFormattedBadgeLoggingContext", "badgeType": "GUEST_FAVORITE" }, "style": "LOUD_ROUNDED_PILL", "text": "Guest favorite", "textAccessibilityLabel": "Guest favorite", "textColor": "#000000" } ], "contextualPictures": [ { "__typename": "ExplorePicture", "caption": null, "dominantSaturatedColor": null, "id": "368789676", "largeRo": null, "originalPicture": null, "picture": "https://a0.muscache.com/im/pictures/adb4df9f-4e8e-4744-900c-a50c461a5120.jpg", "previewEncodedPng": null, "saturatedA11yDarkColor": null, "scrimColor": null, "xlPicture": null }, { "__typename": "ExplorePicture", "caption": null, "dominantSaturatedColor": null, "id": "368789663", "largeRo": null, "originalPicture": null, "picture": "https://a0.muscache.com/im/pictures/f8f06347-f897-4b21-bc02-f7ce7eef93b2.jpg", "previewEncodedPng": null, "saturatedA11yDarkColor": null, "scrimColor": null, "xlPicture": null }, { "__typename": "ExplorePicture", "caption": null, "dominantSaturatedColor": null, "id": "368789660", "largeRo": null, "originalPicture": null, "picture": "https://a0.muscache.com/im/pictures/f8a347ca-d8aa-4c19-8cf3-98d5a19a6a18.jpg", "previewEncodedPng": null, "saturatedA11yDarkColor": null, "scrimColor": null, "xlPicture": null } ], "paymentMessages": [ { "__typename": "PaymentMessage", "text": "Pay €0 today", "type": "PAY_ZERO_UPFRONT_HIGHLIGHT", "displayType": "GREY_PILL" }, { "__typename": "PaymentMessage", "text": "Free cancellation", "type": "FREE_CANCELLATION_HIGHLIGHT", "displayType": "GREY_PILL" } ], "title": "Apartment in Misericórdia", "subtitle": "Music Apartment in the heart of Bairro Alto!", "nameLocalized": { "__typename": "UGCText", "localizedStringWithTranslationPreference": "Music Apartment in the heart of Bairro Alto!" }, "propertyId": null, "structuredContent": { "__typename": "ExploreStructuredContent", "distance": [], "mapCategoryInfo": null, "mapPrimaryLine": [ { "__typename": "MainSectionMessage", "body": "1 bedroom", "bodyA11yLabel": null, "bodyType": null, "fontWeight": null, "headline": null, "type": "BEDINFO" }, { "__typename": "MainSectionMessage", "body": "2 beds", "bodyA11yLabel": null, "bodyType": null, "fontWeight": null, "headline": null, "type": "BEDINFO" }, { "__typename": "MainSectionMessage", "body": "1 bath", "bodyA11yLabel": null, "bodyType": null, "fontWeight": null, "headline": null, "type": "BATHROOMINFO" } ], "mapSecondaryLine": [], "primaryLine": [ { "__typename": "MainSectionMessage", "body": "1 bedroom", "bodyA11yLabel": null, "bodyType": null, "fontWeight": null, "headline": null, "type": "BEDINFO" }, { "__typename": "MainSectionMessage", "body": "2 beds", "bodyA11yLabel": null, "bodyType": null, "fontWeight": null, "headline": null, "type": "BEDINFO" }, { "__typename": "MainSectionMessage", "body": "1 bath", "bodyA11yLabel": null, "bodyType": null, "fontWeight": null, "headline": null, "type": "BATHROOMINFO" } ], "secondaryLine": [ { "__typename": "MainSectionMessage", "body": "Individual host", "bodyA11yLabel": null, "bodyType": null, "fontWeight": null, "headline": null, "type": "HOSTINFO" } ], "tertiaryLine": [], "reviewSnippet": null, "explanation": [] }, "passportData": null, "demandStayListing": { "__typename": "DemandStayListing", "id": "RGVtYW5kU3RheUxpc3Rpbmc6MjA2NzkyMDM=", "location": { "__typename": "DemandStayListingLocation", "coordinate": { "__typename": "Coordinate", "latitude": 38.7126, "longitude": -9.1462 } }, "description": { "__typename": "DemandStayListingDescription", "name": { "__typename": "UGCText", "localizedStringWithTranslationPreference": "Music Apartment in the heart of Bairro Alto!" } }, "wishlistItems": [], "nameLocale": "en" }, "priceBreakdownMessages": [] } }, { "id": "17568523", "name": "Apartment in Quinta da Lagoalva de Cima", "rating": "4.74 (419)", "rating_label": "4.74 out of 5 average rating, 419 reviews", "price": "€233 total", "coordinate": { "lat": 38.7135, "lng": -9.1305 }, "badges": [ "Guest favorite" ], "subtitle": "Lisbon Chandeliers Apartment", "raw": { "__typename": "StaySearchResult", "avgRatingA11yLabel": "4.74 out of 5 average rating, 419 reviews", "avgRatingLocalized": "4.74 (419)", "listingParamOverrides": { "__typename": "ExploreListingParamOverrides", "adults": null, "categoryTag": null, "causeId": null, "checkin": null, "checkout": null, "children": null, "distanceInKm": null, "highlightType": null, "infants": null, "pets": null, "photoId": "276383960", "relaxedAmenityIds": [], "splitStaysLocationPrecisions": [], "splitStaysLocationsAcpIds": [], "splitStaysUuid": null, "amenities": null }, "structuredDisplayPrice": { "__typename": "StructuredDisplayPrice", "primaryLine": { "__typename": "QualifiedDisplayPriceLine", "accessibilityLabel": "€233 total", "price": "€233", "qualifier": "total", "concatQualifierLeft": false, "trailing": null }, "secondaryLine": null, "explanationData": { "__typename": "DisplayPriceExplanationData", "title": "Price details", "subtitle": null, "priceDetails": [ { "__typename": "DisplayPriceExplanationLineGroup", "items": [ { "__typename": "DefaultExplanationLineItem", "description": "2 nights x €108.04", "priceString": "€216.08", "explanationData": null }, { "__typename": "DefaultExplanationLineItem", "description": "Taxes", "priceString": "€16.00", "explanationData": null } ], "renderBorderTop": false, "collapsable": null }, { "__typename": "DisplayPriceExplanationLineGroup", "items": [ { "__typename": "HighlightExplanationLineItem", "description": "Total", "priceString": "€232.08", "explanationData": null, "originalPriceString": null, "accessibilityLabel": "€232.08 total" } ], "renderBorderTop": true, "collapsable": null } ] }, "explanationDataDisplayPosition": "PRIMARY_LINE", "displayPriceStyle": "REGULATED_TOTAL", "loggingMetadata": { "__typename": "StructuredDisplayPriceLoggingMetadata", "loggingCorrelationId": "0c0dee69-9957-44d5-b627-babbd2335a17" } }, "badges": [ { "__typename": "ExploreFormattedBadge", "icon": null, "loggingContext": { "__typename": "ExploreFormattedBadgeLoggingContext", "badgeType": "GUEST_FAVORITE" }, "style": "LOUD_ROUNDED_PILL", "text": "Guest favorite", "textAccessibilityLabel": "Guest favorite", "textColor": "#000000" } ], "contextualPictures": [ { "__typename": "ExplorePicture", "caption": null, "dominantSaturatedColor": null, "id": "276383960", "largeRo": null, "originalPicture": null, "picture": "https://a0.muscache.com/im/pictures/c66f066f-7601-44d2-9702-9a9f7ee25912.jpg", "previewEncodedPng": null, "saturatedA11yDarkColor": null, "scrimColor": null, "xlPicture": null }, { "__typename": "ExplorePicture", "caption": null, "dominantSaturatedColor": null, "id": "410753827", "largeRo": null, "originalPicture": null, "picture": "https://a0.muscache.com/im/pictures/71edfb19-00c4-432d-a8ae-25f23d76083f.jpg", "previewEncodedPng": null, "saturatedA11yDarkColor": null, "scrimColor": null, "xlPicture": null }, { "__typename": "ExplorePicture", "caption": null, "dominantSaturatedColor": null, "id": "276383699", "largeRo": null, "originalPicture": null, "picture": "https://a0.muscache.com/im/pictures/05636891-0380-4bc5-9d7d-2f116c4035a2.jpg", "previewEncodedPng": null, "saturatedA11yDarkColor": null, "scrimColor": null, "xlPicture": null } ], "paymentMessages": [ { "__typename": "PaymentMessage", "text": "Pay €0 today", "type": "PAY_ZERO_UPFRONT_HIGHLIGHT", "displayType": "GREY_PILL" }, { "__typename": "PaymentMessage", "text": "Free cancellation", "type": "FREE_CANCELLATION_HIGHLIGHT", "displayType": "GREY_PILL" } ], "title": "Apartment in Quinta da Lagoalva de Cima", "subtitle": "Lisbon Chandeliers Apartment", "nameLocalized": { "__typename": "UGCText", "localizedStringWithTranslationPreference": "Lisbon Chandeliers Apartment" }, "propertyId": null, "structuredContent": { "__typename": "ExploreStructuredContent", "distance": [], "mapCategoryInfo": null, "mapPrimaryLine": [ { "__typename": "MainSectionMessage", "body": "2 bedrooms", "bodyA11yLabel": null, "bodyType": null, "fontWeight": null, "headline": null, "type": "BEDINFO" }, { "__typename": "MainSectionMessage", "body": "3 beds", "bodyA11yLabel": null, "bodyType": null, "fontWeight": null, "headline": null, "type": "BEDINFO" }, { "__typename": "MainSectionMessage", "body": "1 bath", "bodyA11yLabel": null, "bodyType": null, "fontWeight": null, "headline": null, "type": "BATHROOMINFO" } ], "mapSecondaryLine": [], "primaryLine": [ { "__typename": "MainSectionMessage", "body": "2 bedrooms", "bodyA11yLabel": null, "bodyType": null, "fontWeight": null, "headline": null, "type": "BEDINFO" }, { "__typename": "MainSectionMessage", "body": "3 beds", "bodyA11yLabel": null, "bodyType": null, "fontWeight": null, "headline": null, "type": "BEDINFO" }, { "__typename": "MainSectionMessage", "body": "1 bath", "bodyA11yLabel": null, "bodyType": null, "fontWeight": null, "headline": null, "type": "BATHROOMINFO" } ], "secondaryLine": [ { "__typename": "MainSectionMessage", "body": "Business host", "bodyA11yLabel": null, "bodyType": null, "fontWeight": null, "headline": null, "type": "HOSTINFO" } ], "tertiaryLine": [], "reviewSnippet": null, "explanation": [] }, "passportData": null, "demandStayListing": { "__typename": "DemandStayListing", "id": "RGVtYW5kU3RheUxpc3Rpbmc6MTc1Njg1MjM=", "location": { "__typename": "DemandStayListingLocation", "coordinate": { "__typename": "Coordinate", "latitude": 38.7135, "longitude": -9.1305 } }, "description": { "__typename": "DemandStayListingDescription", "name": { "__typename": "UGCText", "localizedStringWithTranslationPreference": "Lisbon Chandeliers Apartment" } }, "wishlistItems": [], "nameLocale": "en" }, "priceBreakdownMessages": [] } } ], "raw_count": 44, "unique_count": 26, "pagination": { "cursor_count": 15, "cursors": [ { "cursor": "eyJzZWN0aW9uX29mZnNldCI6MCwiaXRlbXNfb2Zmc2V0IjowLCJ2ZXJzaW9uIjoxfQ==", "items_offset": 0 }, { "cursor": "eyJzZWN0aW9uX29mZnNldCI6MCwiaXRlbXNfb2Zmc2V0IjoxOCwidmVyc2lvbiI6MX0=", "items_offset": 18 }, { "cursor": "eyJzZWN0aW9uX29mZnNldCI6MCwiaXRlbXNfb2Zmc2V0IjozNiwidmVyc2lvbiI6MX0=", "items_offset": 36 } ], "deduped": true } } }
How the Airbnb API works
Airbnb is a normal ReefAPI surface — the same four rules that hold for every other engine on the key.
No OAuth app, no request signing, no per-site account. One key covers all 185 engines.
Every route is a POST with a JSON body. Parameters are validated against the published schema before anything is charged.
Credits, not seats. Failed and blocked calls are never charged, and cache hits cost nothing.
One envelope everywhere. meta carries latency_ms, record_count and the endpoint that answered.
Price the dates, then check the calendar before you trust the price
The search gives you a total for the window you asked about; the calendar tells you which other windows exist. Three calls, measured against Lisbon while writing this.
{"query": "Lisbon, Portugal", "checkin": "2026-09-18", "checkout": "2026-09-20", "adults": 2, "currency": "EUR"}Thirty listings in 1.4 seconds, deduped down from forty-eight raw cards. Every price came back as a stay total with the nightly rate and the tax itemised behind it — '2 nights x €154.00' plus 'Taxes €16.00' equals the €324 on the card.
{"listing_id": "19016750", "month_count": 3}Ninety-two days in one second, each marked for check-in and for check-out separately, with the minimum nights that apply. The listing the search priced showed 18 September open for check-in and 19 and 20 open for check-out — the search and the calendar agreed.
{"listing_id": "19016750", "currency": "EUR"}Property type, guest capacity and the six category sub-ratings as separate numbers — accuracy 4.72, check-in 4.81, cleanliness 4.82, communication 4.90, location 4.67, value 4.51 — plus the full amenity list grouped by room and every photo URL.
A dated price you can defend, the calendar that says which other dates would have been cheaper, and the listing detail that says what you would actually be booking.
curl -X POST https://api.reefapi.com/airbnb/v1/stays.search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"query":"Istanbul, Turkey","checkin":"2026-09-18","checkout":"2026-09-23","adults":2}'{
"ok": true,
"data": { … },
"meta": {
"api": "airbnb",
"endpoint": "stays.search",
"mode": "live",
"latency_ms": …,
"record_count": …
},
"error": null
}Airbnb listing ids, and why price and rating arrive as strings
Airbnb publishes its search cards as rendered text, so several fields that look numeric are strings you have to parse. Listing ids also come in two very different lengths depending on when the listing was created. All values below were measured on 2026-08-27 on a Lisbon search for 2026-09-16 to 2026-09-21, two adults, currency USD.
| Field | Measured example | What it means |
|---|---|---|
| listing_id, legacy | 8096741, 2684458, 29330369 | Seven or eight digits. Older listings. |
| listing_id, modern | 1476784482714562767 | Eighteen or nineteen digits. Both forms are accepted by every action. |
| items[].price | "$1,194 total, originally $1,293" | A string. "total" means the whole stay including taxes, not a nightly rate. |
| items[].rating | "5.0 (279)" | A string: score out of 5, then the review count in parentheses. Two decimals appear too, such as "4.84 (408)". |
| items[].badges | ["Guest favorite"], ["Superhost"], [] | An empty array is normal and means neither badge applies. |
| parsed.room_type | "Entire home/apt" | A display value. The search filter takes entire_home, private_room, shared_room or hotel_room instead. |
| parsed.property_type | "Entire loft" | Free text, more specific than room_type. |
| parsed.ratings.review_count | "408" | Also a string, while parsed.ratings.overall (4.84) is a number. |
| ratings sub-scores | accuracy 4.9, checkin 4.96, cleanliness 4.92, communication 4.97, location 4.41, value 4.65 | Six categories, each out of 5. |
| coordinate lat / lng | 38.7177 / -9.1342 | Four decimals. Airbnb publishes an approximate pin, not the street address. |
| calendar day | available, availableForCheckin, availableForCheckout, bookable, minNights, maxNights | availableForCheckin and availableForCheckout differ on the same day; minNights varied between 1 and 3 within two months. |
| raw_count vs unique_count | 48 vs 30 | Airbnb repeats cards across page sections. unique_count is the figure after de-duplication. |
Search cards carry a raw block per listing and stays.detail returns both parsed and raw, so a single 30-item search response measured 959 KB and one detail call 532 KB. Read from items[] and parsed, and ignore raw unless you need something not surfaced there.
What the total means, what happens when you forget the dates, and what the host action does not return
Measured on 2026-08-28 against Lisbon, two date windows, two occupancies and two currencies. Three of these lines go against us.
Against us, and it is the single most expensive thing to get wrong here. Run the search with no checkin and no checkout and it does not fail and does not warn: it returns thirty rows with confident totals, and every one of them prices a FIVE-NIGHT stay. We read the itemised breakdown to catch it — every row said '5 nights x …'. The identical search with two real dates said '2 nights x …' on every row. There is no flag in the response that tells you which of those you are holding. Always send both dates.
A €324 card resolves to '2 nights x €154.00' equals €308.00, plus 'Taxes €16.00'. The nightly rate, the night count, the tax line and any discount are all separate values in the breakdown, so you never have to infer a per-night price by dividing. Rows that carry a strike-through show it as 'total, originally' with both numbers present.
Two adults against six on the identical dates in the identical city returned ZERO listings in common out of thirty each. This is not a hotel search where the same room costs more for more people — a different number of guests is a different inventory. Any price series you build has to hold the guest count fixed.
September against November, same city and occupancy: three of thirty listings appeared in both, and all three fell — €496 to €209, €343 to €232, €416 to €159. The date is doing most of the work in the number, which is exactly why a dateless call is dangerous rather than merely imprecise.
Two identical searches minutes apart shared fourteen of thirty listings, and every one of those fourteen came back at the identical price. The other sixteen were rotation, not repricing — the source reshuffles which listings make the first page far more aggressively than it moves their prices. Key on the listing id and expect the set, not the price, to move.
EUR against USD on the same search: twenty-eight of thirty listings appeared in both and every one was converted rather than relabelled — €1,083 became $1,263, €177 became $206, €255 became $298. One call, one currency, whole response.
Asking for three months returned ninety-two days, each with availability for check-in and for check-out as separate booleans and its own minimum and maximum nights — and the price field was null on all ninety-two. The calendar answers WHEN, and the search answers HOW MUCH; you need both, and the response tells you its own ceiling in a caps block reading twelve months.
Against us. host.profile answered ok on three different listings and every one came back with the name null, the superhost flag false, and the highlights and details arrays empty — while the listing's own detail record said that same host WAS a superhost. Do not build on it. The identity that does come back is inside the review rows, which carry both parties to each stay; the listing itself — its rating, its capacity, its amenities, its calendar — is the durable part of this engine and the part these pages are about.
A search returns a next_cursor plus a cursor_count — fifteen more pages on the Lisbon query — and reports the raw card count alongside the deduped one, forty-eight down to thirty on our run. Reviews page on a plain offset instead, up to fifty a call, with the cursor being simply the next offset.
Public listings, public prices for dates you name, public availability and public reviews. Not a booking, not a message to a host, nothing behind a login of yours — there is no Airbnb account in the path and therefore no account of yours that can be rate-limited or suspended for reading. What you send is a ReefAPI key.
What people build with Airbnb
The jobs this data is most often used for.
endpoints
credits per call
Pricing and revenue tools call stays.search to track nightly rates and availability in a market.
Short-term-rental analytics use stays.reviews and host.profile to study top hosts and guest sentiment.
Travel apps use stays.detail and the availability_calendar to show live listings and open dates.
What Airbnb data costs
The cheapest call here is 1 credit, so $15/mo (Pro) buys 10,000 of them — $1.50 per 1,000 credits. Credits roll over and never expire, and failed or blocked calls are not charged.
Full pricing →- 1,000 free credits on signup, no card
- One key, all 185 APIs, one credit pool
- Failed and blocked calls are never charged
- Credits roll over and never expire
Call it in two lines
Sign up, get 1,000 credits and one key that works on every engine. Then this is the whole protocol.
curl -X POST https://api.reefapi.com/airbnb/v1/stays.search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"query":"Istanbul, Turkey","checkin":"2026-09-18","checkout":"2026-09-23","adults":2}'import requests
r = requests.post(
"https://api.reefapi.com/airbnb/v1/stays.search",
headers={"x-api-key": REEF_KEY},
json={
"query": "Istanbul, Turkey",
"checkin": "2026-09-18",
"checkout": "2026-09-23",
"adults": 2
},
)
print(r.json()["data"])Have a question? We got answers.
The questions people actually ask before wiring up Airbnb.
Get a free key →Is the Airbnb search price the nightly rate or the total?▾
The total for the stay, and the string says so: "$1,194 total, originally $1,293". The underlying breakdown on that card read "5 nights x $249.12" = $1,245.61, a special offer of -$98.75, taxes of $46.70 and a Total of $1,193.56, with display style REGULATED_TOTAL. So the number in front of the word "total" already includes taxes and the discount. Divide by your night count if you want a nightly figure.
Why are price and rating strings instead of numbers?▾
Because that is what the search card publishes, and converting them would throw away the qualifier. price arrives as "$1,194 total, originally $1,293", or just "$898 total" when there is no discount, and rating as "5.0 (279)". Parse the currency symbol, the amount and the qualifier separately. In stays.detail, ratings.overall is a proper number (4.84) but ratings.review_count is still a string ("408").
Why do Airbnb listing ids have two completely different lengths?▾
Older listings kept short numeric ids and newer ones use long snowflake-style ids. In one Lisbon search both appeared side by side: 2684458 and 8096741 at seven digits, 29330369 at eight, and 1476784482714562767 at nineteen. Every action takes listing_id as a string and both forms work, so store it as text, never as a 32-bit or 64-bit integer column.
Which stays.detail fields come back null or empty?▾
Measured on a live listing: description, share_url, picture_count, location.city, location.address and location.where_label were all null, and rooms and house_rules were empty arrays. What is populated is title, property_type, room_type, person_capacity, is_superhost, the seven-part ratings block, coordinates, 37 amenities grouped by room, and 35 photos with captions and aspect ratios.
Can I get host details for a listing?▾
Not at the moment. On 2026-08-27 host.profile returned ok:true for three different listings and every one came back with name null, is_superhost false, is_verified false and empty highlights and details arrays, carrying only listing_id and listing_title. stays.detail has the same empty host block, and its host.is_superhost read false on a listing whose top-level is_superhost was true. Take superhost status from parsed.is_superhost or from the search card's badges array, and do not spend a call on host.profile until this is fixed.
What does the availability calendar actually give me?▾
Day rows, not prices. month_count 2 returned 61 days starting from the current month, and each day carries calendarDate, available, availableForCheckin, availableForCheckout, bookable, minNights and maxNights. On the measured listing 19 of 61 days were available, minNights varied between 1, 2 and 3, and bookable came back null for the current month and true or false for the next one. price.localPriceFormatted was null on all 61 days, so use the search card or the detail page for money.
Why is unique_count lower than raw_count?▾
Airbnb's search page renders the same listing in more than one section, so the raw page held 48 cards for 30 distinct listings. items[] is the de-duplicated set and both counters are returned so you can see how much was folded away. meta.pagination gives next_cursor plus a cursors array, 15 entries on the measured search; pass next_cursor back as cursor for the following page.
Is stays.price_checkout available?▾
Not at the moment. Measured on 2026-08-27 it returned ok:false with error.code DISABLED and retryable:false, and meta.scope ENDPOINT_DISABLED, in about two milliseconds. It fails fast rather than hanging, so retrying will not help. The search card's total for your exact checkin and checkout dates is the closest live substitute.
What is the Airbnb API?▾
Airbnb API is a ReefAPI endpoint group for search stays, get listing details, reviews and availability. It returns live JSON through POST requests under /airbnb/v1.
Is the Airbnb API free to try?▾
Yes. ReefAPI starts with 1,000 free credits, no card required. Airbnb calls use the same shared credit balance as every other ReefAPI engine.
Do I need an Airbnb login or account?▾
No login to Airbnb is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.
How fresh is the Airbnb data?▾
The page example is captured from a live stays.search call, and production requests fetch live data through ReefAPI rather than a static sample.
How many credits does the Airbnb API use?▾
Airbnb actions currently cost 1-3 credits per successful call. Failed or blocked calls are free, and all APIs draw from one credit pool.
Can I call Airbnb from an AI assistant or MCP client?▾
Yes. Connect ReefAPI once through MCP and your assistant can call airbnb actions with the same key, credit pool and JSON envelope used by normal REST requests.
8 Travel & Lodging APIs on the same key
One key, one credit pool, one response envelope. If you are pulling Airbnb, you are one call away from the rest of the category — no second contract, no second integration.
Need something this API does not do?
Name the endpoint, the field, or a source we do not carry yet. We ship new APIs every week and you would be first to get the key. Real people read every message and reply the same day.
Try it on your own data before you pay anything
The call above is the real endpoint, not a recording. A free key gives you 1,000 credits, the other 184 APIs, and the same envelope everywhere.
Endpoints, parameters and credit costs on this page are read from the live catalog and cannot drift from what the API accepts. Field notes were captured on 2026-08-28.