# 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

Advanced APIs for managing events

### Index All Events

`GET /api/events`

**Query parameters**

- `range` (string, optional): Filter events by time range. Options: 'all', 'upcoming', 'past'
- `search` (string, optional): Search events by title or internal name
- `calendar` (string, optional): Filter events by calendar ID
- `start_date` (string, optional): Filter events starting from this date (ISO 8601 format)
- `end_date` (string, optional): Filter events ending before this date (ISO 8601 format)
- `rsvp` (boolean, optional): Only return events with RSVPs enabled (true) or disabled (false)
- `invites` (boolean, optional): Only return events with calendar invites enabled (true) or disabled (false)

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

- `range` (string, optional): No description. Options: `all`, `upcoming`, `past`.
- `search` (string, optional): Must not be greater than 255 characters.
- `calendar` (string, optional): Must not be greater than 255 characters.
- `start_date` (string, optional): Must be a valid date.
- `end_date` (string, optional): Must be a valid date.
- `rsvp` (string, optional): No description. Options: `1`, `0`, `true`, `false`.
- `invites` (string, optional): No description. Options: `1`, `0`, `true`, `false`.

**Example request**

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

**Response 200**

```json
{
    "data": [
        {
            "uid": "39gx8af68wmh",
            "public_id": "evt_39gx8af68wmh",
            "calendar_uid": "cal_70ei35uj0y04",
            "short_link": null,
            "title": "Temporibus magni qui occaecati.",
            "internal_name": null,
            "is_draft": false,
            "description": "<p>Soluta inventore qui velit modi possimus. Ut ut quas enim sed. Repellendus occaecati consectetur aut et beatae delectus id. Sapiente nisi autem dolores.</p>\n\n<p>Qui qui expedita reprehenderit provident nostrum. A laboriosam dolor autem illo. Qui atque omnis et magni.</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-11-13T04:13:47+00:00",
            "date_end": "2026-11-13T06:13:47+00:00",
            "timezone": null,
            "busy_type": null,
            "reminder_before": null,
            "date_range_formatted": "Fri, Nov 13, 2026 (all day)",
            "public_url": "http://addcal.co/e/39gx8af68wmh",
            "embed_url": "http://addcal.co/e/39gx8af68wmh",
            "location_url": null,
            "image_url": null,
            "timezone_readable": null,
            "calendar": {
                "uid": "70ei35uj0y04",
                "public_id": "cal_70ei35uj0y04",
                "short_link": null,
                "name": "consequatur est dicta",
                "internal_name": "recusandae incidunt unde",
                "description": "<p>Sequi voluptate voluptatem laudantium voluptatem nulla ab. Dicta sapiente et id veritatis ut animi earum tempora. Molestiae excepturi sunt dolor cupiditate.</p>",
                "timezone": "Asia/Ulaanbaatar",
                "week_begins": 6,
                "start_on": "today",
                "public_url": "http://addcal.co/c/70ei35uj0y04",
                "created_at": "2026-10-28T23:12:04.000000Z",
                "updated_at": "2026-10-28T23:12:04.000000Z"
            },
            "created_at": "2026-10-28T23:12:04.000000Z",
            "updated_at": "2026-10-28T23:12:04.000000Z"
        },
        {
            "uid": "p7wd4bothbzm",
            "public_id": "evt_p7wd4bothbzm",
            "calendar_uid": "cal_t0q4mlezzjp7",
            "short_link": null,
            "title": "Ut officiis aut voluptatem soluta ut.",
            "internal_name": null,
            "is_draft": false,
            "description": "<p>Delectus eaque est omnis molestiae. Dolor incidunt natus repellat magnam vero.</p>\n\n<p>Et laborum dolores dolorum quia sed est. Vero nihil repellat omnis et. Mollitia voluptatem ea reiciendis distinctio libero.</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-10-05T06:05:45-04:00",
            "date_end": "2026-10-05T07:05:45-04:00",
            "timezone": "America/Manaus",
            "busy_type": null,
            "reminder_before": null,
            "date_range_formatted": "Mon, Oct 5, 2026 6:05 AM - 7:05 AM",
            "public_url": "http://addcal.co/e/p7wd4bothbzm",
            "embed_url": "http://addcal.co/e/p7wd4bothbzm",
            "location_url": null,
            "image_url": null,
            "timezone_readable": "-04 / GMT-04:00",
            "calendar": {
                "uid": "t0q4mlezzjp7",
                "public_id": "cal_t0q4mlezzjp7",
                "short_link": null,
                "name": "natus voluptatibus id",
                "internal_name": null,
                "description": "<p>Laborum aut velit omnis est. Deserunt esse iusto aliquid quos officiis ratione eaque. Quam sunt voluptate quas adipisci rerum. Id accusantium ipsa neque ut.</p>",
                "timezone": "America/Barbados",
                "week_begins": 5,
                "start_on": "today",
                "public_url": "http://addcal.co/c/t0q4mlezzjp7",
                "created_at": "2026-10-28T23:12:04.000000Z",
                "updated_at": "2026-10-28T23:12:04.000000Z"
            },
            "created_at": "2026-10-28T23:12:04.000000Z",
            "updated_at": "2026-10-28T23:12:04.000000Z"
        }
    ]
}
```

