API Documentation

Two endpoints, same query parameters. No authentication required.

Endpoints

GET /event.ics

Returns a downloadable .ics file (RFC 5545). Works as a direct link in emails, websites, or anywhere a URL is accepted.

Content-Type: text/calendar; charset=utf-8
GET /links

Returns JSON with pre-built deep links for Google Calendar, Outlook, Yahoo, and a direct ICS download URL. CORS-enabled for client-side use.

Content-Type: application/json; charset=utf-8

Response shape

{
  "ics_url": "https://api.getcal.link/event.ics?title=...",
  "google_url": "https://calendar.google.com/calendar/render?...",
  "outlook_url": "https://outlook.live.com/calendar/0/action/compose?...",
  "yahoo_url": "https://calendar.yahoo.com/?..."
}

Query parameters

ParameterRequiredDescription
title Yes Event title
start Yes Start datetime — ISO 8601 (2026-02-15T14:00:00Z) or compact (20260215T140000Z)
end Yes End datetime — same formats as start
description No Event description (newlines supported)
location No Event location or meeting URL
url No A URL to attach to the event
organizer No Organizer display name
organizer_email No Organizer email address
reminder No Minutes before event to trigger an alarm (e.g. 15)
uid No Unique event ID — auto-generated if omitted
rrule No Recurrence rule, e.g. FREQ=WEEKLY;COUNT=10

Date and time formats

Both start and end accept:

  • ISO 86012026-02-15T14:00:00Z or 2026-02-15T14:00:00+00:00
  • Compact ICS20260215T140000Z

All datetimes are normalised to UTC. The end must be after start.

Recurrence rules

The rrule parameter accepts standard iCalendar recurrence rules (RFC 5545 Section 3.8.5.3).

FREQ=DAILY;COUNT=5 Repeat daily for 5 days
FREQ=WEEKLY;BYDAY=MO,WE,FR Every Monday, Wednesday, Friday
FREQ=MONTHLY;BYMONTHDAY=1;COUNT=12 First of every month for a year

Examples

Direct ICS download link (HTML)

<a href="https://api.getcal.link/event.ics?title=Team+standup&start=2026-02-15T14:00:00Z&end=2026-02-15T14:30:00Z&reminder=15">
  Add to Calendar
</a>

Fetch links from JavaScript

const res = await fetch(
  'https://api.getcal.link/links?title=Team+standup&start=2026-02-15T14:00:00Z&end=2026-02-15T14:30:00Z'
);
const links = await res.json();

// links.ics_url     — direct .ics download
// links.google_url  — Google Calendar deep link
// links.outlook_url — Outlook Web deep link
// links.yahoo_url   — Yahoo Calendar deep link

cURL

curl "https://api.getcal.link/links?title=Team+standup&start=2026-02-15T14:00:00Z&end=2026-02-15T14:30:00Z" | jq .

Liquid / Braze email template

<a href="https://api.getcal.link/event.ics?title={{ event_name | url_encode }}&start={{ event_start }}&end={{ event_end }}&location={{ event_location | url_encode }}">
  Add to Calendar
</a>

Mailchimp merge tags

<a href="https://api.getcal.link/event.ics?title=*|EVENT_TITLE|*&start=*|EVENT_START|*&end=*|EVENT_END|*">
  Add to Calendar
</a>

Error handling

Errors return JSON with an error field and the appropriate HTTP status code:

StatusMeaning
400Missing or invalid parameter (message describes the issue)
405Method not allowed (only GET is supported)
429Rate limit exceeded (MCP endpoint only, 100 req/min)
404Unknown path
{ "error": "Missing required parameter(s): title, start" }

CORS

All endpoints return permissive CORS headers. You can call the API directly from browser JavaScript on any domain:

Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, OPTIONS
Access-Control-Allow-Headers: Content-Type