{"openapi":"3.1.0","info":{"title":"Tessera API","version":"1.0.0","description":"Interactive floor plans, booth sales and wayfinding. Authenticate with `Authorization: Bearer <api key>` (or `X-Api-Key`). Responses are `{ data, meta? }` or `{ error: { code, message, details? } }`. Event ids accept the slug."},"servers":[{"url":"https://event-maps-theta.vercel.app"}],"components":{"securitySchemes":{"apiKey":{"type":"apiKey","in":"header","name":"X-Api-Key"},"bearer":{"type":"http","scheme":"bearer"}}},"tags":[{"name":"Auth"},{"name":"Events"},{"name":"Levels"},{"name":"Booths"},{"name":"Exhibitors"},{"name":"Categories"},{"name":"Sessions"},{"name":"Map"},{"name":"Wayfinding"},{"name":"Sales"},{"name":"Sponsorship"},{"name":"Analytics"},{"name":"Integrations"},{"name":"Webhooks"},{"name":"Media"},{"name":"Compatibility"},{"name":"Public"}],"paths":{"/api/v1/me":{"get":{"summary":"Who am I","tags":["Auth"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[],"responses":{"200":{"description":"Principal { kind, orgId, scopes }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}}},"/api/v1/events":{"get":{"summary":"List events","tags":["Events"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[],"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}},"post":{"summary":"Create event","tags":["Events"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[],"requestBody":{"content":{"application/json":{"schema":{"type":"object","description":"EventInput"}}}},"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}}},"/api/v1/events/{event}":{"get":{"summary":"Get event","tags":["Events"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"}],"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}},"patch":{"summary":"Update event (settings deep-merge)","tags":["Events"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","description":"Partial<EventInput>"}}}},"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}},"delete":{"summary":"Delete event","tags":["Events"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"}],"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}}},"/api/v1/events/{event}/publish":{"post":{"summary":"Publish a new floor plan version","tags":["Events"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","description":"{ note? }"}}}},"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}}},"/api/v1/events/{event}/unpublish":{"post":{"summary":"Set event back to draft","tags":["Events"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"}],"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}}},"/api/v1/events/{event}/duplicate":{"post":{"summary":"Copy the map into a new draft event","tags":["Events"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","description":"{ name, slug?, includeExhibitors? }"}}}},"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}}},"/api/v1/events/{event}/versions":{"get":{"summary":"Published versions","tags":["Events"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"}],"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}}},"/api/v1/events/{event}/bundle":{"get":{"summary":"Full plan bundle (live, or ?published=1)","tags":["Events"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"},{"name":"published","in":"query","required":false,"schema":{"type":"string"},"description":"1 for the last published snapshot"}],"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}}},"/api/v1/events/{event}/export/{format}":{"get":{"summary":"Export: expofp | geojson | booths.csv | exhibitors.csv | bundle | offline","tags":["Events"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"},{"name":"format","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}}},"/api/v1/events/{event}/levels":{"get":{"summary":"List levels","tags":["Levels"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"}],"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}},"post":{"summary":"Create level","tags":["Levels"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","description":"LevelInput"}}}},"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}}},"/api/v1/events/{event}/levels/{id}":{"get":{"summary":"Get level","tags":["Levels"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"},{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}},"patch":{"summary":"Update level","tags":["Levels"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"},{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","description":"Partial<LevelInput>"}}}},"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}},"delete":{"summary":"Delete level","tags":["Levels"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"},{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}}},"/api/v1/events/{event}/levels/reorder":{"post":{"summary":"Reorder levels","tags":["Levels"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","description":"{ ids: string[] }"}}}},"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}}},"/api/v1/events/{event}/booths":{"get":{"summary":"List booths","tags":["Booths"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"},{"name":"levelId","in":"query","required":false,"schema":{"type":"string"}},{"name":"status","in":"query","required":false,"schema":{"type":"string"},"description":"available|held|reserved|sold|unavailable"},{"name":"q","in":"query","required":false,"schema":{"type":"string"},"description":"search label/externalId"},{"name":"exhibitorId","in":"query","required":false,"schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"schema":{"type":"string"}},{"name":"offset","in":"query","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}},"post":{"summary":"Create booth (object) or bulk upsert (array, matched by externalId then label)","tags":["Booths"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","description":"BoothInput | BoothInput[]"}}}},"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}}},"/api/v1/events/{event}/booths/{id}":{"get":{"summary":"Get booth by id, label or externalId","tags":["Booths"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"},{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}},"patch":{"summary":"Update booth","tags":["Booths"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"},{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","description":"Partial<BoothInput>"}}}},"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}},"delete":{"summary":"Delete booth","tags":["Booths"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"},{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}}},"/api/v1/events/{event}/booths/{id}/assign":{"post":{"summary":"Assign an exhibitor","tags":["Booths"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"},{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","description":"{ exhibitorId, markSold? }"}}}},"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}},"put":{"summary":"Replace exhibitors","tags":["Booths"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"},{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","description":"{ exhibitorIds }"}}}},"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}},"delete":{"summary":"Unassign an exhibitor","tags":["Booths"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"},{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","description":"{ exhibitorId }"}}}},"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}}},"/api/v1/events/{event}/booths/{id}/status":{"post":{"summary":"Set status (held takes holdMinutes)","tags":["Booths"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"},{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","description":"{ status: available|held|reserved|sold|unavailable, holdMinutes? }"}}}},"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}}},"/api/v1/events/{event}/booths/{id}/quote":{"get":{"summary":"Public price quote","tags":["Sales"],"security":[],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"},{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}}},"/api/v1/events/{event}/booths/merge":{"post":{"summary":"Merge adjacent booths","tags":["Booths"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","description":"{ boothIds, label? }"}}}},"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}}},"/api/v1/events/{event}/booths/import":{"post":{"summary":"CSV import (label, level, x, y, width, height, type, status, price, external_id, notes)","tags":["Booths"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","description":"{ csv } | multipart file | text/csv"}}}},"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}}},"/api/v1/events/{event}/exhibitors":{"get":{"summary":"List exhibitors","tags":["Exhibitors"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"},{"name":"q","in":"query","required":false,"schema":{"type":"string"}},{"name":"categoryId","in":"query","required":false,"schema":{"type":"string"}},{"name":"levelId","in":"query","required":false,"schema":{"type":"string"}},{"name":"featured","in":"query","required":false,"schema":{"type":"string"},"description":"1|0"},{"name":"unassigned","in":"query","required":false,"schema":{"type":"string"},"description":"1"},{"name":"limit","in":"query","required":false,"schema":{"type":"string"}},{"name":"offset","in":"query","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}},"post":{"summary":"Create (object) or bulk upsert (array; externalId → gripId → name)","tags":["Exhibitors"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","description":"ExhibitorInput | ExhibitorInput[]"}}}},"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}}},"/api/v1/events/{event}/exhibitors/{id}":{"get":{"summary":"Get by id, slug or externalId","tags":["Exhibitors"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"},{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}},"patch":{"summary":"Update exhibitor","tags":["Exhibitors"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"},{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","description":"Partial<ExhibitorInput>"}}}},"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}},"delete":{"summary":"Delete exhibitor","tags":["Exhibitors"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"},{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}}},"/api/v1/events/{event}/exhibitors/{id}/portal-link":{"get":{"summary":"Self-service magic link","tags":["Exhibitors"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"},{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}},"post":{"summary":"Rotate magic link","tags":["Exhibitors"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"},{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}}},"/api/v1/events/{event}/exhibitors/{id}/extras":{"get":{"summary":"Extras held","tags":["Sales"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"},{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}},"post":{"summary":"Assign extra","tags":["Sales"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"},{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","description":"{ extraId, quantity?, boothId? }"}}}},"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}},"delete":{"summary":"Remove extra","tags":["Sales"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"},{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","description":"{ extraId }"}}}},"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}}},"/api/v1/events/{event}/exhibitors/import":{"post":{"summary":"CSV import (ExpoFP template compatible)","tags":["Exhibitors"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","description":"{ csv } | multipart file"}}}},"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}}},"/api/v1/events/{event}/categories":{"get":{"summary":"List categories (with counts)","tags":["Categories"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"}],"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}},"post":{"summary":"Create category","tags":["Categories"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","description":"{ name, color?, parentId?, sortIndex? }"}}}},"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}}},"/api/v1/events/{event}/categories/{id}":{"get":{"summary":"Get category","tags":["Categories"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"},{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}},"patch":{"summary":"Update","tags":["Categories"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"},{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}},"delete":{"summary":"Delete","tags":["Categories"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"},{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}}},"/api/v1/events/{event}/sessions":{"get":{"summary":"List sessions","tags":["Sessions"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"}],"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}},"post":{"summary":"Create (object) or bulk upsert by externalId (array)","tags":["Sessions"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","description":"SessionInput | SessionInput[]"}}}},"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}}},"/api/v1/events/{event}/sessions/{id}":{"get":{"summary":"Get","tags":["Sessions"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"},{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}},"patch":{"summary":"Update","tags":["Sessions"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"},{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}},"delete":{"summary":"Delete","tags":["Sessions"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"},{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}}},"/api/v1/events/{event}/sessions/import":{"post":{"summary":"CSV import","tags":["Sessions"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"}],"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}}},"/api/v1/events/{event}/elements":{"get":{"summary":"List map elements (?levelId)","tags":["Map"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"}],"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}},"post":{"summary":"Create element","tags":["Map"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","description":"{ levelId, kind: wall|line|text|poi|zone|image|shape|entrance|stage|room, geometry, props }"}}}},"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}},"put":{"summary":"Replace a level's elements","tags":["Map"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","description":"{ levelId, elements[] }"}}}},"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}}},"/api/v1/events/{event}/elements/{id}":{"get":{"summary":"Get","tags":["Map"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"},{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}},"patch":{"summary":"Update","tags":["Map"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"},{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}},"delete":{"summary":"Delete","tags":["Map"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"},{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}}},"/api/v1/events/{event}/wayfinding":{"get":{"summary":"Nodes, edges, transitions (?levelId)","tags":["Wayfinding"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"}],"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}},"put":{"summary":"Replace a level's network","tags":["Wayfinding"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","description":"{ levelId, nodes[], edges[] }"}}}},"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}}},"/api/v1/events/{event}/wayfinding/generate":{"post":{"summary":"Auto-generate aisle network from geometry","tags":["Wayfinding"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","description":"{ levelId, cellSize?, clearance?, apply? }"}}}},"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}}},"/api/v1/events/{event}/wayfinding/transitions":{"get":{"summary":"List transitions","tags":["Wayfinding"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"}],"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}},"post":{"summary":"Create transition","tags":["Wayfinding"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","description":"{ name, kind: stairs|escalator|elevator|ramp|door|bridge, accessible, nodeIds[], travelSeconds }"}}}},"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}}},"/api/v1/events/{event}/wayfinding/transitions/{id}":{"patch":{"summary":"Update","tags":["Wayfinding"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"},{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}},"delete":{"summary":"Delete","tags":["Wayfinding"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"},{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}}},"/api/v1/events/{event}/route":{"get":{"summary":"Public routing","tags":["Wayfinding"],"security":[],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"},{"name":"from","in":"query","required":false,"schema":{"type":"string"},"description":"booth:A101 | exhibitor:slug | element:id | point:L1:x,y | A101"},{"name":"to","in":"query","required":false,"schema":{"type":"string"},"description":"…"},{"name":"accessible","in":"query","required":false,"schema":{"type":"string"},"description":"1"},{"name":"via","in":"query","required":false,"schema":{"type":"string"},"description":"repeatable"}],"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}}},"/api/v1/events/{event}/route/optimize":{"post":{"summary":"Public multi-stop optimisation","tags":["Wayfinding"],"security":[],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","description":"{ start, stops[], accessible?, returnToStart? }"}}}},"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}}},"/api/v1/events/{event}/reserve":{"post":{"summary":"Public: reserve/buy a booth","tags":["Sales"],"security":[],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","description":"{ boothId, company, contactName, contactEmail, exhibitorId?, notes?, extras? }"}}}},"responses":{"200":{"description":"{ data }"},"201":{"description":"{ order, checkoutUrl }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}}},"/api/v1/events/{event}/orders":{"get":{"summary":"List orders","tags":["Sales"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"},{"name":"status","in":"query","required":false,"schema":{"type":"string"}},{"name":"boothId","in":"query","required":false,"schema":{"type":"string"}},{"name":"exhibitorId","in":"query","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}}},"/api/v1/events/{event}/orders/summary":{"get":{"summary":"Sales summary","tags":["Sales"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"}],"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}}},"/api/v1/events/{event}/orders/expire":{"post":{"summary":"Expire timed-out holds now","tags":["Sales"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"}],"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}}},"/api/v1/events/{event}/orders/{id}":{"get":{"summary":"Get order","tags":["Sales"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"},{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}},"patch":{"summary":"Update notes/contact/amount","tags":["Sales"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"},{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}}},"/api/v1/events/{event}/orders/{id}/pay":{"post":{"summary":"Mark paid (booth → sold)","tags":["Sales"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"},{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","description":"{ providerRef? }"}}}},"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}}},"/api/v1/events/{event}/orders/{id}/invoice":{"post":{"summary":"Mark invoiced (booth → reserved)","tags":["Sales"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"},{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}}},"/api/v1/events/{event}/orders/{id}/cancel":{"post":{"summary":"Cancel (booth → available)","tags":["Sales"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"},{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","description":"{ reason? }"}}}},"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}}},"/api/v1/events/{event}/orders/{id}/refund":{"post":{"summary":"Refund (booth → available)","tags":["Sales"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"},{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}}},"/api/v1/events/{event}/orders/{id}/checkout":{"get":{"summary":"Public: redirect to Stripe Checkout","tags":["Sales"],"security":[],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"},{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}}},"/api/v1/events/{event}/orders/{id}/mock-pay":{"post":{"summary":"Public (mock provider): simulate payment","tags":["Sales"],"security":[],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"},{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}}},"/api/v1/events/{event}/pricing-rules":{"get":{"summary":"List pricing rules","tags":["Sales"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"}],"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}},"post":{"summary":"Create rule","tags":["Sales"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","description":"{ name, boothType?: standard|corner|peninsula|island|table|shell|sponsor|custom, minAreaM2?, maxAreaM2?, priceCents? | pricePerM2Cents?, currency? }"}}}},"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}}},"/api/v1/events/{event}/pricing-rules/{id}":{"patch":{"summary":"Update","tags":["Sales"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"},{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}},"delete":{"summary":"Delete","tags":["Sales"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"},{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}}},"/api/v1/events/{event}/extras":{"get":{"summary":"Sponsorships & booth extras","tags":["Sales"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"}],"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}},"post":{"summary":"Create extra","tags":["Sales"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","description":"{ kind, name, description?, priceCents?, limitPerEvent?, limitPerExhibitor?, reserveOrBuyAllowed? }"}}}},"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}}},"/api/v1/events/{event}/extras/{id}":{"patch":{"summary":"Update","tags":["Sales"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"},{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}},"delete":{"summary":"Delete","tags":["Sales"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"},{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}}},"/api/v1/events/{event}/banners":{"get":{"summary":"Sponsor banners","tags":["Sponsorship"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"}],"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}},"post":{"summary":"Create banner","tags":["Sponsorship"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","description":"{ placement: search_top|list_inline|map_corner|detail_top|splash, imageUrl, linkUrl?, exhibitorId?, title?, weight?, startsAt?, endsAt?, active? }"}}}},"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}}},"/api/v1/events/{event}/banners/{id}":{"patch":{"summary":"Update","tags":["Sponsorship"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"},{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}},"delete":{"summary":"Delete","tags":["Sponsorship"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"},{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}}},"/api/v1/events/{event}/analytics":{"post":{"summary":"Public: ingest viewer analytics (sendBeacon)","tags":["Analytics"],"security":[],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","description":"{ events: [{ type: view|search|booth_click|exhibitor_view|category_select|route|bookmark|share|custom_button|banner_impression|banner_click|level_switch|position, sessionId?, targetType?, targetId?, query?, levelId?, x?, y?, meta? }] }"}}}},"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}}},"/api/v1/events/{event}/analytics/summary":{"get":{"summary":"Analytics summary","tags":["Analytics"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"},{"name":"from","in":"query","required":false,"schema":{"type":"string"},"description":"ISO"},{"name":"to","in":"query","required":false,"schema":{"type":"string"},"description":"ISO"}],"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}}},"/api/v1/events/{event}/analytics/exhibitors/{id}":{"get":{"summary":"Per-exhibitor stats","tags":["Analytics"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"},{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}}},"/api/v1/events/{event}/integrations/grip/sync":{"post":{"summary":"Sync exhibitors from Grip / a JSON or CSV feed","tags":["Integrations"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","description":"{ sourceUrl?, dryRun? }"}}}},"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}}},"/api/v1/webhooks":{"get":{"summary":"List webhooks","tags":["Webhooks"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[],"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}},"post":{"summary":"Create webhook (secret returned once)","tags":["Webhooks"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[],"requestBody":{"content":{"application/json":{"schema":{"type":"object","description":"{ url, eventId?, events?: [\"*\"] | (booth.created|booth.updated|booth.deleted|booth.status_changed|booth.assigned|booth.unassigned|booth.on_hold|exhibitor.created|exhibitor.updated|exhibitor.deleted|order.created|order.paid|order.cancelled|order.expired|floorplan.published|session.created|session.updated|session.deleted|extra.assigned|extra.removed)[], active? }"}}}},"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}}},"/api/v1/webhooks/{id}":{"patch":{"summary":"Update","tags":["Webhooks"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}},"delete":{"summary":"Delete","tags":["Webhooks"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}}},"/api/v1/webhooks/{id}/test":{"post":{"summary":"Send a test delivery","tags":["Webhooks"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}}},"/api/v1/webhooks/{id}/deliveries":{"get":{"summary":"Recent deliveries","tags":["Webhooks"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}}},"/api/v1/webhooks/process":{"post":{"summary":"Deliver pending/retrying webhooks now","tags":["Webhooks"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[],"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}}},"/api/v1/api-keys":{"get":{"summary":"List API keys","tags":["Auth"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[],"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}},"post":{"summary":"Create key (organiser session only; key returned once)","tags":["Auth"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[],"requestBody":{"content":{"application/json":{"schema":{"type":"object","description":"{ name, scopes? }"}}}},"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}}},"/api/v1/api-keys/{id}":{"delete":{"summary":"Revoke key","tags":["Auth"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}}},"/api/v1/media":{"post":{"summary":"Upload a file (multipart `file`) → { url }","tags":["Media"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[],"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}}},"/api/v1/geocode":{"get":{"summary":"Venue search → [{ name, address, lat, lng, kind }] (event wizard)","tags":["Media"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string"},"description":"venue name or address"}],"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}}},"/api/v1/compat/expofp/{action}":{"post":{"summary":"ExpoFP JSON API v1 compatibility shim (POST, token in body)","description":"Actions: list-events, set-webhook-url, list-exhibitors, bulk-read-exhibitors, get-exhibitor, get-exhibitor-id, add-exhibitor, update-exhibitor, delete-exhibitor, set-exhibitor-logo, set-exhibitor-leading-image, list-booths, get-booth, update-booth, add-exhibitor-booth, remove-exhibitor-booth, list-categories, add-category, update-category, remove-category, list-extras, list-exhibitor-extras, add-exhibitor-extra, remove-exhibitor-extra, sessions/get, sessions/upsert, sessions/delete","tags":["Compatibility"],"security":[{"apiKey":[]},{"bearer":[]}],"parameters":[{"name":"action","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}}},"/e/{event}/data.json":{"get":{"summary":"Public plan bundle (published)","tags":["Public"],"security":[],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"},{"name":"preview","in":"query","required":false,"schema":{"type":"string"},"description":"1 (organiser session) for live data"}],"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}}},"/e/{event}/data.expofp.json":{"get":{"summary":"Public ExpoFP-compatible data.json","tags":["Public"],"security":[],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"}],"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}}},"/e/{event}/version.json":{"get":{"summary":"Published version probe","tags":["Public"],"security":[],"parameters":[{"name":"event","in":"path","required":true,"schema":{"type":"string"},"description":"Event slug or id"}],"responses":{"200":{"description":"{ data }"},"400":{"description":"{ error: { code, message, details? } }"},"401":{"description":"Missing/invalid credentials"},"404":{"description":"Not found"}}}}},"x-webhooks":{"events":["booth.created","booth.updated","booth.deleted","booth.status_changed","booth.assigned","booth.unassigned","booth.on_hold","exhibitor.created","exhibitor.updated","exhibitor.deleted","order.created","order.paid","order.cancelled","order.expired","floorplan.published","session.created","session.updated","session.deleted","extra.assigned","extra.removed"],"signature":"X-Tessera-Signature: t=<unix seconds>,v1=<hex HMAC-SHA256(secret, `${t}.${rawBody}`)>","headers":["X-Tessera-Event","X-Tessera-Delivery"],"retries":"5 attempts, exponential backoff from 30 s"}}