Skip to content
SSalesShiftDocs
API reference

Calendar

Calendars, events, agenda, ICS export, event invitations and the public RSVP flow.

17 endpoints· 3 called live· verified against http://127.0.0.1:8741

17 endpoints

GET/api/v1/salesshift/calendar/agendaCalled liveFlat, sorted list of what is coming up — events and bookings together.
Auth
get_org_user
Scope
organization
Success
200 · application/json
Envelope
success+data

Query parameters

NameTypeRequiredNotes
daysintegeroptionalDefault 14. min 1. max 180.
qstring?optional

Request

curl
curl 'https://api.vxcloud.io/api/v1/salesshift/calendar/agenda' \
  -H "Authorization: Bearer $SS_TOKEN"

Response · 200

Observed shape
{
  "success": "bool",
  "data": {
    "items": [
      {
        "source": "...",
        "id": "...",
        "master_id": "...",
        "calendar_id": "...",
        "owner_id": "...",
        "title": "...",
        "description": "...",
        "location": "...",
        "meeting_url": "...",
        "start_at": "...",
        "end_at": "...",
        "all_day": "...",
        "timezone": "...",
        "color": "...",
        "status": "...",
        "transparency": "...",
        "recurrence_rule": "...",
        "recurring_event_id": "...",
        "original_start_at": "...",
        "exdates": "...",
        "attendees": "...",
        "reminders": "...",
        "contact_id": "...",
        "deal_id": "...",
        "is_recurring": "...",
        "is_occurrence": "...",
        "is_override": "...",
        "occurrence_start": "...",
        "sequence": "...",
        "organizer_email": "...",
        "organizer_name": "...",
        "invites_sent_at": "...",
        "created_at": "...",
        "updated_at": "..."
      },
      "...x6"
    ],
    "days": "int",
    "window": {
      "start": "str",
      "end": "str"
    }
  }
}
Observed on 2026-08-06 — keys are real, values are the types that came back.
#get-api-v1-salesshift-calendar-agendacalendar_router · vxcloud_fastapiclient/app/services/salesshift/calendar_router.py:1064Called against http://127.0.0.1:8741 on 2026-08-06 with a real JWT; the response matched the shape recorded below.
GET/api/v1/salesshift/calendar/eventsCalled liveEverything overlapping [start, end): recurring series expanded into occurrences, detached overrides applied, plus guest bookings.

Everything overlapping [start, end): recurring series expanded into occurrences, detached overrides applied, plus guest bookings.

Auth
get_org_user
Scope
organization
Success
200 · application/json
Envelope
success+data

Query parameters

NameTypeRequiredNotes
startstring?optionalISO-8601 window start
endstring?optionalISO-8601 window end
calendar_idsstring?optionalcomma-separated calendar ids
qstring?optionaltext search
include_bookingsbooleanoptionalDefault true.

Request

curl
curl 'https://api.vxcloud.io/api/v1/salesshift/calendar/events' \
  -H "Authorization: Bearer $SS_TOKEN"

Response · 200

Observed shape
{
  "success": "bool",
  "data": {
    "events": [
      {
        "source": "...",
        "id": "...",
        "master_id": "...",
        "calendar_id": "...",
        "owner_id": "...",
        "title": "...",
        "description": "...",
        "location": "...",
        "meeting_url": "...",
        "start_at": "...",
        "end_at": "...",
        "all_day": "...",
        "timezone": "...",
        "color": "...",
        "status": "...",
        "transparency": "...",
        "recurrence_rule": "...",
        "recurring_event_id": "...",
        "original_start_at": "...",
        "exdates": "...",
        "attendees": "...",
        "reminders": "...",
        "contact_id": "...",
        "deal_id": "...",
        "is_recurring": "...",
        "is_occurrence": "...",
        "is_override": "...",
        "occurrence_start": "...",
        "sequence": "...",
        "organizer_email": "...",
        "organizer_name": "...",
        "invites_sent_at": "...",
        "created_at": "...",
        "updated_at": "..."
      },
      "...x15"
    ],
    "bookings": [
      "<empty list>"
    ],
    "window": {
      "start": "str",
      "end": "str"
    }
  }
}
Observed on 2026-08-06 — keys are real, values are the types that came back.

