Browse documentation

Calendar connections

Current release · Updated October 2, 2026

DryKraft Calendar connections reference: methods, permissions, request fields, response shapes, examples and current limits. Read authentication and error handling first.

GET/api/calendar/connections

Read own calendar connections

Access: Workspace member · Success: 200

Only the current user’s workspace connections and latest50 export outcomes. Includes readiness and callback addresses; no access/refresh tokens or ciphertext.

No request body is required.

Response

FieldTypeRequiredDetails
readyobjectNo
callbacksobjectNo
itemsCalendarConnection[]No
exportsobject[]No
Request shape (illustrative)
curl --request GET \
  --url 'https://app.drykraft.com/api/calendar/connections' \
  --cookie 'drykraft_session=<YOUR_SESSION_TOKEN>'
GET/api/calendar/connections/{id}/choices

List editable provider calendars

Access: Owner, admin or member · Success: 200

Current user only. Refreshes private provider tokens if needed. At most250 Google or100 Microsoft choices; excess accounts fail rather than returning a misleading partial picker.

No request body is required.

Response

object[].

Request shape (illustrative)
curl --request GET \
  --url 'https://app.drykraft.com/api/calendar/connections/00000000-0000-4000-8000-000000000001/choices' \
  --cookie 'drykraft_session=<YOUR_SESSION_TOKEN>'
PUT/api/calendar/connections/{id}

Configure calendar sync

Access: Owner, admin or member · Success: 200

Current connection version and editable provider calendar required. Import and export require deliberate selection; OAuth creates disabled connections. Choosing a different calendar is blocked once exports exist. Save clears sync freshness; sync must verify busy ranges before booking.

JSON request

FieldTypeRequiredDetails
versionintegerYesPositive optimistic version returned by the latest read. Refresh on 409; do not overwrite stale changes. Min 1.
calendar_idstringYesProvider calendar ID Max 2000 characters.
enabledbooleanYesImport busy times
export_enabledbooleanYesExport DryKraft appointment titles/times/locations; no attendees or internal notes

Response

Use CalendarConnection.

Request shape (illustrative)
curl --request PUT \
  --url 'https://app.drykraft.com/api/calendar/connections/00000000-0000-4000-8000-000000000001' \
  --cookie 'drykraft_session=<YOUR_SESSION_TOKEN>' \
  --header 'Content-Type: application/json' \
  --data '{
  "version": 1,
  "calendar_id": "<Provider calendar ID>",
  "enabled": false,
  "export_enabled": false
}'
POST/api/calendar/connections/{id}/sync

Sync provider calendar

Access: Owner, admin or member · Success: 200

Own enabled connection. Pull expands recurring events from31days before to92days after today, up to2000 events/eight pages; unsupported/partial lists fail closed. Busy cache stores no titles or guest lists. Up to20 pending exports per pass. Ambiguous writes freeze until a matching provider marker is recovered, with no blind create retry.

JSON request

FieldTypeRequiredDetails

Response

FieldTypeRequiredDetails
syncedbooleanNoCompleted pull
skippedbooleanNoDisabled/inactive plan
Request shape (illustrative)
curl --request POST \
  --url 'https://app.drykraft.com/api/calendar/connections/00000000-0000-4000-8000-000000000001/sync' \
  --cookie 'drykraft_session=<YOUR_SESSION_TOKEN>' \
  --header 'Content-Type: application/json' \
  --data '{}'
POST/api/calendar/connections/{id}/disable

Pause calendar connection

Access: Owner, admin or member · Success: 200

Current version required. Disables future imports/exports and removes its availability requirement. Existing provider events are retained. An in-flight provider request may finish. Available after billing expiry.

JSON request

FieldTypeRequiredDetails
versionintegerYesPositive optimistic version returned by the latest read. Refresh on 409; do not overwrite stale changes. Min 1.

Response

Use CalendarConnection.

Request shape (illustrative)
curl --request POST \
  --url 'https://app.drykraft.com/api/calendar/connections/00000000-0000-4000-8000-000000000001/disable' \
  --cookie 'drykraft_session=<YOUR_SESSION_TOKEN>' \
  --header 'Content-Type: application/json' \
  --data '{
  "version": 1
}'
POST/api/calendar/connections/{id}/exports/{exportId}/reconcile

Approve connected-event overwrite

Access: Owner, admin or member · Success: 200

Only an own connection’s conflict receipt, with current appointment version and explicit acknowledgement. Queues the DryKraft title/time/location against the provider’s latest ETag. Does not merge provider edits into the appointment.

JSON request

FieldTypeRequiredDetails
appointment_versionintegerYesPositive optimistic version returned by the latest read. Refresh on 409; do not overwrite stale changes. Min 1.
acknowledge_overwritetrueYes

Response

FieldTypeRequiredDetails
queuedbooleanNoQueued for sync
Request shape (illustrative)
curl --request POST \
  --url 'https://app.drykraft.com/api/calendar/connections/00000000-0000-4000-8000-000000000001/exports/{exportId}/reconcile' \
  --cookie 'drykraft_session=<YOUR_SESSION_TOKEN>' \
  --header 'Content-Type: application/json' \
  --data '{
  "appointment_version": 1,
  "acknowledge_overwrite": true
}'
GET/api/calendar/busy

Read own imported busy times

Access: Workspace member · Success: 200

Range up to62days, at most1000 rows. Only current user’s enabled calendars; anonymous time/provider metadata, no foreign titles or guest lists.

Query parameters

ParameterTypeRequiredDetails
fromdate-timeYesISO instant with explicit UTC offset.
todate-timeYesISO instant with explicit UTC offset.
calendar_iduuidNo

No request body is required.

Response

object[].

Request shape (illustrative)
curl --request GET \
  --url 'https://app.drykraft.com/api/calendar/busy?from=%3CISO%20instant%20with%20explicit%20UTC%20offset%3E&to=%3CISO%20instant%20with%20explicit%20UTC%20offset%3E' \
  --cookie 'drykraft_session=<YOUR_SESSION_TOKEN>'
POST/api/calendar/oauth/{provider}

Start calendar sign-in

Access: Owner, admin or member · Success: 200

Google or Microsoft native OAuth with session-bound one-use state and PKCE. Register the separate Calendar callback and enable Google Calendar API. Shared demo cannot connect real accounts. No email mailbox grant is reused as calendar permission.

JSON request

FieldTypeRequiredDetails

Response

FieldTypeRequiredDetails
urlstringNoProvider authorization URL
Request shape (illustrative)
curl --request POST \
  --url 'https://app.drykraft.com/api/calendar/oauth/google' \
  --cookie 'drykraft_session=<YOUR_SESSION_TOKEN>' \
  --header 'Content-Type: application/json' \
  --data '{}'
GET/api/calendar/oauth/{provider}/callback

Complete calendar sign-in

Access: Account session · Success: 302

Initiating account/session and current workspace write access required. Offline access is encrypted; connection remains disabled until configured. State expires after10minutes. Cancellation redirects without granting a connection.

Query parameters

ParameterTypeRequiredDetails
statestringYesRequired one-use64-character hex state
codestringNoRequired when error is absent; provider authorization code
errorstringNoProvider denial

No request body is required.

Response

string. Redirect to Calendar connections

Use the provider configuration or private generated link described above; this is not a session-based example.