---
title: "Put a cancelled day back"
method: POST
path: "/signups/{id}/days/{dayId}/uncancel"
tags: ["Days"]
---

# Put a cancelled day back

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

## Request

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

Clear a day's cancellation (`cancelledAt`); its slots, items and registrations are simply live again. Takes no body. Notifies nobody. A day that is not cancelled comes back unchanged, on any signup. On a day with Shifts of a repeating schedule, the Shifts the same cancel took down are reconnected too: `restored` counts them, and `notRestored` names any that could not come back (their Shift left the schedule, or their place is taken) with the reason; those stay cancelled and the day is restored regardless. A Shift cancelled earlier on its own stays cancelled and is not listed. Both are 0 / empty on an ordinary day. A day whose repeating-schedule Shifts were all cancelled one by one, with no day cancellation (`cancelledAt` null), has nothing to undo, so it is `409 conflict`: put each Shift back with `POST /signups/{id}/slots/{slotId}/reconnect`. A day of another signup is `404`.

## Path parameters

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

## Response `200`

The day, and what came back with it

- UncancelDayResponse
  - `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.
  - `restored` integer, required: Shifts of the repeating schedule that came back with the day: those the same cancel took down. 0 on an ordinary day.
  - `notRestored` object[], required: Shifts the same cancel took down that could not be reconnected (their Shift left the schedule, or their place is taken). They stay cancelled; the day is restored regardless. A Shift cancelled earlier on its own is neither restored nor listed.
    - `slotId` string, uuid, required
    - `reason` string, required: Why this Shift could not come back.

## Other responses

- `401`: Unauthenticated — credentials missing, malformed, invalid, or revoked
- `403`: Forbidden — credentials valid but lack the required scope
- `404`: Not found
- `409`: A repeating schedule's date: reconnect its Shifts instead; 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)
