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.
/api/calendar/connectionsRead 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
| Field | Type | Required | Details |
|---|---|---|---|
ready | object | No | |
callbacks | object | No | |
items | CalendarConnection[] | No | |
exports | object[] | No |
curl --request GET \
--url 'https://app.drykraft.com/api/calendar/connections' \
--cookie 'drykraft_session=<YOUR_SESSION_TOKEN>'/api/calendar/connections/{id}/choicesList 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[].
curl --request GET \
--url 'https://app.drykraft.com/api/calendar/connections/00000000-0000-4000-8000-000000000001/choices' \
--cookie 'drykraft_session=<YOUR_SESSION_TOKEN>'/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
| Field | Type | Required | Details |
|---|---|---|---|
version | integer | Yes | Positive optimistic version returned by the latest read. Refresh on 409; do not overwrite stale changes. Min 1. |
calendar_id | string | Yes | Provider calendar ID Max 2000 characters. |
enabled | boolean | Yes | Import busy times |
export_enabled | boolean | Yes | Export DryKraft appointment titles/times/locations; no attendees or internal notes |
Response
Use CalendarConnection.
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
}'/api/calendar/connections/{id}/syncSync 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
| Field | Type | Required | Details |
|---|
Response
| Field | Type | Required | Details |
|---|---|---|---|
synced | boolean | No | Completed pull |
skipped | boolean | No | Disabled/inactive plan |
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 '{}'/api/calendar/connections/{id}/disablePause 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
| Field | Type | Required | Details |
|---|---|---|---|
version | integer | Yes | Positive optimistic version returned by the latest read. Refresh on 409; do not overwrite stale changes. Min 1. |
Response
Use CalendarConnection.
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
}'/api/calendar/connections/{id}/exports/{exportId}/reconcileApprove 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
| Field | Type | Required | Details |
|---|---|---|---|
appointment_version | integer | Yes | Positive optimistic version returned by the latest read. Refresh on 409; do not overwrite stale changes. Min 1. |
acknowledge_overwrite | true | Yes |
Response
| Field | Type | Required | Details |
|---|---|---|---|
queued | boolean | No | Queued for sync |
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
}'/api/calendar/busyRead 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
| Parameter | Type | Required | Details |
|---|---|---|---|
from | date-time | Yes | ISO instant with explicit UTC offset. |
to | date-time | Yes | ISO instant with explicit UTC offset. |
calendar_id | uuid | No |
No request body is required.
Response
object[].
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>'/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
| Field | Type | Required | Details |
|---|
Response
| Field | Type | Required | Details |
|---|---|---|---|
url | string | No | Provider authorization URL |
curl --request POST \
--url 'https://app.drykraft.com/api/calendar/oauth/google' \
--cookie 'drykraft_session=<YOUR_SESSION_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{}'/api/calendar/oauth/{provider}/callbackComplete 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
| Parameter | Type | Required | Details |
|---|---|---|---|
state | string | Yes | Required one-use64-character hex state |
code | string | No | Required when error is absent; provider authorization code |
error | string | No | Provider 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.
