Multi-Source ICS Calendar Merge and Duplicate-Event Publisher
Pricing
from $4.00 / 1,000 source feed mergeds
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
Maintained by CommunityActor 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
| Field | Default | Meaning |
|---|---|---|
sources | two public holiday feeds | 2 to 50 objects: url, label, optional prefix (for example [Group A]). |
windowDays | 120 | Days forward to include. Maximum 365. |
dedupeToleranceMinutes | 15 | Start-time tolerance for the summary rule. |
calendarName | Merged calendar | X-WR-CALNAME of the output file. |
outputKey | merged.ics | Record key of the merged file. Keep it the same on each run. |
storeName | merged-calendar | Named 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
outputKeyin the named store: the merged ICS file. Each event has anX-SOURCE-LABELproperty. The file copies the VTIMEZONE parts of the sources. - Dataset: one row for each duplicate cluster (maximum 200):
keptUid,removedUids,sourceLabels,matchReason. Then onesummaryrow: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
| Event | Charged | Count |
|---|---|---|
source-feed-merged | One source feed fetched, expanded, and added to the merge. | Number of sources fetched without error. |
calendar-published | One 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
httpandhttpsURLs.webcal://is changed tohttps://. - 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 pytestuv run ruff check .