### Get Event by UID

`GET /api/events/{event_public_id}`

**Path parameters**

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

**Query parameters**

- `with_html` (boolean, optional): Include HTML variants for calendar links in the response

**Example request**

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

**Response 200**

```json
{
    "data": {
        "uid": "n3i81uqvmn9t",
        "public_id": "evt_n3i81uqvmn9t",
        "calendar_uid": "cal_k5iij8mn2ah4",
        "short_link": null,
        "title": "Perferendis nesciunt fugit dolore aut.",
        "internal_name": null,
        "is_draft": false,
        "description": "<p>Natus soluta vitae molestiae aut corrupti magnam. Temporibus repudiandae quis error illum vero natus vitae a.</p>\n\n<p>Quibusdam unde recusandae excepturi ea est aperiam. Nihil eaque aut quod natus.</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-10-02T13:20:07+12:00",
        "date_end": "2026-10-02T16:20:07+12:00",
        "timezone": "Pacific/Kwajalein",
        "busy_type": null,
        "reminder_before": null,
        "date_range_formatted": "Fri, Oct 2, 2026 1:20 PM - 4:20 PM",
        "public_url": "http://addcal.co/e/n3i81uqvmn9t",
        "embed_url": "http://addcal.co/e/n3i81uqvmn9t",
        "location_url": null,
        "image_url": null,
        "timezone_readable": "+12 / GMT+12:00",
        "calendar": {
            "uid": "k5iij8mn2ah4",
            "public_id": "cal_k5iij8mn2ah4",
            "short_link": null,
            "name": "ut dicta expedita",
            "internal_name": "dolor et dolor",
            "description": "",
            "timezone": "Pacific/Marquesas",
            "week_begins": 5,
            "start_on": "today",
            "public_url": "http://addcal.co/c/k5iij8mn2ah4",
            "created_at": "2026-10-28T23:12:04.000000Z",
            "updated_at": "2026-10-28T23:12:04.000000Z"
        },
        "created_at": "2026-10-28T23:12:04.000000Z",
        "updated_at": "2026-10-28T23:12:04.000000Z"
    },
    "links": {
        "event_page": "http://addcal.co/e/n3i81uqvmn9t",
        "auto": "https://addcal.co/e/n3i81uqvmn9t/auto",
        "google": "https://addcal.co/e/n3i81uqvmn9t/google",
        "apple": "https://addcal.co/e/n3i81uqvmn9t/apple",
        "outlook": "https://addcal.co/e/n3i81uqvmn9t/outlook",
        "outlook_web": "https://addcal.co/e/n3i81uqvmn9t/outlook_web",
        "yahoo": "https://addcal.co/e/n3i81uqvmn9t/yahoo",
        "office365": "https://addcal.co/e/n3i81uqvmn9t/office365",
        "ics": "https://addcal.co/e/n3i81uqvmn9t/ics"
    },
    "html": {
        "single-button": "Add to Calendar Button",
        "icon-buttons-single-row": "Buttons With Icons",
        "icons": "Text with Icons",
        "dot-sep": "Text (dot separated)",
        "space-sep": "Text (space separated)"
    }
}
```

### Index Calendar Events

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

**Path parameters**

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

**Query parameters**

