luma_example.py
scripts/openapi_to_pack.py, so every parameter, enum member and description
is Luma’s, word for word. What a spec cannot carry — the rules Luma states in
prose, the sentences a blank parameter needed, the limits below — was added in
review.
Authenticating
Get a key: at luma.com/calendar/manage/api-keys choose the calendar and generate a key — it reaches that calendar only, and the API needs a Luma Plus subscription — thenexport LUMA_API_KEY=….
This pack takes an API key in x-luma-api-key, and configure() is optional when $LUMA_API_KEY is set.
That key serves every call the process makes. For an application whose users each connect their own account, hand configure() a credential_provider instead — a SubjectProvider that answers per user — and each call carries the credential of the user use_subject names. Your users’ accounts says how each pack’s users connect.
A calendar key reaches the calendar it was made on and nothing else, so the
calendars_* tools act on that calendar and only calendars_update asks for its
ID.
An organization key reaches the organizations_* tools. Where Luma documents
choosing one of the organization’s calendars — approving or rejecting a
submission — it is a header, and which calendar a call acts on is your decision,
not the model’s, so pass it per call rather than as an argument:
The client
oauth_tool_factory is the whole client: a thin wrapper over httpx that attaches your key and these endpoint constants to each request. No vendor SDK enters your dependency tree.Paging through a list
A cursor belongs to the tool that returns it, so it is declared on that tool’s builder call:luma_pagination.py
Pagination is declared on
calendars_events_list, events_guests_list, images_search, calendars_contacts_list, events_coupons_list, calendars_coupons_list, memberships_tiers_list, webhooks_list, organizations_calendars_list and organizations_events_list. The other 64 take no cursor.GETs with query parameters and every write is a POST. Luma versions
each route on its own, so /v1/ and /v2/ sit side by side and the version is
part of each tool’s URL. Failure is an HTTP status — 429 past the rate limit of
200 requests a minute per calendar key — and the ten list tools page on
has_more, sending next_cursor back as pagination_cursor.
Limits
nullcannot be sent. Charter omits an unset field rather than sendingnull, so what Luma clears withnull— an event’sfont, a registration question’s librarysource, a calendar’slocation, a ticket type’smax_per_guest— can be set through these tools but not cleared.- Uploading an image is two steps, and the second is not a tool.
images_create_upload_urlreturns anupload_urltoPUTthe bytes to, which is a file transfer to Luma’s CDN rather than an API call. events_createandevents_updateare large, about 22KB of schema each, mostly themes, fonts and the thirteen kinds of registration question. A projection keeps what an agent uses.
Tools
Each is aTool, called with
ainvoke as in the snippet above.
Eventsevents_getGETReturn details about an event.events_guests_getGETGet detailed information for an event guest by looking them up by their ID.events_guests_listGETGet list of guests who have registered or been invited to an event.events_coupons_listGETList all coupons that have been created for an event.events_ticket_types_listGETList all ticket types for an eventevents_ticket_types_getGETGet a single ticket type by IDevents_blasts_listGETList the blasts (emails to guests) on an event, newest first.events_blasts_getGETGet a blast by ID.events_createPOSTCreate an event on the calendar.events_updatePOSTUpdate an event by its ID.events_guests_update_statusPOSTUpdate a guest’s status.events_guests_update_ticketsPOSTAdd or remove tickets from an existing guest.events_guests_send_invitesPOSTSend guests an invite to an event.events_guests_addPOSTAdd guests to the event.events_hosts_addPOSTAdd a host to an event.events_hosts_updatePOSTUpdate a host’s permissions or visibility on an event.events_hosts_removePOSTRemove a host from an event.events_coupons_createPOSTCreate a coupon that can be applied when a guest is registering for an event.events_coupons_updatePOSTChange how many more times an event coupon can be used, or the window it is valid in.events_ticket_types_createPOSTCreate a new ticket type for an event.events_ticket_types_updatePOSTUpdate an existing ticket type configurationevents_ticket_types_deletePOSTSoft delete a ticket type.events_blasts_createPOSTEmail a message to an event’s guests now, or at
scheduled_for.events_blasts_updatePOSTEdit a blast.events_blasts_deletePOSTDelete a blast.events_cancel_requestPOSTRequest a cancellation token for an event.events_cancelPOSTCancel an event.Calendarscalendars_getGETGet information about the calendar.calendars_events_listGETEvery event and API key on Luma is managed by a Luma Calendar.calendars_contact_tags_listGETList the contact tags on the calendar, with the IDs that apply, unapply, update and delete them.calendars_event_tags_listGETList the event tags on the calendar, with the IDs that apply, unapply, update and delete them.calendars_admins_listGETList all admins for the calendar.calendars_events_lookupGETSee if an event already exists on the calendar.calendars_contacts_listGETList the calendar’s contacts, optionally narrowed by search text, contact tags, or membership tier and status, and sorted by the column you choose.calendars_coupons_listGETList all coupons that have been created for a calendar.calendars_coupons_createPOSTCreate a coupon that can be applied to any event that is managed by the calendar.calendars_coupons_updatePOSTChange how many more times a calendar coupon can be used, or the window it is valid in.calendars_contacts_importPOSTImport contacts to the calendar, so they can be invited to events and sent newsletters.calendars_contacts_blockPOSTBlock a contact so they can’t follow your calendar or join its events.calendars_contacts_removePOSTRemove a contact from your calendar.calendars_contacts_restorePOSTRestore a blocked or removed contact, returning them to your active contacts.calendars_contact_tags_createPOSTCreate a contact tag on the calendar.calendars_contact_tags_updatePOSTRename a contact tag or change its color.calendars_contact_tags_deletePOSTDelete a contact tag from the calendar.calendars_contact_tags_applyPOSTApply a tag to existing calendar contacts.calendars_contact_tags_unapplyPOSTUnapply a tag from calendar contacts.calendars_event_tags_createPOSTCreate an event tag on the calendar.calendars_event_tags_updatePOSTRename an event tag or change its color.calendars_event_tags_deletePOSTDelete an event tag from the calendar.calendars_event_tags_applyPOSTApply a tag to events on the calendar.calendars_event_tags_unapplyPOSTUnapply a tag from events on the calendar.calendars_events_addPOSTAdd or submit an existing event (on Luma or on an external platform) to the Luma calendar.calendars_events_approvePOSTApprove a pending event submission on your calendar.calendars_events_rejectPOSTReject a pending event submission on your calendar.calendars_admins_addPOSTAdd admins to the calendar.calendars_updatePOSTUpdate a calendar’s settings.Miscellaneoususers_get_selfGETGet the Luma user the API key belongs to.entities_lookupGETLook up an event or calendar by its slug, Luma URL, or permanent public path such as event/evt-…, e/evt-…, or calendar/cal-….places_searchGETSearch Google Maps for a place and get up to 5 candidates.images_searchGETSearch Luma’s gallery of stock event cover images by keyword.images_create_upload_urlPOSTGet a URL to upload a JPEG or PNG to Luma’s CDN.Membershipsmemberships_tiers_listGETList the calendar’s membership tiers, including hidden ones (see is_hidden).memberships_members_addPOSTAdd a user to a membership tier.memberships_members_update_statusPOSTUpdate a member’s membership status.Webhookswebhooks_listGETList all webhook endpoints for the calendar.webhooks_getGETGet details about a specific webhook endpoint.webhooks_createPOSTCreate a new webhook endpoint to receive event notifications.webhooks_updatePOSTUpdate a webhook endpoint’s event types or status (active/paused).webhooks_deletePOSTDelete a webhook endpoint.Organizationsorganizations_admins_listGETList all admins for the organization.organizations_calendars_listGETList all calendars belonging to the organization.organizations_events_listGETList all events across all calendars belonging to the organization.organizations_calendars_createPOSTCreate a new calendar within the organization.organizations_events_transfer_calendarPOSTTransfer an event from its current managing calendar to a different calendar within the organization.