Slatis Public API v1 is open for beta testers Register on the waitlist →
Slatis

Calendars

Read calendar integration metadata for team members — provider, connected email, and sync status. Requires a secret key with the calendars:read scope.

The Calendars API exposes calendar integration metadata for your organization's team members. It is read-only and returns no OAuth tokens or credentials.

Requires the calendars:read scope on a secret key (sk_*). Public keys are not accepted.

List calendars

GET /v1/calendars

Returns all calendar integrations across your organization, ordered by primary calendar first, then by creation date.

curl "https://api.slatis.com/v1/calendars?provider=GOOGLE&limit=20" \
  -H "Authorization: Bearer sk_live_xxxxxxxxxxxxxxxxxxxx"

Query parameters

PropTypeDefault
userId
UUID
-
teamId
string
-
provider
"GOOGLE" | "MICROSOFT" | "APPLE"
-
syncStatus
"PENDING" | "SYNCING" | "SUCCESS" | "ERROR" | "NEEDS_REAUTH"
-
limit
integer
50
offset
integer
0

Sync status values:

ValueMeaning
PENDINGIntegration created but not yet synced
SYNCINGSync currently in progress
SUCCESSLast sync completed successfully
ERRORLast sync failed — check lastSyncAt
NEEDS_REAUTHOAuth token expired, user must reconnect

Response

{
  "success": true,
  "calendars": [
    {
      "id": "cal_01abc",
      "userId": "usr_01abc",
      "teamId": "team_01",
      "provider": "GOOGLE",
      "calendarId": "jane@example.com",
      "calendarName": "Jane Smith",
      "providerEmail": "jane@example.com",
      "timezone": "America/New_York",
      "isPrimary": true,
      "syncStatus": "SUCCESS",
      "lastSyncAt": "2026-05-01T12:00:00.000Z",
      "supportsWebhooks": true,
      "createdAt": "2026-01-15T09:00:00.000Z",
      "updatedAt": "2026-05-01T12:00:00.000Z"
    }
  ],
  "pagination": {
    "total": 8,
    "limit": 20,
    "offset": 0,
    "hasMore": false
  }
}

Get calendars for a user

Returns all calendars connected by a specific team member.

GET /v1/calendars/{userId}
curl "https://api.slatis.com/v1/calendars/usr_01abc" \
  -H "Authorization: Bearer sk_live_xxxxxxxxxxxxxxxxxxxx"
{
  "success": true,
  "userId": "usr_01abc",
  "calendars": [
    {
      "id": "cal_01abc",
      "provider": "GOOGLE",
      "calendarName": "Jane Smith",
      "providerEmail": "jane@example.com",
      "isPrimary": true,
      "syncStatus": "SUCCESS",
      "lastSyncAt": "2026-05-01T12:00:00.000Z"
    },
    {
      "id": "cal_01def",
      "provider": "GOOGLE",
      "calendarName": "Team Shared",
      "providerEmail": "team@example.com",
      "isPrimary": false,
      "syncStatus": "SUCCESS",
      "lastSyncAt": "2026-05-01T11:30:00.000Z"
    }
  ]
}

Returns 404 not_found if the user does not exist in your organization or is not an active team member.

Response fields

PropTypeDefault
id
string
-
userId
UUID
-
teamId
string
-
provider
"GOOGLE" | "MICROSOFT" | "APPLE"
-
calendarId
string
-
calendarName
string
-
providerEmail
string
-
timezone
string
-
isPrimary
boolean
-
syncStatus
string
-
lastSyncAt
ISO 8601
-
supportsWebhooks
boolean
-

Common patterns

Detect stale integrations — find members who need to reconnect:

const { calendars } = await slatis.calendars.list({
  syncStatus: 'NEEDS_REAUTH',
})
 
for (const cal of calendars) {
  console.log(`${cal.providerEmail} needs to reconnect their ${cal.provider} calendar`)
}

Check before scheduling — verify a member has a healthy primary calendar before assigning a booking:

const { calendars } = await slatis.calendars.list({ userId: memberId })
const primary = calendars.find(c => c.isPrimary)
 
if (!primary || primary.syncStatus !== 'SUCCESS') {
  throw new Error('Member calendar is not available for scheduling')
}

On this page