This page follows RFC 5546 (iTIP, December 2009),
read 2026-11-13. An iTIP message is a text/calendar object with a METHOD
property (and the matching method parameter of the media type). The calendar user who
creates the object is the Organizer and controls the master copy; Attendees answer
with REPLY and may propose changes with COUNTER but never change it directly.
The methods and components are on the components page;
this page gives the rules for each.
Which methods apply to which component
| Method | VEVENT | VTODO | VJOURNAL | VFREEBUSY |
|---|---|---|---|---|
PUBLISH | yes | yes | yes | yes |
REQUEST | yes | yes | no | yes |
REFRESH | yes | yes | no | no |
CANCEL | yes | yes | yes | no |
ADD | yes | yes | yes | no |
REPLY | yes | yes | no | yes |
COUNTER | yes | yes | no | no |
DECLINECOUNTER | yes | yes | no | no |
What each does for an event: PUBLISH posts an event without inviting anyone (an Organizer is required, Attendees are forbidden);
REQUEST invites, reschedules or updates; REPLY is the Attendee's answer (PARTSTAT ACCEPTED,
DECLINED, TENTATIVE or DELEGATED) and also reports a failed attempt to process a request;
ADD adds instances to an existing event; CANCEL cancels instances or the event; REFRESH is an Attendee
asking the Organizer to resend the latest version; COUNTER is an Attendee's alternative proposal; DECLINECOUNTER
is the Organizer's refusal of it. To-dos use the same roles (REQUEST assigns); journal entries have only
PUBLISH, ADD and CANCEL.
How to read the rules
RFC 5546 states each method as a table of presence values: 1 exactly one must be present, 1+ at
least one, 0 must not be present, 0+ any number, 0 or 1 at most one. The tables below
list, for every method, only what is required or forbidden and the special rules; every other property of the component
that is allowed in a calendar file is optional in the usual way (CATEGORIES, ATTACH, COMMENT,
EXDATE, RDATE and RELATED-TO any number of times, the rest at most once, and DTEND and
DURATION or DUE and DURATION never together). Extension properties (IANA-PROPERTY,
X-PROPERTY) and components are allowed anywhere unless stated. The tables do not restrict parameters.
All messages
VCALENDAR:PRODID1,VERSION1 (value2.0),CALSCALE0 or 1, andMETHOD1 whose value is the method.VTIMEZONE: must be present if any date-time refers to a time zone. Each has aTZID(1), at least oneSTANDARDorDAYLIGHTsub-component, andLAST-MODIFIEDandTZURL(0 or 1 each). Each observance hasDTSTART(local time form),TZOFFSETFROMandTZOFFSETTO(1 each),TZNAME,COMMENTandRDATE(0+) andRRULE(0 or 1); in aSTANDARDcomponentRDATEandRRULEmust not both be present.VALARM(where allowed):ACTION1,TRIGGER1,DESCRIPTION,SUMMARY,ATTENDEE,ATTACHas the action needs;DURATIONandREPEATmust appear together or not at all.
Events
| Method | Required | Forbidden | Special rules |
|---|---|---|---|
PUBLISH | VEVENT 1+; DTSTAMP, DTSTART, ORGANIZER, SUMMARY (may be empty), UID | ATTENDEE, REQUEST-STATUS; VFREEBUSY, VJOURNAL, VTODO | SEQUENCE must be present if over 0. RECURRENCE-ID only for an instance of a recurring event. STATUS may be TENTATIVE, CONFIRMED or CANCELLED |
REQUEST | VEVENT 1+ (all with the same UID); ATTENDEE 1+; DTSTAMP, DTSTART, ORGANIZER, SUMMARY, UID | REQUEST-STATUS; VFREEBUSY, VJOURNAL, VTODO | SEQUENCE must be present if over 0. STATUS may be TENTATIVE or CONFIRMED. CONTACT 0+ |
REPLY | VEVENT 1+ (same UID); exactly one ATTENDEE, the address of the replier; DTSTAMP, ORGANIZER, UID of the original request | VALARM; VFREEBUSY, VJOURNAL, VTODO | SEQUENCE, if non-zero, must be that of the request. REQUEST-STATUS 0+. VTIMEZONE 0 or 1. DTSTART, SUMMARY and the rest optional |
ADD | one VEVENT; DTSTAMP, DTSTART, ORGANIZER, SEQUENCE (over 0), SUMMARY, UID (that of the original) | EXDATE, RDATE, RRULE, RECURRENCE-ID, REQUEST-STATUS; other component types | ATTENDEE 0+; STATUS may be TENTATIVE or CONFIRMED |
CANCEL | VEVENT 1+ (same UID); DTSTAMP, ORGANIZER, SEQUENCE, UID of the original request | REQUEST-STATUS, VALARM; other component types | ATTENDEE 0+: must list some or all of the Attendees being removed, or all of them if the whole event is cancelled. STATUS must be CANCELLED to cancel the whole event and must not be present when only some Attendees are removed. RECURRENCE-ID for instances |
REFRESH | one VEVENT; ATTENDEE (the requester), DTSTAMP, ORGANIZER, UID of the original request | every other property of the component (all of ATTACH, CATEGORIES, CLASS, CONTACT, CREATED, DESCRIPTION, DTEND, DTSTART, DURATION, EXDATE, GEO, LAST-MODIFIED, LOCATION, PRIORITY, RDATE, RELATED-TO, REQUEST-STATUS, RESOURCES, RRULE, SEQUENCE, STATUS, SUMMARY, TRANSP, URL), and VALARM | only COMMENT, RECURRENCE-ID, extension properties and VTIMEZONE are optional |
COUNTER | one VEVENT; DTSTAMP, DTSTART, ORGANIZER (that of the original event), SEQUENCE (echo the original), SUMMARY, UID of the request being countered | other component types | ATTENDEE 0+ (may propose other Attendees); REQUEST-STATUS 0+; STATUS CONFIRMED, TENTATIVE or CANCELLED |
DECLINECOUNTER | VEVENT 1+ (same UID); ATTENDEE 1+ (all the Attendees); DTSTAMP, ORGANIZER, SEQUENCE (echo), UID (echo) | VALARM; other component types | REQUEST-STATUS 0+; STATUS TENTATIVE or CONFIRMED |
To-dos
Optional in the to-do methods besides the usual: COMPLETED, PERCENT-COMPLETE, DUE (not with DURATION), DTSTART.
STATUS values: COMPLETED, NEEDS-ACTION, IN-PROCESS, plus CANCELLED where stated.
| Method | Required | Forbidden | Special rules |
|---|---|---|---|
PUBLISH | VTODO 1+; DTSTAMP, DTSTART, ORGANIZER, PRIORITY, SUMMARY, UID | ATTENDEE, REQUEST-STATUS; VEVENT, VFREEBUSY, VJOURNAL | SEQUENCE required if over 0; STATUS any of the four values |
REQUEST | VTODO 1+ (same UID); ATTENDEE 1+; DTSTAMP, DTSTART, ORGANIZER, PRIORITY, SUMMARY, UID | REQUEST-STATUS; other component types | SEQUENCE required if over 0; STATUS not CANCELLED |
REPLY | VTODO 1+ (same UID); one ATTENDEE (the replier); DTSTAMP, ORGANIZER, UID of the request | VALARM; other component types | REQUEST-STATUS 0+; SEQUENCE must be the request's if over 0 |
ADD | one VTODO; DTSTAMP, ORGANIZER, PRIORITY, SEQUENCE (over 0), SUMMARY, UID (the original's) | EXDATE, RDATE, RRULE, RECURRENCE-ID, REQUEST-STATUS; other component types | ATTENDEE 0+; STATUS not CANCELLED |
CANCEL | VTODO 1+; DTSTAMP, ORGANIZER, SEQUENCE, UID (the original's) | REQUEST-STATUS, VALARM; other component types | ATTENDEE 0+ must list the Attendees removed, or all if the whole to-do is cancelled; STATUS must be CANCELLED to cancel the whole to-do and absent when removing particular Attendees. The table has no SUMMARY row |
REFRESH | one VTODO; ATTENDEE, DTSTAMP, UID | all other properties including ORGANIZER, SEQUENCE, SUMMARY and VALARM | RECURRENCE-ID optional; COMMENT is forbidden here, unlike for events |
COUNTER | one VTODO; ATTENDEE 1+; DTSTAMP, ORGANIZER, PRIORITY, SUMMARY, UID | other component types | SEQUENCE echoes the original and is required if non-zero; REQUEST-STATUS 0+; STATUS any of the four |
DECLINECOUNTER | one VTODO; ATTENDEE 1+ (all); DTSTAMP, ORGANIZER, SEQUENCE (echo), UID (echo) | VALARM; other component types | REQUEST-STATUS 0+; STATUS not CANCELLED |
Journal entries
| Method | Required | Forbidden | Special rules |
|---|---|---|---|
PUBLISH | VJOURNAL 1+; DESCRIPTION (may be empty), DTSTAMP, DTSTART, ORGANIZER, UID | ATTENDEE, REQUEST-STATUS; VEVENT, VFREEBUSY, VTODO | SEQUENCE required if non-zero; STATUS DRAFT, FINAL or CANCELLED |
ADD | one VJOURNAL; DESCRIPTION, DTSTAMP, DTSTART, ORGANIZER, SEQUENCE (over 0), UID (the original's) | ATTENDEE, EXDATE, RDATE, RRULE, RECURRENCE-ID, REQUEST-STATUS; other component types | STATUS DRAFT, FINAL or CANCELLED |
CANCEL | VJOURNAL 1+ (same UID); DTSTAMP, ORGANIZER, SEQUENCE, UID | ATTENDEE, REQUEST-STATUS, VALARM; other component types | STATUS may be present and must then be CANCELLED |
Free-busy
In every free-busy message DTSTART and DTEND must be UTC date-times, and the component has exactly one VFREEBUSY (one or more for PUBLISH).
VALARM, VEVENT, VTODO, VJOURNAL and VTIMEZONE are forbidden. COMMENT 0+, CONTACT 0 or 1.
| Method | Required | Forbidden | Special rules |
|---|---|---|---|
PUBLISH | DTSTAMP, DTSTART, DTEND, ORGANIZER (the originator of the busy time), UID | ATTENDEE, DURATION, REQUEST-STATUS | FREEBUSY 0+, sorted in ascending order (the RFC's text says each must be BUSYTIME); URL 0 or 1 gives the busy-time URL |
REQUEST | ATTENDEE 1+ (the users whose free-busy is asked for), DTSTAMP, DTSTART, DTEND, ORGANIZER (the requester), UID | FREEBUSY, DURATION, REQUEST-STATUS, URL | asks for the busy time within the range |
REPLY | one ATTENDEE (the replier), DTSTAMP, DTSTART, DTEND, ORGANIZER (the requester), UID of the request | DURATION, SEQUENCE | FREEBUSY 0+ sorted; REQUEST-STATUS 0+; URL 0 or 1 |
Revisions, sequencing and scheduling state
- State. The state of the object is its
STATUS(no default; the Organizer sets it). An Attendee's state is thePARTSTATof itsATTENDEEproperty; the Organizer's first message leaves itNEEDS-ACTIONand the Attendee changes it in aREPLY. - When
SEQUENCEmust rise. When the Organizer changesDTSTART,DTEND,DURATION,DUE,RRULE,RDATE,EXDATEorSTATUS, and for any other change that could invalidate Attendees' answers (a distant new location). It rises by the rules ofPUBLISHandREQUEST, always withADDandCANCEL, and never withREPLY,REFRESH,COUNTER,DECLINECOUNTERor a delegationREQUEST. Attendees should compare old and new versions rather than trust the number alone. - Matching messages. The key is
UID(withRECURRENCE-IDfor an instance); among the same key the highestSEQUENCEreplaces the others; for replies likewise; if the sequence is equal the laterDTSTAMPwins. A client must therefore rememberUID,RECURRENCE-ID,SEQUENCEandDTSTAMP, and an Organizer's client the sequence and stamp of each Attendee's last reply, so that late replies can be discarded. - Roles.
SENT-BYonORGANIZERorATTENDEEsays someone acted on behalf of that user; answers still go to the Organizer.
What a REQUEST can mean (events)
- Invite: a new
UID. - Reschedule: the
UIDis known andSEQUENCE(orDTSTAMP) is greater than the stored one. - Update or reconfirm: the
UIDis known andSEQUENCEis the same; it is also the answer to aREFRESH. - Ask for status:
ATTENDEE;RSVP=TRUE, sameSEQUENCE; the Attendee replies with its current state. - Delegate: the delegator forwards the request to the delegate (with an
ATTENDEEfor the delegate) and sends the Organizer aREPLYwithPARTSTAT=DELEGATEDandDELEGATED-TO; the delegate replies to the Organizer, optionally to the delegator too, withDELEGATED-FROM. The delegate takes part instead of, not in addition to, the delegator, who may keep getting updates by settingROLE=NON-PARTICIPANTin the reply. - Forward to an uninvited user: the Attendee forwards the unchanged request; the new user may
REPLYto the Organizer, who decides whether to add anATTENDEE(and should then send aREQUEST) or may send aCANCEL. A reply from an unknown user is a "party crasher". - Change the Organizer: agreed out of band; the new Organizer sends a
REQUESTwith a higherSEQUENCEand the newORGANIZER.
The same pattern applies to to-dos (the specification gives separate sections for them).
REQUEST-STATUS codes in replies
REQUEST-STATUS reports the outcome of a REPLY, COUNTER or DECLINECOUNTER; if absent, 2.0 is assumed.
Within one component all codes must start with the same digit; across the components of a message, if any has a 5.x code every component must have one in that range (or none), else if any has 3.x the same rule applies; 2.x and 4.x may mix between components.
extdata may carry the offending data. Others may be registered (IANA registry created by RFC 5546).
| Code | Meaning |
|---|---|
| 2.0 | Success. |
| 2.1 | Success, but fallback taken on one or more property values. |
| 2.2 | Success; invalid property ignored. |
| 2.3 | Success; invalid property parameter ignored. |
| 2.4 | Success; unknown, non-standard property ignored. |
| 2.5 | Success; unknown, non-standard property value ignored. |
| 2.6 | Success; invalid calendar component ignored. |
| 2.7 | Success; request forwarded to Calendar User. |
| 2.8 | Success; repeating event ignored, scheduled as a single event. |
| 2.9 | Success; truncated end date-time to date boundary. |
| 2.10 | Success; repeating to-do ignored, scheduled as a single to-do. |
| 2.11 | Success; unbounded RRULE clipped at some finite number of instances. |
| 3.0 | Invalid property name. |
| 3.1 | Invalid property value. |
| 3.2 | Invalid property parameter. |
| 3.3 | Invalid property parameter value. |
| 3.4 | Invalid calendar component sequence. |
| 3.5 | Invalid date or time. |
| 3.6 | Invalid rule. |
| 3.7 | Invalid Calendar User. |
| 3.8 | No authority. |
| 3.9 | Unsupported version. |
| 3.10 | Request entity too large. |
| 3.11 | Required component or property missing. |
| 3.12 | Unknown component or property found. |
| 3.13 | Unsupported component or property found. |
| 3.14 | Unsupported capability. |
| 4.0 | Event conflict: the date and time are busy. |
| 5.0 | Request not supported. |
| 5.1 | Service unavailable. |
| 5.2 | Invalid calendar service. |
| 5.3 | No scheduling support for user. |