- `range` (string, optional): Filter events by time range. Options: 'all', 'upcoming', 'past'
- `search` (string, optional): Search events by title or internal name
- `calendar` (string, optional): Filter events by calendar ID
- `start_date` (string, optional): Filter events starting from this date (ISO 8601 format)
- `end_date` (string, optional): Filter events ending before this date (ISO 8601 format)
- `rsvp` (boolean, optional): Only return events with RSVPs enabled (true) or disabled (false)
- `invites` (boolean, optional): Only return events with calendar invites enabled (true) or disabled (false)

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

- `range` (string, optional): No description. Options: `all`, `upcoming`, `past`.
- `search` (string, optional): Must not be greater than 255 characters.
- `calendar` (string, optional): Must not be greater than 255 characters.
- `start_date` (string, optional): Must be a valid date.
- `end_date` (string, optional): Must be a valid date.
- `rsvp` (string, optional): No description. Options: `1`, `0`, `true`, `false`.
- `invites` (string, optional): No description. Options: `1`, `0`, `true`, `false`.

**Example request**

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

**Response 200**

```json
{
    "data": [
        {
            "uid": "rv0r2rw5suxz",
            "public_id": "evt_rv0r2rw5suxz",
            "calendar_uid": "cal_uw7b5747gl34",
            "short_link": null,
            "title": "Vel enim qui dolorum ut odit.",
            "internal_name": null,
            "is_draft": false,
            "description": "<p>Nostrum quam et labore tempore et iusto incidunt. Iure velit atque cupiditate et ab. Sunt asperiores sint ut numquam molestiae voluptas hic. Ullam ea nam laudantium.</p>\n\n<p>Quaerat eveniet voluptatem dolore veniam esse minima. Voluptatem pariatur eum aut et impedit eum. Optio illum ut veritatis molestiae pariatur. Quaerat aut ut vel qui eligendi qui.</p>",
            "location": "343 Balistreri Rue Suite 151\nKatlynburgh, MA 55052",
            "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-11-15T15:09:01+02:00",
            "date_end": "2026-11-15T16:09:01+02:00",
            "timezone": "Asia/Jerusalem",
            "busy_type": null,
            "reminder_before": null,
            "date_range_formatted": "Sun, Nov 15, 2026 3:09 PM - 4:09 PM",
            "public_url": "http://addcal.co/e/rv0r2rw5suxz",
            "embed_url": "http://addcal.co/e/rv0r2rw5suxz",
            "location_url": null,
            "image_url": null,
            "timezone_readable": "IST / GMT+02:00",
            "calendar": {
                "uid": "uw7b5747gl34",
                "public_id": "cal_uw7b5747gl34",
                "short_link": null,
                "name": "perspiciatis non et",
                "internal_name": "amet provident est",
                "description": "<p>Sint minima eum aut quidem magni iure. Qui ea ducimus id commodi iusto autem modi. Assumenda est dolore nobis reprehenderit eos aliquam. Deleniti deleniti quaerat et voluptas eligendi aut dolor.</p>",
                "timezone": "Asia/Aden",
                "week_begins": 0,
                "start_on": "today",
                "public_url": "http://addcal.co/c/uw7b5747gl34",
                "created_at": "2026-10-28T23:12:04.000000Z",
                "updated_at": "2026-10-28T23:12:04.000000Z"
            },
            "created_at": "2026-10-28T23:12:04.000000Z",
            "updated_at": "2026-10-28T23:12:04.000000Z"
        },
        {
            "uid": "hy38pbyal0k7",
            "public_id": "evt_hy38pbyal0k7",
            "calendar_uid": "cal_yjjt62v2p5iv",
            "short_link": null,
            "title": "Est sit et pariatur totam molestiae.",
            "internal_name": null,
            "is_draft": false,
            "description": "<p>Est magnam veritatis et voluptatem in temporibus. Omnis odio quis id eligendi. Aut deleniti itaque unde molestiae non.</p>\n\n<p>Amet quia magni omnis accusantium odit. In qui ex nihil adipisci totam unde. Non omnis ut aut ad.</p>",
            "location": "21726 Kennedy Locks Apt. 231\nJoshville, PA 47522-7005",
            "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-10-27T02:28:27-04:00",
            "date_end": "2026-10-27T06:28:27-04:00",
            "timezone": "America/Indiana/Marengo",
            "busy_type": null,
            "reminder_before": null,
            "date_range_formatted": "Tue, Oct 27, 2026 2:28 AM - 6:28 AM",
            "public_url": "http://addcal.co/e/hy38pbyal0k7",
            "embed_url": "http://addcal.co/e/hy38pbyal0k7",
            "location_url": null,
            "image_url": null,
            "timezone_readable": "EDT / GMT-04:00",
            "calendar": {
                "uid": "yjjt62v2p5iv",
                "public_id": "cal_yjjt62v2p5iv",
                "short_link": null,
                "name": "et ipsum dicta",
                "internal_name": null,
                "description": "",
                "timezone": "Australia/Adelaide",
                "week_begins": 1,
                "start_on": "today",
                "public_url": "http://addcal.co/c/yjjt62v2p5iv",
                "created_at": "2026-10-28T23:12:04.000000Z",
                "updated_at": "2026-10-28T23:12:04.000000Z"
            },
            "created_at": "2026-10-28T23:12:04.000000Z",
            "updated_at": "2026-10-28T23:12:04.000000Z"
        }
    ]
}
```

