Muzeek Events and Tours API
REST APIs for reading and managing shows and tours in your Muzeek account from any server-side application.
Events, event catalogs, event items, tour catalogs, and tours are the REST resources on this page. Additional REST APIs will be published here as they become available. If you have a use case that isn't covered yet, we'd love to hear from you.
Base URL
All endpoints are served from:
https://muzeek.ai/apiRequests and responses are JSON. All timestamps are ISO 8601 in UTC. All resource identifiers exposed through the external API are UUIDs.
Authentication
Every request to the Muzeek API is authenticated with an API key. Pass it as Authorization: Bearer or as the X-API-Key HTTP header.
curl https://muzeek.ai/api/events \
-H "Authorization: Bearer mzk_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"Equivalent header:
curl https://muzeek.ai/api/events \
-H "X-API-Key: mzk_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"Generating a key. Open Settings → API & MCP, create an API client, and generate a key. Grant each key the minimum scopes it needs. A key is for scripts and apps. To connect an assistant, use Connect.
One-time display. Your key is shown only once at the moment it is created. Copy it to your secret manager straight away — it cannot be displayed or recovered again.
Rotation & revocation. You can rotate or revoke keys at any time from the same screen. Revoked keys stop working immediately.
Never send keys in the URL. Always pass keys in a header. Keys sent as query-string parameters can leak through server logs, browser history, caches, and Referer headers, so the API rejects them.
Connect
Sign in when an assistant should work in an Account. Create a key when a script or app sends the key itself.
An assistant
- Paste
https://muzeek.ai/mcpin the assistant. - Sign in.
- Pick the Account.
- Come back to the assistant.
Use MCP for agents that don't have a direct Muzeek AI plugin or connection available in our Integrations page. Some agents such as Claude, ChatGPT, Gemini, and Copilot can connect directly from Integrations.
That connection works on the Account you picked. It can look up and change events, schedule items on those events, and tours there.
A script or app
Create a client and key under Settings → API & MCP. Poly and other programs that send a key use this path. API keys shows how to send the key.
MCP
Assistants and scripts call Muzeek over Streamable HTTP. Tool results are JSON. The public URL is:
https://muzeek.ai/mcpAn assistant signs in with the steps in Connect. A script or app sends an API key with Authorization: Bearer or X-API-Key.
API key example for a script or app:
{
"mcpServers": {
"muzeek": {
"url": "https://muzeek.ai/mcp",
"headers": {
"Authorization": "Bearer mzk_live_your_api_key_here"
}
}
}
}GET /api/me returns the same account and connection as whoami. A signed-in session or an API key can call it. An API key does not need a scope. GET /api/users/me is the signed-in person and stays session-only.
{
"account": { "id": "<account uuid>", "name": "Account name" },
"connection": { "type": "api_key", "name": "Key name", "id": "<client uuid>" },
"permissions": ["read:events"]
}connection.id is the API client id, and only when the caller is an API key. A session uses type: "session" and an empty permissions list. OAuth whoami uses type: "oauth" and ["*"].
MCP requests share the standard API-key hourly window (1,000 requests) and the same X-RateLimit-* headers as the REST API.
MCP tools
The allowlist matches API key scopes, plus whoami. Resource identifiers are UUIDs.
whoamiaccountReturn the authenticated account and this connection's permissions.
searchEventseventsSearch events. Requires read:events on an API key.
getEventeventsRetrieve one event by UUID, including schedule items on that event. Requires read:events.
createEventeventsCreate a show. Set the title, dates, status, labels, published state, event type, place, venue, and tour. Accepts the same fields, including status, isPublished, and labelKeys. labelKeys sets the labels on the show. Sending the list replaces the set. An empty list clears them. tourId attaches the show to a tour. Requires write:events on an API key.
updateEventeventsChange a show's title, dates, status, labels, published state, event type, place, venue, or tour. Accepts the same fields, including status, isPublished, and labelKeys. labelKeys sets the labels on the show. Sending the list replaces the set. An empty list clears them. Pass the show id. tourId attaches the show to a tour. A null tourId takes the show off. Requires write:events.
deleteEventeventsPermanently delete a show. Requires write:events. No confirm flag.
listEventStatuseseventsList event statuses this Account can pick for new shows. Requires read:events.
createEventStatuseventsAdd a custom event status (for example TBC). Omitting publishesEvent still publishes shows, matching Settings. publishesEvent and showOnEventList (including that default) need an Account admin. Requires write:events.
updateEventStatuseventsRename or recolor an event status. Pass id from listEventStatuses. Requires write:events.
deleteEventStatuseventsRemove an event status from new picks. Existing shows keep the key. Requires write:events.
listEventLabelseventsList event labels this Account can put on shows. These are not tour types. Requires read:events.
createEventLabeleventsAdd a custom event label (for example headline, support, festival, instore). Requires write:events.
updateEventLabeleventsRename or recolor an event label. Requires write:events.
deleteEventLabeleventsRemove an event label from new picks. Requires write:events.
listEventTypeseventsList macro event types for shows. Schedule-item types are listEventItemTypes. Requires read:events.
createEventTypeeventsAdd a custom macro event type. Requires write:events.
updateEventTypeeventsRename or restyle a macro event type. Requires write:events.
deleteEventTypeeventsRemove a macro event type from new picks. Requires write:events.
searchEventItemseventsList schedule items. Pass eventId to nest under a show. Requires read:events.
getEventItemeventsRetrieve one schedule item by UUID. Requires read:events.
listEventItemTypeseventsList the schedule-item types this Account can pick, including field definitions for typeSpecificData and id for catalog writes. Accounts can rename or delete system-provided types. Requires read:events.
createEventItemTypeeventsAdd a custom schedule-item type. Requires write:events.
updateEventItemTypeeventsRename or restyle a schedule-item type. Pass id from listEventItemTypes. Requires write:events.
deleteEventItemTypeeventsRemove a schedule-item type from new picks. Requires write:events.
createEventItemeventsCreate a schedule item on an existing event. itemType must be a typeKey from listEventItemTypes. Times use ISO startDate and endDate. Set typeSpecificData using that list's field keys. Requires write:events.
updateEventItemeventsChange a schedule item. Same fields as create. Pass the item id. Requires write:events.
deleteEventItemeventsPermanently delete a schedule item. Requires write:events.
completeEventItemTaskeventsMark a schedule-item task complete or incomplete. Requires write:events.
searchTourstoursSearch tours. Requires read:tours on an API key.
getTourtoursRetrieve one tour by UUID. Requires read:tours.
createTourtoursCreate a tour. Requires name, startDate, and endDate. Type, status, and labels are optional and fall back to the account defaults. Requires write:tours.
updateTourtoursUpdate a tour, including its type, status, and labels. Requires write:tours.
deleteTourtoursDelete a tour. Requires write:tours. No separate delete scope.
listTourTypestoursList tour types this Account can pick. These are not event labels. Requires read:tours.
createTourTypetoursAdd a custom tour type. Tours add-on required. Requires write:tours.
updateTourTypetoursRename or recolor a tour type. Requires write:tours.
deleteTourTypetoursRemove a tour type from new picks. Requires write:tours.
listTourStatusestoursList tour statuses this Account can pick. Requires read:tours.
createTourStatustoursAdd a custom tour status. Tours add-on required. Requires write:tours.
updateTourStatustoursRename or recolor a tour status. Requires write:tours.
deleteTourStatustoursRemove a tour status from new picks. Requires write:tours.
listTourLabelstoursList tour labels this Account can pick. These are not event labels. Requires read:tours.
createTourLabeltoursAdd a custom tour label. Tours add-on required. Requires write:tours.
updateTourLabeltoursRename or recolor a tour label. Requires write:tours.
deleteTourLabeltoursRemove a tour label from new picks. Requires write:tours.
Permission scopes
Each API key is granted one or more scopes:
read:eventsscopeRequired for GET /api/events, GET /api/events/:id, GET /api/event-statuses, GET /api/event-labels, GET /api/event-types, GET /api/event-item-types, GET /api/event-items, and GET /api/event-items/:id.
write:eventsscopeRequired for POST, PUT and DELETE against /api/events, event catalogs, /api/event-item-types, and /api/event-items, including POST /api/event-items/:id/complete. Publish and Event list flags on a status need an Account admin. Covers delete. There is no separate delete:events scope.
read:toursscopeRequired for GET /api/tours, GET /api/tours/:id, GET /api/tour-types, GET /api/tour-statuses, and GET /api/tour-labels.
write:toursscopeRequired for POST, PUT and DELETE against /api/tours, /api/tour-types, /api/tour-statuses, and /api/tour-labels. Tours add-on required for catalog writes. Covers delete. There is no separate delete:tours scope.
A key with the wildcard * scope has full access to every endpoint. We recommend issuing narrowly-scoped keys per integration.
On an API key, every MCP tool except whoami uses the same scope as the matching route. Event tools use read:events and write:events, including schedule items. Tour tools use read:tours and write:tours. OAuth connections run with *.
Pagination
List endpoints accept page and limit query parameters. The default page size is 10; the maximum is 100. Responses return both the requested slice and pagination metadata:
{
"data": [ /* array of events */ ],
"pagination": {
"page": 1,
"limit": 10,
"total": 247,
"totalPages": 25
}
}Including related data
By default, event responses contain only the event record itself. Use the include query parameter to embed related resources in the response.
venueincludeBasic venue information (id, name).
venue.fullincludeFull venue details including address, city, state, country.
tourincludeBasic tour information (id, name).
tour.fullincludeFull tour details including type and status.
accountincludeBasic account information (id, name).
account.fullincludeFull account details (id, name, slug, imageUrl).
eventItemsincludeSchedule items on the event (every item type, custom types, tasks, and custom fields).
Combine values with commas, e.g. ?include=venue.full,tour,account. P&L, ticket reports, and lineup are not returned for API keys.
Event type and status
Create and update payloads use the JSON fields eventType and status.
Defaults on create
- If you omit
eventType, the event is created as typeshow. - If you omit
status, the event is created with statusprivate(the initial lifecycle state before public on-sale messaging).
Setting status values
Use a lowercase string. Allowed status values are:
privateoff_saleannouncedpre_saleon_salesold_outallocation_fullevent_endedcancelled
Set status on create or update when you need a lifecycle state other than the default (for example announced or on_sale).
Setting eventType values
Use a lowercase string. Allowed type values are:
showtravelday_off
Custom event types: create, rename, and remove macro types with POST /api/event-types, PUT /api/event-types/:id, and DELETE /api/event-types/:id (MCP createEventType / updateEventType / deleteEventType). List them with GET /api/event-types. Schedule-item types use /api/event-item-types.
Errors
All errors use a consistent JSON envelope and the HTTP status code reflects the error class.
{
"error": {
"code": "INVALID_API_KEY",
"message": "Invalid or expired API key"
}
}MISSING_API_KEY401The X-API-Key header was not present.
INVALID_API_KEY401The supplied key was unknown, expired, or revoked.
FORBIDDEN403The key is valid but does not have the scope required for this endpoint.
VALIDATION_ERROR400Request body or query parameters failed schema validation.
NOT_FOUND404The requested resource does not exist in your account.
RATE_LIMIT_EXCEEDED429You have sent too many requests in a short period. Respect the X-RateLimit-Reset header.
Rate limits
Every API key is rate limited on a rolling hourly window:
- 1,000 requests per hour across read endpoints (
GET) - 200 requests per hour across write endpoints (
POST,PUT,DELETE)
These are our current limits. If you have a use case that needs more headroom, get in touch.
Every response includes the following headers so your client can pace itself:
X-RateLimit-LimitintegerThe maximum number of requests allowed in the current window.
X-RateLimit-RemainingintegerThe number of requests remaining in the current window.
X-RateLimit-Resetunix timestampThe time at which the current window resets.
Events API
Events are the core unit of the Muzeek data model — a scheduled occurrence (show, travel day, day off, etc.) that optionally lives on a tour and at a venue. The Events API lets you list, retrieve, create, update and delete events.
If your account manages other accounts via a roster (for example, an agent or manager with an artist roster), you can also create events for a roster member by passing their account UUID as forAccountId on create. See Create an event.
Query parameters
pageintegerPage number. Defaults to 1.
limitintegerItems per page. Defaults to 10, max 100.
sortBystringOne of startDate, title, createdAt. Defaults to startDate.
sortOrderstringasc or desc. Defaults to desc.
searchstringFree-text search across event title.
typesstring[]Filter by event type (repeatable). Example: ?types=show&types=travel.
tourIduuidLimit the list to shows on this tour.
statusesstring[]Filter by status (repeatable). Example: ?statuses=private&statuses=announced.
startDateISO 8601Only return events whose startDate is on or after this value.
endDateISO 8601Only return events whose startDate is on or before this value.
includestringComma-separated list. See the Includes section above.
Example
curl "https://muzeek.ai/api/events?limit=5&include=venue,tour" \
-H "X-API-Key: $MUZEEK_API_KEY"Path parameters
iduuidThe event UUID.
Query parameters
includestringComma-separated list. See Includes.
Example request
curl "https://muzeek.ai/api/events/123e4567-e89b-12d3-a456-426614174000?include=venue,tour" \
-H "X-API-Key: $MUZEEK_API_KEY"Example response
{
"id": "123e4567-e89b-12d3-a456-426614174000",
"title": "Summer Showcase",
"description": null,
"eventType": "show",
"startDate": "2026-08-15T20:00:00.000Z",
"endDate": "2026-08-15T23:00:00.000Z",
"timezone": "Europe/London",
"isAllDay": false,
"isPublished": true,
"status": "announced",
"capacity": 500,
"imageUrl": null,
"venueId": "6a1b2c3d-4e5f-6071-8293-a4b5c6d7e8f9",
"tourId": null,
"createdAt": "2026-04-01T10:15:30.000Z",
"updatedAt": "2026-04-02T09:00:00.000Z",
"venue": {
"id": "6a1b2c3d-4e5f-6071-8293-a4b5c6d7e8f9",
"name": "The Lexington"
},
"tour": null
}Fields omitted above that you may also see: description, capacity, imageUrl, status, currencyCode, and location fields (locationName, locationAddress, …). Fields that are unset come back as null; optional objects like venue and tour are only present when requested via include.
Request body
titlestringEvent title.
startDateISO 8601Event start in UTC.
endDateISO 8601Event end in UTC.
timezoneIANA timezoneE.g. "Europe/London", "America/Los_Angeles".
isAllDaybooleanWhether this is an all-day event.
eventTypestringEvent type. Defaults to show. See Event type and status.
venueIduuidVenue UUID. Mutually exclusive with venueContactId.
tourIduuidTour UUID.
capacityintegerPositive integer capacity.
imageUrlhttps urlHero image. Pass null or empty string to clear.
isPublishedbooleanWhether the event is publicly visible.
statusstringEvent lifecycle status. Defaults to private. See Event type and status.
labelKeysstring[]Labels on the show. Sending the list replaces the set. An empty list clears them.
forAccountIduuidOptional. Beneficiary roster account — create the event for a member of your roster. The caller must be an active roster owner of this account, otherwise the request returns 403 FORBIDDEN. Omit or pass your own account UUID to create on your own account.
Example
curl -X POST https://muzeek.ai/api/events \
-H "X-API-Key: $MUZEEK_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"title": "Summer Showcase",
"eventType": "show",
"startDate": "2026-08-15T20:00:00Z",
"endDate": "2026-08-15T23:00:00Z",
"timezone": "Europe/London",
"isAllDay": false,
"venueId": "123e4567-e89b-12d3-a456-426614174000"
}'Creating for a roster member
If your account manages other accounts via a roster (e.g. an agent or manager with an artist roster), pass the member's account UUID as forAccountId. The event is created on the member's account and attributed to you as the creator. The scope required is still write:events; the roster relationship itself is the authorisation boundary.
curl -X POST https://muzeek.ai/api/events \
-H "X-API-Key: $MUZEEK_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"title": "Roster Member Show",
"eventType": "show",
"startDate": "2026-08-15T20:00:00Z",
"endDate": "2026-08-15T23:00:00Z",
"timezone": "Europe/London",
"isAllDay": false,
"forAccountId": "9f8e7d6c-5b4a-3210-fedc-ba9876543210"
}'Note:the member's account UUID is not currently listable via the API — retrieve it from the Muzeek app and pass it through your integration as configuration.
Request body
isPublishedbooleanWhether the show is published. Omit to leave it unchanged.
statusstringEvent lifecycle status. Omit to leave it unchanged.
labelKeysstring[]Labels on the show. Sending the list replaces the set. An empty list clears them. Omit to leave the labels unchanged.
Example
curl -X PUT https://muzeek.ai/api/events/123e4567-e89b-12d3-a456-426614174000 \
-H "X-API-Key: $MUZEEK_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"title": "Summer Showcase (rescheduled)",
"startDate": "2026-08-16T20:00:00Z",
"endDate": "2026-08-16T23:00:00Z"
}'Example
curl -X DELETE https://muzeek.ai/api/events/123e4567-e89b-12d3-a456-426614174000 \
-H "X-API-Key: $MUZEEK_API_KEY"DELETE is covered by the write:events scope. There is no separate delete:events scope.
Event catalogs API
Status, labels, and macro types are lists on this Account. Create a row, then apply its key on a show. Status and published are separate: omit status on create and the show starts private and unpublished, then existing reconciliation still runs. Settings /api/account-* URLs stay session-only.
Event items API
Event items are rows on an event — soundcheck, load-in, flights, lobby call, todos, and any types this Account still has. They are not extra events. Call GET /api/event-item-types (MCP listEventItemTypes) for the typeKey values and field definitions this Account currently has. Accounts can rename or delete types; do not assume a key exists.
Query parameters
eventIduuidParent event UUID.
itemTypestringtypeKey from GET /api/event-item-types for this Account.
pageintegerPage number. Defaults to 1.
limitintegerItems per page. Defaults to 50, max 500.
Request body
eventIduuidParent event UUID.
itemTypestringtypeKey from GET /api/event-item-types for this Account. Accounts can rename or delete system-provided types.
startDateISO 8601Optional clock start. Null for unscheduled.
endDateISO 8601Optional clock end.
timingModestringclock or relative.
isTaskbooleanTrue for a checklist or todo row.
typeSpecificDataobjectValues for the type's field keys from GET /api/event-item-types. Dot paths nest objects. Clock times stay on startDate and endDate. Extra per-item fields: custom[key] plus _ui.customFields.
isCompletedbooleanTrue to complete, false to reopen.
Tours API
Shows belong to a tour through the event's tourId, not through a separate membership call. Tour type, status, and label lists are public catalogs: list them, then apply keys on createTour and updateTour. Writes need the Tours add-on. Settings /api/account-tour-* stays session-only.
Tour catalogs
Query parameters follow the events list: page, limit, sortBy, sortOrder, search, type, category, status, and include.
Required fields
namestringTour name.
startDatedatetimeISO datetime.
endDatedatetimeISO datetime. Must be after startDate.
typestringTour type key from the account catalog. Omit to use the default for new tours.
statusstringTour status key from the account catalog. Omit to use the default for new tours.
labelKeysstring[]Tour label keys. Omit to use the defaults for new tours. Sending the list replaces the set.
categorystringdomestic or international.
Maintain type, status, and label lists with the tour catalog routes (or MCP listTourTypes / createTourType and the matching status and label tools), then apply keys here.
DELETE is covered by write:tours. There is no separate delete:tours scope.