Create a recurring series
Books up to 52 occurrences, keeping the attendee's local time across DST changes. Each one is an ordinary booking that can move on its own, and a pool keeps one host throughout.
bearerAuthAuthorizationBearer <token>A secret API key from the dashboard: coss_live_… for production environments, coss_test_… for sandbox environments.
Idempotency-Key?stringMakes retries safe: a repeated request with the same key and body returns the original booking instead of creating another, for 24 hours. A refused request keeps no key. 1-256 characters.
1 <= length <= 256Coss-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
- …
event_type*stringThe event type's id or uid.
start*stringAn ISO 8601 instant with an offset.
host?stringA specific host (id or uid). Default: chosen fairly from those free.
attributes?Only choose among pool hosts matching all of these.
duration_minutes?integerOne of the event type's duration_options.
5 <= value <= 1440attendee*Name and email are only needed if coss.com notifies this attendee.
answers?Answers to the event type's questions. Stored encrypted, and returned only by retrieving the booking.
location?||||One of the event type's locations, with your link filled in if it has none.
metadata?Your own key-value pairs. Don't put sensitive data here.
recurrence*on_conflict?stringIf an occurrence isn't free: book nothing, or book the rest and report it.
"reject""reject""skip"The series and its bookings.
application/json- response
- response
- …
object*"scheduling.series""scheduling.series"id*stringbookings*array<>conflicts*array<>import { Coss } from "coss";const coss = new Coss({ apiKey: process.env.COSS_API_KEY, baseUrl: "https://api.coss.com",});const { data, error } = await coss.scheduling.series.create({ event_type: "evtype_01kd2m9a0b1c2d3e4f5g6h7j8m", start: "2027-01-04T15:00:00.000Z", attendee: { uid: "patient_77", time_zone: "America/New_York", }, recurrence: { frequency: "weekly", interval: 1, count: 12, },});{ "object": "scheduling.series", "id": "series_01kd2m9a0b1c2d3e4f5g6h7j8m", "bookings": [ { "object": "scheduling.booking", "id": "book_01kd2m9a0b1c2d3e4f5g6h7j8m", "event_type": "evtype_01kd2m9a0b1c2d3e4f5g6h7j8m", "status": "confirmed", "title": "Initial consultation", "start": "2027-01-04T15:00:00.000Z", "end": "2027-01-04T15:30:00.000Z", "hosts": [ "host_01kd2m9a0b1c2d3e4f5g6h7j8m" ], "attendees": [ { "id": "attn_01kd2m9a0b1c2d3e4f5g6h7j8m", "uid": "patient_77", "name": "Sam Lee", "email": "sam@example.com", "phone": null, "time_zone": "UTC", "locale": null } ], "location": null, "hold_expires_at": null, "approval_expires_at": null, "series": null, "series_index": null, "group_session": null, "calendar_unverified": false, "external_conflict_at": null, "no_show_at": null, "cancelled_at": null, "metadata": {}, "created_at": "2027-01-01T10:00:00.000Z", "updated_at": "2027-01-01T10:00:00.000Z" } ], "conflicts": []}