Airbnb APIairbnb.com ↗
Search Airbnb stays, fetch listing details, retrieve availability calendars, and pull guest reviews via a structured JSON API. 5 endpoints.
What is the Airbnb API?
This API covers 5 endpoints for querying Airbnb stay data: search listings by destination with date and guest filters via search_listings, retrieve full listing details including amenities, host profile, and cancellation policy via get_listing_detail, and pull per-day availability across up to 12 months via get_availability_calendar. Responses include coordinates, structured pricing, review summaries, and host metadata.
curl -X POST 'https://api.parse.bot/scraper/ebfc2570-a5db-4d9b-9105-c3439a6586fb/search_listings' \
-H 'X-API-Key: $PARSE_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"query": "Paris, France",
"adults": "2",
"checkin": "2026-10-16",
"checkout": "2026-10-21",
"currency": "EUR",
"property_type": "hotel",
"items_per_page": "18"
}'Full-text location search across Airbnb stay listings. Returns one page of listing summaries (up to items_per_page) with pricing, ratings, images, coordinates and derived attributes. Each listing carries the original display strings (rating, price.total, features) plus typed fields: rating_value (number, null when the listing has no rating yet), review_count (integer), lat/lng, room_type ('entire home', 'private room', 'shared room' or 'hotel room', derived from Airbnb's '<type> in <place>' card label), location_label (the place named in that label - a city, or a neighbourhood when Airbnb shows one; null when the card has no such label), bedrooms/beds/bathrooms parsed from the feature line (null when the feature line omits them, e.g. hotel cards), badges (list of card badges such as 'Guest favorite', 'Superhost', 'Featured hotel'), host_is_superhost (true only when the card shows the Superhost badge; Airbnb shows at most one badge per card, so a superhost whose card shows 'Guest favorite' reads false), total_price and nightly_price as numbers in the requested currency, nights, and image_url (first photo). Guest capacity (max_guests) is not part of Airbnb's search result and is not returned; use get_listing_detail. The envelope also carries currency (the requested currency code), nights (checkout minus checkin when both are given, otherwise the stay length Airbnb priced the page with, or null) and price_context with min/median/max nightly_price and sample_size across the returned page only. min_rating is applied by Airbnb server-side (its minimum review score filter); ratings are displayed rounded so a listing shown as 4.89 can pass a 4.9 threshold. Pagination uses an opaque cursor: pass next_cursor back as cursor; has_next_page is false on the last page. Server-side ordering is fixed (Airbnb relevance).
| Param | Type | Description |
|---|---|---|
| pets | integer | Number of pets |
| queryrequired | string | Search location (e.g. 'Paris, France', 'New York', 'Tokyo') |
| adults | integer | Number of adults |
| cursor | string | Pagination cursor from next_cursor of a previous response |
| checkin | string | Check-in date in YYYY-MM-DD format |
| infants | integer | Number of infants |
| checkout | string | Check-out date in YYYY-MM-DD format |
| children | integer | Number of children |
| currency | string | Currency code for pricing (e.g. USD, EUR, GBP) |
| min_beds | integer | Minimum number of beds |
| max_price | integer | Maximum price filter |
| min_price | integer | Minimum price filter |
| min_rating | number | Minimum average guest rating, 0-5 (e.g. 4.9). Passed to Airbnb's own minimum-review-score filter; values outside 0-5 are rejected. |
| min_bedrooms | integer | Minimum number of bedrooms |
| min_bathrooms | integer | Minimum number of bathrooms |
| property_type | string | Property type filter |
| items_per_page | integer | Number of results per page |
{
"type": "object",
"fields": {
"count": "integer - number of listings returned in this page",
"query": "string - the search location used",
"nights": "integer or null - stay length the prices cover: checkout minus checkin when both were given, otherwise the length Airbnb priced the page with",
"filters": "object echoing the applied filters (checkin, checkout, adults, currency, min_rating)",
"currency": "string - ISO currency code all numeric prices in this response are expressed in (the requested currency)",
"listings": "array of listing summary objects: listing_id, url, title, subtitle, name, rating (display string), rating_value (number or null), review_count (integer or null), room_type, location_label, coordinates, lat, lng, price (display strings), price_details, currency, total_price (number), nightly_price (number), nights, images, image_url, features, bedrooms, beds, bathrooms (numbers or null), dates, badges (list of strings), host_is_superhost (boolean), payment_messages, host (when present), param_overrides",
"next_cursor": "string or null - opaque cursor for next page",
"has_next_page": "boolean - whether more pages exist",
"price_context": "object with min, median, max (numbers, nightly_price across the returned page, null when no listing had a nightly price) and sample_size (integer, listings that contributed)"
},
"sample": {
"data": {
"count": 18,
"query": "Lisbon, Portugal",
"nights": 5,
"filters": {
"adults": null,
"checkin": null,
"checkout": null,
"currency": "EUR",
"min_rating": null
},
"currency": "EUR",
"listings": [
{
"lat": 38.7102,
"lng": -9.1312,
"url": "https://www.airbnb.com/rooms/1373174229965723254",
"beds": 4,
"name": "Historical Center - Tagus View",
"dates": [
"Jan 16 – 21"
],
"price": {
"total": "€1,320",
"original": null,
"qualifier": "for 5 nights",
"accessibility_label": "€1,320 for 5 nights"
},
"title": "Apartment in Lisbon",
"badges": [
"Guest favorite"
],
"images": [
{
"id": "2122172763",
"url": "https://a0.muscache.com/im/pictures/hosting/Hosting-U3RheVN1cHBseUxpc3Rpbmc6MTM3MzE3NDIyOTk2NTcyMzI1NA==/original/cca54fef-0ad9-4755-919c-f213290ec3af.jpeg",
"caption": null
}
],
"nights": 5,
"rating": "4.89 (99)",
"bedrooms": 3,
"currency": "EUR",
"features": [
"3 bedrooms",
"4 beds"
],
"subtitle": "Historical Center - Tagus View",
"bathrooms": null,
"image_url": "https://a0.muscache.com/im/pictures/hosting/Hosting-U3RheVN1cHBseUxpc3Rpbmc6MTM3MzE3NDIyOTk2NTcyMzI1NA==/original/cca54fef-0ad9-4755-919c-f213290ec3af.jpeg",
"room_type": "entire home",
"listing_id": "1373174229965723254",
"coordinates": {
"latitude": 38.7102,
"longitude": -9.1312
},
"total_price": 1320,
"rating_label": "4.89 out of 5 average rating, 99 reviews",
"rating_value": 4.89,
"review_count": 99,
"nightly_price": 264,
"price_details": [
{
"price": "€1,320.00",
"description": "5 nights x €264.00",
"original_price": null
}
],
"location_label": "Lisbon",
"param_overrides": {
"adults": 1,
"checkin": "2027-01-16",
"checkout": "2027-01-21"
},
"payment_messages": [
"Free cancellation"
],
"host_is_superhost": false
}
],
"next_cursor": "eyJzZWN0aW9uX29mZnNldCI6MCwiaXRlbXNfb2Zmc2V0IjoxOCwidmVyc2lvbiI6MX0=",
"has_next_page": true,
"price_context": {
"max": 504,
"min": 78.74,
"median": 235.4,
"sample_size": 18
}
},
"status": "success"
}
}About the Airbnb API
Search and Listing Detail
search_listings accepts a free-text query (e.g. "Paris, France") plus optional checkin/checkout dates, guest counts broken down by adults, children, infants, and pets, and returns an array of listing summaries with pricing, ratings, images, and coordinates. Pagination is cursor-based: consume next_cursor from one response and pass it as cursor on the next call; has_next_page tells you whether to continue. get_listing_detail deepens any result: given a listing_id, it returns the full listing name, description, a structured capacity object (guests, bedrooms, beds, bathrooms), a location object with latitude/longitude, a flat amenities array with available flags and optional category, and a policies object covering house_rules, safety_and_property, and cancellation_policy.
Reviews and Availability
get_listing_reviews uses offset-based pagination (offset + limit) against a specific listing_id. Each review object carries rating, comments, language, created_at, a reviewer sub-object, and an optional host_response. A has_more boolean drives continuation. get_availability_calendar maps out day-level availability for 1–12 months starting from a given month/year. Each day entry exposes available, min_nights, max_nights, and a formatted price, letting you scan for bookable windows without hitting the listing detail endpoint repeatedly.
Wishlists
get_wishlist takes a wishlist_id and share_token (both found in an Airbnb wishlist invite URL) and returns the wishlist name, total_count, and an array of listing summaries with the same coordinate, rating, and capacity fields as search results. Date and currency parameters can be passed to include context-specific pricing in the response.
The Airbnb API is a managed, monitored endpoint for airbnb.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when airbnb.com changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official airbnb.com API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Build a price-comparison tool for short-term rentals using
search_listingsprice and rating fields across multiple destinations. - Generate a listing intelligence report by combining
get_listing_detailamenities and cancellation policy withget_listing_reviewssentiment. - Track nightly price fluctuations over time using
get_availability_calendarday-level price fields. - Find available weekend windows for a listing without checking each date manually via
get_availability_calendaravailableflags. - Sync a shared trip wishlist to an internal planner app using
get_wishlistlisting coordinates and capacity data. - Analyze host quality signals by aggregating
superhoststatus,years_hosting, andratingfields fromget_listing_detail. - Filter family-friendly listings by passing
childrenandinfantsguest counts intosearch_listingsand checkingcapacity.bedrooms.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 200 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
| Team | $300/mo | 20,000 | 300 req/min |
| Company | $1,000/mo | 100,000 | 500 req/min |
Each endpoint has a fixed posted price per successful call — most fall between 1 and 10 credits — shown on this API's page before you run it. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does Airbnb have an official developer API?+
What does `get_listing_detail` return beyond what `search_listings` provides?+
search_listings returns summary-level data: price, rating, a few images, and coordinates. get_listing_detail adds the full amenities array with per-amenity available flags and categories, the policies object (house rules, safety info, cancellation policy), a complete host profile with years_hosting and reviews_count, and a highlights array. It requires a listing_id from a prior search or wishlist call.How does pagination work across endpoints?+
search_listings uses cursor-based pagination: the response includes a next_cursor string and a has_next_page boolean. Pass next_cursor as the cursor parameter on the next call. get_listing_reviews uses offset-based pagination: increment offset by your limit value and check has_more to continue. The two schemes are not interchangeable.