iCalendar Parser API

Parse .ics calendars into JSON events, expand RRULE recurrences in a date range, convert time zones, merge calendars and find free slots.

GETPOSThttps://apibox.io.vn/v1/ics-parse

Send iCalendar text as ics (or as a raw text/calendar body), a file, a url / urls (public feeds, webcal:// accepted, up to 5 per request) or calendars (an array of texts or {url} objects) to merge several calendars. Each event comes back with summary, description, location, URL, status, transparency, categories, organizer and attendees, alarms, start / end in the target timezone (ISO 8601 with offset; YYYY-MM-DD for all-day events, end exclusive), start_utc / end_utc, duration and the original time zone. Times with a TZID use the IANA zone, or the calendar’s own VTIMEZONE when the name is not an IANA one (Outlook), a few Windows names are mapped, and floating times are read in the target zone.

With from / to (dates are inclusive, read in the target zone) recurring series are expanded: RRULE with FREQ (minutely to yearly), INTERVAL, COUNT, UNTIL, BYDAY with ordinals (1FR, -1SU), BYMONTHDAY, BYMONTH, BYYEARDAY, BYHOUR / BYMINUTE / BYSECOND, BYSETPOS and WKST, plus RDATE, EXDATE and moved or cancelled instances (RECURRENCE-ID). Recurrences keep their wall-clock time across daylight-saving changes. Without a range, events are returned as stored with their rrule (expand=true lists the first occurrences); limit caps the output (default 1000, max 5000).

free_slots=true merges the busy time of all calendars (cancelled and transparent events ignored, all-day events only with all_day_busy=true) and returns the free intervals inside working hours (work_start, work_end, work_days as ISO weekdays, min_minutes) for up to 62 days (default: 7 days from today). Nothing is stored.

Parameters

NameInTypeRequiredDefault
icsbodystringnoiCalendar text (or send it as a raw text/calendar body).
filebodyfileno.ics file (multipart).
urlbody|querystringnoPublic .ics / webcal feed URL; urls for several (max 5).
calendarsbodyarraynoSeveral calendars to merge: texts or {url} / {ics} objects (max 10).
timezonebody|querystringnoTarget IANA zone. Default: the calendar’s X-WR-TIMEZONE, else UTC.
frombody|querystringnoRange start (YYYY-MM-DD or ISO date-time); turns expansion on.
tobody|querystringnoRange end (a date is inclusive). Default: 1 year after from.
expandbody|querybooleannoExpand recurrences (default: on when a range is given).
limitbody|querynumberno1000Maximum events returned (1–5000).
include_cancelledbody|querybooleannofalseKeep events with STATUS:CANCELLED.
free_slotsbody|querybooleannofalseAlso return free time within working hours.
work_startbody|querystringno09:00Working day start (HH:MM).
work_endbody|querystringno17:00Working day end (HH:MM).
work_daysbody|querystringno1-5ISO weekdays, 1 = Monday … 7 = Sunday, e.g. 1-5 or 1-6.
min_minutesbody|querynumberno30Shortest free slot returned (5–1440).
all_day_busybody|querybooleannofalseCount all-day events as busy.

Example

curl -X POST "https://apibox.io.vn/v1/ics-parse" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"ics":"BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//APIBox//demo//VI\r\nX-WR-CALNAME:Nhóm dự án\r\nX-WR-TIMEZONE:Asia/Ho_Chi_Minh\r\nBEGIN:VEVENT\r\nUID:standup@example.vn\r\nDTSTART;TZID=Asia/Ho_Chi_Minh:20261116T090000\r\nDTEND;TZID=Asia/Ho_Chi_Minh:20261116T093000\r\nRRULE:FREQ=WEEKLY;BYDAY=MO,WE,FR;COUNT=12\r\nSUMMARY:Họp đầu ngày\r\nLOCATION:Phòng 3\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:demo@example.vn\r\nDTSTART:20261117T070000Z\r\nDTEND:20261117T083000Z\r\nSUMMARY:Demo khách hàng\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n","from":"2026-11-16","to":"2026-11-17","free_slots":true,"work_start":"08:30","work_end":"17:30"}'

Response

{
  "calendars": [
    {
      "index": 0,
      "source": "ics",
      "name": "Nhóm dự án",
      "timezone": "Asia/Ho_Chi_Minh",
      "prodid": "-//APIBox//demo//VI",
      "method": null,
      "events": 2
    }
  ],
  "timezone": "Asia/Ho_Chi_Minh",
  "range": {
    "from": "2026-11-16T00:00:00+07:00",
    "to": "2026-11-18T00:00:00+07:00"
  },
  "expanded": true,
  "count": 2,
  "truncated": false,
  "events": [
    {
      "uid": "standup@example.vn",
      "summary": "Họp đầu ngày",
      "start": "2026-11-16T09:00:00+07:00",
      "end": "2026-11-16T09:30:00+07:00",
      "start_utc": "2026-11-16T02:00:00.000Z",
      "end_utc": "2026-11-16T02:30:00.000Z",
      "all_day": false,
      "duration_minutes": 30,
      "timezone": "Asia/Ho_Chi_Minh",
      "location": "Phòng 3",
      "recurring": true
    },
    {
      "uid": "demo@example.vn",
      "summary": "Demo khách hàng",
      "start": "2026-11-17T14:00:00+07:00",
      "end": "2026-11-17T15:30:00+07:00",
      "start_utc": "2026-11-17T07:00:00.000Z",
      "end_utc": "2026-11-17T08:30:00.000Z",
      "all_day": false,
      "duration_minutes": 90,
      "timezone": "UTC"
    }
  ],
  "free_slots": {
    "work_hours": {
      "start": "08:30",
      "end": "17:30",
      "days": [
        1,
        2,
        3,
        4,
        5
      ]
    },
    "min_minutes": 30,
    "busy": [
      {
        "start": "2026-11-16T09:00:00+07:00",
        "end": "2026-11-16T09:30:00+07:00"
      },
      {
        "start": "2026-11-17T14:00:00+07:00",
        "end": "2026-11-17T15:30:00+07:00"
      }
    ],
    "slots": [
      {
        "start": "2026-11-16T08:30:00+07:00",
        "end": "2026-11-16T09:00:00+07:00",
        "minutes": 30
      },
      {
        "start": "2026-11-16T09:30:00+07:00",
        "end": "2026-11-16T17:30:00+07:00",
        "minutes": 480
      },
      {
        "start": "2026-11-17T08:30:00+07:00",
        "end": "2026-11-17T14:00:00+07:00",
        "minutes": 330
      },
      {
        "start": "2026-11-17T15:30:00+07:00",
        "end": "2026-11-17T17:30:00+07:00",
        "minutes": 120
      }
    ],
    "total_free_minutes": 960
  }
}

Use cases

  • Show a Google, Outlook or iCloud calendar feed on your website as JSON
  • List every occurrence of recurring meetings or classes in a month
  • Find common free time across several people’s calendars
  • Import .ics files into your own booking or HR system

FAQ

Why do some recurring events look one hour off?

They do not: occurrences keep their local time in the event’s time zone, so the UTC time moves when daylight saving starts or ends, as calendar apps do.

Which RRULE parts are not supported?

BYWEEKNO and FREQ=SECONDLY; such series return only their first instance with a warning.

Is my calendar stored?

No. Calendars are parsed in memory for the request and discarded; URL feeds are fetched each time.

Related APIs

Start with 1,000 free requests every month. Get free API key →