There is no official documentation.
Outlook Live:
https://outlook.live.com/calendar/deeplink/compose
Office 365:
https://outlook.office.com/calendar/deeplink/compose
An account index may be inserted before deeplink, for example
https://outlook.live.com/calendar/0/deeplink/compose. Both forms behave identically.
Outlook Live:
https://outlook.live.com/calendar/deeplink/compose?path=/calendar/action/compose&rru=addevent&startdt=2023-08-09T19:30:00Z&enddt=2023-08-09T22:30:00Z&subject=Birthday&body=With%20clowns%20and%20stuff&location=North%20Pole
Office 365:
https://outlook.office.com/calendar/deeplink/compose?path=/calendar/action/compose&rru=addevent&startdt=2023-08-09T19:30:00Z&enddt=2023-08-09T22:30:00Z&subject=Birthday&body=With%20clowns%20and%20stuff&location=North%20Pole
Unlike Google Calendar, the Outlook web app does not parse the deep link in the browser. None of the parameter names appear in the OWA JavaScript chunks that the compose page loads, and the query string disappears from the address bar once the compose form is rendered, so the mapping happens on the server.
That means the list below comes from replaying parameters against the live compose form and observing the result, not from reading a parser.
Each parameter carries one of three confidence markers:
Last check on outlook.live.com: 2026-08-19. The Office 365 host was not re-tested.
The compose endpoint accepts far longer URLs than the 2000 character figure usually quoted for the
web in general. Measured against outlook.live.com on 2026-08-19, an 8000 character body arrives
in the compose form intact, first and last bytes included.
Bisecting the total URL length gives the ceiling:
| total URL length | response |
|---|---|
| 30 975 | 200 |
| 31 145 | 200 |
| 31 161 | 400 |
| 31 175 | 400 |
Past that the host answers with a plain Bad Request page from IIS, so the request never reaches the
calendar application at all.
Treat roughly 31 000 characters as a best case rather than a guarantee. The limit counts the request line together with the request headers, and cookies live in those headers, so a signed-in session with a large authentication cookie runs out of room earlier.
Independently of the server, browsers, proxies and email clients impose their own much lower limits, so keeping the whole URL under a couple of thousand characters is still the safe choice for links you hand to other people.
required: yes
format: string
example: path=/calendar/action/compose
confidence: verified
description: internal application path.
required: yes
format: string (addevent)
example: rru=addevent
confidence: verified
description: action name.
required: yes
format: datetime (YYYY-MM-DDTHH:mm:SSZ) or date (YYYY-MM-DD, for all-day events) in UTC
example: startdt=2020-12-31T19:30:00Z
confidence: verified
description: the start date for the event.
You can omit the trailing Z, in which case the value is read in the current user’s timezone.
To specify all-day events use the YYYY-MM-DD format.
required: yes
format: datetime (YYYY-MM-DDTHH:mm:SSZ) or date (YYYY-MM-DD, for all-day events) in UTC
example: enddt=2020-12-31T22:30:00Z
confidence: verified
description: the end time of the event, format as for startdt.
required: yes
format: string
example: subject=Birthday
confidence: verified
description: event title. It also becomes the browser tab title.
required: no
format: boolean (true/false)
example: allday=true
confidence: verified
description: whether the event is all-day or not.
allday=true wins over the time part of startdt and enddt, so a full datetime range still collapses into an all-day event.
All-day events also default to “Free” availability.
required: no
format: text or HTML
example: body=With clowns and stuff
confidence: verified
description: description of your event.
HTML is accepted and rendered, so body=%3Cb%3Ebold%3C%2Fb%3E produces bold text and an <a href="..."> produces a real link.
required: no
format: string
example: location=North Pole
confidence: verified
description: set the location of the event. The value is added as a free-text location entry, it is not resolved against Bing Maps.
required: no
format: boolean (any truthy value, 1 and true both work)
example: online=1
confidence: verified
description: turns the online meeting toggle on. The toggle is labelled “Teams meeting” now, not “Skype meeting”. Without this parameter the toggle stays off until an attendee is added.
required: no
format: string
example: to=santa@example.com,easter.bunny@example.com
confidence: verified
description: a comma-separated list of emails of required attendees.
required: no
format: string
example: cc=santa@example.com,easter.bunny@example.com
confidence: verified
description: a comma-separated list of emails of optional attendees.
required: no
format: string (enum)
example: freebusy=oof
confidence: verified
options:
freetentativebusyoofworkingelsewherenodatadescription: availability shown for the event. oof renders as “Out of office”.
required: no
format: boolean (true/false)
example: reqresponse=true
confidence: not observable
description: request responses from attendees. The compose form hides this behind a “Response options” menu, so the parameter could not be confirmed.
required: no
format: boolean (true/false)
example: allowfw=true
confidence: not observable
description: allow forwarding. Same “Response options” menu as above.
required: no
format: boolean (true/false)
example: hideattn=true
confidence: not observable
description: hide the attendee list. Same “Response options” menu as above.
required: no
format: string
confidence: not observable
description: unknown, probably the target calendar folder.
These were replayed against the compose form and produced no change, so do not rely on them:
private and sensitivity: the privacy control stays on “Not private”.categories: no category is applied.reminder: the reminder control keeps its default.charm: no event charm is selected.