# 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)
- [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)

## 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": "7uc72jnnhyul",
            "public_id": "evt_7uc72jnnhyul",
            "calendar_uid": "cal_zu3u2vu0ju8g",
            "short_link": null,
            "title": "Quasi dolores occaecati est a in quis impedit.",
            "internal_name": null,
            "is_draft": false,
            "description": "<p>Ut qui quia unde quam vero sed. Et laudantium est ad.</p>\n\n<p>In nostrum qui quam hic. Maiores nulla dolores quibusdam aliquam. Et occaecati qui aliquid libero doloribus cupiditate quos. Quidem soluta consequuntur nihil et doloribus aliquam.</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-06T14:02:17-04:00",
            "date_end": "2026-09-06T18:02:17-04:00",
            "timezone": "America/Antigua",
            "busy_type": null,
            "reminder_before": null,
            "date_range_formatted": "Sun, Sep 6, 2026 2:02 PM - 6:02 PM",
            "public_url": "http://addcal.co/e/7uc72jnnhyul",
            "embed_url": "http://addcal.co/e/7uc72jnnhyul",
            "location_url": null,
            "image_url": null,
            "timezone_readable": "AST / GMT-04:00",
            "calendar": {
                "uid": "zu3u2vu0ju8g",
                "public_id": "cal_zu3u2vu0ju8g",
                "short_link": null,
                "name": "omnis odit et",
                "internal_name": null,
                "description": "<p>Laborum quia saepe laudantium molestiae rem aliquam atque est. Corrupti est in sunt consequuntur.</p>",
                "timezone": "Pacific/Niue",
                "week_begins": 6,
                "public_url": "http://addcal.co/c/zu3u2vu0ju8g",
                "created_at": "2026-08-08T06:22:37.000000Z",
                "updated_at": "2026-08-08T06:22:37.000000Z"
            },
            "created_at": "2026-08-08T06:22:37.000000Z",
            "updated_at": "2026-08-08T06:22:37.000000Z"
        },
        {
            "uid": "wj0ji2q0xamd",
            "public_id": "evt_wj0ji2q0xamd",
            "calendar_uid": "cal_0i9rs7gxd6yh",
            "short_link": null,
            "title": "Quas sit a sunt rem nihil aliquid labore.",
            "internal_name": null,
            "is_draft": false,
            "description": "<p>Sed laboriosam similique exercitationem. Corporis consequuntur temporibus et voluptas ducimus reiciendis recusandae. Numquam quisquam molestias molestiae numquam accusamus. Impedit et aut inventore.</p>\n\n<p>Saepe consequatur perferendis repellendus aut. Autem dolorem dolores voluptas possimus voluptas modi sapiente. Id et est molestiae debitis non ut.</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-07-23T13:35:27-05:00",
            "date_end": "2026-07-23T17:35:27-05:00",
            "timezone": "America/Indiana/Knox",
            "busy_type": null,
            "reminder_before": null,
            "date_range_formatted": "Thu, Jul 23, 2026 1:35 PM - 5:35 PM",
            "public_url": "http://addcal.co/e/wj0ji2q0xamd",
            "embed_url": "http://addcal.co/e/wj0ji2q0xamd",
            "location_url": null,
            "image_url": null,
            "timezone_readable": "CDT / GMT-05:00",
            "calendar": {
                "uid": "0i9rs7gxd6yh",
                "public_id": "cal_0i9rs7gxd6yh",
                "short_link": null,
                "name": "eum earum error",
                "internal_name": null,
                "description": "",
                "timezone": "Pacific/Tahiti",
                "week_begins": 1,
                "public_url": "http://addcal.co/c/0i9rs7gxd6yh",
                "created_at": "2026-08-08T06:22:37.000000Z",
                "updated_at": "2026-08-08T06:22:37.000000Z"
            },
            "created_at": "2026-08-08T06:22:37.000000Z",
            "updated_at": "2026-08-08T06:22:37.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": "6do775kzw69t",
        "public_id": "evt_6do775kzw69t",
        "calendar_uid": "cal_dq0y4foza3mc",
        "short_link": null,
        "title": "Minus aut repellat reprehenderit quia minima.",
        "internal_name": null,
        "is_draft": false,
        "description": "<p>Optio praesentium blanditiis ut fuga consectetur velit quas. Eius provident debitis rerum temporibus pariatur. Voluptatem id consequatur recusandae cumque. Perspiciatis reprehenderit et nulla eum et eligendi.</p>\n\n<p>Libero doloribus deleniti expedita et dolores ipsum. Facere suscipit vitae placeat est iure possimus. Illum vero inventore temporibus necessitatibus et. Ex laudantium et voluptates et officiis ea quaerat vel.</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-05T06:38:36+00:00",
        "date_end": "2026-09-05T08:38:36+00:00",
        "timezone": null,
        "busy_type": null,
        "reminder_before": null,
        "date_range_formatted": "Sat, Sep 5, 2026 (all day)",
        "public_url": "http://addcal.co/e/6do775kzw69t",
        "embed_url": "http://addcal.co/e/6do775kzw69t",
        "location_url": null,
        "image_url": null,
        "timezone_readable": null,
        "calendar": {
            "uid": "dq0y4foza3mc",
            "public_id": "cal_dq0y4foza3mc",
            "short_link": null,
            "name": "corrupti a quae",
            "internal_name": "placeat in veritatis",
            "description": "",
            "timezone": "America/Cambridge_Bay",
            "week_begins": 3,
            "public_url": "http://addcal.co/c/dq0y4foza3mc",
            "created_at": "2026-08-08T06:22:37.000000Z",
            "updated_at": "2026-08-08T06:22:37.000000Z"
        },
        "created_at": "2026-08-08T06:22:37.000000Z",
        "updated_at": "2026-08-08T06:22:37.000000Z"
    },
    "links": {
        "event_page": "http://addcal.co/e/6do775kzw69t",
        "auto": "https://addcal.co/e/6do775kzw69t/auto",
        "google": "https://addcal.co/e/6do775kzw69t/google",
        "apple": "https://addcal.co/e/6do775kzw69t/apple",
        "outlook": "https://addcal.co/e/6do775kzw69t/outlook",
        "outlook_web": "https://addcal.co/e/6do775kzw69t/outlook_web",
        "yahoo": "https://addcal.co/e/6do775kzw69t/yahoo",
        "office365": "https://addcal.co/e/6do775kzw69t/office365",
        "ics": "https://addcal.co/e/6do775kzw69t/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": "ne6giyw7wkfo",
            "public_id": "evt_ne6giyw7wkfo",
            "calendar_uid": "cal_t33sgen41ncn",
            "short_link": null,
            "title": "Placeat placeat delectus voluptatum recusandae.",
            "internal_name": null,
            "is_draft": false,
            "description": "<p>Eos recusandae sit earum totam adipisci fugiat necessitatibus. Maxime tempore voluptatem sapiente. Quos sed sit aut rem. Nisi optio voluptas expedita dolor eos id earum corrupti. Non exercitationem nobis ut aut et placeat.</p>\n\n<p>Rerum exercitationem nobis vero reprehenderit. Distinctio voluptates vero iure et odio. Repudiandae et eos tempore fugit totam non velit et. Beatae amet occaecati est dolorem.</p>",
            "location": "236 Rosalee Ridges\nRonaldotown, NY 90781-7816",
            "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-08-18T12:32:53+00:00",
            "date_end": "2026-08-18T13:32:53+00:00",
            "timezone": null,
            "busy_type": null,
            "reminder_before": null,
            "date_range_formatted": "Tue, Aug 18, 2026 (all day)",
            "public_url": "http://addcal.co/e/ne6giyw7wkfo",
            "embed_url": "http://addcal.co/e/ne6giyw7wkfo",
            "location_url": null,
            "image_url": null,
            "timezone_readable": null,
            "calendar": {
                "uid": "t33sgen41ncn",
                "public_id": "cal_t33sgen41ncn",
                "short_link": null,
                "name": "sed id autem",
                "internal_name": null,
                "description": "<p>Sit possimus molestiae qui aut et odio. Sed quo expedita autem aspernatur rerum ab. Et laborum corrupti nihil reiciendis soluta velit. Excepturi hic facere ut asperiores asperiores inventore.</p>",
                "timezone": "Indian/Christmas",
                "week_begins": 2,
                "public_url": "http://addcal.co/c/t33sgen41ncn",
                "created_at": "2026-08-08T06:22:37.000000Z",
                "updated_at": "2026-08-08T06:22:37.000000Z"
            },
            "created_at": "2026-08-08T06:22:37.000000Z",
            "updated_at": "2026-08-08T06:22:37.000000Z"
        },
        {
            "uid": "31imrdgbdhd7",
            "public_id": "evt_31imrdgbdhd7",
            "calendar_uid": "cal_iy4xhgene399",
            "short_link": null,
            "title": "Perferendis debitis distinctio qui.",
            "internal_name": null,
            "is_draft": false,
            "description": "<p>Dicta aperiam vero aut animi quisquam nam. Cupiditate incidunt atque rerum rerum quibusdam.</p>\n\n<p>Et placeat molestias ut ab. Sed laudantium modi odio asperiores velit laudantium eum maxime. Voluptates dolorum odit enim voluptatem. Fugiat rerum et qui est unde saepe eum.</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-02T23:34:34+03:00",
            "date_end": "2026-09-03T01:34:34+03:00",
            "timezone": "Europe/Istanbul",
            "busy_type": null,
            "reminder_before": null,
            "date_range_formatted": "Wed, Sep 2, 2026 11:34 PM - Thu, Sep 3, 2026 1:34 AM",
            "public_url": "http://addcal.co/e/31imrdgbdhd7",
            "embed_url": "http://addcal.co/e/31imrdgbdhd7",
            "location_url": null,
            "image_url": null,
            "timezone_readable": "+03 / GMT+03:00",
            "calendar": {
                "uid": "iy4xhgene399",
                "public_id": "cal_iy4xhgene399",
                "short_link": null,
                "name": "nobis voluptatem illum",
                "internal_name": "qui officiis enim",
                "description": "<p>Tempora repellat eum iusto tempora delectus. Eaque rerum et et voluptatem. Libero earum vel mollitia vitae.</p>",
                "timezone": "America/Iqaluit",
                "week_begins": 4,
                "public_url": "http://addcal.co/c/iy4xhgene399",
                "created_at": "2026-08-08T06:22:37.000000Z",
                "updated_at": "2026-08-08T06:22:37.000000Z"
            },
            "created_at": "2026-08-08T06:22:37.000000Z",
            "updated_at": "2026-08-08T06:22:37.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

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

- `title` (string, required): Must not be greater than 255 characters.
- `internal_name` (string, optional): Must not be greater than 255 characters.
- `is_draft` (boolean, optional): No description.
- `description` (string, optional): No description.
- `location` (string, optional): Must not be greater than 255 characters.
- `is_all_day` (boolean, optional): No description.
- `recurrence_rule` (string, optional): No description.
- `series_title` (string, optional): Must not be greater than 255 characters.
- `has_rsvp` (boolean, optional): No description.
- `date_start` (string, required): Must be a valid date.
- `date_end` (string, required): Must be a valid date. Must be a date after or equal to date_start.
- `timezone` (string, required): Must be a valid time zone, such as Africa/Accra.
- `busy_type` (string, optional): No description. Options: `busy`, `free`.
- `reminder_before` (integer, optional): Must be at least 0.
- `short_link` (string, optional): Must match the regex /^[a-zA-Z0-9-]+$/. Must not be greater than 50 characters.

**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' \
  --header 'Content-Type: application/json' \
  --data '{
    "title": "kklimkwrd",
    "internal_name": "ivnuz",
    "is_draft": false,
    "description": "Quia nobis et laboriosam ut omnis molestiae ea reprehenderit.",
    "location": "axiqkmx",
    "is_all_day": true,
    "series_title": "u",
    "has_rsvp": true,
    "date_start": "2026-08-08T06:22:37",
    "date_end": "2033-06-10",
    "timezone": "Pacific/Norfolk",
    "busy_type": "busy",
    "reminder_before": 19,
    "short_link": "ngnhtznlxjzduciyvotnfzllt"
}'
```

**Response 200**

```json
{
    "data": {
        "uid": "qfyc7gvf10gb",
        "public_id": "evt_qfyc7gvf10gb",
        "calendar_uid": "cal_k1883afw3kz6",
        "short_link": null,
        "title": "Aliquam quis suscipit architecto eum.",
        "internal_name": null,
        "is_draft": false,
        "description": "<p>Cum non sit excepturi at et consequatur voluptatum. Et laudantium repellat dolorem et consequatur esse similique omnis. Similique magnam temporibus quaerat voluptatem enim quibusdam.</p>\n\n<p>Ut et quam aut ut. Nisi dolorem nulla corporis unde magnam similique. Ut quo quis dignissimos eum in perferendis et.</p>",
        "location": "999 Lowell Spring Apt. 348\nNorth Jordanburgh, MD 56860-3611",
        "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-07-19T14:01:57-08:00",
        "date_end": "2026-07-19T15:01:57-08:00",
        "timezone": "America/Nome",
        "busy_type": null,
        "reminder_before": null,
        "date_range_formatted": "Sun, Jul 19, 2026 2:01 PM - 3:01 PM",
        "public_url": "http://addcal.co/e/qfyc7gvf10gb",
        "embed_url": "http://addcal.co/e/qfyc7gvf10gb",
        "location_url": null,
        "image_url": null,
        "timezone_readable": "AKDT / GMT-08:00",
        "calendar": {
            "uid": "k1883afw3kz6",
            "public_id": "cal_k1883afw3kz6",
            "short_link": null,
            "name": "corrupti ipsa et",
            "internal_name": null,
            "description": "<p>Quam molestiae sint mollitia rerum delectus ab. Doloribus voluptatem vel velit ab aspernatur. Fuga laudantium ea corporis eaque deleniti. Dolorum magni est suscipit perferendis dolores suscipit modi. Accusantium id sint perferendis corporis.</p>",
            "timezone": "Europe/Zurich",
            "week_begins": 5,
            "public_url": "http://addcal.co/c/k1883afw3kz6",
            "created_at": "2026-08-08T06:22:37.000000Z",
            "updated_at": "2026-08-08T06:22:37.000000Z"
        },
        "created_at": "2026-08-08T06:22:37.000000Z",
        "updated_at": "2026-08-08T06:22:37.000000Z"
    },
    "links": {
        "event_page": "http://addcal.co/e/qfyc7gvf10gb",
        "auto": "https://addcal.co/e/qfyc7gvf10gb/auto",
        "google": "https://addcal.co/e/qfyc7gvf10gb/google",
        "apple": "https://addcal.co/e/qfyc7gvf10gb/apple",
        "outlook": "https://addcal.co/e/qfyc7gvf10gb/outlook",
        "outlook_web": "https://addcal.co/e/qfyc7gvf10gb/outlook_web",
        "yahoo": "https://addcal.co/e/qfyc7gvf10gb/yahoo",
        "office365": "https://addcal.co/e/qfyc7gvf10gb/office365",
        "ics": "https://addcal.co/e/qfyc7gvf10gb/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"
}
```

### 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": "xm2rlbityzpx",
        "public_id": "evt_xm2rlbityzpx",
        "calendar_uid": "cal_ata6qjjiyiz1",
        "short_link": null,
        "title": "Autem modi occaecati aliquid.",
        "internal_name": null,
        "is_draft": false,
        "description": "<p>Provident ipsam eligendi consectetur a. Debitis laudantium ipsa esse totam ea doloribus. Sunt ut dolor id nulla quo.</p>\n\n<p>In et non perferendis accusamus adipisci quam. Maxime quisquam quia ipsum optio non optio pariatur. Nihil temporibus est qui quas totam.</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-07-15T03:22:13+12:00",
        "date_end": "2026-07-15T06:22:13+12:00",
        "timezone": "Pacific/Nauru",
        "busy_type": null,
        "reminder_before": null,
        "date_range_formatted": "Wed, Jul 15, 2026 3:22 AM - 6:22 AM",
        "public_url": "http://addcal.co/e/xm2rlbityzpx",
        "embed_url": "http://addcal.co/e/xm2rlbityzpx",
        "location_url": null,
        "image_url": null,
        "timezone_readable": "+12 / GMT+12:00",
        "calendar": {
            "uid": "ata6qjjiyiz1",
            "public_id": "cal_ata6qjjiyiz1",
            "short_link": null,
            "name": "dolorum aperiam accusamus",
            "internal_name": "ipsum architecto natus",
            "description": "",
            "timezone": "Europe/Kyiv",
            "week_begins": 4,
            "public_url": "http://addcal.co/c/ata6qjjiyiz1",
            "created_at": "2026-08-08T06:22:37.000000Z",
            "updated_at": "2026-08-08T06:22:37.000000Z"
        },
        "created_at": "2026-08-08T06:22:37.000000Z",
        "updated_at": "2026-08-08T06:22:37.000000Z"
    },
    "links": {
        "event_page": "http://addcal.co/e/xm2rlbityzpx",
        "auto": "https://addcal.co/e/xm2rlbityzpx/auto",
        "google": "https://addcal.co/e/xm2rlbityzpx/google",
        "apple": "https://addcal.co/e/xm2rlbityzpx/apple",
        "outlook": "https://addcal.co/e/xm2rlbityzpx/outlook",
        "outlook_web": "https://addcal.co/e/xm2rlbityzpx/outlook_web",
        "yahoo": "https://addcal.co/e/xm2rlbityzpx/yahoo",
        "office365": "https://addcal.co/e/xm2rlbityzpx/office365",
        "ics": "https://addcal.co/e/xm2rlbityzpx/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}`

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

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

- `title` (string, required): Must not be greater than 255 characters.
- `internal_name` (string, optional): Must not be greater than 255 characters.
- `is_draft` (boolean, optional): No description.
- `description` (string, optional): No description.
- `location` (string, optional): Must not be greater than 255 characters.
- `is_all_day` (boolean, optional): No description.
- `recurrence_rule` (string, optional): No description.
- `series_title` (string, optional): Must not be greater than 255 characters.
- `has_rsvp` (boolean, optional): No description.
- `send_invite_updates` (boolean, optional): No description.
- `date_start` (string, required): Must be a valid date.
- `date_end` (string, required): Must be a valid date. Must be a date after or equal to date_start.
- `timezone` (string, required): Must be a valid time zone, such as Africa/Accra.
- `busy_type` (string, optional): No description. Options: `busy`, `free`.
- `reminder_before` (integer, optional): Must be at least 0.
- `short_link` (string, optional): @var Event $event Must match the regex /^[a-zA-Z0-9-]+$/. Must not be greater than 50 characters.

**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' \
  --header 'Content-Type: application/json' \
  --data '{
    "title": "tqc",
    "internal_name": "jz",
    "is_draft": true,
    "description": "Quia qui aspernatur est ut.",
    "location": "djc",
    "is_all_day": false,
    "series_title": "ijfmujctcccfvqfi",
    "has_rsvp": true,
    "send_invite_updates": false,
    "date_start": "2026-08-08T06:22:37",
    "date_end": "2086-09-13",
    "timezone": "Africa/Abidjan",
    "busy_type": "free",
    "reminder_before": 20,
    "short_link": "rrvegijfgrmczhaonsda"
}'
```

**Response 200**

```json
{
    "data": {
        "uid": "pksdzbtj82bs",
        "public_id": "evt_pksdzbtj82bs",
        "calendar_uid": "cal_yo5bc10ing9r",
        "short_link": null,
        "title": "Vero animi sed maxime itaque voluptas mollitia dignissimos.",
        "internal_name": null,
        "is_draft": false,
        "description": "<p>Itaque quis nostrum et maiores dolor ea placeat. Voluptatibus sit quidem consequatur debitis dolorum totam rem ab. Corporis assumenda quos nesciunt porro.</p>\n\n<p>Similique rerum impedit aut dolorem dolorem sint quo. Neque nulla enim aut et explicabo officia totam. Possimus ad quis optio doloremque molestiae quo. Harum vero corporis unde quibusdam.</p>",
        "location": "7698 Laila Stream\nCarloburgh, MT 26542",
        "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-04T20:54:18+02:00",
        "date_end": "2026-08-04T22:54:18+02:00",
        "timezone": "Africa/Maputo",
        "busy_type": null,
        "reminder_before": null,
        "date_range_formatted": "Tue, Aug 4, 2026 8:54 PM - 10:54 PM",
        "public_url": "http://addcal.co/e/pksdzbtj82bs",
        "embed_url": "http://addcal.co/e/pksdzbtj82bs",
        "location_url": null,
        "image_url": null,
        "timezone_readable": "CAT / GMT+02:00",
        "calendar": {
            "uid": "yo5bc10ing9r",
            "public_id": "cal_yo5bc10ing9r",
            "short_link": null,
            "name": "sit et ut",
            "internal_name": null,
            "description": "",
            "timezone": "Asia/Qyzylorda",
            "week_begins": 0,
            "public_url": "http://addcal.co/c/yo5bc10ing9r",
            "created_at": "2026-08-08T06:22:37.000000Z",
            "updated_at": "2026-08-08T06:22:37.000000Z"
        },
        "created_at": "2026-08-08T06:22:37.000000Z",
        "updated_at": "2026-08-08T06:22:37.000000Z"
    },
    "links": {
        "event_page": "http://addcal.co/e/pksdzbtj82bs",
        "auto": "https://addcal.co/e/pksdzbtj82bs/auto",
        "google": "https://addcal.co/e/pksdzbtj82bs/google",
        "apple": "https://addcal.co/e/pksdzbtj82bs/apple",
        "outlook": "https://addcal.co/e/pksdzbtj82bs/outlook",
        "outlook_web": "https://addcal.co/e/pksdzbtj82bs/outlook_web",
        "yahoo": "https://addcal.co/e/pksdzbtj82bs/yahoo",
        "office365": "https://addcal.co/e/pksdzbtj82bs/office365",
        "ics": "https://addcal.co/e/pksdzbtj82bs/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."
}
```
