Short-Term Rental Multi-Channel iCal Double-Booking avatar

Short-Term Rental Multi-Channel iCal Double-Booking

Pricing

from $3.00 / 1,000 run starteds

Go to Apify Store
Short-Term Rental Multi-Channel iCal Double-Booking

Short-Term Rental Multi-Channel iCal Double-Booking

Compare the iCal exports of one rental unit. Report double bookings and unmirrored blocks.

Pricing

from $3.00 / 1,000 run starteds

Rating

0.0

(0)

Developer

kingii98

kingii98

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

7 days ago

Last modified

Categories

Share

Rental iCal Double-Booking Finder

This Actor compares the iCal exports of one rental unit. It reports two kinds of conflict:

  • overlap: two feeds both hold a reservation for the same dates. An event whose summary has "not available", "blocked", or "closed" is a block, not a reservation.
  • unmirrored_block: one feed blocks dates that start soon, and another feed of the same listing has no block for them.

The Actor uses HTTP GET only. It uses no login, browser, proxy, or paid API. Use only export URLs that you are authorized to use. The platform terms for automated use of export URLs were not checked. This is an open risk.

Input

FieldDefaultLimit
listingsone demo listing100 listings. Each has listing_id and 2 to 10 feeds (label, url).
secret_listingsemptyOptional secret JSON text. Same shape as listings.
window_days1801 to 540
min_overlap_nights11 to 540
urgent_days140 to 540

The default listing uses two public holiday feeds. A run with empty input uses these defaults and succeeds. The feed URLs contain access tokens. The Actor never writes a URL to the dataset or to the log. The input schema cannot mark the nested url field as secret. So put real export URLs in secret_listings. This field is a JSON string with the same shape as listings. The platform hides its value. If it is set, the Actor ignores listings.

Output

The dataset has two row types.

Conflict row: type = conflict, listing_id, conflict_type, feeds (labels), event_uids, start_date, end_date, nights, days_until_start.

Summary row (one for each listing): type = summary, listing_id, feeds_fetched, feeds_failed (label, HTTP status, error), conflict_count, listing_clear. listing_clear is true only if no feed failed and no conflict was found. A listing with invalid input gets a summary row with an error field.

A failed feed, an unreachable target, or zero findings never fails the run. The status message states the result.

Pay-per-event pricing

EventChargedCount
run-startedOnce at the start of each run.1
listing-checkedFor each listing with valid input, also if a feed failed.1 for each listing
conflict-foundFor each overlap or unmirrored block reported.1 for each conflict row

The Actor stops when the maximum total charge is reached.

Limits and safety

  • Feed URLs must use http or https. The Actor rejects localhost, private, and reserved addresses, also after DNS resolution and after each redirect.
  • Maximum 3 redirects, 15 s timeout for each network operation, 30 s total for each feed, 1 MB for each feed, 10 parallel fetches.
  • The parser does not expand recurring events (RRULE). It ignores cancelled events.
  • An event end date is the checkout day. Back-to-back stays are not an overlap.

Demo run cost

The default input uses the same holiday feed twice. Each holiday in the window gives one overlap row. Each row costs USD 0.02.

Development

uv run pytest
uv run ruff check .