---
title: "Create a repeating schedule (Slot Series) for a signup"
method: POST
path: "/signups/{id}/slot_series"
tags: ["Slots"]
---

# Create a repeating schedule (Slot Series) for a signup

`POST /signups/{id}/slot_series`

## Request

- Base URL: `https://thesignup.app/api/v1`
- URL: `https://thesignup.app/api/v1/signups/{id}/slot_series`
- Auth: HTTP bearer

Create the signup's Slot Series and generate its Occurrences — one time slot per Shift per date the rule runs — in one transaction. `rule` is the shift plan: `daily` and `monthly` carry `genericShifts`; `weekly` carries `activeDays`, keyed by weekday number (0 = Sunday), and a weekday absent from the map is a day the Series does not run. Each Shift is `{ start, end, label?, capacity?, question? }` with `start` / `end` as `HH:MM` wall-clock times in the signup's timezone. `rangeStart` / `rangeEnd` are `YYYY-MM-DD`. `capacity` is each Occurrence's default and a Shift's own `capacity` overrides it. A signup has at most one Series: a second create is `409 conflict`. A range over 3660 days, or one that would produce more than 2000 Occurrences, is `400 bad_request`. Repeating schedules need a paid plan: an organization without one gets `402 upgrade_required` and nothing is written. Generating dates notifies nobody.

## Path parameters

- `id` string, uuid, required

## Request body

- CreateSlotSeriesRequest
  - `rule` union, required
    - object
      - `frequency` 'daily', required
      - `genericShifts` object[], required
        - `start` string, required
        - `end` string, required
        - `label` string
        - `capacity` integer
        - `question` object, nullable
          - `label` string, required
          - `placeholder` string
          - `required` boolean, required
    - object
      - `frequency` 'weekly', required
      - `activeDays` object, required
    - object
      - `frequency` 'monthly', required
      - `genericShifts` object[], required
        - `start` string, required
        - `end` string, required
        - `label` string
        - `capacity` integer
        - `question` object, nullable
          - `label` string, required
          - `placeholder` string
          - `required` boolean, required
      - `monthlyMode` 'dayOfMonth', required
      - `dayOfMonth` integer, required
    - object
      - `frequency` 'monthly', required
      - `genericShifts` object[], required
        - `start` string, required
        - `end` string, required
        - `label` string
        - `capacity` integer
        - `question` object, nullable
          - `label` string, required
          - `placeholder` string
          - `required` boolean, required
      - `monthlyMode` 'nth', required
      - `nth` union, required
        - 1
        - 2
        - 3
        - 4
        - 5
      - `nthWeekday` union, required
        - 0
        - 1
        - 2
        - 3
        - 4
        - 5
        - 6
  - `rangeStart` string, required
  - `rangeEnd` string, required
  - `capacity` integer, required
  - `maxPerPerson` integer
  - `interval` integer

## Response `201`

The Series and its generated Occurrences

- CreateSlotSeriesResponse
  - `series` SlotSeries, required
    - `id` string, uuid, required
    - `eventId` string, uuid, required
    - `frequency` 'daily' | 'weekly' | 'monthly', required
    - `interval` integer, required
    - `rangeStart` string, required
    - `rangeEnd` string, required
    - `capacity` integer, required
    - `maxPerPerson` integer, required
    - `rule` object, required: The stored shift plan, in the shape `rule` was sent.
    - `timezone` string, nullable, required
    - `location` string, nullable, required
    - `dayQuestion` object, nullable, required: The Series' default Day Question, or null. A day's own question shadows it.
    - `createdAt` string, date-time, required
    - `updatedAt` string, date-time, required
  - `slots` Occurrence[], required
    - `id` string, uuid, required
    - `eventId` string, uuid, required
    - `startTime` string, date-time, required
    - `endTime` string, date-time, required
    - `maxParticipants` integer, required
    - `maxPerPerson` integer, required: The most spots one person may take on this slot. 1 (the default) is one spot per person; 0 is no per-person limit.
    - `title` string, nullable, required
    - `description` string, nullable, required
    - `location` string, nullable, required
    - `customField` object, nullable, required: The slot's own question, as stored. Read `question` for what the slot actually asks — a slot generated from a repeating shift may inherit the shift's question when this is null.
      - `name` string, required
      - `placeholder` string
      - `required` boolean, required
      - `type` 'short' | 'long', required
    - `question` object, nullable, required: The question participants are asked when taking this slot: the slot's own, else the repeating shift's. Null when nothing is asked.
      - `label` string, required
      - `placeholder` string: Example answer, shown as a hint in the answer box. Absent when none was given.
      - `required` boolean, required
    - `questionSource` 'own' | 'series' | 'null', nullable, required: "own" when `question` is the slot's own; "series" when inherited from its repeating shift; null when nothing is asked.
    - `createdAt` string, date-time, required
    - `seriesId` string, uuid, required
    - `seriesDate` string, required: The date the rule generated this Occurrence for, `YYYY-MM-DD`.
    - `shiftIndex` integer, required: Position in the Series' shift plan. `(seriesId, shiftIndex)` is the Shift.
    - `detached` boolean, required
    - `cancelledAt` string, date-time, nullable, required: When the Occurrence was cancelled, or null while it is live. A cancelled Occurrence keeps its registrations.

## Other responses

- `400`: Bad request — body or path could not be parsed
- `401`: Unauthenticated — credentials missing, malformed, invalid, or revoked
- `402`: Upgrade required — feature is gated by a higher billing tier
- `403`: Forbidden — credentials valid but lack the required scope
- `404`: Not found
- `409`: The signup already has a Slot Series
- `422`: Validation failed — request body / query / path is structurally wrong
- `429`: Rate limited or daily ceiling exceeded
- `500`: Internal server error

---

[API](https://skmtc.dev/thesignup/apis/thesignup-api.md) · [All operations](https://skmtc.dev/thesignup/apis/thesignup-api/llms.txt) · [OpenAPI document](https://skmtc.dev/thesignup/apis/thesignup-api/revisions/c6da7cf92172?raw)
