Airbnb Scraper - Listings, Prices & Public Host Details avatar

Airbnb Scraper - Listings, Prices & Public Host Details

Pricing

from $1.50 / 1,000 listings

Go to Apify Store
Airbnb Scraper - Listings, Prices & Public Host Details

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

kane liu

Maintained by Community

Actor stats

1

Bookmarked

1

Total users

0

Monthly active users

2 days ago

Last modified

Security

Limited permissions

Share

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 startUrls to reuse an Airbnb search.
  • Listing details: give detailUrls to skip search and collect specific stays.
  • Detail additions: enrichDetails defaults to true. Optional detailExtras and 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.

FieldDescriptionExample
listingIdAirbnb listing identifier12345
nameListing titleExample apartment in Paris
urlListing linkhttps://www.airbnb.com/rooms/12345
marketSelected storefront codeFR
priceDisplayed nightly price or stay total120
priceIsTotalWhether the price covers the stayfalse
totalPriceStay total when shown360
nightsNumber of nights for dated stays3
currencyCurrency of the priceEUR
ratingGuest rating when shown4.8
reviewCountListing's total review count42
propertyTypeAccommodation type as displayedApartment in Paris
roomTypeDetail-page room type codeENTIRE_HOME
locationPublic location textParis
imageUrlMain listing photohttps://example.com/photo.jpg
imagesListing photo URLs[]
amenitiesAvailable amenity names["Wifi", "Kitchen"]
personCapacityMaximum guests4
bedroomsBedroom count1
bedsBed count2
orgPublic host identity{"name": "Jane Doe"}
addressPublic locality and country{"locality": "Paris"}
geoCoordinates; often approximate{"lat": 48.86, "lng": 2.35, "exact": false}
reviewsOptional public reviews[]
policiesHouse rules and cancellation details{}
priceBreakdownDated price lines and availability{"dated": false, "total": ""}
calendarMonthsOptional daily availability by month[]
detailExtrasFailedAdditions that returned no data["reviews"]
leadAbsencesReasons contact or host fields are empty{"phones": "not_on_platform"}
scrapedAtCollection timestamp2026-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

  1. Open Airbnb Scraper in Apify Console.
  2. Fill one target field: destination, startUrls or detailUrls.
  3. Set maxResults to 3 for a small first run.
  4. Click Start and wait for completion.
  5. 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.

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.

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

FieldWhat to enterDefault
destinationCity, region or countryEmpty; example uses Singapore
startUrlsAirbnb search linksEmpty
detailUrlsAirbnb listing linksEmpty
maxResultsRow limit per input, 1–50070; form prefill 3
marketStorefront code, such as US, JP, GB, CA_FRUS
checkinCheck-in date, YYYY-MM-DDEmpty
checkoutLater check-out date; supply both datesEmpty
adultsAdult guests, 1–102
roomTypesEntire home/apt, Private room, Shared room, Hotel room[]
categoryTagsCategory labels, such as Beach or Cabins[]
propertyTypeIdsProperty labels or IDs, such as Villa or 2[]
enrichDetailsAdd public listing details when possibletrue
detailEnrichLimitListing-detail limit, 1–103
reviewsLimitNewest reviews per enriched listing, 0–500
reviewRowsDeliver each review as its own row instead of a list inside the listingfalse
detailExtrasOptional additions listed below[]
domainAirbnb storefront override, such as www.airbnb.jpMarket default
localeLanguage override, such as ja-JPMarket default
currencyCurrency override, such as EURMarket default
placeIdKnown place identifier to refine geographyEmpty

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.

  • maxItems and limit are aliases for maxResults; city, location and query are aliases for destination.
  • 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_REPORT to its default key-value store, recording normalization, corrections, ignored fields and whether it used the example. INPUT_ECHO contains 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. leadAbsences distinguishes 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 planStart at 512 MBPrice per rowPrice 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 ApifyClient
client = 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

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 detailExtrasFailed and detailExtrasErrors.
  • Public host profiles do not provide private contacts or exact street addresses. Coordinates are often approximate.
  • similarListings is not collected. Reviews remain nested inside listing rows.

More travel, hotel and flight scrapers from the same publisher:

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.