Schedule an onboarding meeting
Create a Google Calendar event with a Google Meet link and invite the given attendees.
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
attendeesis 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_dataof 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
- Authenticate: send the
Authorization: Bearer YOUR_TOKENandContent-Type: application/jsonheaders. - Set the time: send
startTimeandendTimeas ISO 8601 strings, withendTimeafterstartTime. - Set the time zone: send an IANA
timeZone, for exampleAmerica/New_York. - Invite people: send
attendeesas a non-empty array of emails. - Name it: send
summaryas the event title.
Headers
| Parameter | Type | Required | Description |
|---|---|---|---|
Authorization | string | Required | Bearer YOUR_TOKEN |
Content-Type | string | Required | application/json |
Body
| Parameter | Type | Required | Description |
|---|---|---|---|
startTime | string | Required | Start time, ISO 8601. |
endTime | string | Required | End time, ISO 8601. Must be after startTime. |
timeZone | string | Required | IANA time zone, for example America/New_York. |
attendees | string[] | Required | Attendee emails. Must not be empty. Every entry must be a valid email. |
summary | string | Required | Event 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
| Parameter | Type | Description |
|---|---|---|
success | boolean | true when the event was created. |
message | string | Meeting scheduled successfully. |
data | object | Full response of the scheduling endpoint. |
data.data.id | string | Google Calendar event ID. |
data.data.hangoutLink | string | Google Meet link. |
data.data.startTime | string | Event start as stored by Google Calendar. |
data.data.endTime | string | Event end as stored by Google Calendar. |
data.data.attendees | object[] | Attendees as returned by Google Calendar. |
error | object or string | Present on failure. It holds the scheduling endpoint's error body, or a message. |
Errors
| Status | Reason | When it happens |
|---|---|---|
400 | (framework) | A required field is missing or has the wrong type. The body is not documented in code. |
400 | Scheduling endpoint returned 400 | startTime is not before endTime. The exact message text is to be confirmed. |
401 | Invalid or missing token | No Bearer token, or the token failed validation. |
408 | Request timed out | The token validation call could not connect. |
500 | Any other failure | Google 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.
Updated about 1 hour ago