### Create Event

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

**Path parameters**

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

**Query parameters**

- `with_html` (boolean, optional): Include HTML variants for calendar links in the response

**Example request**

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

**Response 200**

```json
{
    "data": {
        "uid": "7xoh344sv1zb",
        "public_id": "evt_7xoh344sv1zb",
        "calendar_uid": "cal_erpbdk7butf5",
        "short_link": null,
        "title": "Repellendus cum iusto error accusantium voluptatem deserunt hic.",
        "internal_name": null,
        "is_draft": false,
        "description": "<p>Quo non minus soluta eius. Et debitis error sunt voluptatum animi. Atque facere rem repudiandae velit id et.</p>\n\n<p>Eos modi molestiae est numquam nisi libero. Labore nesciunt iure eos debitis alias perferendis. Vitae aut illum excepturi consequatur consequatur aut.</p>",
        "location": "35051 Torphy Walk Apt. 351\nLemkemouth, OR 09862-4201",
        "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-10-23T22:24:09+05:00",
        "date_end": "2026-10-24T01:24:09+05:00",
        "timezone": "Antarctica/Mawson",
        "busy_type": null,
        "reminder_before": null,
        "date_range_formatted": "Fri, Oct 23, 2026 10:24 PM - Sat, Oct 24, 2026 1:24 AM",
        "public_url": "http://addcal.co/e/7xoh344sv1zb",
        "embed_url": "http://addcal.co/e/7xoh344sv1zb",
        "location_url": null,
        "image_url": null,
        "timezone_readable": "+05 / GMT+05:00",
        "calendar": {
            "uid": "erpbdk7butf5",
            "public_id": "cal_erpbdk7butf5",
            "short_link": null,
            "name": "quos nihil omnis",
            "internal_name": null,
            "description": "<p>Velit sint ut eius occaecati sint adipisci voluptas illum. Illo repellendus impedit eos veniam rerum ut sit. Dolorem non illum nulla et magnam. Enim quaerat tempora reiciendis repudiandae recusandae libero consectetur.</p>",
            "timezone": "Europe/Gibraltar",
            "week_begins": 1,
            "start_on": "today",
            "public_url": "http://addcal.co/c/erpbdk7butf5",
            "created_at": "2026-10-28T23:12:04.000000Z",
            "updated_at": "2026-10-28T23:12:04.000000Z"
        },
        "created_at": "2026-10-28T23:12:04.000000Z",
        "updated_at": "2026-10-28T23:12:04.000000Z"
    },
    "links": {
        "event_page": "http://addcal.co/e/7xoh344sv1zb",
        "auto": "https://addcal.co/e/7xoh344sv1zb/auto",
        "google": "https://addcal.co/e/7xoh344sv1zb/google",
        "apple": "https://addcal.co/e/7xoh344sv1zb/apple",
        "outlook": "https://addcal.co/e/7xoh344sv1zb/outlook",
        "outlook_web": "https://addcal.co/e/7xoh344sv1zb/outlook_web",
        "yahoo": "https://addcal.co/e/7xoh344sv1zb/yahoo",
        "office365": "https://addcal.co/e/7xoh344sv1zb/office365",
        "ics": "https://addcal.co/e/7xoh344sv1zb/ics"
    },
    "html": {
        "single-button": "Add to Calendar Button",
        "icon-buttons-single-row": "Buttons With Icons",
        "icons": "Text with Icons",
        "dot-sep": "Text (dot separated)",
        "space-sep": "Text (space separated)"
    }
}
```

