Airbnb Scraper: Listings, Prices, Calendar - No Login avatar

Airbnb Scraper: Listings, Prices, Calendar - No Login

Pricing

from $1.89 / 1,000 listings

Go to Apify Store
Airbnb Scraper: Listings, Prices, Calendar - No Login

Airbnb Scraper: Listings, Prices, Calendar - No Login

Get Airbnb listings with total stay prices, discounts, calendars, reviews and area price summaries from a city or link. Track changes over time. No login or API key.

Pricing

from $1.89 / 1,000 listings

Rating

0.0

(0)

Developer

Cliqto Media

Cliqto Media

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Security

Limited permissions

Share

Enter a city, an Airbnb search link or a room link, and get listings with nightly and total stay prices, discounts, ratings, calendars and reviews from Airbnb. You get a table for CSV, Excel or API use, plus an area price summary. You do not need a login or an API key. A run with 10 listings takes about 35 seconds and costs about $0.03.

Airbnb Scraper turns a city or link into a table of listings with stay prices, discounts, calendars and reviews

Table of contents

What it does

This Actor has five modes:

  • Search listings: find listings by city, area, map box or Airbnb search link.
  • Listing details: get full data for room links you already have.
  • Calendar: get open days and minimum stay, one row per day. Daily prices are optional.
  • Reviews: get review text, rating, date and language, one row per review.
  • Track changes: compare a search with your last run and mark each listing as new, changed, unchanged, missing or removed.

Each run also saves an area summary with average price, median price, average rating and superhost share.

Good fit

  • You compare stay prices for the same dates in a city or area.
  • You check open days and minimum stay for a set of listings.
  • You read reviews to learn what guests like or dislike.
  • You track new listings and price changes on a schedule.

It is not a good fit if you need host contact details, guest identities or actual booking numbers. The Actor has no contact or profile fields, and Airbnb does not show bookings.

๐Ÿ‘‰ Try it now: open the input form

How it works

  1. You enter a location or links and choose your dates. If you set no dates, the Actor uses 3 nights starting 30 days from today.
  2. The Actor reads public Airbnb pages. It makes about 1 request per second, and you need no proxy or account.
  3. It saves one row per listing, day or review. You can open the rows in the table, export them, or get them by API.

๐Ÿ‘‰ Try it now: open the input form

Quick start

Input form with Mode, Location and Maximum listings marked

  1. Open the Input tab and keep Mode on Search listings (box 1).
  2. Keep Pattaya in Location, or type your city (box 2).
  3. Keep Maximum listings at 10 (box 3).
  4. Click Start.
  5. When the run ends, open the Output tab (box 5).

Output table with listing prices, currency, rating and review count

  1. Check pricePerNight, totalPrice, currency, rating and reviewsCount (box 6).

Expected result: about 10 rows in about 35 seconds, for about $0.03.

๐Ÿ‘‰ Try it now: open the input form

Use cases

Buyer jobInput pathOutput entityKey fieldsNext integration
Compare prices in an areasearch, location, checkIn, checkOutListing rows, area summarypricePerNight, totalPrice, originalPrice, ratingCSV or Excel for price analysis
Compare one area on several datessearch, location, dateRangesOne row per listing and date range, summary per periodcheckIn, checkOut, totalPriceGoogle Sheets through API
Check open days for a listingcalendar, listingUrls, calendarMonthsDay rowsdate, available, minNights, pricePerNightYour pricing sheet
Learn from guest reviewsreviews, listingUrls, maxReviewsReview rowstext, rating, createdAt, languageA text analysis tool
Track an area over timemonitor, location, snapshotName, onlyChangesChanged listing rowschangeStatus, pricePerNight, fetchedAtApify Schedule with Slack or Notion summary

๐Ÿ‘‰ Try it now: open the input form

Input

No field is required by the form. Search listings and Track changes search Pattaya when you give no location or link. Listing details, Calendar and Reviews stop with INVALID_INPUT if you give no links.

Input fields

