---
title: "Send the event to its attendees as an invitation"
method: POST
path: "/v1/inboxes/{inbox_id}/calendar/events/{event_id}/invite"
tags: ["Calendar"]
---

# Send the event to its attendees as an invitation

`POST /v1/inboxes/{inbox_id}/calendar/events/{event_id}/invite`

## Request

- Base URL: `https://api.deadsimple.email`
- URL: `https://api.deadsimple.email/v1/inboxes/{inbox_id}/calendar/events/{event_id}/invite`
- Auth: HTTP bearer

Sends a real iCalendar invitation (METHOD:REQUEST) from the inbox to every attendee, through the normal send path (quota, guardrails and suppression apply; needs `messages.send`). The recipient sees Accept/Decline and the event lands on their calendar. The event keeps its `ical_uid`, so calling this again after a PATCH sends an update with a higher SEQUENCE that replaces the earlier entry rather than duplicating it. When the event's status is cancelled the message goes out as METHOD:CANCEL instead. Marks the event `source: sent` and links the message. The inbox must be the organizer. SDK: `calendar.invite`.

## Path parameters

- `inbox_id` string, required
- `event_id` string, required

## Request body

- object
  - `subject` string: Defaults to "Invitation: {title}", "Updated invitation: {title}" or "Cancelled: {title}".
  - `text_body` string: Covering text. Defaults to a line naming the event, when and where.
  - `html_body` string
  - `attendees` union[]: Replace the attendee list before sending.
    - union
      - string, email
      - CalendarAttendee
        - `email` string, email, required
        - `name` string
        - `response` 'needs-action' | 'accepted' | 'declined' | 'tentative': The attendee's answer as last seen (our own rsvp, or their REPLY).
        - `optional` boolean: OPT-PARTICIPANT rather than REQ-PARTICIPANT on the invitation.
  - `in_reply_to` string: A message_id to thread the invitation under.

## Response `201`

Sent.

- CalendarInviteResult
  - `event_id` string
  - `inbox_id` string
  - `workspace_id` string, nullable
  - `ical_uid` string: Stable across updates. What an update, cancellation or reply is matched on, on both ends.
  - `title` string
  - `description` string
  - `location` string
  - `start_at` string: ISO 8601 UTC, e.g. 2026-09-15T19:00:00Z
  - `end_at` string: ISO 8601 UTC. Exclusive for all-day events.
  - `timezone` string
  - `all_day` boolean
  - `status` 'confirmed' | 'tentative' | 'cancelled'
  - `organizer` CalendarOrganizer
    - `email` string, email
    - `name` string
  - `attendees` CalendarAttendee[]
    - `email` string, email, required
    - `name` string
    - `response` 'needs-action' | 'accepted' | 'declined' | 'tentative': The attendee's answer as last seen (our own rsvp, or their REPLY).
    - `optional` boolean: OPT-PARTICIPANT rather than REQ-PARTICIPANT on the invitation.
  - `source` 'api' | 'sent' | 'inbound': api = created here; sent = created here and sent as an invitation; inbound = arrived by email.
  - `sequence` integer
  - `message_id` string, nullable: The sent message.
  - `invited_at` string, nullable
  - `created_at` string
  - `updated_at` string
  - `method` 'REQUEST' | 'CANCEL': CANCEL when the event's status is cancelled; REQUEST otherwise.
  - `sent_to` string[]

## Other responses

- `400`: No attendees, or the inbox is not the event's organizer (answer with rsvp instead).

---

[API](https://skmtc.dev/deadsimple/apis/dead-simple-email-api.md) · [All operations](https://skmtc.dev/deadsimple/apis/dead-simple-email-api/llms.txt) · [OpenAPI document](https://skmtc.dev/deadsimple/apis/dead-simple-email-api/revisions/c697881be131?raw)
