---
title: "Record a guest reply"
method: PUT
path: "/guests/{guest_id}/rsvp"
tags: ["RSVP"]
---

# Record a guest reply

`PUT /guests/{guest_id}/rsvp`

## Request

- Base URL: `https://api.aisle.wedding/v1`
- URL: `https://api.aisle.wedding/v1/guests/{guest_id}/rsvp`
- Auth: HTTP bearer

The headline reply fans out through Aisle attendance rules and commits with event answers in one transaction. A ticketed event still requires a completed ticket payment, unless the couple has let that ticket be paid later (`Event.ticket.pay_later`). Retrying the same body converges on the same RSVP state; v1 does not persist a general idempotency key.

## Request body

- GuestRsvpInput
  - `status` 'attending' | 'maybe' | 'declined', required
  - `answers` object
  - `dietary_restrictions` string, nullable
  - `dietary_notes` string, nullable
  - `event_responses` object[]
    - `event_id` string, required
    - `attending` boolean, nullable
    - `option_id` string, nullable
    - `meal_choice_id` string, nullable
    - `meal_notes` string, nullable

## Response `200`

The stored reply.

- object
  - `data` GuestRsvp, required
    - `guest_id` string, required
    - `status` 'pending' | 'attending' | 'declined' | 'maybe', required
    - `stage` string, nullable, required
    - `responded_at` string, date-time, required: An RFC 3339 UTC timestamp with milliseconds.
    - `option_id` string, nullable, required
    - `option_label` string, nullable, required
    - `answers` object, required
    - `event_responses` GuestEventResponse[], required
      - `event_id` string, required
      - `attending` boolean, nullable, required
      - `option_id` string, nullable, required
      - `option_label` string, nullable, required
      - `meal_choice_id` string, nullable, required
      - `meal_notes` string, nullable, required
      - `updated_at` string, date-time, required: An RFC 3339 UTC timestamp with milliseconds.

## Other responses

- `400`: The request itself could not be read, such as a body that is not a JSON object. A field we refuse is validation_failed instead.
- `401`: The API key is missing, malformed, or no longer valid.
- `402`: The operation requires an active Aisle membership for this wedding.
- `403`: The key is valid but not permitted to do this.
- `404`: No such resource inside the key's wedding.
- `415`: A request body must be sent as application/json.
- `422`: The request was well-formed but a field was not acceptable. Every field at fault is named in error.details.
- `429`: Too many requests. Retry after the time given in Retry-After.
- `500`: Something went wrong on our side.

---

[API](https://skmtc.dev/aisle/apis/aisle-api.md) · [All operations](https://skmtc.dev/aisle/apis/aisle-api/llms.txt) · [OpenAPI document](https://skmtc.dev/aisle/apis/aisle-api/revisions/689a2f2420cc?raw)