FieldPlain nameTypeRequiredDefault / prefillAllowed valuesEffectExampleRecommendation
modeModestringNosearchsearch, details, calendar, reviews, monitorChooses what the run collectssearchStart with search
locationLocationstringNoPrefill PattayaCity or areaSearches this placePattayaUse a city name
maxItemsMaximum listingsintegerNo101 or more. Tested up to 1000 fast rows and 240 full rowsRow limit across all inputs and date ranges, shared evenly between searches. In reviews mode it is also the default review limit per listing10Test with 10 first
locationQueriesMore locationsstring arrayNoEmptyCity or area namesAdds more places to search["Phuket"]maxItems is shared evenly between places
startUrlsAirbnb search or room linksURL listNoEmptyAirbnb linksUses the link, its dates and its filters. Country links change to www.airbnb.com[{ "url": "https://www.airbnb.com/s/Pattaya/homes" }]Good when you already set filters on Airbnb
listingUrlsListing linksstring arrayFor details, calendar and reviews, unless you use startUrlsEmptyRoom links with a numeric IDReads these listingshttps://www.airbnb.com/rooms/1770178382370231943Use for known listings
includeDetailsInclude full listing detailsbooleanNotruetrue, falsetrue adds description, amenities, rules and more, but runs slowerfalseUse false for large runs
checkInCheck-in datestringNo30 days from todayYYYY-MM-DDStart of the stay2026-12-04Set both dates, or the run stops with INVALID_INPUT
checkOutCheck-out datestringNo3 nights after check-inYYYY-MM-DDEnd of the stay2026-12-07Must be later than checkIn
dateRangesMultiple date rangesobject arrayNoEmpty{checkIn, checkOut}One listing row per date range. Each range gets an even share of maxItems[{"checkIn":"2026-12-04","checkOut":"2026-12-07"}]Raise maxItems to get more rows per range
adultsAdultsintegerNo21 or moreGuests used for the price2Use your real group size
childrenChildrenintegerNo00 or moreGuests used for the price1Optional
infantsInfantsintegerNo00 or moreGuests used for the price1Optional
petsPetsintegerNo00 or moreGuests used for the price1Optional
currencyCurrencystringNoUSD48 currency codesCurrency of pricesEURKeep one currency per comparison
localeLanguagestringNoenAirbnb language codeLanguage of listing text, when Airbnb has itdeSee Limits
priceMinMinimum nightly pricenumberNoEmpty0 or moreSearch filter50Check the currency
priceMaxMaximum nightly pricenumberNoEmpty0 or moreSearch filter200Check the currency
minBedsMinimum bedsintegerNoEmpty0 or moreSearch filter2Optional
minBedroomsMinimum bedroomsintegerNoEmpty0 or moreSearch filter1Optional
minBathroomsMinimum bathroomsnumberNoEmpty0 or moreSearch filter1Optional
roomTypesRoom typesstring arrayNoEmptyEntire home/apt, Private room, Shared room, Hotel roomSearch filter["Private room"]Optional
amenitiesAmenity IDsinteger arrayNoEmptyAirbnb amenity IDsSearch filter[4]Copy IDs from an Airbnb search link
instantBookInstant Book onlybooleanNoOfftrue, falseSearch filtertrueOptional
superhostSuperhosts onlybooleanNoOfftrue, falseSearch filtertrueOptional
boundingBoxMap areaobjectNoEmptyneLat, neLng, swLat, swLngSearches inside this box. Set location too{"neLat":12.97,"neLng":100.92,"swLat":12.88,"swLng":100.85}Use it for one area of a city
splitMapSplit large map searchesbooleanNotruetrue, falseSplits a large area when Airbnb shows only part of ittrueKeep it on
calendarMonthsCalendar monthsintegerNo00 to 12. Calendar mode uses 1 when 0Months of days to read3See the cost note below
calendarStartDateCalendar startstringNoCheck-in date or todayYYYY-MM-DDFirst calendar day2026-12-01Optional
calendarEndDateCalendar endstringNoEmptyYYYY-MM-DD, within 12 monthsLast calendar day2027-02-28Optional
includeDailyPricesQuote each available datebooleanNofalsetrue, falseGets a price for each day that allows check-in. SlowertrueUse for short periods
maxReviewsReviews per listingintegerNo00 or more. Reviews mode uses maxItems when 0Review limit per listing50Keep 0 in search if you do not need reviews
reviewSortReview orderstringNoMOST_RECENTMOST_RECENT, MOST_RELEVANT, HIGHEST_RATING, LOWEST_RATINGOrder of reviewsMOST_RECENTKeep it with reviewsSince
reviewsSinceReviews sincestringNoEmptyYYYY-MM-DDKeeps newer reviews only2026-01-01Stops early only with most recent order
snapshotNameSnapshot namestringNodefaultLetters, numbers and dashes, up to 63Name of the saved historypattaya-weeklyUse one name per tracked search
onlyChangesReturn only changesbooleanNofalsetrue, falseSaves only rows that changedtrueGood for schedules
outputFormatOutput formatstringNonestednested, flatKeeps nested objects or flattens themflatUse flat for spreadsheets
maxResultsMaximum results (compatibility)integerNoEmpty1 or moreOther name for maxItems. It wins if you set both10Use maxItems
deliveryConnectorSend results to (optional)connectorNoEmptyYour Slack or Notion connectorSends a short summarySee Send resultsOptional
deliveryTargetNotion page or channel (optional)stringNoEmptySlack channel ID or Notion page linkPlace for the summaryC0123456789Optional

