From RFC 7953, RFC 6638, RFC 7808, RFC 6321 and RFC 7265, read 2026-11-13. The core format is described on components and properties and values and parameters.
Availability: VAVAILABILITY (RFC 7953)
Describes when a calendar user is available, with recurring "available" periods. The default over the
period of a VAVAILABILITY is busy; AVAILABLE sub-components mark the free time inside it.
| Component | Required, at most once | Optional, at most once | Optional, any number |
|---|---|---|---|
VAVAILABILITY (contains AVAILABLE components) | DTSTAMP, UID | BUSYTYPE, CLASS, CREATED, DESCRIPTION, DTSTART, LAST-MODIFIED, LOCATION, ORGANIZER, PRIORITY, SEQUENCE, SUMMARY, URL, and DTEND or DURATION (not both; DURATION needs DTSTART) | CATEGORIES, COMMENT, CONTACT, extension properties |
AVAILABLE | DTSTAMP, DTSTART, UID, and DTEND or DURATION (one of them, not both) | CREATED, DESCRIPTION, LAST-MODIFIED, LOCATION, RECURRENCE-ID, RRULE, SUMMARY | CATEGORIES, COMMENT, CONTACT, EXDATE, RDATE, extension properties |
- Without
DTSTARTaVAVAILABILITYstarts unbounded; withoutDTENDorDURATIONit ends unbounded.DTSTARTandDTENDin either component must be date-times, UTC or local with a time zone reference, and the object needs aVTIMEZONEfor eachTZIDunless time zone references are by value (RFC 7809). BUSYTYPE: text,BUSY,BUSY-UNAVAILABLE(default),BUSY-TENTATIVE, or an IANA orX-value. The values are those of theFBTYPEparameter withoutFREE.- Combining.
PRIORITYorders overlapping components; a missing priority or 0 is the lowest, then 9 down to 1 (highest). Components of equal priority that overlap take the busy type in the orderBUSYoverBUSY-UNAVAILABLEoverBUSY-TENTATIVE. To compute available time: order the intersecting components from lowest to highest priority, and for each mark its whole range busy and then free where itsAVAILABLEparts are; a component that covers the whole range of interest makes the lower ones irrelevant. Spread priorities (0, 5, 7, 3 as in the RFC's example) so one can be inserted later. - Free-busy. Start with the whole request period free; apply each intersecting
VAVAILABILITYby priority (ignoring one wholly overridden), then overlay ordinaryVEVENTandVFREEBUSYbusy time. - The RFC does not define use of
VAVAILABILITYin iTIP; it adds a CalDAVcalendar-availabilityfeature (advertised in theDAVheader) and rules for free-busy queries.
BEGIN:VAVAILABILITY
ORGANIZER:mailto:bernard@example.com
UID:0428C7D2-688E-4D2E-AC52-CD112E2469DF
DTSTAMP:20111005T133225Z
BEGIN:AVAILABLE
UID:34EDA59B-6BB1-4E94-A66C-64999089C0AF
SUMMARY:Monday to Friday from 9:00 to 17:00
DTSTART;TZID=America/Montreal:20111002T090000
DTEND;TZID=America/Montreal:20111002T170000
RRULE:FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR
END:AVAILABLE
END:VAVAILABILITY
CalDAV scheduling parameters (RFC 6638)
RFC 6638 is mostly a WebDAV protocol (inbox and outbox collections, scheduling privileges, HTTP headers
Schedule-Reply, Schedule-Tag and If-Schedule-Tag-Match); the parts that reach the file are three
parameters on ORGANIZER and ATTENDEE:
| Parameter | Values | Meaning |
|---|---|---|
SCHEDULE-AGENT | SERVER (default), CLIENT, NONE, extension or IANA tokens | who delivers scheduling messages to that user: the server, the client itself, or nobody. Unknown values are treated as NONE. It must be the same on every ORGANIZER, and on every ATTENDEE with the same address, in the resource. Never put it in messages |
SCHEDULE-FORCE-SEND | REQUEST, REPLY, or another registered METHOD value | on an ATTENDEE (by the Organizer) or the ORGANIZER (by an Attendee) with SCHEDULE-AGENT=SERVER or none: make the server send that message even though nothing changed (for example to ask a user who declined to reconsider). The server must not keep the parameter, and sets SCHEDULE-STATUS to 2.3 if it ignores it |
SCHEDULE-STATUS | one status code, or several in quotes separated by commas, for example "2.0,2.4" | the result of the last scheduling message sent to that Attendee or received from the Organizer. Servers set it only on users they sent a message to (and on the ORGANIZER for a reply); clients should not alter a server's value but may set their own when SCHEDULE-AGENT=CLIENT |
The status codes are those of iTIP plus three delivery codes: 1.0 pending,
1.1 sent, 1.2 delivered. A server resets PARTSTAT of every Attendee except the Organizer to
NEEDS-ACTION when a change to DTSTART, DTEND, DURATION, DUE, RRULE, RDATE or
EXDATE affects existing instances.
ORGANIZER;SCHEDULE-AGENT=SERVER:mailto:bernard@example.com
ATTENDEE;SCHEDULE-AGENT=NONE:mailto:cyrus@example.com
ATTENDEE;SCHEDULE-STATUS="2.0,2.4":mailto:cyrus@example.com
Time zone data distribution (RFC 7808)
A service (HTTP GET requests, one per action, discovered by SRV records, TXT records and a well-known URI) that serves time zone data as iCalendar
VTIMEZONE, or as iCalendar-in-XML or iCalendar-in-JSON. Its actions are capabilities, list,
get, expand, find and leapseconds. Two properties are added to VTIMEZONE:
TZUNTIL(0 or 1;DATE-TIME, UTC): an exclusive upper bound of the validity of the time zone data; a server also uses it for the end of a truncated range. ExampleTZUNTIL:20260101T000000Z.TZID-ALIAS-OF(0 or more;TEXT): the identifier of the time zone of which the component'sTZIDis an alias, for exampleTZID-ALIAS-OF:America/New_Yorkin a zone calledUS/Eastern.
Concepts of the service: time zone identifiers are publisher-defined (no global naming scheme); aliases map a name to an identifier and
may differ between truncated and untruncated data; localised names can be queried; data can be truncated to a range whose start is inclusive
and end exclusive, both UTC, and the server must list the ranges it uses in its capabilities response. A truncated component starts with
exactly one STANDARD or DAYLIGHT sub-component whose DTSTART is the start of the range and which has the
offsets in effect just before and after it.
iCalendar in XML: xCal (RFC 6321)
Namespace urn:ietf:params:xml:ns:icalendar-2.0; media type application/calendar+xml (parameters method,
component, optinfo and charset, UTF-8 strongly recommended).
- Before converting: unfold the lines and remove text and parameter escaping. A property with
ENCODING=BASE64keeps its base64 if its type isBINARY; otherwise the parameter is removed and the value decoded. - Structure: the root element is
icalendar(the stream), holding one or morevcalendarelements, each with apropertieselement and acomponentselement. Component elements (vevent,vtodo,vjournal,vfreebusy,vtimezone,standard,daylight,valarm) go insidecomponents, which can nest. Every element name is the lower-case iCalendar name. - Property: an element with the property's lower-case name; at most one
parameterselement (left out when empty), whose children are the parameters, lower-case, each containing a value element; then one or more value elements. AVALUEparameter is not written, because the value element's name says the type; when converting back it is added if the type is not the property's default. - Value elements (lower-case type names):
binary,boolean,cal-address,date,date-time,duration,float,integer,period(childrenstartandendorduration),recur,text,time,uri,utc-offset. Dates and times follow XML Schema syntax with-and:separators (2011-05-17T12:00:00) and, as in iCalendar, no UTC offset (zones are byTZIDparameter);utc-offsetis written-05:00. Arecurelement has a child per rule part (freq,count,byday,bymonth...). - Multi-valued properties (
CATEGORIES,RESOURCES,FREEBUSY,EXDATE,RDATE) hold several value elements.GEOholdslatitudeandlongitudeelements;REQUEST-STATUSholdscode,descriptionand, if there is any,data. - Extensions and unknowns: an
X-FOOproperty is the elementx-fooin the iCalendar namespace (and elements there must beginx-). A property whose default type is unknown and that has noVALUEparameter, and any unrecognised parameter, gets the value elementunknownholding the raw text; converting back writes it unchanged with noVALUEparameter. Elements in another namespace that are direct children ofpropertiesare kept in the iCalendar form as theXMLproperty. XMLproperty: text (orBINARYbase64 withENCODING=BASE64;VALUE=BINARYwhen the XML has characters TEXT cannot hold) containing one XML 1.0 element with a namespace declaration, not in the iCalendar namespace and not duplicating a defined property; any number of times in any component; order is not preserved.
iCalendar in JSON: jCal (RFC 7265)
Media type application/calendar+json (optional parameters method, component, optinfo).
- Pre-processing: unfold, then remove iCalendar escaping (RFC 5545 and RFC 6868), then apply JSON escaping; the reverse order on the way back, and fold long lines. Base64 is handled as in xCal. JSON numbers cannot have leading zeros or a plus sign.
- Stream: no equivalent; several objects are a JSON array.
- Component: a fixed three-element array: lower-case name, array of properties, array of sub-components. Property order within a component is not kept.
- Property: an array: lower-case name, an object of parameters (empty
{}if none), the lower-case value type, then one value (single-valued properties have exactly four elements) or several (multi-valued ones). Example:["categories", {}, "text", "Meetings", "Work"]. - Parameters: object keys are lower-case parameter names; the value keeps its case. Multi-valued parameters (
delegated-to,delegated-fromand others) are arrays of strings (a parser must accept a plain string for a single value). The quotes around a value with a colon, semicolon or comma are not part of the value. TheVALUEparameter is not written; the type string takes its place: theVALUEparameter if present, else the property's default type, elseunknown. Converting back omitsVALUEforunknownand for default types and adds it otherwise. - Values:
binarybase64 string;booleanJSON boolean;cal-addressanduristrings;dateYYYY-MM-DD;date-timeYYYY-MM-DDTHH:MM:SSwith an optional zone (Z);timeHH:MM:SS; reduced-accuracy forms are not allowed;durationas in RFC 5545;floatandintegerJSON numbers (an integer must fit the RFC 5545 range);perioda two-element array of start and end (date-time) or duration;texta string;utc-offsetwith a colon (-05:00);recuran object with lower-case keys, wherefreqandwkstare strings with case kept,untilis a date or date-time,countandintervalnumbers,bysecond,byminute,byhour,bymonthday,byyearday,byweekno,bymonth,bysetposnumbers or arrays of numbers, andbydaya string or array of strings ({"freq": "YEARLY", "count": 5, "byday": ["-1SU", "2MO"], "bymonth": 10}). - Special properties:
geois a two-element array[latitude, longitude]of floats;request-statusis an array of two or three strings (code, description, and data unless empty); converting back joins them with semicolons. - Extensions and unknowns:
X-FOObecomesx-foo. A new value type,unknown, holds the raw text of a property whose default type is not known; it is reserved in iCalendar (IANA status "Reserved - Do not use") so it never occurs in a real iCalendar file.