{"openapi":"3.0.0","info":{"version":"1.0.0","title":"Ticker API","description":"Public catalog subset of the Ticker API. Soft-auth: anonymous callers and cookie callers share these paths. Response shapes differ by session (identity vs full) on the event and performer identity GETs and on GET /api/events/{eventId}/prices. Anonymous GET /api/events returns the all-time count with data: []. Anonymous GET /api/events/{eventId}/prices returns 404 when the event is not upcoming or is outside the P1–P3 catalog (same body as an unknown id). Identity GET stays 200 for a past or P4+ id; market is null for a past id (key present, not omitted). indexable is true only for the P1–P3 upcoming admission catalog. Per-IP process limits (not an SLA): identity 60/min; search 30/min; browse 60/min; sitemap 120/min."},"components":{"schemas":{"EventListVenue":{"type":"object","nullable":true,"properties":{"venue_id":{"type":"string"},"venue_name":{"type":"string"},"city":{"type":"string"},"state":{"type":"string","nullable":true}},"required":["venue_id","venue_name","city","state"]},"Event":{"type":"object","properties":{"category_id":{"type":"integer","nullable":true},"created_at":{"type":"string","nullable":true},"date_tbd":{"type":"boolean","nullable":true},"event_id":{"type":"string"},"event_name":{"type":"string"},"if_necessary":{"type":"boolean","nullable":true},"last_price_collected":{"type":"string","nullable":true},"local_date":{"type":"string","nullable":true},"monitoring_priority":{"type":"integer","nullable":true},"onsale_date":{"type":"string","nullable":true},"performer_id":{"type":"integer","nullable":true},"performer_ids":{"type":"array","nullable":true,"items":{"type":"integer"}},"presale1_date":{"type":"string","nullable":true},"static_map_url":{"type":"string","nullable":true},"image_url":{"type":"string","nullable":true},"status":{"type":"string"},"sub_category_id":{"type":"integer","nullable":true},"time_tbd":{"type":"boolean","nullable":true},"tp_event_id":{"type":"string","nullable":true},"updated_at":{"type":"string","nullable":true},"utc_date":{"type":"string","nullable":true},"venue_id":{"type":"string"},"webpath":{"type":"string","nullable":true}},"required":["category_id","created_at","date_tbd","event_id","event_name","if_necessary","last_price_collected","local_date","monitoring_priority","onsale_date","performer_id","performer_ids","presale1_date","static_map_url","status","sub_category_id","time_tbd","updated_at","utc_date","venue_id","webpath"]},"EventListItem":{"allOf":[{"$ref":"#/components/schemas/Event"},{"type":"object","properties":{"venue":{"$ref":"#/components/schemas/EventListVenue"}},"required":["venue"]}]},"PaginatedResponse":{"type":"object","properties":{"total":{"type":"integer"},"page":{"type":"integer"},"limit":{"type":"integer"},"totalPages":{"type":"integer"}},"required":["total","page","limit","totalPages"]},"PaginatedEventListResponse":{"allOf":[{"$ref":"#/components/schemas/PaginatedResponse"},{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/EventListItem"}}},"required":["data"]}]},"AnonymousVenueIdentity":{"type":"object","nullable":true,"properties":{"venue_name":{"type":"string"},"city":{"type":"string","nullable":true},"state":{"type":"string","nullable":true}},"required":["venue_name","city","state"]},"AnonymousPerformerIdentity":{"type":"object","nullable":true,"properties":{"performer_id":{"type":"integer","nullable":true},"name":{"type":"string","nullable":true}},"required":["performer_id","name"]},"AnonymousEventMarket":{"type":"object","properties":{"lowest_price_current":{"type":"number","nullable":true},"lowest_price_delta_7d":{"type":"number","nullable":true},"lowest_price_pct_7d":{"type":"number","nullable":true},"days_to_event":{"type":"number","nullable":true}},"required":["lowest_price_current","lowest_price_delta_7d","lowest_price_pct_7d","days_to_event"]},"AnonymousEventIdentity":{"type":"object","properties":{"event_name":{"type":"string"},"local_date":{"type":"string","nullable":true},"date_tbd":{"type":"boolean","nullable":true},"onsale_date":{"type":"string","nullable":true},"image_url":{"type":"string","nullable":true},"venue":{"$ref":"#/components/schemas/AnonymousVenueIdentity"},"main_performer":{"$ref":"#/components/schemas/AnonymousPerformerIdentity"},"market":{"anyOf":[{"$ref":"#/components/schemas/AnonymousEventMarket"},{"type":"null"}],"description":"Get-in block for an upcoming event. Null when the event is not upcoming. The key stays on the object (ENG-903)."},"indexable":{"type":"boolean","description":"True when the event is in the public P1–P3 upcoming admission catalog. False for P4+, past, and non-admission rows. Identity GET stays 200 either way (ENG-920)."}},"required":["event_name","local_date","date_tbd","onsale_date","image_url","venue","main_performer","market","indexable"]},"AnonymousEventSearchHit":{"allOf":[{"$ref":"#/components/schemas/AnonymousEventIdentity"},{"type":"object","properties":{"event_id":{"type":"string"}},"required":["event_id"]}]},"AnonymousEventSearchResponse":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/AnonymousEventSearchHit"}},"page":{"type":"integer"},"limit":{"type":"integer"},"has_more":{"type":"boolean"}},"required":["data","page","limit","has_more"]},"AnonymousEventListItem":{"type":"object","properties":{"event_id":{"type":"string"},"event_name":{"type":"string"},"local_date":{"type":"string","nullable":true},"date_tbd":{"type":"boolean","nullable":true},"onsale_date":{"type":"string","nullable":true},"presale1_date":{"type":"string","nullable":true},"venue":{"$ref":"#/components/schemas/AnonymousVenueIdentity"},"lowest_price_current":{"type":"number","nullable":true}},"required":["event_id","event_name","local_date","date_tbd","onsale_date","presale1_date","venue","lowest_price_current"]},"AnonymousEventBrowseResponse":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/AnonymousEventListItem"}},"page":{"type":"integer"},"limit":{"type":"integer"},"has_more":{"type":"boolean"}},"required":["data","page","limit","has_more"]},"AnonymousSitemapResponse":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"event_id":{"type":"string"},"event_name":{"type":"string"},"local_date":{"type":"string","nullable":true},"date_tbd":{"type":"boolean","nullable":true},"venue_name":{"type":"string","nullable":true},"city":{"type":"string","nullable":true}},"required":["event_id","event_name","local_date","date_tbd","venue_name","city"]}},"next_cursor":{"type":"string","nullable":true}},"required":["data","next_cursor"]},"Venue":{"type":"object","nullable":true,"properties":{"address_line1":{"type":"string","nullable":true},"capacity":{"type":"integer","nullable":true},"city":{"type":"string"},"country_code":{"type":"string"},"created_at":{"type":"string","nullable":true},"latitude":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true},"phone":{"type":"string","nullable":true},"postal_code":{"type":"string","nullable":true},"revenue_rank":{"type":"integer","nullable":true},"state":{"type":"string","nullable":true},"timezone":{"type":"string"},"updated_at":{"type":"string","nullable":true},"venue_id":{"type":"string"},"venue_name":{"type":"string"}},"required":["address_line1","capacity","city","country_code","created_at","latitude","longitude","phone","postal_code","revenue_rank","state","timezone","updated_at","venue_id","venue_name"]},"Performer":{"type":"object","nullable":true,"properties":{"all_time_revenue_rank":{"type":"integer","nullable":true},"performer_id":{"type":"integer"},"category_id":{"type":"integer","nullable":true},"created_at":{"type":"string","nullable":true},"discovery_status":{"type":"string","nullable":true},"last_refreshed":{"type":"string","nullable":true},"last_x_metrics_check":{"type":"string","nullable":true},"monitoring_priority":{"type":"integer"},"name":{"type":"string","nullable":true},"revenue_rank":{"type":"integer","nullable":true},"subcategory_id":{"type":"integer","nullable":true},"updated_at":{"type":"string","nullable":true},"web_path":{"type":"string","nullable":true},"image_url":{"type":"string","nullable":true},"spotify_url":{"type":"string","nullable":true},"enrichment_source":{"type":"string","nullable":true}},"required":["all_time_revenue_rank","performer_id","category_id","created_at","discovery_status","last_refreshed","last_x_metrics_check","monitoring_priority","name","revenue_rank","subcategory_id","updated_at","web_path"]},"PriceSnapshot":{"type":"object","nullable":true,"properties":{"snapshot_id":{"type":"string"},"event_id":{"type":"string"},"snapshot_time":{"type":"string"},"total_tickets":{"type":"integer"},"total_listings":{"type":"integer"},"lowest_price":{"type":"number"},"highest_price":{"type":"number"},"lowest_aip_price":{"type":"number","nullable":true},"highest_aip_price":{"type":"number","nullable":true},"average_price":{"type":"number","nullable":true},"average_aip_price":{"type":"number","nullable":true},"median_price":{"type":"number","nullable":true},"median_aip_price":{"type":"number","nullable":true},"percent_remaining":{"type":"number","nullable":true},"created_at":{"type":"string","nullable":true}},"required":["snapshot_id","event_id","snapshot_time","total_tickets","total_listings","lowest_price","highest_price","lowest_aip_price","highest_aip_price","average_price","average_aip_price","median_price","median_aip_price","percent_remaining","created_at"]},"EventWithDetails":{"allOf":[{"$ref":"#/components/schemas/Event"},{"type":"object","properties":{"venue":{"$ref":"#/components/schemas/Venue"},"main_performer":{"$ref":"#/components/schemas/Performer"},"associated_performers":{"type":"array","items":{"$ref":"#/components/schemas/Performer"}},"latest_snapshot":{"$ref":"#/components/schemas/PriceSnapshot"}},"required":["venue","main_performer","latest_snapshot"]}]},"EventDetailResponse":{"anyOf":[{"$ref":"#/components/schemas/EventWithDetails"},{"$ref":"#/components/schemas/AnonymousEventIdentity"}]},"AnonymousPricePoint":{"type":"object","properties":{"snapshot_time":{"type":"string"},"lowest_price":{"type":"number","nullable":true},"median_price":{"type":"number","nullable":true},"total_tickets":{"type":"number","nullable":true},"total_listings":{"type":"number","nullable":true}},"required":["snapshot_time","lowest_price","median_price","total_tickets","total_listings"]},"EventPriceHistoryResponse":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/PriceSnapshot"}},{"type":"array","items":{"$ref":"#/components/schemas/AnonymousPricePoint"}}]},"PerformerAnalytics":{"type":"object","nullable":true,"properties":{"performer_id":{"type":"integer","example":123},"avg_likes_current":{"type":"number","nullable":true},"avg_likes_delta_1d":{"type":"number","nullable":true},"avg_likes_delta_7d":{"type":"number","nullable":true},"avg_lowest_price_current":{"type":"number","nullable":true},"avg_lowest_price_delta_1d":{"type":"number","nullable":true},"avg_lowest_price_delta_7d":{"type":"number","nullable":true},"avg_lowest_price_pct_1d":{"type":"number","nullable":true},"avg_lowest_price_pct_7d":{"type":"number","nullable":true},"avg_median_price_current":{"type":"number","nullable":true},"avg_median_price_delta_1d":{"type":"number","nullable":true},"avg_median_price_delta_7d":{"type":"number","nullable":true},"avg_median_price_pct_1d":{"type":"number","nullable":true},"avg_median_price_pct_7d":{"type":"number","nullable":true},"computed_at":{"type":"string","nullable":true},"event_count":{"type":"integer","nullable":true},"likes_current":{"type":"number","nullable":true},"likes_delta_1d":{"type":"number","nullable":true},"likes_delta_7d":{"type":"number","nullable":true},"listings_current":{"type":"integer","nullable":true},"listings_delta_1d":{"type":"integer","nullable":true},"listings_delta_7d":{"type":"integer","nullable":true},"posts_current":{"type":"integer","nullable":true},"posts_delta_1d":{"type":"integer","nullable":true},"posts_delta_7d":{"type":"integer","nullable":true},"price_volatility_14d":{"type":"number","nullable":true},"price_volatility_7d":{"type":"number","nullable":true},"replies_current":{"type":"number","nullable":true},"replies_delta_1d":{"type":"number","nullable":true},"replies_delta_7d":{"type":"number","nullable":true},"retweets_current":{"type":"number","nullable":true},"retweets_delta_1d":{"type":"number","nullable":true},"retweets_delta_7d":{"type":"number","nullable":true},"tickets_current":{"type":"integer","nullable":true},"tickets_delta_1d":{"type":"integer","nullable":true},"tickets_delta_7d":{"type":"integer","nullable":true},"views_current":{"type":"number","nullable":true},"views_delta_1d":{"type":"number","nullable":true},"views_delta_7d":{"type":"number","nullable":true},"social_views_self_z_7d":{"type":"number","nullable":true},"social_likes_self_z_7d":{"type":"number","nullable":true},"social_engagement_self_z_7d":{"type":"number","nullable":true},"social_data_density":{"type":"number","nullable":true},"avg_price_self_z_7d":{"type":"number","nullable":true},"price_data_density":{"type":"number","nullable":true}},"required":["performer_id","avg_likes_current","avg_likes_delta_1d","avg_likes_delta_7d","avg_lowest_price_current","avg_lowest_price_delta_1d","avg_lowest_price_delta_7d","avg_lowest_price_pct_1d","avg_lowest_price_pct_7d","avg_median_price_current","avg_median_price_delta_1d","avg_median_price_delta_7d","avg_median_price_pct_1d","avg_median_price_pct_7d","computed_at","event_count","likes_current","likes_delta_1d","likes_delta_7d","listings_current","listings_delta_1d","listings_delta_7d","posts_current","posts_delta_1d","posts_delta_7d","price_volatility_14d","price_volatility_7d","replies_current","replies_delta_1d","replies_delta_7d","retweets_current","retweets_delta_1d","retweets_delta_7d","tickets_current","tickets_delta_1d","tickets_delta_7d","views_current","views_delta_1d","views_delta_7d"]},"PerformerWithAnalytics":{"allOf":[{"$ref":"#/components/schemas/Performer"},{"type":"object","properties":{"upcoming_events_count":{"type":"integer"},"analytics":{"$ref":"#/components/schemas/PerformerAnalytics"}}}]},"AnonymousPerformerSitemapResponse":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"performer_id":{"type":"integer"},"name":{"type":"string","nullable":true}},"required":["performer_id","name"]}},"next_cursor":{"type":"string","nullable":true}},"required":["data","next_cursor"]},"AnonymousPerformerListItem":{"type":"object","properties":{"performer_id":{"type":"integer"},"name":{"type":"string","nullable":true},"image_url":{"type":"string","nullable":true}},"required":["performer_id","name","image_url"]},"AnonymousPerformerBrowseResponse":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/AnonymousPerformerListItem"}},"page":{"type":"integer"},"limit":{"type":"integer"},"has_more":{"type":"boolean"}},"required":["data","page","limit","has_more"]},"AnonymousPerformerEventsResponse":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/AnonymousEventListItem"}}},"required":["data"]},"PaginatedEventsResponse":{"allOf":[{"$ref":"#/components/schemas/PaginatedResponse"},{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/EventWithDetails"}}},"required":["data"]}]},"PerformerDetailsResponse":{"type":"object","properties":{"performer":{"$ref":"#/components/schemas/PerformerWithAnalytics"},"upcoming_events":{"$ref":"#/components/schemas/PaginatedEventsResponse"}},"required":["performer"]},"AnonymousPerformerDetail":{"type":"object","properties":{"performer_id":{"type":"integer"},"name":{"type":"string","nullable":true},"image_url":{"type":"string","nullable":true},"indexable":{"type":"boolean","description":"True when the performer has monitoring_priority <= 3 and at least one upcoming active admission event. Identity GET stays 200 either way (ENG-920)."}},"required":["performer_id","name","image_url","indexable"]},"PerformerDetailResponse":{"anyOf":[{"$ref":"#/components/schemas/PerformerDetailsResponse"},{"$ref":"#/components/schemas/AnonymousPerformerDetail"}]}}},"paths":{"/api/events":{"get":{"tags":["Events"],"parameters":[{"schema":{"type":"integer","minimum":0,"exclusiveMinimum":true,"default":1,"example":1},"required":false,"name":"page","in":"query"},{"schema":{"type":"integer","minimum":0,"exclusiveMinimum":true,"default":25,"example":25},"required":false,"name":"limit","in":"query"},{"schema":{"type":"string","enum":["local_date","utc_date","event_name","status","monitoring_priority","onsale_date","presale1_date","created_at"],"default":"utc_date","description":"Sort key. Sorting by onsale_date or presale1_date implicitly filters to events where that date is known (IS NOT NULL): only a minority of events carry sale dates, and the supporting indexes are partial — without the filter a DESC sort returns pages of NULLs first. Other sort keys apply no implicit filter.","example":"utc_date"},"required":false,"name":"sortBy","in":"query"},{"schema":{"type":"string","enum":["asc","desc"],"default":"desc","example":"desc"},"required":false,"name":"sortOrder","in":"query"},{"schema":{"type":"string","enum":["active","inactive","cancelled"],"example":"active"},"required":false,"name":"status","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":10,"description":"Filter events by exact monitoring priority (1-10). Prefer monitoring_priority_min/_max for a range; this exact match is kept for back-compat.","example":5},"required":false,"name":"monitoring_priority","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":10,"description":"Lower bound (inclusive) of the monitoring priority range (1-10). 1 = highest priority.","example":1},"required":false,"name":"monitoring_priority_min","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":10,"description":"Upper bound (inclusive) of the monitoring priority range (1-10). 10 = floor (least monitored).","example":10},"required":false,"name":"monitoring_priority_max","in":"query"},{"schema":{"type":"string","example":"a89a9501-31f8-4a6c-932f-378b9533f5b7"},"required":false,"name":"venue_id","in":"query"},{"schema":{"type":"integer","minimum":0,"exclusiveMinimum":true,"example":123},"required":false,"name":"performer_id","in":"query"},{"schema":{"type":"string","format":"date-time","example":"2024-01-01T00:00:00Z"},"required":false,"name":"date_from","in":"query"},{"schema":{"type":"string","format":"date-time","example":"2024-12-31T23:59:59Z"},"required":false,"name":"date_to","in":"query"},{"schema":{"type":"string","format":"date-time","description":"Events Ticker discovered on/after this instant (events.created_at).","example":"2026-07-01T00:00:00Z"},"required":false,"name":"created_from","in":"query"},{"schema":{"type":"string","format":"date-time","description":"Events Ticker discovered on/before this instant (events.created_at).","example":"2026-07-17T23:59:59Z"},"required":false,"name":"created_to","in":"query"},{"schema":{"type":"string","format":"date-time","description":"Events whose public onsale is on/after this instant. Events with no known onsale date are excluded.","example":"2026-07-17T00:00:00Z"},"required":false,"name":"onsale_from","in":"query"},{"schema":{"type":"string","format":"date-time","description":"Events whose public onsale is on/before this instant. Events with no known onsale date are excluded.","example":"2026-07-24T23:59:59Z"},"required":false,"name":"onsale_to","in":"query"},{"schema":{"type":"string","format":"date-time","description":"Events whose first presale is on/after this instant (events.presale1_date). Events with no known presale date are excluded.","example":"2026-07-17T00:00:00Z"},"required":false,"name":"presale_from","in":"query"},{"schema":{"type":"string","format":"date-time","description":"Events whose first presale is on/before this instant (events.presale1_date). Events with no known presale date are excluded.","example":"2026-07-24T23:59:59Z"},"required":false,"name":"presale_to","in":"query"},{"schema":{"type":"boolean","nullable":true,"example":false},"required":false,"name":"include_past","in":"query"},{"schema":{"type":"string","minLength":2,"description":"Case-insensitive partial match on event name (min 2 characters)","example":"taylor swift"},"required":false,"name":"search","in":"query"}],"responses":{"200":{"description":"A paginated list of events. AUTHENTICATED callers get the page of EventListItem rows. ANONYMOUS callers get COUNT ONLY: `data` is [] and `total` is the all-time event count (public marketing lander).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedEventListResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number","example":400},"message":{"type":"string","example":"Bad Request"}},"required":["code","message"]}}}},"504":{"description":"Query timeout.","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number","example":400},"message":{"type":"string","example":"Bad Request"}},"required":["code","message"]}}}}}}},"/api/events/search":{"get":{"tags":["Events"],"parameters":[{"schema":{"type":"string","minLength":2,"maxLength":80,"example":"taylor swift"},"required":true,"name":"q","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":10,"default":1},"required":false,"name":"page","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":20,"default":10},"required":false,"name":"limit","in":"query"}],"responses":{"200":{"description":"Public identity search over upcoming active events. Response keys are exactly the ENG-719 anonymous identity projection plus event_id. No prices, no analytics, no total count.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnonymousEventSearchResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number","example":400},"message":{"type":"string","example":"Bad Request"}},"required":["code","message"]}}}},"504":{"description":"Query timeout.","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number","example":400},"message":{"type":"string","example":"Bad Request"}},"required":["code","message"]}}}}}}},"/api/events/browse":{"get":{"tags":["Events"],"parameters":[{"schema":{"type":"integer","minimum":1,"maximum":100,"default":1},"required":false,"name":"page","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":50,"default":25},"required":false,"name":"limit","in":"query"},{"schema":{"type":"string","minLength":2,"maxLength":80},"required":false,"name":"q","in":"query"},{"schema":{"type":"string","format":"date-time"},"required":false,"name":"date_from","in":"query"},{"schema":{"type":"string","format":"date-time"},"required":false,"name":"date_to","in":"query"},{"schema":{"type":"string","format":"date-time"},"required":false,"name":"onsale_from","in":"query"},{"schema":{"type":"string","format":"date-time"},"required":false,"name":"onsale_to","in":"query"},{"schema":{"type":"string","format":"date-time"},"required":false,"name":"presale_from","in":"query"},{"schema":{"type":"string","format":"date-time"},"required":false,"name":"presale_to","in":"query"},{"schema":{"type":"string","enum":["utc_date","event_name","onsale_date","presale1_date"],"default":"utc_date"},"required":false,"name":"sort","in":"query"},{"schema":{"type":"string","enum":["asc","desc"],"default":"asc"},"required":false,"name":"order","in":"query"}],"responses":{"200":{"description":"Public browse feed of upcoming active events. Rows are the anonymous list projection (identity + sale dates + get-in price); optional name search, event-date / on-sale / pre-sale bounds, and identity-safe sorting. No total count is ever computed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnonymousEventBrowseResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number","example":400},"message":{"type":"string","example":"Bad Request"}},"required":["code","message"]}}}},"504":{"description":"Query timeout.","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number","example":400},"message":{"type":"string","example":"Bad Request"}},"required":["code","message"]}}}}}}},"/api/events/sitemap":{"get":{"tags":["Events"],"parameters":[{"schema":{"type":"string","pattern":"^(\\d{4}-(0[1-9]|1[0-2])|tbd)$","example":"2026-10"},"required":false,"name":"month","in":"query"},{"schema":{"type":"string","pattern":"^\\d{1,10}$","example":"5875873"},"required":false,"name":"after","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":5000,"default":1000},"required":false,"name":"limit","in":"query"}],"responses":{"200":{"description":"Keyset feed of upcoming active event ids + names for sitemap generation, optionally scoped to one utc_date month window (`?month=YYYY-MM`) or the date-TBD bucket (`?month=tbd`). No total count is ever computed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnonymousSitemapResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number","example":400},"message":{"type":"string","example":"Bad Request"}},"required":["code","message"]}}}},"504":{"description":"Query timeout.","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number","example":400},"message":{"type":"string","example":"Bad Request"}},"required":["code","message"]}}}}}}},"/api/events/{eventId}":{"get":{"tags":["Events"],"parameters":[{"schema":{"type":"string","example":"5875873"},"required":true,"name":"eventId","in":"path"}],"responses":{"200":{"description":"Details of a single event. AUTHENTICATED callers get EventWithDetails (main_performer, latest_snapshot; full snapshot history on GET /api/events/{eventId}/prices). ANONYMOUS callers get AnonymousEventIdentity — name, date and venue only, no pricing or analytics (ENG-719). A past or P4+ id stays 200 for anonymous callers; `indexable` is true only for the P1–P3 upcoming admission catalog (ENG-920). `market` is null for a past id (key present, not omitted, ENG-903). Narrow on the shape; do not assume the authenticated one.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventDetailResponse"}}}},"404":{"description":"Event not found.","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number","example":404},"message":{"type":"string","example":"Resource not found"}},"required":["code","message"]}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number","example":400},"message":{"type":"string","example":"Bad Request"}},"required":["code","message"]}}}}}}},"/api/events/{eventId}/prices":{"get":{"tags":["Events"],"parameters":[{"schema":{"type":"string","example":"5875873"},"required":true,"name":"eventId","in":"path"}],"responses":{"200":{"description":"Price history for a single event. AUTHENTICATED callers get full PriceSnapshot rows (tier-capped depth, ENG-146). ANONYMOUS callers get day-grain AnonymousPricePoint rows — snapshot_time + lowest_price only, full depth (ENG-830 owner override). Narrow on the shape. Anonymous callers receive this only for an upcoming active event.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventPriceHistoryResponse"}}}},"404":{"description":"Event not found. Anonymous callers also get this when the event is not upcoming or is outside the P1–P3 public catalog (ENG-903, ENG-920). Same body as an unknown id.","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number","example":404},"message":{"type":"string","example":"Resource not found"}},"required":["code","message"]}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number","example":400},"message":{"type":"string","example":"Bad Request"}},"required":["code","message"]}}}}}}},"/api/performers/sitemap":{"get":{"tags":["Performers"],"parameters":[{"schema":{"type":"string","pattern":"^\\d{1,10}$","example":"10233"},"required":false,"name":"after","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":5000,"default":1000},"required":false,"name":"limit","in":"query"}],"responses":{"200":{"description":"Keyset feed of performer ids + names for sitemap generation. Cohort: performers with at least one upcoming active admission event. No total count is ever computed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnonymousPerformerSitemapResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number","example":400},"message":{"type":"string","example":"Bad Request"}},"required":["code","message"]}}}},"504":{"description":"Query timeout.","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number","example":400},"message":{"type":"string","example":"Bad Request"}},"required":["code","message"]}}}}}}},"/api/performers/browse":{"get":{"tags":["Performers"],"parameters":[{"schema":{"type":"integer","minimum":1,"maximum":100,"default":1},"required":false,"name":"page","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":50,"default":25},"required":false,"name":"limit","in":"query"},{"schema":{"type":"string","minLength":2,"maxLength":80},"required":false,"name":"q","in":"query"},{"schema":{"type":"integer","minimum":0,"exclusiveMinimum":true},"required":false,"name":"category_id","in":"query"},{"schema":{"type":"integer","minimum":0,"exclusiveMinimum":true},"required":false,"name":"subcategory_id","in":"query"}],"responses":{"200":{"description":"Public browse feed of performers with at least one upcoming active admission event, busiest first. Rows are identity only (id, name, image). No total count is ever computed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnonymousPerformerBrowseResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number","example":400},"message":{"type":"string","example":"Bad Request"}},"required":["code","message"]}}}},"504":{"description":"Query timeout.","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number","example":400},"message":{"type":"string","example":"Bad Request"}},"required":["code","message"]}}}}}}},"/api/performers/{performerId}":{"get":{"tags":["Performers"],"parameters":[{"schema":{"type":"integer","minimum":0,"exclusiveMinimum":true,"example":123},"required":true,"name":"performerId","in":"path"}],"responses":{"200":{"description":"Details of a single performer. AUTHENTICATED callers get PerformerDetailsResponse. ANONYMOUS callers get AnonymousPerformerDetail — name and image only, no analytics or rank (ENG-719). `indexable` is true only for P1–P3 performers with an upcoming admission event (ENG-920). Narrow on the shape; do not assume the authenticated one.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PerformerDetailResponse"}}}},"404":{"description":"Performer not found.","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number","example":404},"message":{"type":"string","example":"Resource not found"}},"required":["code","message"]}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number","example":400},"message":{"type":"string","example":"Bad Request"}},"required":["code","message"]}}}}}}},"/api/performers/{performerId}/events":{"get":{"tags":["Performers"],"parameters":[{"schema":{"type":"integer","minimum":0,"exclusiveMinimum":true,"example":123},"required":true,"name":"performerId","in":"path"}],"responses":{"200":{"description":"Upcoming active events for one performer — the anonymous list projection (identity + sale dates + get-in), soonest first, capped. PUBLIC: this is the public performer page's event list and the related-events source on public event pages.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnonymousPerformerEventsResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number","example":400},"message":{"type":"string","example":"Bad Request"}},"required":["code","message"]}}}},"504":{"description":"Query timeout.","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number","example":400},"message":{"type":"string","example":"Bad Request"}},"required":["code","message"]}}}}}}}}}