Interacting settings

WhenInput AInput BEffective behaviorExampleCost/result effect
Search speedincludeDetails: truemaxItemsReads each listing page, about 2.3 seconds per listing100 listings take about 4 minutesSame price per row, more time
Fast searchincludeDetails: falsemaxItemsSkips listing pages1000 listings take 3.5 to 4.5 minutesFewer fields, same price per row
Many dates or placesdateRanges or locationQueriesmaxItemsEach search gets an even share. Rows a search does not use move to the next one, not back to an earlier one2 ranges and maxItems: 10 give 5 rows per rangeA run can save fewer rows than maxItems when a later search has few listings
Links with datesstartUrlscheckInDates in the link are used for that linkA link with December datesPrices follow the link dates
Calendar in a listingmode: search or detailscalendarMonthsAdds days inside the listing rowcalendarMonths: 1Pays calendar per month, no calendar-day
Calendar rowsmode: calendarcalendarMonthsSaves one row per day12 months give about 362 rowsPays calendar and calendar-day, about $1.00 per listing for a year
Daily pricesincludeDailyPricescalendarMonthsAsks a price only for days that are open and allow check-in12 of 28 days got a pricePays daily-price only for a price received
Reviews in searchmode: searchmaxReviewsSaves reviews as their own rowsmaxReviews: 20Pays review-page and review
Review date stopreviewsSincereviewSortStops early only with MOST_RECENTOther orders read furtherOther orders can cost more pages
Trackingmode: monitoronlyChangesUnchanged listings get no row3 rows and 7 checksUnchanged listing costs check, not result

Input examples

{ "mode": "search", "location": "Pattaya", "maxItems": 10 }

Expected output: about 10 listing rows with full details in about 35 seconds. Cost note: about $0.03.

{
"mode": "search",
"location": "Pattaya",
"maxItems": 1000,
"includeDetails": false
}

Expected output: up to 1000 rows without description, amenities and rules. Limit or cost note: about $2.87. Set the run timeout to 600 seconds. With the default 300 seconds, most tests finished 1000 rows in 3.5 to 4.5 minutes. One run on an early build stopped at 931 rows.

Calendar with daily prices

{
"mode": "calendar",
"listingUrls": ["https://www.airbnb.com/rooms/1443378340723218199"],
"calendarMonths": 1,
"includeDailyPrices": true
}

