Scrape Airbnb and Google Flights with Apify: What It Really Costs
What do the two Apify travel scrapers cost?
The travel pair is uneven. The Airbnb Scraper API is pay-per-event: $0.002 per full-detail listing on the Free plan, with the day-by-day availability calendar, all six rating categories and a line-by-line price breakdown inside that price, and failed listings not billed. canadesk/google-flights is a $12/month rental whose Actor record has not been modified since 2025-03-21. Both figures read from Apify's own API on 2026-10-11.
Most travel-scraping walkthroughs published in 2026 copy the price off the Actor's Store page and never check it again. This page prices both Actors from api.apify.com instead, shows the input keys they actually accept, and says plainly where the flights side falls down.
Which of the two Actors is worth running?
Airbnb Actor figures below were read from api.apify.com on 2026-10-11; flights figures on 2026-09-09.
| codepoetry/airbnb-scraper | canadesk/google-flights | |
|---|---|---|
| Pricing model | Pay-per-event since 2026-10-02 | Flat rental, $12/month, since 2024-01-05 |
| Entry cost | $0.002 per listing (Free plan) | $12/month, plus platform usage on top |
| Fields per listing | 99, calendar and ratings included | Itinerary fares only |
| Users, all time | 15 | 437 |
Rating, API (actorReviewRating) | 5.0 (1 review) | 1.0 (2 reviews; Store page shows a smoothed 4.0 from 6) |
| Actor record last modified | Active (build 2026-10) | 2025-03-21 |
| Usable on the Free plan | Yes | Trial only, 4,320 minutes (72 hours) |
The flights Actor's two rating surfaces disagree, and Apify has not reconciled them: the Store page shows a smoothed display rating over a slightly larger review set, while api.apify.com returns the raw actorReviewRating. The gap is widest there, where the raw figure is 1.0 from two reviews.
Five monthly users and eighteen months without a change to the Actor record is not proof that the flights Actor is abandoned. Apify publishes other signals, and they point in both directions: api.apify.com reports a raw review rating of 1.0 from two reviews, but also 72 runs in the last 30 days with 64 of them successful, a run started on 2026-09-09, and isDeprecated: false. Treat the whole picture as a reason to run the 72-hour trial before you subscribe, not as a reason to skip it outright.
If you only need one of the two, the Airbnb side is the one that stands up. Flight fares are also the harder target: they are quoted per-itinerary, they expire in minutes, and no scraper can hold a price. For fare tracking specifically, an airline API or a fare-alert service will beat a scraped snapshot on both freshness and cost.
What does the Airbnb Scraper API actually charge per 1,000 listings?
The Airbnb Scraper API charges per event, and only for what comes back: $0.002 per full-detail listing on the Free plan, $0.0005 per search-result card in mode=search, $0.0003 per guest review if you switch reviews on, and $0.0001 per run start. Walking search-result pages costs nothing, and listings that fail to fetch are returned as error records and not billed. Prices are tiered by your Apify Store discount tier, which is not the same thing as your plan name — Free plan maps to the FREE tier, Starter to BRONZE, Scale to SILVER, Business to GOLD.
| Your plan | Discount tier | Per listing | Per 1,000 listings | Search card / 1,000 | Review / 1,000 | Actor start |
|---|---|---|---|---|---|---|
| Free ($0) | FREE | $0.002 | $2.00 | $0.50 | $0.30 | $0.0001 |
| Starter ($19) | BRONZE | $0.0015 | $1.50 | $0.50 | $0.30 | $0.0001 |
| Scale ($199) | SILVER | $0.0011 | $1.10 | $0.50 | $0.30 | $0.0001 |
| Business ($999) | GOLD | $0.00075 | $0.75 | $0.50 | $0.30 | $0.0001 |
Schedule live since 2026-10-02, read from api.apify.com/v2/store?username=codepoetry on 2026-10-11. The listing price includes everything the detail page carries: the 99 measured fields, the day-by-day availability calendar with occupancy rate, all six rating categories, host details, amenities and house rules. There is no "enriched" surcharge — host data ships in the base event.
Reviews are the one optional extra. include_reviews defaults to off; when you enable it, reviews bill at $0.30 per 1,000 (default cap 50 per listing, max_reviews_per_listing: 0 for unlimited).
What the leading alternative charges
tri_angle/airbnb-scraper is the most-used Airbnb Actor on the Store (17,553 users, 911,821 runs, 4.55 from 15 reviews — API, 2026-10-11) and it is also pay-per-event: $0.004 per listing on the Free plan — twice the Airbnb Scraper API's rate on the same tier — $0.002 on Starter, $0.0015 on Scale, $0.001 on Business. Two structural differences matter more than the rate card:
- No availability calendar in the base event. The base listing event ($0.004 on Free) has no calendar field; a separate "enriched listing" event ($0.006 on Free) exists, but the pricing tab does not itemize which fields it adds, and day-by-day calendars are not among the output fields the README lists.
- Reviews live in a separate Actor (airbnb-reviews-scraper, $5.00 per 1,000 on Free), so review jobs mean two Actors and two datasets to join.
One pricing trap worth knowing even if you never run it: the tri_angle Store page still shows "$1.25 per 1,000 results" in its body copy — a pay-per-result rate retired on 2025-08-07 — and "from $1.00 / 1,000 listings" in its header, which is the Business-tier rate. A Free-plan account pays $0.004. When the Pricing tab and the README disagree, the API wins.
What a month of monitoring one city costs
Set max_listings to 0 and the Airbnb Scraper API returns everything a query finds, merging multiple location_queries into one dataset. A city-wide sweep is neighbourhood queries; take twelve of them, run weekly, each finding a few hundred listings:
| Listings/month | Free ($0.002) | Starter ($0.0015) | Scale ($0.0011) | |
|---|---|---|---|---|
| 12 queries, weekly | ~12,400 | ~$24.80 | ~$18.60 | ~$13.64 |
| Included usage on that plan | $5 | $19 | $199 |
On the Free plan, $5 of included usage buys 2,500 full-detail listings. Starter's $19 covers roughly two and a half of the four weekly sweeps. Scale is the first plan where a weekly city sweep sits comfortably inside the included usage, and by then you are paying $199 for headroom you may not need. Most people should run fewer neighbourhoods more often rather than the whole city weekly.
For pay-per-event Actors, Apify states that most include platform usage in the event price but some bill it separately, so read the Actor's own pricing section before you scale. The mechanics are covered in how Apify pay-per-event pricing works and the plan-level numbers in the Apify pricing breakdown.
How do you run the Airbnb Scraper API?
- Open the Actor: codepoetry/airbnb-scraper and sign in.
- Fill in
location_queries— one entry per neighbourhood or city, for exampleGothic Quarter, Barcelona; multiple queries merge into one dataset. Or passstart_urlsto scrape specific listings by URL or ID. - Set
check_inandcheck_outinYYYY-MM-DDform. Without them the Actor prices one night roughly a month out, which is not comparable across runs. - Cap the run with
max_listingsbefore your first real sweep — it defaults to 20, and0returns everything the queries find. This is the field that stops a mis-typed location from billing you for thousands of listings. - Run it, then export from Storage as JSON, CSV, Excel, or HTML. The dataset ships with seven pre-built tabs (Listings, Availability, Ratings & reviews, Host, Location, Amenities & rules, Description & photos) plus the raw all-fields view.
Input keys, taken from the Actor's published input schema on 2026-10-11:
| Field key | What it does |
|---|---|
location_queries (needed in practice) | Array of location strings to search; cities, regions or neighbourhoods. Supply this or start_urls. |
start_urls | Scrape specific Airbnb room URLs or listing IDs instead of searching |
mode | full (default, opens every property page) or search (card-level fields at a quarter of the price) |
check_in / check_out | Stay window, YYYY-MM-DD |
adults, children, infants, pets | Guest composition |
price_min, price_max, currency | Price filters and output currency (28 verified currencies) |
min_beds, min_bedrooms, min_bathrooms | Property filters |
room_types, property_types, min_rating | Listing-type filters; min_rating also drops unrated listings |
max_listings | Hard cap on results, and on your bill. Default 20; 0 = everything found. max_pages bounds pages (~18 listings each) |
include_reviews, max_reviews_per_listing | Opt-in guest reviews in the same run ($0.30/1,000; default cap 50 per listing, 0 = unlimited) |
calendar_months, calendar_start_month / calendar_start_year | Forward depth of the availability calendar; 0 skips it |
locale, proxy_country | Result language (18 locales) and one of 23 proxy markets |
| Field | Description | Example |
|---|---|---|
| records[].id | Airbnb listing ID | 12345678 |
| records[].url | Direct listing URL | https://www.airbnb.com/rooms/12345678 |
| records[].price.amount | Nightly rate as a sortable number, not a label string | 89 |
| records[].price.breakdown | Line-by-line price breakdown mirroring what the Airbnb page displays | [{...}] |
| records[].rating | All six rating categories (accuracy, check-in, cleanliness, communication, location, value) plus guest_satisfaction | 4.92 |
| records[].availability | Day-by-day calendar: bookable flag and min/max nights per date | [{...}] |
| records[].occupancy_rate | Occupied share of the calendar window | 0.63 |
| records[].host | Host name, id, superhost and verified flags, response rate and time | {...} |
| records[].amenities | Full amenity list plus boolean flags (wifi, kitchen, parking…) | ["Wifi", "Kitchen"] |
| summary | Run-level counts: delivered, rejected, failuresDatasetId for unbilled error records | {...} |
Key names taken from the Actor's published output schema, checked 2026-10-11. Values are illustrative; one record carries 99 fields.
{
"records": [
{
"id": "12345678",
"url": "https://www.airbnb.com/rooms/12345678",
"name": "Sunny Apartment in Gothic Quarter",
"room_type": "Entire rental unit",
"person_capacity": 4,
"is_super_host": true,
"price": { "amount": 89, "currency": "EUR", "breakdown": [], "original_price": 97 },
"rating": {
"accuracy": 4.9, "check_in": 5.0, "cleanliness": 4.9,
"communication": 4.95, "location": 5.0, "value": 4.8,
"guest_satisfaction": 4.92
},
"host": { "id": "987654", "name": "Marta", "is_superhost": true },
"availability": [{ "date": "2026-11-01", "bookable": true, "min_nights": 2 }],
"occupancy_rate": 0.63,
"amenities": ["Wifi", "Kitchen"],
"reviews": []
}
],
"summary": { "delivered": 240, "rejected": 8, "failuresDatasetId": "abc123" }
}
What to know before you average anything: price.amount is the nightly rate for your check_in/check_out window as a sortable number, so unlike card-level scrapers the same field means the same thing on every row. Airbnb itself no longer itemises cleaning and service fees, so the breakdown array mirrors exactly what the listing page displays — no more, no less. Hold check_in/check_out constant across scheduled runs or the series is not comparable.
The same neighbourhood-level price banding is what makes the Zillow Actors useful for the same research, and the scheduling pattern is identical to ecommerce price monitoring.
Is the Google Flights Actor worth $12 a month?
Real monthly cost is not $12. It is:
- $12/month rental, plus
- platform usage on top — Apify is explicit that rental Actors charge normal platform usage in addition to the rental fee, unlike most pay-per-event Actors, plus
- a paid plan, because the Free plan lists rented Actors as "Limited (trial only)".
So the honest floor is $31/month: Starter at $19 plus the $12 rental, before compute. The Actor ships a 4,320-minute trial (72 hours), which is enough to find out whether it still returns fares for your routes. Run that trial first.
Running it
- Set
operation. The Actor exposes distinct operations: search airports, get flights by airport name, and get flights by IATA code. The Actor's own README recommends the IATA operation for performance. - Set
departureIATA(one code) andarrivalIATA(an array, so you can compare several destinations in one run). - Set dates with
departureDate/arrivalDateinYYYY-MM-DD, or usedepartureDateRng/arrivalDateRngfor a flexible window. - Filter with
stops,seatclass,airlines,alliances,maxPrice,currency. - Turn on
proxy, and raisedelayandretries. The README's own instruction is to always use a proxy and wait long enough between requests. Skip this and you will get partial runs.
The output is flatter at the top than most travel guides imply, with the flight detail nested one level down. The README's published example returns:
{
"departureAirport": "Los Angeles International Airport",
"arrivalAirport": "Harry Reid International Airport",
"currency": "CAD",
"price": 60,
"details": {
"airlines": { "name": ["Alaska"] },
"legs": [
{
"departureAirport": "LAX",
"departureTime": "2024-03-17T07:20:00-07:00",
"arrivalAirport": "LAS",
"arrivalTime": "2024-03-17T08:35:00-07:00",
"airlineName": "AS",
"flightNumber": "702",
"aircraftNumber": "73J"
}
],
"duration": "01:15"
},
"departureDate": "2024-03-18",
"returnDate": false
}
Note where the identifiers live. The two top-level departureAirport and arrivalAirport keys hold full airport names, not the codes you sent in — but the IATA codes are still there, nested at details.legs[].departureAirport and details.legs[].arrivalAirport. Read the legs array and you do not need your own name-to-code lookup; read only the top level and you do.
How many runs can you have going at once?
Apify's own two pages disagree about the Free plan, and have not been reconciled as of 2026-09-09:
| Source, checked 2026-09-09 | Free | Starter | Scale | Business |
|---|---|---|---|---|
| apify.com/pricing | 5 | 32 | 128 | 256 |
| docs.apify.com/platform/limits | 25 | 32 | 128 | 256 |
They agree on every paid plan. The disagreement is confined to the Free row. Until Apify reconciles them, build for 5 — if the real limit turns out to be 25 you lose nothing, and if you assume 25 and it is 5, your scheduled sweep silently queues instead of running.
How do you join flights and stays into one trip cost?
This is the one thing a combined travel page can offer, and it is fiddlier than it sounds, because the two Actors do not share a key.
- Keep your own IATA-to-city table. The flights Actor speaks
arrivalIATA; the Airbnb Actor speakslocation_queriesstrings. Nothing mapsLAStoLas Vegas, NVfor you. The flights output does carry the IATA code back, but only insidedetails.legs[]— the top-levelarrivalAirportis a full airport name — so plan on reading the nested legs when you join runs together. - Align the date windows.
departureDatemust equalcheck_in, andarrivalDate(the return leg) must equalcheck_out. Store both on every row. - Normalise currency. The flights Actor returns a
currencyfield alongside a numericprice; the Airbnb Actor takes acurrencyinput. Set them to the same value at input time rather than converting afterwards. - Multiply, do not decode. The Airbnb Scraper API returns
price.amountas the nightly rate for your window on every row, so stay total isprice.amount × nights— there is no qualifier to resolve. - Sum, then alert. Trip cost equals flight
price× travellers plus the stay total. Threshold on that number, not on either half. - Stamp every row with the run timestamp. Without it you have a snapshot, not a series. Set both Actors up as Apify tasks and schedules so inputs stay identical between runs.
What changed, and when
| Date | Actor | Change |
|---|---|---|
| 2024-01-05 | canadesk/google-flights | Rental price set to $12/month; still current |
| 2024-10-01 | tri_angle/airbnb-scraper | Pay-per-result rate set to $0.00125 — the origin of the "$1.25 per 1,000" figure still in the README |
| 2025-03-21 | canadesk/google-flights | Last modification to the Actor record |
| 2025-08-07 | tri_angle/airbnb-scraper | Pay-per-result retired, replaced by pay-per-event |
| 2026-08-11 | tri_angle/airbnb-scraper | Event rates revised |
| 2026-08-25 | tri_angle/airbnb-scraper | Current rate schedule takes effect |
| 2026-10-02 | codepoetry/airbnb-scraper | Pay-per-event pricing goes live: $0.002/listing on Free, calendar and reviews included in the event model |
An earlier version of this page quoted $1.25 per 1,000 results for the tri_angle Airbnb Actor. That was correct when written and stopped being correct on 2025-08-07. Corrected 2026-09-09 against the Apify API; the page now runs on the Airbnb Scraper API, re-verified 2026-10-11.
Limits worth knowing before you scale
- A scrape is a snapshot. Fares move within minutes and Airbnb prices move with availability. Trends require schedules, not bigger single runs.
max_listingsdefaults to 20. A first run that looks "small" is the default doing its job; set it to0for a full sweep and know what you are buying before you do. Failed listings come back as error records and cost nothing.- Locale changes the answer. Currency, availability and even which listings appear vary by
locale. Record the inputs you used alongside the outputs. - Terms and law. Read each platform's terms. Public-data collection for internal research is common practice; commercial redistribution frequently is not. See is web scraping with Apify legal for orientation — it is not legal advice.
Ready to price your own run? Start with the Airbnb Scraper API's free run and cap it with max_listings — a 100-listing test costs $0.20 on the Free plan and tells you the real yield for your city before you commit to a plan. New to the platform? Start at the how-to-use-apify index.
The Airbnb Scraper API charges $2.00 per 1,000 full-detail listings on the Free plan, $1.50 on Starter, $1.10 on Scale, and $0.75 on Business, plus $0.0001 per run start. Guest reviews are opt-in at $0.30 per 1,000 and search-result cards cost $0.50 per 1,000 in mode=search. Failed listings are not billed. Rates read from api.apify.com on 2026-10-11.
tri_angle/airbnb-scraper, the most-used Airbnb Actor on the Store, charges $4.00 per 1,000 listings on the Free plan — twice the Airbnb Scraper API's rate on the same tier — falling to $1.00 per 1,000 on Business. Its base listing event has no calendar field (an "enriched listing" event at $6.00 per 1,000 on Free exists but does not itemize what it adds), and reviews require its separate airbnb-reviews-scraper Actor at $5.00 per 1,000 on Free. Its README still shows a $1.25-per-1,000 figure that was retired in 2025; the Pricing tab and the API carry the live numbers.
The Airbnb Scraper API has no per-query ceiling: max_listings defaults to 20 for safety, and setting it to 0 returns everything the query finds, with max_pages bounding the pages walked (about 18 listings per page). Multiple location_queries merge into one dataset, so a city-wide sweep is one run.
The Airbnb Scraper API yes — pay-per-event Actors draw on your $5 of included monthly usage, which buys 2,500 full-detail listings. The Google Flights Actor effectively no: it is a monthly rental, and the Free plan lists rented Actors as trial only. Its trial is 4,320 minutes, about 72 hours.
Apify's API shows the Actor record was last modified on 2025-03-21, with 437 users all time and 5 in the last 30 days, and a raw review rating of 1.0 from 2 reviews (the Store page separately shows a smoothed 4.0 from 6 reviews). That is a low-activity signal rather than proof of abandonment, and it sits alongside friendlier API figures: 72 runs in the last 30 days, 64 of them successful. Use the 72-hour trial to confirm it still returns fares for your routes before subscribing.
For rental Actors like Google Flights, yes — platform usage is charged in addition to the $12 rental. For pay-per-event Actors, Apify states most include platform usage in the event price but some bill it separately, so check that Actor's own pricing section.
Apify's two pages disagree. apify.com/pricing says 5 concurrent runs on Free; docs.apify.com/platform/limits says 25. Both checked 2026-09-09, and they agree on every paid plan. Plan for 5 until Apify reconciles them.
It depends on jurisdiction, use case, and each platform's terms. Collecting publicly visible data for internal research is common; redistributing it commercially often is not. See our scraping legality guide for orientation. This is not legal advice.
Yes. Run the Airbnb Actor as a scheduled task with identical inputs, and write the run timestamp onto every row. Without a timestamp column you have a pile of snapshots rather than a time series, and the same check-in and check-out dates must be held constant or the prices are not comparable.