Schedule an onboarding meeting

Create a Google Calendar event with a Google Meet link and invite the given attendees.

POSThttps://api.spyne.ai/console/v1/product-onboarding/schedule-onboarding-meeting
AuthBearer token (console user)Rate limitNot documentedProcessingSynchronous; waits for Google Calendar to create the event.

The call forwards the request, with your token, to the platform's calendar scheduling endpoint. That endpoint:

  • checks that the times are valid and the start is before the end,
  • checks that attendees is a non-empty list of valid emails,
  • creates a private event on the primary calendar of the connected Google account, with a Google Meet link, and sends invites to all attendees.

The event ID, Meet link, times and attendees come back inside a nested data object. Nothing is stored on the contract or product line.

Send the bearer token of a signed-in Spyne Console user in Authorization: Bearer YOUR_TOKEN. The token is checked against the user validation endpoint, then forwarded to the scheduling endpoint, which checks it again.

Before you call it

  • You need the attendee emails.
  • In the console, this call is used during integration sync approval to put a reminder on the onboarding POC's calendar. The handover call scheduling on the contracted-stage dashboard does not use it. That flow sends the meeting details in meta_data of Update handover sub-stage, which does not create a calendar event.
  • The call is synchronous. It waits for Google Calendar to create the event. The rate limit is not documented.

Request

Requiredalways send
Request checklist
  1. Authenticate: send the Authorization: Bearer YOUR_TOKEN and Content-Type: application/json headers.
  2. Set the time: send startTime and endTime as ISO 8601 strings, with endTime after startTime.
  3. Set the time zone: send an IANA timeZone, for example America/New_York.
  4. Invite people: send attendees as a non-empty array of emails.
  5. Name it: send summary as the event title.

Headers

ParameterTypeRequiredDescription
AuthorizationstringRequiredBearer YOUR_TOKEN
Content-TypestringRequiredapplication/json

Body

ParameterTypeRequiredDescription
startTimestringRequiredStart time, ISO 8601.
endTimestringRequiredEnd time, ISO 8601. Must be after startTime.
timeZonestringRequiredIANA time zone, for example America/New_York.
attendeesstring[]RequiredAttendee emails. Must not be empty. Every entry must be a valid email.
summarystringRequiredEvent title.

Sample request

curl -X POST "https://api.spyne.ai/console/v1/product-onboarding/schedule-onboarding-meeting" \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "startTime": "2026-01-01T15:00:00.000Z",
    "endTime": "2026-01-01T15:15:00.000Z",
    "timeZone": "America/New_York",
    "attendees": ["[email protected]"],
    "summary": "Example Motors onboarding"
  }'
import requests

res = requests.post(
    "https://api.spyne.ai/console/v1/product-onboarding/schedule-onboarding-meeting",
    json={
        "startTime": "2026-01-01T15:00:00.000Z",
        "endTime": "2026-01-01T15:15:00.000Z",
        "timeZone": "America/New_York",
        "attendees": ["[email protected]"],
        "summary": "Example Motors onboarding",
    },
    headers={"Authorization": "Bearer YOUR_TOKEN"},
)
print(res.status_code, res.json())
const res = await fetch(
  "https://api.spyne.ai/console/v1/product-onboarding/schedule-onboarding-meeting",
  {
    method: "POST",
    headers: { Authorization: "Bearer YOUR_TOKEN", "Content-Type": "application/json" },
    body: JSON.stringify({
      startTime: "2026-01-01T15:00:00.000Z",
      endTime: "2026-01-01T15:15:00.000Z",
      timeZone: "America/New_York",
      attendees: ["[email protected]"],
      summary: "Example Motors onboarding",
    }),
  }
);
console.log(res.status, await res.json());

Sample response

{
  "success": true,
  "message": "Meeting scheduled successfully",
  "data": {
    "message": "Onboarding meeting scheduled successfully",
    "error": false,
    "code": "",
    "details": null,
    "data": {
      "id": "EVENT_ID",
      "hangoutLink": "https://meet.google.com/MEET_CODE",
      "startTime": "2026-01-01T10:00:00-05:00",
      "endTime": "2026-01-01T10:15:00-05:00",
      "attendees": [{ "email": "[email protected]" }]
    }
  }
}
{
  "success": false,
  "error": { "message": "<error message>", "error": true, "code": "ERROR_BAD_REQ_400", "details": "", "data": null }
}
{ "message": "Invalid Token", "error": true, "code": "ERROR_AUTH_401", "details": null, "data": null }
{ "success": false, "error": "<error body or message from the scheduling endpoint>" }

Response parameters

ParameterTypeDescription
successbooleantrue when the event was created.
messagestringMeeting scheduled successfully.
dataobjectFull response of the scheduling endpoint.
data.data.idstringGoogle Calendar event ID.
data.data.hangoutLinkstringGoogle Meet link.
data.data.startTimestringEvent start as stored by Google Calendar.
data.data.endTimestringEvent end as stored by Google Calendar.
data.data.attendeesobject[]Attendees as returned by Google Calendar.
errorobject or stringPresent on failure. It holds the scheduling endpoint's error body, or a message.

Errors

StatusReasonWhen it happens
400(framework)A required field is missing or has the wrong type. The body is not documented in code.
400Scheduling endpoint returned 400startTime is not before endTime. The exact message text is to be confirmed.
401Invalid or missing tokenNo Bearer token, or the token failed validation.
408Request timed outThe token validation call could not connect.
500Any other failureGoogle Calendar authentication failure, calendar not found, timeout, or any other error. All non-400 errors from the scheduling endpoint come back as 500 here. An invalid time format, an empty attendee list or an invalid attendee email is rejected by the scheduling endpoint. The code suggests this also comes back as 500, but that is to be confirmed.

What happens next

Share data.data.hangoutLink with the attendees if needed. Google Calendar has already sent the invites.

Called before: Save handover details. Called after: Update handover sub-stage.


Did this page help you?