{"openapi":"3.1.0","info":{"title":"Event Manager Public API","version":"1.0.0","description":"# Event Manager Public API\n\nRead-only public API for accessing published event data. The API serves pre-computed, \ndenormalized data built from the dashboard publishing workflow.\n\n## Features\n\n- 🔐 **Secure Authentication** - API key-based authentication\n- ⚡ **High Performance** - Served from pre-built cache\n- 🔍 **Faceted Search** - Keyword search with dynamic filtering and facet navigation (venues, series, packages, date ranges)\n- 📊 **Rich Data** - Comprehensive event and series information with event-specific packages\n\n## Getting Started\n\n1. Create an API key in your organization settings\n2. Include the key in the `x-api-key` header\n3. Start making requests to the API endpoints\n\nFor detailed documentation and examples, visit the interactive documentation below.","contact":{"name":"API Support","email":"support@hosfinder.com"},"license":{"name":"Proprietary"}},"servers":[{"url":"/v1","description":"Current Server"}],"security":[{"apiKey":[]}],"components":{"securitySchemes":{"apiKey":{"type":"apiKey","in":"header","name":"x-api-key","description":"API key for authentication. Create one in your organization settings."}},"responses":{"UnauthorizedError":{"description":"Invalid or missing API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"NotFoundError":{"description":"Requested resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"RateLimitError":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"ValidationError":{"description":"Invalid request parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"schemas":{"SuccessResponse":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","description":"Response data (varies by endpoint)"},"meta":{"$ref":"#/components/schemas/ResponseMeta"}}},"ErrorResponse":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string","enum":["INVALID_API_KEY","RATE_LIMIT_EXCEEDED","RESOURCE_NOT_FOUND","VALIDATION_ERROR","INTERNAL_ERROR"]},"message":{"type":"string"},"details":{"type":"object"}}},"meta":{"$ref":"#/components/schemas/ResponseMeta"}}},"ResponseMeta":{"type":"object","properties":{"timestamp":{"type":"string","format":"date-time"},"request_id":{"type":"string","format":"uuid"}}},"Pagination":{"type":"object","properties":{"total":{"type":"integer","example":100},"page":{"type":"integer","example":1},"page_size":{"type":"integer","example":25},"total_pages":{"type":"integer","example":4}}},"SeriesSummary":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"slug":{"type":"string"},"name":{"type":"string"},"description":{"type":"string","nullable":true},"season":{"type":"string","nullable":true},"heroImageUrl":{"type":"string","format":"uri","nullable":true},"published":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"SeriesDetail":{"allOf":[{"$ref":"#/components/schemas/SeriesSummary"},{"type":"object","properties":{"marketingCopy":{"type":"string","nullable":true},"events":{"type":"array","items":{"$ref":"#/components/schemas/EventSummary"}}}}]},"EventSummary":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"slug":{"type":"string"},"name":{"type":"string"},"shortDescription":{"type":"string","nullable":true},"startsAt":{"type":"string","format":"date-time","nullable":true},"endsAt":{"type":"string","format":"date-time","nullable":true},"heroImageUrl":{"type":"string","format":"uri","nullable":true},"published":{"type":"boolean"},"tags":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"label":{"type":"string"}},"required":["slug","label"]}}}},"EventDetail":{"allOf":[{"$ref":"#/components/schemas/EventSummary"},{"type":"object","properties":{"marketingCopy":{"type":"string","nullable":true},"series":{"$ref":"#/components/schemas/SeriesSummary","nullable":true},"venue":{"type":"object","nullable":true,"properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"city":{"type":"string","nullable":true},"country":{"type":"string","nullable":true}}},"packages":{"type":"array","items":{"$ref":"#/components/schemas/PackageSummary"}}}}]},"SeriesListResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"series":{"type":"array","items":{"$ref":"#/components/schemas/SeriesSummary"}},"pagination":{"$ref":"#/components/schemas/Pagination"}},"required":["series","pagination"]}},"required":["data"]},"SeriesDetailResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"series":{"$ref":"#/components/schemas/SeriesDetail"},"children":{"type":"array","items":{"$ref":"#/components/schemas/SeriesSummary"}},"searchResults":{"type":"object","nullable":true,"description":"Search results when includeSearchResults=true. null if includeSearchResults=false.","properties":{"query":{"type":"string","nullable":true,"description":"The search query that was used"},"events":{"type":"array","items":{"$ref":"#/components/schemas/EventSummary"},"description":"Matching events with enriched package data"},"facets":{"$ref":"#/components/schemas/FacetResponse","description":"Facet counts for venues, series (hierarchical), packages, and date range"},"total":{"type":"integer","description":"Total number of matching events (before pagination)"},"pagination":{"$ref":"#/components/schemas/Pagination","description":"Pagination metadata for the search results"}},"required":["events","total"]}},"required":["series","children"]}},"required":["data"]},"VenueSummary":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"slug":{"type":"string"},"name":{"type":"string"},"displayName":{"type":"string","nullable":true},"city":{"type":"string","nullable":true},"country":{"type":"string","nullable":true},"capacity":{"type":"integer","nullable":true},"published":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"VenueDetail":{"allOf":[{"$ref":"#/components/schemas/VenueSummary"},{"type":"object","properties":{"description":{"type":"string","nullable":true},"addressLine1":{"type":"string","nullable":true},"addressLine2":{"type":"string","nullable":true},"region":{"type":"string","nullable":true},"postcode":{"type":"string","nullable":true},"latitude":{"type":"string","nullable":true},"longitude":{"type":"string","nullable":true},"marketingCopy":{"type":"string","nullable":true},"seoTitle":{"type":"string","nullable":true},"seoDescription":{"type":"string","nullable":true},"events":{"type":"array","items":{"$ref":"#/components/schemas/EventSummary"}},"packages":{"type":"array","items":{"$ref":"#/components/schemas/PackageSummary"}}}}]},"PackageSummary":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"slug":{"type":"string"},"internalName":{"type":"string"},"publicName":{"type":"string"},"publicSubtitle":{"type":"string","nullable":true},"basePrice":{"type":"string","nullable":true},"currency":{"type":"string"},"thumbnailUrl":{"type":"string","format":"uri","nullable":true},"published":{"type":"boolean"}}},"PackageDetail":{"allOf":[{"$ref":"#/components/schemas/PackageSummary"},{"type":"object","properties":{"publicDescription":{"type":"string","nullable":true},"marketingCopy":{"type":"string","nullable":true},"heroImageUrl":{"type":"string","format":"uri","nullable":true},"venue":{"type":"object","nullable":true,"properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"}}}}}]},"EventPackageSummary":{"allOf":[{"$ref":"#/components/schemas/PackageSummary"},{"type":"object","properties":{"linkedToEvent":{"type":"boolean"},"eventSpecific":{"type":"object","nullable":true,"properties":{"customName":{"type":"string","nullable":true},"customDescription":{"type":"string","nullable":true},"customImageUrl":{"type":"string","format":"uri","nullable":true}}}}}]},"EventPackageDetail":{"allOf":[{"$ref":"#/components/schemas/PackageDetail"},{"type":"object","properties":{"linkedToEvent":{"type":"boolean"},"eventSpecific":{"type":"object","nullable":true,"properties":{"customName":{"type":"string","nullable":true},"customDescription":{"type":"string","nullable":true},"customImageUrl":{"type":"string","format":"uri","nullable":true}}}}}]},"EventsListResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"events":{"type":"array","items":{"$ref":"#/components/schemas/EventSummary"}},"pagination":{"$ref":"#/components/schemas/Pagination"}},"required":["events","pagination"]}},"required":["data"]},"EventDetailResponse":{"type":"object","properties":{"data":{"allOf":[{"$ref":"#/components/schemas/EventDetail"},{"type":"object","properties":{"cache_built_at":{"type":"string","format":"date-time","nullable":true}}}]}},"required":["data"]},"SearchResult":{"type":"object","properties":{"type":{"type":"string","enum":["event","series","venue","page","article"]},"score":{"type":"number","format":"float","minimum":0,"maximum":1},"item":{"oneOf":[{"$ref":"#/components/schemas/EventSummary"},{"$ref":"#/components/schemas/SeriesSummary"},{"$ref":"#/components/schemas/VenueSummary"},{"$ref":"#/components/schemas/PageSummary"},{"$ref":"#/components/schemas/ArticleSummary"}]}}},"TypeaheadSuggestion":{"type":"object","description":"A distinct keyword suggestion for autocomplete with navigation link","properties":{"term":{"type":"string","description":"The suggestion text to display (series name, venue name, location, or event name)"},"type":{"type":"string","enum":["series","venue","location"],"description":"Type of suggestion: series (navigates to /series/{slug}), venue (navigates to /venues/{slug}), location (filter only). Event names are returned as series type."},"slug":{"type":"string","description":"URL slug for navigation. Not present for location type.","nullable":true}},"required":["term","type"]},"TypeaheadResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"query":{"type":"string","description":"The search query that was used"},"suggestions":{"type":"array","items":{"$ref":"#/components/schemas/TypeaheadSuggestion"},"description":"Distinct keyword suggestions from series, venues, locations, and events"}},"required":["query","suggestions"]}},"required":["data"]},"MediaSlotItem":{"type":"object","properties":{"assetId":{"type":"string","description":"Asset identifier"},"url":{"type":"string","format":"uri","description":"URL of the media asset"},"alt":{"type":"string","nullable":true,"description":"Alt text for the media"},"focalPoint":{"type":"object","nullable":true,"properties":{"x":{"type":"number"},"y":{"type":"number"}}},"sortOrder":{"type":"integer","nullable":true}},"required":["assetId","url"]},"MediaSlot":{"type":"object","properties":{"slotKey":{"type":"string","description":"Unique key identifying the media slot"},"kind":{"type":"string","enum":["image","pdf","video","audio"],"nullable":true},"items":{"type":"array","items":{"$ref":"#/components/schemas/MediaSlotItem"},"description":"Media items in this slot"}},"required":["slotKey","items"]},"VenueFacet":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"slug":{"type":"string"},"name":{"type":"string"},"count":{"type":"integer","description":"Number of events matching this venue"},"mediaSlots":{"type":"array","items":{"$ref":"#/components/schemas/MediaSlot"},"description":"Media slots with content (only slots that have items are included)"}},"required":["id","slug","name","count"]},"SeriesFacetParent":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"slug":{"type":"string"},"name":{"type":"string"}},"required":["id","slug","name"]},"SeriesFacet":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"slug":{"type":"string"},"name":{"type":"string"},"count":{"type":"integer","description":"Number of events matching this series"},"parent":{"$ref":"#/components/schemas/SeriesFacetParent","nullable":true,"description":"Parent series if this is a child series"},"children":{"type":"array","items":{"$ref":"#/components/schemas/SeriesFacet"},"description":"Child series (same structure as parent facet)"},"mediaSlots":{"type":"array","items":{"$ref":"#/components/schemas/MediaSlot"},"description":"Media slots with content"}},"required":["id","slug","name","count"]},"PackageFacet":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"slug":{"type":"string"},"name":{"type":"string"},"count":{"type":"integer","description":"Number of events matching this package"},"mediaSlots":{"type":"array","items":{"$ref":"#/components/schemas/MediaSlot"},"description":"Media slots with content (only slots that have items are included)"}},"required":["id","slug","name","count"]},"DateRangeFacet":{"type":"object","properties":{"min":{"type":"string","format":"date-time","nullable":true,"description":"Minimum event start date in filtered results"},"max":{"type":"string","format":"date-time","nullable":true,"description":"Maximum event start date in filtered results"}},"required":["min","max"]},"FacetResponse":{"type":"object","properties":{"venues":{"type":"array","items":{"$ref":"#/components/schemas/VenueFacet"},"description":"Available venue facets with event counts"},"series":{"type":"array","items":{"$ref":"#/components/schemas/SeriesFacet"},"description":"Available series facets with hierarchical children (same structure as parent)"},"packages":{"type":"array","items":{"$ref":"#/components/schemas/PackageFacet"},"description":"Available package facets with event counts"},"dateRange":{"$ref":"#/components/schemas/DateRangeFacet","description":"Date range boundaries for filtered events"}},"required":["venues","series","packages","dateRange"]},"ArticleSummary":{"type":"object","description":"Article summary from cache payload","properties":{"id":{"type":"string","format":"uuid"},"slug":{"type":"string"},"title":{"type":"string"},"summary":{"type":"string","nullable":true},"content":{"type":"string","nullable":true},"published":{"type":"boolean"},"authorId":{"type":"string","format":"uuid","nullable":true},"publishedAt":{"type":"string","format":"date-time","nullable":true},"publishedFrom":{"type":"string","format":"date-time","nullable":true},"publishedTo":{"type":"string","format":"date-time","nullable":true},"displayOrder":{"type":"integer"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"mediaSlots":{"type":"array","items":{"type":"object","additionalProperties":true}},"metadataSlots":{"type":"array","items":{"type":"object","additionalProperties":true}},"tags":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"label":{"type":"string"}}}},"merchGroups":{"type":"array","items":{"$ref":"#/components/schemas/MerchGroup"},"description":"Attached merchandising groups"}},"additionalProperties":true},"ArticleDetail":{"allOf":[{"$ref":"#/components/schemas/ArticleSummary"},{"type":"object","description":"Article detail from cache payload","additionalProperties":true}]},"MerchGroup":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"groupName":{"type":"string"},"description":{"type":"string","nullable":true},"outputType":{"type":"string"},"isActive":{"type":"boolean"},"metadata":{"type":"object","additionalProperties":true},"displayOrder":{"type":"integer"}},"required":["id","groupName","outputType","isActive","metadata","displayOrder"]},"PageSummary":{"type":"object","description":"Page summary from cache payload","properties":{"id":{"type":"string","format":"uuid"},"slug":{"type":"string"},"title":{"type":"string"},"content":{"type":"string","nullable":true},"groupPath":{"type":"string","nullable":true},"published":{"type":"boolean"},"authorId":{"type":"string","format":"uuid","nullable":true},"publishedAt":{"type":"string","format":"date-time","nullable":true},"displayOrder":{"type":"integer"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"mediaSlots":{"type":"array","items":{"type":"object","additionalProperties":true}},"metadataSlots":{"type":"array","items":{"type":"object","additionalProperties":true}},"tags":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"label":{"type":"string"}}}},"merchGroups":{"type":"array","items":{"$ref":"#/components/schemas/MerchGroup"},"description":"Attached merchandising groups"}},"additionalProperties":true},"PageDetail":{"allOf":[{"$ref":"#/components/schemas/PageSummary"},{"type":"object","description":"Page detail from cache payload","additionalProperties":true}]},"ArticlesListResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"articles":{"type":"array","items":{"$ref":"#/components/schemas/ArticleSummary"}},"pagination":{"$ref":"#/components/schemas/Pagination"}},"required":["articles","pagination"]}},"required":["data"]},"ArticleDetailResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"article":{"$ref":"#/components/schemas/ArticleDetail"}},"required":["article"]}},"required":["data"]},"PagesListResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"pages":{"type":"array","items":{"$ref":"#/components/schemas/PageSummary"}},"pagination":{"$ref":"#/components/schemas/Pagination"}},"required":["pages","pagination"]}},"required":["data"]},"PageDetailResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"page":{"$ref":"#/components/schemas/PageDetail"}},"required":["page"]}},"required":["data"]},"PackagesListResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"packages":{"type":"array","items":{"$ref":"#/components/schemas/PackageSummary"}},"pagination":{"$ref":"#/components/schemas/Pagination"}},"required":["packages","pagination"]}},"required":["data"]},"MerchandisingGroup":{"type":"object","description":"Merchandising group object with media slots","properties":{"id":{"type":"string","format":"uuid","description":"Group ID"},"name":{"type":"string","description":"Group name"},"description":{"type":"string","nullable":true,"description":"Group description"},"displayOrder":{"type":"integer","description":"Display order for sorting groups"},"isActive":{"type":"boolean","description":"Whether the group is active"},"mediaSlots":{"type":"array","items":{"type":"object"},"description":"Group media slots (empty slots are filtered out)"}},"required":["id","name","displayOrder","isActive","mediaSlots"]},"MerchandisingCampaign":{"type":"object","description":"Full campaign object with metadataSlots, mediaSlots, tags, and search configuration. All campaigns are returned from cache only - campaigns not in cache will not appear in results. Standalone campaigns are supported (group fields null).","properties":{"id":{"type":"string","format":"uuid","description":"Campaign ID"},"slug":{"type":"string","description":"Campaign slug (unique identifier)"},"name":{"type":"string","description":"Campaign name"},"description":{"type":"string","nullable":true,"description":"Campaign description"},"outputType":{"type":"string","description":"Output type slug (maps to frontend rendering component)"},"keywordSearch":{"type":"string","nullable":true,"description":"Keyword search terms for campaign"},"tagSearch":{"type":"string","nullable":true,"description":"Comma-separated tag search terms"},"seriesIds":{"type":"array","items":{"type":"string","format":"uuid"},"nullable":true,"description":"Array of series IDs to filter search results"},"searchStartDate":{"type":"string","format":"date-time","nullable":true,"description":"Start date for search date range filter (ISO 8601)"},"searchEndDate":{"type":"string","format":"date-time","nullable":true,"description":"End date for search date range filter (ISO 8601)"},"title":{"type":"string","nullable":true,"description":"Campaign title/heading"},"caption":{"type":"string","nullable":true,"description":"Campaign caption"},"subText":{"type":"string","nullable":true,"description":"Campaign sub-text"},"ctaText":{"type":"string","nullable":true,"description":"Call-to-action text"},"ctaUrl":{"type":"string","nullable":true,"description":"Call-to-action URL"},"startsAt":{"type":"string","format":"date-time","nullable":true,"description":"Campaign active start date"},"endsAt":{"type":"string","format":"date-time","nullable":true,"description":"Campaign active end date"},"published":{"type":"boolean","description":"Campaign published status"},"displayOrder":{"type":"integer","description":"Display order within group"},"layoutStyle":{"type":"string","enum":["horizontal","grid"],"nullable":true,"description":"Layout style for campaign display"},"autoScroll":{"type":"boolean","nullable":true,"description":"Auto-scroll enabled for media list campaigns"},"isGallery":{"type":"boolean","nullable":true,"description":"Gallery mode enabled for media list campaigns"},"sortOrder":{"type":"string","enum":["date_newest","date_oldest","alphabetical","none"],"nullable":true,"description":"Sort order for search results"},"previewItemCount":{"type":"integer","nullable":true,"description":"Maximum number of search results to return (default: 10, max: 50)"},"metadata":{"type":"object","nullable":true,"description":"Additional campaign metadata"},"metaProps":{"type":"object","nullable":true,"description":"Optional design/presentation hints. Values are string/number; list meta props are stored as strings (selected option).","additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"}]}},"tags":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"label":{"type":"string"}}},"description":"Campaign tags"},"mediaSlots":{"type":"array","items":{"type":"object"},"description":"Campaign media slots (empty slots are filtered out)"},"metadataSlots":{"type":"array","items":{"type":"object"},"description":"Campaign metadata slots (empty slots are filtered out)"},"groupId":{"type":"string","format":"uuid","nullable":true,"description":"Group ID this campaign belongs to (null for standalone campaigns)"},"searchResults":{"type":"object","nullable":true,"description":"Search results when include_search_results=true and campaign has search configuration. null if include_search_results=false or no search config.","properties":{"query":{"type":"string","nullable":true,"description":"Search query used (null if no keyword search)"},"events":{"type":"array","items":{"type":"object"},"description":"Filtered event results (only titles, descriptions, mediaSlots, and tags included)"},"facets":{"type":"object","nullable":true,"description":"Search facets for filtering"}}}},"required":["id","slug","name","outputType","published","displayOrder","tags","mediaSlots","metadataSlots","groupId","searchResults"]},"MerchandisingItem":{"$ref":"#/components/schemas/MerchandisingCampaign","description":"Deprecated: Use MerchandisingCampaign schema instead"},"TestimonialSummary":{"type":"object","description":"Customer testimonial summary","properties":{"id":{"type":"string","format":"uuid"},"slug":{"type":"string"},"source":{"type":"string","description":"Source of the testimonial (e.g., Google, TripAdvisor)"},"authorName":{"type":"string"},"authorLocation":{"type":"string","nullable":true},"rating":{"type":"integer","minimum":1,"maximum":5},"content":{"type":"string"},"reviewDate":{"type":"string","format":"date-time","nullable":true},"featured":{"type":"boolean"},"published":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"tags":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"label":{"type":"string"}}}},"linkedEventIds":{"type":"array","items":{"type":"string","format":"uuid"},"description":"IDs of linked events"},"linkedSeriesIds":{"type":"array","items":{"type":"string","format":"uuid"},"description":"IDs of linked series"},"linkedPackageMasterIds":{"type":"array","items":{"type":"string","format":"uuid"},"description":"IDs of linked package masters"},"linkedVenueIds":{"type":"array","items":{"type":"string","format":"uuid"},"description":"IDs of linked venues"},"events":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"slug":{"type":"string"},"name":{"type":"string"}}},"description":"Linked events with names"},"series":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"slug":{"type":"string"},"name":{"type":"string"}}},"description":"Linked series with names"},"packageMasters":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"slug":{"type":"string"},"name":{"type":"string"}}},"description":"Linked package masters with names"},"venues":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"slug":{"type":"string"},"name":{"type":"string"}}},"description":"Linked venues with names"}},"required":["id","slug","source","authorName","rating","content","published"]},"TestimonialDetail":{"allOf":[{"$ref":"#/components/schemas/TestimonialSummary"},{"type":"object","description":"Testimonial detail from cache payload","additionalProperties":true}]},"TestimonialsListResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"testimonials":{"type":"array","items":{"$ref":"#/components/schemas/TestimonialSummary"}},"pagination":{"$ref":"#/components/schemas/Pagination"}},"required":["testimonials","pagination"]}},"required":["data"]},"TestimonialDetailResponse":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/TestimonialDetail"}},"required":["data"]},"FaqSummary":{"type":"object","description":"FAQ summary","properties":{"id":{"type":"string","format":"uuid"},"slug":{"type":"string"},"question":{"type":"string"},"answer":{"type":"string"},"displayOrder":{"type":"integer"},"published":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"tags":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"label":{"type":"string"}}}},"linkedEventIds":{"type":"array","items":{"type":"string","format":"uuid"},"description":"IDs of linked events"},"linkedPackageIds":{"type":"array","items":{"type":"string","format":"uuid"},"description":"IDs of linked packages"}},"required":["id","slug","question","answer","published"]},"FaqDetail":{"allOf":[{"$ref":"#/components/schemas/FaqSummary"},{"type":"object","description":"FAQ detail from cache payload","additionalProperties":true}]},"FaqsListResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"faqs":{"type":"array","items":{"$ref":"#/components/schemas/FaqSummary"}},"pagination":{"$ref":"#/components/schemas/Pagination"}},"required":["faqs","pagination"]}},"required":["data"]},"FaqDetailResponse":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/FaqDetail"}},"required":["data"]},"BrandQuoteSummary":{"type":"object","description":"Brand position quote summary","properties":{"id":{"type":"string","format":"uuid"},"slug":{"type":"string"},"quote":{"type":"string","description":"The quote text"},"subtitle":{"type":"string","nullable":true,"description":"Optional subtitle or attribution"},"published":{"type":"boolean"},"displayOrder":{"type":"integer"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"tags":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"label":{"type":"string"}}}},"linkedEventIds":{"type":"array","items":{"type":"string","format":"uuid"},"description":"IDs of linked events"},"linkedPackageIds":{"type":"array","items":{"type":"string","format":"uuid"},"description":"IDs of linked packages"}},"required":["id","slug","quote","published"]},"BrandQuoteDetail":{"allOf":[{"$ref":"#/components/schemas/BrandQuoteSummary"},{"type":"object","description":"Brand quote detail from cache payload","additionalProperties":true}]},"BrandQuotesListResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"brandQuotes":{"type":"array","items":{"$ref":"#/components/schemas/BrandQuoteSummary"}},"pagination":{"$ref":"#/components/schemas/Pagination"}},"required":["brandQuotes","pagination"]}},"required":["data"]},"BrandQuoteDetailResponse":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/BrandQuoteDetail"}},"required":["data"]},"NavigationFolder":{"type":"object","nullable":true,"description":"Page folder reference for navigation","properties":{"id":{"type":"string","format":"uuid","description":"Folder ID"},"slug":{"type":"string","description":"Folder slug for URL paths"},"name":{"type":"string","description":"Folder display name"}},"required":["id","slug","name"]},"SiteSettings":{"type":"object","description":"Organization site settings for frontend configuration","properties":{"webAddress":{"type":"string","nullable":true,"description":"Organization website URL"},"telephone":{"type":"string","nullable":true,"description":"Contact telephone number"},"logo":{"type":"object","nullable":true,"description":"Organization logo from media manager","properties":{"url":{"type":"string","format":"uri","description":"Logo image URL"},"alt":{"type":"string","nullable":true,"description":"Alt text for the logo"}},"required":["url"]},"metadataSlots":{"type":"array","description":"Organization-level metadata slots for SEO, Open Graph, Twitter Cards, and structured data defaults","items":{"type":"object","properties":{"slotKey":{"type":"string","description":"Slot key (e.g. seo_title, og_image, twitter_card)"},"label":{"type":"string","description":"Human-readable label"},"fieldType":{"type":"string","description":"Field type (text, textarea, url, image_url, keywords, boolean)"},"required":{"type":"boolean","description":"Whether the slot is required"},"value":{"type":"string","nullable":true,"description":"Current value or null if not set"}},"required":["slotKey","label","fieldType","required"]}},"scripts":{"type":"object","description":"External script injection","properties":{"header":{"type":"string","nullable":true,"description":"Scripts to inject in <head>"},"footer":{"type":"string","nullable":true,"description":"Scripts to inject before </body>"}}},"navigation":{"type":"object","description":"Navigation folder references for header and footer menus","properties":{"headerPagesRootFolder":{"$ref":"#/components/schemas/NavigationFolder","description":"Root folder containing header navigation pages"},"footerPagesRootFolder":{"$ref":"#/components/schemas/NavigationFolder","description":"Root folder containing footer navigation pages"}}}}},"SiteSettingsResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"settings":{"$ref":"#/components/schemas/SiteSettings"}},"required":["settings"]}},"required":["data"]},"MerchandisingListResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"groups":{"type":"array","items":{"$ref":"#/components/schemas/MerchandisingGroup"},"description":"Array of merchandising groups (deduplicated by group ID)"},"campaigns":{"type":"array","items":{"$ref":"#/components/schemas/MerchandisingCampaign"},"description":"Array of campaigns with search results. All campaigns are returned from cache only, including standalone campaigns (groupId null)."},"pagination":{"$ref":"#/components/schemas/Pagination"}},"required":["groups","campaigns","pagination"]}},"required":["data"]}}},"paths":{"/series":{"get":{"summary":"List series","description":"Returns a paginated list of series for the organization. Published series are returned by default; set `include_unpublished=true` to include unpublished records.","operationId":"listSeries","tags":["Series"],"parameters":[{"name":"page","in":"query","description":"Page number","schema":{"type":"integer","minimum":1,"default":1}},{"name":"page_size","in":"query","description":"Number of items per page","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}},{"name":"search","in":"query","description":"Full-text search term for top-level series","schema":{"type":"string","maxLength":200}},{"name":"sort","in":"query","description":"Field to sort by","schema":{"type":"string","enum":["display_order","name","updated_at"],"default":"display_order"}},{"name":"order","in":"query","description":"Sort direction","schema":{"type":"string","enum":["asc","desc"],"default":"asc"}},{"name":"include_unpublished","in":"query","description":"Include unpublished series","schema":{"type":"boolean","default":false}}],"responses":{"200":{"description":"Successfully retrieved series list","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SeriesListResponse"}}}},"401":{"description":"Invalid or missing API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"apiKey":[]}]}},"/series/{slug}":{"get":{"summary":"Get series by slug","description":"Returns detailed information about a specific series including its direct child series. Published content is returned by default; set `include_unpublished=true` to include unpublished records. When `includeSearchResults=true`, use `page` and `page_size` to paginate the search results.","operationId":"getSeriesBySlug","tags":["Series"],"parameters":[{"name":"slug","in":"path","required":true,"description":"Unique slug identifier for the series","schema":{"type":"string"}},{"name":"include_unpublished","in":"query","description":"Include unpublished series and children","schema":{"type":"boolean","default":false}},{"name":"includeSearchResults","in":"query","description":"Include search results filtered by this series slug","schema":{"type":"boolean","default":false}},{"name":"page","in":"query","description":"Page number for search results (only applies when includeSearchResults=true)","schema":{"type":"integer","minimum":1,"maximum":10000,"default":1}},{"name":"page_size","in":"query","description":"Number of search results per page (only applies when includeSearchResults=true)","schema":{"type":"integer","minimum":1,"maximum":50,"default":10}}],"responses":{"200":{"description":"Successfully retrieved series details","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SeriesDetailResponse"}}}},"404":{"description":"Series not found"}},"security":[{"apiKey":[]}]}},"/events":{"get":{"summary":"List events","description":"Returns a paginated list of events with optional filtering. Published events are returned by default; set `include_unpublished=true` to include unpublished records. When `upcoming=true`, the response is limited to the next 20 upcoming events ordered by soonest start time and includes events from descendant series.","operationId":"listEvents","tags":["Events"],"parameters":[{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1}},{"name":"page_size","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}},{"name":"series_slug","in":"query","description":"Filter events by series slug","schema":{"type":"string"}},{"name":"series_id","in":"query","description":"Filter events by series ID","schema":{"type":"string","format":"uuid"}},{"name":"from_date","in":"query","description":"Filter events starting on or after this date (ISO 8601)","schema":{"type":"string","format":"date-time"}},{"name":"to_date","in":"query","description":"Filter events starting on or before this date (ISO 8601)","schema":{"type":"string","format":"date-time"}},{"name":"upcoming","in":"query","description":"If true, return up to the next 20 upcoming events ordered by soonest start time. When combined with `series_slug`/`series_id`, events from descendant series are included.","schema":{"type":"boolean","default":false}},{"name":"sort","in":"query","description":"Field to sort by","schema":{"type":"string","enum":["starts_at","name","updated_at"],"default":"starts_at"}},{"name":"order","in":"query","description":"Sort direction","schema":{"type":"string","enum":["asc","desc"],"default":"asc"}},{"name":"include_unpublished","in":"query","description":"Include unpublished events","schema":{"type":"boolean","default":false}}],"responses":{"200":{"description":"Successfully retrieved events list","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventsListResponse"}}}},"401":{"$ref":"#/components/responses/UnauthorizedError"}},"security":[{"apiKey":[]}]}},"/events/{slug}":{"get":{"summary":"Get event by slug","description":"Returns detailed information about a specific event including packages and venue. Published events are returned by default; set `include_unpublished=true` to include unpublished records.","operationId":"getEventBySlug","tags":["Events"],"parameters":[{"name":"slug","in":"path","required":true,"description":"Unique slug identifier for the event","schema":{"type":"string"}},{"name":"include_unpublished","in":"query","description":"Include unpublished events","schema":{"type":"boolean","default":false}}],"responses":{"200":{"description":"Successfully retrieved event details","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventDetailResponse"}}}},"404":{"description":"Event not found"}},"security":[{"apiKey":[]}]}},"/venues":{"get":{"summary":"List all published venues","description":"Returns a paginated list of all published venues with optional sorting.","operationId":"listVenues","tags":["Venues"],"parameters":[{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1}},{"name":"page_size","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}},{"name":"sort","in":"query","description":"Field to sort by","schema":{"type":"string","enum":["name","city","updated_at"],"default":"name"}},{"name":"order","in":"query","description":"Sort order","schema":{"type":"string","enum":["asc","desc"],"default":"asc"}},{"name":"city","in":"query","description":"Filter venues by city","schema":{"type":"string","maxLength":100}},{"name":"country","in":"query","description":"Filter venues by country","schema":{"type":"string","maxLength":100}}],"responses":{"200":{"description":"Successfully retrieved venues list","content":{"application/json":{"schema":{"type":"object","properties":{"venues":{"type":"array","items":{"$ref":"#/components/schemas/VenueSummary"}},"pagination":{"$ref":"#/components/schemas/Pagination"}}}}}},"401":{"$ref":"#/components/responses/UnauthorizedError"}},"security":[{"apiKey":[]}]}},"/venues/{slug}":{"get":{"summary":"Get venue by slug","description":"Returns detailed information about a specific venue including events and packages. When `includeSearchResults=true`, use `page` and `page_size` to paginate the search results.","operationId":"getVenueBySlug","tags":["Venues"],"parameters":[{"name":"slug","in":"path","required":true,"description":"Unique slug identifier for the venue","schema":{"type":"string"}},{"name":"includeSearchResults","in":"query","description":"Include search results filtered by this venue slug","schema":{"type":"boolean","default":false}},{"name":"page","in":"query","description":"Page number for search results (only applies when includeSearchResults=true)","schema":{"type":"integer","minimum":1,"maximum":10000,"default":1}},{"name":"page_size","in":"query","description":"Number of search results per page (only applies when includeSearchResults=true)","schema":{"type":"integer","minimum":1,"maximum":50,"default":10}}],"responses":{"200":{"description":"Successfully retrieved venue details","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"venue":{"allOf":[{"$ref":"#/components/schemas/VenueSummary"},{"type":"object","properties":{"description":{"type":"string","nullable":true},"addressLine1":{"type":"string","nullable":true},"addressLine2":{"type":"string","nullable":true},"region":{"type":"string","nullable":true},"postcode":{"type":"string","nullable":true},"latitude":{"type":"string","nullable":true},"longitude":{"type":"string","nullable":true},"marketingCopy":{"type":"string","nullable":true},"seoTitle":{"type":"string","nullable":true},"seoDescription":{"type":"string","nullable":true},"packages":{"type":"array","items":{"$ref":"#/components/schemas/PackageSummary"}}}}],"description":"Venue details (events excluded - use searchResults instead)"},"searchResults":{"type":"object","nullable":true,"description":"Search results when includeSearchResults=true. null if includeSearchResults=false.","properties":{"query":{"type":"string","nullable":true,"description":"The search query that was used"},"events":{"type":"array","items":{"$ref":"#/components/schemas/EventSummary"},"description":"Matching events with enriched package data"},"facets":{"$ref":"#/components/schemas/FacetResponse","description":"Facet counts for venues, series (hierarchical), packages, and date range"},"total":{"type":"integer","description":"Total number of matching events (before pagination)"},"pagination":{"$ref":"#/components/schemas/Pagination","description":"Pagination metadata for the search results"}},"required":["events","total"]}},"required":["venue"]}},"required":["data"]}}}},"404":{"description":"Venue not found"}},"security":[{"apiKey":[]}]}},"/packages/{slug}":{"get":{"summary":"Get package by slug","description":"Returns detailed information about a specific package. When includeSearchResults=true, includes search results filtered by this package slug. Use `page` and `page_size` to paginate the search results.","operationId":"getPackageBySlug","tags":["Packages"],"parameters":[{"name":"slug","in":"path","required":true,"description":"Unique slug identifier for the package","schema":{"type":"string"}},{"name":"includeSearchResults","in":"query","description":"Include search results filtered by this package slug","schema":{"type":"boolean","default":false}},{"name":"page","in":"query","description":"Page number for search results (only applies when includeSearchResults=true)","schema":{"type":"integer","minimum":1,"maximum":10000,"default":1}},{"name":"page_size","in":"query","description":"Number of search results per page (only applies when includeSearchResults=true)","schema":{"type":"integer","minimum":1,"maximum":50,"default":10}}],"responses":{"200":{"description":"Successfully retrieved package details","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"package":{"$ref":"#/components/schemas/PackageDetail"},"searchResults":{"type":"object","nullable":true,"description":"Search results when includeSearchResults=true. null if includeSearchResults=false.","properties":{"query":{"type":"string","nullable":true,"description":"The search query that was used"},"events":{"type":"array","items":{"$ref":"#/components/schemas/EventSummary"},"description":"Matching events with enriched package data"},"facets":{"$ref":"#/components/schemas/FacetResponse","description":"Facet counts for venues, series (hierarchical), packages, and date range"},"total":{"type":"integer","description":"Total number of matching events (before pagination)"},"pagination":{"$ref":"#/components/schemas/Pagination","description":"Pagination metadata for the search results"}},"required":["events","total"]}},"required":["package"]}},"required":["data"]}}}},"404":{"description":"Package not found"}},"security":[{"apiKey":[]}]}},"/packages":{"get":{"summary":"List packages","description":"Returns a paginated list of all published packages with optional filtering and sorting.","operationId":"listPackages","tags":["Packages"],"parameters":[{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1}},{"name":"page_size","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}},{"name":"search","in":"query","description":"Search packages by name","schema":{"type":"string","maxLength":200}},{"name":"slug","in":"query","description":"Filter packages by exact slug match","schema":{"type":"string","maxLength":200}},{"name":"is_featured","in":"query","description":"Filter by featured status","schema":{"type":"boolean"}},{"name":"sort","in":"query","description":"Field to sort by","schema":{"type":"string","enum":["name","base_price","display_order"],"default":"display_order"}},{"name":"order","in":"query","description":"Sort direction","schema":{"type":"string","enum":["asc","desc"],"default":"asc"}}],"responses":{"200":{"description":"Successfully retrieved packages list","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PackagesListResponse"}}}},"401":{"$ref":"#/components/responses/UnauthorizedError"}},"security":[{"apiKey":[]}]}},"/articles":{"get":{"summary":"List articles","description":"Returns a paginated list of published articles. Published articles are returned by default; set `include_unpublished=true` to include unpublished records. Articles are filtered by published date range when available.","operationId":"listArticles","tags":["Articles"],"parameters":[{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1}},{"name":"page_size","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}},{"name":"include_unpublished","in":"query","description":"Include unpublished articles","schema":{"type":"boolean","default":false}}],"responses":{"200":{"description":"Successfully retrieved articles list","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ArticlesListResponse"}}}},"401":{"$ref":"#/components/responses/UnauthorizedError"}},"security":[{"apiKey":[]}]}},"/articles/{slug}":{"get":{"summary":"Get article by slug","description":"Returns detailed information about a specific published article.","operationId":"getArticleBySlug","tags":["Articles"],"parameters":[{"name":"slug","in":"path","required":true,"description":"Unique slug identifier for the article","schema":{"type":"string"}}],"responses":{"200":{"description":"Successfully retrieved article details","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ArticleDetailResponse"}}}},"404":{"description":"Article not found"}},"security":[{"apiKey":[]}]}},"/pages":{"get":{"summary":"List pages","description":"Returns a paginated list of published pages. Published pages are returned by default; set `include_unpublished=true` to include unpublished records. Use `group` for exact group path matching, or `group_starts_with` to match a group path and all its children (e.g., `group_starts_with=footer` matches `footer`, `footer/about`, `footer/legal/privacy`, etc.).","operationId":"listPages","tags":["Pages"],"parameters":[{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1}},{"name":"page_size","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}},{"name":"group","in":"query","description":"Filter pages by exact group path match","schema":{"type":"string"}},{"name":"group_starts_with","in":"query","description":"Filter pages by group path prefix (matches exact path and all children). For example, `group_starts_with=footer` matches `footer`, `footer/about`, `footer/legal/privacy`, etc.","schema":{"type":"string"}},{"name":"include_unpublished","in":"query","description":"Include unpublished pages","schema":{"type":"boolean","default":false}}],"responses":{"200":{"description":"Successfully retrieved pages list","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PagesListResponse"}}}},"401":{"$ref":"#/components/responses/UnauthorizedError"}},"security":[{"apiKey":[]}]}},"/pages/{slug}":{"get":{"summary":"Get page by slug","description":"Returns detailed information about a specific published page.","operationId":"getPageBySlug","tags":["Pages"],"parameters":[{"name":"slug","in":"path","required":true,"description":"Unique slug identifier for the page","schema":{"type":"string"}}],"responses":{"200":{"description":"Successfully retrieved page details","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageDetailResponse"}}}},"404":{"description":"Page not found"}},"security":[{"apiKey":[]}]}},"/merchandising":{"get":{"summary":"List merchandising campaigns","description":"Returns cached published merchandising campaigns from api_cache_merchandising only (no source-table queries). Supports standalone campaigns (no group) and grouped campaigns. When include_search_results=true, each campaign automatically executes its configured search (keywordSearch, tagSearch, seriesIds, searchStartDate/searchEndDate) and returns results. Results are ordered by group name, display order, and campaign name. The response includes full group and campaign payloads with mediaSlots, metadataSlots, and tags. Search results use the campaign's previewItemCount if set, otherwise default to 10 (capped at 50). Both group_name and campaign_slug searches return the same complete campaign object structure; standalone campaigns will have group fields null.","operationId":"listMerchandising","tags":["Merchandising"],"parameters":[{"name":"page","in":"query","description":"Page number","schema":{"type":"integer","minimum":1,"default":1}},{"name":"page_size","in":"query","description":"Number of items per page","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}},{"name":"group_name","in":"query","description":"Case-insensitive partial search on merchandising group name","schema":{"type":"string","maxLength":120}},{"name":"campaign_slug","in":"query","description":"Exact match on campaign slug when used alone, or case-insensitive partial match when used with group_name","schema":{"type":"string","maxLength":200}},{"name":"campaign_tags","in":"query","description":"Comma-separated list of tag slugs to filter campaigns by. When provided, response returns campaigns only (no groups).","schema":{"type":"string","maxLength":500}},{"name":"limit","in":"query","description":"Maximum search results per campaign (overridden by campaign's previewItemCount). Only applies when include_search_results=true.","schema":{"type":"integer","minimum":1,"maximum":50,"default":10}},{"name":"include_search_results","in":"query","description":"Whether to execute and include search results for each campaign. Set to true to get events/facets in searchResults. Default: false.","schema":{"type":"boolean","default":false}},{"name":"include_unpublished","in":"query","description":"Include unpublished campaigns and unpublished events in search results. When true, both campaigns and their search results will include unpublished items. Default: false.","schema":{"type":"boolean","default":false}}],"responses":{"200":{"description":"Successfully retrieved merchandising campaigns","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MerchandisingListResponse"}}}},"401":{"$ref":"#/components/responses/UnauthorizedError"}},"security":[{"apiKey":[]}]}},"/search":{"get":{"summary":"Faceted search across cached events","description":"Full-text keyword search across cached event metadata with faceted navigation. Supports filtering by published status, tags, series/venue/package slugs, date ranges, venues, series, and packages. Facets are calculated from filtered results, enabling users to refine searches dynamically. Series filtering includes descendant series (parent/child relationships). Provide at least one of: a query (q), tags, series_slug, venue_slug, package_slug, venue_ids, series_ids, package_ids, or date filters.","operationId":"search","tags":["Search"],"parameters":[{"name":"q","in":"query","required":false,"description":"Search query (optional—provide when you want keyword matching)","schema":{"type":"string","minLength":1,"maxLength":500}},{"name":"limit","in":"query","description":"Maximum number of results to return","schema":{"type":"integer","minimum":1,"maximum":50,"default":10}},{"name":"include_unpublished","in":"query","description":"Include unpublished items in the result set","schema":{"type":"boolean","default":false}},{"name":"include_facets","in":"query","description":"Include facet counts in the response (default: true)","schema":{"type":"boolean","default":true}},{"name":"tags","in":"query","description":"Comma-separated list of tag labels or slugs to match against cached metadata","schema":{"type":"string"}},{"name":"series_slug","in":"query","description":"Filter events by series slug. Finds all events matching the series slug and its descendants.","schema":{"type":"string","pattern":"^[a-z0-9-_]+$"}},{"name":"venue_slug","in":"query","description":"Filter events by venue slug. Finds all events matching this venue.","schema":{"type":"string","pattern":"^[a-z0-9-_]+$"}},{"name":"series_ids","in":"query","description":"Comma-separated list of series UUIDs. Filters events matching any of these series or their descendants.","schema":{"type":"string"}},{"name":"venue_ids","in":"query","description":"Comma-separated list of venue UUIDs. Filters events matching any of these venues.","schema":{"type":"string"}},{"name":"package_ids","in":"query","description":"Comma-separated list of package UUIDs. Filters events that have any of these packages linked.","schema":{"type":"string"}},{"name":"package_slug","in":"query","description":"Filter events by package slug. Finds all events that have this package linked.","schema":{"type":"string","pattern":"^[a-z0-9-_]+$"}},{"name":"from_date","in":"query","description":"ISO 8601 date; filter events starting on or after this date","schema":{"type":"string","format":"date-time"}},{"name":"to_date","in":"query","description":"ISO 8601 date; filter events starting on or before this date","schema":{"type":"string","format":"date-time"}}],"responses":{"200":{"description":"Successfully completed search with faceted results","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"query":{"type":"string","nullable":true,"description":"The search query that was used"},"events":{"type":"array","items":{"$ref":"#/components/schemas/EventSummary"},"description":"Matching events with enriched package data"},"facets":{"$ref":"#/components/schemas/FacetResponse","description":"Facet counts for venues, series (hierarchical), packages, and date range. Only included if include_facets=true."},"total":{"type":"integer","description":"Total number of matching events (before limit is applied)"}},"required":["events","total"]}},"required":["data"]}}}},"400":{"description":"Invalid search parameters"}},"security":[{"apiKey":[]}]}},"/testimonials":{"get":{"summary":"List testimonials","description":"Returns a paginated list of published testimonials. Supports filtering by event, series, package master, venue, tags, rating, source, and full-text search.","operationId":"listTestimonials","tags":["Testimonials"],"parameters":[{"name":"page","in":"query","description":"Page number","schema":{"type":"integer","minimum":1,"default":1}},{"name":"page_size","in":"query","description":"Number of items per page","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}},{"name":"event_id","in":"query","description":"Filter by linked event ID","schema":{"type":"string","format":"uuid"}},{"name":"event_slug","in":"query","description":"Filter by linked event slug","schema":{"type":"string"}},{"name":"series_id","in":"query","description":"Filter by linked series ID","schema":{"type":"string","format":"uuid"}},{"name":"series_slug","in":"query","description":"Filter by linked series slug","schema":{"type":"string"}},{"name":"package_id","in":"query","description":"Filter by linked package master ID","schema":{"type":"string","format":"uuid"}},{"name":"package_slug","in":"query","description":"Filter by linked package master slug","schema":{"type":"string"}},{"name":"venue_id","in":"query","description":"Filter by linked venue ID","schema":{"type":"string","format":"uuid"}},{"name":"venue_slug","in":"query","description":"Filter by linked venue slug","schema":{"type":"string"}},{"name":"tags","in":"query","description":"Comma-separated tag labels or slugs","schema":{"type":"string"}},{"name":"featured","in":"query","description":"Filter by featured status","schema":{"type":"boolean"}},{"name":"min_rating","in":"query","description":"Minimum rating filter (1-5)","schema":{"type":"integer","minimum":1,"maximum":5}},{"name":"source","in":"query","description":"Filter by testimonial source","schema":{"type":"string"}},{"name":"from_date","in":"query","description":"Filter reviews on or after this date (ISO 8601)","schema":{"type":"string","format":"date-time"}},{"name":"to_date","in":"query","description":"Filter reviews on or before this date (ISO 8601)","schema":{"type":"string","format":"date-time"}},{"name":"last_days","in":"query","description":"Filter reviews from last N days","schema":{"type":"integer","minimum":1,"maximum":365}},{"name":"q","in":"query","description":"Full-text search query","schema":{"type":"string","minLength":1,"maxLength":500}},{"name":"sort","in":"query","description":"Sort field","schema":{"type":"string","enum":["review_date","rating","created_at"],"default":"review_date"}},{"name":"order","in":"query","description":"Sort direction","schema":{"type":"string","enum":["asc","desc"],"default":"desc"}},{"name":"include_unpublished","in":"query","description":"Include unpublished testimonials","schema":{"type":"boolean","default":false}}],"responses":{"200":{"description":"Successfully retrieved testimonials list","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestimonialsListResponse"}}}},"401":{"$ref":"#/components/responses/UnauthorizedError"}},"security":[{"apiKey":[]}]}},"/testimonials/{slug}":{"get":{"summary":"Get testimonial by slug","description":"Returns detailed information about a specific testimonial.","operationId":"getTestimonialBySlug","tags":["Testimonials"],"parameters":[{"name":"slug","in":"path","required":true,"description":"Unique slug identifier for the testimonial","schema":{"type":"string"}}],"responses":{"200":{"description":"Successfully retrieved testimonial details","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestimonialDetailResponse"}}}},"404":{"description":"Testimonial not found"}},"security":[{"apiKey":[]}]}},"/faqs":{"get":{"summary":"List FAQs","description":"Returns a paginated list of published FAQs. Supports filtering by event, package, tags, and full-text search.","operationId":"listFaqs","tags":["FAQs"],"parameters":[{"name":"page","in":"query","description":"Page number","schema":{"type":"integer","minimum":1,"default":1}},{"name":"page_size","in":"query","description":"Number of items per page","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}},{"name":"event_id","in":"query","description":"Filter by linked event ID","schema":{"type":"string","format":"uuid"}},{"name":"event_slug","in":"query","description":"Filter by linked event slug","schema":{"type":"string"}},{"name":"package_id","in":"query","description":"Filter by linked package ID","schema":{"type":"string","format":"uuid"}},{"name":"package_slug","in":"query","description":"Filter by linked package slug","schema":{"type":"string"}},{"name":"tags","in":"query","description":"Comma-separated tag labels or slugs","schema":{"type":"string"}},{"name":"q","in":"query","description":"Full-text search query","schema":{"type":"string","minLength":1,"maxLength":500}},{"name":"sort","in":"query","description":"Sort field","schema":{"type":"string","enum":["created_at","display_order"],"default":"display_order"}},{"name":"order","in":"query","description":"Sort direction","schema":{"type":"string","enum":["asc","desc"],"default":"asc"}},{"name":"include_unpublished","in":"query","description":"Include unpublished FAQs","schema":{"type":"boolean","default":false}}],"responses":{"200":{"description":"Successfully retrieved FAQs list","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FaqsListResponse"}}}},"401":{"$ref":"#/components/responses/UnauthorizedError"}},"security":[{"apiKey":[]}]}},"/faqs/{slug}":{"get":{"summary":"Get FAQ by slug","description":"Returns detailed information about a specific FAQ.","operationId":"getFaqBySlug","tags":["FAQs"],"parameters":[{"name":"slug","in":"path","required":true,"description":"Unique slug identifier for the FAQ","schema":{"type":"string"}}],"responses":{"200":{"description":"Successfully retrieved FAQ details","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FaqDetailResponse"}}}},"404":{"description":"FAQ not found"}},"security":[{"apiKey":[]}]}},"/brand-quotes":{"get":{"summary":"List brand quotes","description":"Returns a paginated list of published brand position quotes. Supports filtering by event, package, tags, and full-text search.","operationId":"listBrandQuotes","tags":["Brand Quotes"],"parameters":[{"name":"page","in":"query","description":"Page number","schema":{"type":"integer","minimum":1,"default":1}},{"name":"page_size","in":"query","description":"Number of items per page","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}},{"name":"event_id","in":"query","description":"Filter by linked event ID","schema":{"type":"string","format":"uuid"}},{"name":"event_slug","in":"query","description":"Filter by linked event slug","schema":{"type":"string"}},{"name":"package_id","in":"query","description":"Filter by linked package ID","schema":{"type":"string","format":"uuid"}},{"name":"package_slug","in":"query","description":"Filter by linked package slug","schema":{"type":"string"}},{"name":"tags","in":"query","description":"Comma-separated tag labels or slugs","schema":{"type":"string"}},{"name":"q","in":"query","description":"Full-text search query","schema":{"type":"string","minLength":1,"maxLength":500}},{"name":"sort","in":"query","description":"Sort field","schema":{"type":"string","enum":["created_at","display_order"],"default":"display_order"}},{"name":"order","in":"query","description":"Sort direction","schema":{"type":"string","enum":["asc","desc"],"default":"asc"}},{"name":"include_unpublished","in":"query","description":"Include unpublished brand quotes","schema":{"type":"boolean","default":false}}],"responses":{"200":{"description":"Successfully retrieved brand quotes list","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrandQuotesListResponse"}}}},"401":{"$ref":"#/components/responses/UnauthorizedError"}},"security":[{"apiKey":[]}]}},"/brand-quotes/{slug}":{"get":{"summary":"Get brand quote by slug","description":"Returns detailed information about a specific brand position quote.","operationId":"getBrandQuoteBySlug","tags":["Brand Quotes"],"parameters":[{"name":"slug","in":"path","required":true,"description":"Unique slug identifier for the brand quote","schema":{"type":"string"}}],"responses":{"200":{"description":"Successfully retrieved brand quote details","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrandQuoteDetailResponse"}}}},"404":{"description":"Brand quote not found"}},"security":[{"apiKey":[]}]}},"/typeahead":{"get":{"summary":"Distinct keyword suggestions for autocomplete","description":"Returns distinct keyword suggestions for autocomplete dropdowns. Searches across series names (full hierarchy including parents), venue names, locations (city/country), and event names. Each suggestion includes a type and slug for direct navigation. Suggestions are deduplicated (case-insensitive) and ranked by prefix match, then similarity score.","operationId":"typeahead","tags":["Typeahead"],"parameters":[{"name":"q","in":"query","required":true,"description":"Search query string (partial match supported)","schema":{"type":"string","minLength":1,"maxLength":200}},{"name":"limit","in":"query","description":"Maximum number of suggestions to return","schema":{"type":"integer","minimum":1,"maximum":15,"default":15}},{"name":"include_unpublished","in":"query","description":"Include suggestions from unpublished content","schema":{"type":"boolean","default":false}}],"responses":{"200":{"description":"Successfully retrieved typeahead suggestions","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TypeaheadResponse"},"example":{"data":{"query":"eng","suggestions":[{"term":"England v Sri Lanka","type":"series","slug":"england-v-sri-lanka"},{"term":"England v Pakistan","type":"series","slug":"england-v-pakistan"},{"term":"England v Sri Lanka ODI","type":"series","slug":"england-v-sri-lanka"},{"term":"The Oval","type":"venue","slug":"the-oval"},{"term":"London","type":"location"}]}}}}},"400":{"description":"Invalid query parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"$ref":"#/components/responses/UnauthorizedError"}},"security":[{"apiKey":[]}]}},"/settings":{"get":{"summary":"Get site settings","description":"Returns organization site settings including contact information, SEO defaults, logo, and external scripts configuration. Use this endpoint to configure your frontend with organization-specific settings.","operationId":"getSettings","tags":["Settings"],"responses":{"200":{"description":"Successfully retrieved site settings","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteSettingsResponse"},"example":{"data":{"settings":{"webAddress":"https://www.example.com","telephone":"+44 123 456 7890","logo":{"url":"https://cdn.example.com/logo.png","alt":"Organization Logo"},"metadataSlots":[{"slotKey":"seo_title","label":"SEO Title","fieldType":"text","required":false,"value":"My Event Site"},{"slotKey":"seo_description","label":"SEO Description","fieldType":"textarea","required":false,"value":"Premium event experiences and hospitality packages"},{"slotKey":"og_image","label":"OG Image","fieldType":"image_url","required":false,"value":"https://cdn.example.com/share.jpg"}],"scripts":{"header":"<!-- Google Analytics -->","footer":"<!-- Chat widget -->"},"navigation":{"headerPagesRootFolder":{"id":"550e8400-e29b-41d4-a716-446655440000","slug":"header-pages","name":"Header Navigation"},"footerPagesRootFolder":{"id":"550e8400-e29b-41d4-a716-446655440001","slug":"footer-pages","name":"Footer Navigation"}}}}}}}},"401":{"$ref":"#/components/responses/UnauthorizedError"}},"security":[{"apiKey":[]}]}}},"tags":[{"name":"Series","description":"Event series management and retrieval"},{"name":"Events","description":"Individual event information and listings"},{"name":"Venues","description":"Venue information, events, and packages"},{"name":"Packages","description":"Hospitality package offerings"},{"name":"Articles","description":"Article content and listings"},{"name":"Pages","description":"Page content and listings"},{"name":"Merchandising","description":"Campaign merchandising configuration and assets"},{"name":"Search","description":"Faceted search with keyword matching and dynamic filtering across events"},{"name":"Typeahead","description":"Distinct keyword suggestions for autocomplete from series, venues, locations, and events"},{"name":"Testimonials","description":"Customer testimonials and reviews"},{"name":"FAQs","description":"Frequently asked questions"},{"name":"Brand Quotes","description":"Brand position quotes for marketing content"},{"name":"Settings","description":"Organization site settings including contact info, SEO defaults, and external scripts"}]}