Airbnb Availability Calendar Scraper
Pricing
from $2.50 / 1,000 results
Airbnb Availability Calendar Scraper
Scrape day-by-day availability for any Airbnb listing. Returns up to 12 months of calendar data per request: available/booked status, minimum and maximum stay nights, check-in and check-out eligibility, and the nightly price string when visible. Fast HTTP-only scraper, no browser needed.
Pricing
from $2.50 / 1,000 results
Rating
0.0
(0)
Developer
Crikit
Maintained by CommunityActor stats
0
Bookmarked
9
Total users
6
Monthly active users
15 days ago
Last modified
Categories
Share
Scrape day-by-day availability for any Airbnb listing. Returns up to 12 months of calendar data per request: available/booked status, min and max stay nights, check-in and check-out eligibility, and the nightly price string when visible. HTTP-only — no headless browser, ~300 ms per listing.
What you give it
| Field | Type | Required | Notes |
|---|---|---|---|
startUrls | array of URLs | one of these | Full Airbnb listing URLs https://www.airbnb.com/rooms/<id>. |
listingIds | array of strings | one of these | Bare numeric listing IDs if you already have them. |
months | integer (1-12) | no | How many months to fetch. Defaults to 12 (single request per listing). |
startMonth | integer (1-12) | no | First month. Defaults to current UTC month. |
startYear | integer | no | First year. Defaults to current UTC year. |
currency | string | no | ISO 4217 (e.g. USD, EUR). Defaults to USD. Affects priceFormatted. |
locale | string | no | e.g. en-US, en-GB. Defaults to en-US. |
maxItems | integer | no | Hard cap on total items. 0 means unlimited. |
proxyConfiguration | object | no | Apify Proxy enabled by default (default group is sufficient). |
What you get back
One row per listing. Each row contains a days array with one record per calendar day.
Top-level fields (per listing)
listingId— Airbnb numeric IDurl— canonical listing URLcurrency,requestedMonths,startMonth,startYearfirstDate,lastDate— YYYY-MM-DD bounds of the calendar slicetotalDays,availableDays,blockedDaysscrapedAt— ISO timestampdays[]— see below
Per-day fields (in days[])
calendarDate— YYYY-MM-DDavailable— booleanavailableForCheckin— boolean (some dates are only allowed as checkout)availableForCheckout— booleanminNights,maxNights— host stay-length constraints for that datebookable— nullable boolean (null on blocked days; true on available days that pass policy)priceFormatted— pretty price string like "$120" when available, null on blocked days
Pricing (pay-per-event)
| Tier | Per calendar result | Actor start (per GB) |
|---|---|---|
| FREE | $0.0025 | $0.0075 |
| BRONZE | $0.0022 | $0.0070 |
| SILVER | $0.0020 | $0.0060 |
| GOLD | $0.0018 | $0.0050 |
| PLATINUM | $0.0016 | $0.0045 |
| DIAMOND | $0.0014 | $0.0040 |
A "calendar result" is one full listing with up to 365 days of data. There is no per-day or per-event surcharge — pricing data is bundled in.
Billing note. Every record pushed to the default dataset counts as one result. The scraper pushes a warning row when a listing returns no data (invalid ID, removed listing, hotel-style multi-unit) or when input cannot be parsed; those rows are billed at the same per-result rate. This keeps the run from silently returning zero items.
Worked examples (FREE tier, 512 MB memory => 0.5 GB start charge):
- 100 listings: 100 × $0.0025 + $0.0075 × 0.5 = $0.254
- 1,000 listings: 1000 × $0.0025 + $0.0075 × 0.5 = $2.504
- 10,000 listings: 10000 × $0.0025 + $0.0075 × 0.5 = $25.004
Measured local coverage (build 0.1)
| Field | Days tested | Extracted | Coverage |
|---|---|---|---|
| calendarDate | 1825 | 1825 | 100.0% |
| available | 1825 | 1825 | 100.0% |
| availableForCheckin | 1825 | 1825 | 100.0% |
| availableForCheckout | 1825 | 1825 | 100.0% |
| minNights | 1825 | 1825 | 100.0% |
| maxNights | 1825 | 1825 | 100.0% |
Reliability: 5/5 listings returned full 365-day calendars. Zero value mismatches against ground truth.
Cloud variance (3 runs across 2+ hours) will be added after first deploy.
Limits to be aware of
- The persisted GraphQL hash can rotate (Airbnb operational change). The actor self-heals: on
PersistedQueryNotFound, it scrapes a fresh hash from the live listing page and retries. priceFormattedis alwaysnullfor blocked days (true negative — that's Airbnb's API, not a scraper miss).bookableisnullfor blocked days (same reason).- The endpoint returns max 12 months per request. Set
monthsandstartMonth/startYearto scan further out. - "Property-level" calendars (multi-unit hotels) are not returned; the default config skips them. Open an issue if you need this.
FAQ
Why is this cheaper than the alternative actor on Apify? We charge once per listing instead of separately for "actor-start", "result", and "available-date price" events. The math comes out ~25-40 % cheaper on typical workloads.
Does it need login? No.
Does it work on Airbnb Plus / Luxe? Yes — same endpoint shape.
Can I batch a portfolio? Yes. Pass any number of URLs in startUrls. Concurrency is 10, so 1,000 listings ≈ a few minutes.
Changelog
0.1— Initial release.
