# AddCal API Documentation

The official AddCal API documentation. This comprehensive guide provides developers with everything needed to integrate calendar and event management functionality into their applications. Our RESTful API enables seamless creation, management, and sharing of events across multiple platforms and calendar services.

- Base URL: `https://addcal.co`
- Authentication: HTTP Bearer token. You can retrieve your token from the [API Tokens page](https://addcal.co/user/api-tokens) in your dashboard.
- OpenAPI document: https://addcal.co/docs.openapi
- Interactive reference: https://addcal.co/docs

Send the token on every request:

```
Authorization: Bearer YOUR_API_TOKEN
Accept: application/json
```

## Sections

- [Create Event](https://addcal.co/docs/create-event.md)
- [Calendars](https://addcal.co/docs/calendars.md)
- [Calendars > Subscribers](https://addcal.co/docs/subscribers.md)
- [Events](https://addcal.co/docs/events.md)
- [Events > RSVPs](https://addcal.co/docs/rsvps.md)
- [Events > Invites](https://addcal.co/docs/invites.md)
- [Account](https://addcal.co/docs/account.md)
- [Dynamic Links](https://addcal.co/docs/dynamic-links.md)
- [Endpoints](https://addcal.co/docs/endpoints.md)

## Events > RSVPs

APIs for managing event RSVP responses.

## Working with Custom Form Fields

Events can have custom forms with additional fields beyond the standard `name` and `email`. To create an RSVP with custom field data:

1. First, fetch the event details using the **Get Event** endpoint (`GET /api/calendars/{calendar}/events/{event}`)
2. Check the `custom_form` object in the response - it contains a `fields` array with all form fields
3. Use each field's `slug` property as the key when submitting custom field data

### Example Workflow

```
GET /api/calendars/cal_abc123/events/evt_xyz789

Response:
{
  "data": {
    "custom_form": {
      "fields": [
        { "slug": "company", "label": "Company Name", "field_type": "text", "is_required": false },
        { "slug": "dietary_requirements", "label": "Dietary Requirements", "field_type": "dropdown", "is_required": true,
          "options": [{ "label": "Vegetarian", "value": "vegetarian" }, { "label": "None", "value": "none" }] }
      ]
    }
  }
}
```

Then create the RSVP, passing the custom field values in `custom_fields`, keyed by slug:

```
POST /api/calendars/cal_abc123/events/evt_xyz789/rsvps

{
  "name": "John Doe",
  "email": "john@example.com",
  "response_type": "yes",
  "custom_fields": {
    "company": "Acme Inc",
    "dietary_requirements": "vegetarian"
  }
}
```

For fields of type `name_field` and `email_field`, send the value as the top-level `name` / `email`
instead of inside `custom_fields`.

### Strict validation (opt-in)

By default the API is lenient: `custom_fields` are stored as sent, without enforcing the form's
required fields, option lists, or field types. This keeps existing integrations working.

Pass `"strict": true` to validate the submission exactly like the public RSVP form: fields marked
`is_required` must be present, `dropdown`/`radio` values must be one of the field's `options[].value`,
and typed fields (e.g. `marketing_consent`) must match their type. Note `marketing_consent` values
must be a JSON boolean (`true`/`false`), not a string like `"True"`.

Earlier versions of this API accepted these values as a flat `data` object. That shape is still
accepted, but it is deprecated: prefer `custom_fields`.

### List RSVPs

`GET /api/calendars/{calendar_public_id}/events/{event_public_id}/rsvps`

**Path parameters**

- `calendar_public_id` (string, required): The ID of the calendar public.
- `event_public_id` (string, required): The ID of the event public.

**Query parameters**

- `response_type` (string, optional): Filter by response type. Options: 'yes', 'maybe', 'no'
- `search` (string, optional): Search RSVPs by name or email
- `per_page` (integer, optional): Number of results per page (1-100)

**Body parameters** (`application/json`)

- `response_type` (string, optional): No description. Options: `yes`, `maybe`, `no`.
- `search` (string, optional): Must not be greater than 255 characters.
- `per_page` (integer, optional): Must be at least 1. Must not be greater than 100.

**Example request**

```bash
curl --request GET \
  --url 'https://addcal.co/api/calendars/{calendar_public_id}/events/{event_public_id}/rsvps' \
  --header 'Authorization: Bearer YOUR_API_TOKEN' \
  --header 'Accept: application/json'
```

**Response 200**

```json
{
    "data": [
        {
            "uid": "28e5b3fb-de64-470d-9189-b76e187dd3d1",
            "public_id": "rsvp_28e5b3fb-de64-470d-9189-b76e187dd3d1",
            "event_uid": "yp9y906q64sy",
            "response_type": "maybe",
            "name": "Robbie Bruen PhD",
            "email": "agerlach@hotmail.com",
            "data": {
                "guests": 2,
                "comment": "Suscipit consequatur laudantium tempora nisi aut nihil aspernatur."
            },
            "formatted_created_at": "2026-08-28 03:20:12",
            "created_at": "2026-08-28T03:20:12.000000Z",
            "updated_at": "2026-08-28T03:20:12.000000Z",
            "event": {
                "uid": "yp9y906q64sy",
                "public_id": "evt_yp9y906q64sy",
                "calendar_uid": "cal_4mwxgiecjmax",
                "short_link": null,
                "title": "Rerum consectetur et rerum.",
                "internal_name": null,
                "is_draft": false,
                "description": "<p>Numquam ipsum sed dolorem velit consequatur velit. Officiis error odit iusto totam laboriosam sed. Quis repellendus amet deserunt et est voluptas suscipit. Molestiae molestiae animi quo quia consectetur explicabo nihil eum.</p>\n\n<p>Alias voluptatem facere ad commodi suscipit. Animi qui asperiores quod velit. Beatae asperiores culpa enim aut magni sint et.</p>",
                "location": "403 Felipe Ports\nSouth Meggiefurt, SC 13640",
                "is_all_day": false,
                "has_rsvp": false,
                "has_calendar_invites": false,
                "rsvp_limit": null,
                "is_recurring": false,
                "recurrence_rule": null,
                "recurrence_text": null,
                "date_start": "2026-09-04T07:06:18+02:00",
                "date_end": "2026-09-04T11:06:18+02:00",
                "timezone": "Europe/Prague",
                "busy_type": null,
                "reminder_before": null,
                "date_range_formatted": "Fri, Sep 4, 2026 7:06 AM - 11:06 AM",
                "public_url": "http://addcal.co/e/yp9y906q64sy",
                "embed_url": "http://addcal.co/e/yp9y906q64sy",
                "location_url": null,
                "image_url": null,
                "timezone_readable": "CEST / GMT+02:00",
                "calendar": {
                    "uid": "4mwxgiecjmax",
                    "public_id": "cal_4mwxgiecjmax",
                    "short_link": null,
                    "name": "ut omnis numquam",
                    "internal_name": "vero autem vitae",
                    "description": "<p>Velit minima aliquid sed explicabo quibusdam ullam a. Facere unde sint doloribus quo rerum. Est repellat in ipsum dolores qui ut.</p>",
                    "timezone": "Europe/Gibraltar",
                    "week_begins": 0,
                    "public_url": "http://addcal.co/c/4mwxgiecjmax",
                    "created_at": "2026-08-28T03:20:12.000000Z",
                    "updated_at": "2026-08-28T03:20:12.000000Z"
                },
                "created_at": "2026-08-28T03:20:12.000000Z",
                "updated_at": "2026-08-28T03:20:12.000000Z"
            }
        },
        {
            "uid": "06f631c9-f451-4037-aebf-31576424356d",
            "public_id": "rsvp_06f631c9-f451-4037-aebf-31576424356d",
            "event_uid": "pakfrdhp5pdm",
            "response_type": "yes",
            "name": "Estel Bayer Sr.",
            "email": "stroman.lenna@crona.com",
            "data": {
                "guests": 3,
                "comment": "Non eos quaerat cupiditate eos ratione ratione odio."
            },
            "formatted_created_at": "2026-08-28 03:20:12",
            "created_at": "2026-08-28T03:20:12.000000Z",
            "updated_at": "2026-08-28T03:20:12.000000Z",
            "event": {
                "uid": "pakfrdhp5pdm",
                "public_id": "evt_pakfrdhp5pdm",
                "calendar_uid": "cal_10u6oafwx5pr",
                "short_link": null,
                "title": "Odio repellendus ut qui perferendis nobis dolorem.",
                "internal_name": null,
                "is_draft": false,
                "description": "<p>Quisquam soluta autem delectus quo quia porro. Fuga totam aut dolor nesciunt deserunt eius velit. Sapiente facilis est omnis ullam. Quidem incidunt amet quia cupiditate itaque nihil.</p>\n\n<p>Quos libero cum ea sed et. Dignissimos repudiandae placeat assumenda ut quae pariatur. Aspernatur officiis vitae voluptatibus harum rerum dolore velit. Laboriosam maiores omnis at neque praesentium et.</p>",
                "location": null,
                "is_all_day": false,
                "has_rsvp": false,
                "has_calendar_invites": false,
                "rsvp_limit": null,
                "is_recurring": false,
                "recurrence_rule": null,
                "recurrence_text": null,
                "date_start": "2026-09-13T22:34:44-04:00",
                "date_end": "2026-09-13T23:34:44-04:00",
                "timezone": "America/Blanc-Sablon",
                "busy_type": null,
                "reminder_before": null,
                "date_range_formatted": "Sun, Sep 13, 2026 10:34 PM - 11:34 PM",
                "public_url": "http://addcal.co/e/pakfrdhp5pdm",
                "embed_url": "http://addcal.co/e/pakfrdhp5pdm",
                "location_url": null,
                "image_url": null,
                "timezone_readable": "AST / GMT-04:00",
                "calendar": {
                    "uid": "10u6oafwx5pr",
                    "public_id": "cal_10u6oafwx5pr",
                    "short_link": null,
                    "name": "cum possimus enim",
                    "internal_name": "vel architecto rerum",
                    "description": "",
                    "timezone": "Atlantic/Azores",
                    "week_begins": 4,
                    "public_url": "http://addcal.co/c/10u6oafwx5pr",
                    "created_at": "2026-08-28T03:20:12.000000Z",
                    "updated_at": "2026-08-28T03:20:12.000000Z"
                },
                "created_at": "2026-08-28T03:20:12.000000Z",
                "updated_at": "2026-08-28T03:20:12.000000Z"
            }
        }
    ]
}
```

### Create RSVP

`POST /api/calendars/{calendar_public_id}/events/{event_public_id}/rsvps`

**Path parameters**

- `calendar_public_id` (string, required): The ID of the calendar public.
- `event_public_id` (string, required): The ID of the event public.

**Body parameters** (`application/json`)

- `response_type` (string, required): No description. Options: `yes`, `maybe`, `no`.
- `name` (string, required): Must not be greater than 255 characters.
- `email` (string, required): Must not be greater than 255 characters.
- `strict` (boolean, optional): No description.
- `custom_fields` (object, optional): No description.

**Example request**

```bash
curl --request POST \
  --url 'https://addcal.co/api/calendars/{calendar_public_id}/events/{event_public_id}/rsvps' \
  --header 'Authorization: Bearer YOUR_API_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
    "response_type": "magni",
    "name": "frvxe",
    "email": "augusta.halvorson@example.com",
    "strict": true
}'
```

**Response 200**

```json
{
    "uid": "9259d39e-11e5-45fc-a5e9-65474e89a6a4",
    "public_id": "rsvp_9259d39e-11e5-45fc-a5e9-65474e89a6a4",
    "event_uid": "x7hi8wxomm2h",
    "response_type": "maybe",
    "name": "Ms. Beryl Kunze II",
    "email": "carter86@trantow.com",
    "data": {
        "guests": 0,
        "comment": "Eos eos porro ipsa ducimus."
    },
    "formatted_created_at": "2026-08-28 03:20:12",
    "created_at": "2026-08-28T03:20:12.000000Z",
    "updated_at": "2026-08-28T03:20:12.000000Z",
    "event": {
        "uid": "x7hi8wxomm2h",
        "public_id": "evt_x7hi8wxomm2h",
        "calendar_uid": "cal_lmjv9haksz2i",
        "short_link": null,
        "title": "Doloribus doloribus ut voluptatem est similique.",
        "internal_name": null,
        "is_draft": false,
        "description": "<p>Nihil odit qui totam cupiditate et. Provident architecto voluptatum autem et voluptatibus totam. Eligendi quasi et aliquid. Sequi officiis excepturi voluptas labore blanditiis autem quos.</p>\n\n<p>Et assumenda asperiores quidem in distinctio odit. Nostrum sequi illo non. Ad itaque ut ipsum dolorem eos et.</p>",
        "location": "25886 Tyrel Manors\nTrompfort, NE 02773",
        "is_all_day": false,
        "has_rsvp": false,
        "has_calendar_invites": false,
        "rsvp_limit": null,
        "is_recurring": false,
        "recurrence_rule": null,
        "recurrence_text": null,
        "date_start": "2026-08-08T14:51:16+04:00",
        "date_end": "2026-08-08T18:51:16+04:00",
        "timezone": "Asia/Muscat",
        "busy_type": null,
        "reminder_before": null,
        "date_range_formatted": "Sat, Aug 8, 2026 2:51 PM - 6:51 PM",
        "public_url": "http://addcal.co/e/x7hi8wxomm2h",
        "embed_url": "http://addcal.co/e/x7hi8wxomm2h",
        "location_url": null,
        "image_url": null,
        "timezone_readable": "+04 / GMT+04:00",
        "calendar": {
            "uid": "lmjv9haksz2i",
            "public_id": "cal_lmjv9haksz2i",
            "short_link": null,
            "name": "vitae nisi sint",
            "internal_name": "qui praesentium nesciunt",
            "description": "",
            "timezone": "Europe/Athens",
            "week_begins": 6,
            "public_url": "http://addcal.co/c/lmjv9haksz2i",
            "created_at": "2026-08-28T03:20:12.000000Z",
            "updated_at": "2026-08-28T03:20:12.000000Z"
        },
        "created_at": "2026-08-28T03:20:12.000000Z",
        "updated_at": "2026-08-28T03:20:12.000000Z"
    }
}
```

### Get RSVP

`GET /api/calendars/{calendar_public_id}/events/{event_public_id}/rsvps/{public_id}`

**Path parameters**

- `calendar_public_id` (string, required): The ID of the calendar public.
- `event_public_id` (string, required): The ID of the event public.
- `public_id` (string, required): The ID of the public.

**Example request**

```bash
curl --request GET \
  --url 'https://addcal.co/api/calendars/{calendar_public_id}/events/{event_public_id}/rsvps/{public_id}' \
  --header 'Authorization: Bearer YOUR_API_TOKEN' \
  --header 'Accept: application/json'
```

**Response 200**

```json
{
    "uid": "b47e0c53-2eb2-40a3-8957-21bf567df8ee",
    "public_id": "rsvp_b47e0c53-2eb2-40a3-8957-21bf567df8ee",
    "event_uid": "p3mwubr0q8wt",
    "response_type": "yes",
    "name": "Fleta Wintheiser",
    "email": "emmet.zieme@braun.com",
    "data": {
        "guests": 0,
        "comment": "Dicta eveniet repellendus doloribus."
    },
    "formatted_created_at": "2026-08-28 03:20:12",
    "created_at": "2026-08-28T03:20:12.000000Z",
    "updated_at": "2026-08-28T03:20:12.000000Z",
    "event": {
        "uid": "p3mwubr0q8wt",
        "public_id": "evt_p3mwubr0q8wt",
        "calendar_uid": "cal_fazboupkz9yi",
        "short_link": null,
        "title": "Sed eos aspernatur dignissimos veritatis.",
        "internal_name": null,
        "is_draft": false,
        "description": "<p>Incidunt necessitatibus quia quae nihil et. Dicta adipisci consectetur consequatur dolores ex quo. Vero suscipit perferendis id quia odit culpa.</p>\n\n<p>Libero ea officiis vitae eum autem deserunt sint. Hic cumque at earum sunt. Est recusandae ea non non incidunt.</p>",
        "location": null,
        "is_all_day": true,
        "has_rsvp": false,
        "has_calendar_invites": false,
        "rsvp_limit": null,
        "is_recurring": false,
        "recurrence_rule": null,
        "recurrence_text": null,
        "date_start": "2026-09-23T12:00:28+00:00",
        "date_end": "2026-09-23T15:00:28+00:00",
        "timezone": null,
        "busy_type": null,
        "reminder_before": null,
        "date_range_formatted": "Wed, Sep 23, 2026 (all day)",
        "public_url": "http://addcal.co/e/p3mwubr0q8wt",
        "embed_url": "http://addcal.co/e/p3mwubr0q8wt",
        "location_url": null,
        "image_url": null,
        "timezone_readable": null,
        "calendar": {
            "uid": "fazboupkz9yi",
            "public_id": "cal_fazboupkz9yi",
            "short_link": null,
            "name": "eum et ipsum",
            "internal_name": null,
            "description": "<p>Non voluptates ipsa in qui. Non quibusdam est qui accusantium ut et. Non voluptate ea non non. Minima amet nesciunt et neque.</p>",
            "timezone": "Europe/Copenhagen",
            "week_begins": 2,
            "public_url": "http://addcal.co/c/fazboupkz9yi",
            "created_at": "2026-08-28T03:20:12.000000Z",
            "updated_at": "2026-08-28T03:20:12.000000Z"
        },
        "created_at": "2026-08-28T03:20:12.000000Z",
        "updated_at": "2026-08-28T03:20:12.000000Z"
    }
}
```

### Update RSVP

`PUT /api/calendars/{calendar_public_id}/events/{event_public_id}/rsvps/{public_id}`

**Path parameters**

- `calendar_public_id` (string, required): The ID of the calendar public.
- `event_public_id` (string, required): The ID of the event public.
- `public_id` (string, required): The ID of the public.

**Body parameters** (`application/json`)

- `response_type` (string, optional): No description. Options: `yes`, `maybe`, `no`.
- `name` (string, optional): Must not be greater than 255 characters.
- `email` (string, optional): Must not be greater than 255 characters.
- `strict` (boolean, optional): No description.
- `custom_fields` (object, optional): No description.

**Example request**

```bash
curl --request PUT \
  --url 'https://addcal.co/api/calendars/{calendar_public_id}/events/{event_public_id}/rsvps/{public_id}' \
  --header 'Authorization: Bearer YOUR_API_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
    "response_type": "et",
    "name": "nkazafyx",
    "email": "griffin.christiansen@example.net",
    "strict": false
}'
```

**Response 200**

```json
{
    "uid": "64637cd7-513b-4a9c-918c-932a00115331",
    "public_id": "rsvp_64637cd7-513b-4a9c-918c-932a00115331",
    "event_uid": "excd7jxfpsp5",
    "response_type": "yes",
    "name": "Jovan Labadie Jr.",
    "email": "orowe@rogahn.info",
    "data": {
        "guests": 3,
        "comment": "Aut dolorem dolores qui in ut sunt nisi."
    },
    "formatted_created_at": "2026-08-28 03:20:12",
    "created_at": "2026-08-28T03:20:12.000000Z",
    "updated_at": "2026-08-28T03:20:12.000000Z",
    "event": {
        "uid": "excd7jxfpsp5",
        "public_id": "evt_excd7jxfpsp5",
        "calendar_uid": "cal_xom05jal706d",
        "short_link": null,
        "title": "Culpa voluptatem dolores expedita.",
        "internal_name": null,
        "is_draft": false,
        "description": "<p>Itaque impedit pariatur pariatur consequatur sed doloremque. Nihil molestias esse ea ea ut. Tempore id sed ut mollitia et ut.</p>\n\n<p>Tempore sunt et corporis id. Dolorem aut eaque qui. Facilis molestias temporibus possimus ut. Voluptatum consequatur voluptas et nostrum a.</p>",
        "location": "6700 Hodkiewicz Prairie\nDaynamouth, NE 39778",
        "is_all_day": false,
        "has_rsvp": false,
        "has_calendar_invites": false,
        "rsvp_limit": null,
        "is_recurring": false,
        "recurrence_rule": null,
        "recurrence_text": null,
        "date_start": "2026-08-20T21:46:09+02:00",
        "date_end": "2026-08-20T22:46:09+02:00",
        "timezone": "Africa/Ceuta",
        "busy_type": null,
        "reminder_before": null,
        "date_range_formatted": "Thu, Aug 20, 2026 9:46 PM - 10:46 PM",
        "public_url": "http://addcal.co/e/excd7jxfpsp5",
        "embed_url": "http://addcal.co/e/excd7jxfpsp5",
        "location_url": null,
        "image_url": null,
        "timezone_readable": "CEST / GMT+02:00",
        "calendar": {
            "uid": "xom05jal706d",
            "public_id": "cal_xom05jal706d",
            "short_link": null,
            "name": "et et voluptas",
            "internal_name": "expedita voluptatibus cumque",
            "description": "",
            "timezone": "Europe/Sarajevo",
            "week_begins": 0,
            "public_url": "http://addcal.co/c/xom05jal706d",
            "created_at": "2026-08-28T03:20:12.000000Z",
            "updated_at": "2026-08-28T03:20:12.000000Z"
        },
        "created_at": "2026-08-28T03:20:12.000000Z",
        "updated_at": "2026-08-28T03:20:12.000000Z"
    }
}
```

### Delete RSVP

`DELETE /api/calendars/{calendar_public_id}/events/{event_public_id}/rsvps/{public_id}`

**Path parameters**

- `calendar_public_id` (string, required): The ID of the calendar public.
- `event_public_id` (string, required): The ID of the event public.
- `public_id` (string, required): The ID of the public.

**Example request**

```bash
curl --request DELETE \
  --url 'https://addcal.co/api/calendars/{calendar_public_id}/events/{event_public_id}/rsvps/{public_id}' \
  --header 'Authorization: Bearer YOUR_API_TOKEN' \
  --header 'Accept: application/json'
```
