Airbnb Scraper API: Listings, Prices, Reviews & Calendar
Pricing
from $0.75 / 1,000 listings
Airbnb Scraper API: Listings, Prices, Reviews & Calendar
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
Maintained by CommunityActor stats
2
Bookmarked
20
Total users
9
Monthly active users
an hour ago
Last modified
Categories
Share
Airbnb Scraper
Airbnb Scraper API extracts public Airbnb listing data without an Airbnb API key, which does not exist for developers. Give it a city, a region or room URLs and it returns 99 fields per property: the nightly rate and stay total as numbers, the availability calendar with an occupancy rate, all six rating categories, the host, amenities and guest reviews. Export to JSON, CSV or Excel, or read the results over the API.
Why this Airbnb scraper
- The price for your stay, as numbers. Set
check_in,check_outand guests, and every listing comes back withprice_per_nightandtotal_priceyou can sort and average, quoted for exactly those nights. - Availability calendar and occupancy in the listing price. Up to 12 months of
day-by-day availability, blocked days,
occupancy_rateand the next free date, at no extra charge. - All six rating categories. Accuracy, check-in, cleanliness, communication, location and value, plus the share of 5 to 1 star reviews, instead of one overall star.
- 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.
- 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, not claimed
Every number on this page comes from a run, on the date given, not from a spec sheet.
| What | Measured | When |
|---|---|---|
| Fields per listing | 99 | 20 Oct 2026 |
| Currencies | 28, each run against Airbnb and returning that currency | 2 Sep 2026 |
| Languages | 18, each run and returned translated | 2 Sep 2026 |
| Default run | 20 listings, all 99 fields, 22 seconds | 2 Sep 2026 |
| Listings priced for a set stay | 20 of 20 in Paris, 5 nights in July 2027 | 20 Oct 2026 |
| Billing | 3 listings and 6 reviews delivered, 3 and 6 charged | 20 Oct 2026 |
What Airbnb data can you extract?
Every full detail record contains:
| Group | Fields |
|---|---|
| Identity | id, url, name, title, subtitle, description, description language, SEO title, thumbnail, images |
| Location | latitude, longitude, coordinates, city, country, neighbourhood, location descriptions, and whether the coordinates are the exact spot rather than Airbnb's privacy circle |
| Capacity | person capacity, bedrooms, beds, bathrooms, room type, property type, home tier |
| Price | price_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 |
| Ratings | guest satisfaction overall, plus accuracy, check-in, cleanliness, communication, location and value, and the share of 5 to 1 star reviews |
| Host | name, 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) |
| Amenities | the complete list by category, plus direct flags for wifi, air conditioning, heating, kitchen, parking, washer, TV, pool, dedicated workspace and pets |
| Reviews | reviewer, date, rating, review text, language, highlights and the host response, up to a limit you set |
| Availability | day 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 policies | house rules, cancellation policy, check-in and check-out times, self check-in, smoking, parties, commercial photography, licence number |
| Metadata | instant 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 tabs instead of one 99-column table
A record this wide is unreadable as one table, so the dataset arrives grouped. Each tab answers one question:
| Tab | What it answers |
|---|---|
| Listings | The 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 |
| Availability | The day-by-day calendar, minimum and maximum nights, days free, days blocked, occupancy rate and the next free date |
| Ratings & reviews | All six category scores behind the star, the rating distribution, and the reviews themselves |
| Host | Host and co-hosts, Superhost status, licence, whether the address is verified |
| Location | Coordinates and whether they are exact rather than Airbnb's privacy circle, address, neighbourhood, map link |
| Amenities & rules | The full amenity list by category, direct flags for the ones people filter on, house rules, cancellation terms, safety features |
| Description & photos | The 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.
Output example
From a run on 20 Oct 2026: three Porto listings, 2 adults, 15 to 20 March 2027.
| id | name | person_capacity | price_per_night | total_price | rating.guest_satisfaction | number_of_reviews | occupancy_rate |
|---|---|---|---|---|---|---|---|
| 29480483 | Porto AAA - Almada Aliados Apartment | 2 | 132.55 | 663 | 4.97 | 368 | 0.74 |
| 602831143027997558 | Almada Prime with Balcony - Heart of the City | 2 | 119.09 | 563 | 4.99 | 296 | 0.62 |
| 10097660 | Oporto's heArt (PRIVATE PARKING) | 3 | 111.02 | 556 | 4.99 | 473 | 0.40 |
The first of them as JSON, shortened: lists keep their first item, and long text is cut.
{"id": "29480483","url": "https://www.airbnb.com/rooms/29480483","name": "Porto AAA - Almada Aliados Apartment","property_type": "Entire rental unit","room_type": "Entire home/apt","person_capacity": 2,"bedrooms": 1,"beds": 1,"bathrooms": 1,"city": "Porto","country": "Portugal","latitude": 41.14608,"longitude": -8.61115,"is_exact_location": false,"check_in": "2027-03-15","check_out": "2027-03-20","nights": 5,"price_per_night": 132.55,"total_price": 663,"original_price": null,"currency": "USD","price": {"label": "$663 for 5 nights","amount": "$663","qualifier": "for 5 nights","currency": "USD","breakdown": [{ "label": "5 nights x $132.55", "amount": "$662.73" }]},"stars": 4.97,"number_of_reviews": 368,"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,"is_super_host": true,"host": {"name": "Teresa","profile_url": "https://www.airbnb.com/users/show/28228281","is_super_host": true,"is_verified": true,"rating_average": 4.93,"rating_count": 1322},"amenities_count": 42,"amenity_wifi": true,"amenity_kitchen": true,"amenity_ac": true,"amenity_washer": true,"house_rules": [{ "rule": "Up to 2 overnight guests", "icon": "SYSTEM_FAMILY" }],"instant_book": true,"min_nights": 2,"max_nights": 1125,"availability": [{"date": "2026-10-01","available": false,"available_for_checkin": false,"available_for_checkout": false,"min_nights": 1,"max_nights": 1125,"bookable": null}],"availability_days_total": 42,"availability_days_available": 11,"blocked_days": 31,"occupancy_rate": 0.7380952380952381,"next_available_date": "2026-11-04","reviews": [{"reviewer_name": "Denise","rating": 5,"text": "We had a wonderful stay in this beautiful apartment and felt at home from the very first moment...","created_at": "2026-10-19T10:41:58Z","language": "en","response": null}],"scraped_at": "2026-10-20T19:28:09.533978935Z","error": null}
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 Porto apartment above, 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.
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 rather than documentation you can use.
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.
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:
| Event | Free plan | Starter | Scale | Business 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 walked | free | free | free | free |
| Failed listing | free | free | free | free |
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.
How to scrape Airbnb listings without an API key
- Add the locations you want under
location_queries, or paste listing URLs intostart_urls. - Set
check_inandcheck_outfor the stay you care about. - Choose
mode. Usefullfor complete property data,searchfor a quick sweep of the result cards. - Set
max_listingsto cap the run. Turn oninclude_reviewsif you want reviews, andmax_reviews_per_listingto bound how many of them you pay for. - Start the run. Results appear in the dataset while the run is still going, so you can begin reading before it finishes.
Ready-made example tasks
Each opens a copy you can run as is or edit:
- Airbnb prices for your travel dates: Paris, 5 nights, 2 adults
- Airbnb occupancy rate for a city: Lisbon, 3-month calendars
- Airbnb competitor pricing for hosts: comparable 2-bedroom homes in Porto
- Airbnb reviews from listing URLs: up to 50 reviews per listing
- Airbnb availability calendar, 12 months: a year of availability per listing
- Fast Airbnb search results sweep: 100 Barcelona cards in search mode
- Airbnb host and Superhost data: hosts of 20 London listings
- Airbnb reviews and ratings for a city: 15 Lisbon listings, 10 reviews each
- Export Airbnb listings to CSV or Excel: 50 Rome listings, every field
- Airbnb Paris as seen from France, in EUR: local order, French text, euro prices
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 rather than ten.
{"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"}
| Europe | United Kingdom, France, Germany, Spain, Italy, Portugal, Netherlands, Poland, Sweden, Denmark, Austria, Ireland, Greece, Turkey |
| Americas | United States, Canada, Brazil, Mexico |
| Asia-Pacific | Japan, 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
| Option | Type | What it does |
|---|---|---|
location_queries | array | Locations to search. Each becomes its own search, merged into one dataset. |
start_urls | array | Room URLs or bare listing ids to fetch directly, skipping search. Give this or location_queries, not both. |
mode | string | full opens every property page. search reads results pages only. |
check_in, check_out | string | Stay dates, so prices reflect a real booking. |
adults, children, infants, pets | integer | Guest counts. These change price and availability. |
price_min, price_max | integer | Nightly price bounds. |
min_beds, min_bedrooms, min_bathrooms | integer | Size filters. |
room_types | array | Entire home/apt, private room, shared room, hotel room. |
property_types | array | Keep only listings matching these property types. |
min_rating | number | Drop listings rated below this. |
max_pages | integer | Search pages to walk per location. Usually leave empty; max_listings already bounds the run. |
max_listings | integer | How many listings to return. Defaults to 20; 0 takes every listing found. |
include_reviews | boolean | Fetch guest reviews. Off by default; billed per review. |
max_reviews_per_listing | integer | Reviews per property, at most. Defaults to 50; 0 fetches every one. |
calendar_months | integer | Months of availability to pull, from today, up to 12. 0 skips the calendar. |
calendar_start_month, calendar_start_year | integer | Start the calendar somewhere other than today. Defaults to the current month and year. |
currency | string | Prices converted to this. 28 options, each checked against Airbnb. |
locale | string | Language for review dates, house rules and cancellation terms. 18 options. |
proxy_country | string | Country to browse Airbnb from. 23 markets; empty follows locale. |
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, rather than what it advertises.
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.
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.
How the Airbnb scraper handles blocks and failures
A listing that cannot be fetched becomes a record instead of disappearing. 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 rather than being attached to a listing.
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. The API tab on this
page has the exact call with your token filled in.
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.
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
Paste a city into location_queries, set check_in and check_out, and run it, or open
one of the example tasks above.