Multi-Source ICS Calendar Merge and Duplicate-Event Publisher avatar

Multi-Source ICS Calendar Merge and Duplicate-Event Publisher

Pricing

from $4.00 / 1,000 source feed mergeds

Go to Apify Store
Multi-Source ICS Calendar Merge and Duplicate-Event Publisher

Multi-Source ICS Calendar Merge and Duplicate-Event Publisher

Merge 2 to 50 ICS feeds into one subscribable ICS file at a stable key-value record. Remove duplicate events.

Pricing

from $4.00 / 1,000 source feed mergeds

Rating

0.0

(0)

Developer

kingii98

kingii98

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Categories

Share

This Actor merges 2 to 50 public ICS feeds into one ICS file. It removes duplicate events. It writes the file to a named key-value store at a fixed record key. Subscribers add the URL once.

Input

FieldDefaultMeaning
sourcestwo public holiday feeds2 to 50 objects: url, label, optional prefix (for example [Group A]).
windowDays120Days forward to include. Maximum 365.
dedupeToleranceMinutes15Start-time tolerance for the summary rule.
calendarNameMerged calendarX-WR-CALNAME of the output file.
outputKeymerged.icsRecord key of the merged file. Keep it the same on each run.
storeNamemerged-calendarNamed key-value store.

An empty input {} runs with the defaults and succeeds.

Duplicate rules

  • Same UID in a different source, at any start time.
  • Same normalized SUMMARY (without the prefix), same normalized LOCATION, and start times within the tolerance.

The first source in the list has priority. The Actor keeps its event. A recurring event is expanded into single events. When a UID occurs more than once in the window, each instance gets a UID with a start-time suffix.

Output

  • Key-value record outputKey in the named store: the merged ICS file. Each event has an X-SOURCE-LABEL property. The file copies the VTIMEZONE parts of the sources.
  • Dataset: one row for each duplicate cluster (maximum 200): keptUid, removedUids, sourceLabels, matchReason. Then one summary row: sourcesFetched, sourcesFailed, eventsIn, eventsOut, recordUrl.
  • Default store record SUMMARY: the same summary row.

A failed source, or a run with no usable source, does not fail the run. The summary row and the status message report it. The Actor does not publish a file when no source can be fetched.

Pay-per-event

EventChargedCount
source-feed-mergedOne source feed fetched, expanded, and added to the merge.Number of sources fetched without error.
calendar-publishedOne merged file written to the stable record key. It includes the run start and the duplicate report.1 for each published file.

The Actor does not charge for a failed source. It does not charge when it publishes no file.

Subscriber downloads are not charged by the Actor

Downloads of the merged file by subscribers count as storage transfer on your Apify account. The Actor does not charge for them. The record must be publicly readable. This depends on the access setting of your storage. Confirm the setting before you share the URL.

Limits and safety

  • HTTP GET only. No browser, no proxy, no paid API, no external database.
  • Only http and https URLs. webcal:// is changed to https://.
  • The Actor rejects localhost, private, and reserved addresses. It checks every redirect. Maximum 3 redirects.
  • Maximum 2 MB for each feed, 20 s timeout, 5 parallel fetches, 5,000 event instances in total.
  • Known limit: the address check and the connection use two separate DNS lookups.

Development

uv run pytest
uv run ruff check .