---
title: "Register a participant"
method: POST
path: "/signups/{id}/participants"
tags: ["Participants"]
---

# Register a participant

`POST /signups/{id}/participants`

## Request

- Base URL: `https://thesignup.app/api/v1`
- URL: `https://thesignup.app/api/v1/signups/{id}/participants`
- Auth: none required

Anonymous-friendly. Works without an Authorization header — the link-share viral loop preserved. Anonymous calls are rate-limited per IP using the `anon` tier (600/min reads, 6/min writes, 10,000/day). Authenticated calls use the credential's tier as usual.

## Path parameters

- `id` string, uuid, required

## Request body

- RegisterParticipantRequest
  - `name` string, required
  - `email` string, email, required
  - `phone` string
  - `eventCustomFieldResponse` string
  - `selections` object[], required: Slots/items the participant is signing up for. Empty for headcount-only events. A selection whose slot or item asks a Required question must carry a non-blank `customFieldResponse`, or the request is refused with 400 naming the question.
    - `type` 'slot' | 'item', required
    - `id` string, uuid, required
    - `quantity` integer, required
    - `customFieldResponse` string
  - `dayCustomFieldResponses` object: Answers to Day Questions, keyed by event day id. A Required Day Question must be answered for every day the registration touches (a slot on it, an item scoped to it, or day attendance) or the request is refused with 400 naming the question. On a repeat registration the map is merged by key over what is already held; a blank value clears that day's answer.
  - `attendDayIds` string[]: Event day ids the participant is attending, beyond the days implied by their slots. Written with the registration; a day of another signup, a cancelled day, or a day on a commitment-required signup is refused with 400.

## Response `201`

Registration created

- RegisterParticipantResponse
  - `success` boolean, required
  - `confirmationToken` string: Returned to the participant so they can later edit/cancel their registration without re-authenticating. Show it in the success page; agents should preserve it. Present for a new registration, and for a repeat registration only when the caller's credential belongs to the organization that owns the signup. Otherwise — an anonymous or foreign-org repeat for an email already registered — the response carries no token and `success: false`, nothing is changed, and the manage link is emailed to the address on file.
  - `confirmed` object[], required
    - `type` 'slot' | 'item', required
    - `id` string, uuid, required
    - `participantId` string, uuid, required
  - `failed` object[], required
    - `type` 'slot' | 'item', required
    - `id` string, uuid, required
    - `reason` 'full' | 'closed' | 'invalid' | 'duplicate', required
    - `message` string

## Other responses

- `400`: Not found
- `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)