Errors

Statusdetail
400end must be after start
400Window too wide (max {...} days)
400Invalid calendar id {...}
#get-api-v1-salesshift-calendar-eventscalendar_router · vxcloud_fastapiclient/app/services/salesshift/calendar_router.py:1008Called against http://127.0.0.1:8741 on 2026-08-06 with a real JWT; the response matched the shape recorded below.
POST/api/v1/salesshift/calendar/eventsVerified in sessionCreate a calendar event, defaulting to the org's default calendar.
Auth
get_org_user
Scope
organization
Success
201 · application/json
Envelope
success+custom

Request body (required) — EventCreate

FieldTypeRequiredNotes
titlestringrequired≤ 300 chars.
start_atstring(date-time)required
end_atstring(date-time)required
descriptionstring?optional
locationstring?optional
meeting_urlstring?optional
all_daybooleanoptionalDefault false.
timezonestring?optional
colorstringoptionalDefault "primary". ≤ 20 chars.
statusstringoptionalDefault "confirmed". ≤ 20 chars.
transparencystringoptionalDefault "busy". ≤ 10 chars.
recurrence_rulestring?optional
attendeesobject[]?optional
remindersinteger[]?optional
contact_idstring(uuid)?optional
deal_idstring(uuid)?optional
calendar_idstring(uuid)?optional
send_invitesbooleanoptionalDefault true.

Values in the request below are typed placeholders, not sample data.

Request

curl
curl -X POST 'https://api.vxcloud.io/api/v1/salesshift/calendar/events' \
  -H "Authorization: Bearer $SS_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{ "title": "<string>", "start_at": "<string(date-time)>", "end_at": "<string(date-time)>", "description": "<string>", "location": "<string>", "meeting_url": "<string>", "all_day": false, "timezone": "<string>", "color": "primary", "status": "confirmed", "transparency": "busy", "recurrence_rule": "<string>", "attendees": [ "<object>" ], "reminders": [ "<integer>" ], "contact_id": "<string(uuid)>", "deal_id": "<string(uuid)>", "calendar_id": "<string(uuid)>", "send_invites": true }'

Response · 201

{success, data: <event>} plus `invitations` when invites were attempted.

#post-api-v1-salesshift-calendar-eventscalendar_router · vxcloud_fastapiclient/app/services/salesshift/calendar_router.py:1228The calendar feature was verified working against the live system in the session that produced this inventory. This specific route was not re-called during the inventory run.
GET/api/v1/salesshift/calendar/events/{event_id}Verified in sessionOne event plus the shape of the series it belongs to.
Auth
get_org_user
Scope
organization
Success
200 · application/json
Envelope
success+data

Path parameters

NameTypeRequiredNotes
event_idstring(uuid)required

Request

curl
curl 'https://api.vxcloud.io/api/v1/salesshift/calendar/events/{event_id}' \
  -H "Authorization: Bearer $SS_TOKEN"

Response · 200

Top-level keys
{
  "data": "…",
  "success": "…"
}
Top-level keys read from the handler's return statements.
#get-api-v1-salesshift-calendar-events-event-idcalendar_router · vxcloud_fastapiclient/app/services/salesshift/calendar_router.py:1157The calendar feature was verified working against the live system in the session that produced this inventory. This specific route was not re-called during the inventory run.
PATCH/api/v1/salesshift/calendar/events/{event_id}Verified in sessionPartial update with Google's recurring-edit scopes.

Partial update with Google's recurring-edit scopes. * ``all`` — edit the master; every occurrence follows. * ``this`` — detach the clicked instance into its own row (RECURRENCE-ID) and EXDATE it out of the master. * ``following`` — end the master with UNTIL just before the instance and start a fresh series from it, carrying over the remaining COUNT, the later EXDATEs and the later exceptions.

