{"openapi":"3.1.0","paths":{"/api/feed/v2":{"get":{"description":"Supports public, personal, calendar, and workspace scopes","operationId":"FeedPublicController_getUnifiedFeed","parameters":[{"name":"scope","required":false,"in":"query","schema":{"enum":["public","personal","calendar","workspace"],"type":"string"}},{"name":"countryCode","required":false,"in":"query","description":"ISO country code (default: DE)","schema":{"type":"string"}},{"name":"cityString","required":false,"in":"query","description":"City string for filtering","schema":{"type":"string"}},{"name":"calendarId","required":false,"in":"query","description":"Calendar ID (required for calendar scope)","schema":{"type":"string"}},{"name":"workspaceId","required":false,"in":"query","description":"Workspace ID (required for workspace scope)","schema":{"type":"string"}},{"name":"categoryIds","required":true,"in":"query","schema":{"type":"string"}},{"name":"categorySlugs","required":true,"in":"query","schema":{"type":"string"}},{"name":"tags","required":true,"in":"query","schema":{"type":"string"}},{"name":"sources","required":true,"in":"query","schema":{"type":"string"}},{"name":"dateFrom","required":true,"in":"query","schema":{"type":"string"}},{"name":"dateTo","required":true,"in":"query","schema":{"type":"string"}},{"name":"freeOnly","required":true,"in":"query","schema":{"type":"string"}},{"name":"search","required":true,"in":"query","schema":{"type":"string"}},{"name":"skip","required":false,"in":"query","schema":{"type":"number"}},{"name":"take","required":false,"in":"query","schema":{"type":"number"}},{"name":"sortBy","required":false,"in":"query","schema":{"enum":["startTime","popularity","relevance","createdAt"],"type":"string"}},{"name":"sortOrder","required":false,"in":"query","schema":{"enum":["asc","desc"],"type":"string"}},{"name":"latitude","required":false,"in":"query","description":"User latitude for geo-filtering","schema":{"type":"number"}},{"name":"longitude","required":false,"in":"query","description":"User longitude for geo-filtering","schema":{"type":"number"}},{"name":"radiusKm","required":false,"in":"query","description":"Radius in km (requires latitude/longitude)","schema":{"type":"number"}},{"name":"eventType","required":false,"in":"query","description":"Event type filter","schema":{"enum":["IN_PERSON","ONLINE","HYBRID"],"type":"string"}},{"name":"purchasable","required":false,"in":"query","description":"Only first-party events purchasable through tockets platform/direct payment","schema":{"type":"boolean"}}],"responses":{"200":{"description":"Feed events returned"}},"summary":"V3.41: Get unified feed with scope support","tags":["feed"],"security":[]}},"/api/feed/v2/capabilities":{"get":{"operationId":"FeedPublicController_getCapabilities","parameters":[{"name":"countryCode","required":false,"in":"query","description":"ISO country code (default: DE)","schema":{"type":"string"}},{"name":"cityString","required":false,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Capabilities returned"}},"summary":"V3.41: Get feed capabilities for a region","tags":["feed"],"security":[]}},"/api/feed/v2/event/{eventId}":{"get":{"operationId":"FeedPublicController_getEventDetails","parameters":[{"name":"eventId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Event details returned"},"404":{"description":"Event not found"}},"summary":"V3.41: Get event details","tags":["feed"],"security":[]}},"/api/feed/v2/filters":{"get":{"operationId":"FeedPublicController_getFilterOptionsV2","parameters":[{"name":"countryCode","required":false,"in":"query","schema":{"type":"string"}},{"name":"cityString","required":false,"in":"query","schema":{"type":"string"}},{"name":"dateFrom","required":false,"in":"query","description":"ISO date — cross-filter: only count events from this date","schema":{"type":"string"}},{"name":"dateTo","required":false,"in":"query","description":"ISO date — cross-filter: only count events until this date","schema":{"type":"string"}},{"name":"categorySlugs","required":false,"in":"query","description":"Comma-separated — cross-filter: only count events in these categories","schema":{"type":"string"}},{"name":"freeOnly","required":false,"in":"query","description":"Cross-filter: only count confirmed free-entry events","schema":{"type":"string"}}],"responses":{"200":{"description":"Filter options returned"}},"summary":"V3.41: Get filter options for a region (supports cross-filtering)","tags":["feed"],"security":[]}},"/api/categories":{"get":{"operationId":"CategoryPublicController_getActiveCategories","parameters":[{"name":"country","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["CategoryPublic"],"security":[]}},"/api/categories/{slug}":{"get":{"operationId":"CategoryPublicController_getCategoryBySlug","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["CategoryPublic"],"security":[]}},"/api/events/public/{workspaceSlug}/{eventSlug}":{"get":{"operationId":"EventAccessController_getPublicEvent","parameters":[{"name":"workspaceSlug","required":true,"in":"path","schema":{"type":"string"}},{"name":"eventSlug","required":true,"in":"path","schema":{"type":"string"}},{"name":"invite","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["EventAccess"],"security":[]}}},"info":{"title":"Tockets.io Public Read API","description":"Unauthenticated read-only API for public event discovery, event details and categories.","version":"1.0.0","contact":{}},"tags":[{"name":"feed","description":"Public event discovery and event details"},{"name":"categories","description":"Public event categories"},{"name":"events","description":"Public event access"}],"servers":[],"components":{"schemas":{"VerifyInviteDto":{"type":"object","properties":{}},"VerifyPasswordDto":{"type":"object","properties":{}},"RecordInteractionDto":{"type":"object","properties":{"eventId":{"type":"string","description":"Event ID"},"interactionType":{"type":"string","description":"Interaction type","enum":["CLICK","BOOKMARK","PURCHASE"]}},"required":["eventId","interactionType"]},"SuppressionListResponseDto":{"type":"object","properties":{}},"ReviewCommunitySubmissionDto":{"type":"object","properties":{"decision":{"type":"string","enum":["APPROVE","REJECT"]},"reason":{"type":"string","description":"Bei REJECT Pflicht. Bei APPROVE Pflicht, wenn ein KI-FLAGGED/REJECTED bewusst ueberstimmt wird — die Begruendung landet im Moderationslog.","maxLength":2000}},"required":["decision"]},"ReviewReportDto":{"type":"object","properties":{"decision":{"type":"string","description":"Review decision","enum":["REVIEWED_VALID","REVIEWED_INVALID","DISMISSED"]},"notes":{"type":"string","description":"Reviewer notes"},"action":{"type":"string","description":"Action to take on the report target"}},"required":["decision"]},"RestoreActivityPostingDto":{"type":"object","properties":{"notes":{"type":"string","description":"Auditable reason for restoring permission"}},"required":["notes"]},"RegionConfigDto":{"type":"object","properties":{"countryCode":{"type":"string","description":"ISO 3166-1 alpha-2 country code","example":"DE"},"cityString":{"type":"string","description":"City string in format \"City, CC\"","example":"Berlin, DE"},"postalCodePrefix":{"type":"string","description":"Postal code prefix (first 2 digits)","example":"10"},"publicFeedEnabled":{"type":"boolean","description":"Override for feed visibility (null = inherit from country config)"},"communityEventsEnabled":{"type":"boolean","description":"Enable community event submissions","default":false},"externalEventsEnabled":{"type":"boolean","description":"Enable external event links","default":false},"requiredTrustLevel":{"type":"string","description":"Minimum trust level required for event submission","enum":["EMAIL_VERIFIED","PHONE_VERIFIED","PAYMENT_VERIFIED"],"default":"PAYMENT_VERIFIED"},"maxEventsPerUserPerWeek":{"type":"number","description":"Max events a user can submit per week","minimum":1,"maximum":100,"default":5},"maxEventsPerUserPerDay":{"type":"number","description":"Max events a user can submit per day","minimum":1,"maximum":20,"default":2}},"required":["communityEventsEnabled","externalEventsEnabled","requiredTrustLevel","maxEventsPerUserPerWeek","maxEventsPerUserPerDay"]},"SubmitEventDto":{"type":"object","properties":{"title":{"type":"string","description":"Event title","minLength":3,"maxLength":200},"description":{"type":"string","description":"Event description"},"startTime":{"format":"date-time","type":"string","description":"Event start time"},"eventEndTime":{"format":"date-time","type":"string","description":"Event end time (optional — many sources publish no end time). When omitted, discovery falls back to startTime to decide if the event is upcoming."},"cityString":{"type":"string","description":"City string (e.g., \"Berlin, DE\")"},"venueName":{"type":"string","description":"Venue name"},"venueStreet":{"type":"string","description":"Venue street address"},"postalCode":{"type":"string","description":"Postal code"},"address":{"type":"string","description":"Legacy full address field. Prefer venueStreet; retained for older clients.","deprecated":true},"latitude":{"type":"number","description":"Latitude coordinate"},"longitude":{"type":"number","description":"Longitude coordinate"},"coverImage":{"type":"string","description":"Event cover image URL"},"tags":{"description":"Event tags","type":"array","items":{"type":"string"}},"categoryIds":{"description":"Category IDs","type":"array","items":{"type":"string"}},"requiresTicket":{"type":"boolean","description":"Whether event requires a ticket","default":false},"admissionPriceIntent":{"type":"string","description":"Z16 F-09: explicit admission price signal. FREE only with conscious consent; missing/UNKNOWN never renders as free. Independent of requiresTicket.","enum":["FREE","PAID","UNKNOWN"],"default":"UNKNOWN"},"externalUrl":{"type":"string","description":"External ticket/event URL. Required when requiresTicket is true. Only absolute http/https URLs without embedded credentials are accepted.","maxLength":2048}},"required":["title","startTime","cityString"]},"CreateReportDto":{"type":"object","properties":{"eventId":{"type":"string","description":"Event ID being reported"},"reason":{"type":"string","description":"Reason for reporting","enum":["SPAM","INAPPROPRIATE_CONTENT","FAKE_EVENT","WRONG_INFORMATION","COPYRIGHT_VIOLATION","OTHER"]},"details":{"type":"string","description":"Additional details about the report"}},"required":["eventId","reason"]},"IngestCycleDto":{"type":"object","properties":{}},"IngestFeedBatchDto":{"type":"object","properties":{}},"IngestFeedBatchResult":{"type":"object","properties":{}},"LinkPublisherIdsBatchDto":{"type":"object","properties":{}},"LinkPublisherIdsBatchResult":{"type":"object","properties":{}},"WithdrawFeedBatchDto":{"type":"object","properties":{}},"WithdrawFeedBatchResult":{"type":"object","properties":{}},"RestoreFeedBatchDto":{"type":"object","properties":{}},"RestoreFeedBatchResult":{"type":"object","properties":{}},"CrawlyImportPreviewResponseDto":{"type":"object","properties":{}},"CrawlyImportExecuteResponseDto":{"type":"object","properties":{}},"RetryCityRegistryGroupDto":{"type":"object","properties":{"cityString":{"type":"string","description":"Event city string, e.g. \"Pelzerhaken, DE\""},"countryCode":{"type":"string","description":"ISO 3166-1 alpha-2 country code"},"isVirtual":{"type":"boolean","default":false}},"required":["cityString"]},"ManualCityResolutionDto":{"type":"object","properties":{"cityString":{"type":"string","description":"Existing event cityString when creating a missing City row"},"displayName":{"type":"string","description":"Canonical display name"},"countryCode":{"type":"string","description":"ISO 3166-1 alpha-2 country code"},"latitude":{"type":"number","minimum":-90,"maximum":90},"longitude":{"type":"number","minimum":-180,"maximum":180},"coordinateSource":{"type":"string","default":"manual-admin"},"providerPlaceId":{"type":"string"},"canonicalizeEvents":{"type":"boolean","description":"Canonicalize matching Event rows to the resolved identity","default":true}},"required":["latitude","longitude"]},"MarkCityRegistryVirtualDto":{"type":"object","properties":{"cityId":{"type":"string","description":"City id when available"},"cityString":{"type":"string","description":"City string to mark non-physical"},"countryCode":{"type":"string","description":"ISO 3166-1 alpha-2 country code"},"confirmCityString":{"type":"string","description":"Must exactly match cityString to confirm the bulk update"}},"required":["cityString","confirmCityString"]},"CreateCategoryDto":{"type":"object","properties":{}},"UpdateCategoryDto":{"type":"object","properties":{}},"ReorderCategoriesDto":{"type":"object","properties":{}}}},"security":[]}