Calendar events

Push a calendar event

For partners that sync calendars themselves. Send each event as your calendar provider returned it — a Google Calendar event, a Microsoft Graph event or a Nylas event — or in the small shape, and get back the calendar event of that occurrence (source: calendar_sync), with the meeting_id of its meeting. We read the title, times, organizer, attendees with their response, and the meeting link (from the conferencing fields, or found in the location or description).

  • Identity. An event is its iCal UID plus, for an occurrence of a recurring event, its original start. Push the same event again to update it; push it for every member who has it and they share one meeting and one bot. Send a stable iCalUID.
  • Owner. member_email creates the member the first time, as POST /members does; member_id names an existing one.
  • Recurring events. Push each occurrence (Google instances, Graph occurrences, Nylas instances). A series master, with the repeat rule itself, is refused.
  • Cancelling. Push the event as your provider reports it cancelled (status: cancelled, including Google's { id, status } deletions, Graph's isCancelled or @removed, cancelled: true in the small shape). The meeting is cancelled once no member of the workspace still has the event; pushing it live again brings it back.
  • Past events are kept, with their people, as past meetings. No bot is sent.
  • No link. The meeting exists and effective_policy.recording.enabled_because is no_meeting_url until a push carries one. Only Google Meet, Zoom and Microsoft Teams links count; any other link (Webex, a dial-in page) reads as no link.

Whether a meeting is recorded follows the member's policy; change one meeting with PATCH /policies/{id}. A member who also connects the same calendar sees each meeting twice: use one calendar source per workspace.

post/calendar_events

Request

  • Base URL
    https://www.happyscribe.com/api/v1
  • Auth
    API key in header Authorization

Request body

workspace_idstring required

Workspace ID, beginning with wks_. Treat it as an opaque string. Integer workspace ids are still accepted.

member_idstring

An existing member of the workspace.

member_emailstring email

The calendar owner; created as a member the first time.

metadataMetadata

Your own key-value pairs, for your ids and context. HappyScribe stores them, returns them on the object and in every webhook that carries it, and never acts on them. Up to 50 keys of up to 40 characters (no square brackets), values up to 500 characters. See metadata.

eventobject required

The event exactly as your provider returned it: a Google Calendar events resource, a Microsoft Graph event (request it with Prefer: outlook.timezone="UTC" or an IANA time zone), or a Nylas v3 event (bare, as data, or as a webhook's data.object). Keys keep your provider's casing. Without a provider payload, send the small shape (CalendarEventSmall).

Example request

{
  "workspace_id": "wks_01k6a2r9s8x7c2dvq3m5n6p4ab",
  "metadata": {
    "gurusup_user_id": "usr_8812"
  }
}

Response

The calendar event of the occurrence, the same object as the meeting's calendar_event. Versions before 2026-10-12 return the meeting instead.

idstring

Beginning with cev_. One per meeting; stays the same through reschedules and every member's push.

objectstring

Always calendar_event.

meeting_idstring

The meeting of this occurrence, beginning with mtg_.

ical_uidstring nullable

The iCal UID shared by every attendee's copy of the event, or null when the calendar sent none.

recurringboolean nullable

Whether the event is an occurrence of a recurring series. null only in a webhook event from before 2026-10-12, which did not record it.

titlestring nullable

The event title.

starts_atstring date-time nullable

Scheduled start, in ISO 8601.

ends_atstring date-time nullable

Scheduled end, in ISO 8601.

meeting_urlstring nullable

The link to join the call, or null when the event has none.

source'calendar_connection' | 'calendar_sync'

Where the event came from.

  • calendar_connection: a calendar the member connected.
  • calendar_sync: an event you pushed with POST /calendar_events.
metadataMetadata

Your own key-value pairs, for your ids and context. HappyScribe stores them, returns them on the object and in every webhook that carries it, and never acts on them. Up to 50 keys of up to 40 characters (no square brackets), values up to 500 characters. See metadata.

cancelled_atstring date-time nullable

When the event was cancelled, once no member of the workspace still has it; otherwise null.

created_atstring date-time

When the event first appeared, in ISO 8601.

updated_atstring date-time

When the event or its meeting last changed, in ISO 8601.

Example response

{
  "id": "cev_01k6a2r9s8x7c2dvq3m5n6p4ab",
  "object": "calendar_event",
  "meeting_id": "mtg_01k6a2r9s8x7c2dvq3m5n6p4ab",
  "ical_uid": "7kq2abc@google.com",
  "recurring": true,
  "title": "Weekly sync with Acme",
  "starts_at": "2026-09-29T09:00:00Z",
  "ends_at": "2026-09-29T09:30:00Z",
  "meeting_url": "https://meet.google.com/abc-defg-hij",
  "organizer": {
    "name": "Marc",
    "email": "marc@gurusup.com",
    "member_id": "mem_01k69x9s8x7c2dvq3m5n6p4ab"
  },
  "attendees": [
    {
      "name": "Marc",
      "email": "marc@gurusup.com",
      "member_id": "mem_01k69x9s8x7c2dvq3m5n6p4ab",
      "response": "accepted"
    },
    {
      "name": "Laia Puig",
      "email": "laia@gurusup.com",
      "member_id": "mem_01k69x2m4q8r7t6v5w4x3y2z1a",
      "response": "accepted"
    },
    {
      "name": null,
      "email": "ana@acme.com",
      "member_id": null,
      "response": "needs_action"
    }
  ],
  "source": "calendar_sync",
  "metadata": {
    "gurusup_event_id": "evt_311"
  },
  "cancelled_at": null,
  "created_at": "2026-09-22T08:00:00Z",
  "updated_at": "2026-09-28T17:12:03Z"
}

Changes

No recorded changes to this operation across all 1 revision of this API.