- Start connecting a calendar POST
- List a host's calendar connections GET
- Connect a calendar with a password POST
- Disconnect a calendar DELETE
- Choose how a calendar counts PATCH
- List calendar delegations GET
- Add a calendar delegation POST
- Get a calendar delegation GET
- Update a calendar delegation PATCH
- Delete a calendar delegation DELETE
- Verify a calendar delegation POST
- List your OAuth apps GET
- Add your own OAuth app POST
- Get an OAuth app GET
- Update an OAuth app PATCH
- Delete an OAuth app DELETE
- Set a simulated calendar's busy times PUT
Update an OAuth app
A new client secret is tried on a connection before it replaces the old one, and ends an outage if it works. Its client ID can't change: a different app needs its hosts to consent again.
bearerAuthAuthorizationBearer <token>A secret API key from the dashboard: coss_live_… for production environments, coss_test_… for sandbox environments.
id*stringThe OAuth app's id.
Coss-Version?"2026-10-10"The API version (a date) to use for this request. Defaults to your organization's version, pinned to the latest one when it first used the API and upgraded from the dashboard. The SDK always sends the version it was built for.
"2026-10-10"application/json- body
- body
- …
client_secret?stringA new client secret. It's tried on a connection before it replaces the old one.
1 <= length <= 1000tenant_id?|The Directory (tenant) ID, for an app that's only for your own tenant. Leave it out for a multi-tenant app.
^[a-zA-Z0-9](?:[a-zA-Z0-9.-]{0,253})$webhook_secret?|The Secret Token of your Zoom app, which signs its events at zoom_event_url. Never returned.
1 <= length <= 1000redirect_uri?|A page on your own domain, registered with the provider, that forwards code and state to coss_callback_url. Google requires this for an external app, since it has to verify the redirect's domain as yours. Leave it out to use coss_callback_url directly.
length <= 2000completion_url?|Where the browser lands after a consent that didn't name a return_url, with coss_calendar set to connected, denied or invalid. Leave it out for a plain page saying what happened.
length <= 2000secret_expires_at?|When the client secret expires. Owners and admins are warned 14 days before.
date-timeThe app.
application/json- response
- response
- …
object*"scheduling.oauth_app""scheduling.oauth_app"id*stringprovider*string"google""microsoft""zoom"client_id*stringtenant_id*string|nullredirect_uri*string|nullcoss_callback_url*stringRegister this with the provider if redirect_uri isn't set. If it is, that page forwards code and state here.
completion_url*string|nullzoom_event_url*|Zoom only: the Event notification endpoint URL for your app's deauthorization events.
scopes*array<string>What to enable on your app at the provider.
status*stringfailing: the provider refused the app's credentials. New consents are refused, and calendars connected through it can't be read until they work again.
"active""failing"last_error_code*string|nulllast_error_at*string|nullsecret_expires_at*string|nullverified_at*|When a consent first completed through this app, which proves its secret.
connections*integerCalendar connections using this app. It can't be deleted while there are any.
created_at*stringupdated_at*stringimport { Coss } from "coss";const coss = new Coss({ apiKey: process.env.COSS_API_KEY, baseUrl: "https://api.coss.com",});const { data, error } = await coss.scheduling.oauthApps.update("calapp_01kd2m9a0b1c2d3e4f5g6h7j8m", { client_secret: "GOCSPX-abcdefghijklmnopqrstuvwxyz",});{ "object": "scheduling.oauth_app", "id": "calapp_01kd2m9a0b1c2d3e4f5g6h7j8m", "provider": "google", "client_id": "1234567890-abc.apps.googleusercontent.com", "tenant_id": null, "redirect_uri": "https://example.com/oauth/google", "coss_callback_url": "https://api.coss.com/scheduling/oauth/google/callback", "completion_url": "https://example.com/calendar-connected", "zoom_event_url": null, "scopes": [ "https://www.googleapis.com/auth/calendar.events.freebusy" ], "status": "active", "last_error_code": null, "last_error_at": null, "secret_expires_at": null, "verified_at": "2027-01-01T10:00:00.000Z", "connections": 12, "created_at": "2027-01-01T10:00:00.000Z", "updated_at": "2027-01-01T10:00:00.000Z"}