# 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": "2497uth7f3zn",
            "public_id": "evt_2497uth7f3zn",
            "calendar_uid": "cal_eox0hmwyeu5k",
            "short_link": null,
            "title": "Sunt fugit tempore natus ducimus quae ut dolorum.",
            "internal_name": null,
            "is_draft": false,
            "description": "<p>Ducimus aut ab assumenda magnam labore consequuntur. Et est ea harum est et. Suscipit similique numquam incidunt consequatur. In nisi ut eveniet unde rerum est molestiae.</p>\n\n<p>Tenetur odio occaecati dolores. Labore quisquam sequi inventore voluptatem voluptatem totam. Consectetur nihil et possimus deserunt animi magnam dolorem. Et unde tenetur similique nam.</p>",
            "location": "342 Daugherty Mount\nSipesland, NE 37279-0492",
            "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-18T13:46:51+01:00",
            "date_end": "2026-09-18T16:46:51+01:00",
            "timezone": "Atlantic/Madeira",
            "busy_type": null,
            "reminder_before": null,
            "date_range_formatted": "Fri, Sep 18, 2026 1:46 PM - 4:46 PM",
            "public_url": "http://addcal.co/e/2497uth7f3zn",
            "embed_url": "http://addcal.co/e/2497uth7f3zn",
            "location_url": null,
            "image_url": null,
            "timezone_readable": "WEST / GMT+01:00",
            "calendar": {
                "uid": "eox0hmwyeu5k",
                "public_id": "cal_eox0hmwyeu5k",
                "short_link": null,
                "name": "aut beatae commodi",
                "internal_name": "consequatur sint voluptatem",
                "description": "",
                "timezone": "America/Santarem",
                "week_begins": 4,
                "public_url": "http://addcal.co/c/eox0hmwyeu5k",
                "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": "ap3xucsxrxyj",
            "public_id": "evt_ap3xucsxrxyj",
            "calendar_uid": "cal_ndi7c217vncr",
            "short_link": null,
            "title": "Modi esse est consequatur est et quibusdam laborum.",
            "internal_name": null,
            "is_draft": false,
            "description": "<p>Optio eius qui quod ut non. Et porro sapiente earum. Id hic reprehenderit amet nihil quasi.</p>\n\n<p>Provident exercitationem earum illo minus aspernatur ut et. Esse aspernatur sunt rerum rerum reiciendis maiores. Rem in illum est quis.</p>",
            "location": "257 Spinka Forks\nToniberg, SD 00015",
            "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-03T20:53:42+00:00",
            "date_end": "2026-08-03T22:53:42+00:00",
            "timezone": null,
            "busy_type": null,
            "reminder_before": null,
            "date_range_formatted": "Mon, Aug 3, 2026 (all day)",
            "public_url": "http://addcal.co/e/ap3xucsxrxyj",
            "embed_url": "http://addcal.co/e/ap3xucsxrxyj",
            "location_url": null,
            "image_url": null,
            "timezone_readable": null,
            "calendar": {
                "uid": "ndi7c217vncr",
                "public_id": "cal_ndi7c217vncr",
                "short_link": null,
                "name": "eveniet debitis voluptates",
                "internal_name": "voluptates nostrum ex",
                "description": "",
                "timezone": "Africa/Porto-Novo",
                "week_begins": 0,
                "public_url": "http://addcal.co/c/ndi7c217vncr",
                "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 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": "w7kge7r8h8q5",
        "public_id": "evt_w7kge7r8h8q5",
        "calendar_uid": "cal_z1apbwfu7ttp",
        "short_link": null,
        "title": "Et similique rem non.",
        "internal_name": null,
        "is_draft": false,
        "description": "<p>Natus aut ex aut laborum quas veniam illum. Itaque eaque nulla rem et doloremque occaecati quas consectetur. Cupiditate dolor vero magnam modi numquam enim explicabo harum.</p>\n\n<p>Blanditiis numquam iste consectetur labore iste. Optio laboriosam alias alias voluptatem ut. Debitis enim a neque quo. Est sunt laborum nihil dicta voluptatem rerum adipisci.</p>",
        "location": "6785 Considine Plaza\nHaleyland, CO 55689-9043",
        "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-21T14:11:30-05:00",
        "date_end": "2026-08-21T16:11:30-05:00",
        "timezone": "America/Eirunepe",
        "busy_type": null,
        "reminder_before": null,
        "date_range_formatted": "Fri, Aug 21, 2026 2:11 PM - 4:11 PM",
        "public_url": "http://addcal.co/e/w7kge7r8h8q5",
        "embed_url": "http://addcal.co/e/w7kge7r8h8q5",
        "location_url": null,
        "image_url": null,
        "timezone_readable": "-05 / GMT-05:00",
        "calendar": {
            "uid": "z1apbwfu7ttp",
            "public_id": "cal_z1apbwfu7ttp",
            "short_link": null,
            "name": "totam nobis voluptates",
            "internal_name": "explicabo est laboriosam",
            "description": "",
            "timezone": "Europe/Moscow",
            "week_begins": 1,
            "public_url": "http://addcal.co/c/z1apbwfu7ttp",
            "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"
    },
    "links": {
        "event_page": "http://addcal.co/e/w7kge7r8h8q5",
        "auto": "https://addcal.co/e/w7kge7r8h8q5/auto",
        "google": "https://addcal.co/e/w7kge7r8h8q5/google",
        "apple": "https://addcal.co/e/w7kge7r8h8q5/apple",
        "outlook": "https://addcal.co/e/w7kge7r8h8q5/outlook",
        "outlook_web": "https://addcal.co/e/w7kge7r8h8q5/outlook_web",
        "yahoo": "https://addcal.co/e/w7kge7r8h8q5/yahoo",
        "office365": "https://addcal.co/e/w7kge7r8h8q5/office365",
        "ics": "https://addcal.co/e/w7kge7r8h8q5/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": "izypfqsyeoxh",
            "public_id": "evt_izypfqsyeoxh",
            "calendar_uid": "cal_49o2h4qqhaux",
            "short_link": null,
            "title": "Accusamus illum non maxime aspernatur.",
            "internal_name": null,
            "is_draft": false,
            "description": "<p>Quae qui qui blanditiis quisquam aut eum. Et ullam at a. Omnis soluta dolorem optio alias qui.</p>\n\n<p>Doloribus quia dolore consequatur. Rem est provident occaecati et consequatur recusandae ut. Explicabo repudiandae beatae explicabo. Praesentium architecto quod velit aut architecto.</p>",
            "location": "78358 Koch Brooks\nNorth Neoma, WA 03464",
            "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-23T09:22:57+00:00",
            "date_end": "2026-08-23T12:22:57+00:00",
            "timezone": null,
            "busy_type": null,
            "reminder_before": null,
            "date_range_formatted": "Sun, Aug 23, 2026 (all day)",
            "public_url": "http://addcal.co/e/izypfqsyeoxh",
            "embed_url": "http://addcal.co/e/izypfqsyeoxh",
            "location_url": null,
            "image_url": null,
            "timezone_readable": null,
            "calendar": {
                "uid": "49o2h4qqhaux",
                "public_id": "cal_49o2h4qqhaux",
                "short_link": null,
                "name": "culpa sint fugit",
                "internal_name": "commodi delectus dolorem",
                "description": "",
                "timezone": "America/Santo_Domingo",
                "week_begins": 1,
                "public_url": "http://addcal.co/c/49o2h4qqhaux",
                "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": "qtre0reodap9",
            "public_id": "evt_qtre0reodap9",
            "calendar_uid": "cal_zlbtxo9tw4e7",
            "short_link": null,
            "title": "Tenetur adipisci est cupiditate excepturi consectetur.",
            "internal_name": null,
            "is_draft": false,
            "description": "<p>Quas cupiditate voluptatem dolores officia. Sunt itaque aut voluptatum ipsum amet ut possimus. Debitis eos tenetur sed doloremque atque eligendi asperiores. Possimus suscipit officiis omnis ab velit tempore a.</p>\n\n<p>Maiores ut quae molestias. Voluptatem nisi adipisci beatae maxime fugit et qui. Nam natus unde magnam nisi perferendis. Repudiandae totam sint sed autem accusantium.</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-15T06:22:07+00:00",
            "date_end": "2026-09-15T08:22:07+00:00",
            "timezone": null,
            "busy_type": null,
            "reminder_before": null,
            "date_range_formatted": "Tue, Sep 15, 2026 (all day)",
            "public_url": "http://addcal.co/e/qtre0reodap9",
            "embed_url": "http://addcal.co/e/qtre0reodap9",
            "location_url": null,
            "image_url": null,
            "timezone_readable": null,
            "calendar": {
                "uid": "zlbtxo9tw4e7",
                "public_id": "cal_zlbtxo9tw4e7",
                "short_link": null,
                "name": "recusandae aut cum",
                "internal_name": null,
                "description": "<p>Odit sit quo pariatur sunt ut dolores et. Dolor repellat alias nemo. Beatae quia rerum esse veniam sed. Enim ut autem ut doloremque sed.</p>",
                "timezone": "Atlantic/Reykjavik",
                "week_begins": 5,
                "public_url": "http://addcal.co/c/zlbtxo9tw4e7",
                "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 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": "qfklgofxpwqrzoyyso",
    "internal_name": "qnejarzznkmdbpdzsvgawqge",
    "is_draft": true,
    "description": "Sed quia assumenda hic sed.",
    "location": "yhvzbvbwzdunsfdynvfngckud",
    "is_all_day": false,
    "series_title": "gymxabwgycqcqerkqam",
    "has_rsvp": true,
    "date_start": "2026-08-28T03:20:12",
    "date_end": "2038-06-19",
    "timezone": "Asia/Kuala_Lumpur",
    "busy_type": "free",
    "reminder_before": 38,
    "short_link": "bdqcwkcthudpkbrdnnzhbhspl"
}'
```

**Response 200**

```json
{
    "data": {
        "uid": "7v4ykqe3kiwl",
        "public_id": "evt_7v4ykqe3kiwl",
        "calendar_uid": "cal_fo3p4eu2bv2c",
        "short_link": null,
        "title": "Et rerum sint sit tempora sapiente veritatis.",
        "internal_name": null,
        "is_draft": false,
        "description": "<p>Eum officia harum quaerat voluptate laborum omnis deleniti. Culpa qui et nobis quae non ut. Pariatur esse deleniti doloribus non eos beatae dolor laudantium.</p>\n\n<p>Corrupti et fuga nihil. Vel itaque et et. Quia dolorem repudiandae saepe eveniet. Et enim et voluptatum quis expedita aspernatur adipisci.</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-31T11:48:47+08:00",
        "date_end": "2026-07-31T12:48:47+08:00",
        "timezone": "Asia/Shanghai",
        "busy_type": null,
        "reminder_before": null,
        "date_range_formatted": "Fri, Jul 31, 2026 11:48 AM - 12:48 PM",
        "public_url": "http://addcal.co/e/7v4ykqe3kiwl",
        "embed_url": "http://addcal.co/e/7v4ykqe3kiwl",
        "location_url": null,
        "image_url": null,
        "timezone_readable": "CST / GMT+08:00",
        "calendar": {
            "uid": "fo3p4eu2bv2c",
            "public_id": "cal_fo3p4eu2bv2c",
            "short_link": null,
            "name": "et dolor commodi",
            "internal_name": null,
            "description": "<p>Quos corporis minima non impedit et. Architecto et velit natus. Sed id necessitatibus omnis atque ipsa rerum. Unde quo labore eos sed.</p>",
            "timezone": "America/St_Lucia",
            "week_begins": 1,
            "public_url": "http://addcal.co/c/fo3p4eu2bv2c",
            "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"
    },
    "links": {
        "event_page": "http://addcal.co/e/7v4ykqe3kiwl",
        "auto": "https://addcal.co/e/7v4ykqe3kiwl/auto",
        "google": "https://addcal.co/e/7v4ykqe3kiwl/google",
        "apple": "https://addcal.co/e/7v4ykqe3kiwl/apple",
        "outlook": "https://addcal.co/e/7v4ykqe3kiwl/outlook",
        "outlook_web": "https://addcal.co/e/7v4ykqe3kiwl/outlook_web",
        "yahoo": "https://addcal.co/e/7v4ykqe3kiwl/yahoo",
        "office365": "https://addcal.co/e/7v4ykqe3kiwl/office365",
        "ics": "https://addcal.co/e/7v4ykqe3kiwl/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": "yead8xfb2wf7",
        "public_id": "evt_yead8xfb2wf7",
        "calendar_uid": "cal_jox7j7hp6lhs",
        "short_link": null,
        "title": "Sunt quis error et maxime ea.",
        "internal_name": null,
        "is_draft": false,
        "description": "<p>Sint natus nam repudiandae recusandae aut a sit. Quis eos vero amet veniam iusto. Sunt ut reprehenderit rerum commodi. Voluptatem voluptatem voluptatibus laboriosam voluptates.</p>\n\n<p>Et eos ut consequatur deleniti voluptates rem nam. Assumenda tempora est sunt et est facere. Et illum unde et natus.</p>",
        "location": "405 Graham Drives\nLake Chelsea, AR 03463",
        "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-04T22:45:56-05:00",
        "date_end": "2026-09-05T00:45:56-05:00",
        "timezone": "America/North_Dakota/Beulah",
        "busy_type": null,
        "reminder_before": null,
        "date_range_formatted": "Fri, Sep 4, 2026 10:45 PM - Sat, Sep 5, 2026 12:45 AM",
        "public_url": "http://addcal.co/e/yead8xfb2wf7",
        "embed_url": "http://addcal.co/e/yead8xfb2wf7",
        "location_url": null,
        "image_url": null,
        "timezone_readable": "CDT / GMT-05:00",
        "calendar": {
            "uid": "jox7j7hp6lhs",
            "public_id": "cal_jox7j7hp6lhs",
            "short_link": null,
            "name": "blanditiis a aspernatur",
            "internal_name": null,
            "description": "",
            "timezone": "Africa/Bamako",
            "week_begins": 0,
            "public_url": "http://addcal.co/c/jox7j7hp6lhs",
            "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"
    },
    "links": {
        "event_page": "http://addcal.co/e/yead8xfb2wf7",
        "auto": "https://addcal.co/e/yead8xfb2wf7/auto",
        "google": "https://addcal.co/e/yead8xfb2wf7/google",
        "apple": "https://addcal.co/e/yead8xfb2wf7/apple",
        "outlook": "https://addcal.co/e/yead8xfb2wf7/outlook",
        "outlook_web": "https://addcal.co/e/yead8xfb2wf7/outlook_web",
        "yahoo": "https://addcal.co/e/yead8xfb2wf7/yahoo",
        "office365": "https://addcal.co/e/yead8xfb2wf7/office365",
        "ics": "https://addcal.co/e/yead8xfb2wf7/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): 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": "wzutpboymqcdhnci",
    "internal_name": "d",
    "is_draft": true,
    "description": "Error ut sit omnis amet voluptatem dolore ducimus ratione.",
    "location": "f",
    "is_all_day": true,
    "series_title": "poqrszloaveloubrikvh",
    "has_rsvp": false,
    "send_invite_updates": false,
    "date_start": "2026-08-28T03:20:12",
    "date_end": "2039-03-23",
    "timezone": "Asia/Bangkok",
    "busy_type": "busy",
    "reminder_before": 79,
    "short_link": "wmtcyxfbohadhiu"
}'
```

**Response 200**

```json
{
    "data": {
        "uid": "zxtmtrgpl1kv",
        "public_id": "evt_zxtmtrgpl1kv",
        "calendar_uid": "cal_hf1t8frn77k5",
        "short_link": null,
        "title": "Recusandae fuga similique natus earum.",
        "internal_name": null,
        "is_draft": false,
        "description": "<p>Non qui veniam eum omnis. Distinctio facilis et molestiae exercitationem minus eligendi tempore. Voluptas minus doloribus saepe provident facilis.</p>\n\n<p>Ad dolor ut et ullam reprehenderit et. Non eum iusto qui ipsa dolorem est. Cum et qui eligendi officia dolores.</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-02T02:42:09+00:00",
        "date_end": "2026-09-02T06:42:09+00:00",
        "timezone": null,
        "busy_type": null,
        "reminder_before": null,
        "date_range_formatted": "Wed, Sep 2, 2026 (all day)",
        "public_url": "http://addcal.co/e/zxtmtrgpl1kv",
        "embed_url": "http://addcal.co/e/zxtmtrgpl1kv",
        "location_url": null,
        "image_url": null,
        "timezone_readable": null,
        "calendar": {
            "uid": "hf1t8frn77k5",
            "public_id": "cal_hf1t8frn77k5",
            "short_link": null,
            "name": "voluptatem sed neque",
            "internal_name": "molestias animi distinctio",
            "description": "<p>Non unde consectetur est velit. Recusandae tempore et tempora similique. Voluptate et totam voluptas voluptates.</p>",
            "timezone": "Africa/Libreville",
            "week_begins": 6,
            "public_url": "http://addcal.co/c/hf1t8frn77k5",
            "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"
    },
    "links": {
        "event_page": "http://addcal.co/e/zxtmtrgpl1kv",
        "auto": "https://addcal.co/e/zxtmtrgpl1kv/auto",
        "google": "https://addcal.co/e/zxtmtrgpl1kv/google",
        "apple": "https://addcal.co/e/zxtmtrgpl1kv/apple",
        "outlook": "https://addcal.co/e/zxtmtrgpl1kv/outlook",
        "outlook_web": "https://addcal.co/e/zxtmtrgpl1kv/outlook_web",
        "yahoo": "https://addcal.co/e/zxtmtrgpl1kv/yahoo",
        "office365": "https://addcal.co/e/zxtmtrgpl1kv/office365",
        "ics": "https://addcal.co/e/zxtmtrgpl1kv/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."
}
```
