Airbnb Availability Calendar: Check-In Times & House Rules
Pricing
$19.99/month + usage
Airbnb Availability Calendar: Check-In Times & House Rules
Airbnb Availability Calendar: Check-In Times & House Rules Extract calendar data including available dates, blocked dates, nightly prices, and minimum stay rules. Useful for rental market research, competitor monitoring, price analysis, and tracking booking availability across Airbnb listings.
Pricing
$19.99/month + usage
Rating
0.0
(0)
Developer
Scraper Engine
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Apify actor that fetches Airbnb listing availability — one row per check-in date per listing — for the listing URLs you paste, plus what the base's own single request already carries and discards: the hours you can check in and must check out, whether there's a lockbox or keypad so you can let yourself in, the quiet hours, the house's own rules, the host's own written rules, and the safety and property warnings Airbnb prints on the listing.
Built for a relocation coordinator, corporate-travel booker or group organiser holding a shortlist: the base answers is this date bookable and what does it cost; this variant answers if it's bookable, can we physically use the place — arrive at our hour, let ourselves in, live with the rules and the disclosed hazards.
⚠️ Read this before you file a bug: these columns describe the LISTING, not the date
Measured live 2026-08-16, verified 5/5. Two date windows six months apart, same listings: the seven new columns were byte-identical while Airbnb's own available answer flipped on three of the five listings. On a 31-day range the seven columns repeat verbatim on all 31 rows — because Airbnb serves house rules, check-in hours and safety notes once per listing, not once per date. This is not a bug and it is not softened anywhere in this file or the store page. It is also why the two new filters operate at listing level: a listing is kept or dropped as a whole, with all of its date rows, never row by row.
What it scrapes
Airbnb listing pages (airbnb.com/rooms/<id> and country variants) via the same StaysPdpSections GraphQL endpoint the site itself uses — the same single request per listing the base already makes. No second scraper, no search API, no host profile.
New in this variant
| Field | What it does |
|---|---|
includeHouseRules | On by default. Adds POLICIES_DEFAULT to the request (already present on a priced run; added on the cheap availability-only run) so the actor returns check-in/checkout times, self check-in method, quiet hours, house rules, host's own written rules and safety/property notes — zero extra HTTP requests. |
arriveByTime | Empty by default (nothing dropped). Set a 24-hour HH:MM arrival time and any listing whose printed check-in window closes before that time is dropped from the run. Listings with an open-ended window ("Check-in after 3:00 PM", no closing hour) are always kept — there's nothing to compare. |
selfCheckInOnly | Off by default on purpose. Keeps only listings that report a lockbox, keypad, smart lock or building-staff check-in. Measured 2026-08-16: present on 22/30 listings worldwide but only 6/15 in Barcelona/Rome/Prague — turning this on in Europe can remove most of a shortlist. |
Zero overlap with shipped variant 1 (By Guest Count & Pets)
Variant 1 varies the party (adults/children/infants/pets) and asks will Airbnb accept our booking — its answer changes Airbnb's available field. This variant never touches available at all: it reads listing-level rule text that is identical no matter what party or date is sent. Different buyer, different question, different first output column (Check-In Window vs Party Booking), zero shared input fields, zero shared output fields. The three house-rule item types that would otherwise collide with variant 1's guest-cap/pet columns (SYSTEM_FAMILY, SYSTEM_PETS, SYSTEM_NO_PETS) are excluded by icon from this variant's House Rules array.
Input
Base fields (unchanged from airbnb-availability-calendar):
| Field | Type | Default | Notes |
|---|---|---|---|
urls | array of strings | ["https://www.airbnb.com/rooms/860663943931949474"] | Room URLs or numeric listing IDs. Bulk supported. |
listingUrl | string | — | Single URL/ID, alternative to urls. |
startDate | string (YYYY-MM-DD) | 2025-12-01 | Stale on purpose — inherited from the base actor. Set your own dates. |
endDate | string (YYYY-MM-DD) | 2025-12-31 | Same note as above. |
enrichWithPricing | boolean | false | Adds 12 pricing/booking columns from the base's single startDate call (unchanged behaviour). |
proxyConfiguration | object | {"useApifyProxy": false} | No proxy → datacenter → residential (3 retries), then sticky residential. |
New fields (this variant), appended strictly after the base six:
| Field | Type | Default | Notes |
|---|---|---|---|
includeHouseRules | boolean | true | See above. |
arriveByTime | string | "" | 24-hour HH:MM, e.g. 23:00. |
selfCheckInOnly | boolean | false | See above. |
"required": [] — nothing is schema-required (inherited from the base); the actor still needs urls or listingUrl at runtime and logs an error and exits if both are empty.
Output
One dataset row per check-in date per listing. The base's 40 columns are unchanged (Listing URL, Listing ID, Check-In Date, Check-Out Date, Host, Overview, Title, Canonical URL, Room Info, Property Type, Room Rating, accuracyRating, checkinRating, cleanlinessRating, communicationRating, locationRating, valueRating, guestSatisfactionOverall, visibleReviewCount, reviewAccessibilityLabel, petsAllowed, Guest_Capacity, Location, Image URL, Meta Description, Price Breakdown Title, Price Breakdown Subtitle, Accessibility Label, Strike Through Price, Primary Price, Cleaning Fee, Service Fee, Taxes, Total Price, Booking, Bedrooms, Beds, Bathrooms, Cancellation Policy Name, Cancellation Policy Subtitles), plus 7 new columns:
| Field | Type | Description | Presence, 15 probed listings |
|---|---|---|---|
Check-In Window | string | null | Verbatim string, e.g. "Check-in: 3:00 PM - 8:00 PM" or "Check-in after 4:00 PM". | ~14/15 |
Checkout Time | string | null | Verbatim string, e.g. "Checkout before 10:00 AM". | 15/15 |
Self Check-In Method | string | null | One of 4 exact strings: "Self check-in with lockbox" / "…with keypad" / "…with smart lock" / "…with building staff". Absent means Airbnb didn't report one — it does not mean the listing has no self check-in. | 6/15 |
Quiet Hours | string | null | Verbatim window, e.g. "10:00 PM - 6:00 AM". | 7/15 |
House Rules | array of {title, subtitle, icon} | The house's own rules (during-stay / before-you-leave groups), excluding the three item types variant 1 already owns and the one promoted into Quiet Hours. | 15/15 |
Host Additional Rules | string | null | The host's own typed rules block, verbatim. Can be very long (measured up to 11,806 characters on one listing) and repeats on every date row of that listing. | 8/15 |
Safety And Property Notes | array of {title, subtitle, icon} | Airbnb's own safety/property disclosures, including "not reported" rows (e.g. no smoke alarm). Nothing filtered. | 15/15 |
Every added key is emitted on every row for shape stability: null for the four scalars, [] for the two arrays when nothing is found. Nothing is ever guessed, inferred or filled in from another listing or another date row.
Nothing here is scored, ranked or counted. No safety score, no hazard count, no risk level, no "late-arrival friendly" rating — not even a houseRuleCount. Every value is a string (or array of strings) Airbnb published, returned as published.
This actor reads the rules; it does not mine them. No email, phone number or web address is extracted from Host Additional Rules or any other field — it ships as a rule, not as a lead source.
When enrichWithPricing: false (the default), the base's own 12 pricing/booking columns (including Booking) are stripped exactly as on the base actor — the seven new columns are not in that strip list, so they remain the substantive payload on a bare run.
Also written to the key-value store under OUTPUT: the same { "<listingId>": [entries...] } object the base writes, containing only the listings that survived the two filters.
Dataset default view ("📅 By date") adds Check-In Window and Self Check-In Method to the base's 8 columns.
The two filters — listing-level, applied before charging
Both arriveByTime and selfCheckInOnly decide which listings survive, evaluated once per listing against the values already read for that listing, and applied before Actor.push_data — a filtered-out listing is never emitted and never charged. Both set → the listing must satisfy both (AND). If includeHouseRules: false while a filter is set, there is nothing to filter on: the run logs a warning once and keeps every listing rather than silently emptying the dataset. Same if arriveByTime doesn't parse as HH:MM.
arriveByTime cannot catch every listing: many print an open-ended "Check-in after 3:00 PM" with no closing hour to compare against (16 of 29 in a worldwide sample) — those always survive the filter. This actor will never claim "only listings that can let you in at 11 PM."
The Unicode trap
Every clock string Airbnb serves uses U+202F NARROW NO-BREAK SPACE between the number and AM/PM, not a normal space ("Check-in after 3:00 PM"). The arriveByTime comparison normalizes U+202F (and U+00A0, defensively) to a plain space before parsing — but the emitted Check-In Window / Checkout Time strings keep the original character exactly as Airbnb sent it.
Caveats (carried from the base, not fixed here)
startDate/endDatedefault to December 2025 — already in the past. This is the base's own default; it is not corrected, only inherited. Set your own dates.- The base's own
Booking,Total Price,Primary Price,Cleaning Fee,Service Fee,Taxesetc. are the answer from the singlestartDatecall, repeated on every row — not per-date truth. This variant does not fix that. - No
currencyorlocaleinput — both are inferred from the URL's country domain, same as the base. A.deor.co.ukURL returns German or British-English rule text; the stable machine-readable half is theiconcode insideHouse Rules/Safety And Property Notes, not the English title text. - A delisted listing can return HTTP 200 with an empty
sections[](AirbnbPERMISSION_DENIED,fatal: false). The base's existing blank-row behaviour on that case is unchanged; this variant's own extraction is guarded and emitsnull/[]for the seven new columns rather than failing the run. - The demo prefill listing (
860663943931949474) is blocked for pricing on every date window tested, but still returns a fullPOLICIES_DEFAULTpayload — the seven new columns fill even on that listing whileBookingsays unavailable.
Proxy behaviour
No proxy by default. On a block: datacenter proxy, then residential (3 retries); once residential succeeds it is reused (sticky) for every remaining request in the run — identical to the base.
Pay-per-event
One charged row (row_result) per emitted dataset row. Filtering with arriveByTime or selfCheckInOnly removes whole listings before they are pushed, so a filtered run bills less than an unfiltered one — intended, not a bug.