Auth
get_org_user
Scope
organization
Success
200 · application/json
Envelope
success+custom

Path parameters

NameTypeRequiredNotes
event_idstring(uuid)required

Query parameters

NameTypeRequiredNotes
scopestringoptionalDefault "all". Matches ^(this|following|all)$.
occurrence_startstring?optionalISO start of the clicked instance

Request body (required) — EventPatch

FieldTypeRequiredNotes
titlestring?optional
start_atstring(date-time)?optional
end_atstring(date-time)?optional
descriptionstring?optional
locationstring?optional
meeting_urlstring?optional
all_dayboolean?optional
timezonestring?optional
colorstring?optional
statusstring?optional
transparencystring?optional
recurrence_rulestring?optional
attendeesobject[]?optional
remindersinteger[]?optional
contact_idstring(uuid)?optional
deal_idstring(uuid)?optional
calendar_idstring(uuid)?optional
occurrence_startstring(date-time)?optional
send_invitesboolean?optional

Values in the request below are typed placeholders, not sample data.

Request

curl
curl -X PATCH 'https://api.vxcloud.io/api/v1/salesshift/calendar/events/{event_id}' \
  -H "Authorization: Bearer $SS_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{ "title": "<string>", "start_at": "<string(date-time)>", "end_at": "<string(date-time)>", "description": "<string>", "location": "<string>", "meeting_url": "<string>", "all_day": false, "timezone": "<string>", "color": "<string>", "status": "<string>", "transparency": "<string>", "recurrence_rule": "<string>", "attendees": [ "<object>" ], "reminders": [ "<integer>" ], "contact_id": "<string(uuid)>", "deal_id": "<string(uuid)>", "calendar_id": "<string(uuid)>", "occurrence_start": "<string(date-time)>", "send_invites": false }'

Response · 200

{success, data: <event>} plus `invitations` when invites were attempted.

#patch-api-v1-salesshift-calendar-events-event-idcalendar_router · vxcloud_fastapiclient/app/services/salesshift/calendar_router.py:1286The calendar feature was verified working against the live system in the session that produced this inventory. This specific route was not re-called during the inventory run.
DELETE/api/v1/salesshift/calendar/events/{event_id}Verified in sessionDelete with the same three scopes as the update path.

Delete with the same three scopes as the update path. * ``all`` — drop the series (exceptions cascade through the self-FK). * ``this`` — EXDATE the instance and remove its exception row, if any. * ``following`` — UNTIL the master just before the instance and drop everything on the far side of the split.

Auth
get_org_user
Scope
organization
Success
200 · application/json
Envelope
success+custom

Path parameters

NameTypeRequiredNotes
event_idstring(uuid)required

Query parameters

NameTypeRequiredNotes
scopestringoptionalDefault "all". Matches ^(this|following|all)$.
occurrence_startstring?optionalISO start of the clicked instance

Request

curl
curl -X DELETE 'https://api.vxcloud.io/api/v1/salesshift/calendar/events/{event_id}' \
  -H "Authorization: Bearer $SS_TOKEN"

Response · 200

Top-level keys
{
  "deleted": "…",
  "scope": "…",
  "success": "…"
}
Top-level keys read from the handler's return statements.
#delete-api-v1-salesshift-calendar-events-event-idcalendar_router · vxcloud_fastapiclient/app/services/salesshift/calendar_router.py:1492The calendar feature was verified working against the live system in the session that produced this inventory. This specific route was not re-called during the inventory run.
POST/api/v1/salesshift/calendar/events/{event_id}/duplicateVerified in sessionCopy at the same time with a ' (copy)' suffix.

Copy at the same time with a ' (copy)' suffix. The copy is standalone — duplicating an exception must not graft a second row onto the series.

Auth
get_org_user
Scope
organization
Success
201 · application/json
Envelope
success+data

Path parameters

