{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/deadsimple-email/json-schema/deadsimple-email-calendar-invite-schema.json",
  "title": "CalendarInvite",
  "description": "A calendar invitation carried in the message body, which is what makes the recipient's mail client show Accept/Decline and puts the event on their calendar. Attaching an .ics file does not do this: it arrives as a download nobody can act on. Times need a zone -- a trailing \"Z\", an offset, or `timezone`. Attendees default to the message's own to + cc. The send response returns `calendar_uid`; keep it, because rescheduling (same uid, higher sequence) and cancelling (method CANCEL) are matched to the original event by UID.\n",
  "x-generated": "2026-11-05",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/deadsimple-email-openapi.json#/components/schemas/CalendarInvite",
  "type": "object",
  "properties": {
    "title": {
      "type": "string",
      "description": "Event title, as it appears on the calendar"
    },
    "start": {
      "type": "string",
      "description": "ISO 8601 start. A bare date (\"2026-09-15\") makes it all-day.\n"
    },
    "end": {
      "type": "string",
      "description": "ISO 8601 end. Omit to use duration_minutes."
    },
    "duration_minutes": {
      "type": "integer",
      "default": 30,
      "description": "Length when `end` is absent"
    },
    "timezone": {
      "type": "string",
      "description": "IANA zone for a local time carrying no offset, e.g. \"America/New_York\". Required for a naive start/end, since otherwise the meeting would land at the wrong hour.\n"
    },
    "location": {
      "type": "string"
    },
    "description": {
      "type": "string"
    },
    "attendees": {
      "type": "array",
      "description": "Defaults to the message's to + cc",
      "items": {
        "oneOf": [
          {
            "type": "string"
          },
          {
            "type": "object",
            "properties": {
              "email": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "optional": {
                "type": "boolean"
              }
            }
          }
        ]
      }
    },
    "reminder_minutes": {
      "type": "integer",
      "description": "Alarm this many minutes before the event"
    },
    "all_day": {
      "type": "boolean"
    },
    "recurrence": {
      "type": "string",
      "description": "RFC 5545 rule, e.g. \"FREQ=WEEKLY;COUNT=4\""
    },
    "uid": {
      "type": "string",
      "description": "Pass the uid of an event already sent to reschedule or cancel it. Omit for a new invitation.\n"
    },
    "sequence": {
      "type": "integer",
      "default": 0,
      "description": "Revision number. Must rise above the last one sent whenever an existing event changes, or clients ignore the update.\n"
    },
    "method": {
      "type": "string",
      "enum": [
        "REQUEST",
        "CANCEL",
        "PUBLISH"
      ],
      "default": "REQUEST",
      "description": "REQUEST asks for an RSVP. CANCEL withdraws an event (uid required). PUBLISH announces one with no RSVP.\n"
    },
    "ics": {
      "type": "string",
      "description": "Your own iCalendar object, instead of the fields above. The MIME method parameter is read from its METHOD line.\n"
    }
  }
}