Airbnb API

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.

no credit card1,000 free credits · instant API key · live in 10 seconds
Missing a Airbnb endpoint, or need a source we don't have yet?Contact us real people · same-day reply.
A
/airbnb/v1

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.

8 endpoints

stays.search

2 cr

Search Airbnb stays by location and dates with full filters.

required
query
optional
checkin, checkout, adults, children, infants, price_min, price_max, room_type, property_type, min_bedrooms, min_beds, min_bathrooms, amenities, host_languages, instant_book, superhost, free_cancellation, pets_allowed, cursor, currency, locale

stays.detail

3 cr

Full listing details.

required
listing_id
optional
currency, locale

host.profile

1 cr

Host profile for a listing.

required
listing_id
optional

stays.reviews

1 cr

Listing reviews, paginated via offset/limit.

required
listing_id
optional
offset, limit, locale

stays.availability_calendar

2 cr

Availability calendar for a listing (up to 12 months ahead).

required
listing_id
optional

properties.search

2 cr

Alias of stays.search.

required
query
optional
checkin, checkout, adults, cursor, currency, locale

properties.detail

3 cr

Alias of stays.detail.

required
listing_id
optional
currency, locale

autocomplete

1 cr

Location autocomplete suggestions (raw passthrough).

required
optional

Every parameter, every allowed value →

Airbnb API

3 of 8 endpoints, ready to run

View docs ↗

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.

2 credits1 required · 11 optional
POST/airbnb/v1/stays.search
ok1375 ms · 26 records · sample
{
  "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
    }
  }
}
Real response, fetched from the live endpoint with the parameters on the left — trimmed to the first few rows, with seller names left out. Press Try it for the untrimmed response.

How the Airbnb API works

Airbnb is a normal ReefAPI surface — the same four rules that hold for every other engine on the key.

01
Authenticate
x-api-key header

No OAuth app, no request signing, no per-site account. One key covers all 185 engines.

02
Call
POST /airbnb/v1/…

Every route is a POST with a JSON body. Parameters are validated against the published schema before anything is charged.

03
Pay
1 or 2 or 3 credits per call

Credits, not seats. Failed and blocked calls are never charged, and cache hits cost nothing.

04
Read
{ ok, data, meta, error }

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.

01stays.search
POST/airbnb/v1/stays.search
{"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.

02stays.availability_calendar
POST/airbnb/v1/stays.availability_calendar
{"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.

03stays.detail
POST/airbnb/v1/stays.detail
{"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.

request
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}'
response envelope
{
  "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.

FieldMeasured exampleWhat it means
listing_id, legacy8096741, 2684458, 29330369Seven or eight digits. Older listings.
listing_id, modern1476784482714562767Eighteen 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-scoresaccuracy 4.9, checkin 4.96, cleanliness 4.92, communication 4.97, location 4.41, value 4.65Six categories, each out of 5.
coordinate lat / lng38.7177 / -9.1342Four decimals. Airbnb publishes an approximate pin, not the street address.
calendar dayavailable, availableForCheckin, availableForCheckout, bookable, minNights, maxNightsavailableForCheckin and availableForCheckout differ on the same day; minNights varied between 1 and 3 within two months.
raw_count vs unique_count48 vs 30Airbnb 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.

🔴🔴 A dateless search still prints a total — for a stay the source chose

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.

The tax is inside the total and itemised right next to it

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.

Occupancy is a hard filter, not a price adjustment

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.

Two months apart, the price roughly halves

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.

Ask twice and the prices hold, but the page turns over

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.

Currency converts at the source, on almost every row

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.

The calendar is twelve months of availability with no prices in it

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.

🔴 The host action returns an empty host

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.

Paging is a cursor, and the response tells you how many are left

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.

What comes back, and what does not

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.

8

endpoints

1/2/3

credits per call

01

Pricing and revenue tools call stays.search to track nightly rates and availability in a market.

02

Short-term-rental analytics use stays.reviews and host.profile to study top hosts and guest sentiment.

03

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 →
$0.67–$1.50 / 1,000 credits
  • 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
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}'
python
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"])
FAQ

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.

0/4000

No account needed · we reply from [email protected]

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.