Expected output: one row per day. Days that allow check-in also get a price. Cost note: our test had 28 days and 12 prices, took about 35 seconds and cost about $0.11.

Reviews

{
"mode": "reviews",
"listingUrls": ["https://www.airbnb.com/rooms/1230348487323461725"],
"maxReviews": 60
}

Expected output: up to 60 review rows, in 5 to 8 seconds. Cost note: about $0.16 for 60 reviews.

Track changes

{
"mode": "monitor",
"location": "Pattaya",
"maxItems": 10,
"snapshotName": "pattaya-weekly",
"onlyChanges": true
}

Expected behavior: the first run marks all rows as new. Later runs save only rows that changed. Cost note: first run about $0.03. A later run with 2 changes and 8 unchanged listings cost about $0.017.

๐Ÿ‘‰ Try it now: open the input form

Output

The table has three views: Listings and prices, Calendar and Reviews. Use recordType to tell the rows apart in API data.

Output fields

Listing rows (recordType: listing):

FieldMeaningTypeCan be empty?Example / enumSource / notes
listingIdAirbnb listing IDstringNo1770178382370231943Room link
urlListing linkstringNohttps://www.airbnb.com/rooms/...Airbnb
titleListing titlestringRarelyDeluxe Room Edge Condo...Airbnb
roomTypeRoom typestringYesEntire home/aptFull details only
propertyTypeProperty typestringYesEntire rental unitAirbnb
personCapacityGuests allowedintegerYes2Full details only
bedrooms, beds, bathroomsRoom countsnumberYes1Filled for about 9 in 10 listings
pricePerNightPrice per night for these datesnumberYes59.24Empty when Airbnb gives no price
averageTotalPerNightTotal divided by nightsnumberYes59.24Calculated
totalPriceStay price shown by AirbnbnumberYes177.73For the listed dates and guests
originalPricePrice before a discountnumberYes275Only when Airbnb shows it. In tests, about 1 in 5 listings
priceLabelPrice text from AirbnbstringYes$178 for 3 nightsAirbnb
priceBreakdownLines of the pricearrayYes[{"label":"3 nights x $59.24","amount":177.73}]Can show discounts
priceIncludesTaxesTaxes in the pricebooleanOftentrueEmpty when Airbnb does not say
feesCleaning, service and taxobjectValues often empty{"cleaning":null,"service":null,"taxes":null}Empty in all 341 test listings
currencyCurrency codestringNoUSDYour input
checkIn, checkOutStay datesstringNo2026-12-04Your input or the default
ratingAverage ratingnumberYes5Empty with no rating yet
reviewsCountNumber of reviewsintegerYes5Airbnb
lat, lngMap positionnumberRarely12.9311Airbnb's public map position
hostIsSuperhostSuperhost markbooleanYesfalseFull details only
descriptionListing textstringYesA stylish condominium...Full details only
photosPhoto linksarrayRarely["https://a0.muscache.com/..."]Airbnb
amenitiesAmenitiesarrayYes[{"group":"Bathroom","title":"Hair dryer","available":true}]Full details only
houseRulesHouse rulesarrayYes[{"title":"No pets"}]Full details only
categoryRatingsRatings by categoryarrayYes[{"category":"cleanliness","rating":5}]Full details only
ratingDistributionShare per stararrayYes[{"stars":5,"share":1}]Full details only
cancellationPolicyCancellation textstringYesFree cancellation for 24 hours...Full details only
calendarDays inside the listingarrayYesSee calendar rowsWith calendarMonths
occupancyShare of closed daysobjectYes{"observedDays":28,"unavailableDays":16,"unavailableShare":0.57,"method":"unavailable_calendar_days","isBookingOccupancy":false}Closed days, not bookings
reviewSummaryCommon review wordsobjectYes{"collectedCount":44,"topics":[{"term":"clean","mentions":9}]}With maxReviews
availableOpen for these datesbooleanYestrueWhen known
changeStatusChange since last runstringYesnew, changed, unchanged, missing_from_search, reappeared, removed, unknownTrack changes mode
statusRow problemstringYesnot_found, partialA listing that could not be fully read
calendarStatusCalendar problemstringYespartialPart of the calendar is missing
sourceSource namestringNoAirbnbFixed
fetchedAtTime of readingstringNo2026-11-04T03:19:56.515ZUTC

