Browse the docs
API reference
Calendar
Meetings on the workspace calendar, invitations, and the caller's public booking links.
List calendar items
GET/v1/calendar
Meetings and connected external events between two times, up to 62 days, with repeating meetings expanded. Teammates' meetings the caller may not see arrive as busy blocks with access "busy".
Requires calendar.read
Query parameters
fromISO daterequiredStart of the window, an ISO time.
toISO daterequiredEnd of the window, an ISO time after from.
overlaystringComma-separated member ids whose calendars to add, up to 20.
curl "https://atrix.dev/api/v1/calendar?from=2026-11-02&to=2026-11-02" \
-H "Authorization: Bearer $ATRIX_TOKEN"{
"items": [
{
"kind": "event",
"access": "full",
"key": "cm4m1q8de0002yt09kz3b7r4n:2026-10-28T09:00:00.000Z",
"eventId": "cm4m1q8de0002yt09kz3b7r4n",
"seriesId": null,
"occurrenceStart": "2026-10-28T09:00:00.000Z",
"startsAt": "2026-10-28T09:00:00.000Z",
"endsAt": "2026-10-28T09:30:00.000Z",
"allDay": false,
"ownerMemberId": "cm3z8p1aa0000qs07h2k5t9we",
"title": "Weekly standup",
"location": null,
"meetingUrl": "https://meet.google.com/abc-defg-hij",
"status": "CONFIRMED",
"organizerId": "cm3z8p1aa0000qs07h2k5t9we",
"isOrganizer": true,
"myResponse": "ACCEPTED",
"attendeeCount": 5,
"repeating": true,
"visibility": "DEFAULT"
}
]
}Get a meeting
GET/v1/calendar/events/{id}
One meeting as the caller may see it, with attendees, the caller's reminders and linked records. Pass at to read one occurrence of a repeating meeting.
Requires calendar.read
Path parameters
idstringrequiredThe event id.
Query parameters
atISO dateThe occurrence start, for a repeating meeting.
curl "https://atrix.dev/api/v1/calendar/events/ID" \
-H "Authorization: Bearer $ATRIX_TOKEN"{
"event": {
"id": "cm4m1q8de0002yt09kz3b7r4n",
"seriesId": null,
"title": "Northwind renewal call",
"description": "Walk through the two-year option.",
"startsAt": "2026-10-29T13:00:00.000Z",
"endsAt": "2026-10-29T13:45:00.000Z",
"allDay": false,
"timeZone": "Asia/Dubai",
"rrule": null,
"occurrenceStart": "2026-10-29T13:00:00.000Z",
"status": "CONFIRMED",
"visibility": "DEFAULT",
"isOrganizer": true,
"canEdit": true,
"organizer": {
"memberId": "cm3z8p1aa0000qs07h2k5t9we",
"name": "Sara Khan",
"image": null
},
"attendees": [
{
"id": "cm4m1q9fh0004yt09d2w8s1kx",
"memberId": null,
"email": "li@northwind.com",
"name": "li@northwind.com",
"image": null,
"response": "NEEDS_ACTION",
"optional": false,
"organizer": false
}
],
"sharedMemberIds": [],
"myReminders": [
{
"minutesBefore": 10,
"channel": "PUSH"
}
],
"links": {
"deal": {
"id": "cm4k2wb1r0003lb08q9z6m4c7",
"title": "Annual platform licence"
},
"contact": null,
"project": null,
"application": null,
"page": null
}
}
}Schedule a meeting
POST/v1/calendar/events
Creates a meeting organized by the token's owner and invites the attendees. A refusal comes back as { error }.
Requires calendar.write
Body
titlestringrequiredThe meeting title, 1-200 characters.
startsAtstringrequiredAn ISO instant, or YYYY-MM-DD when allDay is true.
endsAtstringrequiredAn ISO instant, or the last day inclusive (YYYY-MM-DD) when allDay is true.
allDaybooleanWhether it is an all-day event; defaults to false.
timeZonestringAn IANA time zone, e.g. Asia/Dubai.
descriptionstringUp to 10,000 characters, or null.
locationstringUp to 300 characters, or null.
meetingUrlstringAn http or https link, or null or an empty string.
meetingPlatformenumWhich service the meeting link is on, or null.
GOOGLE_MEETZOOMTEAMSOTHERrepeatenumHow it repeats; defaults to none.
nonedailyweekdaysweeklymonthlyyearlycustomrrulestringAn RFC 5545 rule for a custom repeat, up to 500 characters.
visibilityenumWho may see the details; defaults to DEFAULT.
DEFAULTPRIVATEPUBLICstatusenumDefaults to CONFIRMED.
CONFIRMEDTENTATIVEattendeeMemberIdsstring[]Member ids to invite, up to 200.
optionalMemberIdsstring[]Member ids invited as optional, up to 200.
guestEmailsstring[]Outside guests by email, up to 200.
remindersobject[]Up to 5 of { minutesBefore, channel: PUSH | EMAIL }; defaults to one push 10 minutes before.
dealIdstringLink the meeting to a deal.
contactIdstringLink the meeting to a contact.
projectIdstringLink the meeting to a product.
applicationIdstringLink the meeting to a job application.
curl -X POST "https://atrix.dev/api/v1/calendar/events" \
-H "Authorization: Bearer $ATRIX_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "title": "…", "startsAt": "…", "endsAt": "…" }'{
"ok": true,
"eventId": "cm4m1q8de0002yt09kz3b7r4n"
}Change a meeting
PATCH/v1/calendar/events/{id}
Changes a meeting the token's owner organizes; fields left out are left alone. For a repeating meeting, occurrenceStart and scope choose which occurrences change.
Requires calendar.write
Path parameters
idstringrequiredThe event id.
Body
titlestringThe meeting title, 1-200 characters.
startsAtstringAn ISO instant, or YYYY-MM-DD when allDay is true.
endsAtstringAn ISO instant, or the last day inclusive (YYYY-MM-DD) when allDay is true.
allDaybooleanWhether it is an all-day event.
timeZonestringAn IANA time zone, e.g. Asia/Dubai.
descriptionstringUp to 10,000 characters, or null.
locationstringUp to 300 characters, or null.
meetingUrlstringAn http or https link, or null or an empty string.
meetingPlatformenumWhich service the meeting link is on, or null.
GOOGLE_MEETZOOMTEAMSOTHERrepeatenumHow it repeats.
nonedailyweekdaysweeklymonthlyyearlycustomrrulestringAn RFC 5545 rule for a custom repeat, up to 500 characters.
visibilityenumWho may see the details.
DEFAULTPRIVATEPUBLICstatusenumConfirmed or tentative.
CONFIRMEDTENTATIVEattendeeMemberIdsstring[]Member ids to invite, up to 200.
optionalMemberIdsstring[]Member ids invited as optional, up to 200.
guestEmailsstring[]Outside guests by email, up to 200.
remindersobject[]Up to 5 of { minutesBefore, channel: PUSH | EMAIL }.
dealIdstringLink the meeting to a deal.
contactIdstringLink the meeting to a contact.
projectIdstringLink the meeting to a product.
applicationIdstringLink the meeting to a job application.
occurrenceStartISO dateThe occurrence being edited, for a repeating meeting.
scopeenumWhich occurrences to change; defaults to all.
thisfollowingall
curl -X PATCH "https://atrix.dev/api/v1/calendar/events/ID" \
-H "Authorization: Bearer $ATRIX_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "title": "…", "startsAt": "…" }'{
"ok": true,
"eventId": "cm4m1q8de0002yt09kz3b7r4n"
}Cancel a meeting
DELETE/v1/calendar/events/{id}
Cancels a meeting the token's owner organizes; the row is kept as CANCELLED so invitees are told. For a repeating meeting, at and scope choose which occurrences.
Requires calendar.write
Path parameters
idstringrequiredThe event id.
Query parameters
atISO dateThe occurrence start, for a repeating meeting.
scopeenumWhich occurrences to cancel; defaults to all.
thisfollowingall
curl -X DELETE "https://atrix.dev/api/v1/calendar/events/ID" \
-H "Authorization: Bearer $ATRIX_TOKEN"{
"ok": true
}Answer an invitation
POST/v1/calendar/events/{id}/respond
Records the token owner's answer to a meeting they are invited to but do not organize.
Requires calendar.write
Path parameters
idstringrequiredThe event id.
Body
responseenumrequiredThe answer.
ACCEPTEDDECLINEDTENTATIVE
curl -X POST "https://atrix.dev/api/v1/calendar/events/ID/respond" \
-H "Authorization: Bearer $ATRIX_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "response": "ACCEPTED" }'{
"ok": true
}Get booking links
GET/v1/calendar/sharing
The caller's personal booking link and every booking page they own, each with its public URL.
Requires calendar.read
curl "https://atrix.dev/api/v1/calendar/sharing" \
-H "Authorization: Bearer $ATRIX_TOKEN"{
"handle": "sara",
"ownerName": "Sara Khan",
"suggestion": "sara",
"profileUrl": "https://atrix.dev/book/sara",
"bookBase": "https://atrix.dev/book/",
"upcoming": 3,
"maxPages": 5,
"pages": [
{
"id": "cm4n7c2kp0001hx08b5y3q6ta",
"slug": "sara-intro",
"title": "Intro call",
"description": "A first 30 minutes.",
"durations": [
30
],
"active": true,
"withMeet": true,
"url": "https://atrix.dev/book/sara-intro"
}
]
}Set personal booking link
PUT/v1/calendar/sharing
Claims, changes or gives up the caller's personal link; the old link stops working at once.
Requires calendar.write
Body
handlestringrequired3-40 lowercase letters, numbers and single dashes, or null to give the link up.
curl -X PUT "https://atrix.dev/api/v1/calendar/sharing" \
-H "Authorization: Bearer $ATRIX_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "handle": "…" }'{
"ok": true,
"url": "https://atrix.dev/book/sara"
}