Airbnb Scraper: Occupancy Rate, Availability & Prices Β· Apify
Airbnb Scraper: Listings, Occupancy Rate, Availability & Prices avatar

Airbnb Scraper: Listings, Occupancy Rate, Availability & Prices

Pricing

from $0.75 / 1,000 listings

Go to Apify Store
Airbnb Scraper: Listings, Occupancy Rate, Availability & Prices

Airbnb Scraper: Listings, Occupancy Rate, Availability & Prices

Scrape Airbnb listings, prices, reviews, ratings and availability calendars with occupancy for any city or listing URL. Get the nightly rate and stay total as numbers, six rating categories, host, amenities and photos: 99 fields per short-term rental. Calendar included; failed listings are free.

Pricing

from $0.75 / 1,000 listings

Rating

5.0

(1)

Developer

CodePoetry

CodePoetry

Maintained by Community

Actor stats

2

Bookmarked

31

Total users

13

Monthly active users

6 hours ago

Last modified

Features

Limited permissions

Share

Airbnb Scraper API: Listings, Prices, Reviews & Calendar

Airbnb listings with the price for your dates, an occupancy rate and guest reviews, in one run.

The three most-used Airbnb listing scrapers on the Apify Store each miss at least one of these. This one returns all three:

  • An occupancy rate for every listing, computed from up to 12 months of its calendar. The others don't compute one.
  • The stay price as numbers (price_per_night, total_price) you can sort and average. Two of the others return text such as "$318".
  • Guest reviews in the same run. Two of the others sell reviews as a separate actor.

It also costs at least 25% less per listing than the most-used Airbnb scraper, on every Apify plan: $1.50 against $2.00 per 1,000 on Starter, calendar included. Search pages and failed listings are free. See how it compares.

Give it a city, a region or room URLs, and export to JSON, CSV or Excel, or read the results over the API. You need no Airbnb account and no API key.

Run this Actor now


Quick start: scrape Airbnb without an API key

  1. Click Try for free. Locations to search is pre-filled with Paris, France.
  2. Set Check-in and Check-out so every listing is priced for that stay.
  3. Click Start. The default run returns 20 full listings in about 22 seconds (measured 2 Sep 2026), for $0.06 on the Free plan.
  4. Open the Listings tab of the dataset, or export it to JSON, CSV or Excel.

Want more? Raise How many listings, add cities to Locations to search, or turn on Include guest reviews. Already know the properties? Paste room URLs into start_urls instead. For a fast sweep of a whole market, set mode to search. Results appear in the dataset while the run is still going.

Ready-made example tasks

Each opens a copy you can run as is or edit:

What else you get

  • Every review once. Reviews are paged newest first, so each comes back exactly once. Paging Airbnb's default order by offset returned a 373-review listing as 322 distinct reviews, with duplicates and gaps.
  • You pay for data you can use. Search pages are free, failed listings are free and say what went wrong, and a maximum cost per run is respected.
  • All six rating categories. Accuracy, check-in, cleanliness, communication, location and value, plus the share of 5 to 1 star reviews.
  • Airbnb as other countries see it. Browse from 23 markets, in 18 languages, with prices in 28 currencies, each checked against Airbnb.
  • A stable shape. A field Airbnb leaves out is null, never dropped, and coordinates say whether they are the exact spot or Airbnb's privacy circle.

Measured on real runs

Each figure comes from one of our own runs, on the date shown.

WhatMeasuredWhen
Currencies28, each run against Airbnb and returning that currency2 Sep 2026
Languages18, each run and returned translated2 Sep 2026
Default run20 full listings, 22 seconds2 Sep 2026
Listings priced for a set stay20 of 20 in Paris, 5 nights in July 202720 Oct 2026
Billing3 listings and 6 reviews delivered, 3 and 6 charged20 Oct 2026

How it compares

What you getThis scraperThe three most-used alternatives
Price for your dates as numbers you can sortYes, nightly and total1 of 3; the others return text such as "$318"
Availability calendarYes, up to 12 months, in the listing price2 of 3
Occupancy rate, computed for youYesNone of them
All six rating categoriesYesAll three
Share of 5 to 1 star reviewsYesNone of them
Guest reviews in the same runYes1 of 3; two sell reviews as a separate actor

Tested side by side on 10 Nov 2026: the same search in all four scrapers, 3 listings in Porto for 2 adults, 15 to 20 March 2027.

Who uses Airbnb data, and for what

Property managers and hosts track what comparable listings nearby charge for the same nights, and how their occupancy compares. The price for a set stay and the availability calendar together show what a market books at.

