---
title: "Update a time slot"
method: PATCH
path: "/signups/{id}/slots/{slotId}"
tags: ["Slots"]
---

# Update a time slot

`PATCH /signups/{id}/slots/{slotId}`

## Request

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

Partial update — supplied fields only. Use null to clear nullable fields. The slot must belong to the signup in the path (a slot of another signup is `404 not_found`, and nothing is written). `customField` is the slot's own question (null removes it, so a date of a repeating schedule asks the schedule's question again). `maxParticipants` below the number of spots already taken is refused with `400`. A date of a repeating schedule (its `seriesId` is set) cannot have its `startTime` edited onto another day of the signup's timezone: that is `409 conflict` and nothing is written — move it with `POST /signups/{id}/slots/{slotId}/move` instead. A time edit that keeps the start on the same local day (including any `endTime` change) is allowed, as is any edit of a slot that is not part of a schedule.

## Path parameters

- `id` string, uuid, required
- `slotId` string, uuid, required

## Request body

- UpdateTimeSlotRequest
  - `startTime` string, date-time
  - `endTime` string, date-time
  - `maxParticipants` integer
  - `maxPerPerson` integer
  - `title` string, nullable
  - `description` string, nullable
  - `location` string, nullable
  - `customField` object, nullable
    - `name` string, required: The question text. Trimmed, then 1 to 200 characters, when sent to the slot update door.
    - `placeholder` string: Example answer, shown as a hint in the answer box.
    - `required` boolean, required
    - `type` 'short' | 'long', required

## Response `200`

Updated time slot

- TimeSlot
  - `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

## Other responses

- `401`: Unauthenticated — credentials missing, malformed, invalid, or revoked
- `404`: Not found
- `409`: The edit would move a date of a repeating schedule onto another day; nothing was written
- `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)
