---
title: "ICS Filter"
description: "Keep only the events you want from one .ics calendar. Filter by a date range, a keyword, a category or a status, drop cancelled events, then download the smaller calendar to import, or the events it removed as their own file. On this page, the calendar is read in your browser and nothing is uploaded."
url: https://findutils.com/convert/ics-filter/
category: convert
---

# ICS Filter

Keep only the events you want from one .ics calendar. Filter by a date range, a keyword, a category or a status, drop cancelled events, then download the smaller calendar to import, or the events it removed as their own file. On this page, the calendar is read in your browser and nothing is uploaded.

**Use this tool:** [ICS Filter](https://findutils.com/convert/ics-filter/)

## Programmatic access

- REST id `ics-filter`: POST https://api.findutils.com/api/tools/ics-filter/execute (reference: https://findutils.com/api/ics-filter/)
- MCP tool `ics_filter` on https://mcp.findutils.com (reference: https://findutils.com/mcp/ics-filter/)
- Data: The REST API and the MCP tool are a separate path from this page: a call sends the input you include to FindUtils over HTTPS, where it is processed and the result returned. FindUtils does not store that input, and logs the request without its content.

## Why Filter an ICS File?

A calendar export holds everything: years of events, every cancelled meeting, every personal appointment next to the work ones. When you only need this quarter, or only one project, or a file small enough for an importer to accept, the manual route is deleting events one by one in a calendar app, or converting to a spreadsheet, filtering there and rebuilding the .ics by hand. This page keeps the events that match your filters and writes them back as a valid calendar with every property intact, ready to import.

## Filter Tips

- Dates are inclusive: From 2026-10-01 To 2026-12-31 keeps everything that touches any of those days, including an event that starts on 30 September and ends on 1 October.
- A recurring series is kept whole when at least one of its occurrences falls in the range. Its rule is copied as it is; use ICS Expand RRULE when you need one event per occurrence.
- A moved or cancelled occurrence of a kept series stays with it, so the occurrence stays moved or cancelled after the import.
- Category accepts several names separated by commas; an event with any one of them matches.
- An event with no STATUS line matches only the Any status.

## Frequently Asked Questions

### How do I keep only the events in a date range?

Set From and To and leave the other filters empty. Both days are inclusive: an event is kept when any part of it touches one of the days in the range, so an event from 23:00 on 30 September to 01:00 on 1 October is kept by a range that starts on 1 October. Either end can stay empty for an open range, such as everything from 1 July on.

### How are recurring events filtered?

A recurring series is kept or removed as a whole, judged by its main event. The date range keeps it when at least one of its occurrences falls in the range, worked out from its RRULE, RDATE and EXDATE, or when one of its moved occurrences does. The rule itself is copied unchanged, never expanded. To get one event per occurrence inside the range instead, use [ICS Expand RRULE](https://findutils.com/convert/ics-expand-rrule/).

### Where does the keyword search look?

In the SUMMARY, DESCRIPTION and LOCATION of each event, ignoring upper and lower case. The keyword is matched as one piece of text, so "team lunch" matches "Team lunch on Friday" but not "lunch with the team". Attendees, organizers and categories are not searched; use the Category filter for categories.

### What does Drop cancelled events do?

It removes every entry with STATUS:CANCELLED, which some calendar apps keep in their exports after a meeting is cancelled. It is on by default and works alone, with no other filter set. A cancelled occurrence of a series that is kept stays with the series, because removing it would bring that occurrence back. Choosing Cancelled as the status keeps only the cancelled entries, and Drop cancelled events is then ignored.

### How do the category and status filters work?

Category keeps an event whose CATEGORIES include one of the names you type, separated by commas and matched without regard to case. Status keeps an event whose STATUS is Confirmed, Tentative or Cancelled; an event with no STATUS line matches only Any. Google Calendar writes STATUS on its events; other apps may leave it out.

### Will the filtered file import into Google Calendar, Apple Calendar and Outlook?

Yes. The output is a complete VCALENDAR in the standard format, with the header of the source, a PRODID naming this tool, the VTIMEZONE blocks the kept events use, and every kept event with all its properties as read: UID, recurrence rules, alarms, attendees and descriptions. Because the UIDs are unchanged, importing it into the calendar it came from updates the existing events rather than adding copies.

### What is removed.ics?

It is the events the filters removed, written as a calendar of their own with the same header and the time zones they use. Keep it as a record of what the trim left out, or import it somewhere else. The line under the output says how many events each filter removed.

### Why does the page say no entry matched?

Because every event failed at least one filter, and an empty calendar is not worth downloading. The message counts the reasons, for example how many events fell outside the dates and how many were cancelled. Widen the date range, shorten the keyword, or clear a filter, and the counts update as you type.

### Is my calendar uploaded?

Not on this page. The file is read with the browser's File API and filtered in the tab, and the page makes no request with the calendar text, which you can confirm in the browser's network panel. The page never fetches a calendar URL either. The REST API and MCP tool are a separate path: a call sends the input you include to FindUtils over HTTPS, where it is processed and the result returned. FindUtils does not store that input, and logs the request without its content.

### Can I filter a calendar from a script?

Yes. The same code runs on the FindUtils REST API and MCP server as the ics_filter tool. Send the .ics text as input with any of from, to, keyword, category, status and drop_cancelled; read the filtered calendar from ics and the removed one from removed_ics, with the counts per filter beside them.

## Related Tools

- [ICS Expand RRULE](https://findutils.com/convert/ics-expand-rrule/)
- [Split ICS](https://findutils.com/convert/split-ics/)
- [Merge ICS](https://findutils.com/convert/merge-ics/)
- [ICS Diff](https://findutils.com/convert/ics-diff/)
- [ICS to CSV](https://findutils.com/convert/ics-to-csv/)
- [ICS to JSON](https://findutils.com/convert/ics-to-json/)
- [CSV to ICS](https://findutils.com/convert/csv-to-ics/)
