> **Building with AI coding agents?** Install the authstack plugin with one command. This equips your agent with accurate Scalekit implementation patterns.
>
> **Recommended**:
> ```bash
> npx @scalekit-inc/cli setup
> ```
>
> Global:
> ```bash
> npm install -g @scalekit-inc/cli
> scalekit setup
> ```
>
> Supports Claude Code, Cursor, GitHub Copilot, Codex + skills for other Agent Skills-compatible agents.
> Skills: integrate-agentkit, implement-saaskit, add-mcp-oauth, implement-sso, implement-scim.
> [Full setup guide](https://docs.scalekit.com/dev-kit/build-with-ai/)

---

# Connect AI agents to Luma

The Luma connector lets your AI agent act in each user's Luma account. Each user connects their own Luma API key once, and Scalekit sends it with every call, so your agent never handles credentials. It comes with 74 tools.

**Authentication:** API Key
**Categories:** Calendar, Marketing
**Tools:** 74: 26 read, 41 write, 7 destructive
**Users sign in with:** API key
**Built by:** Scalekit connector
**Try it:** [Playground in the Scalekit dashboard](https://app.scalekit.com/ws/signup?sk_intent=playground&provider=LUMA)

## Setup

1. ### Install the SDK

   **Node.js**

   ```bash
   npm install @scalekit-sdk/node dotenv
   ```

   **Python**

   ```bash
   pip install scalekit-sdk-python python-dotenv
   ```

2. ### Set your credentials

   Add your Scalekit credentials to your `.env` file. Find values in **[app.scalekit.com](https://app.scalekit.com)** > **Developers** > **API Credentials**.

   ```sh title=".env"
   SCALEKIT_ENVIRONMENT_URL=<your-environment-url>
   SCALEKIT_CLIENT_ID=<your-client-id>
   SCALEKIT_CLIENT_SECRET=<your-client-secret>
   ```

3. ### Create the Luma connection

   In **AgentKit > Connections**, create a Luma connection. The name you give it is the `connection_name` your code passes. See [Configure connections](/agentkit/connections/).

4. ### Authorize a user and make your first call

   **Node.js** (`quickstart.mts`)

   ```typescript
   import { ScalekitClient } from '@scalekit-sdk/node'
   import 'dotenv/config'
   import { createInterface } from 'node:readline/promises'

   const scalekit = new ScalekitClient(
     process.env.SCALEKIT_ENVIRONMENT_URL,
     process.env.SCALEKIT_CLIENT_ID,
     process.env.SCALEKIT_CLIENT_SECRET,
   )
   const actions = scalekit.actions

   const connector = 'luma'
   const identifier = 'user_123'

   // Generate an authorization link for the user
   const { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })
   console.log('Authorize Luma:', link)
   const rl = createInterface({ input: process.stdin, output: process.stdout })
   await rl.question('Press Enter after authorizing...')
   rl.close()

   // Make your first call
   const result = await actions.executeTool({
     connector,
     identifier,
     toolName: 'luma_calendar_admins_list',
     toolInput: {},
   })
   console.log(result)
   ```

   ```bash
   npx tsx quickstart.mts
   ```

   **Python** (`quickstart.py`)

   ```python
   import os
   from scalekit import ScalekitClient
   from dotenv import load_dotenv
   load_dotenv()

   scalekit_client = ScalekitClient(
       env_url=os.getenv("SCALEKIT_ENVIRONMENT_URL"),
       client_id=os.getenv("SCALEKIT_CLIENT_ID"),
       client_secret=os.getenv("SCALEKIT_CLIENT_SECRET"),
   )
   actions = scalekit_client.actions

   connection_name = "luma"
   identifier = "user_123"

   # Generate an authorization link for the user
   link_response = actions.get_authorization_link(
       connection_name=connection_name,
       identifier=identifier,
   )
   print("Authorize Luma:", link_response.link)
   input("Press Enter after authorizing...")

   # Make your first call
   result = actions.execute_tool(
       tool_input={},
       tool_name="luma_calendar_admins_list",
       connection_name=connection_name,
       identifier=identifier,
   )
   print(result)
   ```

   ```bash
   python quickstart.py
   ```

   Each user opens the link once and enters their Luma credentials there. See [Authorize a user](/agentkit/tools/authorize/) for the full flow and statuses.

## Tools

Pass the exact name to `execute_tool`, with an input like each tool's example. To ask for a tool that's missing, use the [request form](https://scalekitsupport.portal.usepylon.com/forms/request-a-connector-tool).

**Node.js**

```typescript
const result = await actions.executeTool({
  toolName: 'luma_calendar_admins_list',
  toolInput: {},
  connector: 'luma',
  identifier: 'user_123',
})
```

**Python**

```python
result = actions.execute_tool(
    tool_name="luma_calendar_admins_list",
    tool_input={},
    connection_name="luma",
    identifier="user_123",
)
```

`result.data` is the app's response as JSON, and `result.execution_id` (`executionId` in Node.js) is the ID of the call.

### `luma_calendar_admins_list`

List Calendar Admins · Read-only

List all admins for the calendar your API key is scoped to.
Returns an array of admin user entries (each with their id, name, email, and avatar) and a has_more flag.
Use this to see who has admin access to manage the calendar.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `luma_calendar_coupons_list`

List Calendar Coupons · Read-only

List all coupons that have been created for your Luma calendar, applicable across its events.
Returns each coupon's code, discount configuration, and usage details, plus a next_cursor for pagination.
Use this for calendar-wide coupons. Use luma_event_coupons_list instead for coupons scoped to a single event.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `pagination_cursor` (`string`, optional): Cursor for the next page of results, taken from a previous response's next_cursor field. Omit to fetch the first page.
- `pagination_limit` (`number`, optional): Maximum number of coupons to return in this page. The server enforces its own upper bound regardless of the value passed.

Example input: `{}`

### `luma_calendar_event_lookup`

Lookup Event · Read-only

Check whether an event already exists on your Luma calendar, looking it up by its event ID or its public event URL.
Returns the event's id, calendar submission status (approved, pending, or rejected), and who submitted it, or null if no matching event is found.
Use this before submitting an event to a calendar, to avoid creating a duplicate entry. Use luma_event_get instead when you already have a confirmed event_id and want its full details, or luma_calendar_events_list to browse everything on a calendar.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `event_api_id` (`string`, optional): Deprecated — use event_id instead. Retained only for backward compatibility with older integrations that still send this field.
- `event_id` (`string`, optional): The Luma event ID to look up, formatted as evt- followed by an alphanumeric string. Provide this or url (or the deprecated event_api_id) to identify the event.
- `platform` (`string`, optional): Which platform to search: pass "luma" to look up a native Luma event, or "external" for an event hosted elsewhere and merely listed on this calendar. Omit to search across both. One of: `external`, `luma`.
- `url` (`string`, optional): Public event page URL to look up, e.g. https://lu.ma/abc1234. Provide this or event_id (or the deprecated event_api_id) to identify the event.

Example input: `{}`

### `luma_calendar_events_list`

List Events · Read-only

List events managed by the Luma calendar your API key is scoped to, with date range, sort, and platform filters.
Returns an array of event summaries (each with an access field) and a pagination cursor for the next page.
Use this to browse a calendar's events. Use luma_event_guests_list or luma_event_guest_get for a specific event's guests, or luma_entity_lookup to resolve an event from a URL or slug instead.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `access` (`array`, optional): Which access levels to include: manage (events the calendar manages) and/or view (events listed on the calendar but managed elsewhere). Defaults to manage only. Events returned with access=view have their location obfuscated to city level and omit host-only fields like meeting_url, registration_questions, and feedback_email. Private events the calendar doesn't manage are never returned.
- `after` (`string`, optional): Only return events starting after this ISO 8601 datetime. Example: 2022-10-19T03:27:13.673Z.
- `before` (`string`, optional): Only return events starting before this ISO 8601 datetime. Example: 2022-10-19T03:27:13.673Z.
- `pagination_cursor` (`string`, optional): Pagination cursor from the next_cursor field of a previous response, used to fetch the next page of events.
- `pagination_limit` (`number`, optional): Number of events to return in this page. The server enforces a maximum; omit to use the server default.
- `platforms` (`array`, optional): Which event platforms to include: luma (events hosted on Luma) and/or external (events imported from elsewhere). Defaults to luma only for backwards compatibility.
- `sort_column` (`string`, optional): Column to sort results by. Only start_at is currently supported. One of: `start_at`.
- `sort_direction` (`string`, optional): Sort direction for the sort_column value: asc, desc, asc nulls last, or desc nulls last. One of: `asc`, `desc`, `asc nulls last`, `desc nulls last`.
- `status` (`string`, optional): Filter by the event's calendar submission status: approved or pending. Defaults to approved. One of: `approved`, `pending`. Default: `approved`.

Example input: `{}`

### `luma_calendar_get`

Get Calendar · Read-only

Get the Luma calendar that your API key is scoped to.
Returns the calendar's details (such as its id, name, and description).
Use this to confirm which calendar your API key manages before calling other calendar, event, or tag tools.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `luma_contact_tags_list`

List Contact Tags · Read-only

List the contact tags defined on the calendar your API key is scoped to.
Returns an array of tag entries (each with an id, name, and color) and a has_more flag.
Use this to look up valid contact tag ids and names before filtering or tagging contacts elsewhere.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `luma_contacts_list`

List Contacts · Read-only

List the contacts stored on your Luma calendar, with optional text search, tag, and membership filters.
Returns each contact's profile fields alongside engagement stats such as event check-in and approval counts, plus a next_cursor for pagination.
Use this to browse or search your calendar's contact list. Use luma_event_guests_list instead for the guest list of one specific event, or luma_contact_tags_list to see the tags available to filter by.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `calendar_membership_tier_id` (`string`, optional): Restrict results to contacts who are members of this specific Calendar Membership tier. Get tier IDs from luma_membership_tiers_list.
- `membership_status` (`string`, optional): Filter by the contact's Calendar Membership approval status. Only meaningful for calendars that use Luma Memberships; has no effect otherwise. One of: `approved`, `pending`, `approved-pending-payment`, `declined`.
- `pagination_cursor` (`string`, optional): Cursor for the next page of results, taken from a previous response's next_cursor field. Omit to fetch the first page.
- `pagination_limit` (`number`, optional): Maximum number of contacts to return in this page. The server enforces its own upper bound regardless of the value passed.
- `query` (`string`, optional): Free-text search over contact names and email addresses.
- `sort_column` (`string`, optional): Column to sort results by. One of: `created_at`, `event_checked_in_count`, `event_approved_count`, `name`, `revenue_usd_cents`.
- `sort_direction` (`string`, optional): Sort order to apply to sort_column. One of: `asc`, `desc`, `asc nulls last`, `desc nulls last`.
- `tags` (`array`, optional): Tag names or tag IDs to filter contacts by. A contact matching ANY of the given tags is returned. Example: ["vip", "sponsor"].

Example input: `{}`

### `luma_entity_lookup`

Lookup Entity · Read-only

Look up a Luma event or calendar by its slug, full Luma URL, or public path such as event/evt-..., e/evt-..., or calendar/cal-....
Returns an entity object whose type field is calendar or event, containing that resource's id, name, slug, and (for events) its start/end times, or null if nothing matches.
Use this to resolve a link or slug you have into an ID before calling luma_event_get or luma_calendar_get. Any URL query parameters or fragments in the input are ignored.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `slug` (`string`, required): The slug, full Luma URL, or public path of the event or calendar to look up, e.g. https://lu.ma/my-event or event/evt-abc123XYZ. Any query parameters or URL fragments are ignored.

Example input: `{"slug":"my-community"}`

### `luma_event_blast_get`

Get Blast · Read-only

Get full details for a single email blast by its ID.
Returns the blast's subject, body, audience, status, and — for sent blasts — recipient_count and email_open_count.
Use this when you already have a blast ID. Use luma_event_blasts_list instead to browse all blasts sent on an event.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `blast_id` (`string`, required): The unique ID of the blast to retrieve, formatted as ep- followed by an alphanumeric string.

Example input: `{"blast_id":"<blast_id>"}`

### `luma_event_blasts_list`

List Blasts · Read-only

List the email blasts sent or scheduled to an event's guests, newest first.
Returns each blast's subject, audience, and status; sent blasts also include recipient_count and email_open_count.
Use this to review an event's communication history. Use luma_event_blast_get instead when you already have a single blast's ID.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `event_id` (`string`, required): The unique ID of the Luma event to list blasts for, formatted as evt- followed by an alphanumeric string.

Example input: `{"event_id":"<event_id>"}`

### `luma_event_coupons_list`

List Event Coupons · Read-only

List all coupons that have been created for a specific Luma event.
Returns each coupon's code, discount configuration, and usage details, plus a next_cursor for pagination.
Use this for coupons scoped to one event. Use luma_calendar_coupons_list instead for coupons that apply calendar-wide across all events.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `event_id` (`string`, required): The unique ID of the Luma event to list coupons for, formatted as evt- followed by an alphanumeric string.
- `pagination_cursor` (`string`, optional): Cursor for the next page of results, taken from a previous response's next_cursor field. Omit to fetch the first page.
- `pagination_limit` (`number`, optional): Maximum number of coupons to return in this page. The server enforces its own upper bound regardless of the value passed.

Example input: `{"event_id":"<event_id>"}`

### `luma_event_get`

Get Event · Read-only

Get full details for a single Luma event by its event ID.
Returns the event's complete details, host contact info, and a guest-count breakdown by status when you manage the event; otherwise returns only the fields a public event page shows.
Use this when you already have the event ID. Use luma_calendar_events_list to browse a calendar's events, or luma_calendar_event_lookup to find an event by URL or slug instead.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `event_id` (`string`, required): The unique ID of the Luma event to retrieve, formatted as evt- followed by an alphanumeric string (e.g. evt-abc123XYZ). Get this value from a calendar events list or event lookup response, or from the event's Luma dashboard URL.

Example input: `{"event_id":"<event_id>"}`

### `luma_event_guest_get`

Get Guest · Read-only

Get full details for a single guest of a Luma event, looked up by guest ID, ticket key, guest key, or email.
Returns the guest's registration and ticket info, including event_ticket_orders (with coupon_info when a coupon was applied).
Use this when you already have a guest identifier for a specific event. Use luma_event_guests_list to browse or filter all of an event's guests instead.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `event_id` (`string`, required): The unique ID of the Luma event the guest belongs to, formatted as evt- followed by an alphanumeric string (e.g. evt-abc123XYZ). Get this value from a calendar events list or event lookup response.
- `id` (`string`, required): Identifier for the guest to look up. Accepts a guest ID (starting with gst-), a ticket key, a guest key (starting with g-), or the guest's email address.

Example input: `{"event_id":"<event_id>","id":"<id>"}`

### `luma_event_guests_list`

List Guests · Read-only

List guests who have registered for or been invited to a Luma event, with approval-status filtering, sorting, and pagination.
Returns an array of guest summaries and their event_tickets (not order-level detail like event_ticket_orders), plus a pagination cursor for the next page.
Use this to browse or filter an event's guest list. Use luma_event_guest_get when you need one guest's full ticket order data, including coupon info.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `event_id` (`string`, required): The unique ID of the Luma event to list guests for, formatted as evt- followed by an alphanumeric string (e.g. evt-abc123XYZ). Get this value from a calendar events list or event lookup response.
- `approval_status` (`string`, optional): Filter guests by their registration approval status: approved, session, pending_approval, invited, declined, or waitlist. One of: `approved`, `session`, `pending_approval`, `invited`, `declined`, `waitlist`.
- `pagination_cursor` (`string`, optional): Pagination cursor from the next_cursor field of a previous response, used to fetch the next page of guests.
- `pagination_limit` (`number`, optional): Number of guests to return in this page. The server enforces a maximum; omit to use the server default.
- `sort_column` (`string`, optional): Column to sort results by: name, email, created_at, registered_at, or checked_in_at. One of: `name`, `email`, `created_at`, `registered_at`, `checked_in_at`.
- `sort_direction` (`string`, optional): Sort direction for the sort_column value: asc, desc, asc nulls last, or desc nulls last. One of: `asc`, `desc`, `asc nulls last`, `desc nulls last`.

Example input: `{"event_id":"<event_id>"}`

### `luma_event_tags_list`

List Event Tags · Read-only

List the event tags defined on the calendar your API key is scoped to.
Returns an array of tag entries (each with an id, name, and color) and a has_more flag.
Use this to look up valid event tag ids and names before filtering or tagging events elsewhere.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `luma_event_ticket_type_get`

Get Ticket Type · Read-only

Get full details for a single Luma event ticket type by its ID.
Returns the ticket type's name, price, capacity, and visibility settings.
Use this when you already have a ticket type ID. Use luma_event_ticket_types_list instead to browse every ticket type on an event.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `event_ticket_type_id` (`string`, required): The unique ID of the ticket type to retrieve, formatted as ttype- followed by an alphanumeric string.

Example input: `{"event_ticket_type_id":"<event_ticket_type_id>"}`

### `luma_event_ticket_types_list`

List Ticket Types · Read-only

List all ticket types configured for a Luma event.
Returns each ticket type's name, price, capacity, and visibility settings.
Use this to see every ticket type on an event. Use luma_event_ticket_type_get instead when you already have a single ticket type's ID.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `event_id` (`string`, required): The unique ID of the Luma event to list ticket types for, formatted as evt- followed by an alphanumeric string.
- `include_hidden` (`string`, optional): Whether to include ticket types that are hidden from the public event page. Pass "true" to include them; omit or pass "false" to only return visible ticket types.

Example input: `{"event_id":"<event_id>"}`

### `luma_images_search`

Search Cover Images · Read-only

Search Luma's gallery of stock event cover images by keyword.
Returns matching image entries with their image_url, plus a next_cursor for paging through more results.
Use this to find a ready-made cover image before creating or updating an event — pass the chosen image_url as the event's cover_url; gallery images don't need to be uploaded first.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `query` (`string`, required): Keywords to match against the gallery's image descriptions and tags. Must be a non-empty string, e.g. "dinner party" or "tech conference".
- `pagination_cursor` (`string`, optional): Cursor for the next page of results, taken from a previous response's next_cursor field. Omit to fetch the first page.
- `pagination_limit` (`number`, optional): Maximum number of images to return in this page. The server enforces its own upper bound regardless of the value passed.

Example input: `{"query":"dinner party"}`

### `luma_membership_tiers_list`

List Membership Tiers · Read-only

List the membership tiers configured on your Luma calendar, including hidden ones.
Returns each tier's name, price, and visibility (is_hidden), plus a next_cursor for pagination.
Use this to see all available membership tiers, for example before adding a contact to one.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `pagination_cursor` (`string`, optional): Cursor for the next page of results, taken from a previous response's next_cursor field. Omit to fetch the first page.
- `pagination_limit` (`number`, optional): Maximum number of membership tiers to return in this page. The server enforces its own upper bound regardless of the value passed.

Example input: `{}`

### `luma_organization_admins_list`

List Organization Admins · Read-only

List all admins for the Luma organization that owns the connected calendar.
Returns each admin's id, name, email, and avatar URL.
Use this to see who has admin access across the organization's calendars. Use luma_organization_calendars_list or luma_organization_events_list to browse the organization's calendars or events instead.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `luma_organization_calendars_list`

List Organization Calendars · Read-only

List all calendars belonging to the Luma organization that owns the connected calendar.
Returns each calendar's id, name, slug, launch status, and appearance settings, paginated with a cursor.
Use this to browse every calendar the organization manages. Use luma_organization_events_list to browse events across those calendars, or luma_organization_admins_list to see organization admins.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `pagination_cursor` (`string`, optional): Cursor for the next page of results, taken from the `next_cursor` value returned by a previous call to this tool. Leave empty to fetch the first page.
- `pagination_limit` (`number`, optional): Maximum number of calendars to return in this page. The server enforces a maximum limit and may return fewer than requested.

Example input: `{}`

### `luma_organization_events_list`

List Organization Events · Read-only

List all events across every calendar belonging to the Luma organization that owns the connected calendar. Events appearing on multiple calendars within the organization are deduplicated.
Returns each event's id, calendar id, start/end time, and other event details, paginated with a cursor.
Use this to browse events organization-wide. Use luma_event_get for full details on one event once you have its id, or luma_organization_calendars_list to browse calendars instead of events.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `after` (`string`, optional): Only include events starting after this ISO 8601 datetime, e.g. 2022-10-19T03:27:13.673Z.
- `before` (`string`, optional): Only include events starting before this ISO 8601 datetime, e.g. 2022-10-19T03:27:13.673Z.
- `pagination_cursor` (`string`, optional): Cursor for the next page of results, taken from the `next_cursor` value returned by a previous call to this tool. Leave empty to fetch the first page.
- `pagination_limit` (`number`, optional): Maximum number of events to return in this page. The server enforces a maximum limit and may return fewer than requested.
- `sort_direction` (`string`, optional): Sort order for results by start time: `asc` or `desc`, or `asc nulls last` / `desc nulls last` to push events without a start time to the end. One of: `asc`, `desc`, `asc nulls last`, `desc nulls last`.

Example input: `{}`

### `luma_places_search`

Search Places · Read-only

Search Google Maps (via Luma) for a place matching an address or venue name.
Returns up to 5 place candidates, each with a place_id and address details.
Use this to find a place_id, then pass it as geo_address_json: {type: "google", place_id} when creating or updating a Luma event.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `query` (`string`, required): Address or place name to search for, e.g. "120 W 41st St, New York".

Example input: `{"query":"120 W 41st St, New York"}`

### `luma_user_get_self`

Get Self · Read-only

Get the Luma user account associated with your API key.
Returns the authenticated user's profile details, such as their id, name, email, and avatar.
Use this to confirm which Luma account your API key belongs to.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `luma_webhook_get`

Get Webhook · Read-only

Get full details about a single webhook endpoint on the connected Luma calendar by its id.
Returns the webhook's target URL, subscribed event types, status, signing secret, and creation time.
Use this when you already have the webhook id. Use luma_webhooks_list to browse all webhooks and find the id first.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `id` (`string`, required): The unique ID of the webhook to retrieve. Get this value from a previous webhooks list response.

Example input: `{"id":"<id>"}`

### `luma_webhooks_list`

List Webhooks · Read-only

List all webhook endpoints configured on the connected Luma calendar.
Returns each webhook's id, target URL, subscribed event types, and status, paginated with a cursor.
Use this to browse existing webhooks or find a webhook's id. Use luma_webhook_get when you already have the webhook id and want its full details, including its signing secret.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `pagination_cursor` (`string`, optional): Cursor for the next page of results, taken from the `next_cursor` value returned by a previous call to this tool. Leave empty to fetch the first page.
- `pagination_limit` (`number`, optional): Maximum number of webhooks to return in this page. The server enforces a maximum limit and may return fewer than requested.

Example input: `{}`

### `luma_calendar_admin_add`

Add Calendar Admins · Write

Add one or more admins to a Luma calendar by email.
Returns the calendar's full list of admins after the addition.
Use this to grant people admin access to manage a calendar's events and settings; emails already in the admin list are skipped automatically. Use luma_calendar_admins_list to see current admins first.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `emails` (`array`, required): Email addresses of the people to make calendar admins, 1 to 20 at a time. Anyone without a Luma account gets one automatically, and new admins are emailed a notification. On a Luma Plus calendar, an addition that would need an extra paid admin seat is rejected — add that admin from the Luma app instead, where the seat charge can be confirmed.

Example input: `{"emails":[]}`

### `luma_calendar_coupon_create`

Create Calendar Coupon · Write

Create a coupon that guests can apply to any event managed by a Luma calendar.
Returns nothing on success — list the calendar's coupons afterward with luma_calendar_coupons_list to confirm.
Use this for a coupon valid across every event on the calendar; use luma_event_coupon_create instead to restrict a coupon, or create an unlock code, for just one event. Coupon terms can't be edited after creation — use luma_calendar_coupon_update only to change remaining uses or the validity window.
Avoid reusing a code that's already active on one of the calendar's individual events.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `code` (`string`, required): The code guests enter on any of the calendar's event pages to apply this coupon. Not case sensitive. Maximum 20 characters.
- `discount_type` (`string`, required): Which kind of discount this coupon applies: percent for a percentage off, or amount for a fixed amount off. Determines whether percent_off or cents_off/currency is used. One of: `percent`, `amount`.
- `cents_off` (`number`, optional): Fixed amount off, in the smallest unit of currency (e.g. cents for usd). Required when discount_type is amount, and must be paired with currency.
- `currency` (`string`, optional): Currency the amount off (cents_off) is denominated in. Required when discount_type is amount. One of: `solana_sol`, `solana_usdc`, `aed`, `afn`, `all`, `amd`, `ang`, `aoa`, `ars`, `aud`, `awg`, `azn`, `bam`, `bbd`, `bdt`, `bgn`, `bhd`, `bif`, `bmd`, `bnd`, `bob`, `brl`, `bsd`, `bwp`, `byn`, `bzd`, `cad`, `cdf`, `chf`, `clp`, `cny`, `cop`, `crc`, `cve`, `czk`, `djf`, `dkk`, `dop`, `dzd`, `egp`, `etb`, `eur`, `fjd`, `fkp`, `gbp`, `gel`, `ghs`, `gip`, `gmd`, `gnf`, `gtq`, `gyd`, `hkd`, `hnl`, `htg`, `huf`, `idr`, `ils`, `inr`, `isk`, `jmd`, `jod`, `jpy`, `kes`, `kgs`, `khr`, `kmf`, `krw`, `kwd`, `kyd`, `kzt`, `lak`, `lbp`, `lkr`, `lrd`, `lsl`, `mad`, `mdl`, `mga`, `mkd`, `mmk`, `mnt`, `mop`, `mur`, `mvr`, `mwk`, `mxn`, `myr`, `mzn`, `nad`, `ngn`, `nio`, `nok`, `npr`, `nzd`, `omr`, `pab`, `pen`, `pgk`, `php`, `pkr`, `pln`, `pyg`, `qar`, `ron`, `rsd`, `rub`, `rwf`, `sar`, `sbd`, `scr`, `sek`, `sgd`, `shp`, `sle`, `sos`, `srd`, `std`, `szl`, `thb`, `tjs`, `tnd`, `top`, `try`, `ttd`, `twd`, `tzs`, `uah`, `ugx`, `usd`, `uyu`, `uzs`, `vnd`, `vuv`, `wst`, `xaf`, `xcd`, `xof`, `xpf`, `yer`, `zar`, `zmw`.
- `percent_off` (`number`, optional): Percentage discount, from 0 to 100. Required when discount_type is percent; ignored otherwise. Use 0 together with event_ticket_type_id to create an unlock code that doesn't change the price.
- `remaining_count` (`integer`, optional): How many times the coupon can be redeemed in total. Set to 1000000 for effectively unlimited uses; leave blank to use Luma's default.
- `valid_end_at` (`string`, optional): ISO 8601 datetime the coupon expires. Leave blank for no end date.
- `valid_start_at` (`string`, optional): ISO 8601 datetime the coupon becomes valid from. Leave blank for no start restriction.

Example input: `{"code":"<code>","discount_type":"percent"}`

### `luma_calendar_coupon_update`

Update Calendar Coupon · Write

Update the remaining uses or validity window of an existing calendar-wide coupon.
Returns nothing on success.
Use this only to change remaining_count, valid_start_at, or valid_end_at — the code and discount terms can't be edited after creation. Use luma_calendar_coupon_create to make a new coupon instead, or luma_calendar_coupons_list to find the coupon's current code.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `code` (`string`, required): The coupon code to update, exactly as guests enter it (not case sensitive).
- `remaining_count` (`integer`, optional): New total number of redemptions allowed. Set to 1000000 for effectively unlimited. Leave blank to keep the current value.
- `valid_end_at` (`string`, optional): New ISO 8601 datetime the coupon expires. Leave blank to keep the current value.
- `valid_start_at` (`string`, optional): New ISO 8601 datetime the coupon becomes valid from. Leave blank to keep the current value.

Example input: `{"code":"<code>"}`

### `luma_calendar_event_add`

Add Calendar Event · Write

Add or submit an event to your Luma calendar: either an existing Luma event by ID, or an event hosted on another platform described by URL and details.
Returns the new calendar event's id and its status (approved or pending).
Use platform "luma" with event_id for an existing Luma event; use platform "external" with url, name, start_at, duration_interval, and timezone for an event hosted elsewhere. Afterward, use luma_calendar_event_approve or luma_calendar_event_reject to act on a pending submission.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `platform` (`string`, required): Which kind of event to add: luma for an event that already exists on Luma (identify it with event_id), or external for an event hosted on another platform (describe it with url, name, start_at, duration_interval, and timezone). One of: `luma`, `external`.
- `duration_interval` (`string`, optional): Duration of the external event as an ISO 8601 duration, e.g. PT2H for 2 hours. Required when platform is external; ignored otherwise.
- `event_id` (`string`, optional): ID of the existing Luma event to add to this calendar, formatted as evt- followed by an alphanumeric string. Required when platform is luma; ignored otherwise.
- `geo_address_json` (`object`, optional): Optional location for the external event, given as one of three address styles: a manual address string, a Google Maps place ID lookup, or a free-text search query resolved to the closest Google Maps match. Only used when platform is external. Example (manual): {"type": "manual", "address": "123 Main St, Springfield"}. Example (Google place ID): {"type": "google", "place_id": "ChIJN1t_tDeuEmsRUsoyG83frY4"}. Example (search query): {"type": "lookup", "query": "Moscone Center, San Francisco"}.
- `host` (`string`, optional): Name of the event host to display for the external event. Only used when platform is external.
- `name` (`string`, optional): Name/title of the external event. Required when platform is external; ignored otherwise.
- `start_at` (`string`, optional): Start time of the external event, as an ISO 8601 datetime, e.g. 2025-08-06T09:00:00Z. Required when platform is external; ignored otherwise.
- `submission_mode` (`string`, optional): Whether the submission is approved immediately (auto) or held for calendar admin approval (pending). Defaults to auto. One of: `auto`, `pending`. Default: `auto`.
- `timezone` (`string`, optional): IANA time zone of the external event, e.g. America/New_York. Required when platform is external; ignored otherwise.
- `url` (`string`, optional): Public URL of the external event. Required when platform is external; ignored otherwise.

Example input: `{"platform":"luma"}`

### `luma_calendar_event_approve`

Approve Calendar Event · Write

Approve a pending event submission on your Luma calendar.
Returns an empty JSON object on success; the event becomes visible on the calendar and the submitter is notified.
Use luma_calendar_event_reject instead to decline a pending submission. Requires a pending calendar event submission, typically created via luma_calendar_event_add.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `calendar_event_id` (`string`, required): ID of the calendar event submission to approve, formatted as calev- followed by an alphanumeric string. You can also pass the underlying Luma event ID (starting with evt-); Luma resolves it to the active pending submission on this calendar.

Example input: `{"calendar_event_id":"<calendar_event_id>"}`

### `luma_calendar_event_reject`

Reject Calendar Event · Write

Reject a pending event submission on your Luma calendar, optionally with a message explaining why.
Returns an empty JSON object on success; if the event is still pending, the submitter is notified.
Use luma_calendar_event_approve instead to accept a pending submission. Requires a pending calendar event submission, typically created via luma_calendar_event_add.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `calendar_event_id` (`string`, required): ID of the calendar event submission to reject, formatted as calev- followed by an alphanumeric string. You can also pass the underlying Luma event ID (starting with evt-); Luma resolves it to the active pending submission on this calendar.
- `message` (`string`, optional): Optional message sent to the submitter explaining why their event submission was rejected.

Example input: `{"calendar_event_id":"<calendar_event_id>"}`

### `luma_calendar_update`

Update Calendar · Write

Update settings on an existing Luma calendar. Only the fields you provide are changed; everything else stays the same.
Returns the calendar's full updated details, including its name, slug, launch status, and branding and social settings.
Use this to rename a calendar, change its launch status, or update its description, branding, social links, or location. Use luma_organization_calendar_create to create a new calendar instead.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `calendar_id` (`string`, required): The ID of the calendar to update, formatted as cal- followed by an alphanumeric string (e.g. cal-abc123XYZ). Get this value from a calendar list response or from the calendar's Luma dashboard URL.
- `avatar_url` (`string`, optional): URL of an image already uploaded to the Luma CDN, used as the calendar's avatar. Leave blank to keep the current avatar.
- `description` (`string`, optional): New short description shown on the calendar's page. Leave blank to keep the current description.
- `instagram_handle` (`string`, optional): Instagram handle or profile URL for the calendar, e.g. 'luma' or 'https://instagram.com/luma'. Leave blank to keep the current value; submit an empty string to remove it.
- `launch_status` (`string`, optional): Calendar visibility status. `launched` makes the calendar active, `coming-soon` shows a placeholder page instead of the full calendar, and `archived` stops new follows and visitor event submissions. Leave blank to keep the current status. One of: `launched`, `coming-soon`, `archived`.
- `linkedin_handle` (`string`, optional): LinkedIn company or profile URL for the calendar, e.g. 'https://linkedin.com/company/luma'. Leave blank to keep the current value; submit an empty string to remove it.
- `location` (`object`, optional): The city the calendar is based in, as a JSON object. Provide {"type": "lookup", "query": "Miami Beach, FL"} to search Google Maps by name, or {"type": "google", "place_id": "<google-places-id>"} to set it from a known Google Places ID; Luma derives the calendar's timezone and coordinates from the resolved city. Leave blank to keep the current location.
- `name` (`string`, optional): New name for the calendar. Leave blank to keep the current name.
- `slug` (`string`, optional): New URL slug for the calendar page, e.g. 'my-community' becomes lu.ma/my-community. Leave blank to keep the current slug.
- `tiktok_handle` (`string`, optional): TikTok handle or profile URL for the calendar, e.g. '@luma' or 'https://tiktok.com/@luma'. Leave blank to keep the current value; submit an empty string to remove it.
- `tint_color` (`string`, optional): New tint color for the calendar page, as a hex color code (e.g. '#E3CBEF'). Leave blank to keep the current color.
- `twitter_handle` (`string`, optional): X (Twitter) handle or profile URL for the calendar, e.g. '@luma' or 'https://x.com/luma'. Leave blank to keep the current value; submit an empty string to remove it.
- `website` (`string`, optional): Website URL shown on the calendar page. `https://` is added automatically if missing. Leave blank to keep the current website; submit an empty string to remove it.
- `youtube_handle` (`string`, optional): YouTube handle or channel URL for the calendar, e.g. '@luma' or 'https://youtube.com/@luma'. Leave blank to keep the current value; submit an empty string to remove it.

Example input: `{"calendar_id":"<calendar_id>"}`

### `luma_contact_block`

Block Contact · Write

Block a contact so they can no longer follow your Luma calendar or join its events.
Returns nothing on success; the contact stops receiving your invites and newsletters until you restore them.
Identify the contact with contact_id (from luma_contacts_list) or email — provide exactly one. Use luma_contact_restore to reverse this later, or luma_contact_remove to delete the contact instead of blocking them.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `contact_id` (`string`, optional): ID of the contact to block (the id from luma_contacts_list, usually starting with usr-). Provide this or email, not both.
- `email` (`string`, optional): Email address of the contact to block. Provide this or contact_id, not both.

Example input: `{}`

### `luma_contact_restore`

Restore Contact · Write

Restore a previously removed or blocked contact back to your calendar's active contacts.
Returns a success confirmation once the contact is reinstated and can receive invites and newsletters again.
Use this to undo luma_contact_remove or luma_contact_block.
Look up the contact's contact_id or email with luma_contacts_list first.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `contact_id` (`string`, optional): ID of the contact to restore, as returned by luma_contacts_list (usually starts with usr-). Provide this or email; at least one is required.
- `email` (`string`, optional): Email address of the contact to restore. Provide this or contact_id; at least one is required.

Example input: `{}`

### `luma_contact_tag_apply`

Apply Contact Tag · Write

Apply an existing contact tag to one or more calendar contacts by user ID or email.
Returns a success confirmation; only existing contacts are tagged, this will not create new contacts.
Use this to tag contacts you already have. Use luma_contact_tag_unapply to remove the tag instead.
Get the tag's ID or name from luma_contact_tags_list, and contact identifiers from luma_contacts_list.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `tag` (`string`, required): The tag to apply, identified by its ID (e.g. tag-abc123XYZ) or by its exact name (e.g. VIP).
- `emails` (`array`, optional): Email addresses of the contacts to tag. Provide this and/or user_ids.
- `user_ids` (`array`, optional): Contact IDs of the contacts to tag, as returned by luma_contacts_list (usually start with usr-). Provide this and/or emails.

Example input: `{"tag":"<tag>"}`

### `luma_contact_tag_create`

Create Contact Tag · Write

Create a new contact tag on your Luma calendar, optionally with a color.
Returns the created tag's ID, name, and color.
Use this before tagging contacts with luma_contact_tag_apply. Use luma_contact_tags_list first to check whether the tag already exists.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `name` (`string`, required): Display name for the new contact tag.
- `color` (`string`, optional): Color for the tag, shown in the Luma dashboard. One of cranberry, barney, red, green, blue, purple, yellow, or orange; omit or set to null to let Luma pick a default color. One of: `cranberry`, `barney`, `red`, `green`, `blue`, `purple`, `yellow`, `orange`.

Example input: `{"name":"<name>"}`

### `luma_contact_tag_unapply`

Unapply Contact Tag · Write

Remove an existing contact tag from one or more calendar contacts by user ID or email.
Returns a success confirmation; only existing contacts are affected.
Use this to untag contacts. Use luma_contact_tag_apply to add the tag instead.
Get the tag's ID or name from luma_contact_tags_list, and contact identifiers from luma_contacts_list.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `tag` (`string`, required): The tag to remove, identified by its ID (e.g. tag-abc123XYZ) or by its exact name (e.g. VIP).
- `emails` (`array`, optional): Email addresses of the contacts to untag. Provide this and/or user_ids.
- `user_ids` (`array`, optional): Contact IDs of the contacts to untag, as returned by luma_contacts_list (usually start with usr-). Provide this and/or emails.

Example input: `{"tag":"<tag>"}`

### `luma_contact_tag_update`

Update Contact Tag · Write

Update an existing contact tag's name or color.
Returns the updated tag's ID, name, and color.
Use this to rename or recolor a tag without changing which contacts it's applied to.
Get the tag_id from luma_contact_tags_list or from luma_contact_tag_create's response.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `tag_id` (`string`, required): ID of the contact tag to update, as returned by luma_contact_tags_list or luma_contact_tag_create (usually starts with tag-).
- `color` (`string`, optional): New color for the tag. One of cranberry, barney, red, green, blue, purple, yellow, or orange. Omit to leave the current color unchanged. One of: `cranberry`, `barney`, `red`, `green`, `blue`, `purple`, `yellow`, `orange`.
- `name` (`string`, optional): New display name for the tag. Omit to leave the current name unchanged.

Example input: `{"tag_id":"<tag_id>"}`

### `luma_contacts_import`

Import Contacts · Write

Import contacts into a Luma calendar so you can invite them to events or send them newsletters.
Returns nothing on success; imported contacts then appear in luma_contacts_list.
Provide an email and, optionally, a name for each contact — Luma won't overwrite a name that's already set. Apply tags to every imported contact in the same call.
Get tag IDs or names to pass in tags from luma_contact_tags_list.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `contacts` (`array`, required): The contacts to import, as an array of objects each with an email and, optionally, a name. Luma will not overwrite a contact's name once it has already been set. Example: [{"email": "person@example.com", "name": "Jamie Lee"}]
- `tags` (`array`, optional): Tag IDs or tag names, from luma_contact_tags_list, to apply to every contact in this import.

Example input: `{"contacts":[{"email":"person@example.com","name":"Jamie Lee"}]}`

### `luma_event_blast_create`

Create Event Blast · Write

Send an email blast to an event's guests, immediately or at a scheduled time.
Returns the created blast object, with status: scheduled until it goes out.
Blasts run in the background, count against the calendar's send limit, and can't be recalled once sent; sending is limited to 10 blasts per 5 minutes. Restrict recipients with recipient_groups, or omit it to reach every approved (going) guest.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `content_md` (`string`, required): The message body, written in markdown. Sent as the email's content.
- `event_id` (`string`, required): ID of the event whose guests will receive the blast, formatted as evt- followed by an alphanumeric string.
- `recipient_groups` (`array`, optional): Which guests receive the blast, as a list of recipient groups. Each group has a status of approved (going), checked_in, pending_approval, waitlist, or invited, and can optionally be limited to guests holding a specific ticket type (omit to include every ticket type for that status; can't be combined with invited, since invitees hold no tickets). Omit recipient_groups entirely to reach every approved (going) guest across all ticket types. Example: [{"status": "approved"}, {"status": "waitlist", "event_ticket_type_id": "ttype-abc123XYZ"}].
- `scheduled_for` (`string`, optional): When to send the blast, as a future ISO 8601 datetime (e.g. 2025-08-06T09:00:00Z). Omit to send immediately.
- `subject` (`string`, optional): Email subject line, up to 200 characters. If omitted, Luma uses the default: "New message in {event name}".

Example input: `{"content_md":"<content_md>","event_id":"<event_id>"}`

### `luma_event_blast_update`

Update Blast · Write

Update an existing Luma email blast, changing only the fields you pass.
Returns the updated blast's id, subject, message content, recipient groups, and schedule.
Use this to reschedule a blast that hasn't sent yet, or to edit its subject and message; after a blast has sent, only subject and content_md can still change. Use luma_event_blast_delete to remove a blast instead.
Requires an existing blast_id from luma_event_blast_create or luma_event_blasts_list.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `blast_id` (`string`, required): The unique ID of the blast to update, formatted as ep- followed by an alphanumeric string (e.g. ep-abc123XYZ). Get this value from a blast creation response or from luma_event_blasts_list.
- `content_md` (`string`, optional): New message body in Markdown, sent as the email content. On a blast that has already been sent, updating this only changes the post shown on the event page — it does not resend or edit the emails already delivered.
- `recipient_groups` (`array`, optional): New audience for the blast, as an array of recipient group objects. Only allowed for blasts that haven't been sent yet. Each object needs a status — one of approved (going to the event), checked_in, pending_approval, waitlist, or invited — and can optionally set event_ticket_type_id to reach only guests holding that specific ticket type; omit it to reach every ticket type, and don't combine it with the invited status, since invitees hold no tickets. Example: [{"status": "approved"}, {"status": "waitlist", "event_ticket_type_id": "tkt-abc123XYZ"}].
- `scheduled_for` (`string`, optional): New send time for an unsent blast, as an ISO 8601 datetime in the future (e.g. 2026-10-01T18:00:00Z). Only allowed for blasts that haven't been sent yet.
- `subject` (`string`, optional): New email subject line, up to 200 characters. Leave blank to use the default, "New message in {event name}".

Example input: `{"blast_id":"<blast_id>"}`

### `luma_event_cancel_request`

Request Event Cancellation · Write

Request a short-lived token to cancel a Luma event.
Returns a cancellation_token that expires in 15 minutes, whether the event has paid guests (is_paid), and its current approved guest_count.
Use this as the required first step before luma_event_cancel, which needs the token to actually cancel the event. Canceling is irreversible — it deletes the event, notifies every guest, and can trigger refunds.
Requires an existing event_id, such as one from luma_event_get.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `event_id` (`string`, required): The unique ID of the event to cancel, formatted as evt- followed by an alphanumeric string (e.g. evt-abc123XYZ).

Example input: `{"event_id":"<event_id>"}`

### `luma_event_coupon_create`

Create Event Coupon · Write

Create a coupon that guests can apply when registering for a specific Luma event.
Returns nothing on success — list the event's coupons afterward with luma_event_coupons_list to confirm.
Restrict the coupon to one ticket type with event_ticket_type_id; if that ticket type is hidden, this creates an unlock (access) code instead of a plain discount — pair it with a 0% discount to unlock the price unchanged. Use luma_calendar_coupon_create instead for a coupon valid across every event on a calendar.
Requires the event ID from luma_event_get. Coupon terms can't be edited after creation — use luma_event_coupon_update only to change remaining uses or the validity window.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `code` (`string`, required): The code guests enter on the event page to apply this coupon. Not case sensitive. Maximum 20 characters.
- `discount_type` (`string`, required): Which kind of discount this coupon applies: percent for a percentage off, or amount for a fixed amount off. Determines whether percent_off or cents_off/currency is used. One of: `percent`, `amount`.
- `event_id` (`string`, required): The Luma event this coupon applies to, formatted as evt- followed by an alphanumeric string (e.g. evt-abc123XYZ).
- `cents_off` (`number`, optional): Fixed amount off, in the smallest unit of currency (e.g. cents for usd). Required when discount_type is amount, and must be paired with currency.
- `currency` (`string`, optional): Currency the amount off (cents_off) is denominated in. Required when discount_type is amount. One of: `solana_sol`, `solana_usdc`, `aed`, `afn`, `all`, `amd`, `ang`, `aoa`, `ars`, `aud`, `awg`, `azn`, `bam`, `bbd`, `bdt`, `bgn`, `bhd`, `bif`, `bmd`, `bnd`, `bob`, `brl`, `bsd`, `bwp`, `byn`, `bzd`, `cad`, `cdf`, `chf`, `clp`, `cny`, `cop`, `crc`, `cve`, `czk`, `djf`, `dkk`, `dop`, `dzd`, `egp`, `etb`, `eur`, `fjd`, `fkp`, `gbp`, `gel`, `ghs`, `gip`, `gmd`, `gnf`, `gtq`, `gyd`, `hkd`, `hnl`, `htg`, `huf`, `idr`, `ils`, `inr`, `isk`, `jmd`, `jod`, `jpy`, `kes`, `kgs`, `khr`, `kmf`, `krw`, `kwd`, `kyd`, `kzt`, `lak`, `lbp`, `lkr`, `lrd`, `lsl`, `mad`, `mdl`, `mga`, `mkd`, `mmk`, `mnt`, `mop`, `mur`, `mvr`, `mwk`, `mxn`, `myr`, `mzn`, `nad`, `ngn`, `nio`, `nok`, `npr`, `nzd`, `omr`, `pab`, `pen`, `pgk`, `php`, `pkr`, `pln`, `pyg`, `qar`, `ron`, `rsd`, `rub`, `rwf`, `sar`, `sbd`, `scr`, `sek`, `sgd`, `shp`, `sle`, `sos`, `srd`, `std`, `szl`, `thb`, `tjs`, `tnd`, `top`, `try`, `ttd`, `twd`, `tzs`, `uah`, `ugx`, `usd`, `uyu`, `uzs`, `vnd`, `vuv`, `wst`, `xaf`, `xcd`, `xof`, `xpf`, `yer`, `zar`, `zmw`.
- `event_ticket_type_id` (`string`, optional): Restrict the coupon to a single ticket type, from luma_event_ticket_types_list. If that ticket type is hidden, the coupon becomes an unlock (access) code that reveals the ticket during registration instead of a plain discount.
- `percent_off` (`number`, optional): Percentage discount, from 0 to 100. Required when discount_type is percent; ignored otherwise. Use 0 together with event_ticket_type_id to create an unlock code that doesn't change the price.
- `remaining_count` (`integer`, optional): How many times the coupon can be redeemed in total. Set to 1000000 for effectively unlimited uses; leave blank to use Luma's default.
- `valid_end_at` (`string`, optional): ISO 8601 datetime the coupon expires. Leave blank for no end date.
- `valid_start_at` (`string`, optional): ISO 8601 datetime the coupon becomes valid from. Leave blank for no start restriction.

Example input: `{"code":"<code>","discount_type":"percent","event_id":"<event_id>"}`

### `luma_event_coupon_update`

Update Event Coupon · Write

Update the remaining uses or validity window of an existing coupon on a Luma event.
Returns nothing on success.
Use this only to change remaining_count, valid_start_at, or valid_end_at — the coupon's code and discount terms can't be edited after creation. Use luma_event_coupon_create to make a new coupon instead, or luma_event_coupons_list to find the coupon's current code.
Requires the event ID and the coupon's code, from when it was created with luma_event_coupon_create or from luma_event_coupons_list.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `code` (`string`, required): The coupon code to update, exactly as guests enter it (not case sensitive).
- `event_id` (`string`, required): The Luma event the coupon belongs to, formatted as evt- followed by an alphanumeric string (e.g. evt-abc123XYZ).
- `remaining_count` (`integer`, optional): New total number of redemptions allowed. Set to 1000000 for effectively unlimited. Leave blank to keep the current value.
- `valid_end_at` (`string`, optional): New ISO 8601 datetime the coupon expires. Leave blank to keep the current value.
- `valid_start_at` (`string`, optional): New ISO 8601 datetime the coupon becomes valid from. Leave blank to keep the current value.

Example input: `{"code":"<code>","event_id":"<event_id>"}`

### `luma_event_create`

Create Event · Write

Create a new event on the connected Luma calendar.
Returns the created event's full details, including its new event id, slug, and URL.
Use this to publish a new event from scratch. Use luma_event_update to change an existing event instead, or luma_event_get to look up an event you already created.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `name` (`string`, required): The event's name/title, shown at the top of the event page.
- `start_at` (`string`, required): Event start time as an ISO 8601 datetime, e.g. 2022-10-19T03:27:13.673Z.
- `timezone` (`string`, required): IANA timezone the event is displayed in, e.g. America/New_York. See https://en.wikipedia.org/wiki/List_of_tz_database_time_zones for valid values.
- `can_register_for_multiple_tickets` (`boolean`, optional): Whether a guest can register for multiple tickets in one registration (Group Registration). When true, each ticket counts toward max_capacity.
- `confirmation_email_md` (`string`, optional): Your added message in the confirmation email sent when a registration is confirmed, including when you approve a guest. Supports Markdown. Leave this field out to use the default message, or pass an empty string to remove your message (guests still get the standard email).
- `cover_url` (`string`, optional): Cover image URL for the event page. Must be an image already uploaded to the Luma CDN (URLs under https://images.lumacdn.com/...) — get one from /v1/images/create-upload-url, or pick one from Luma's cover gallery with /v1/images/search.
- `declined_email_md` (`string`, optional): Your added message in the email sent when you decline a guest's registration. Supports Markdown. Leave this field out to use the default message, or pass an empty string to remove your message (guests still get the standard email).
- `description_md` (`string`, optional): The event's description, formatted with Markdown. For images, upload to the Luma CDN via /v1/images/create-upload-url first and reference the returned file_url with > Image: alt; image URLs must be hosted on images.lumacdn.com. Put a YouTube, Vimeo, or Loom URL on its own line to embed that video.
- `end_at` (`string`, optional): Event end time as an ISO 8601 datetime, e.g. 2022-10-19T03:27:13.673Z. Leave blank to leave the end time unset.
- `feedback_email` (`object`, optional): Settings for the post-event feedback email sent to guests, as a JSON object with an enabled flag and an optional delay (an ISO 8601 duration, default PT0M/immediately, maximum P30D; a negative duration like -PT30M sends it before the event ends, at most P1D early and never before the event starts). If not specified, the event inherits the calendar's default. Example: {"enabled": true, "delay": "P1D"}.
- `font` (`string`, optional): Font used for the event name and headings. Setting a theme without a font applies that theme's default font. Pass null to clear the font and use the standard font. Retired fonts are no longer accepted here and existing pages using one fall back to the standard font. One of: `alternate`, `alverata`, `avant-garde`, `beaufort`, `blithe`, `caslon`, `degular`, `departure`, `factoria`, `futura`, `garamond`, `geist-mono`, `google`, `ivy-mode`, `ivy-presto`, `museo`, `neuzeit`, `new-spirit`, `poster`, `roc-grotesk`, `season`, `snpro`, `strenuous`, `pearl`.
- `geo_address_json` (`object`, optional): In-person location for the event, as a JSON object. Use {"type": "manual", "address": "<free text>"} to store an address as-is, {"type": "google", "place_id": ""} to resolve a Google Maps place, or {"type": "lookup", "query": "<search text>"} to search Google Maps and use the top result. Leave out for online events, and don't combine with meeting_url. Example: {"type": "manual", "address": "123 Main St, San Francisco, CA"}.
- `location_visibility` (`string`, optional): Set to guests-only to hide the precise location from people who haven't been approved yet — they'll only see the city and approximate area. Defaults to public. One of: `public`, `guests-only`.
- `max_capacity` (`number`, optional): Maximum number of registrations. Once reached, the event is marked sold out and registration closes automatically — unless the event has a waitlist enabled (waitlist_status), in which case new registrations join the waitlist instead. If can_register_for_multiple_tickets is true, each ticket counts toward this cap.
- `meeting_url` (`string`, optional): Join link for an online event (Zoom, Google Meet, etc.). Can't be combined with geo_address_json.
- `name_requirement` (`string`, optional): How to collect guest names: full-name uses a single field; first-last uses separate first and last name fields. Enabling first-last requires Luma Plus on the event's calendar. One of: `full-name`, `first-last`.
- `pending_approval_email_md` (`string`, optional): Your added message in the email sent to guests awaiting approval or on the waitlist. Supports Markdown. Leave this field out to use the default message, or pass an empty string to remove your message (guests still get the standard email).
- `phone_number_requirement` (`string`, optional): Whether guests must provide a phone number when registering: optional or required. Leave blank to not collect it. One of: `optional`, `required`.
- `registration_open` (`boolean`, optional): Whether to accept registrations. Set to false to close registration so new guests can't sign up. Defaults to true.
- `registration_questions` (`array`, optional): Custom questions asked at registration, as an array of question objects. Each question needs an id, a label, whether it's required, and a question_type (agree-check, company, github, instagram, linkedin, phone-number, select, telegram, text, twitter, url, youtube, or terms). select questions also need an options array; text questions may set multiline; terms questions need a nested terms object describing the agreement text or a link to it. Example: [{"id": "q1", "label": "What's your role?", "required": true, "question_type": "text"}].
- `reminders_disabled` (`boolean`, optional): By default, Luma sends reminder emails before the event. Set to true to turn these off if you'd like more control over event communications.
- `show_guest_list` (`boolean`, optional): When the guest list is shown, approved guests can see who else is going to the event.
- `slug` (`string`, optional): URL slug for the event, 3-50 characters. If the slug is aloha, the event's URL is https://luma.com/aloha. Event creation fails if the slug is already taken — check availability first with /v1/entities/lookup.
- `theme` (`string`, optional): Visual theme applied to the event page. Retired themes are no longer accepted here and existing pages using one fall back to standard. Setting a theme also applies its default font unless font is set separately. One of: `standard`, `cross`, `diamond`, `falling-leaves`, `fireworks`, `floral`, `grain-dark`, `grain-light`, `grid`, `bats`, `holiday-diwali`, `holiday-foliage`, `holiday-hanukkah`, `holiday-pie`, `holiday-santa`, `holiday-sweater`, `holiday-turkey`, `hypnotic`, `celebrate-dark`, `celebrate-light`, `clouds`, `impressionist`, `starry`, `aurora`, `rain-dark`, `rain-light`, `arcade`, `seaside-dark`, `seaside-light`, `life`, `matrix`, `particles-bokeh`, `particles-champagne`, `plus`, `iridescent-dark`, `iridescent-light`, `polkadot`, `pool-dark`, `pool-light`, `snake`, `blocks`, `snow-dark`, `snow-light`, `space-war`, `sunny-shades`, `tamagotchi`, `warp`, `wave`, `zigzag`.
- `ticket_types` (`array`, optional): Ticket types to create the event with, as an array of ticket type objects. When provided, these replace the default ticket and the event is created with exactly these types. When omitted, the event gets a single free ticket named Standard. Each ticket type needs a name and a type of free or paid; paid types also need cents (price in the currency's minor unit) and currency (an ISO 4217 code like usd), and require the calendar to have a connected Stripe account. Optional fields include description, require_approval, is_hidden, max_capacity, valid_start_at/valid_end_at, and pay-what-you-want pricing via is_flexible/min_cents. To change ticket types after creation, use the ticket type endpoints instead. Example: [{"name": "Standard", "type": "free"}].
- `tint_color` (`string`, optional): Accent color for the event page, as a 3 or 6-digit hex code like #bb2dc7. The shade is adjusted as needed so text and buttons stay accessible against the background.
- `visibility` (`string`, optional): Who can see the event page: public (anyone), members-only (only calendar members), or private (only people with the link). One of: `public`, `members-only`, `private`.
- `waitlist_status` (`string`, optional): Set to enabled to give the event a waitlist: once max_capacity is reached, new registrations join the waitlist instead of being turned away. One of: `disabled`, `enabled`.

Example input: `{"name":"<name>","start_at":"<start_at>","timezone":"<timezone>"}`

### `luma_event_guest_status_update`

Update Guest Status · Write

Update a guest's registration status on a Luma event — approve them ("Going"), decline them, move them back to pending approval, or place them on the waitlist.
Returns the guest's updated registration details.
Use this when you already know the guest's status. To send a soft invite that guests can accept themselves, use luma_event_guests_send_invites instead. Use luma_event_guest_tickets_update to add or remove tickets rather than change status.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `event_id` (`string`, required): The unique ID of the Luma event the guest belongs to, formatted as evt- followed by an alphanumeric string.
- `guest_id` (`string`, required): Identifier for the guest whose status you're changing. Accepts a guest ID (starting with gst-), a ticket key, a guest key (starting with g-), or the guest's email address.
- `status` (`string`, required): The new status for the guest's registration. approved means the guest is confirmed as "Going". Use declined to reject their registration, pending_approval to move them back to review, or waitlist to place them on the waitlist. One of: `approved`, `declined`, `pending_approval`, `waitlist`.
- `message` (`string`, optional): A personal note included in the email sent to the guest about the status change. Maximum of 200 characters. Can't be combined with send_email set to false.
- `send_email` (`boolean`, optional): Whether Luma should email the guest about this status change. Defaults to true. Set to false if your own integration sends its own notifications.
- `should_refund` (`boolean`, optional): If you're moving a guest who already paid to declined, waitlist, or pending_approval, whether to refund their payment. Defaults to false.

Example input: `{"event_id":"<event_id>","guest_id":"<guest_id>","status":"approved"}`

### `luma_event_guest_tickets_update`

Update Guest Tickets · Write

Add or remove tickets on an existing guest's registration for a Luma event. This is an administrative operation: added tickets are complimentary and removed tickets are simply invalidated — no payment or refund is processed, and administrative changes can exceed event or ticket-type capacity.
Returns the guest's updated registration and ticket details.
Use this to grant a guest extra complimentary tickets or invalidate ones they hold. You can't change tickets for a guest with a pending payment hold. Use luma_event_guest_status_update to change a guest's approval status instead.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `event_id` (`string`, required): The unique ID of the Luma event the guest belongs to, formatted as evt- followed by an alphanumeric string.
- `guest_id` (`string`, required): Identifier for the guest whose tickets you're changing. Accepts a guest ID (starting with gst-), a ticket key, a guest key (starting with g-), or the guest's email address.
- `send_email` (`boolean`, optional): Whether Luma may email the guest about this ticket change. Defaults to true and still respects the guest's notification preferences. This only controls email — the guest still gets an in-app notification, and push follows their own preferences.
- `ticket_ids_to_remove` (`array`, optional): Existing ticket IDs to invalidate (each usually starts with tkt-). Removing a ticket does not issue a refund, and at least one valid ticket must remain on the guest afterward. Leave empty to not remove any tickets.
- `tickets_to_add` (`array`, optional): Complimentary tickets to grant the guest, as an array of objects each naming an event_ticket_type_id. Each entry creates a new $0 administrative ticket, even if that ticket type is normally paid. Leave empty to not add any tickets. Example: [{"event_ticket_type_id": "ttype-abc123XYZ"}].

Example input: `{"event_id":"<event_id>","guest_id":"<guest_id>"}`

### `luma_event_guests_add`

Add Guests · Write

Add one or more guests to a Luma event, optionally assigning custom tickets, an approval status, and answers to registration questions.
Returns the list of guests that will be skipped because they unsubscribed, were removed, or blocked you; everyone else is added in the background without an individual per-guest result.
Use this to register guests directly with a status you choose upfront. Use luma_event_guests_send_invites to send a soft invite the guest must accept instead, or luma_event_guest_status_update to change an existing guest's status.
Get event_ticket_type_id values from luma_event_ticket_types_list, and registration question IDs from the registration_questions field of luma_event_get.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `event_id` (`string`, required): The Luma event to add guests to, formatted as evt- followed by an alphanumeric string (e.g. evt-abc123XYZ). Get this from luma_event_get, a calendar events list, or event lookup.
- `guests` (`array`, required): The guests to add, as an array of objects each with an email and, optionally, a name and registration_answers. Luma will not overwrite a guest's name if one is already on file. Example: [{"email": "guest@example.com", "name": "Jamie Lee", "registration_answers": [{"question_id": "reg-abc123", "value": "Vegetarian"}]}]
- `approval_status` (`string`, optional): Status to assign to each added guest: approved (Going), pending_approval (host review needed), or waitlist. Defaults to approved. One of: `approved`, `pending_approval`, `waitlist`. Default: `approved`.
- `send_email` (`boolean`, optional): Whether Luma emails each added guest their confirmation. Defaults to true; set to false if your integration sends its own notification. Default: `true`.
- `ticket` (`object`, optional): Assign one ticket of this type to every guest in the request. Get valid IDs from luma_event_ticket_types_list. Cannot be combined with tickets. Example: {"event_ticket_type_id": "ticket-abc123"}
- `tickets` (`array`, optional): Assign multiple tickets to every guest, one entry per ticket. Cannot be combined with ticket. Example: [{"event_ticket_type_id": "ticket-abc123"}, {"event_ticket_type_id": "ticket-def456"}]

Example input: `{"event_id":"<event_id>","guests":[{"email":"guest@example.com","name":"Jamie Chen"}]}`

### `luma_event_guests_send_invites`

Send Invites · Write

Send guests an invite to a Luma event by email (and SMS, if their phone number is linked to their Luma account). Invites are sent as a soft invite guests can accept themselves, and are processed in the background.
Returns the list of guests that will be skipped — for example because they unsubscribed from the calendar, were removed by an admin, or blocked the host.
Use this to invite people who haven't registered yet. Use luma_event_guest_status_update to directly approve or add a guest without sending an invite first.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `event_id` (`string`, required): The unique ID of the Luma event to send invites for, formatted as evt- followed by an alphanumeric string.
- `guests` (`array`, required): The guests to invite, as an array of objects each with an email and an optional name. If a person already has a name on their Luma account, the name given here will not overwrite it. Example: [{"email": "guest@example.com", "name": "Jamie Chen"}].
- `message` (`string`, optional): A personal message included in the invite. Maximum of 200 characters.

Example input: `{"event_id":"<event_id>","guests":[{"email":"guest@example.com","name":"Jamie Chen"}]}`

### `luma_event_host_add`

Add Host · Write

Add a host — a manager or check-in staff member — to a Luma event, identified by email.
Returns nothing on success; the host then appears on the event's host list with the chosen access level.
Use access_level to choose manager (full event management) or check-in (check-in only, never shown publicly) permissions. Use luma_event_host_update to change an existing host's access or visibility, or luma_event_host_remove to remove one.
Requires the event ID from luma_event_get.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `email` (`string`, required): Email address of the person to add as a host on this event.
- `event_id` (`string`, required): The Luma event to add the host to, formatted as evt- followed by an alphanumeric string (e.g. evt-abc123XYZ). Get this from luma_event_get.
- `access_level` (`string`, optional): Permission level for the new host: none, check-in (check-in staff only), or manager (full access). Defaults to manager. One of: `none`, `check-in`, `manager`. Default: `manager`.
- `is_visible` (`boolean`, optional): Whether the host is shown publicly on the event page. Defaults to true. check-in hosts are never shown on the page — passing true here together with access_level check-in is rejected by Luma. Default: `true`.
- `name` (`string`, optional): Name to display for this host if they don't already have a Luma profile. Ignored if they already have one.

Example input: `{"email":"<email>","event_id":"<event_id>"}`

### `luma_event_host_remove`

Remove Host · Write

Remove a host from a Luma event by email.
Returns nothing on success; the host no longer appears on the event's host list or has management access.
Use this once a host no longer needs manager or check-in access. Use luma_event_host_add to add them back later, or luma_event_host_update to change their access instead of removing them. The event creator cannot be removed.
Requires the event ID and the host's email, both known from when the host was added with luma_event_host_add.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `email` (`string`, required): Email of the host to remove, exactly as it was added.
- `event_id` (`string`, required): The Luma event to remove the host from, formatted as evt- followed by an alphanumeric string (e.g. evt-abc123XYZ).

Example input: `{"email":"<email>","event_id":"<event_id>"}`

### `luma_event_host_update`

Update Host · Write

Update an existing host's access level or visibility on a Luma event.
Returns nothing on success; the change takes effect immediately.
Use this to move a host between manager and check-in access, or to show or hide them on the event page. Use luma_event_host_add to add a new host instead, or luma_event_host_remove to remove one. The event creator's access level cannot be changed.
Requires the event ID and the host's email, both known from when the host was added with luma_event_host_add.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `email` (`string`, required): Email of the host to update, exactly as it was added.
- `event_id` (`string`, required): The Luma event the host belongs to, formatted as evt- followed by an alphanumeric string (e.g. evt-abc123XYZ).
- `access_level` (`string`, optional): New access level for the host: none, check-in, or manager. Omit to leave the current access level unchanged. The event creator's access level cannot be changed. One of: `none`, `check-in`, `manager`.
- `is_visible` (`boolean`, optional): Whether the host should be shown publicly on the event page. Omit to leave unchanged. check-in hosts are never shown — changing a host to check-in hides them, and passing true together with check-in is rejected.

Example input: `{"email":"<email>","event_id":"<event_id>"}`

### `luma_event_tag_apply`

Apply Event Tag · Write

Apply a tag to one or more events on your Luma calendar.
Returns applied_count and skipped_count, showing how many events were tagged versus skipped because they aren't on this calendar.
Use luma_event_tag_unapply to remove a tag from events instead.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `event_ids` (`array`, required): Array of Luma event IDs to apply the tag to. Each ID is formatted as evt- followed by an alphanumeric string. Example: ["evt-abc123XYZ", "evt-def456UVW"].
- `tag` (`string`, required): The tag to apply, given as either its tag ID (e.g. tag-123) or its tag name.

Example input: `{"event_ids":["evt-abc123XYZ","evt-def456UVW"],"tag":"<tag>"}`

### `luma_event_tag_create`

Create Event Tag · Write

Create a new event tag on your Luma calendar, optionally with a color.
Returns the created tag's ID, name, and color.
Use this before tagging events with luma_event_tag_apply. Use luma_event_tags_list first to check whether the tag already exists.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `name` (`string`, required): Display name for the new event tag.
- `color` (`string`, optional): Color for the tag, shown in the Luma dashboard. One of cranberry, barney, red, green, blue, purple, yellow, or orange; omit or set to null to let Luma pick a default color. One of: `cranberry`, `barney`, `red`, `green`, `blue`, `purple`, `yellow`, `orange`.

Example input: `{"name":"<name>"}`

### `luma_event_tag_unapply`

Unapply Event Tag · Write

Remove a tag from one or more events on your Luma calendar.
Returns removed_count and skipped_count, showing how many events had the tag removed versus skipped because they aren't on this calendar.
Use luma_event_tag_apply to add a tag to events instead.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `event_ids` (`array`, required): Array of Luma event IDs to remove the tag from. Each ID is formatted as evt- followed by an alphanumeric string. Example: ["evt-abc123XYZ", "evt-def456UVW"].
- `tag` (`string`, required): The tag to remove, given as either its tag ID (e.g. tag-123) or its tag name.

Example input: `{"event_ids":["evt-abc123XYZ","evt-def456UVW"],"tag":"<tag>"}`

### `luma_event_tag_update`

Update Event Tag · Write

Update an existing event tag's name or color.
Returns the updated tag's ID, name, and color.
Use this to rename or recolor a tag without changing which events it's applied to.
Get the tag_id from luma_event_tags_list or from luma_event_tag_create's response.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `tag_id` (`string`, required): ID of the event tag to update, as returned by luma_event_tags_list or luma_event_tag_create (usually starts with tag-).
- `color` (`string`, optional): New color for the tag. One of cranberry, barney, red, green, blue, purple, yellow, or orange. Omit to leave the current color unchanged. One of: `cranberry`, `barney`, `red`, `green`, `blue`, `purple`, `yellow`, `orange`.
- `name` (`string`, optional): New display name for the tag. Omit to leave the current name unchanged.

Example input: `{"tag_id":"<tag_id>"}`

### `luma_event_ticket_type_create`

Create Ticket Type · Write

Create a new ticket type for a Luma event, either free or paid.
Returns the created ticket type object, including its id, name, price, and capacity settings.
Paid ticket types (type: paid) require cents and currency to be set, and require the calendar to have a connected Stripe account. Use luma_event_ticket_type_update to change an existing ticket type, or luma_event_ticket_type_delete to remove one.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `event_id` (`string`, required): ID of the event to create the ticket type for, formatted as evt- followed by an alphanumeric string.
- `name` (`string`, required): Name of the ticket type, shown to guests during registration. 1 to 30 characters.
- `type` (`string`, required): Whether the ticket type is free or paid. Paid ticket types require cents and currency, and require the calendar to have a connected Stripe account. One of: `free`, `paid`.
- `cents` (`integer`, optional): Price in the currency's minor unit (e.g. 2500 for $25.00). Required when type is paid; ignored for free ticket types.
- `currency` (`string`, optional): ISO 4217 currency code, lowercase (e.g. usd). Required when type is paid; ignored for free ticket types.
- `description` (`string`, optional): Description of the ticket type shown to guests during registration. Up to 1000 characters.
- `is_flexible` (`boolean`, optional): Pay-what-you-want pricing: if true, guests choose their own amount (at least min_cents) instead of a fixed price. Only meaningful for paid ticket types.
- `is_hidden` (`boolean`, optional): If true, hides this ticket type from the public registration page. Guests who already have a ticket of this type keep access.
- `max_capacity` (`number`, optional): Maximum number of tickets of this type that can be sold. Omit for unlimited capacity.
- `min_cents` (`integer`, optional): Minimum amount guests must pay when is_flexible is true, in the currency's minor unit (e.g. 1000 for $10.00).
- `require_approval` (`boolean`, optional): If true, guests registering with this ticket type must be manually approved before their registration is confirmed. If omitted, Luma's default (no approval required) applies.
- `valid_end_at` (`string`, optional): When this ticket type stops being available for purchase, as an ISO 8601 datetime (e.g. 2025-08-06T09:00:00Z) or date (e.g. 2025-08-06). Omit for no end restriction.
- `valid_start_at` (`string`, optional): When this ticket type becomes available for purchase, as an ISO 8601 datetime (e.g. 2025-08-06T09:00:00Z) or date (e.g. 2025-08-06). Omit for no start restriction.

Example input: `{"event_id":"<event_id>","name":"<name>","type":"free"}`

### `luma_event_ticket_type_update`

Update Ticket Type · Write

Update an existing ticket type's configuration on a Luma event.
Returns the updated ticket type object.
Only include the fields you want to change; omitted fields keep their current value. Use luma_event_ticket_type_create to add a new ticket type instead, or luma_event_ticket_type_delete to remove one.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `event_ticket_type_id` (`string`, required): ID of the ticket type to update, formatted as ttype- followed by an alphanumeric string.
- `cents` (`integer`, optional): Price in the currency's minor unit (e.g. 2500 for $25.00). Used when type is paid; ignored for free ticket types. Omit to leave unchanged.
- `currency` (`string`, optional): ISO 4217 currency code, lowercase (e.g. usd). Used when type is paid; ignored for free ticket types. Omit to leave unchanged.
- `description` (`string`, optional): Description of the ticket type shown to guests during registration. Up to 1000 characters. Omit to leave unchanged.
- `is_flexible` (`boolean`, optional): Pay-what-you-want pricing: if true, guests choose their own amount (at least min_cents) instead of a fixed price. Only meaningful for paid ticket types. Omit to leave unchanged.
- `is_hidden` (`boolean`, optional): If true, hides this ticket type from the public registration page. Guests who already have a ticket of this type keep access. Omit to leave unchanged.
- `max_capacity` (`number`, optional): Maximum number of tickets of this type that can be sold. Omit to leave unchanged.
- `min_cents` (`integer`, optional): Minimum amount guests must pay when is_flexible is true, in the currency's minor unit (e.g. 1000 for $10.00). Omit to leave unchanged.
- `name` (`string`, optional): Name of the ticket type, shown to guests during registration. 1 to 30 characters. Omit to leave unchanged.
- `require_approval` (`boolean`, optional): If true, guests registering with this ticket type must be manually approved before their registration is confirmed. Omit to leave unchanged.
- `type` (`string`, optional): Whether the ticket type is free or paid. Paid ticket types require cents and currency, and require the calendar to have a connected Stripe account. Omit to leave unchanged. One of: `free`, `paid`.
- `valid_end_at` (`string`, optional): When this ticket type stops being available for purchase, as an ISO 8601 datetime (e.g. 2025-08-06T09:00:00Z) or date (e.g. 2025-08-06). Omit to leave unchanged.
- `valid_start_at` (`string`, optional): When this ticket type becomes available for purchase, as an ISO 8601 datetime (e.g. 2025-08-06T09:00:00Z) or date (e.g. 2025-08-06). Omit to leave unchanged.

Example input: `{"event_ticket_type_id":"<event_ticket_type_id>"}`

### `luma_event_update`

Update Event · Write

Update an existing event on the connected Luma calendar. Only the fields you provide are changed; everything else is left as-is.
Returns the updated event's full details.
Use this to change an event's name, time, location, or settings. Use luma_event_create to make a new event instead, or luma_event_get to look up an event's current details before updating it.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `event_id` (`string`, required): The unique ID of the Luma event to update, formatted as evt- followed by an alphanumeric string.
- `can_register_for_multiple_tickets` (`boolean`, optional): Whether a guest can register for multiple tickets in one registration (Group Registration). When true, each ticket counts toward max_capacity. Leave blank to keep the current setting.
- `confirmation_email_md` (`string`, optional): Your added message in the confirmation email sent when a registration is confirmed, including when you approve a guest. Supports Markdown. Leave this field out to keep the current message, or pass an empty string to remove your message (guests still get the standard email).
- `cover_url` (`string`, optional): Cover image URL for the event page. Must be an image already uploaded to the Luma CDN (URLs under https://images.lumacdn.com/...). Leave blank to keep the current cover.
- `declined_email_md` (`string`, optional): Your added message in the email sent when you decline a guest's registration. Supports Markdown. Leave this field out to keep the current message, or pass an empty string to remove your message (guests still get the standard email).
- `description_md` (`string`, optional): The event's description, formatted with Markdown. For images, upload to the Luma CDN via /v1/images/create-upload-url first and reference the returned file_url with > Image: alt; image URLs must be hosted on images.lumacdn.com. Put a YouTube, Vimeo, or Loom URL on its own line to embed that video. Leave blank to keep the current description.
- `end_at` (`string`, optional): Event end time as an ISO 8601 datetime, e.g. 2022-10-19T03:27:13.673Z. Leave blank to keep the current end time.
- `feedback_email` (`object`, optional): Settings for the post-event feedback email sent to guests, as a JSON object with an enabled flag and an optional delay (an ISO 8601 duration, default PT0M/immediately, maximum P30D; a negative duration like -PT30M sends it before the event ends, at most P1D early and never before the event starts). Leave blank to keep the current setting. Example: {"enabled": true, "delay": "P1D"}.
- `font` (`string`, optional): Font used for the event name and headings. Pass null to clear the font and use the standard font. Retired fonts are no longer accepted here and existing pages using one fall back to the standard font. Leave the field out to keep the current font. One of: `alternate`, `alverata`, `avant-garde`, `beaufort`, `blithe`, `caslon`, `degular`, `departure`, `factoria`, `futura`, `garamond`, `geist-mono`, `google`, `ivy-mode`, `ivy-presto`, `museo`, `neuzeit`, `new-spirit`, `poster`, `roc-grotesk`, `season`, `snpro`, `strenuous`, `pearl`.
- `geo_address_json` (`object`, optional): In-person location for the event, as a JSON object. Use {"type": "manual", "address": "<free text>"} to store an address as-is, {"type": "google", "place_id": ""} to resolve a Google Maps place, or {"type": "lookup", "query": "<search text>"} to search Google Maps and use the top result. Don't combine with meeting_url. Leave blank to keep the current location. Example: {"type": "manual", "address": "123 Main St, San Francisco, CA"}.
- `location_visibility` (`string`, optional): Set to guests-only to hide the precise location from people who haven't been approved yet — they'll only see the city and approximate area. Leave blank to keep the current setting. One of: `public`, `guests-only`.
- `max_capacity` (`number`, optional): Maximum number of registrations. Once reached, the event is marked sold out and registration closes automatically — unless the event has a waitlist enabled (waitlist_status), in which case new registrations join the waitlist instead. Leave blank to keep the current cap.
- `meeting_url` (`string`, optional): Join link for an online event (Zoom, Google Meet, etc.). Can't be combined with geo_address_json. Leave blank to keep the current value.
- `name` (`string`, optional): The event's name/title, shown at the top of the event page. Leave blank to keep the current name.
- `name_requirement` (`string`, optional): How to collect guest names: full-name uses a single field; first-last uses separate first and last name fields. Enabling first-last requires Luma Plus on the event's calendar. Leave blank to keep the current setting. One of: `full-name`, `first-last`.
- `pending_approval_email_md` (`string`, optional): Your added message in the email sent to guests awaiting approval or on the waitlist. Supports Markdown. Leave this field out to keep the current message, or pass an empty string to remove your message (guests still get the standard email).
- `phone_number_requirement` (`string`, optional): Whether guests must provide a phone number when registering: optional or required. Leave blank to keep the current setting. One of: `optional`, `required`.
- `registration_open` (`boolean`, optional): Whether to accept registrations. Set to false to close registration so new guests can't sign up. Leave blank to keep the current setting.
- `registration_questions` (`array`, optional): Custom questions asked at registration, as an array of question objects. Each question needs an id, a label, whether it's required, and a question_type (agree-check, company, github, instagram, linkedin, phone-number, select, telegram, text, twitter, url, youtube, or terms). select questions also need an options array; text questions may set multiline; terms questions need a nested terms object describing the agreement text or a link to it. Leave blank to keep the current questions. Example: [{"id": "q1", "label": "What's your role?", "required": true, "question_type": "text"}].
- `reminders_disabled` (`boolean`, optional): By default, Luma sends reminder emails before the event. Set to true to turn these off if you'd like more control over event communications. Leave blank to keep the current setting.
- `show_guest_list` (`boolean`, optional): When the guest list is shown, approved guests can see who else is going to the event. Leave blank to keep the current setting.
- `slug` (`string`, optional): URL slug for the event, 3-50 characters. If the slug is aloha, the event's URL is https://luma.com/aloha. The update fails if the slug is already taken. Leave blank to keep the current slug.
- `start_at` (`string`, optional): Event start time as an ISO 8601 datetime, e.g. 2022-10-19T03:27:13.673Z. Leave blank to keep the current start time.
- `suppress_email` (`boolean`, optional): If true, Luma will not email guests when this update changes the event's name, time, or location. Guests still get a push notification for a changed time or location.
- `tax_config` (`object`, optional): Tax added on top of ticket prices for this event only, overriding the calendar's tax setting. Only affects new purchases and requires Luma Pro on the event's calendar. Pass an object with a tax_percent (number) and a tax_name (2-30 characters), or null to go back to the calendar's own tax setting. Example: {"tax_percent": 8.5, "tax_name": "Sales Tax"}.
- `theme` (`string`, optional): Visual theme applied to the event page. Retired themes are no longer accepted here and existing pages using one fall back to standard. Setting a theme also applies its default font unless font is set separately. Leave blank to keep the current theme. One of: `standard`, `cross`, `diamond`, `falling-leaves`, `fireworks`, `floral`, `grain-dark`, `grain-light`, `grid`, `bats`, `holiday-diwali`, `holiday-foliage`, `holiday-hanukkah`, `holiday-pie`, `holiday-santa`, `holiday-sweater`, `holiday-turkey`, `hypnotic`, `celebrate-dark`, `celebrate-light`, `clouds`, `impressionist`, `starry`, `aurora`, `rain-dark`, `rain-light`, `arcade`, `seaside-dark`, `seaside-light`, `life`, `matrix`, `particles-bokeh`, `particles-champagne`, `plus`, `iridescent-dark`, `iridescent-light`, `polkadot`, `pool-dark`, `pool-light`, `snake`, `blocks`, `snow-dark`, `snow-light`, `space-war`, `sunny-shades`, `tamagotchi`, `warp`, `wave`, `zigzag`.
- `timezone` (`string`, optional): IANA timezone the event is displayed in, e.g. America/New_York. Leave blank to keep the current timezone.
- `tint_color` (`string`, optional): Accent color for the event page, as a 3 or 6-digit hex code like #bb2dc7. Leave blank to keep the current color.
- `visibility` (`string`, optional): Who can see the event page: public (anyone), members-only (only calendar members), or private (only people with the link). Leave blank to keep the current setting. One of: `public`, `members-only`, `private`.
- `waitlist_status` (`string`, optional): Set to enabled to give the event a waitlist: once max_capacity is reached, new registrations join the waitlist instead of being turned away. Leave blank to keep the current setting. One of: `disabled`, `enabled`.

Example input: `{"event_id":"<event_id>"}`

### `luma_image_upload_url_create`

Create Image Upload URL · Write

Mint a pre-signed URL for uploading an image to Luma's asset storage.
Returns upload_url (a URL to PUT your image bytes to) and file_url (the resulting public URL, which you can then reference in other Luma API calls, e.g. as an event's cover image).
Use this before any call that needs an image URL: first upload your image bytes to upload_url via a separate PUT request, then pass file_url to that call.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `content_type` (`string`, optional): MIME type of the image you plan to upload: image/jpeg or image/png. If omitted, Luma infers the type from the uploaded bytes. One of: `image/jpeg`, `image/png`.

Example input: `{}`

### `luma_membership_member_add`

Add Member to Tier · Write

Add a person to a Luma membership tier by email.
Returns the new membership's ID and status (approved, pending, approved-pending-payment, or declined).
Use this to enroll someone directly through the API instead of having them sign up on the calendar page; set skip_payment for paid tiers you are billing externally. Use luma_membership_member_status_update afterward to approve or decline a pending member.
Requires an existing membership_tier_id from luma_membership_tiers_list.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `email` (`string`, required): Email address of the person to add as a member. If no Luma account exists for this email, one may be created for them.
- `membership_tier_id` (`string`, required): The ID of the membership tier to add this person to. Get this value from luma_membership_tiers_list.
- `registration_answers` (`array`, optional): Answers to the tier's custom registration questions, needed only if the tier has any. Provide an array of answer objects — each needs question_id and label matching one of the tier's registration_questions (from luma_membership_tiers_list), a question_type that matches that question (e.g. agree-check, company, phone-number, select, terms, url, or a social-handle type like linkedin/twitter/github), and a value shaped for that type: true/false for agree-check and terms questions, a {"company", "job_title"} object for company questions, a plain string for phone-number/url/text/social questions, a single string for a single-select question, or an array of strings for a multi-select question (also set multiple to true). Example: [{"question_id": "reg-abc123", "label": "Company", "question_type": "company", "value": {"company": "Acme Inc", "job_title": "Engineer"}}].
- `skip_payment` (`boolean`, optional): Set to true for paid tiers when you are handling payment externally (outside of Luma), so no charge is attempted through Luma. Required for paid tiers unless you want Luma to attempt payment collection.

Example input: `{"email":"<email>","membership_tier_id":"<membership_tier_id>"}`

### `luma_membership_member_status_update`

Update Member Status · Write

Update a Luma membership member's approval status.
Returns an empty response on success.
Use this to approve a pending member — which captures payment for paid tiers — or to decline one, which cancels any active subscription. Use luma_membership_member_add first to enroll a new member.
Requires an existing user_id or email from a pending membership, such as one created by luma_membership_member_add.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `status` (`string`, required): The status to set. approved captures payment for paid tiers and grants access; declined rejects the membership and cancels any active subscription. One of: `approved`, `declined`.
- `user_id` (`string`, required): The member's Luma user ID (usually starting with usr-) or their email address.

Example input: `{"status":"approved","user_id":"<user_id>"}`

### `luma_organization_calendar_create`

Create Calendar · Write

Create a new calendar within the connected Luma organization, managed by the API key's owner.
Returns the new calendar's id, slug, launch status, and appearance and social settings.
Use this to add another calendar to the organization. Use luma_calendar_update to change an existing calendar's settings instead.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `name` (`string`, required): Name of the new calendar.
- `avatar_url` (`string`, optional): URL of an image already uploaded to the Luma CDN, used as the calendar's avatar. If not provided, a random default avatar is used.
- `description` (`string`, optional): Short description shown on the calendar's page.
- `instagram_handle` (`string`, optional): Instagram handle or profile URL for the calendar, e.g. 'luma' or 'https://instagram.com/luma'.
- `launch_status` (`string`, optional): Calendar visibility status. Defaults to `launched` (Active). Use `coming-soon` to show a placeholder page while you set the calendar up, or `archived` to stop new follows and visitor event submissions. One of: `launched`, `coming-soon`, `archived`.
- `linkedin_handle` (`string`, optional): LinkedIn company or profile URL for the calendar, e.g. 'https://linkedin.com/company/luma'.
- `location` (`object`, optional): The city the calendar is based in, as a JSON object. Provide {"type": "lookup", "query": "Miami Beach, FL"} to search Google Maps by name, or {"type": "google", "place_id": "<google-places-id>"} to set it from a known Google Places ID; Luma derives the calendar's timezone and coordinates from the resolved city.
- `slug` (`string`, optional): URL slug for the calendar page, e.g. 'my-community' becomes lu.ma/my-community. If not provided, Luma generates one from the name.
- `tiktok_handle` (`string`, optional): TikTok handle or profile URL for the calendar, e.g. '@luma' or 'https://tiktok.com/@luma'.
- `tint_color` (`string`, optional): Tint color for the calendar page, as a hex color code (e.g. '#E3CBEF'). If not provided, a random color matching the default avatar is used.
- `twitter_handle` (`string`, optional): X (Twitter) handle or profile URL for the calendar, e.g. '@luma' or 'https://x.com/luma'.
- `website` (`string`, optional): Website URL shown on the calendar page. `https://` is added automatically if missing.
- `youtube_handle` (`string`, optional): YouTube handle or channel URL for the calendar, e.g. '@luma' or 'https://youtube.com/@luma'.

Example input: `{"name":"<name>"}`

### `luma_organization_event_transfer_calendar`

Transfer Event Calendar · Write

Move an event to a different managing calendar within the connected Luma organization. The event's managing calendar changes to the destination calendar you specify.
Returns an empty response on success.
Use this to reassign an event from one calendar to another, for example when reorganizing which calendar owns which events. Both the event and the destination calendar must belong to the organization.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `calendar_id` (`string`, required): The ID of the destination calendar, formatted as cal- followed by an alphanumeric string (e.g. cal-abc123XYZ). Must belong to the same organization as the event. Get this value from luma_organization_calendars_list.
- `event_id` (`string`, required): The ID of the event to transfer, formatted as evt- followed by an alphanumeric string (e.g. evt-abc123XYZ). Get this value from a calendar or organization events list, or from the event's Luma dashboard URL.

Example input: `{"calendar_id":"<calendar_id>","event_id":"<event_id>"}`

### `luma_webhook_create`

Create Webhook · Write

Create a new Luma webhook endpoint to receive event notifications.
Returns the created webhook's ID, URL, subscribed event types, status, and a secret used to verify incoming payloads.
Use this to start receiving calendar and event notifications at your own endpoint. Use luma_webhook_update to change its event types or pause it, and luma_webhooks_list to see existing webhooks.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `event_types` (`array`, required): The event types this webhook should receive. Use ["*"] to receive every event type, or list specific ones such as event.created, guest.registered, or ticket.registered.
- `url` (`string`, required): The HTTPS (or HTTP) URL that Luma should POST event payloads to.

Example input: `{"event_types":[],"url":"<url>"}`

### `luma_webhook_update`

Update Webhook · Write

Update a Luma webhook's subscribed event types or its active/paused status.
Returns the webhook's ID, URL, event types, status, secret, and creation time.
Use this to change what events a webhook receives, or to pause it without deleting it. Use luma_webhook_delete to remove it outright.
Requires an existing webhook id from luma_webhook_create or luma_webhooks_list.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `id` (`string`, required): The unique ID of the webhook to update. Get this value from a webhook creation response or from luma_webhooks_list.
- `event_types` (`array`, optional): New list of event types this webhook should receive, replacing the current list. Use ["*"] to receive every event type, or list specific ones such as event.created, guest.registered, or ticket.registered.
- `status` (`string`, optional): Set to paused to temporarily stop deliveries without deleting the webhook, or active to resume them. One of: `active`, `paused`.

Example input: `{"id":"<id>"}`

### `luma_contact_remove`

Remove Contact · Destructive

Remove a contact from your Luma calendar by contact ID or email.
Returns a success confirmation; the contact stops receiving invites and newsletters but keeps the ability to resubscribe on their own later.
Use this for a soft removal. Use luma_contact_block instead if you also want to prevent the contact from resubscribing.
Look up the contact_id with luma_contacts_list first if you don't already have the contact's email.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `contact_id` (`string`, optional): ID of the contact to remove, as returned by luma_contacts_list (usually starts with usr-). Provide this or email; at least one is required.
- `email` (`string`, optional): Email address of the contact to remove. Provide this or contact_id; at least one is required.

Example input: `{}`

### `luma_contact_tag_delete`

Delete Contact Tag · Destructive

Delete a contact tag from your Luma calendar.
Returns a success confirmation; the tag is removed from every contact it was applied to.
Use this to permanently remove a tag. Use luma_contact_tag_unapply instead if you only want to remove the tag from specific contacts.
Get the tag_id from luma_contact_tags_list.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `tag_id` (`string`, required): ID of the contact tag to delete, as returned by luma_contact_tags_list (usually starts with tag-).

Example input: `{"tag_id":"<tag_id>"}`

### `luma_event_blast_delete`

Delete Blast · Destructive

Delete a Luma email blast.
Returns an empty response on success.
Use this to cancel a scheduled blast before it sends, or to remove a sent blast's post from the event page — emails already delivered stay delivered either way. Use luma_event_blast_update to edit a blast instead of removing it.
Requires an existing blast_id from luma_event_blast_create or luma_event_blasts_list.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `blast_id` (`string`, required): The unique ID of the blast to delete, formatted as ep- followed by an alphanumeric string (e.g. ep-abc123XYZ). Get this value from a blast creation response or from luma_event_blasts_list.

Example input: `{"blast_id":"<blast_id>"}`

### `luma_event_cancel`

Cancel Event · Destructive

Cancel a Luma event, permanently deleting it and notifying every guest.
Returns an empty response on success.
Use this after luma_event_cancel_request has returned a cancellation_token; for events with paid guests you must also set should_refund to process or skip refunds. This action can't be undone.
Requires a cancellation_token from luma_event_cancel_request, obtained no more than 15 minutes earlier.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `cancellation_token` (`string`, required): The cancellation token returned by luma_event_cancel_request. It expires 15 minutes after being issued.
- `event_id` (`string`, required): The unique ID of the event to cancel, formatted as evt- followed by an alphanumeric string (e.g. evt-abc123XYZ). Must match the event the cancellation_token was issued for.
- `should_refund` (`boolean`, optional): Whether to refund paid guests as part of the cancellation. Required if luma_event_cancel_request reported is_paid: true for this event; omit it for events with no paid guests.

Example input: `{"cancellation_token":"<cancellation_token>","event_id":"<event_id>"}`

### `luma_event_tag_delete`

Delete Event Tag · Destructive

Delete an event tag from your Luma calendar.
Returns a success confirmation; the tag is removed from every event it was applied to.
Use this to permanently remove a tag.
Get the tag_id from luma_event_tags_list.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `tag_id` (`string`, required): ID of the event tag to delete, as returned by luma_event_tags_list (usually starts with tag-).

Example input: `{"tag_id":"<tag_id>"}`

### `luma_event_ticket_type_delete`

Delete Ticket Type · Destructive

Soft-delete a ticket type from a Luma event.
Returns an empty JSON object on success; guests already registered with this ticket type keep their tickets.
You can't delete an event's last visible ticket type — use luma_event_ticket_type_update instead to hide a ticket type without deleting it.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `event_ticket_type_id` (`string`, required): ID of the ticket type to delete, formatted as ttype- followed by an alphanumeric string.

Example input: `{"event_ticket_type_id":"<event_ticket_type_id>"}`

### `luma_webhook_delete`

Delete Webhook · Destructive

Delete a Luma webhook endpoint.
Returns an empty response on success.
Use this to permanently stop notifications to an endpoint; use luma_webhook_update to pause a webhook temporarily instead of deleting it.
Requires an existing webhook id from luma_webhook_create or luma_webhooks_list.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `id` (`string`, required): The unique ID of the webhook to delete. Get this value from a webhook creation response or from luma_webhooks_list.

Example input: `{"id":"<id>"}`

## Related

Other Calendar connectors ([all 13](/agentkit/connectors/?category=calendar)):

- [Google Calendar](/agentkit/connectors/googlecalendar/): Scalekit connector, OAuth, 30 tools
- [Microsoft 365](/agentkit/connectors/microsoft365/): Scalekit connector, OAuth, 317 tools
- [Outlook](/agentkit/connectors/outlook/): Scalekit connector, OAuth, 126 tools


---

## More Scalekit documentation

| Resource | What it contains | When to use it |
|----------|-----------------|----------------|
| [/llms.txt](/llms.txt) | Structured index with routing hints per product area | Start here — find which documentation set covers your topic before loading full content |
| [/llms-full.txt](/llms-full.txt) | Complete documentation for all Scalekit products in one file | Use when you need exhaustive context across multiple products or when the topic spans several areas |
| [sitemap-0.xml](https://docs.scalekit.com/sitemap-0.xml) | Full URL list of every documentation page | Use to discover specific page URLs you can fetch for targeted, page-level answers |