Calendar rows (recordType: calendar):

FieldMeaningTypeCan be empty?Example / enumSource / notes
dateCalendar daystringNo2026-12-07Airbnb
available, bookableDay is openbooleanRarelytrueAirbnb
availableForCheckIn, availableForCheckOutCheck-in or check-out allowedbooleanRarelytrueAirbnb
minNights, maxNightsStay limitsintegerYes3Airbnb
pricePerNight, totalPricePrice for a stay from this daynumberYes87.89With includeDailyPrices
averageTotalPerNight, fees, priceNightsMore price datamixedYes3With a price. priceNights is the minimum stay or 1
priceStatusPrice resultstringNoavailable, unavailable, error, not_requestedOnly available is paid

Review rows (recordType: review):

FieldMeaningTypeCan be empty?Example / enumSource / notes
reviewIdReview IDstringNo1808350674592173172Airbnb
textReview textstringRarelyClean room, great host...Contacts are removed from free text
ratingStarsnumberYes5Airbnb
languageText languagestringYesenAirbnb
createdAtReview datestringYes2026-10-31T01:09:59.000ZAirbnb

Output entities and surfaces

SituationDataset/API/KVS/live viewResult shapeUser action
Normal itemDataset, RUN_SUMMARY, MARKET_SUMMARYRows, status: succeededUse the rows
Domain-emptyEmpty dataset, summaries savedRun SUCCEEDED, stopReason: NO_RESULTS, or NO_CHANGES in monitorChange the filters, or do nothing for no changes
PartialSaved rows, partial: trueCost limit: SUCCEEDED, stopReason: CHARGE_LIMIT. Timeout: SUCCEEDED, stopReason: DEADLINE, unfinished inputs in unprocessedInputs. A timeout with no saved rows is FAILEDUse saved rows. Raise the limit or timeout
Technical failureSummaries, maybe saved rowsRun FAILED with stopReasonCheck Troubleshooting and run again later

MARKET_SUMMARY has listingCount, quoteCount, pricedListingCount, averagePricePerNight, medianPricePerNight, averageRating, superhostShare, currency, partial, coverageComplete and one block per date range in periods. It is a summary of the returned rows, not of the whole market.

RUN_SUMMARY has status, stopReason, mode, listingCount, savedItems, checkedListings, searchPages, requests, calendarDays, reviews, skippedListings, skippedSample, dailyPriceErrors, partial, coverageComplete and delivery. A search stopped by maxItems has coverageComplete: false. A run stopped by its timeout also has unprocessedInputCount and unprocessedInputs, up to 25 entries. The first entry can be the input in progress when the run stopped, so rows already saved from it stay in the Dataset and are charged.

Output example

Lists are shortened here.

{
"recordType": "listing",
"listingId": "1770178382370231943",
"url": "https://www.airbnb.com/rooms/1770178382370231943",
"title": "Deluxe Room Edge Condo Pattaya Infinity Pool 31F",
"roomType": "Entire home/apt",
"propertyType": "Entire rental unit",
"personCapacity": 2,
"bedrooms": 1,
"beds": 1,
"bathrooms": 1,
"pricePerNight": 59.24,
"averageTotalPerNight": 59.24,
"totalPrice": 177.73,
"originalPrice": null,
"priceLabel": "$178 for 3 nights",
"priceIncludesTaxes": null,
"fees": { "cleaning": null, "service": null, "taxes": null },
"priceBreakdown": [{ "label": "3 nights x $59.24", "amount": 177.73 }],
"currency": "USD",
"checkIn": "2026-12-04",
"checkOut": "2026-12-07",
"rating": 5,
"reviewsCount": 5,
"lat": 12.9311,
"lng": 100.8823,
"hostIsSuperhost": false,
"amenities": [
{
"group": "Bathroom",
"title": "Hair dryer",
"available": true,
"description": null
}
],
"houseRules": [{ "title": "Up to 2 overnight guests", "description": null }],
"categoryRatings": [{ "category": "cleanliness", "rating": 5 }],
"cancellationPolicy": "Free cancellation for 24 hours. Cancel before November 27 for a partial refund. Review this host's full policy for details.",
"calendar": null,
"occupancy": null,
"reviewSummary": null,
"available": true,
"changeStatus": null,
"source": "Airbnb",
"fetchedAt": "2026-11-04T03:19:56.515Z"
}

