Create a recurring series

POST
/v1/scheduling/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.

Authorization

bearerAuth
headerAuthorizationBearer <token>

A secret API key from the dashboard: coss_live_… for production environments, coss_test_… for sandbox environments.

Header Parameters

Idempotency-Key?string

Makes 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.

Length1 <= length <= 256
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.

Value in"2026-10-10"

Request Body

application/json
  1. body
event_type*string

The event type's id or uid.

start*string

An ISO 8601 instant with an offset.

host?string

A specific host (id or uid). Default: chosen fairly from those free.

attributes?

Only choose among pool hosts matching all of these.

duration_minutes?integer

One of the event type's duration_options.

Range5 <= value <= 1440
attendee*

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?string

If an occurrence isn't free: book nothing, or book the rest and report it.

Default"reject"
Value in"reject""skip"

Response Body

The series and its bookings.

application/json
  1. response
object*"scheduling.series"
Value in"scheduling.series"
id*string
bookings*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": []}