NameTypeRequiredNotes
event_idstring(uuid)required

Request

curl
curl -X POST 'https://api.vxcloud.io/api/v1/salesshift/calendar/events/{event_id}/duplicate' \
  -H "Authorization: Bearer $SS_TOKEN"

Response · 201

Top-level keys
{
  "data": "…",
  "success": "…"
}
Top-level keys read from the handler's return statements.
#post-api-v1-salesshift-calendar-events-event-id-duplicatecalendar_router · vxcloud_fastapiclient/app/services/salesshift/calendar_router.py:1574The calendar feature was verified working against the live system in the session that produced this inventory. This specific route was not re-called during the inventory run.
POST/api/v1/salesshift/calendar/events/{event_id}/inviteVerified in sessionSend or re-send the invitation.

Send or re-send the invitation. Reports per recipient — a bounce is not an error for the whole request, it is a fact about one address.

Auth
get_org_user
Scope
organization
Success
200 · application/json
Envelope
success+custom

Path parameters

NameTypeRequiredNotes
event_idstring(uuid)required

Request body (optional)

Accepts a JSON object; the source declares no field list.

Request

curl
curl -X POST 'https://api.vxcloud.io/api/v1/salesshift/calendar/events/{event_id}/invite' \
  -H "Authorization: Bearer $SS_TOKEN"

Response · 200

Top-level keys
{
  "data": "…",
  "email_sent": "…",
  "error": "…",
  "failed": "…",
  "method": "…",
  "results": "…",
  "sent": "…",
  "success": "…"
}
Top-level keys read from the handler's return statements.
#post-api-v1-salesshift-calendar-events-event-id-invitecalendar_router · vxcloud_fastapiclient/app/services/salesshift/calendar_router.py:1615The calendar feature was verified working against the live system in the session that produced this inventory. This specific route was not re-called during the inventory run.
GET/api/v1/salesshift/calendar/events/{event_id}/invitesVerified in sessionWho was invited, what they answered, and the two deep links that let the organiser put the same event in their own external calendar.

Who was invited, what they answered, and the two deep links that let the organiser put the same event in their own external calendar.

Auth
get_org_user
Scope
organization
Success
200 · application/json
Envelope
success+data

Path parameters

NameTypeRequiredNotes
event_idstring(uuid)required

Request

curl
curl 'https://api.vxcloud.io/api/v1/salesshift/calendar/events/{event_id}/invites' \
  -H "Authorization: Bearer $SS_TOKEN"

Response · 200

Top-level keys
{
  "data": "…",
  "success": "…"
}
Top-level keys read from the handler's return statements.
#get-api-v1-salesshift-calendar-events-event-id-invitescalendar_router · vxcloud_fastapiclient/app/services/salesshift/calendar_router.py:1667The calendar feature was verified working against the live system in the session that produced this inventory. This specific route was not re-called during the inventory run.
POST/api/v1/salesshift/calendar/events/{event_id}/invitesVerified in sessionSend or re-send the invitation.

Send or re-send the invitation. Reports per recipient — a bounce is not an error for the whole request, it is a fact about one address.

Auth
get_org_user
Scope
organization
Success
200 · application/json
Envelope
success+custom

Path parameters

NameTypeRequiredNotes
event_idstring(uuid)required

Request body (optional)

Accepts a JSON object; the source declares no field list.

Request

curl
curl -X POST 'https://api.vxcloud.io/api/v1/salesshift/calendar/events/{event_id}/invites' \
  -H "Authorization: Bearer $SS_TOKEN"

Response · 200

Top-level keys
{
  "data": "…",
  "email_sent": "…",
  "error": "…",
  "failed": "…",
  "method": "…",
  "results": "…",
  "sent": "…",
  "success": "…"
}
Top-level keys read from the handler's return statements.
#post-api-v1-salesshift-calendar-events-event-id-invitescalendar_router · vxcloud_fastapiclient/app/services/salesshift/calendar_router.py:1615The calendar feature was verified working against the live system in the session that produced this inventory. This specific route was not re-called during the inventory run.
GET/api/v1/salesshift/calendar/export.icsin-handler-authVerified in sessionRFC-5545 calendar file.