Real estate investors screen neighbourhoods before buying by pulling every listing in an area with occupancy rates and nightly rates attached.

Travel and booking sites build inventory feeds, comparing Airbnb prices against their own.

Researchers and journalists study short-term rental density in cities considering regulation, using coordinates, licence numbers and host portfolios.

Anyone doing due diligence on a host can pull their full portfolio through start_urls and check ratings, response rates and review history across properties.

What Airbnb data can you extract?

Every full-detail record carries 99 fields, in eleven groups:

GroupFields
Identityid, url, name, title, subtitle, description, description language, SEO title, thumbnail, images
Locationlatitude, longitude, coordinates, city, country, neighbourhood, location descriptions, and whether the coordinates are the exact spot rather than Airbnb's privacy circle
Capacityperson capacity, bedrooms, beds, bathrooms, room type, property type, home tier
Priceprice_per_night and total_price as numbers, currency, original and discounted price, nights, the check-in and check-out they were quoted for, and the price label and breakdown Airbnb shows. Airbnb quotes all-in prices and no longer itemises cleaning or service fees, so neither does this
Ratingsguest satisfaction overall, plus accuracy, check-in, cleanliness, communication, location and value, and the share of 5 to 1 star reviews
Hostname, id, profile URL, photo, superhost and verified status, years hosting, response rate and time, rating average and count, highlights, about (co-hosts are a separate top-level field)
Amenitiesthe complete list by category, plus direct flags for wifi, air conditioning, heating, kitchen, parking, washer, TV, pool, dedicated workspace and pets
Reviewsreviewer, date, rating, review text, language, highlights and the host response, up to a limit you set
Availabilityday by day calendar, minimum and maximum nights, and from today on: days total, days available, days blocked, occupancy rate and the next available date
Rules and policieshouse rules, cancellation policy, check-in and check-out times, self check-in, smoking, parties, commercial photography, licence number
Metadatainstant book, Guest Favourite, highlights, badges, scraped_at timestamp

Search mode returns what the result card carries: id, url, name, title, subtitle, thumbnail, images, latitude, longitude and coordinates, nightly rate, stay total and original price as numbers, nights, the price label and breakdown, the check_in and check_out it was quoted for, rating, review count, Superhost, badges and the scraped_at timestamp. Room type, capacity and everything else below the card are full-detail fields.

Seven views, one per question

Nobody reads 99 columns at once, so the dataset arrives in seven views. Each answers one question:

TabWhat it answers
ListingsThe whole picture: photo, name, city, type, capacity, all three prices with the stay they were quoted for, rating, review count, Guest Favourite, Superhost, occupancy and the booking terms
AvailabilityThe day-by-day calendar, minimum and maximum nights, days free, days blocked, occupancy rate and the next free date
Ratings & reviewsAll six category scores behind the star, the rating distribution, and the reviews themselves
HostHost and co-hosts, Superhost status, licence, whether the address is verified
LocationCoordinates and whether they are exact rather than Airbnb's privacy circle, address, neighbourhood, map link
Amenities & rulesThe full amenity list by category, direct flags for the ones people filter on, house rules, cancellation terms, safety features
Description & photosThe listing's own copy, highlights, sleeping arrangements, badges and every image

Export any tab to JSON, CSV or Excel. All fields shows the raw record.

Airbnb prices for your dates

Airbnb quotes by stay, so the same listing has no single price. Pass check_in, check_out and guest counts, and every record carries the price a guest would be shown for those nights, plus the check_in and check_out it was quoted for. A location search without dates prices one night about a month out. Listings fetched by start_urls are priced only when you give dates.

A price label tells you what a listing asks. "$663 for 5 nights" is a string; 663 and 132.55 are numbers you can sort, filter and average. Where a stay is discounted, the pre-discount price comes too, and available says whether the listing can be booked for those dates at all. Seven of eight listings sampled in one city could not be.

Ratings work the same way. An overall 4.9 hides whether guests marked a place down on cleanliness or on value, and six category scores tell you which.

Airbnb occupancy rate and availability calendar

Every full listing carries its day-by-day calendar for calendar_months months (3 by default, up to 12), at no extra charge. From the calendar, the scraper counts the days from today to the end of the window and reports how many are free and how many are blocked. occupancy_rate is blocked days divided by that total.

The first Porto listing in the output example, scraped on 20 Oct 2026, had 42 days left in its window, 11 free and 31 blocked, so its occupancy_rate is 0.738. Its next_available_date was 4 Nov 2026.

