Airbnb Price Scraper: Total Stay Price for Exact Dates avatar

Airbnb Price Scraper: Total Stay Price for Exact Dates

Pricing

from $4.00 / 1,000 records

Go to Apify Store
Airbnb Price Scraper: Total Stay Price for Exact Dates

Airbnb Price Scraper: Total Stay Price for Exact Dates

Export Airbnb listings with the stay total for your exact dates and guests, so you compare what a stay costs instead of the nightly rate. Airbnb's own price breakdown (cleaning, service fees, taxes where shown), currency, room IDs, ratings and links. No login.

Pricing

from $4.00 / 1,000 records

Rating

0.0

(0)

Developer

Ben

Ben

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

1

Monthly active users

21 hours ago

Last modified

Share

Get the exact Airbnb total for your check-in and check-out dates, with the price breakdown, guest count and currency on every listing. Export public Airbnb search observations for a destination, exact stay dates and guest counts. Results preserve stable room IDs, separate hotel property IDs, displayed prices, total-price labels, price breakdowns, ratings and public source links.

Use this for date-specific accommodation comparisons, repeat price observations or a property research feed. A search result is an observation from Airbnb, not a reservation, live checkout quote or complete inventory of available homes.

Compare the same stay: set both dates, guest counts and currency before repeating a price observation. Free-plan result events cost $5 per 1,000 listings until November 9, 2026, and $1.50 per 1,000 from then on, plus the start event. The displayed total is source evidence, not a guaranteed final booking price; fee coverage follows the source labels.

Why the nightly rate is not enough

People who compare Airbnb stays describe the same problem in travel forums and on Airbnb's own community board:

  • "You can't search by total price, including fees, just the base nightly rate", which "makes it difficult to compare options".
  • "One host might have a $20 cleaning fee, and another has a $250 one." On a two or three night stay that reorders the whole list.
  • Getting to the reserve button "to find a completely different price point", or ending up "with 40 browser tabs" to compare a few homes.
  • "If I see a large cleaning fee I should be able to not choose that house."

This Actor gives you one row per listing for your exact dates and guests: the stay total Airbnb shows for those dates (total_price), Airbnb's own price breakdown, and the guest count and currency that price belongs to. Sort a destination by total_price instead of opening tabs. Where Airbnb lists cleaning fees, service fees or taxes as separate lines, they are in price_breakdown; where it folds them into the stay price, the breakdown shows that single line. Check the breakdown before you treat a total as tax-inclusive.

Quick start

Start with a tested example for Berlin stay prices:

Open the example and choose Try for free to copy its input into your account. Check the input and set a maximum run charge before starting; Actor fees still follow the pricing below. When the run finishes, open the run's dataset and select the Overview view and download JSON for nested fields or CSV/Excel for a table.

Your goalInput to use
A fresh two-night comparisonOmit both dates; the stay starts seven days after each run
Track the same future staySet both checkIn and checkOut
Compare guest or currency scenariosSet occupancy and EUR, USD or GBP explicitly

The real output example shows the record shape. The Python workflow saves your own export to a local JSON file with a $0.30 maximum Actor charge.

Input

{
"location": "Berlin, Germany",
"adults": 2,
"currency": "EUR",
"maxResults": 30,
"maxPages": 2
}

Supply checkIn and checkOut together as YYYY-MM-DD dates. If both are omitted, the Actor chooses a two-night stay starting seven days after the run's UTC date. Explicit stays must span 1 to 365 nights. location is a place name; Airbnb can include nearby areas, so this is not a strict municipal-boundary filter.

Adults default to two. Children, infants and pets default to zero. The requested currency can be EUR, USD or GBP. maxResults caps unique exports at 300, while maxPages bounds source pagination at 15 pages. These limits do not guarantee a particular result count. No account cookie, login or upstream scraper subscription is required.

Exact stay matching

Airbnb sometimes places “similar dates” and alternative guest-count suggestions among search results. This Actor checks each record's explicit stay overrides and excludes records whose dates or guest counts differ from the request. It also verifies that redirects preserve the requested search parameters.

The summary counts excluded alternative stays. A listing can have both an exact-stay offer and another-date suggestion; its matching observation can still be exported. The Actor does not infer that a missing listing became occupied, sold or unavailable.

Pagination follows the cursors supplied by the public page. Listing IDs are deduplicated across the embedded data and subsequent pages. A repeated page containing only previously exported IDs raises an error rather than silently charging for duplicates. Search order may change between requests, so a bounded export is not guaranteed to cover every matching property.

Example output

One complete record from a verified September 9, 2026 cloud run. Values and public media URLs can change or expire; this is a dated sample.