RFC-5545 calendar file. Recurring series are exported as a single VEVENT carrying RRULE/EXDATE and their exceptions as sibling VEVENTs sharing the UID with a RECURRENCE-ID — that is the iCalendar model, so importers re-derive the same occurrences we render rather than receiving a flattened dump. ``token`` exists because this URL is opened directly by the browser (no Authorization header possible); the normal header credentials win when both are present.

Auth
no dependency
Scope
in-handler-auth
Success
200 · application/json
Envelope
binary

NOT public. The handler calls get_org_user itself, accepting the normal Authorization / X-API-Key headers, plus a ?token=<jwt> query fallback because a browser opening the URL directly cannot set a header. Headers win when both are sent.

Query parameters

NameTypeRequiredNotes
startstring?optional
endstring?optional
tokenstring?optionalJWT, for a plain browser download

Request

curl
curl 'https://api.vxcloud.io/api/v1/salesshift/calendar/export.ics' \
  -H "Authorization: Bearer $SS_TOKEN"

Response · 200

Response with the ICS calendar body (text/calendar).

Errors

Statusdetail
400end must be after start
#get-api-v1-salesshift-calendar-export-icscalendar_router · vxcloud_fastapiclient/app/services/salesshift/calendar_router.py:1089The calendar feature was verified working against the live system in the session that produced this inventory. This specific route was not re-called during the inventory run.
GET/api/v1/salesshift/calendar/rsvp/{token}url-secret-onlyVerified in sessionThe page an attendee lands on from the invitation.

The page an attendee lands on from the invitation. ``?response=`` records the answer on the spot: Outlook and several mobile clients follow a mailed link with a GET only, and an RSVP that silently does nothing is worse than the prefetch risk of honouring it.

Auth
no dependency
Scope
url-secret-only
Success
200 · text/html
Envelope
html

The invitation token is the credential and identifies the guest.

Path parameters

NameTypeRequiredNotes
tokenstringrequired

Query parameters

NameTypeRequiredNotes
responsestring?optionalaccepted | declined | tentative

Request

curl
curl 'https://api.vxcloud.io/api/v1/salesshift/calendar/rsvp/{token}'

Response · 200

Returns text/html (html).

#get-api-v1-salesshift-calendar-rsvp-tokencalendar_invites · vxcloud_fastapiclient/app/services/salesshift/calendar_invites.py:966The calendar feature was verified working against the live system in the session that produced this inventory. This specific route was not re-called during the inventory run.
POST/api/v1/salesshift/calendar/rsvp/{token}url-secret-onlyVerified in sessionRecord the reply.

Record the reply. Accepts the HTML form above and a JSON body equally — the same link is used by a browser and by API clients.

Auth
no dependency
Scope
url-secret-only
Success
200 · text/html
Envelope
html

The invitation token is the credential and identifies the guest.

Path parameters

NameTypeRequiredNotes
tokenstringrequired

Request

curl
curl -X POST 'https://api.vxcloud.io/api/v1/salesshift/calendar/rsvp/{token}'

Response · 200

Returns text/html (html).

#post-api-v1-salesshift-calendar-rsvp-tokencalendar_invites · vxcloud_fastapiclient/app/services/salesshift/calendar_invites.py:1020The calendar feature was verified working against the live system in the session that produced this inventory. This specific route was not re-called during the inventory run.
GET/api/v1/salesshift/calendarsCalled liveThe organization's calendars, seeding a default one when none exist.
Auth
get_org_user
Scope
organization
Success
200 · application/json
Envelope
success+data

Request

curl
curl 'https://api.vxcloud.io/api/v1/salesshift/calendars' \
  -H "Authorization: Bearer $SS_TOKEN"

Response · 200