Airbnb does not say why a day is blocked. A blocked day is either a booking or the host closing the date, so treat the rate as an upper bound on bookings rather than a count of them. It is most useful for comparing listings and neighbourhoods measured the same way, or for tracking one listing over time on a schedule. Nightly rates alone tell you what a market advertises; rates with occupancy tell you what it books.

Output example

From a run on 20 Oct 2026: three Porto listings, 2 adults, 15 to 20 March 2027.

idnameperson_capacityprice_per_nighttotal_pricerating.guest_satisfactionnumber_of_reviewsoccupancy_rate
29480483Porto AAA - Almada Aliados Apartment2132.556634.973680.74
602831143027997558Almada Prime with Balcony - Heart of the City2119.095634.992960.62
10097660Oporto's heArt (PRIVATE PARKING)3111.025564.994730.40

The first of them as JSON, cut to the fields most people use. The All fields view of the dataset shows the whole record.

{
"id": "29480483",
"url": "https://www.airbnb.com/rooms/29480483",
"name": "Porto AAA - Almada Aliados Apartment",
"property_type": "Entire rental unit",
"person_capacity": 2,
"city": "Porto",
"check_in": "2027-03-15",
"check_out": "2027-03-20",
"nights": 5,
"price_per_night": 132.55,
"total_price": 663,
"currency": "USD",
"rating": {
"guest_satisfaction": 4.97,
"accuracy": 4.99,
"checkin": 4.98,
"cleanliness": 4.98,
"communication": 4.97,
"location": 4.98,
"value": 4.95
},
"is_guest_favorite": true,
"host": { "name": "Teresa", "is_super_host": true, "rating_count": 1322 },
"amenities_count": 42,
"occupancy_rate": 0.7380952380952381,
"next_available_date": "2026-11-04",
"reviews": [
{ "reviewer_name": "Denise", "rating": 5, "text": "We had a wonderful stay...", "language": "en" }
],
"error": null
}

How much does the Airbnb scraper cost?

You pay only for the events below. Compute, proxies and storage are covered by the price. Prices depend on your Apify plan:

EventFree planStarterScaleBusiness and above
Listing, full detail with calendar$3.00 / 1,000$1.50 / 1,000$1.10 / 1,000$0.75 / 1,000
Search result, card only$0.50 / 1,000$0.50 / 1,000$0.50 / 1,000$0.50 / 1,000
Review$0.30 / 1,000$0.30 / 1,000$0.30 / 1,000$0.30 / 1,000
Run start$0.0001$0.0001$0.0001$0.0001
Search page walkedfreefreefreefree
Failed listingfreefreefreefree

The Free plan listing price is $3.00 per 1,000 from 22 October 2026, and $2.00 before that. The Pricing tab of this page always shows the current prices.

Some examples:

  • 1,000 full listings with a 3-month calendar, on Starter: $1.50.
  • The same 1,000 listings with 20 reviews each: $1.50 + 20,000 Γ— $0.0003 = $7.50.
  • 5,000 search cards across a country's cities in search mode: $2.50.

Reviews are the one line that depends on the properties rather than on how many you asked for. A busy listing carries a couple of hundred, so pulling all of them costs far more than the listing itself; max_reviews_per_listing caps it at 50 by default. If you are budgeting a run, this is the number to look at twice. Set a maximum cost per run in the run options and the scraper stops before it would bill past it.

Finding listings is free. Paginating a city of 240 listings takes about 14 search pages and costs nothing. A removed property, or one Airbnb refuses to serve, still comes back as a record carrying the id, the url and what happened, and that record is not billed.

Input

Search one city or many

Each location becomes its own search and all of them merge into a single dataset. Covering ten cities takes one run.

{
"location_queries": ["Porto, Portugal", "Lisbon, Portugal", "Braga, Portugal"],
"mode": "full",
"max_listings": 500
}

Set dates, guests and prices

Guest counts change both the price and which listings appear.

{
"location_queries": ["Barcelona, Spain"],
"check_in": "2027-03-15",
"check_out": "2027-03-20",
"adults": 2,
"children": 1,
"price_min": 80,
"price_max": 300
}

Scrape Airbnb from another country

Airbnb ranks results and shows prices and availability differently depending on where you browse from. A Paris search seen from France is not the same result set as the one you get from a US connection: different ordering, different totals, sometimes different listings.

proxy_country picks the country to browse from, and the scraper reads that country's own Airbnb site. 23 markets are supported:

{
"location_queries": ["Paris, France"],
"proxy_country": "FR"
}
EuropeUnited Kingdom, France, Germany, Spain, Italy, Portugal, Netherlands, Poland, Sweden, Denmark, Austria, Ireland, Greece, Turkey
AmericasUnited States, Canada, Brazil, Mexico
Asia-PacificJapan, South Korea, India, Singapore, Australia

Leave it empty and the market follows the language you chose. Set both when you want them to differ, for example an English-speaking buyer researching the French market. China and Russia are not offered: Airbnb withdrew from both, and a search from either returns nothing. Russian and Chinese are still offered as languages, and left to follow the language they browse the United States.

Scrape specific listings

Skip search entirely when you already know the properties. start_urls accepts room URLs and bare listing ids in the same list. Add check_in and check_out to price them.

{
"start_urls": [
"https://www.airbnb.com/rooms/29480483",
"https://www.airbnb.com/rooms/602831143027997558",
"10097660"
],
"check_in": "2027-03-15",
"check_out": "2027-03-20",
"mode": "full"
}

Filter what comes back

{
"location_queries": ["Lisbon, Portugal"],
"room_types": ["Entire home/apt"],
"property_types": ["Apartment", "Loft"],
"min_bedrooms": 2,
"min_bathrooms": 1,
"min_rating": 4.8
}

Scrape Airbnb reviews and the availability calendar

The calendar comes with every full listing. Reviews are opt-in and billed per review. Both arrive nested inside the listing record, so a property and its history stay together.

{
"location_queries": ["Madrid, Spain"],
"include_reviews": true,
"max_reviews_per_listing": 20,
"calendar_months": 3
}

Set max_reviews_per_listing to 0 to take every review a listing has.

All input options

OptionTypeWhat it does
location_queriesarrayLocations to search. Each becomes its own search, merged into one dataset.
start_urlsarrayRoom URLs or bare listing ids to fetch directly, skipping search. Give this or location_queries, not both.
modestringfull opens every property page. search reads results pages only.
check_in, check_outstringStay dates, so prices reflect a real booking.
adults, children, infants, petsintegerGuest counts. These change price and availability.
price_min, price_maxintegerNightly price bounds.
min_beds, min_bedrooms, min_bathroomsintegerSize filters.
room_typesarrayEntire home/apt, private room, shared room, hotel room.
property_typesarrayKeep only listings matching these property types.
min_ratingnumberDrop listings rated below this.
max_pagesintegerSearch pages to walk per location. Usually leave empty; max_listings already bounds the run.
max_listingsintegerHow many listings to return. Defaults to 20; 0 takes every listing found.
include_reviewsbooleanFetch guest reviews. Off by default; billed per review.
max_reviews_per_listingintegerReviews per property, at most. Defaults to 50; 0 fetches every one.
calendar_monthsintegerMonths of availability to pull, from today, up to 12. 0 skips the calendar.
calendar_start_month, calendar_start_yearintegerStart the calendar somewhere other than today. Defaults to the current month and year.
currencystringPrices converted to this. 28 options, each checked against Airbnb.
localestringLanguage for review dates, house rules and cancellation terms. 18 options.
proxy_countrystringCountry to browse Airbnb from. 23 markets; empty follows locale.

Use it from code

Get your API token from the Apify Console under Settings β†’ Integrations, and treat it like a password.

Python

from apify_client import ApifyClient
client = ApifyClient("YOUR_API_TOKEN")
run = client.actor("codepoetry/airbnb-scraper").call(
run_input={
"location_queries": ["Lisbon, Portugal"],
"check_in": "2027-03-15",
"check_out": "2027-03-20",
"adults": 2,
"max_listings": 50,
}
)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
if item.get("error"):
continue
print(item["name"], item["price_per_night"], item["occupancy_rate"])