{
"listing_id": "28064699",
"property_id": null,
"source_location": "Berlin, Germany",
"url": "https://www.airbnb.com/rooms/28064699?check_in=2026-09-16&check_out=2026-09-18&adults=2&children=0&infants=0&pets=0&currency=EUR",
"title": "Room in Lichtenberg",
"subtitle": "King bed, 2-minute walk to S-Bahn",
"name": "Sai Gon - Private room of a vacation home",
"price_display": "€129",
"price_qualifier": "for 2 nights",
"total_price": 129,
"price_accessibility_label": "€129 for 2 nights",
"price_breakdown": {
"__typename": "DisplayPriceExplanationData",
"title": "Price details",
"subtitle": null,
"priceDetails": [
{
"__typename": "DisplayPriceExplanationLineGroup",
"items": [
{
"__typename": "DefaultExplanationLineItem",
"description": "2 nights x €64.50",
"priceString": "€129.00",
"explanationData": null
}
],
"renderBorderTop": false,
"collapsable": null
}
]
},
"currency": "EUR",
"check_in": "2026-09-16",
"check_out": "2026-09-18",
"adults": 2,
"children": 0,
"infants": 0,
"pets": 0,
"rating": null,
"review_count": null,
"coordinates": {
"__typename": "Coordinate",
"latitude": 52.50571,
"longitude": 13.51949
},
"image_urls": [
"https://a0.muscache.com/im/pictures/83d047de-14a9-455e-a8e9-30b995698fe0.jpg",
"https://a0.muscache.com/im/pictures/c2d7af5a-ae09-4251-a7c0-d0bfe2afd94c.jpg",
"https://a0.muscache.com/im/pictures/43380c02-908b-45d7-8200-61da273804ec.jpg",
"https://a0.muscache.com/im/pictures/0da7c2e7-ae4a-47bb-af8e-0b711c41d0ac.jpg",
"https://a0.muscache.com/im/pictures/c4ee3272-295d-4090-ab3e-621a1fb591dd.jpg",
"https://a0.muscache.com/im/pictures/7a344792-9d48-4e7d-8afd-6a36545be6e5.jpg"
],
"badges": [
"Superhost"
],
"matches_requested_stay": true,
"search_url": "https://www.airbnb.com/s/Berlin--Germany/homes?checkin=2026-09-16&checkout=2026-09-18&adults=2&children=0&infants=0&pets=0&currency=EUR&query=Berlin%2C+Germany",
"location_query": "Berlin, Germany",
"source_page": 1,
"scraped_at": "2026-09-09T20:13:09.965783+00:00"
}

Prices and identities

FieldMeaning
listing_idThe stable room/listing ID used in the public /rooms/ URL.
property_idSeparate hotel property ID when supplied; never substituted for the room ID.
price_displayOriginal source display price, including its currency symbol.
price_qualifierOriginal source label, such as total or for 2 nights.
total_priceParsed displayed stay price when the source says total or names the exact requested number of nights and the display matches the requested currency. Otherwise null. Source rounding and fee coverage still apply.
price_breakdownSource explanation, including fees, taxes and room-type disclaimers when exposed.
check_in, check_out, guest fieldsThe requested exact stay carried into the output and listing link.
matches_requested_stayThe source result has no conflicting date or occupancy override; not booking confirmation.

The dataset also contains title, subtitle, localized name, rating, review count, approximate source coordinates, image URLs, badges, search URL, source page and UTC extraction time. source_location preserves Airbnb's resolved destination separately from your location query. The parser reads the primary search results and excludes unrelated recommendation sections. Coordinate precision comes from Airbnb; do not treat it as an exact property address.

During September 9, 2026 verification, the Berlin example included The Social Hub Berlin Mitte with a displayed €262 total. Its source breakdown exposed two nights and taxes/fees, while its hotel property ID differed from the bookable room ID. Both identities are preserved. Rates change and the same result may no longer be available when you rerun the example.

Currency is the requested display currency. A value that cannot be safely parsed remains in the original display fields with a null numeric total. The Actor does not convert currencies, divide a total into an invented nightly rate, or calculate a checkout total from incomplete fee data.

Run summary and failure handling

The Output tab links to the dataset and SUMMARY. Inspect pages read, exported records, duplicates, alternative stays excluded and the stop reason. Complete-market coverage is never claimed. A missing public data payload, changed request parameters or repeated pagination page produces an explicit failure; previously saved records can remain in the dataset.