Send results to Slack or Notion

Pick your connector in the optional deliveryConnector field. After the run saves its data, the Actor posts a short summary (up to 25 rows and a link to the full dataset) there. Put a Notion page link or a Slack channel ID in deliveryTarget: in Notion every run is added on top of that one page, so your workspace does not fill up with new pages. A delivery error never fails the run and costs nothing extra. Connect a service once in Apify Console โ†’ MCP connectors.

Use case โ†’ fields

Use caseFields to read
Price comparisonpricePerNight, totalPrice, originalPrice, priceBreakdown, currency, checkIn, checkOut
Listing qualityrating, reviewsCount, categoryRatings, hostIsSuperhost, amenities
Availabilitydate, available, availableForCheckIn, minNights, occupancy.unavailableShare
Guest opiniontext, rating, createdAt, language, reviewSummary.topics
MonitoringchangeStatus, pricePerNight, fetchedAt

๐Ÿ‘‰ Try it now: open the input form

Pricing

Pricing unit

You pay per event. The main event is one saved listing row (result). The developer pays Apify platform usage, so you pay only the events below.

EventWhen it is chargedNo plan or FreeGold and above
resultOne saved listing row$0.0027$0.00189
search-pageOne search page$0.0016$0.00112
first-listing-pageFirst listing link in details, calendar or reviews mode$0.0018$0.00126
listing-pageEach more listing link in those modes$0.0002$0.00014
calendarOne calendar month$0.0018$0.00126
calendar-dayOne saved day row in calendar mode$0.0027$0.00189
daily-priceOne day that got a price$0.0027$0.00189
review-pageOne page of up to 50 reviews$0.0005$0.00035
reviewOne saved review row$0.0027$0.00189
checkOne listing checked with no paid row (unchanged, missing, removed or not found)$0.0012$0.00084
input-checkA run stopped by invalid input$0.0016$0.00112

Bronze saves 10%. Silver saves 20%. Gold, Platinum and Diamond save 30%.

  • Zero results: a search with no rows pays for the search page it read, about $0.0016.
  • Filter with no match: same as zero results.
  • Unchanged monitor: each unchanged listing pays check when onlyChanges is on.
  • Partial and failed runs: you pay for the work done before the stop. Pages are charged before the request, so a page that fails can still count.

Cost examples

Prices are for no plan or Free, from our test runs.

ScenarioInput scopeExpected item/event countBase chargeOptional chargeStop/cap behavior
Small searchPattaya, 10 listings, about 35 s10 result, 1 search-page$0.0286NoneStops at maxItems
Medium searchBangkok, 100 full listings, about 4 min100 result, 7 search-page$0.2812NoneStops at maxItems
Large fast searchPattaya, 1000 listings, about 3.5 min, timeout 600 s1000 result, 92 search-page$2.8472NoneDefault 300 s can stop near 900 rows
Listing details1 link, 3 to 6 s1 first-listing-page, 1 result$0.0045NoneOne row per link
Calendar for a year1 listing, 12 months, 9 to 12 s1 first-listing-page, 12 calendar, 362 calendar-day$1.0008NoneLimit with calendarEndDate
Calendar with prices1 listing, 1 month, about 35 s1 first-listing-page, 1 calendar, 28 calendar-day$0.079212 daily-price: $0.0324Total $0.1116
Reviews1 listing, 60 reviews, 5 to 8 s1 first-listing-page, 2 review-page, 60 review$0.1648NoneStops at maxReviews
Monitor, later run10 listings, 4 changed, about 33 s4 result, 6 check, 1 search-page$0.0196NoneUnchanged rows are not saved
No matchFilter with no listings, 2 to 5 s1 search-page$0.0016NoneEnds with NO_RESULTS
Invalid inputWrong link, a few seconds1 input-check$0.0016NoneRun FAILED with INVALID_INPUT