JavaScript / Node.js

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });
const run = await client.actor('codepoetry/airbnb-scraper').call({
location_queries: ['Lisbon, Portugal'],
check_in: '2027-03-15',
check_out: '2027-03-20',
adults: 2,
max_listings: 50,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
for (const item of items) {
if (item.error) continue;
console.log(item.name, item.price_per_night, item.occupancy_rate);
}

n8n, Make, Zapier and plain curl work too, and AI agents can call it as a tool through Apify's MCP server. To run it on a schedule or get a webhook when a run finishes, use the Schedules and Integrations tabs on this page.

How the Airbnb scraper handles blocks and failures

A listing that cannot be fetched still comes back as a record. It carries the id and url you asked for, plus an error array explaining what happened:

{
"id": "999999999999999",
"url": "https://www.airbnb.com/rooms/999999999999999",
"error": [
{
"scope": "listing",
"type": "listing.state_missing",
"message": "the detail page carried no listing state, so every field below the search card is null"
}
]
}

The run carries on and finishes normally. One removed property does not cost you the other 499, and error records are not charged.

Problems that affect the whole run, such as a location Airbnb does not recognise, appear in the run summary.

Is there an Airbnb API?

Not a public one. Airbnb's API is closed to approved partners, such as channel managers and property-management software, and there is no key you can sign up for as a developer. Searching for an Airbnb API key, or for free Airbnb API access, turns up partner application forms.

This is the practical substitute. Give it a location and it walks Airbnb's search results, opens each property page, and returns one record per listing through a REST API you already have credentials for. There is no Airbnb login or partner application, and no rate limit to negotiate.

It runs two ways. Full detail opens every property page and returns everything above. Search mode reads only the results pages and returns the card-level fields, billed per search result. Sweep a whole market in search mode, then go deep on the properties that matter.

When another tool fits better

  • Revenue and RevPAR estimates. This returns the raw inputs, the price for a stay and the calendar, and leaves the modelling to you. It does not estimate revenue the way AirDNA or similar market-data products do.
  • Airbnb Experiences. Only stays are scraped.
  • Host emails and phone numbers. Airbnb does not publish them, and this does not try to find them.

Frequently asked questions

Do I need an Airbnb API key? No. There is no public Airbnb API to get a key for; it is restricted to approved partner integrations. This reads the same public pages a browser does, so there is nothing to apply for and no quota to negotiate.

Do I need an Airbnb account? No. The scraper reads public listing pages and needs no login or cookies.

How much does it cost to scrape 1,000 Airbnb listings? $1.50 on the Starter plan, with the price for your dates and a 3-month availability calendar on every listing. It is $3.00 on the Free plan and $0.75 on Business. Reviews, if you turn them on, add $0.30 per 1,000. Failed listings and search pages are free.

How is the occupancy rate calculated? Blocked days divided by the days from today to the end of the calendar window. Airbnb does not separate bookings from days the host closed, so the rate counts both. Set calendar_months for a longer window.

Why are prices different from what I see on Airbnb? Usually because the stay is different. Without check_in and check_out, a search prices one night about a month out and says which night on every record. Pass your own dates and guest counts and the numbers match what a guest is shown.

Can I call it from Python, n8n or an AI agent? Yes. It is an ordinary Apify Actor, so anything that can make an HTTP request can start a run and read the dataset: the Python and JavaScript clients, n8n, Make, Zapier, or plain curl. AI agents can call it as a tool through Apify's MCP server. See Use it from code for working examples.

Can I get every listing in a city? Airbnb caps how deep its own search goes, so no scraper can return literally every property from one query. Splitting a city into neighbourhoods or price bands and passing them as separate location_queries reaches more of the inventory.

How many reviews can I get? As many as a listing has, up to max_reviews_per_listing: 50 by default, or 0 for every one. Reviews add time, so cap it when you are sweeping a whole market.

What does search mode leave out? Everything that only exists on the property page: room type and capacity, the availability calendar, reviews, the full amenity list, host details and house rules. Search mode gives you the card: id, url, title, prices, rating, review count, coordinates, thumbnail and images.

Can I run this on a schedule? Yes. Schedule it like any other Actor and each run writes a fresh dataset. The scraped_at field on every record tells you which run it came from, so a weekly schedule on the same listings gives you a price and occupancy history.

Is it legal to scrape Airbnb? This reads only pages Airbnb shows to any visitor without logging in. Whether a given use is allowed depends on where you are and what you do with the data, especially the personal data in host profiles and reviews. Check with a lawyer if you are unsure.

More actors from CodePoetry

  • YouTube Transcript Scraper Pro: transcripts from videos, playlists and channels, with AI speech-to-text when a video has no captions. JSON, text, SRT, VTT or LLM-ready.
  • Markdown RAG Chunker: split PDF, Word, HTML and Markdown documents into header-aware chunks with stable IDs and exact token counts, LangChain-ready, pay per chunk.

Notes

This is an unofficial scraper. It is not affiliated with, authorised by, sponsored by or endorsed by Airbnb, and "Airbnb" is used only to say which public website it reads.

Prices, availability and ratings change constantly. A record is a snapshot at scraped_at, not a standing fact.

Review counts and calendar depth are the two settings that drive run length. A market sweep with reviews off and calendar_months at 1 finishes far quicker than the same sweep with every review and a year of availability.

Start scraping

Type a city into Locations to search, set Check-in and Check-out, and run it, or open one of the example tasks.

Run this Actor now