{"openapi":"3.0.0","paths":{"/api/catalog/places":{"get":{"operationId":"CatalogController_findAll","summary":"List published places with filters","parameters":[],"responses":{"200":{"description":""}},"tags":["Catalog (Public)"]}},"/api/catalog/featured":{"get":{"operationId":"CatalogController_getFeatured","summary":"Get recommended places for homepage","parameters":[],"responses":{"200":{"description":""}},"tags":["Catalog (Public)"]}},"/api/catalog/search":{"get":{"operationId":"CatalogController_search","summary":"Quick search by name","parameters":[{"name":"q","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Catalog (Public)"]}},"/api/catalog/sitemap-urls":{"get":{"operationId":"CatalogController_getSitemapUrls","summary":"All published slugs for sitemap generation (no pagination limit)","parameters":[],"responses":{"200":{"description":""}},"tags":["Catalog (Public)"]}},"/api/catalog/regions/{slug}":{"get":{"operationId":"CatalogController_getRegionPage","summary":"Region page data: region info + latest + recommended places","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Catalog (Public)"]}},"/api/catalog/districts/{slug}":{"get":{"operationId":"CatalogController_getDistrictPage","summary":"District page data: district info + latest + recommended places","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Catalog (Public)"]}},"/api/catalog/cities":{"get":{"operationId":"CatalogController_getPopularCities","summary":"Cities ordered by published places count","parameters":[{"name":"take","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Catalog (Public)"]}},"/api/catalog/cities/{slug}":{"get":{"operationId":"CatalogController_getCityPage","summary":"City page data: city info + latest + recommended places","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Catalog (Public)"]}},"/api/catalog/places/{slug}":{"get":{"operationId":"CatalogController_findOne","summary":"Get single published place by SEO slug","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Catalog (Public)"]}},"/api/catalog/places/{slug}/reviews":{"get":{"operationId":"CatalogController_getReviews","summary":"Get approved reviews for a place","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Catalog (Public)"]},"post":{"operationId":"CatalogController_submitReview","summary":"Submit a review (pending moderation)","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmitReviewDto"}}}},"responses":{"201":{"description":""}},"tags":["Catalog (Public)"]}},"/api/catalog/posts/featured":{"get":{"operationId":"CatalogController_getFeaturedPosts","summary":"Featured posts for homepage (max 10)","parameters":[],"responses":{"200":{"description":""}},"tags":["Catalog (Public)"]}},"/api/catalog/products/featured":{"get":{"operationId":"CatalogController_getFeaturedProducts","summary":"Featured products for homepage (max 10)","parameters":[],"responses":{"200":{"description":""}},"tags":["Catalog (Public)"]}},"/api/catalog/excursions/featured":{"get":{"operationId":"CatalogController_getFeaturedExcursions","summary":"Featured excursions for homepage (max 10)","parameters":[],"responses":{"200":{"description":""}},"tags":["Catalog (Public)"]}},"/api/catalog/posts":{"get":{"operationId":"CatalogController_getPosts","summary":"Public posts list with optional geo filter","parameters":[{"name":"regionName","required":true,"in":"query","schema":{"type":"string"}},{"name":"district","required":true,"in":"query","schema":{"type":"string"}},{"name":"cityName","required":true,"in":"query","schema":{"type":"string"}},{"name":"tag","required":true,"in":"query","schema":{"type":"string"}},{"name":"excludeTag","required":true,"in":"query","schema":{"type":"string"}},{"name":"search","required":true,"in":"query","schema":{"type":"string"}},{"name":"take","required":true,"in":"query","schema":{"type":"string"}},{"name":"page","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Catalog (Public)"]}},"/api/catalog/posts/{slug}":{"get":{"operationId":"CatalogController_getPost","summary":"Single published post by slug","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Catalog (Public)"]}},"/api/catalog/products":{"get":{"operationId":"CatalogController_getProducts","summary":"Public products list with geo filter","parameters":[{"name":"regionName","required":true,"in":"query","schema":{"type":"string"}},{"name":"district","required":true,"in":"query","schema":{"type":"string"}},{"name":"cityName","required":true,"in":"query","schema":{"type":"string"}},{"name":"category","required":true,"in":"query","schema":{"type":"string"}},{"name":"take","required":true,"in":"query","schema":{"type":"string"}},{"name":"page","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Catalog (Public)"]}},"/api/catalog/products/{slug}":{"get":{"operationId":"CatalogController_getProduct","summary":"Single published product by slug","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Catalog (Public)"]}},"/api/catalog/products/{slug}/reviews":{"get":{"operationId":"CatalogController_getProductReviews","summary":"Get approved reviews for a product","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Catalog (Public)"]},"post":{"operationId":"CatalogController_submitProductReview","summary":"Submit a product review (pending moderation)","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmitReviewDto"}}}},"responses":{"201":{"description":""}},"tags":["Catalog (Public)"]}},"/api/catalog/excursions":{"get":{"operationId":"CatalogController_getExcursions","summary":"Public excursions list with geo/type filter","parameters":[{"name":"regionName","required":true,"in":"query","schema":{"type":"string"}},{"name":"district","required":true,"in":"query","schema":{"type":"string"}},{"name":"cityName","required":true,"in":"query","schema":{"type":"string"}},{"name":"type","required":true,"in":"query","schema":{"type":"string"}},{"name":"take","required":true,"in":"query","schema":{"type":"string"}},{"name":"page","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Catalog (Public)"]}},"/api/catalog/excursions/{slug}":{"get":{"operationId":"CatalogController_getExcursion","summary":"Single published excursion by slug","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Catalog (Public)"]}},"/api/catalog/guides":{"get":{"operationId":"CatalogController_getGuides","summary":"Public guides list with geo filter","parameters":[{"name":"regionName","required":true,"in":"query","schema":{"type":"string"}},{"name":"district","required":true,"in":"query","schema":{"type":"string"}},{"name":"cityName","required":true,"in":"query","schema":{"type":"string"}},{"name":"take","required":true,"in":"query","schema":{"type":"string"}},{"name":"page","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Catalog (Public)"]}},"/api/catalog/guides/{slug}":{"get":{"operationId":"CatalogController_getGuide","summary":"Single published guide by slug","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Catalog (Public)"]}},"/api/catalog/events":{"get":{"operationId":"CatalogController_getEvents","summary":"Public events list (upcoming only)","parameters":[{"name":"category","required":true,"in":"query","schema":{"type":"string"}},{"name":"cityName","required":true,"in":"query","schema":{"type":"string"}},{"name":"district","required":true,"in":"query","schema":{"type":"string"}},{"name":"regionName","required":true,"in":"query","schema":{"type":"string"}},{"name":"take","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Catalog (Public)"]}},"/api/catalog/events/upcoming":{"get":{"operationId":"CatalogController_getUpcomingEvents","summary":"Next N upcoming events for homepage carousel","parameters":[{"name":"take","required":true,"in":"query","schema":{"type":"string"}},{"name":"category","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Catalog (Public)"]}},"/api/catalog/events/archive":{"get":{"operationId":"CatalogController_getArchivedEvents","summary":"Archived events (past) with pagination","parameters":[{"name":"page","required":true,"in":"query","schema":{"type":"string"}},{"name":"take","required":true,"in":"query","schema":{"type":"string"}},{"name":"category","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Catalog (Public)"]}},"/api/catalog/events/{slug}":{"get":{"operationId":"CatalogController_getEvent","summary":"Single published event by slug","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Catalog (Public)"]}}},"info":{"title":"Tourinform Zakarpattia — Public Catalog API","description":"Read-only public API for tourist attractions, news, events and excursions in Zakarpattia region. Authentication not required.","version":"1.0","contact":{"email":"tourinform.news@gmail.com","url":"https://tourinform.org.ua/pro-turinform/kontakty"},"license":{"name":"Public read-only"},"x-logo":{"url":"https://tourinform.org.ua/images/logo.png"}},"tags":[],"servers":[{"url":"https://tourinform.org.ua","description":"Production"}],"components":{"securitySchemes":{"bearer":{"scheme":"bearer","bearerFormat":"JWT","type":"http"}},"schemas":{"LoginDto":{"type":"object","properties":{"email":{"type":"string","example":"admin@turinform.ua"},"password":{"type":"string","example":"secret123"}},"required":["email","password"]},"RegisterDto":{"type":"object","properties":{}},"CreateUserDto":{"type":"object","properties":{"name":{"type":"string"},"email":{"type":"string"},"password":{"type":"string"},"role":{"type":"string","enum":["SUPERADMIN","EDITOR","MODERATOR","OWNER","AD_AGENT","USER"],"default":"EDITOR"}},"required":["name","email","password","role"]},"UpdateUserDto":{"type":"object","properties":{}},"LocationDto":{"type":"object","properties":{}},"ScheduleDto":{"type":"object","properties":{}},"ContactDto":{"type":"object","properties":{}},"PricingDto":{"type":"object","properties":{}},"AmenitiesDto":{"type":"object","properties":{}},"PlaceEventsDto":{"type":"object","properties":{}},"PlaceSeoDto":{"type":"object","properties":{}},"HoRecaDetailsDto":{"type":"object","properties":{}},"AccommodationDetailsDto":{"type":"object","properties":{}},"WellnessDetailsDto":{"type":"object","properties":{}},"CultureDetailsDto":{"type":"object","properties":{}},"CreatePlaceDto":{"type":"object","properties":{"nameUa":{"type":"string"},"nameEn":{"type":"string"},"typeId":{"type":"string"},"subtypeIds":{"type":"array","items":{"type":"string"}},"descriptionShortUa":{"type":"string"},"descriptionFullUa":{"type":"string"},"descriptionShortEn":{"type":"string"},"descriptionFullEn":{"type":"string"},"uniqueFeatures":{"type":"string"},"foundedYear":{"type":"number"},"adminNotes":{"type":"string"},"location":{"$ref":"#/components/schemas/LocationDto"},"schedule":{"$ref":"#/components/schemas/ScheduleDto"},"contact":{"$ref":"#/components/schemas/ContactDto"},"pricing":{"$ref":"#/components/schemas/PricingDto"},"amenities":{"$ref":"#/components/schemas/AmenitiesDto"},"events":{"$ref":"#/components/schemas/PlaceEventsDto"},"seo":{"$ref":"#/components/schemas/PlaceSeoDto"},"horecaDetails":{"$ref":"#/components/schemas/HoRecaDetailsDto"},"accommodationDetails":{"$ref":"#/components/schemas/AccommodationDetailsDto"},"wellnessDetails":{"$ref":"#/components/schemas/WellnessDetailsDto"},"cultureDetails":{"$ref":"#/components/schemas/CultureDetailsDto"},"faqItems":{"type":"array","items":{"type":"string"}}},"required":["nameUa","typeId","descriptionShortUa","descriptionFullUa"]},"UpdatePlaceDto":{"type":"object","properties":{"status":{"type":"string","enum":["DRAFT","MODERATION","PUBLISHED","ARCHIVED"]},"isPro":{"type":"boolean"},"proExpiresAt":{"format":"date-time","type":"string"},"isVerifiedOwner":{"type":"boolean"},"isRecommended":{"type":"boolean"},"isTemporarilyClosed":{"type":"boolean"},"displayPriority":{"type":"number"},"adminTags":{"type":"array","items":{"type":"string"}}}},"SubmitReviewDto":{"type":"object","properties":{}},"CreateEventDto":{"type":"object","properties":{}},"UpdateEventDto":{"type":"object","properties":{}},"CreatePostDto":{"type":"object","properties":{}},"UpdatePostDto":{"type":"object","properties":{}},"CreateProductDto":{"type":"object","properties":{}},"UpdateProductDto":{"type":"object","properties":{}},"CreateExcursionDto":{"type":"object","properties":{}},"UpdateExcursionDto":{"type":"object","properties":{}},"CreateGuideDto":{"type":"object","properties":{}},"UpdateGuideDto":{"type":"object","properties":{}},"CreateScenarioDto":{"type":"object","properties":{}},"UpdateScenarioDto":{"type":"object","properties":{}},"CreatePidbirkaDto":{"type":"object","properties":{}},"UpdatePidbirkaDto":{"type":"object","properties":{}},"CreateExpertRecommendationDto":{"type":"object","properties":{}},"UpdateExpertRecommendationDto":{"type":"object","properties":{}},"CreateCouponDto":{"type":"object","properties":{}},"UpdateCouponDto":{"type":"object","properties":{}},"CreateUserCollectionDto":{"type":"object","properties":{}},"UpdateUserCollectionDto":{"type":"object","properties":{}},"CreateBannerDto":{"type":"object","properties":{}},"UpdateBannerDto":{"type":"object","properties":{}}}}}