If a source page returns valid records but all are alternative stays, the run may export none. This is different from a blocked page or an empty JavaScript shell, which fails. If the source stops exposing a field, optional fields remain null instead of receiving invented values.

Pricing and workflows

Until November 9, 2026 the Free price is $0.005 per exported listing plus a $0.00005 start at 512 MB, so thirty exported listings cost $0.15005 before Store plan discounts; per 1,000 listings, Bronze is $4.50, Silver $4.25, and Gold, Platinum and Diamond are $4.00. From November 9, 2026 the Free price is $0.0015 per exported listing, thirty listings cost $0.04505, and per 1,000 listings Bronze is $1.35, Silver $1.275, and Gold, Platinum and Diamond are $1.20. Start costs $0.000045 on Bronze, $0.0000425 on Silver and $0.000040 on Gold or higher. The Store pricing panel and actual run usage are authoritative.

Filtered alternatives and duplicate IDs do not create result events. The maximum charge control can stop a run before its result cap, and the summary records that stop. Repeated exports should be reconciled using listing ID plus stay dates, occupancy and currency; comparing prices for different contexts can produce misleading changes.

A saved Task can provide a repeat observation through API, n8n, Make or Zapier. Keep its stay dates current. This version collects search observations; it does not extract full host profiles, complete reviews, all room types or historical availability calendars.

Python API workflow

Copy the first input JSON above into input.json and save this code as export.py. In a Python virtual environment, install apify-client with python -m pip install apify-client. Set APIFY_TOKEN to your own Apify token in your environment, then run python export.py. Keep the token out of source files and shared screenshots.

import json
import os
from decimal import Decimal
from pathlib import Path
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("benthepythondev/airbnb-search-scraper").call(
run_input=json.loads(Path("input.json").read_text(encoding="utf-8")),
max_total_charge_usd=Decimal("0.30"),
memory_mbytes=512,
timeout_secs=300,
)
if not run or run["status"] != "SUCCEEDED":
raise RuntimeError(f"Inspect the run before retrying: {run and run['id']}")
rows = list(client.dataset(run["defaultDatasetId"]).iterate_items())
Path("berlin-stays.json").write_text(
json.dumps(rows, ensure_ascii=False, indent=2), encoding="utf-8"
)
print(f"Saved {len(rows)} records from run {run['id']}")

This starts a run in your account, waits for completion and saves berlin-stays.json. The $0.30 limit bounds Actor charges; it is not a promised bill or result count. Check the printed run ID and server log if the result is shorter than expected. If your client loses its connection, inspect the existing run in Console before starting another one. See the official Python client for other run options.

For price comparisons, keep listing_id, both stay dates, all guest counts and currency together as the record key. Add scraped_at for an observation history. Use fixed future dates when tracking one stay; rolling dates compare different stays. Do not label a missing search result as booked.

For recurring runs without writing a scheduler, copy a tested public Task into your account and attach an Apify Schedule to that copy. Keep its maximum-charge limit and avoid overlapping runs when using monitor state. The Python example above is also suitable for an existing scheduler; run it from the directory containing input.json and provide the token through that scheduler's secret settings.

Questions

Are prices per night? total_price accepts an explicit total or a price for the exact requested number of nights. A nightly label or mismatched stay length leaves it null. The Actor does not invent a nightly price or add fees missing from the source.

Why is total_price null for some listings? The Actor only parses a total when Airbnb labels the price total or names the exact number of nights you requested, and the display currency matches the one you asked for. A nightly label, a different stay length or another currency leaves it null. The original price_display, price_qualifier and price_breakdown stay in the record so you can read the source wording.

Does a missing listing mean it was booked? No. A listing can drop out of a run because of ranking, the page limit or an alternative-date suggestion that was excluded. Compare runs by listing ID plus stay dates, guests and currency, and do not read an absence as a booking.

Does the total include the cleaning fee? total_price is the stay price Airbnb shows in search for your dates and guests. Whether cleaning fees, service fees and taxes are inside it follows Airbnb's own display, which differs by market; price_breakdown holds the lines Airbnb gives for that listing. The Actor adds no fee of its own and removes none.

Can I request every property in a city? The public search has its own bounds and changing order. This Actor makes no complete-inventory claim.

Zumper supports rental-listing and price-change monitoring. Furnished Finder covers furnished-rental listings with its own source and monitoring limits. Keep their rental-price observations separate from Airbnb totals for a dated stay.

Keywords: Airbnb search scraper, Airbnb total price with fees, Airbnb cleaning fee, compare Airbnb prices, exact stay dates, accommodation prices, room IDs, hotel property IDs, total prices, occupancy, price observations, vacation rentals, JSON and CSV export.