---
title: "Cancel one day of a signup"
method: POST
path: "/signups/{id}/days/{dayId}/cancel"
tags: ["Days"]
---

# Cancel one day of a signup

`POST /signups/{id}/days/{dayId}/cancel`

## Request

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

Call a day off, executed immediately: there is no dry run. Everyone holding anything on the day is emailed (and texted when they gave a phone number and SMS consent); `message` is added to that notification. Nothing is deleted — slots, items and registrations are kept. The write depends on the day. A day with Shifts of a repeating schedule has each of its live Shifts cancelled (the Shifts running on that day, wherever the schedule first put them); the response is `kind: "series_date"` with `cancelled`, `affectedParticipants` (registrations), `dayCancelledAt` and `notified`. The whole day is called off: it reads `cancelledAt` set (the same instant `dayCancelledAt` returns and the cancelled Shifts share), so a one-off slot on it is off too (nothing is deleted), and everyone holding anything on it is told. It is undone with `POST /signups/{id}/days/{dayId}/uncancel`, which reconnects exactly the Shifts this call cancelled; a Shift can also be put back alone with `POST /signups/{id}/slots/{slotId}/reconnect`. Any other day — on an ordinary signup, or one with no Shift of the repeating schedule — is itself cancelled; the response is `kind: "day"` with `affectedSignups` (people) and `notified`, and it is undone with `POST /signups/{id}/days/{dayId}/uncancel`. A repeat cancel tells nobody again. The account behind the credential must have a verified email, or the call is `403 forbidden`. A day of another signup is `404`.

## Path parameters

- `id` string, uuid, required
- `dayId` string, uuid, required

## Request body

- CancelDayRequest
  - `message` string, nullable: Added to the email and text participants receive about this change. Up to 2000 characters.

## Response `200`

What the cancellation hit and who was told

- union
  - object
    - `kind` 'day', required
    - `day` Day, required
      - `id` string, uuid, required
      - `eventId` string, uuid, required
      - `date` string, required: The calendar date, `YYYY-MM-DD`, in the signup's timezone.
      - `seriesId` string, uuid, nullable, required: The Slot Series that generated this day, or null for a day added by hand or an ordinary signup's day.
      - `cancelledAt` string, date-time, nullable, required: When the day was called off, or null. A cancelled day keeps its slots, items and registrations. A repeating schedule's date is cancelled through its Shifts instead and keeps null here; read `noLiveTime`.
      - `noLiveTime` boolean, required: True when the day had times and none of them is live any more — participants are not offered it, exactly as a cancelled day.
      - `question` object, nullable, required: The Day Question asked once per day of whoever signs up for anything that day: the day's own, else the repeating schedule's default. Null when none.
        - `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: Whose `question` it is: the day's own, or the schedule's default it inherits. Null when there is no question.
      - `isPast` boolean, required: Whether the date is before today in the signup's timezone.
    - `affectedSignups` integer, required: Distinct people holding a slot, an item or Day Attendance on the day. Their registrations are kept.
    - `audience` integer, required: People the cancellation emails, before anyone's notification preferences.
    - `confirmed` boolean, required: Always `true` from this door: the call executed.
    - `notified` object, required: Who was told: distinct people, emails sent, texts sent. All zero on a repeat cancel.
      - `recipients` integer, required
      - `emails` integer, required
      - `sms` integer, required
  - object
    - `kind` 'series_date', required
    - `cancelled` integer, required: Live Shifts on the date that were cancelled. 0 when it was already off, or when only a one-off slot was live and the day itself was called off (see `dayCancelledAt`).
    - `dayCancelledAt` string, date-time, nullable, required: When this call called the day off (the day's `cancelledAt`, shared by the Shifts it cancelled), or null when the day was already off or nothing on it was live. A one-off slot on the day is off through this stamp.
    - `affectedParticipants` integer, required: Registrations on the cancelled Shifts (rows, not people). They are kept.
    - `notified` object, required: Who was told: distinct people, emails sent, texts sent.
      - `recipients` integer, required
      - `emails` integer, required
      - `sms` integer, required

## Other responses

- `400`: Bad request — body or path could not be parsed
- `401`: Unauthenticated — credentials missing, malformed, invalid, or revoked
- `403`: Forbidden — credentials valid but lack the required scope
- `404`: Not found
- `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)