Set Maximum cost per run when you start a run to cap your spend. The run then stops with saved rows and stopReason: CHARGE_LIMIT.

๐Ÿ‘‰ Try it now: open the input form

Limits

  • Prices: a price is a quote for your dates and guests at the time of the run. It is not a booking guarantee.
  • Fees: cleaning, service and tax values stay empty when Airbnb does not show them. They were empty in all 341 listings we tested. Discounts appear in priceBreakdown and originalPrice when Airbnb shows them.
  • Taxes: priceIncludesTaxes is often empty.
  • Occupancy: unavailableShare is the share of closed days. A host can block days, so it does not prove bookings.
  • Language: fast search and part of the listing text stay in English. Price breakdowns are in English.
  • Time: speed changes from run to run. At the default timeout of 300 seconds, 100 full listings finished in about 4 minutes, and 1000-listing fast runs finished in 3.5 to 4.5 minutes. One run on an early build stopped at 931 rows after 286 seconds. With a timeout of 600 seconds, the same fast search finished 1000 rows in 3.5 to 4 minutes. A 240-listing run with full details took about 9 minutes, with a timeout of 900 seconds. Raise the timeout for runs above about 100 full listings or 900 fast listings.
  • Size: 12 MiB per response, 512 MiB and 100000 requests per run. The Actor makes about 1 request per second and up to 3 attempts per request. A failed search page stops the run with the rows already saved. A listing that cannot be read is skipped without a charge for its row, and the run goes on; 3 failures in a row, or a block, stop the run.
  • Tracking: run one monitor at a time per snapshotName. The saved history holds up to 512 KiB, and old entries are dropped first, so a listing can show as new again. A listing is missing_from_search only after a search with complete coverage, and removed only after its page returns 404 or 410.
  • Privacy: the Actor has no host or guest profile or contact fields, and it removes contact details from free text. Review text stays as written, so a guest can mention a host's first name in it.
  • Airbnb terms: Airbnb's terms restrict automated collection and grant no data reuse licence. This Actor is not made or approved by Airbnb. Check that your use fits the terms and your local law.

๐Ÿ‘‰ Try it now: open the input form

API, export and integrations

  • API: start a run and read rows with the Apify API. The Actor ID is cliqtomedia/airbnb-scraper.
  • Export: download rows as CSV, Excel, JSON or XML from the Output tab.
  • Scheduling: use Apify Schedules with Track changes mode.
  • Webhooks: use Apify webhooks to act when a run ends.
  • SDK and MCP: use the Apify client or the MCP server below.
curl -X POST "https://api.apify.com/v2/acts/cliqtomedia~airbnb-scraper/run-sync-get-dataset-items" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"location":"Pattaya","maxItems":10}'

Use with AI agents (MCP)

This Actor works with the Apify MCP server at https://mcp.apify.com?tools=cliqtomedia/airbnb-scraper.

  • Minimal input: {"location":"Pattaya","maxItems":10}
  • Key fields: title, url, pricePerNight, totalPrice, currency, rating
  • Typical run: about 35 seconds and about $0.03 for 10 listings.
  • Limits: prices are quotes for the given dates. fees values are often empty. Use includeDetails: false for large searches.

๐Ÿ‘‰ Try it now: open the input form

Troubleshooting

