---
title: "Add a day to a signup"
method: POST
path: "/signups/{id}/days"
tags: ["Days"]
---

# Add a day to a signup

`POST /signups/{id}/days`

## Request

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

Add a date to the signup. A date the signup already has answers `200` with that day and `created: false`, seeding nothing; a new one is `201`. On a repeating schedule a new date inside the schedule's range gets the schedule's Shifts (`seededShifts`), and one outside it is created with none and `unseededReason: "out-of-range"`. Items every other date carries are copied onto a new date (`seededItems`). Notifies nobody. A date that is not a real calendar date is `422`.

## Path parameters

- `id` string, uuid, required

## Request body

- AddDayRequest
  - `date` string, required: The date to add, `YYYY-MM-DD`, in the signup's timezone.

## Response `200`

The date was already there; the existing day, nothing seeded

- AddDayResponse
  - `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.
  - `created` boolean, required: False when the date was already there and the existing day came back.
  - `seededShifts` integer, required: Shifts the repeating schedule's plan put on a newly created date. 0 on a reused date.
  - `seededItems` integer, required: Items every other date already carries, copied onto a newly created date. 0 on a reused date.
  - `unseededReason` 'out-of-range' | 'empty-rule' | 'null', nullable, required: Why a new date on a repeating schedule got no Shifts: `out-of-range` (outside the schedule's range — extending the schedule will not fill it; add Shifts with POST /signups/{id}/slot_series/{seriesId}/occurrences after extending) or `empty-rule`. Null otherwise.

## Other responses

- `201`: The new day and what was seeded onto it
- `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)
