> ## Documentation Index
> Fetch the complete documentation index at: https://docs.r28.ai/charter/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> Charter works for any HTTP API, including the user's own. The packs are examples of the result, not the limit: an API with no pack is declared the same way, following https://raw.githubusercontent.com/r28ai/charter/main/docs/.mintlify/skills/declaring-charter-tools/SKILL.md.
> Charter is for agents that act in customers' accounts: every call is checked field by field before it's sent, the app says whose account each call is for, and the same declarations list what each tool can reach. https://docs.r28.ai/charter/llms.txt says what it is and lists every page.

# events_create

> Create an event on the calendar. A name, a start time and a timezone are required; location, tickets, registration questions, theme and the rest are optional. Returns the new event's ID.

POST`https://public-api.luma.com/v1/events/create`

```python luma_events_create.py theme={null}
import asyncio

from charter.packs import luma

result = asyncio.run(luma.events_create.ainvoke({"name": ..., "startAt": ..., "timezone": ...}))
```

> [!WARNING]
>
> This tool's JSON schema is 21 KB, because it models the whole resource this endpoint writes.
> That is more context than most tasks. Narrow it at the call site
> with [`Tool.derived`](https://docs.r28.ai/charter/charter/reference/tool#tool-derived):
>
> ```python theme={null}
> narrowed = luma.events_create.derived(
>     name="events_create_narrowed",
>     drop={"ticket_types", "feedback_email"},
> )
> ```
>
> Those are its heaviest branches by schema size, not a recommendation: which ones you can spare is yours to decide. The tool underneath is unchanged.
> See [Projections](https://docs.r28.ai/charter/charter/tools/projections.md).

## Body

| Field | Type | Description |
| - | - | - |
| `confirmationEmailMd` | `string` | Your message in the confirmation email, sent when a registration is confirmed, including when you approve a guest. Supports Markdown formatting. Leave this field out to keep the current message or use the default email for a new event. To remove your message, use an empty string (`""`). Guests will still receive the standard email. |
| `pendingApprovalEmailMd` | `string` | Your message in the email sent to guests awaiting approval or joining the waitlist. Supports Markdown formatting. Leave this field out to keep the current message or use the default email for a new event. To remove your message, use an empty string (`""`). Guests will still receive the standard email. |
| `declinedEmailMd` | `string` | Your message in the email sent when you decline a guest's registration. Supports Markdown formatting. Leave this field out to keep the current message or use the default email for a new event. To remove your message, use an empty string (`""`). Guests will still receive the standard email. |
| `canRegisterForMultipleTickets` | `boolean` | Whether a guest can register for multiple tickets in one registration (Group Registration). When `true`, each ticket counts toward `max_capacity`. |
| `coverUrl` | `string` | Specify an image that has been uploaded to the Luma CDN. You can upload an image after getting an upload URL from the Luma API, or pick one from Luma’s cover gallery with `/v1/images/search`. matches `^https:\/\/images\.lumacdn\.com\/.*` |
| `createMeeting` | `"zoom" \| "google-meet"` | Create a new Zoom meeting or Google Meet with the Zoom or Google account the user has connected to Luma, and use its join link as the event's `meeting_url`. Fails if that account isn't connected. On update, replaces the current link; only the event's creator can create a Zoom meeting. Can't be combined with `meeting_url` or `geo_address_json`. |
| `descriptionMd` | `string` | Format your text with Markdown. For images, request an upload URL from `/v1/images/create-upload-url`, upload the image, and use the returned `file_url` in `![alt](url)`. Image URLs must be hosted on images.lumacdn.com. To embed a YouTube, Vimeo, or Loom video, put its URL on a line of its own. Embedded Luma event cards aren't supported. |
| `endAt` | `string` | ISO 8601 Datetime. For example, 2022-10-19T03:27:13.673Z |
| `font` | [Font](https://docs.r28.ai/charter/charter/packs/luma/events/objects.md#font) | Font for the event name and headings on the event page. Setting a `theme` without a `font` applies the theme’s default font; pass `null` to clear the font and use the standard font. Fonts may be retired over time — a retired font stops being accepted here, and event pages still using one fall back to the standard font. |
| `geoAddressJson` | [GeoAddressJsonManual](https://docs.r28.ai/charter/charter/packs/luma/events/objects.md#geoaddressjsonmanual) \| [GeoAddressJsonGoogle](https://docs.r28.ai/charter/charter/packs/luma/events/objects.md#geoaddressjsongoogle) \| [GeoAddressJsonLookup](https://docs.r28.ai/charter/charter/packs/luma/events/objects.md#geoaddressjsonlookup) | In-person location. Use `&#123; type: 'manual', address &#125;` with a free-text address, `&#123; type: 'google', place_id &#125;` with a Google Places ID, or `&#123; type: 'lookup', query &#125;` to search Google Maps and use the top result. Leave out for online events. |
| `locationVisibility` | `"public" \| "guests-only"` | Set to `guests-only` to hide the precise location from people who haven't been approved — they'll see only the city and approximate area. Defaults to `public`. |
| `maxCapacity` | `number` | Once an event hits the max capacity, the event will be marked as sold out and registration will automatically be closed. If the event has a waitlist (`waitlist_status` is `enabled`), new registrations join the waitlist instead of being closed. If `can_register_for_multiple_tickets` is `true`, each ticket will count towards the max capacity. |
| `meetingUrl` | `string` | Join link for online events (Zoom, Google Meet, etc.). To have Luma create one, use `create_meeting` instead. Can't be combined with `geo_address_json`. |
| `name` \* | `string` | The event's name. |
| `nameRequirement` | `"full-name" \| "first-last"` | 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. |
| `phoneNumberRequirement` | `"optional" \| "required"` | Whether registration collects a phone number, as optional or required. |
| `registrationOpen` | `boolean` | Whether to accept registrations. Set to `false` to close registration so new guests can't sign up. Defaults to `true`. |
| `registrationQuestions` | [RegistrationQuestionAgreeCheck](https://docs.r28.ai/charter/charter/packs/luma/events/objects.md#registrationquestionagreecheck) \| [RegistrationQuestionCompany](https://docs.r28.ai/charter/charter/packs/luma/events/objects.md#registrationquestioncompany) \| [RegistrationQuestionGithub](https://docs.r28.ai/charter/charter/packs/luma/events/objects.md#registrationquestiongithub) \| [RegistrationQuestionInstagram](https://docs.r28.ai/charter/charter/packs/luma/events/objects.md#registrationquestioninstagram) \| [RegistrationQuestionLinkedin](https://docs.r28.ai/charter/charter/packs/luma/events/objects.md#registrationquestionlinkedin) \| [RegistrationQuestionPhoneNumber](https://docs.r28.ai/charter/charter/packs/luma/events/objects.md#registrationquestionphonenumber) \| [RegistrationQuestionSelect](https://docs.r28.ai/charter/charter/packs/luma/events/objects.md#registrationquestionselect) \| [RegistrationQuestionTelegram](https://docs.r28.ai/charter/charter/packs/luma/events/objects.md#registrationquestiontelegram) \| [RegistrationQuestionText](https://docs.r28.ai/charter/charter/packs/luma/events/objects.md#registrationquestiontext) \| [RegistrationQuestionTwitter](https://docs.r28.ai/charter/charter/packs/luma/events/objects.md#registrationquestiontwitter) \| [RegistrationQuestionUrl](https://docs.r28.ai/charter/charter/packs/luma/events/objects.md#registrationquestionurl) \| [RegistrationQuestionYoutube](https://docs.r28.ai/charter/charter/packs/luma/events/objects.md#registrationquestionyoutube) \| [RegistrationQuestionTerms](https://docs.r28.ai/charter/charter/packs/luma/events/objects.md#registrationquestionterms)\[] | Questions guests answer when they register. Each names its `question_type` and the fields that type takes. |
| `remindersDisabled` | `boolean` | By default, Luma will send reminders before the event. Turn off if you'd like more control over event communications. |
| `feedbackEmail` | [FeedbackEmail](https://docs.r28.ai/charter/charter/packs/luma/events/objects.md#feedbackemail) | Settings for the post-event feedback email sent to guests. If not specified on create, inherits from calendar defaults. |
| `showGuestList` | `boolean` | When the guest list is shown, approved guests will be able to see who else is going to the event. |
| `slug` | `string` | The URL slug for the event. If the slug is `aloha`, the URL will be `https://luma.com/aloha`. If the slug is not available, the event creation will fail. You can use `/v1/entities/lookup` to check if a slug is available. min length 3; max length 50 |
| `startAt` \* | `string` | ISO 8601 Datetime. For example, 2022-10-19T03:27:13.673Z |
| `theme` | [Theme](https://docs.r28.ai/charter/charter/packs/luma/events/objects.md#theme) | Theme for the event page. Themes may be retired over time — a retired theme stops being accepted here, and event pages still using one fall back to `standard`. Setting a theme also applies the theme’s default font unless you pass `font`. |
| `timezone` \* | `string` | IANA Timezone, e.g. America/New\_York. [https://en.wikipedia.org/wiki/List\_of\_tz\_database\_time\_zones](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones) |
| `tintColor` | `string` | Accent color for the event page, as a 3 or 6-digit hex code like `#bb2dc7`. We adjust the shade as needed so text and buttons stay accessible against the background. |
| `visibility` | [Visibility](https://docs.r28.ai/charter/charter/packs/luma/events/objects.md#visibility) | Who can find and view the event. |
| `waitlistStatus` | `"disabled" \| "enabled"` | `enabled` if the event has a waitlist. New registrations join the waitlist once the event reaches capacity. |
| `ticketTypes` | [TicketTypeCreateInput](https://docs.r28.ai/charter/charter/packs/luma/events/objects.md#tickettypecreateinput)\[] | Ticket types to create the event with. When provided, these replace the default ticket — the event is created with exactly these ticket types. When omitted, the event gets a single free ticket named `Standard`. Paid ticket types require the calendar to have a connected Stripe account. To change ticket types after creation, use the ticket type endpoints. min 1 items; max 200 items |


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.