Muzeek Events API
A REST API for reading and managing events in your Muzeek account from any server-side application.
The Events API is the first REST resource. Bookings, contacts, invoices, settlements, and ticket sales are available today through MCP. Additional REST APIs for bookings, venues, tours, and settlements 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, create an API client, and generate a key. Grant each key the minimum scopes it needs. Claude, ChatGPT, Gemini, and Microsoft Copilot connect from Settings → Integrations. Poly and scripts use a key from this API Access screen.
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.
MCP
External models (Claude, ChatGPT, Gemini, Copilot, Poly) call a curated set of Muzeek tools over Streamable HTTP. Tool results are JSON. The public URL is:
https://muzeek.ai/mcpClaude, ChatGPT, Gemini, and Microsoft Copilot sign in over OAuth. Add the URL in the assistant — you will be asked to pick an Account. Poly and scripts use an API key with Authorization: Bearer or X-API-Key.
API key example for Claude Desktop (claude_desktop_config.json):
{
"mcpServers": {
"muzeek": {
"url": "https://muzeek.ai/mcp",
"headers": {
"Authorization": "Bearer mzk_live_your_api_key_here"
}
}
}
}MCP requests share the standard API-key hourly window (1,000 requests) and the same X-RateLimit-* headers as the REST API.
MCP tools
v1 is an allowlist, not the full in-app assistant surface. Resource identifiers are UUIDs.
whoamiaccountReturn the authenticated account and this connection's permissions.
searchEventseventsSearch events. Use event types and event statuses only — booking statuses belong on searchBookings.
getEventeventsRetrieve one event by UUID, including related data.
createEventeventsCreate a new calendar event. On an API key this requires write:events.
searchBookingsbookingsSearch bookings by counterparty, reference, date, or booking status.
getBookingbookingsRetrieve one booking by UUID.
createBookingbookingsAttach a draft booking to an existing event UUID. Sending is a separate sendBooking call.
addBookingContactbookingsAttach an existing contact to a booking. Search contacts first.
sendBookingbookingsEmail the booking offer. Recipient addresses come from booking contacts when omitted.
searchContactscontactsSearch the account address book.
getContactcontactsRetrieve one contact by UUID.
searchWorkspacesearchSearch events, bookings, contacts, invoices, and settlements when the entity type is unknown.
searchInvoicesfinanceSearch invoices. Pass directions for incoming vs outgoing, and paidFrom / paidTo to filter by paid time (not event date).
getInvoicefinanceRetrieve one invoice by UUID, including line items and payments.
listSettlementOperationsfinanceList settlement operations for the account, grouped by booking.
getSettlementDetailfinanceRetrieve one settlement by UUID.
getEventFinancialsfinanceRead planned and actual P&L for an event.
getEventTicketSalesReportticketsTicket sales for an event. Find by eventId or by name and date. Does not open the in-app report.
MCP does not delete events or bookings, and it does not void invoices.
Booking workflow
Creating and sending a booking is three separate tool calls after you have an event UUID.
1. Resolve the event. Use searchEvents or getEvent when the show is already on the calendar. Use createEvent only when it is not.
2. Create a draft. createBooking attaches a draft booking to that event. It does not send email.
3. Attach the recipient. Find the contact with searchContacts, then call addBookingContact.
4. Send the offer. sendBooking emails the offer. Status defaults from Settings → Bookings unless you pass sendStatus.
Permission scopes
Each API key is granted one or more scopes. Events endpoints require one of:
read:eventsscopeRequired for GET /api/events and GET /api/events/:id.
write:eventsscopeRequired for POST, PUT and DELETE against /api/events. Covers delete — there is no separate delete:events scope.
A key with the wildcard * scope has full access to every endpoint. We recommend issuing narrowly-scoped keys per integration.
MCP is a curated account tool list, not a second REST scope catalogue. On an API key, only createEvent requires write:events. Other MCP tools stay available so a booking loop can run without booking or invoice write scopes. 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).
Combine values with commas, e.g. ?include=venue.full,tour,account.
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: You can configure custom event type keys. Currently creating or editing custom event types for your account is only available in the Muzeek web application (Settings), not through the API.
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.
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.
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.
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.