An Apple Calendar API for your own scripts
Apple has no web API for Calendar, so a script that wants your events usually ends up speaking CalDAV. Calnio puts a plain HTTP API in front of it. The token you make for the Claude connector also works from curl, Python or a shell script, with the same limits. This is the whole of it.
3 min read
Get a token
Open Connections in Calnio, press the Apple Calendar MCP tile and press Create address. The address ends in a token. Copy the token part, the string after calnio.app/mcp/, and keep it private: it reads and edits every calendar in your Apple account. Calnio shows it once and keeps only a hash.
The API needs the paid plan or the 7-day trial, with Apple Calendar connected. On the free plan, or after a trial that ended, every call answers 403.
List your calendars
Every call sends the token as a bearer header. To list the calendars: curl https://calnio.app/api/v1/public/calendars -H "Authorization: Bearer YOUR_TOKEN"
Each calendar comes back with an id and a name. The id is the last piece of the calendar's CalDAV path, and the other calls take it as CALENDAR_ID.
List events in a range
For one calendar: curl "https://calnio.app/api/v1/public/calendars/CALENDAR_ID/events?start=2026-11-02T00:00:00Z&end=2026-11-09T00:00:00Z" -H "Authorization: Bearer YOUR_TOKEN"
For every calendar at once, call https://calnio.app/api/v1/public/events with the same start and end. The events come back in order of start, each with the id and name of its calendar. Add query=dentist to keep only events whose title holds that text.
A range is at most 366 days and a read returns at most 1000 events. A repeating event comes back as one event for each time it happens.
Add, change and delete
To add an event: curl -X POST https://calnio.app/api/v1/public/calendars/CALENDAR_ID/events -H "Authorization: Bearer YOUR_TOKEN" -H "Content-Type: application/json" -d '{"title": "Lunch", "start": "2026-11-05T11:00:00Z", "end": "2026-11-05T12:00:00Z"}'
Change an event with PATCH on /api/v1/public/calendars/CALENDAR_ID/events/UID, sending only the fields that change. The event is edited in place, so alarms and notes you set in Apple Calendar stay. DELETE on the same address removes it, and that cannot be undone. GET on it reads one event.
A repeating event, or one with guests, is read but never changed or deleted. The answer is 409.
Times, all-day events and limits
A timed event carries a UTC offset, like 2026-11-05T11:00:00Z or 2026-11-05T11:00:00-05:00. A plain date for a timed event is a 400.
An all-day event uses plain dates with all_day set to true, like start 2026-11-05 and end 2026-11-06 for the one day of the 5th. The end is the day after the last day. Plain dates are used so that a midnight in one time zone never lands on the day before in another.
The token allows 60 requests a minute, and the 61st gets a 429 with a Retry-After header. A calendar Apple keeps read-only, such as a subscription, refuses a write with Apple's own message. The API covers Apple Calendar only.
If a Notion sync fills the calendar
A change made through the API reaches Notion like any edit made in Apple Calendar. With two-way sync on for that sync, a new event becomes a page and deleting an event Calnio made sends its page to the Notion trash. Two-way sync between Notion and Apple Calendar has the rules.