Airbnb Availability Calendar: Check-In Times & House Rules avatar

Airbnb Availability Calendar: Check-In Times & House Rules

Pricing

$19.99/month + usage

Go to Apify Store
Airbnb Availability Calendar: Check-In Times & House Rules

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

Scraper Engine

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

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

FieldWhat it does
includeHouseRulesOn 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.
arriveByTimeEmpty 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.
selfCheckInOnlyOff 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):

FieldTypeDefaultNotes
urlsarray of strings["https://www.airbnb.com/rooms/860663943931949474"]Room URLs or numeric listing IDs. Bulk supported.
listingUrlstringSingle URL/ID, alternative to urls.
startDatestring (YYYY-MM-DD)2025-12-01Stale on purpose — inherited from the base actor. Set your own dates.
endDatestring (YYYY-MM-DD)2025-12-31Same note as above.
enrichWithPricingbooleanfalseAdds 12 pricing/booking columns from the base's single startDate call (unchanged behaviour).
proxyConfigurationobject{"useApifyProxy": false}No proxy → datacenter → residential (3 retries), then sticky residential.

New fields (this variant), appended strictly after the base six:

FieldTypeDefaultNotes
includeHouseRulesbooleantrueSee above.
arriveByTimestring""24-hour HH:MM, e.g. 23:00.
selfCheckInOnlybooleanfalseSee 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:

FieldTypeDescriptionPresence, 15 probed listings
Check-In Windowstring | nullVerbatim string, e.g. "Check-in: 3:00 PM - 8:00 PM" or "Check-in after 4:00 PM".~14/15
Checkout Timestring | nullVerbatim string, e.g. "Checkout before 10:00 AM".15/15
Self Check-In Methodstring | nullOne 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 Hoursstring | nullVerbatim window, e.g. "10:00 PM - 6:00 AM".7/15
House Rulesarray 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 Rulesstring | nullThe 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 Notesarray 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 / endDate default 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, Taxes etc. are the answer from the single startDate call, repeated on every row — not per-date truth. This variant does not fix that.
  • No currency or locale input — both are inferred from the URL's country domain, same as the base. A .de or .co.uk URL returns German or British-English rule text; the stable machine-readable half is the icon code inside House Rules / Safety And Property Notes, not the English title text.
  • A delisted listing can return HTTP 200 with an empty sections[] (Airbnb PERMISSION_DENIED, fatal: false). The base's existing blank-row behaviour on that case is unchanged; this variant's own extraction is guarded and emits null/[] 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 full POLICIES_DEFAULT payload — the seven new columns fill even on that listing while Booking says 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.