**Response 409** — When the team's event limit has been exceeded

```json
{
    "message": "You have reached your monthly event limit of 10. Please upgrade your plan to create more events.",
    "current": 10,
    "limit": 10,
    "remaining": 0,
    "would_exceed_by": 1,
    "is_unlimited": false,
    "limit_type": "monthly",
    "attempted": 1
}
```

### Get Event

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

**Path parameters**

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

**Query parameters**

- `with_html` (boolean, optional): Include HTML variants for calendar links in the response

**Example request**

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

**Response 200**

```json
{
    "data": {
        "uid": "iuqirpd8d8g9",
        "public_id": "evt_iuqirpd8d8g9",
        "calendar_uid": "cal_ka1aspz8ufyf",
        "short_link": null,
        "title": "Atque itaque fuga sequi hic repudiandae repellat voluptatem.",
        "internal_name": null,
        "is_draft": false,
        "description": "<p>Asperiores quia similique autem sunt aut. Culpa corrupti officia voluptatem dignissimos perferendis. Eum ex in occaecati velit aut facilis.</p>\n\n<p>Esse ipsum tempore neque sed dolorem. A ut fugit aut nihil. Ipsa aut veniam praesentium et corrupti et dolorem debitis. Voluptas culpa aut illum fuga voluptatum beatae perspiciatis quaerat.</p>",
        "location": "22065 Nedra Squares\nJanieview, RI 40845-9976",
        "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-29T22:55:38+07:00",
        "date_end": "2026-09-30T00:55:38+07:00",
        "timezone": "Asia/Barnaul",
        "busy_type": null,
        "reminder_before": null,
        "date_range_formatted": "Tue, Sep 29, 2026 10:55 PM - Wed, Sep 30, 2026 12:55 AM",
        "public_url": "http://addcal.co/e/iuqirpd8d8g9",
        "embed_url": "http://addcal.co/e/iuqirpd8d8g9",
        "location_url": null,
        "image_url": null,
        "timezone_readable": "+07 / GMT+07:00",
        "calendar": {
            "uid": "ka1aspz8ufyf",
            "public_id": "cal_ka1aspz8ufyf",
            "short_link": null,
            "name": "minima qui dolores",
            "internal_name": "ut distinctio autem",
            "description": "<p>Quia maiores expedita esse corporis. Vitae libero qui consectetur modi vel quas a. Error impedit dignissimos reiciendis necessitatibus. Voluptas fugit ut molestiae sequi numquam beatae.</p>",
            "timezone": "Asia/Beirut",
            "week_begins": 1,
            "start_on": "today",
            "public_url": "http://addcal.co/c/ka1aspz8ufyf",
            "created_at": "2026-10-28T23:12:04.000000Z",
            "updated_at": "2026-10-28T23:12:04.000000Z"
        },
        "created_at": "2026-10-28T23:12:04.000000Z",
        "updated_at": "2026-10-28T23:12:04.000000Z"
    },
    "links": {
        "event_page": "http://addcal.co/e/iuqirpd8d8g9",
        "auto": "https://addcal.co/e/iuqirpd8d8g9/auto",
        "google": "https://addcal.co/e/iuqirpd8d8g9/google",
        "apple": "https://addcal.co/e/iuqirpd8d8g9/apple",
        "outlook": "https://addcal.co/e/iuqirpd8d8g9/outlook",
        "outlook_web": "https://addcal.co/e/iuqirpd8d8g9/outlook_web",
        "yahoo": "https://addcal.co/e/iuqirpd8d8g9/yahoo",
        "office365": "https://addcal.co/e/iuqirpd8d8g9/office365",
        "ics": "https://addcal.co/e/iuqirpd8d8g9/ics"
    },
    "html": {
        "single-button": "Add to Calendar Button",
        "icon-buttons-single-row": "Buttons With Icons",
        "icons": "Text with Icons",
        "dot-sep": "Text (dot separated)",
        "space-sep": "Text (space separated)"
    }
}
```

### Update Event

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

Omitting image, image_url and remove_image leaves the current image unchanged.

**Path parameters**

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

**Query parameters**

- `with_html` (boolean, optional): Include HTML variants for calendar links in the response

