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 daterequired

    Start of the window, an ISO time.

  • toISO daterequired

    End of the window, an ISO time after from.

  • overlaystring

    Comma-separated member ids whose calendars to add, up to 20.

Request
curl "https://atrix.dev/api/v1/calendar?from=2026-11-02&to=2026-11-02" \
  -H "Authorization: Bearer $ATRIX_TOKEN"
Response
{
  "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

  • idstringrequired

    The event id.

Query parameters

  • atISO date

    The occurrence start, for a repeating meeting.

Request
curl "https://atrix.dev/api/v1/calendar/events/ID" \
  -H "Authorization: Bearer $ATRIX_TOKEN"
Response
{
  "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

  • titlestringrequired

    The meeting title, 1-200 characters.

  • startsAtstringrequired

    An ISO instant, or YYYY-MM-DD when allDay is true.

  • endsAtstringrequired

    An ISO instant, or the last day inclusive (YYYY-MM-DD) when allDay is true.

  • allDayboolean

    Whether it is an all-day event; defaults to false.

  • timeZonestring

    An IANA time zone, e.g. Asia/Dubai.

  • descriptionstring

    Up to 10,000 characters, or null.

  • locationstring

    Up to 300 characters, or null.

  • meetingUrlstring

    An http or https link, or null or an empty string.

  • meetingPlatformenum

    Which service the meeting link is on, or null.

    GOOGLE_MEETZOOMTEAMSOTHER

  • repeatenum

    How it repeats; defaults to none.

    nonedailyweekdaysweeklymonthlyyearlycustom

  • rrulestring

    An RFC 5545 rule for a custom repeat, up to 500 characters.

  • visibilityenum

    Who may see the details; defaults to DEFAULT.

    DEFAULTPRIVATEPUBLIC

  • statusenum

    Defaults to CONFIRMED.

    CONFIRMEDTENTATIVE

  • attendeeMemberIdsstring[]

    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.

  • dealIdstring

    Link the meeting to a deal.

  • contactIdstring

    Link the meeting to a contact.

  • projectIdstring

    Link the meeting to a product.

  • applicationIdstring

    Link the meeting to a job application.

Request
curl -X POST "https://atrix.dev/api/v1/calendar/events" \
  -H "Authorization: Bearer $ATRIX_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "title": "…", "startsAt": "…", "endsAt": "…" }'
Response
{
  "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

  • idstringrequired

    The event id.

Body

  • titlestring

    The meeting title, 1-200 characters.

  • startsAtstring

    An ISO instant, or YYYY-MM-DD when allDay is true.

  • endsAtstring

    An ISO instant, or the last day inclusive (YYYY-MM-DD) when allDay is true.

  • allDayboolean

    Whether it is an all-day event.

  • timeZonestring

    An IANA time zone, e.g. Asia/Dubai.

  • descriptionstring

    Up to 10,000 characters, or null.

  • locationstring

    Up to 300 characters, or null.

  • meetingUrlstring

    An http or https link, or null or an empty string.

  • meetingPlatformenum

    Which service the meeting link is on, or null.

    GOOGLE_MEETZOOMTEAMSOTHER

  • repeatenum

    How it repeats.

    nonedailyweekdaysweeklymonthlyyearlycustom

  • rrulestring

    An RFC 5545 rule for a custom repeat, up to 500 characters.

  • visibilityenum

    Who may see the details.

    DEFAULTPRIVATEPUBLIC

  • statusenum

    Confirmed or tentative.

    CONFIRMEDTENTATIVE

  • attendeeMemberIdsstring[]

    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 }.

  • dealIdstring

    Link the meeting to a deal.

  • contactIdstring

    Link the meeting to a contact.

  • projectIdstring

    Link the meeting to a product.

  • applicationIdstring

    Link the meeting to a job application.

  • occurrenceStartISO date

    The occurrence being edited, for a repeating meeting.

  • scopeenum

    Which occurrences to change; defaults to all.

    thisfollowingall

Request
curl -X PATCH "https://atrix.dev/api/v1/calendar/events/ID" \
  -H "Authorization: Bearer $ATRIX_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "title": "…", "startsAt": "…" }'
Response
{
  "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

  • idstringrequired

    The event id.

Query parameters

  • atISO date

    The occurrence start, for a repeating meeting.

  • scopeenum

    Which occurrences to cancel; defaults to all.

    thisfollowingall

Request
curl -X DELETE "https://atrix.dev/api/v1/calendar/events/ID" \
  -H "Authorization: Bearer $ATRIX_TOKEN"
Response
{
  "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

  • idstringrequired

    The event id.

Body

  • responseenumrequired

    The answer.

    ACCEPTEDDECLINEDTENTATIVE

Request
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" }'
Response
{
  "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

Request
curl "https://atrix.dev/api/v1/calendar/sharing" \
  -H "Authorization: Bearer $ATRIX_TOKEN"
Response
{
  "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

  • handlestringrequired

    3-40 lowercase letters, numbers and single dashes, or null to give the link up.

Request
curl -X PUT "https://atrix.dev/api/v1/calendar/sharing" \
  -H "Authorization: Bearer $ATRIX_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "handle": "…" }'
Response
{
  "ok": true,
  "url": "https://atrix.dev/book/sara"
}