Greetings,
iCalendar is a "data format for representing and exchanging calendaring and scheduling information such as events, to-dos, journal entries, and free/busy information, independent of any particular calendar service or protocol."
The iCalendar data format is specified in RFC 5545.
An iCalendar file contains one or more iCalendar objects. Each iCalendar object has a sequence of properties followed by one or more components. Each component has properties that describe the component. A few of the components may nest other components. Each property has a value. Each property may have metadata. The metadata is called parameters. Thus, each property has a value and zero or more parameters.
What parameters (metadata) may be associated to each property? How is each component characterized; that is, what properties are used to describe each component? The purpose of this document is to answer those questions using a friendly table format, with plenty of links to appropriate sections in the specification.
This web page was auto-generated from this XML document. This XSLT program was used to transform the XML document to HTML.
Now, click on these links to see tables of iCalendar information:
Properties and their parameters
Components and their properties
Complete list of codependencies
Created by Roger Costello, September 1, 2017.
altrep | cn | cutype | delegated-from | delegated-to | dir | encoding | fmttype | fbtype | iana | language | member | non-standard | partstat | range | related | reltype | role | rsvp | sent-by | tzid | value | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
action | X | X | ||||||||||||||||||||
attach | X | X | X | X | X | |||||||||||||||||
attendee | X | X | X | X | X | X | X | X | X | X | X | X | X | |||||||||
calscale | X | X | ||||||||||||||||||||
categories | X | X | X | |||||||||||||||||||
class | X | X | ||||||||||||||||||||
comment | X | X | X | X | ||||||||||||||||||
completed | X | X | ||||||||||||||||||||
contact | X | X | X | X | ||||||||||||||||||
created | X | X | ||||||||||||||||||||
description | X | X | X | X | ||||||||||||||||||
dtend | X | X | X | X | ||||||||||||||||||
dtstamp | X | X | ||||||||||||||||||||
dtstart | X | X | X | X | ||||||||||||||||||
due | X | X | X | X | ||||||||||||||||||
duration | X | X | ||||||||||||||||||||
exdate | X | X | X | X | ||||||||||||||||||
exrule | X | |||||||||||||||||||||
freebusy | X | X | X | |||||||||||||||||||
geo | X | X | ||||||||||||||||||||
iana | ||||||||||||||||||||||
last-modified | X | X | ||||||||||||||||||||
location | X | X | X | X | ||||||||||||||||||
method | X | X | ||||||||||||||||||||
non-standard | ||||||||||||||||||||||
organizer | X | X | X | X | X | X | ||||||||||||||||
percent-complete | X | X | ||||||||||||||||||||
priority | X | X | ||||||||||||||||||||
prodid | X | X | ||||||||||||||||||||
rdate | X | X | X | X | ||||||||||||||||||
recurrence-id | X | X | X | X | X | |||||||||||||||||
related-to | X | X | X | |||||||||||||||||||
repeat | X | X | ||||||||||||||||||||
request-status | X | X | X | |||||||||||||||||||
resources | X | X | X | X | ||||||||||||||||||
rrule | X | X | ||||||||||||||||||||
sequence | X | X | ||||||||||||||||||||
status | X | X | ||||||||||||||||||||
summary | X | X | X | X | ||||||||||||||||||
transp | X | X | ||||||||||||||||||||
trigger | X | X | X | X | ||||||||||||||||||
tzid | X | X | ||||||||||||||||||||
tzname | X | X | X | |||||||||||||||||||
tzoffsetfrom | X | X | ||||||||||||||||||||
tzoffsetto | X | X | ||||||||||||||||||||
tzurl | X | X | ||||||||||||||||||||
url | X | X | ||||||||||||||||||||
uid | X | X | ||||||||||||||||||||
version | X | X |
action | attach | attendee | calscale | categories | class | comment | completed | contact | created | description | dtend | dtstamp | dtstart | due | duration | exdate | exrule | freebusy | geo | iana | last-modified | location | method | non-standard | organizer | percent-complete | priority | prodid | rdate | recurrence-id | related-to | repeat | request-status | resources | rrule | sequence | status | summary | transp | trigger | tzid | tzname | tzoffsetfrom | tzoffsetto | tzurl | url | uid | version | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
iCalendar | (0,1) | (0,n) | (0,1) | (0,n) | (1,1) | (1,1) | |||||||||||||||||||||||||||||||||||||||||||
vevent | (0,n) | (0,n) | (0,n) | (0,1) | (0,n) | (0,n) | (0,1) | (0,1) | (0,1) * | (1,1) | (0,1) | (0,1) * | (0,n) | (0,1) | (0,n) | (0,1) | (0,n) | (0,1) | (0,1) | (0,n) | (0,n) | (0,n) | (0,1) | (0,1) | (0,1) | (0,1) | (1,1) | ||||||||||||||||||||||
vtodo | (0,n) | (0,n) | (0,n) | (0,1) | (0,n) | (0,1) | (0,n) | (0,1) | (0,1) | (1,1) | (0,1) * | (0,1) * | (0,1) * | (0,n) | (0,1) | (0,n) | (0,1) | (0,n) | (0,1) | (0,1) | (0,n) | (0,n) | (0,n) | (0,1) | (0,1) | (0,1) | (1,1) | ||||||||||||||||||||||
vjournal | (0,n) | (0,n) | (0,n) | (0,1) | (0,n) | (0,n) | (0,1) | (0,n) | (1,1) | (0,1) | (0,n) | (0,n) | (0,n) | (0,1) | (0,n) | (0,n) | (0,1) | (0,1) | (0,1) | (1,1) | |||||||||||||||||||||||||||||
vfreebusy | (0,n) | (0,n) | (0,1) | (0,1) | (1,1) | (0,1) | (0,n) | (0,n) | (0,n) | (0,1) | (0,1) | (1,1) | |||||||||||||||||||||||||||||||||||||
vtimezone | (0,n) | (0,n) | (1,1) | (0,1) | |||||||||||||||||||||||||||||||||||||||||||||
standard | (0,n) | (1,1) | (0,n) | (0,n) | (0,n) | (0,n) | (0,n) | (1,1) | (1,1) | ||||||||||||||||||||||||||||||||||||||||
daylight | (0,n) | (1,1) | (0,n) | (0,n) | (0,n) | (0,n) | (0,n) | (1,1) | (1,1) | ||||||||||||||||||||||||||||||||||||||||
valarm (action=audio) | (1,1) | (0,1) | (1,1) | (0,n) | (0,n) | (1,1) | (1,1) | ||||||||||||||||||||||||||||||||||||||||||
valarm (action=display) | (1,1) | (1,1) | (1,1) | (0,n) | (0,n) | (1,1) | (1,1) | ||||||||||||||||||||||||||||||||||||||||||
valarm (action=email) | (1,1) | (0,n) | (1,n) | (1,1) | (1,1) | (0,n) | (0,n) | (1,1) | (1,1) | (1,1) |
vevent: There may be either dtend or duration, or neither. But not both.
vtodo: There may be either due or duration, or neither. But not both. If duration occurs, then dtstart must also occur.
valarm (action=audio): There must be both duration and repeat, or neither.
valarm (action=display): There must be both duration and repeat, or neither.
valarm (action=email): There must be both duration and repeat, or neither.
An iCalendar object contains one or more of these components: vevent, vtodo, vjournal, vfreebusy, vtimezone, iana-comp, x-comp.
A vevent component contains zero or more valarm components.
A vtodo component contains zero or more valarm components.
A vtimezone component contains either one or more standard component or one or more daylight components.
Value ( enumeration ): AUDIO, DISPLAY, EMAIL, x-name, iana-token
Parameters:
- non-standard ( 0, unbounded )
- iana ( 0, unbounded )
Value: uri
Parameters:
- fmttype ( 0, 1 )
- non-standard ( 0, unbounded )
- iana ( 0, unbounded )
Value: binary
Parameters:
- encoding ( 1, 1 )
- value ( 1, 1 )
- fmttype ( 0, 1 )
- non-standard ( 0, unbounded )
- iana ( 0, unbounded )
Value: cal-address
Parameters:
- cutype ( 0, 1 )
- member ( 0, 1 )
- role ( 0, 1 )
- partstat ( 0, 1 )
- rsvp ( 0, 1 )
- delegated-to ( 0, 1 )
- delegated-from ( 0, 1 )
- sent-by ( 0, 1 )
- cn ( 0, 1 )
- dir ( 0, 1 )
- language ( 0, 1 )
- non-standard ( 0, unbounded )
- iana ( 0, unbounded )
Value ( enumeration ): GREGORIAN
Parameters:
- non-standard ( 0, unbounded )
- iana ( 0, unbounded )
Value ( list ): text
Parameters:
- language ( 0, 1 )
- non-standard ( 0, unbounded )
- iana ( 0, unbounded )
Value ( enumeration ): PUBLIC, PRIVATE, CONFIDENTIAL, x-name, iana-token
Parameters:
- non-standard ( 0, unbounded )
- iana ( 0, unbounded )
Value: text
Parameters:
- altrep ( 0, 1 )
- language ( 0, 1 )
- non-standard ( 0, unbounded )
- iana ( 0, unbounded )
Value: date-time
Parameters:
- non-standard ( 0, unbounded )
- iana ( 0, unbounded )
Value: text
Parameters:
- altrep ( 0, 1 )
- language ( 0, 1 )
- non-standard ( 0, unbounded )
- iana ( 0, unbounded )
Value: date-time
Parameters:
- non-standard ( 0, unbounded )
- iana ( 0, unbounded )
Value: text
Parameters:
- altrep ( 0, 1 )
- language ( 0, 1 )
- non-standard ( 0, unbounded )
- iana ( 0, unbounded )
Value: date-time
Parameters:
- value ( 0, 1 )
- tzid ( 0, 1 )
- non-standard ( 0, unbounded )
- iana ( 0, unbounded )
Value: date
Parameters:
- value ( 0, 1 )
- tzid ( 0, 1 )
- non-standard ( 0, unbounded )
- iana ( 0, unbounded )
Value: date-time
Parameters:
- non-standard ( 0, unbounded )
- iana ( 0, unbounded )
Value: date-time
Parameters:
- value ( 0, 1 )
- tzid ( 0, 1 )
- non-standard ( 0, unbounded )
- iana ( 0, unbounded )
Value: date
Parameters:
- value ( 0, 1 )
- tzid ( 0, 1 )
- non-standard ( 0, unbounded )
- iana ( 0, unbounded )
Value: date-time
Parameters:
- value ( 0, 1 )
- tzid ( 0, 1 )
- non-standard ( 0, unbounded )
- iana ( 0, unbounded )
Value: date
Parameters:
- value ( 0, 1 )
- tzid ( 0, 1 )
- non-standard ( 0, unbounded )
- iana ( 0, unbounded )
Value: duration
Parameters:
- non-standard ( 0, unbounded )
- iana ( 0, unbounded )
Value: date-time
Parameters:
- value ( 0, 1 )
- tzid ( 0, 1 )
- non-standard ( 0, unbounded )
- iana ( 0, unbounded )
Value: date
Parameters:
- value ( 0, 1 )
- tzid ( 0, 1 )
- non-standard ( 0, unbounded )
- iana ( 0, unbounded )
Value ( pair of values separated by '/' ): date-time, date-time
Parameters:
- fbtype ( 0, 1 )
- non-standard ( 0, unbounded )
- iana ( 0, unbounded )
Value ( pair of values separated by '/' ): date-time, duration
Parameters:
- fbtype ( 0, 1 )
- non-standard ( 0, unbounded )
- iana ( 0, unbounded )
Value ( pair of values separated by ';' ): float, float
Parameters:
- non-standard ( 0, unbounded )
- iana ( 0, unbounded )
Value: text
Parameters:
- altrep ( 0, unbounded )
- cn ( 0, unbounded )
- cutype ( 0, unbounded )
- delegated-from ( 0, unbounded )
- delegated-to ( 0, unbounded )
- dir ( 0, unbounded )
- encoding ( 0, unbounded )
- fmttype ( 0, unbounded )
- fbtype ( 0, unbounded )
- iana ( 0, unbounded )
- language ( 0, unbounded )
- member ( 0, unbounded )
- non-standard ( 0, unbounded )
- partstat ( 0, unbounded )
- range ( 0, unbounded )
- related ( 0, unbounded )
- reltype ( 0, unbounded )
- role ( 0, unbounded )
- rsvp ( 0, unbounded )
- sent-by ( 0, unbounded )
- tzid ( 0, unbounded )
- value ( 0, unbounded )
Value: date-time
Parameters:
- non-standard ( 0, unbounded )
- iana ( 0, unbounded )
Value: text
Parameters:
- altrep ( 0, 1 )
- language ( 0, 1 )
- non-standard ( 0, unbounded )
- iana ( 0, unbounded )
Value ( enumeration ): PUBLISH, REQUEST, REPLY, ADD, CANCEL, REFRESH, COUNTER, DECLINECOUNTER
Parameters:
- non-standard ( 0, unbounded )
- iana ( 0, unbounded )
Value: text
Parameters:
- altrep ( 0, unbounded )
- cn ( 0, unbounded )
- cutype ( 0, unbounded )
- delegated-from ( 0, unbounded )
- delegated-to ( 0, unbounded )
- dir ( 0, unbounded )
- encoding ( 0, unbounded )
- fmttype ( 0, unbounded )
- fbtype ( 0, unbounded )
- iana ( 0, unbounded )
- language ( 0, unbounded )
- member ( 0, unbounded )
- non-standard ( 0, unbounded )
- partstat ( 0, unbounded )
- range ( 0, unbounded )
- related ( 0, unbounded )
- reltype ( 0, unbounded )
- role ( 0, unbounded )
- rsvp ( 0, unbounded )
- sent-by ( 0, unbounded )
- tzid ( 0, unbounded )
- value ( 0, unbounded )
Value: cal-address
Parameters:
- cn ( 0, 1 )
- dir ( 0, 1 )
- sent-by ( 0, 1 )
- language ( 0, 1 )
- non-standard ( 0, unbounded )
- iana ( 0, unbounded )
Value: integer
Parameters:
- non-standard ( 0, unbounded )
- iana ( 0, unbounded )
Value ( enumeration ): 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
Parameters:
- non-standard ( 0, unbounded )
- iana ( 0, unbounded )
Value: date-time
Parameters:
- value ( 0, 1 )
- tzid ( 0, 1 )
- non-standard ( 0, unbounded )
- iana ( 0, unbounded )
Value: date
Parameters:
- value ( 0, 1 )
- tzid ( 0, 1 )
- non-standard ( 0, unbounded )
- iana ( 0, unbounded )
Value ( pair of values separated by '/' ): date-time, date-time
Parameters:
- value ( 0, 1 )
- tzid ( 0, 1 )
- non-standard ( 0, unbounded )
- iana ( 0, unbounded )
Value ( pair of values separated by '/' ): date-time, duration
Parameters:
- value ( 0, 1 )
- tzid ( 0, 1 )
- non-standard ( 0, unbounded )
- iana ( 0, unbounded )
Value: date-time
Parameters:
- value ( 0, 1 )
- tzid ( 0, 1 )
- range ( 0, 1 )
- non-standard ( 0, unbounded )
- iana ( 0, unbounded )
Value: date
Parameters:
- value ( 0, 1 )
- tzid ( 0, 1 )
- range ( 0, 1 )
- non-standard ( 0, unbounded )
- iana ( 0, unbounded )
Value ( pair of values separated by ';' ): text, text
Parameters:
- language ( 0, 1 )
- non-standard ( 0, unbounded )
- iana ( 0, unbounded )
Value ( pair of values separated by ';' ): text, text
Parameters:
- language ( 0, 1 )
- non-standard ( 0, unbounded )
- iana ( 0, unbounded )
Value ( list ): text
Parameters:
- altrep ( 0, 1 )
- language ( 0, 1 )
- non-standard ( 0, unbounded )
- iana ( 0, unbounded )
Value: integer
Parameters:
- non-standard ( 0, unbounded )
- iana ( 0, unbounded )
Value ( enumeration ): TENTATIVE, CONFIRMED, CANCELLED
Parameters:
- non-standard ( 0, unbounded )
- iana ( 0, unbounded )
Value ( enumeration ): NEEDS-ACTION, COMPLETED, IN-PROCESS, CANCELLED
Parameters:
- non-standard ( 0, unbounded )
- iana ( 0, unbounded )
Value ( enumeration ): DRAFT, FINAL, CANCELLED
Parameters:
- non-standard ( 0, unbounded )
- iana ( 0, unbounded )
Value: text
Parameters:
- altrep ( 0, 1 )
- language ( 0, 1 )
- non-standard ( 0, unbounded )
- iana ( 0, unbounded )
Value ( enumeration ): OPAQUE, TRANSPARENT
Parameters:
- non-standard ( 0, unbounded )
- iana ( 0, unbounded )
Value: duration
Parameters:
- value ( 0, 1 )
- related ( 0, 1 )
- non-standard ( 0, unbounded )
- iana ( 0, unbounded )
Value: date-time
Parameters:
- non-standard ( 0, unbounded )
- iana ( 0, unbounded )
Parameters:
- non-standard ( 0, unbounded )
- iana ( 0, unbounded )
Value: text
Parameters:
- non-standard ( 0, unbounded )
- iana ( 0, unbounded )
Value: text
Parameters:
- language ( 0, 1 )
- non-standard ( 0, unbounded )
- iana ( 0, unbounded )
Value: utc-offset
Parameters:
- non-standard ( 0, unbounded )
- iana ( 0, unbounded )
Value: utc-offset
Parameters:
- non-standard ( 0, unbounded )
- iana ( 0, unbounded )
Value ( enumeration ): 2.0
Parameters:
- non-standard ( 0, unbounded )
- iana ( 0, unbounded )
Value: text
Parameters:
- non-standard ( 0, unbounded )
- iana ( 0, unbounded )
Value ( pair of values separated by ';' ): text, text
Parameters:
- non-standard ( 0, unbounded )
- iana ( 0, unbounded )
Value ( enumeration ): INDIVIDUAL, GROUP, RESOURCE, ROOM, UNKNOWN, x-name, iana-token
Value ( enumeration ): FREE, BUSY, BUSY-UNAVAILABLE, BUSY-TENTATIVE, x-name, iana-token
Value ( enumeration ): NEEDS-ACTION, ACCEPTED, DECLINED, TENTATIVE, DELEGATED, x-name, iana-token
Value ( enumeration ): NEEDS-ACTION, ACCEPTED, DECLINED, TENTATIVE, DELEGATED, COMPLETED, IN-PROCESS, x-name, iana-token
Value ( enumeration ): NEEDS-ACTION, ACCEPTED, DECLINED, x-name, iana-token
Value ( enumeration ): CHAIR, REQ-PARTICIPANT, OPT-PARTICIPANT, NON-PARTICIPANT, x-name, iana-token
There is a theoretical minimal set of properties. But in practice, a freebusy object containing the minimal set of properties is not useful. Additional properties must be provided. The following table summarizes the properties needed for each use of freebusy.
Theoretical Minimum | Request for Free/Busy Info | Reply to a Request for Free/Busy Info | Publish Busy Times | |
---|---|---|---|---|
PRODID | yes | yes | yes | yes |
VERSION | yes | yes | yes | yes |
METHOD | no | yes | yes | yes |
DTSTAMP | yes | yes | yes | yes |
UID | yes | yes | yes | yes |
ORGANIZER | no | yes | yes | yes |
ATTENDEE | no | yes | yes | no |
DTSTART | no | yes | yes | yes |
DTEND | no | yes | yes | yes |
FREEBUSY | no | no | yes | yes |
A freebusy component is nested within an iCalendar object. Every iCalendar object must have at least two properties: prodid and version. The prodid property identifies the application used to create the object. For example, Microsoft Outlook produces this:
PRODID:-//Microsoft Corporation//Outlook 16.0 MIMEDIR//EN
The version property identifies which version of the iCalendar specification the object conforms to. A value of "2.0" corresponds to the latest specification.
VERSION:2.0
Here is the skeletal structure of an iCalendar object containing a freebusy component:
BEGIN:VCALENDAR PRODID:-//Microsoft Corporation//Outlook 16.0 MIMEDIR//EN VERSION:2.0 BEGIN:VFREEBUSY ... END:VFREEBUSY END:VCALENDAR
There are only two required properties in a freebusy component: dtstamp and uid. The dtstamp property specifies when the iCalendar data was last modified (or, depending on the use of freebusy, when it was created). Here’s an example of this property:
DTSTAMP:20170828T114600Z
Read that as: The object was last modified on August 28, 2017 at 11:46am Zulu.
The value of a uid property represents a globally unique identifier for the component. Here’s an example:
UID:20170828T114600Z@example.com
So, here is a minimal iCalendar object containing a freebusy component:
BEGIN:VCALENDAR PRODID:-//Microsoft Corporation//Outlook 16.0 MIMEDIR//EN VERSION:2.0 BEGIN:VFREEBUSY DTSTAMP:20170828T114600Z UID:20170828T114600Z@example.com END:VFREEBUSY END:VCALENDAR
However, that is just a theoretical object. It has no practical use.
There are three common uses for freebusy:
To accomplish these, additional properties are required, above and beyond the theoretic minimum.
Here are the additional properties needed to make a request for free/busy information: The attendee property specifies the calendar users whose free/busy time is being requested. The organizer property specifies the calendar user who is requesting the free/busy time. The dtstart and dtend properties specify the window of time for which free/busy information is requested.
The following example is a request by Jane Doe for free/busy information of John Public and Sally Smith for the period September 1, 2017 to September 2, 2017.
BEGIN:VCALENDAR PRODID:-//Microsoft Corporation//Outlook 16.0 MIMEDIR//EN VERSION:2.0 METHOD:REQUEST BEGIN:VFREEBUSY DTSTAMP:20170828T114600Z UID:20170828T114600Z@example.com ORGANIZER:mailto:jane_doe@example.com ATTENDEE:mailto:john_public@example.com ATTENDEE:mailto:sally_smith@example.com DTSTART:20170901T000000Z DTEND:20170902T000000Z END:VFREEBUSY END:VCALENDAR
Here are the additional properties needed to reply to a request for free/busy information: The attendee property specifies the calendar user responding to the free/busy time request. The organizer property specifies the calendar user that originally requested the free/busy time. The freebusy property specifies the times when the user is busy and the times when the user is free.
The following example is John Public’s reply to a request by Jane Doe for free/busy information. John Public is busy up to 10am and then busy again after noon. He is free between 10am and noon.
BEGIN:VCALENDAR PRODID:-//Microsoft Corporation//Outlook 16.0 MIMEDIR//EN VERSION:2.0 METHOD:REPLY BEGIN:VFREEBUSY DTSTAMP:20170828T114600Z UID:20170828T114600Z@example.com ORGANIZER:mailto:jane_doe@example.com ATTENDEE:mailto:john_public@example.com DTSTART:20170901T000000Z DTEND:20170902T000000Z FREEBUSY;FBTYPE=BUSY:20170901T000000Z/20170901T100000Z FREEBUSY;FBTYPE=FREE:20170901T100001Z/20170901T120000Z FREEBUSY;FBTYPE=BUSY:20170901T120001Z/20170902T000000Z END:VFREEBUSY END:VCALENDAR
The third use of the freebusy component is for publishing busy times. The organizer property specifies the calendar user associated with the published busy times. The dtstart and dtend properties specify an inclusive time window that surrounds the busy times information. The freebusy property specifies the published busy time information. The dtstamp property specifies the date-time that the iCalendar object was created.
The following example shows the times that Jane Doe is busy: between September 1 and September 2 she is busy up to 10am and after noon.
BEGIN:VCALENDAR PRODID:-//Microsoft Corporation//Outlook 16.0 MIMEDIR//EN VERSION:2.0 METHOD:PUBLISH BEGIN:VFREEBUSY DTSTAMP:20170828T114600Z UID:20170828T114600Z@example.com ORGANIZER:mailto:jane_doe@example.com DTSTART:20170901T000000Z DTEND:20170902T000000Z FREEBUSY;FBTYPE=BUSY:20170901T000000Z/20170901T100000Z FREEBUSY;FBTYPE=BUSY:20170901T120001Z/20170902T000000Z END:VFREEBUSY END:VCALENDAR