**Example request**

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

**Response 200**

```json
{
    "data": {
        "uid": "8ia1nomd4zxd",
        "public_id": "evt_8ia1nomd4zxd",
        "calendar_uid": "cal_nvsxoen124qy",
        "short_link": null,
        "title": "Amet accusamus quia nostrum assumenda sed.",
        "internal_name": null,
        "is_draft": false,
        "description": "<p>Repellat velit placeat omnis illum voluptas labore. Ut ut nobis blanditiis laborum non molestiae consequatur. Amet enim quaerat quas qui eaque odit. Rerum ad velit modi corporis placeat.</p>\n\n<p>Modi non numquam et quam quia doloremque aut voluptatem. Esse asperiores eum placeat id eos. Odit dolor eos tempore dicta dolore omnis quia.</p>",
        "location": "49851 Zaria Springs\nLake Brittanytown, ID 20618-7891",
        "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-11-20T18:31:51+00:00",
        "date_end": "2026-11-20T21:31:51+00:00",
        "timezone": "Europe/Lisbon",
        "busy_type": null,
        "reminder_before": null,
        "date_range_formatted": "Fri, Nov 20, 2026 6:31 PM - 9:31 PM",
        "public_url": "http://addcal.co/e/8ia1nomd4zxd",
        "embed_url": "http://addcal.co/e/8ia1nomd4zxd",
        "location_url": null,
        "image_url": null,
        "timezone_readable": "WET / GMT+00:00",
        "calendar": {
            "uid": "nvsxoen124qy",
            "public_id": "cal_nvsxoen124qy",
            "short_link": null,
            "name": "necessitatibus saepe et",
            "internal_name": null,
            "description": "",
            "timezone": "Asia/Ulaanbaatar",
            "week_begins": 4,
            "start_on": "today",
            "public_url": "http://addcal.co/c/nvsxoen124qy",
            "created_at": "2026-10-28T23:12:04.000000Z",
            "updated_at": "2026-10-28T23:12:04.000000Z"
        },
        "created_at": "2026-10-28T23:12:04.000000Z",
        "updated_at": "2026-10-28T23:12:04.000000Z"
    },
    "links": {
        "event_page": "http://addcal.co/e/8ia1nomd4zxd",
        "auto": "https://addcal.co/e/8ia1nomd4zxd/auto",
        "google": "https://addcal.co/e/8ia1nomd4zxd/google",
        "apple": "https://addcal.co/e/8ia1nomd4zxd/apple",
        "outlook": "https://addcal.co/e/8ia1nomd4zxd/outlook",
        "outlook_web": "https://addcal.co/e/8ia1nomd4zxd/outlook_web",
        "yahoo": "https://addcal.co/e/8ia1nomd4zxd/yahoo",
        "office365": "https://addcal.co/e/8ia1nomd4zxd/office365",
        "ics": "https://addcal.co/e/8ia1nomd4zxd/ics"
    },
    "html": {
        "single-button": "Add to Calendar Button",
        "icon-buttons-single-row": "Buttons With Icons",
        "icons": "Text with Icons",
        "dot-sep": "Text (dot separated)",
        "space-sep": "Text (space separated)"
    }
}
```

### Delete Event

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

**Path parameters**

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

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

- `notify_invitees` (boolean, optional): When true and the event has calendar invites, email a cancellation to every invited attendee so the event is removed from their calendars. Defaults to false.

**Example request**

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

### Generate Signed URL for Event

`POST /api/calendars/{calendar_public_id}/events/{event_public_id}/signed-url`

Generate a cryptographically signed URL for a protected event. The signed URL grants temporary access and expires after the specified number of days.

The event must have an access code set. If no `expiry_days` is provided, the default is 30 days.

**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`)

- `expiry_days` (integer, optional): Number of days until the signed URL expires. Min 1, max 365.

**Example request**

```bash
curl --request POST \
  --url 'https://addcal.co/api/calendars/{calendar_public_id}/events/{event_public_id}/signed-url' \
  --header 'Authorization: Bearer YOUR_API_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
    "expiry_days": 30
}'
```

**Response 200**

```json
{
    "url": "https://addcal.co/e/evt_abc123?expires=1741000000&signature=abc..."
}
```

**Response 422**

```json
{
    "error": "Event does not have an access code set."
}
```
