Airbnb Scraper: Listings, Prices & Availability
Pricing
from $0.40 / 1,000 results
Airbnb Scraper: Listings, Prices & Availability
Airbnb scraper for any city and dates: nightly price, stay total, discounts, the fees and taxes Airbnb states, rating, reviews, beds, baths, photos, coordinates and URL. Optional full listing detail adds amenities, house rules, host and guest capacity. $0.40 per 1,000 listings.
Pricing
from $0.40 / 1,000 results
Rating
0.0
(0)
Developer
Philip Kirkbride
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
5 days ago
Last modified
Categories
Share
Get Airbnb listings and prices for any city, neighbourhood or region, for the dates and guests you choose. Each listing becomes one clean row: nightly price, the stay total, any discount Airbnb shows, the fees and taxes Airbnb states, rating, review count, bedrooms, beds, bathrooms, photos, map coordinates, the listing link and a booking link already opened on your dates. Turn on full detail to add amenities, house rules, host information and guest capacity.
Use it as a simple Airbnb API: send a place and dates, get back a dataset you can download as JSON, CSV or Excel, or read from your own code. Every run reads Airbnb live, so prices and availability are current. You pay only for the listings you get: $0.40 per 1,000 listings.
Quick Start
{"locationQueries": ["Lisbon, Portugal"],"checkIn": "2027-03-12","checkOut": "2027-03-15","adults": 2,"maxResults": 60}
This run returns up to 60 Lisbon stays available for 2 guests from 12 to 15 March, each with its 3-night total, nightly price, rating and coordinates. Leave the dates out for a general search of the place, or paste a search link you already built on Airbnb into startUrls.
Use cases
- Short-term rental market research: average nightly rates, demand signals such as review counts, and the mix of entire homes versus rooms for any city or neighbourhood.
- Price monitoring: run the same place and dates on a schedule and track how prices, discounts and availability move as the dates get closer.
- Competitor analysis for hosts and property managers: compare your listing with nearby stays of the same size, rating and price band.
- Travel planning and deal finding: find the best-rated places under a budget, or the cheapest month-long stay in a city.
- Investment analysis: estimate the revenue potential of a property type in an area before buying.
- Datasets for maps, dashboards and models: every row has latitude and longitude, numeric prices and a stable listing id.
Input recipes
A weekend for two in one city
{"locationQueries": ["Barcelona, Spain"], "checkIn": "2027-04-16", "checkOut": "2027-04-18", "adults": 2, "maxResults": 100}
Several cities in one run, prices in euros
{"locationQueries": ["Paris, France", "Rome, Italy", "Amsterdam, Netherlands"], "checkIn": "2027-05-07", "checkOut": "2027-05-10", "currency": "EUR", "maxResults": 3000}
maxResults is the total for the whole run, and places are searched in the order given: a big city can use up the whole limit before the next place starts. For an even sample per city, run one place per run, for example one saved task per city.
A family trip: entire place, 3 bedrooms, under $400 a night, pets allowed
{"locationQueries": ["Orlando, FL"], "checkIn": "2027-03-20", "checkOut": "2027-03-27", "adults": 4, "children": 2, "pets": 1, "entirePlaceOnly": true, "minBedrooms": 3, "priceMax": 400}
A month somewhere warm, any time in November or December
{"locationQueries": ["Lima, Peru"], "flexibleMonths": ["november", "december"], "flexibleStayLength": "month", "entirePlaceOnly": true, "maxResults": 40}
A three-month stay starting on a fixed date
{"locationQueries": ["Medellín, Colombia"], "monthlyStart": "2027-01-01", "monthlyLength": 3, "maxResults": 40}
Set monthlyLength to 1 or 2 for a one- or two-month stay.
A search you set up on Airbnb, with full listing detail
{"locationQueries": [], "startUrls": ["https://www.airbnb.com/s/Austin--TX/homes"], "checkIn": "2027-03-12", "checkOut": "2027-03-15", "mode": "full", "maxDetails": 20, "maxResults": 20}
Every listing in a large city
{"locationQueries": ["London, United Kingdom"], "checkIn": "2027-02-05", "checkOut": "2027-02-07", "maxResults": 2000}
Input
| Field | Type | Default | What it does |
|---|---|---|---|
locationQueries | array | ["San Francisco, CA"] | One or more places, e.g. San Francisco, CA. Each is searched separately. |
startUrls | array | — | Advanced: run exact Airbnb search URLs. Empty locationQueries when you use it, or those places are searched too. |
checkIn | string | — | Stay check-in date (YYYY-MM-DD). Provide with checkOut for stay totals. |
checkOut | string | — | Stay check-out date (YYYY-MM-DD). |
flexibleMonths | array | — | Months a flexible stay can happen in: month names (november) or YYYY-MM (2026-11), up to 12. A YYYY-MM value keeps only the month and searches its next occurrence; the year is advisory. Cannot be combined with checkIn/checkOut or monthlyStart. |
flexibleStayLength | string | month | With flexibleMonths: weekend, week, or month (about four weeks). |
monthlyStart | string | — | Start date (YYYY-MM-DD, a real calendar date) of a monthly stay. Cannot be combined with checkIn/checkOut or flexibleMonths. |
monthlyLength | integer | 3 | Months to search from monthlyStart, from 1 to 12. The stay ends on the same day of the month, monthlyLength months later (or on that month's last day). |
entirePlaceOnly | boolean | false | Only entire homes and apartments, excluding private/shared rooms and hotels. |
adults | integer | 2 | Adult guests. |
children | integer | 0 | Children. |
infants | integer | 0 | Infants. |
pets | integer | 0 | Pets. |
priceMin | integer | 0 | Lowest price to include. In flexible-date and monthly searches this applies to the price Airbnb displays for the window: the monthly price for month-long and longer windows, the stay total for a weekend or week. |
priceMax | integer | — (no cap) | Optional. Highest price to include, in the run's currency. Leave it empty to include listings at any price. For dated searches it is a nightly price; for a dated stay of 28+ nights it is converted to Airbnb's monthly price basis. In flexible and monthly searches it caps the price Airbnb displays for the window: the monthly price for month-long and longer windows, the stay total for a weekend or week. |
minBedrooms | integer | 0 | Minimum bedrooms (0 = no filter). |
minBeds | integer | 0 | Minimum beds (0 = no filter). |
minBathrooms | integer | 0 | Minimum bathrooms (0 = no filter). |
mode | string | search | search = fast result rows; full = also open each listing for amenities, house rules, host and guest capacity. |
maxResults | integer | 60 | Stop after this many listings across all places. |
maxDetails | integer | 20 | In full mode, how many listings to open for the extra detail. |
maxPagesPerQuery | integer | 15 | Result pages read per place and price range. |
currency | string | USD | Currency for returned prices (USD, EUR, GBP, MXN, BRL, ...). |
locale | string | en | Supported search language: English (en). Legacy values such as pt, es, fr and en-US are accepted but fall back to en with a warning. Currency is unchanged. |
strictLocation | boolean | true | Reject unresolved or broader place matches and listings outside Airbnb's returned map area. The map area is not an exact neighbourhood boundary. |
requestDelaySecs | number | 0.5 | Pause between result pages. |
Provide at least one place in locationQueries or a search URL in startUrls (with locationQueries empty, see below). Up to 50 places or links per run.
Pasting an Airbnb search URL
Set up a search on airbnb.com with the map area and filters you want, copy the link from the address bar and paste it into startUrls. The run reads that search, place and map area included, page by page.
Empty the places list when you paste links ("locationQueries": [] in the API, or remove the entries in the input form). If you leave the field out, the default place (San Francisco) is searched too, and first.
The input fields still decide the dates, guests, currency, price range and bedroom, bed and bathroom minimums: they replace the values in the link. Set checkIn/checkOut, adults and any price or room limits in the input as well, so the run searches exactly the stay you want. Links that use Airbnb's flexible or monthly date picker keep their date settings unless you set new ones.
Limit: a pasted link that carries its own dates of 28 nights or more is sent as is, so a priceMax you set there is applied by Airbnb to the monthly price.
Large cities and complete coverage
Airbnb shows a limited number of result pages for any one search. When a place has more listings than that, the Actor automatically searches narrower price bands and merges them, removing repeats, so a run can return far more listings than a single search shows for a city like London or Paris. Every price is included unless you set priceMax; raise maxResults to collect more of them.
Flexible-date and monthly stays
Some trips are "a month, sometime in November or December" rather than fixed dates. Use flexibleMonths with flexibleStayLength for that, or monthlyStart with monthlyLength to use Airbnb's Months picker. Set entirePlaceOnly to keep just entire homes and apartments.
flexibleMonths accepts month names or YYYY-MM values. A YYYY-MM value keeps only the month: Airbnb's picker always searches the next occurrence of that month, so the year is advisory (2026-11 and 2027-11 both search the next November).
Airbnb prices each flexible or monthly search as a whole window, and every listing gets its own window. Each row therefore reports the window it is priced for: stayCheckIn, stayCheckOut and stayNights, plus bookingUrl (the listing page opened on those exact dates) and pricePerNightEffective (totalPrice / stayNights). That makes a 28-night quote directly comparable with a 31-night or multi-month one.
A flexible month window is about 28 nights. A monthly search covers exactly monthlyLength months from monthlyStart: one month (Airbnb's monthly stays start at 28 nights), two, three or more. The actual dates and nights are always in the row rather than assumed.
For any stay of 28 nights or more, including dated ones, Airbnb shows an average monthly price rather than a stay total. The row keeps that figure in pricePerMonth. For a window of one month or less it is also totalPrice; for a longer window totalPrice is pricePerMonth times the months in the window (whole calendar months, otherwise nights divided by 365/12), and pricePerNightEffective follows from it. A multi-month totalPrice is therefore an estimate built from Airbnb's monthly average; the listing page shows the exact total.
Modes
Search (default) is the fast mode: one row per listing with price, fees, rating, beds/baths, coordinates, photos and URL.
Full detail also opens each listing (up to maxDetails) to add amenities, houseRules (check-in window, pets, smoking, events, quiet hours and more), host (name, superhost/verified flags, profile picture and host review stats) and maxGuests (guest capacity), plus the structured propertyType and spaceType.
What it returns
Each row includes listingId, url, bookingUrl, name, roomType, location, tagline, pricePerNight, pricePerNightEffective, originalPricePerNight, discountAmount, totalPrice, pricePerMonth, stayCheckIn, stayCheckOut, stayNights, currency, feeBreakdown, rating, reviewCount, bedrooms, beds, bathrooms, maxGuests (full-detail mode), latitude, longitude, images, host, amenities, houseRules, resolvedLocation, locationVerified, query, mode, source and scrapedAt.
| Field | Meaning |
|---|---|
listingId, url, bookingUrl | Airbnb's listing id, the listing page, and the listing page opened on the searched dates and guests. |
name, tagline, roomType, location | The listing title, its short description, type of stay (Apartment, Room, Home, ...), and an unverified place label from the listing card. location is not necessarily a neighbourhood; obvious codes or missing labels become null. Use resolvedLocation and coordinates for location checks. |
pricePerNight, pricePerNightEffective | Airbnb's nightly price, and the stay total divided by the nights. |
originalPricePerNight, discountAmount | The nightly price before a discount, and the discount Airbnb states. null when there is no discount. |
totalPrice, stayCheckIn, stayCheckOut, stayNights, currency | The stay total and the exact stay it is for. |
pricePerMonth | Airbnb's average monthly price for stays of 28 nights or more; null for shorter stays. |
feeBreakdown | The fee and tax lines Airbnb states for the search, each with label, amount and currency. |
rating, reviewCount | Guest rating out of 5 and the number of reviews. |
bedrooms, beds, bathrooms, maxGuests | Size of the place. maxGuests is filled in full-detail mode. |
latitude, longitude, images | Map position and photo links. |
host, amenities, houseRules, propertyType, spaceType | Full-detail fields. |
resolvedLocation, locationVerified, query, mode, source, scrapedAt | The place Airbnb matched, whether the match and row coordinates passed the location checks, what was searched, and when (UTC). |
Output example
A real row from a Lisbon search for 2 guests, 4 to 7 December 2026 (photo list shortened to two links). This stay was discounted: $164 a night before the discount, $310 for the three nights after it.
{"listingId": "1492589232021457643","url": "https://www.airbnb.com/rooms/1492589232021457643","bookingUrl": "https://www.airbnb.com/rooms/1492589232021457643?check_in=2026-12-04&check_out=2026-12-07&adults=2¤cy=USD&locale=en","name": "Alfama terrace with rooftop river views","roomType": "Apartment","location": "Santa Maria Maior","tagline": "Alfama terrace with rooftop river views","propertyType": null,"spaceType": null,"pricePerNight": 103.17,"pricePerNightEffective": 103.33,"originalPricePerNight": 164,"discountAmount": 182,"totalPrice": 310,"pricePerMonth": null,"stayCheckIn": "2026-12-04","stayCheckOut": "2026-12-07","stayNights": 3,"currency": "USD","feeBreakdown": [],"rating": 4.92,"reviewCount": 63,"bedrooms": 1,"beds": 2,"bathrooms": 1,"maxGuests": null,"latitude": 38.7118,"longitude": -9.129,"images": ["https://a0.muscache.com/im/pictures/hosting/Hosting-1492589232021457643/original/99597430-5632-43a1-b258-67202629a8e4.jpeg","https://a0.muscache.com/im/pictures/hosting/Hosting-1492589232021457643/original/1db645da-7275-4262-8f7f-40d3994448d3.jpeg"],"host": null,"amenities": [],"houseRules": [],"resolvedLocation": "Lisbon","locationVerified": true,"query": "Lisbon, Portugal","mode": "search","source": "airbnb","scrapedAt": "2026-10-20T00:54:12.881322+00:00"}
Use it as an Airbnb API
Run it from your own code with the Apify API and read the results straight back. For example, with curl:
curl -X POST "https://api.apify.com/v2/acts/barefoot_grade~airbnb-stays-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"locationQueries": ["Lisbon, Portugal"], "checkIn": "2027-03-12", "checkOut": "2027-03-15", "maxResults": 20}'
The same works from the Apify Python and JavaScript clients, from Make, Zapier and n8n, and on a schedule from the Apify Console. Results can also go straight to Google Sheets, a webhook or cloud storage.
FAQ
Is there an official Airbnb API for listings and prices? Airbnb's own API is only open to approved partners. This Actor gives you the same listings and prices a guest sees on airbnb.com, as structured data, with no partner account.
How fresh is the data? Every run reads Airbnb at run time, so prices and availability are current as of the run rather than a stored copy.
How many listings can I get? As many as Airbnb lists for the place, up to maxResults (5,000 per run). Large cities return many more listings than one search page; see "Large cities and complete coverage" above.
Which places can I search? Anything Airbnb's own search box understands: a city, a neighbourhood, a region, an island or a country. Add the country or state to avoid look-alike names (Paris, France, not Paris). With strictLocation on, broader place matches and rows outside Airbnb's returned map area are dropped. That area is not an exact neighbourhood boundary.
Can I get prices in my currency and language? Set currency to any currency Airbnb offers (EUR, GBP, MXN, BRL, JPY, ...). The supported search locale is English (en) only. Other locale values are still accepted for compatibility but produce a clear warning and use English instead, without changing your requested currency or place. Listing text is source-provided and may still contain local-language text.
Why is the price sometimes a stay total? The Actor uses Airbnb’s displayed total when available, or derives a total from the displayed nightly price and stay length. pricePerNight is populated when Airbnb exposes a nightly amount; it can be null even when a total is available. A total derived from the nightly price excludes any fees, taxes and length-of-stay discounts that Airbnb did not state, and feeBreakdown only contains the lines Airbnb exposes for that search — an absent line is not a zero.
How are discounts reported? When Airbnb shows a discounted stay, pricePerNight is the effective nightly price after the discount (the discounted stay amount divided by the nights), never the pre-discount rate. If the stay length or the discount amount cannot be derived (no check-in/check-out dates, qualifier, nightly explanation line or discount evidence), pricePerNight is null on a discounted listing rather than the pre-discount rate. originalPricePerNight is the pre-discount nightly rate from Airbnb's nightly price explanation, not the headline original total, which can include taxes and fees. discountAmount is the discount Airbnb states: a discount explanation line (for example a special offer or a stay discount) or the headline original/discounted price pair; a negative fee or tax credit is not a discount. Both originalPricePerNight and discountAmount are null when Airbnb states no discount. Taxes and fees are not part of pricePerNight.
Why are there two nightly prices? pricePerNight is Airbnb's own per-night quote when it gives one. pricePerNightEffective is the displayed stay total divided by the exact number of nights in stayNights, so quotes for different window lengths (28 nights, 31 nights, three months) can be compared on the same basis. It is null when the total or the nights are unknown.
Is there a default price cap? No. Without priceMax a run includes listings at any price, in every date mode. If you set priceMax on a dated search it is a nightly limit. If you set it on a flexible or monthly run, it becomes the cap on the price Airbnb displays for the window: the monthly price for month-long and longer windows. The same applies to priceMin. For a dated stay of 28 nights or more, Airbnb filters on the monthly price, so the Actor converts the nightly priceMin and priceMax to the matching monthly amount.
What does locationVerified mean? true means Airbnb returned a resolved place without a known broader fallback and the row's coordinates are inside Airbnb's returned map area. Aliases and translated place names are accepted. With strictLocation on, rows outside that map area are dropped. That map area is not an exact administrative boundary; use coordinates for neighbourhood-level checks. A broader match (such as a country for a neighbourhood) is not verified. Unverified pages are dropped by default; strictLocation: false allows them through with locationVerified: false.
Are all fields always present? Fields Airbnb does not publish for a listing come back as null; amenities, houseRules, images and feeBreakdown come back as empty arrays when absent. In search rows, host, maxGuests, propertyType and spaceType come back as null. In search rows, amenities and houseRules come back as empty arrays. Full-detail mode populates host, maxGuests, propertyType, spaceType, amenities and houseRules.
Can I get reviews or calendar availability per night? Not in this Actor. Each row has the rating and review count, and the price and availability for the dates you searched. To see availability across dates, run the same place for each date range you care about.
Does it collect personal data? It returns what Airbnb shows publicly on the search and listing pages. In full-detail mode that includes the host's public display name and profile photo. Use the data in line with the laws that apply to you and Airbnb's terms.
What changed (October 2026)
- Monthly searches now return the length you ask for: 1 and 2 months give 1 and 2 months (before, they returned 3).
- For stays of 28 nights or more, the new
pricePerMonthfield holds Airbnb's monthly price, andtotalPrice,pricePerNightandpricePerNightEffectivecover the whole stay. Before, a multi-month window reported one month's price as the total. - There is no default maximum price any more. Leave
priceMaxempty to see every price, including expensive places and large homes; set it to cap results.
Price
$0.40 per 1,000 listings ($0.0004 per row), plus $0.00005 per run start. A start is charged once per GB of memory, so the default 512 MB run is one start. Runs that find no listings add no row charge. Platform usage is included in these prices.
Support
For questions, a missing field or a place that does not return results, open an issue on the Actor's Issues tab or contact Apify support from the Actor page.