Observed shape
{
  "success": "bool",
  "data": [
    {
      "id": "str",
      "name": "str",
      "color": "str",
      "is_visible": "bool",
      "is_default": "bool",
      "owner_id": "int",
      "created_at": "str",
      "updated_at": "str"
    },
    "...x1"
  ]
}
Observed on 2026-08-06 — keys are real, values are the types that came back.
#get-api-v1-salesshift-calendarscalendar_router · vxcloud_fastapiclient/app/services/salesshift/calendar_router.py:1831Called against http://127.0.0.1:8741 on 2026-08-06 with a real JWT; the response matched the shape recorded below.
POST/api/v1/salesshift/calendarsVerified in sessionCreate a calendar; the org's first calendar is always its default.
Auth
get_org_user
Scope
organization
Success
201 · application/json
Envelope
success+data

Request body (required) — CalendarCreate

FieldTypeRequiredNotes
namestringrequired≤ 200 chars.
colorstringoptionalDefault "primary". ≤ 20 chars.
is_visiblebooleanoptionalDefault true.
is_defaultbooleanoptionalDefault false.

Values in the request below are typed placeholders, not sample data.

Request

curl
curl -X POST 'https://api.vxcloud.io/api/v1/salesshift/calendars' \
  -H "Authorization: Bearer $SS_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{ "name": "<string>", "color": "primary", "is_visible": true, "is_default": false }'

Response · 201

Top-level keys
{
  "data": "…",
  "success": "…"
}
Top-level keys read from the handler's return statements.
#post-api-v1-salesshift-calendarscalendar_router · vxcloud_fastapiclient/app/services/salesshift/calendar_router.py:1858The calendar feature was verified working against the live system in the session that produced this inventory. This specific route was not re-called during the inventory run.
PATCH/api/v1/salesshift/calendars/{calendar_id}Verified in sessionUpdate a calendar's fields.
Auth
get_org_user
Scope
organization
Success
200 · application/json
Envelope
success+data

Path parameters

NameTypeRequiredNotes
calendar_idstring(uuid)required

Request body (required) — CalendarPatch

FieldTypeRequiredNotes
namestring?optional
colorstring?optional
is_visibleboolean?optional
is_defaultboolean?optional

Values in the request below are typed placeholders, not sample data.

Request

curl
curl -X PATCH 'https://api.vxcloud.io/api/v1/salesshift/calendars/{calendar_id}' \
  -H "Authorization: Bearer $SS_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{ "name": "<string>", "color": "<string>", "is_visible": false, "is_default": false }'

Response · 200

Top-level keys
{
  "data": "…",
  "success": "…"
}
Top-level keys read from the handler's return statements.

Errors

Statusdetail
404Calendar not found
#patch-api-v1-salesshift-calendars-calendar-idcalendar_router · vxcloud_fastapiclient/app/services/salesshift/calendar_router.py:1897The calendar feature was verified working against the live system in the session that produced this inventory. This specific route was not re-called during the inventory run.
DELETE/api/v1/salesshift/calendars/{calendar_id}Verified in sessionEvents survive — ss_calendar_events.calendar_id is ON DELETE SET NULL.
Auth
get_org_user
Scope
organization
Success
200 · application/json
Envelope
success+custom

Path parameters

NameTypeRequiredNotes
calendar_idstring(uuid)required

Request

curl
curl -X DELETE 'https://api.vxcloud.io/api/v1/salesshift/calendars/{calendar_id}' \
  -H "Authorization: Bearer $SS_TOKEN"

Response · 200

Top-level keys
{
  "success": "…"
}
Top-level keys read from the handler's return statements.

Errors

Statusdetail
404Calendar not found
400The default calendar cannot be deleted — make another one default first
#delete-api-v1-salesshift-calendars-calendar-idcalendar_router · vxcloud_fastapiclient/app/services/salesshift/calendar_router.py:1928The calendar feature was verified working against the live system in the session that produced this inventory. This specific route was not re-called during the inventory run.