Run has no rows

  • Symptom: the run succeeded, and the table is empty.
  • Likely reason: stopReason is NO_RESULTS, so no listing matches your place and filters. In monitor mode, NO_CHANGES means nothing changed.
  • Check: RUN_SUMMARY, priceMin, priceMax, currency and the dates.
  • Action: remove filters or use a wider area.

Run stopped with DEADLINE

  • Symptom: the run is SUCCEEDED with partial: true, and rows are saved. With no saved rows, the run is FAILED.
  • Likely reason: the timeout ended first. One 1000-listing run on an early build stopped at 931 rows after 286 seconds. In monitor with onlyChanges, a run with no changed rows saved yet is FAILED, and its check events stay charged.
  • Check: stopReason, savedItems and unprocessedInputs in RUN_SUMMARY.
  • Action: use the saved rows, raise the timeout in the run options, or use includeDetails: false.

Run failed with INVALID_INPUT

  • Symptom: the run ends in a few seconds, with no rows.
  • Likely reason: a link is not an Airbnb link, or a needed field is missing.
  • Check: listingUrls, startUrls and the mode.
  • Action: use room links such as https://www.airbnb.com/rooms/1770178382370231943.

Run failed with another reason

  • Symptom: the run is FAILED, and partial is true or no rows are saved.
  • Likely reason: Airbnb blocked requests or changed its page data.
  • Check: stopReason and the run log.
  • Action: try a small run later. If it fails again, open an issue.

Fees or prices are empty

  • Symptom: fees values or pricePerNight are null.
  • Likely reason: Airbnb did not show them for these dates and guests.
  • Check: priceBreakdown, priceLabel and available.
  • Action: try other dates. Use totalPrice and priceBreakdown for price checks.

Some listings were skipped

  • Symptom: the run succeeded, stopReason is LISTINGS_SKIPPED, and partial is true.
  • Likely reason: a listing was removed after the search found it, or its page could not be read.
  • Check: skippedListings and skippedSample in RUN_SUMMARY. The sample has the listing ID and the reason.
  • Action: nothing, if the rows you got are enough. You don't pay a row price for a skipped listing, but work done before the failure stays paid: pages read, saved review or calendar rows, and a listing row marked partial. To retry, put the listing link in listingUrls.

Some daily prices are missing

  • Symptom: stopReason is DAILY_PRICES_INCOMPLETE, and partial is true.
  • Likely reason: Airbnb did not answer for some days.
  • Check: dailyPriceErrors in RUN_SUMMARY. These days have priceStatus set to error.
  • Action: run the listing again. You don't pay daily-price for a day without a price.

Run stopped with CHARGE_LIMIT

  • Symptom: the run succeeded with fewer rows, and partial is true.
  • Likely reason: the run reached your maximum cost.
  • Check: stopReason in RUN_SUMMARY.
  • Action: raise Maximum cost per run, or lower maxItems.

Listing shows as new again

  • Symptom: a listing you saw before has changeStatus: new.
  • Likely reason: the history reached its size limit and dropped the old entry, or you changed snapshotName.
  • Check: snapshotName and how many listings you track.
  • Action: use a separate snapshotName for each small search.

๐Ÿ‘‰ Try it now: open the input form

FAQ

Do I need an Airbnb account? No. You do not need a login, cookies or an API key.

Is the total price the final price? It is the price Airbnb shows for your dates and guests. Airbnb can change it at checkout.

Can I get host emails or phone numbers? No. The Actor does not output contact details.

How many listings can I get from one city? Set maxItems to the number you need. A large search needs more time, so raise the timeout. splitMap helps when one area has many listings.

Do I pay when nothing changed? In monitor mode with onlyChanges, you pay search-page and check, not result. That is much less than a full row.

Can I get prices for many dates? Yes. Use dateRanges for fixed stays, or Calendar mode with includeDailyPrices for each open day.

๐Ÿ‘‰ Try it now: open the input form

Support

Open a request in the Issues tab of this Actor. Include the run ID, the input mode and the error text. Do not include tokens or cookies.

๐Ÿ‘‰ Try it now: open the input form