Airbnb Scraper - Listings, Prices & Public Host Details
Pricing
from $1.50 / 1,000 listings
Airbnb Scraper - Listings, Prices & Public Host Details
Extract Airbnb stays across country storefronts, with prices, ratings, photos and optional public host details. Search places or supply listing URLs; pay per delivered listing row plus a start fee.
Pricing
from $1.50 / 1,000 listings
Rating
0.0
(0)
Developer
kane liu
Maintained by CommunityActor stats
1
Bookmarked
1
Total users
0
Monthly active users
2 days ago
Last modified
Categories
Security
Limited permissionsShare
Airbnb Scraper
Extract Airbnb stays, prices, ratings, photos and public listing details across country storefronts as exportable rows.
- Search a destination, reuse search links, or collect specific listings.
- Filter by room type, category and property type.
- Add public host profiles, amenities, reviews and stay-price details where available.
- Export to spreadsheets or use the Apify API and MCP server.
- Pay $2.00 per 1,000 rows on the Free plan, plus a small start fee.
What does Airbnb Scraper do?
Airbnb Scraper collects public accommodation listings from Airbnb. Each row represents one stay, suitable for rental-price comparisons, destination research or travel content. Supported storefront choices include the United States, Japan, the United Kingdom, Singapore, France and Canada; a storefront is not a guarantee of inventory in every destination.
- Destination search: enter a city, region or country in
destination. - Search links: give
startUrlsto reuse an Airbnb search. - Listing details: give
detailUrlsto skip search and collect specific stays. - Detail additions:
enrichDetailsdefaults totrue. OptionaldetailExtrasand reviews are off by default. Reviews remain inside the listing row, not separately billed rows.
This Actor collects Stays, not Experiences or Services.
What data can you extract from Airbnb?
Search rows contain card information. Listing-detail fields appear only when available and the listing was enriched.
| Field | Description | Example |
|---|---|---|
listingId | Airbnb listing identifier | 12345 |
name | Listing title | Example apartment in Paris |
url | Listing link | https://www.airbnb.com/rooms/12345 |
market | Selected storefront code | FR |
price | Displayed nightly price or stay total | 120 |
priceIsTotal | Whether the price covers the stay | false |
totalPrice | Stay total when shown | 360 |
nights | Number of nights for dated stays | 3 |
currency | Currency of the price | EUR |
rating | Guest rating when shown | 4.8 |
reviewCount | Listing's total review count | 42 |
propertyType | Accommodation type as displayed | Apartment in Paris |
roomType | Detail-page room type code | ENTIRE_HOME |
location | Public location text | Paris |
imageUrl | Main listing photo | https://example.com/photo.jpg |
images | Listing photo URLs | [] |
amenities | Available amenity names | ["Wifi", "Kitchen"] |
personCapacity | Maximum guests | 4 |
bedrooms | Bedroom count | 1 |
beds | Bed count | 2 |
org | Public host identity | {"name": "Jane Doe"} |
address | Public locality and country | {"locality": "Paris"} |
geo | Coordinates; often approximate | {"lat": 48.86, "lng": 2.35, "exact": false} |
reviews | Optional public reviews | [] |
policies | House rules and cancellation details | {} |
priceBreakdown | Dated price lines and availability | {"dated": false, "total": ""} |
calendarMonths | Optional daily availability by month | [] |
detailExtrasFailed | Additions that returned no data | ["reviews"] |
leadAbsences | Reasons contact or host fields are empty | {"phones": "not_on_platform"} |
scrapedAt | Collection timestamp | 2026-10-24T09:00:00Z |
priceQualifier preserves the source's price label. Check it with priceIsTotal before comparing rates. Host phone numbers, emails and private street addresses are not supplied. geo.exact: false means the coordinates describe an approximate area, not an exact property location.
How to scrape Airbnb
- Open Airbnb Scraper in Apify Console.
- Fill one target field:
destination,startUrlsordetailUrls. - Set
maxResultsto3for a small first run. - Click Start and wait for completion.
- Download the dataset or read it through the API.
Empty input starts a Singapore example search capped at 3 rows. It uses the normal pricing below. Filling a target chooses the matching workflow automatically; there is no mode field to set. Listing links take precedence over search links, which take precedence over the destination.
Destination search
Enter a place such as Paris. Add market, currency, dates or filters as needed. Leave both dates empty for flexible-date results; dates are not filled or moved automatically.
Search links
Put Airbnb search URLs into startUrls, as strings or objects containing url. The destination is not used to build those searches. Results depend on the filters Airbnb accepts in the supplied links.
Listing details
Put /rooms/<listing number> links into detailUrls and keep enrichDetails enabled. Each listing link can produce one listing row. Start with one URL and increase detailEnrichLimit only when needed; its default is 3 and maximum is 10.
What to fill in
| Field | What to enter | Default |
|---|---|---|
destination | City, region or country | Empty; example uses Singapore |
startUrls | Airbnb search links | Empty |
detailUrls | Airbnb listing links | Empty |
maxResults | Row limit per input, 1–500 | 70; form prefill 3 |
market | Storefront code, such as US, JP, GB, CA_FR | US |
checkin | Check-in date, YYYY-MM-DD | Empty |
checkout | Later check-out date; supply both dates | Empty |
adults | Adult guests, 1–10 | 2 |
roomTypes | Entire home/apt, Private room, Shared room, Hotel room | [] |
categoryTags | Category labels, such as Beach or Cabins | [] |
propertyTypeIds | Property labels or IDs, such as Villa or 2 | [] |
enrichDetails | Add public listing details when possible | true |
detailEnrichLimit | Listing-detail limit, 1–10 | 3 |
reviewsLimit | Newest reviews per enriched listing, 0–50 | 0 |
reviewRows | Deliver each review as its own row instead of a list inside the listing | false |
detailExtras | Optional additions listed below | [] |
domain | Airbnb storefront override, such as www.airbnb.jp | Market default |
locale | Language override, such as ja-JP | Market default |
currency | Currency override, such as EUR | Market default |
placeId | Known place identifier to refine geography | Empty |
Destination search:
{"destination": "Paris","market": "FR","currency": "EUR","maxResults": 3}
Search links:
{"startUrls": [{"url": "https://www.airbnb.com/s/Paris/homes"}],"maxResults": 3}
Listing details; replace the illustrative listing number with your target:
{"detailUrls": [{"url": "https://www.airbnb.com/rooms/12345"}],"enrichDetails": true,"detailEnrichLimit": 1,"reviewsLimit": 3,"maxResults": 1}
detailExtras accepts detailApi, reviews, policies, priceBreakdown, hostProfile, calendar and rooms. rooms delivers each bookable room of a multi-room property (such as a hotel) as its own row. detailApi requests additional listing-detail fields. priceBreakdown needs both dates for prices. hostProfile adds public profile facts to org; calendar data may be unavailable. similarListings is retired and ignored. Selecting reviews with reviewsLimit: 0 requests up to 24 reviews. Every row carries rowType (listing, room or review); room and review rows carry their own id and the parent's parentListingId, are charged like listing rows, and count against maxResults.
Search enrichment is skipped when search rows already fill the row allowance, even with enrichDetails: true. Use detailUrls when details are the main requirement.
maxItemsandlimitare aliases formaxResults;city,locationandqueryare aliases fordestination.- Close field-name misspellings can be corrected. Other unknown fields are ignored with a note; unknown room, category and property filter values are dropped with a warning.
- Invalid targets stop with a field-specific error, such as
INVALID_INPUT: detailUrls must be Airbnb listing links like https://www.airbnb.com/rooms/<listing number>, before any listing row is charged. The start fee still applies. - Each run writes
INPUT_REPORTto its default key-value store, recording normalization, corrections, ignored fields and whether it used the example.INPUT_ECHOcontains the interpreted input.
Output example
Illustrative search row, not a live price quote:
{"platform": "airbnb","listingId": "12345","name": "Example apartment in Paris","url": "https://www.airbnb.com/rooms/12345","market": "FR","domain": "www.airbnb.fr","price": 120,"priceIsTotal": false,"priceQualifier": "night","totalPrice": null,"currency": "EUR","rating": 4.8,"reviewCount": 42,"propertyType": "Apartment in Paris","location": "Paris","phones": [],"emails": [],"org": null,"leadSource": "search","leadAbsences": {"org": "not_verified"},"scrapedAt": "2026-10-24T09:00:00Z"}
Export the dataset as JSON, CSV, Excel, XML, RSS or an HTML table. RUN_SUMMARY records completion and row counts; ERROR_SUMMARY describes validation or collection failures when written.
Why use this Airbnb scraper?
- Pay for delivered rows. Listing charges apply to rows written to the dataset, plus the start fee.
- Keep available partial results. Rows returned before a collection timeout or cancellation can still be delivered and billed. Already saved rows remain accessible.
- Know what is missing.
leadAbsencesdistinguishes unavailable information from details not checked. - Reuse inputs. Supply multiple search URLs or category tags in one run instead of combining exports manually.
- No proxy setup. You do not need to set up proxies or supply an Airbnb account.
How much does it cost to scrape Airbnb?
Pricing is pay-per-event. The start event costs $0.005 per allocated GB, with at least one event. At the default 512 MB, one start costs $0.005. Platform usage is included in these prices.
| Apify plan | Start at 512 MB | Price per row | Price per 1,000 rows |
|---|---|---|---|
| Free | $0.005 | $0.002 | $2.00 |
| Starter | $0.005 | $0.002 | $2.00 |
| Scale | $0.005 | $0.002 | $2.00 |
| Business | $0.005 | $0.0015 | $1.50 |
maxResults applies per destination, category tag, search URL or detail URL. It defaults to 70; larger requests are collected in parts of 70. It is an upper bound, not a guaranteed row count. Reviews embedded in a listing are included in that row's price.
Free Apify plan runs are capped at 200 rows and 10 runs of this Actor, as set by the developer. The whole run stops at your Maximum cost per run (maxTotalChargeUsd in the API).
Example: 3 delivered rows on the Free plan at 512 MB cost 3 × $0.002 + $0.005 = $0.011.
What happens when the run timeout is too short
When the selected timeout is too short, an eligible run can pause rather than fail. Its status message says "Queued on the collection backend; this run will resume automatically when results are ready (about N s)." It appears as ABORTED temporarily.
When results are ready, the same run resumes automatically and delivers into the same dataset. A successful delivery finishes as SUCCEEDED. Rows already delivered are skipped so they are not charged twice. Resumed delivery with existing rows can show "Resumed: delivering N rows."
- Automatic pauses are limited to at most 3 per run. Keep the default 900-second timeout to reduce interruptions.
- Synchronous endpoints (
run-sync,run-sync-get-dataset-items) wait at most 300 seconds and can return an empty dataset while the run is paused. For longer jobs, start asynchronously and read the dataset after SUCCEEDED, or use a success webhook.
Use with AI agents and the API
Apify MCP server
Add this remote server in Claude, ChatGPT, Cursor, VS Code or another compatible MCP client:
https://mcp.apify.com?tools=lentic_clockss/airbnb-listings-scraper
Sign in with Apify using OAuth, or send Authorization: Bearer <YOUR_APIFY_TOKEN>. The tool starts a run and returns run and dataset IDs; the agent reads rows with get-dataset-items. Clients without remote support can use npx @apify/actors-mcp-server --tools lentic_clockss/airbnb-listings-scraper with APIFY_TOKEN set.
Example prompt: "Find 3 Airbnb stays in Paris, using the French storefront and EUR. Return their names, prices and listing URLs."
Apify API
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("lentic_clockss/airbnb-listings-scraper").call(run_input={"destination": "Paris", "market": "FR", "maxResults": 3})for row in client.dataset(run["defaultDatasetId"]).iterate_items():print(row)
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const run = await client.actor('lentic_clockss/airbnb-listings-scraper').call({destination: 'Paris', market: 'FR', maxResults: 3,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
Over HTTP, send the input as JSON to POST https://api.apify.com/v2/acts/lentic_clockss~airbnb-listings-scraper/runs with an authorization bearer token. Read results with GET https://api.apify.com/v2/datasets/<datasetId>/items?format=json after completion.
Integrations
Connect results to Google Sheets, Make, Zapier, n8n, Slack, Airtable or a webhook through Integrations. Use Apify Schedules for recurring runs.
FAQ
Is it legal to scrape Airbnb?
This Actor collects public data and is not affiliated with Airbnb. You are responsible for complying with Airbnb's terms and applicable data-protection law. Processing personal data requires a lawful basis; public visibility alone does not establish permission for every use.
Why did my run end as ABORTED?
Check the status message. A queued run can pause and resume automatically as described above. ABORTED can also mean a manual stop; not every aborted run will resume.
How many results can I get?
maxResults accepts 1–500 per input. Availability, filters, detail limits and your spending cap can produce fewer rows. Free-plan runs stop at 200 rows.
Why are some fields empty?
Airbnb may not publish them, or enrichment may not have run. not_on_platform means unavailable publicly; not_extracted means a checked page lacked the field; not_verified means it was not checked successfully.
Can I scrape without an Airbnb login or API key?
Yes. You need an Apify account, but no Airbnb login or Airbnb developer key.
Does it collect Experiences or Services?
No. It collects Stays only.
How do I get prices in JPY, EUR or GBP?
Choose the matching market or set currency. Compare prices using each row's currency and price qualifier, especially when supplying dated search links.
Can I use my own search URL?
Yes. Put it in startUrls. Multiple links are accepted, each with its own row allowance, subject to the run's total spending limit.
Limitations
- Search results are not a complete inventory of every Airbnb property.
- Dates, availability and filters affect results; prices are snapshots, not booking guarantees.
- Details and optional additions may be unavailable. Failed additions do not necessarily discard the listing row; check
detailExtrasFailedanddetailExtrasErrors. - Public host profiles do not provide private contacts or exact street addresses. Coordinates are often approximate.
similarListingsis not collected. Reviews remain nested inside listing rows.
Related scrapers
More travel, hotel and flight scrapers from the same publisher:
- Trip.com Scraper — Hotels Flights Trains Cars
- Traveloka Scraper
- Expedia Scraper
- Skyscanner Scraper
- Agoda Scraper — Hotels, Flights, Packages & More
- Despegar Scraper
- TripAdvisor Scraper — Hotels, Restaurants & More
- Booking.com Hotels Scraper
Browse all of our scrapers at apify.com/lentic_clockss.
Support
Report a problem or request a field through the Issues tab of this Actor's page. Include the run ID and the input you used.