{"openapi":"3.1.0","info":{"title":"Gmina Dopiewo API","description":"\nOfficial public API for accessing Gmina Dopiewo municipal data. This API provides access to:\n- News articles and announcements\n- Events and calendar\n- Places of interest and locations\n- Questions to the Mayor\n- Full-text search across all content\n- Aggregated dashboard data\n- BIP (Public Information Bulletin) - news and Mayor's Executive Orders\n- Planning Permissions (Warunki Zabudowy) - building conditions and permits\n- Public Consultations (Konsultacje Społeczne) - civic engagement and community feedback\n\nPublic endpoints (articles, events, places, questions, dashboard, search, statistics, BIP, planning permissions, consultations) are **freely accessible** without authentication.\n\nAdministrative endpoints require API key authentication. Contact **api@dopiewo.pl** for access.\n\n- **Technical Support**: api@dopiewo.pl\n- **Website**: https://dopiewo.pl\n- **Documentation**: https://api.dopiewo.pl/docs\n    ","contact":{"name":"Gmina Dopiewo - IT Department","url":"https://dopiewo.pl/","email":"api@dopiewo.pl"},"license":{"name":"Creative Commons Attribution 4.0 (CC BY 4.0)","url":"https://creativecommons.org/licenses/by/4.0/"},"version":"1.0.0"},"servers":[{"url":"https://api.dopiewo.pl","description":"Production server"}],"paths":{"/health":{"get":{"tags":["health"],"summary":"Application health check","description":"Check if the application is running and healthy","operationId":"health_check_health_get","responses":{"200":{"description":"Health status","content":{"application/json":{"schema":{}}}}}}},"/health/redis":{"get":{"tags":["health"],"summary":"Redis health check","description":"Check Redis cache connectivity and status","operationId":"redis_health_check_health_redis_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/health/drupal":{"get":{"tags":["health"],"summary":"Drupal backend health check","description":"Check connectivity to Drupal JSON:API backend","operationId":"drupal_health_check_health_drupal_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/health/bip":{"get":{"tags":["health"],"summary":"BIP API health check","description":"Check connectivity to BIP Dopiewo API","operationId":"bip_health_check_health_bip_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/health/all":{"get":{"tags":["health"],"summary":"Complete system health check","description":"Check health of all services (application, Redis, Drupal, BIP)","operationId":"complete_health_check_health_all_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/api-keys":{"post":{"tags":["admin"],"summary":"Create new API key","description":"Generate a new API key with custom settings. The key is shown only once!","operationId":"create_api_key_admin_api_keys_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIKeyCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIKeyCreateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"ApiKeyAuth":[]}]},"get":{"tags":["admin"],"summary":"List all API keys","description":"Retrieve a list of all API keys (without the actual keys)","operationId":"list_api_keys_admin_api_keys_get","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIKeyList"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"ApiKeyAuth":[]}]}},"/admin/api-keys/{key_id}":{"get":{"tags":["admin"],"summary":"Get API key details","description":"Retrieve detailed information about a specific API key","operationId":"get_api_key_admin_api_keys__key_id__get","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIKeyResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"ApiKeyAuth":[]}]},"put":{"tags":["admin"],"summary":"Update API key","description":"Update API key metadata (name, rate limit, active status)","operationId":"update_api_key_admin_api_keys__key_id__put","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIKeyUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIKeyResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"ApiKeyAuth":[]}]},"delete":{"tags":["admin"],"summary":"Delete API key","description":"Revoke and delete an API key permanently","operationId":"delete_api_key_admin_api_keys__key_id__delete","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"ApiKeyAuth":[]}]}},"/admin/api-keys/{key_id}/rotate":{"post":{"tags":["admin"],"summary":"Rotate API key","description":"Create a new key with the same settings and revoke the old one","operationId":"rotate_api_key_admin_api_keys__key_id__rotate_post","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIKeyCreateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"ApiKeyAuth":[]}]}},"/admin/cache/stats":{"get":{"tags":["admin","admin","cache"],"summary":"Get cache statistics","description":"Returns comprehensive cache statistics including hit rates, memory usage, and key counts","operationId":"get_cache_stats_admin_cache_stats_get","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"ApiKeyAuth":[]}]}},"/admin/cache/keys":{"get":{"tags":["admin","admin","cache"],"summary":"List cache keys","description":"Returns list of cache keys matching the specified pattern","operationId":"list_cache_keys_admin_cache_keys_get","parameters":[{"name":"pattern","in":"query","required":false,"schema":{"type":"string","default":"cache:*","title":"Pattern"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"ApiKeyAuth":[]}]}},"/admin/cache/inspect/{key}":{"get":{"tags":["admin","admin","cache"],"summary":"Inspect cache entry","description":"Returns detailed information about a specific cache entry","operationId":"inspect_cache_entry_admin_cache_inspect__key__get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"ApiKeyAuth":[]}]}},"/admin/cache/invalidate":{"post":{"tags":["admin","admin","cache"],"summary":"Invalidate cache patterns","description":"Deletes cache entries matching the specified patterns","operationId":"invalidate_cache_admin_cache_invalidate_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"array","items":{"type":"string"},"title":"Patterns"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"ApiKeyAuth":[]}]}},"/admin/cache/clear":{"post":{"tags":["admin","admin","cache"],"summary":"Clear cache","description":"Clears all cache entries with the specified prefix (DANGEROUS)","operationId":"clear_cache_admin_cache_clear_post","parameters":[{"name":"prefix","in":"query","required":false,"schema":{"type":"string","default":"cache:","title":"Prefix"}},{"name":"confirm","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Confirm"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"ApiKeyAuth":[]}]}},"/admin/cache/warm":{"post":{"tags":["admin","admin","cache"],"summary":"Warm cache","description":"Pre-populates cache with frequently accessed content (Phase 4)","operationId":"warm_cache_admin_cache_warm_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Endpoints"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"ApiKeyAuth":[]}]}},"/api/v1/articles":{"get":{"tags":["articles"],"summary":"Get paginated list of articles","description":"Retrieve a paginated list of published articles sorted by creation date (newest first).\n\n## Features\n\n- **Pagination**: Support for up to 100 items per page\n- **Simplified Format**: Returns clean JSON (not JSON:API format)\n- **Categories**: Includes article categories and type\n- **URLs**: Full URLs to article pages on dopiewo.pl\n\n## Use Cases\n\n- Homepage article feed\n- News section pagination\n- Mobile app article list\n- RSS feed generation\n- Content aggregation","operationId":"get_articles_api_v1_articles_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"description":"Page number (1-indexed)","default":1,"title":"Page"},"description":"Page number (1-indexed)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Items per page (max 100)","default":20,"title":"Limit"},"description":"Items per page (max 100)"}],"responses":{"200":{"description":"Successfully retrieved articles","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ArticleListResponse"},"example":{"items":[{"id":"8ad9d9ab-8a92-4fba-b129-13bb6d36353c","title":"Projekt budżetu na 2026 rok","summary":"W przygotowanym projekcie budżetu Gminy Dopiewo na rok 2026...","published_at":"2025-11-14T19:46:58+00:00","updated_at":"2025-11-14T20:33:23+00:00","url":"https://dopiewo.pl/aktualnosci/2025-11-14/projekt-budzetu-na-2026-rok","categories":["Komunikaty urzędowe","Finanse"]},{"id":"7ad9d9ab-8a92-4fba-b129-13bb6d36353c","title":"Municipality News Update","summary":"Latest updates from the municipality...","published_at":"2025-11-13T21:43:10+00:00","updated_at":"2025-11-14T08:49:25+00:00","url":"https://dopiewo.pl/aktualnosci/2025-11-13/news","categories":["News"]}],"pagination":{"page":1,"per_page":20,"total":881,"total_pages":45,"has_next":true,"has_prev":false},"links":{"self":"https://api.dopiewo.pl/api/v1/articles?limit=20&page=1","first":"https://api.dopiewo.pl/api/v1/articles?limit=20&page=1","last":"https://api.dopiewo.pl/api/v1/articles?limit=20&page=45","next":"https://api.dopiewo.pl/api/v1/articles?limit=20&page=2"}}}}},"400":{"description":"Invalid parameters","content":{"application/json":{"example":{"error":"validation_error","message":"Page must be greater than 0","error-code":2,"error-solution":"Check that page parameter is >= 1 and limit is between 1-100","error-help":"https://api.dopiewo.pl/docs/errors/2"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"example":{"error":"rate_limit_exceeded","message":"Too many requests. Please try again later.","error-code":5,"error-solution":"Wait for the rate limit window to reset before making more requests","error-help":"https://api.dopiewo.pl/docs/errors/5"}}}},"503":{"description":"Service temporarily unavailable","content":{"application/json":{"example":{"error":"backend_error","message":"Backend service temporarily unavailable. Please try again later.","error-code":6,"error-solution":"Wait a few moments and retry your request","error-help":"https://api.dopiewo.pl/docs/errors/6"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/articles/{article_id}":{"get":{"tags":["articles"],"summary":"Get single article by UUID","description":"Retrieve complete article details including all content paragraphs, media, and metadata.\n\n## Features\n\n- **Full Content**: Complete article with all paragraphs\n- **Rich Media**: Images, videos, attachments\n- **Categories**: Full category information with IDs\n- **Featured Media**: Article featured image\n\n## Content Types\n\nArticles may contain different paragraph types:\n- **Text**: HTML formatted text paragraphs\n- **Images**: Embedded images with captions\n- **YouTube**: Embedded video links\n- **Attachments**: Downloadable files (PDF, DOC, etc.)\n- **Person References**: Links to person profiles\n\n## Use Cases\n\n- Article detail pages\n- Content preview\n- RSS feed full content\n- Mobile app article view\n- Third-party content syndication","operationId":"get_article_api_v1_articles__article_id__get","parameters":[{"name":"article_id","in":"path","required":true,"schema":{"type":"string","title":"Article Id"}}],"responses":{"200":{"description":"Successfully retrieved article","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ArticleDetailResponse"},"example":{"id":"8ad9d9ab-8a92-4fba-b129-13bb6d36353c","title":"Projekt budżetu na 2026 rok","summary":"W przygotowanym projekcie budżetu Gminy Dopiewo na rok 2026...","published_at":"2025-11-14T19:46:58+00:00","updated_at":"2025-11-14T20:33:23+00:00","url":"https://dopiewo.pl/aktualnosci/2025-11-14/projekt-budzetu-na-2026-rok","categories":[{"id":5,"name":"Komunikaty urzędowe"},{"id":12,"name":"Finanse"}],"featured_media":{"url":"https://dopiewo.pl/ff/media-images/2025-11/budżet-2026.jpg","alt":"Grafika przedstawiająca budżet","title":"Budżet 2026"},"content":[{"type":"text","content":"<p>Szczegółowe informacje o budżecie...</p>"},{"type":"image","url":"https://dopiewo.pl/ff/media-images/2025-11/wykres.jpg","alt":"Wykres budżetowy","caption":"Porównanie wydatków"},{"type":"attachment","url":"https://dopiewo.pl/ff/documents/2025-11/budzet-2026.pdf","filename":"Projekt budżetu 2026.pdf","mime_type":"application/pdf"}]}}}},"404":{"description":"Article not found","content":{"application/json":{"example":{"error":"not_found","message":"Article 9999 not found","error-code":1,"error-solution":"Verify that the Article ID exists and is published","error-help":"https://api.dopiewo.pl/docs/errors/1"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"example":{"error":"rate_limit_exceeded","message":"Too many requests. Please try again later.","error-code":5,"error-solution":"Wait for the rate limit window to reset before making more requests","error-help":"https://api.dopiewo.pl/docs/errors/5"}}}},"503":{"description":"Service temporarily unavailable","content":{"application/json":{"example":{"error":"backend_error","message":"Backend service temporarily unavailable. Please try again later.","error-code":6,"error-solution":"Wait a few moments and retry your request","error-help":"https://api.dopiewo.pl/docs/errors/6"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/articles/{article_id}/related":{"get":{"tags":["articles"],"summary":"Get related articles by category","description":"Find articles related to the given article based on shared categories.\n\n## Features\n\n- **Smart Matching**: Finds articles sharing categories\n- **Relevance Sorting**: Sorted by number of shared categories and recency\n- **Configurable Limit**: Up to 20 related articles (default: 5)\n- **Source Exclusion**: Automatically excludes the source article\n\n## Algorithm\n\n1. Fetch source article to determine its categories\n2. Retrieve recent articles (last 100 items)\n3. Filter articles that share at least one category\n4. Sort by shared category count (descending), then by publication date\n5. Return top N results\n\n## Use Cases\n\n- \"Related articles\" widget on article pages\n- Content discovery\n- Increase page views\n- Keep users engaged\n- Content recommendation engine","operationId":"get_related_articles_api_v1_articles__article_id__related_get","parameters":[{"name":"article_id","in":"path","required":true,"schema":{"type":"string","title":"Article Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":20,"minimum":1,"description":"Maximum number of related articles to return","default":5,"title":"Limit"},"description":"Maximum number of related articles to return"}],"responses":{"200":{"description":"Successfully retrieved related articles","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RelatedArticlesResponse"},"example":{"article_id":"8ad9d9ab-8a92-4fba-b129-13bb6d36353c","related":[{"id":"7ad9d9ab-8a92-4fba-b129-13bb6d36353c","title":"Konsultacje społeczne budżetu","summary":"Zapraszamy do udziału w konsultacjach...","published_at":"2025-11-10T10:00:00+00:00","updated_at":"2025-11-10T11:00:00+00:00","url":"https://dopiewo.pl/aktualnosci/2025-11-10/konsultacje-budzetu","categories":["Finanse","Komunikaty urzędowe"]},{"id":"6ad9d9ab-8a92-4fba-b129-13bb6d36353c","title":"Realizacja budżetu 2025","summary":"Podsumowanie realizacji budżetu...","published_at":"2025-11-08T14:00:00+00:00","updated_at":"2025-11-08T14:30:00+00:00","url":"https://dopiewo.pl/aktualnosci/2025-11-08/realizacja-budzetu-2025","categories":["Finanse"]}],"count":2}}}},"404":{"description":"Source article not found","content":{"application/json":{"example":{"error":"not_found","message":"Article 9999 not found","error-code":1,"error-solution":"Verify that the Article ID exists and is published","error-help":"https://api.dopiewo.pl/docs/errors/1"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"example":{"error":"rate_limit_exceeded","message":"Too many requests. Please try again later.","error-code":5,"error-solution":"Wait for the rate limit window to reset before making more requests","error-help":"https://api.dopiewo.pl/docs/errors/5"}}}},"503":{"description":"Service temporarily unavailable","content":{"application/json":{"example":{"error":"backend_error","message":"Backend service temporarily unavailable. Please try again later.","error-code":6,"error-solution":"Wait a few moments and retry your request","error-help":"https://api.dopiewo.pl/docs/errors/6"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/events":{"get":{"tags":["events"],"summary":"Get list of events","description":"Retrieve a paginated list of events from the municipality.\n\n## Features\n\n- **Pagination**: Support for up to 100 items per page\n- **Simplified Format**: Returns clean JSON with event times\n- **Event Times**: Includes start/end times and duration\n- **Categories**: Event categories included","operationId":"get_events_api_v1_events_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"description":"Page number","default":1,"title":"Page"},"description":"Page number"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Items per page (max 100)","default":20,"title":"Limit"},"description":"Items per page (max 100)"}],"responses":{"200":{"description":"Successfully retrieved events","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventListResponse"},"example":{"items":[{"id":"8ad9d9ab-8a92-4fba-b129-13bb6d36353c","title":"Spotkanie z mieszkańcami","summary":"Zapraszamy na spotkanie z Wójtem Gminy Dopiewo","start_time":"2025-12-15T18:00:00+00:00","end_time":"2025-12-15T20:00:00+00:00","url":"https://dopiewo.pl/wydarzenia/2025-12-15/spotkanie-z-mieszkancami","categories":["Wydarzenia lokalne"]}],"pagination":{"page":1,"per_page":20,"total":120,"total_pages":6,"has_next":true,"has_prev":false},"links":{"self":"https://api.dopiewo.pl/api/v1/events?limit=20&page=1","first":"https://api.dopiewo.pl/api/v1/events?limit=20&page=1","last":"https://api.dopiewo.pl/api/v1/events?limit=20&page=6","next":"https://api.dopiewo.pl/api/v1/events?limit=20&page=2"}}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"example":{"error":"rate_limit_exceeded","message":"Too many requests. Please try again later.","error-code":5,"error-solution":"Wait for the rate limit window to reset before making more requests","error-help":"https://api.dopiewo.pl/docs/errors/5"}}}},"503":{"description":"Service temporarily unavailable","content":{"application/json":{"example":{"error":"backend_error","message":"Backend service temporarily unavailable. Please try again later.","error-code":6,"error-solution":"Wait a few moments and retry your request","error-help":"https://api.dopiewo.pl/docs/errors/6"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/events/upcoming":{"get":{"tags":["events"],"summary":"Get upcoming events","description":"Retrieve upcoming events (future events only).\n\n## Features\n\n- **Time Filter**: Only events with start time in the future\n- **Sorting**: Sorted by start time (soonest first)\n- **Configurable Limit**: Up to 50 upcoming events (default: 10)\n\n## Use Cases\n\n- Homepage \"What's happening\" widget\n- Event calendar upcoming section\n- Mobile app event notifications","operationId":"get_upcoming_events_api_v1_events_upcoming_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"description":"Number of upcoming events to return","default":10,"title":"Limit"},"description":"Number of upcoming events to return"}],"responses":{"200":{"description":"Successfully retrieved upcoming events","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventListResponse"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"example":{"error":"rate_limit_exceeded","message":"Too many requests. Please try again later.","error-code":5,"error-solution":"Wait for the rate limit window to reset before making more requests","error-help":"https://api.dopiewo.pl/docs/errors/5"}}}},"503":{"description":"Service temporarily unavailable","content":{"application/json":{"example":{"error":"backend_error","message":"Backend service temporarily unavailable. Please try again later.","error-code":6,"error-solution":"Wait a few moments and retry your request","error-help":"https://api.dopiewo.pl/docs/errors/6"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/events/{event_id}":{"get":{"tags":["events"],"summary":"Get single event by ID","description":"Retrieve full event details including all content.\n\n## Features\n\n- **Complete Content**: Full event content with all paragraphs\n- **Event Times**: Start time, end time, and duration\n- **Rich Media**: Featured images and embedded media\n- **Categories**: Full category information with IDs\n\n## Use Cases\n\n- Event detail pages\n- Calendar event details\n- Mobile app event view\n- Event sharing and syndication","operationId":"get_event_api_v1_events__event_id__get","parameters":[{"name":"event_id","in":"path","required":true,"schema":{"type":"string","title":"Event Id"}}],"responses":{"200":{"description":"Successfully retrieved event details","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventDetailResponse"}}}},"404":{"description":"Event not found","content":{"application/json":{"example":{"error":"not_found","message":"Event 9999 not found","error-code":1,"error-solution":"Verify that the Event ID exists and is published","error-help":"https://api.dopiewo.pl/docs/errors/1"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"example":{"error":"rate_limit_exceeded","message":"Too many requests. Please try again later.","error-code":5,"error-solution":"Wait for the rate limit window to reset before making more requests","error-help":"https://api.dopiewo.pl/docs/errors/5"}}}},"503":{"description":"Service temporarily unavailable","content":{"application/json":{"example":{"error":"backend_error","message":"Backend service temporarily unavailable. Please try again later.","error-code":6,"error-solution":"Wait a few moments and retry your request","error-help":"https://api.dopiewo.pl/docs/errors/6"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/places":{"get":{"tags":["places"],"summary":"Get list of places","description":"Retrieve a paginated list of places and locations in the municipality.\n\n## Features\n\n- **Pagination**: Support for up to 100 items per page\n- **Geographic Data**: Latitude/longitude coordinates included\n- **Contact Information**: Address, phone, email\n- **Categories**: Place categories included\n- **Simplified Format**: Returns clean JSON","operationId":"get_places_api_v1_places_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"description":"Page number","default":1,"title":"Page"},"description":"Page number"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Items per page (max 100)","default":50,"title":"Limit"},"description":"Items per page (max 100)"}],"responses":{"200":{"description":"Successfully retrieved places","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlaceListResponse"},"example":{"items":[{"id":"8ad9d9ab-8a92-4fba-b129-13bb6d36353c","title":"Urząd Gminy Dopiewo","address":"ul. Leśna 1C, 62-070 Dopiewo","phone":"+48 61 814 99 99","email":"urzad@dopiewo.pl","location":{"lat":52.434567,"lon":16.856789,"geo_type":"Point"},"url":"https://dopiewo.pl/miejsca/urzad-gminy-dopiewo","categories":["Urząd"]}],"pagination":{"page":1,"per_page":50,"total":85,"total_pages":2,"has_next":true,"has_prev":false},"links":{"self":"https://api.dopiewo.pl/api/v1/places?limit=50&page=1","first":"https://api.dopiewo.pl/api/v1/places?limit=50&page=1","last":"https://api.dopiewo.pl/api/v1/places?limit=50&page=2","next":"https://api.dopiewo.pl/api/v1/places?limit=50&page=2"}}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"example":{"error":"rate_limit_exceeded","message":"Too many requests. Please try again later.","error-code":5,"error-solution":"Wait for the rate limit window to reset before making more requests","error-help":"https://api.dopiewo.pl/docs/errors/5"}}}},"503":{"description":"Service temporarily unavailable","content":{"application/json":{"example":{"error":"backend_error","message":"Backend service temporarily unavailable. Please try again later.","error-code":6,"error-solution":"Wait a few moments and retry your request","error-help":"https://api.dopiewo.pl/docs/errors/6"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/places/nearby":{"get":{"tags":["places"],"summary":"Find nearby places","description":"Find places within a given radius from a geographic point.\n\n## Features\n\n- **Geographic Search**: Search by latitude/longitude coordinates\n- **Configurable Radius**: Search radius from 0.1 to 50 kilometers\n- **Distance Sorting**: Results sorted by distance (closest first)\n- **Distance Information**: Includes distance in kilometers for each place\n- **Flexible Results**: Up to 100 results per request\n\n## Parameters\n\n- `lat`: Center point latitude (required, -90 to 90)\n- `lon`: Center point longitude (required, -180 to 180)\n- `radius`: Search radius in kilometers (default: 5, max: 50)\n- `limit`: Maximum results to return (default: 20, max: 100)\n\n## Use Cases\n\n- \"Find places near me\" feature\n- Mobile app location-based search\n- Map integration\n- Proximity-based recommendations","operationId":"find_nearby_places_api_v1_places_nearby_get","parameters":[{"name":"lat","in":"query","required":true,"schema":{"type":"number","maximum":90,"minimum":-90,"description":"Center point latitude","title":"Lat"},"description":"Center point latitude"},{"name":"lon","in":"query","required":true,"schema":{"type":"number","maximum":180,"minimum":-180,"description":"Center point longitude","title":"Lon"},"description":"Center point longitude"},{"name":"radius","in":"query","required":false,"schema":{"type":"number","maximum":50.0,"minimum":0.1,"description":"Search radius in kilometers","default":5.0,"title":"Radius"},"description":"Search radius in kilometers"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Maximum number of results","default":20,"title":"Limit"},"description":"Maximum number of results"}],"responses":{"200":{"description":"Successfully retrieved nearby places","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NearbyPlacesResponse"}}}},"400":{"description":"Invalid parameters","content":{"application/json":{"example":{"error":"validation_error","message":"Invalid coordinates: lat=95, lon=200","error-code":2,"error-solution":"Check that latitude is between -90 and 90, longitude is between -180 and 180","error-help":"https://api.dopiewo.pl/docs/errors/2"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"example":{"error":"rate_limit_exceeded","message":"Too many requests. Please try again later.","error-code":5,"error-solution":"Wait for the rate limit window to reset before making more requests","error-help":"https://api.dopiewo.pl/docs/errors/5"}}}},"503":{"description":"Service temporarily unavailable","content":{"application/json":{"example":{"error":"backend_error","message":"Backend service temporarily unavailable. Please try again later.","error-code":6,"error-solution":"Wait a few moments and retry your request","error-help":"https://api.dopiewo.pl/docs/errors/6"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/places/{place_id}":{"get":{"tags":["places"],"summary":"Get single place by UUID","description":"Retrieve full place details including description and media.\n\n## Features\n\n- **Complete Information**: Full place details\n- **Rich Description**: HTML formatted description\n- **Contact Details**: Address, phone, email, website\n- **Geographic Data**: Precise coordinates\n- **Featured Media**: Place images\n- **Categories**: Full category information with IDs\n\n## Use Cases\n\n- Place detail pages\n- Map marker popups\n- Mobile app place view\n- Location information displays","operationId":"get_place_api_v1_places__place_id__get","parameters":[{"name":"place_id","in":"path","required":true,"schema":{"type":"string","title":"Place Id"}}],"responses":{"200":{"description":"Successfully retrieved place details","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlaceDetailResponse"}}}},"404":{"description":"Place not found","content":{"application/json":{"example":{"error":"not_found","message":"Place c3f811d9-e3fd-4a17-9da5-2fd32e143591 not found","error-code":1,"error-solution":"Verify that the Place UUID exists and is published","error-help":"https://api.dopiewo.pl/docs/errors/1"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"example":{"error":"rate_limit_exceeded","message":"Too many requests. Please try again later.","error-code":5,"error-solution":"Wait for the rate limit window to reset before making more requests","error-help":"https://api.dopiewo.pl/docs/errors/5"}}}},"503":{"description":"Service temporarily unavailable","content":{"application/json":{"example":{"error":"backend_error","message":"Backend service temporarily unavailable. Please try again later.","error-code":6,"error-solution":"Wait a few moments and retry your request","error-help":"https://api.dopiewo.pl/docs/errors/6"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/questions":{"get":{"tags":["questions"],"summary":"Get list of questions to mayor","description":"Retrieve a paginated list of published questions to the mayor.\n\n## Features\n\n- **Published Only**: Only published questions and answers\n- **Complete Content**: Includes question and answer HTML\n- **Author Information**: Author name (if provided)\n- **Pagination**: Support for up to 100 items per page\n- **Sorted by Date**: Newest questions first\n\n## Use Cases\n\n- Questions to Mayor section on website\n- Citizen engagement display\n- FAQ-style content\n- Transparency portal","operationId":"get_questions_api_v1_questions_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"description":"Page number","default":1,"title":"Page"},"description":"Page number"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Items per page (max 100)","default":20,"title":"Limit"},"description":"Items per page (max 100)"}],"responses":{"200":{"description":"Successfully retrieved questions","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuestionListResponse"},"example":{"items":[{"id":"8ad9d9ab-8a92-4fba-b129-13bb6d36353c","title":"Pytanie o budżet gminy","author":"Jan Kowalski","question":"<p>Proszę o informację o budżecie gminy na 2026 rok...</p>","answer":"<p>Budżet gminy na 2026 rok został uchwalony w dniu...</p>","created_at":"2025-11-10T14:30:00+00:00"}],"pagination":{"page":1,"per_page":20,"total":124,"total_pages":7,"has_next":true,"has_prev":false},"links":{"self":"https://api.dopiewo.pl/api/v1/questions?limit=20&page=1","first":"https://api.dopiewo.pl/api/v1/questions?limit=20&page=1","last":"https://api.dopiewo.pl/api/v1/questions?limit=20&page=7","next":"https://api.dopiewo.pl/api/v1/questions?limit=20&page=2"}}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"example":{"error":"rate_limit_exceeded","message":"Too many requests. Please try again later.","error-code":5,"error-solution":"Wait for the rate limit window to reset before making more requests","error-help":"https://api.dopiewo.pl/docs/errors/5"}}}},"503":{"description":"Service temporarily unavailable","content":{"application/json":{"example":{"error":"backend_error","message":"Backend service temporarily unavailable. Please try again later.","error-code":6,"error-solution":"Wait a few moments and retry your request","error-help":"https://api.dopiewo.pl/docs/errors/6"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/questions/{question_id}":{"get":{"tags":["questions"],"summary":"Get single question by ID","description":"Retrieve full question details.\n\n## Features\n\n- **Complete Content**: Full question and answer\n- **Author Information**: Author name and details\n- **Additional Description**: Extended description (if available)\n- **Publication Status**: Shows if published\n- **Timestamps**: Creation and update dates\n\n## Use Cases\n\n- Question detail pages\n- Direct links to specific questions\n- Sharing and referencing specific Q&A","operationId":"get_question_api_v1_questions__question_id__get","parameters":[{"name":"question_id","in":"path","required":true,"schema":{"type":"string","title":"Question Id"}}],"responses":{"200":{"description":"Successfully retrieved question details","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuestionDetailResponse"}}}},"404":{"description":"Question not found","content":{"application/json":{"example":{"error":"not_found","message":"Question 9999 not found","error-code":1,"error-solution":"Verify that the Question ID exists and is published","error-help":"https://api.dopiewo.pl/docs/errors/1"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"example":{"error":"rate_limit_exceeded","message":"Too many requests. Please try again later.","error-code":5,"error-solution":"Wait for the rate limit window to reset before making more requests","error-help":"https://api.dopiewo.pl/docs/errors/5"}}}},"503":{"description":"Service temporarily unavailable","content":{"application/json":{"example":{"error":"backend_error","message":"Backend service temporarily unavailable. Please try again later.","error-code":6,"error-solution":"Wait a few moments and retry your request","error-help":"https://api.dopiewo.pl/docs/errors/6"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/dashboard":{"get":{"tags":["aggregation"],"summary":"Get aggregated dashboard data","description":"Get aggregated content from multiple sources in a single request for homepage/dashboard views.\n\n## Features\n\n- **Multi-Source Aggregation**: Data from articles, events, questions in one response\n- **Parallel Processing**: Uses asyncio.gather for optimal performance\n- **Graceful Degradation**: Returns partial data if one source fails\n- **Statistics Included**: Total counts for all content types\n\n## Returns\n\n- **Latest Articles**: 5 most recent articles\n- **Upcoming Events**: 5 next scheduled events\n- **Recent Questions**: 3 most recent questions to mayor\n- **Statistics**: Total counts for all content types\n- **Metadata**: Generation timestamp\n\n## Use Cases\n\n- Homepage content widget\n- Mobile app home screen\n- Portal dashboard\n- Quick overview API\n- Single-request data fetch","operationId":"get_dashboard_api_v1_dashboard_get","responses":{"200":{"description":"Successfully retrieved dashboard data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardResponse"},"example":{"latest_articles":[{"id":"8ad9d9ab-8a92-4fba-b129-13bb6d36353c","title":"Projekt budżetu na 2026 rok","summary":"W przygotowanym projekcie budżetu...","published_at":"2025-11-14T19:46:58+00:00","updated_at":"2025-11-14T20:33:23+00:00","url":"https://dopiewo.pl/aktualnosci/2025-11-14/projekt-budzetu-na-2026-rok","categories":["Komunikaty urzędowe"]}],"upcoming_events":[{"id":"7ad9d9ab-8a92-4fba-b129-13bb6d36353c","title":"Sesja Rady Gminy","summary":"Zapraszamy na sesję Rady Gminy","start_time":"2025-11-20T16:00:00+00:00","end_time":"2025-11-20T18:00:00+00:00","duration_minutes":120,"url":"https://dopiewo.pl/wydarzenia/2025-11-20/sesja-rady","categories":["Rada Gminy"]}],"recent_questions":[{"id":"6ad9d9ab-8a92-4fba-b129-13bb6d36353c","title":"Pytanie o remont drogi","author_name":"Jan Kowalski","question":"<p>Kiedy planowany jest remont?</p>","answer":"<p>Remont planowany na przyszły miesiąc.</p>","created_at":"2025-11-10T10:00:00+00:00"}],"statistics":{"total_articles":881,"total_events":25,"total_places":218,"total_questions":631},"generated_at":"2025-11-17T12:00:00+00:00","cache_ttl":180}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"example":{"error":"rate_limit_exceeded","message":"Too many requests. Please try again later.","retry_after":60}}}},"500":{"description":"Internal server error","content":{"application/json":{"example":{"error":"internal_error","message":"Failed to fetch dashboard data"}}}},"503":{"description":"Service temporarily unavailable","content":{"application/json":{"example":{"error":"service_unavailable","message":"Backend service is temporarily unavailable. Please try again in a few moments."}}}}}}},"/api/v1/search":{"get":{"tags":["search"],"summary":"Search content","description":"Full-text search across multiple content types.\n\n## Features\n\n- **Multi-Type Search**: Search across articles, events, places, and questions\n- **Relevance Ranking**: Results ranked by relevance score\n- **Flexible Filtering**: Filter by specific content types\n- **Pagination**: Support for up to 100 results per page\n\n## Searchable Fields\n\n- **Articles**: Title, summary, content\n- **Events**: Title, summary, event time\n- **Places**: Name, address, phone, email\n- **Questions**: Title, question, answer, author\n\n## Parameters\n\n- `q`: Search query (required, min 3 chars, max 200 chars)\n- `types`: Comma-separated content types (default: all)\n- `page`: Page number (default: 1)\n- `limit`: Results per page (default: 20, max: 100)\n\n## Use Cases\n\n- Site-wide search functionality\n- Mobile app search\n- Finding specific content\n- Content discovery","operationId":"search_content_api_v1_search_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":3,"maxLength":200,"description":"Search query","title":"Q"},"description":"Search query"},{"name":"types","in":"query","required":false,"schema":{"type":"string","description":"Content types to search (comma-separated)","default":"article,event,place,question","title":"Types"},"description":"Content types to search (comma-separated)"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number","default":1,"title":"Page"},"description":"Page number"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Results per page","default":20,"title":"Limit"},"description":"Results per page"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/statistics":{"get":{"tags":["statistics"],"summary":"Get content statistics","description":"Returns content statistics and counts across all content types.\n\n## Features\n\n- **Total Counts**: Article, event, place, and question counts\n- **Upcoming Events**: Separate count for upcoming events only\n- **Parallel Processing**: Fast retrieval using concurrent requests\n- **Timestamps**: Includes latest update time\n\n## Returns\n\n- Total articles count\n- Total events count\n- Upcoming events count (future only)\n- Total places count\n- Total questions count (published only)\n\n## Use Cases\n\n- Dashboard statistics widgets\n- Content overview displays\n- Administrative monitoring\n- API usage metrics","operationId":"get_statistics_api_v1_statistics_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatisticsResponse"}}}}}}},"/api/v1/metadata/dcat":{"get":{"tags":["metadata"],"summary":"Get DCAT-AP metadata","description":"Get DCAT-AP (Data Catalog Vocabulary - Application Profile) metadata for this API.\n\n## Purpose\n\nThis endpoint provides standardized metadata compliant with:\n- **DCAT-AP 2.0**: European standard for data catalogs\n- **Polish Open Data Act**: Metadata requirements\n- **Open Data Portals**: Integration with data.gov.pl and EU portals\n\n## Use Cases\n\n- Registration in open data catalogs\n- Automated data discovery\n- Compliance verification\n- API cataloging\n- Metadata harvesting\n\n## Standards Compliance\n\n- **DCAT-AP 2.0**: https://joinup.ec.europa.eu/collection/semantic-interoperability-community-semic/solution/dcat-application-profile-data-portals-europe\n- **Schema.org**: Linked data vocabulary\n- **Dublin Core**: Metadata elements","operationId":"get_dcat_metadata_api_v1_metadata_dcat_get","responses":{"200":{"description":"DCAT-AP metadata successfully retrieved","content":{"application/json":{"schema":{},"example":{"@context":"https://www.w3.org/ns/dcat","@type":"Dataset","title":{"pl":"Gmina Dopiewo - Dane Otwarte API","en":"Gmina Dopiewo - Open Data API"},"description":{"pl":"Publiczne API zapewniające dostęp do danych samorządowych","en":"Public API providing access to municipal data"},"publisher":{"@type":"Organization","name":"Gmina Dopiewo","url":"https://dopiewo.pl"},"distribution":[{"@type":"Distribution","title":"API Endpoint","accessURL":"https://api.dopiewo.pl/api/v1","format":"application/json"}]}}}}}}},"/api/v1/metadata/license":{"get":{"tags":["metadata"],"summary":"Get license information","description":"Get detailed license information for data and API usage.\n\nReturns information about:\n- Data license (CC BY 4.0)\n- Usage rights\n- Attribution requirements\n- Restrictions","operationId":"get_license_info_api_v1_metadata_license_get","responses":{"200":{"description":"License information","content":{"application/json":{"schema":{}}}}}}},"/api/v1/version":{"get":{"tags":["metadata"],"summary":"Get API version information","description":"Returns the current API version information following semantic versioning.\n\n    Version Format:\n    - MAJOR: Breaking changes\n    - MINOR: New features (backward compatible)\n    - PATCH: Bug fixes (backward compatible)\n\n    PODP Compliance: This endpoint fulfills the requirement for version disclosure\n    as specified in the Polish Open Data Standard (PODP).","operationId":"get_version_api_v1_version_get","responses":{"200":{"description":"API version information","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VersionResponse"},"example":{"api-version":{"major":"1","minor":"0","patch":"0","date-mod":"2025-11-18T12:00:00+00:00"}}}}}}}},"/api/v1/bip/news":{"get":{"tags":["bip"],"summary":"Get BIP news and announcements","description":"Retrieve latest news and announcements from BIP (Biuletyn Informacji Publicznej) Dopiewo.\n\n## About BIP\n\nBIP (Public Information Bulletin) is the official platform for public sector information\nin Poland, as required by Polish law. It contains official government announcements,\ndocuments, and decisions.\n\n## Features\n\n- **Public Access**: No authentication required\n- **Polish Content**: All content in Polish language\n- **Official Source**: Direct from BIP Dopiewo API\n- **Latest News**: Shows up to 100 most recent items\n- **Cached**: Results cached for improved performance\n- **Pagination**: Support for up to 100 items per page\n\n## Note\n\nThis endpoint returns up to 100 most recent news items. The backend uses 0-based\npage indexing, which we handle internally for standard 1-based pagination.","operationId":"get_bip_news_api_v1_bip_news_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Page number","default":1,"title":"Page"},"description":"Page number"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Items per page (max 100)","default":20,"title":"Limit"},"description":"Items per page (max 100)"}],"responses":{"200":{"description":"Successfully retrieved BIP news","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleBIPNewsResponse"},"example":{"items":[{"id":12345,"title":"Ogłoszenie o przetargu","content":"Gmina Dopiewo ogłasza przetarg...","slug":"ogloszenie-o-przetargu","published_date":"2025-11-15T10:30:00+00:00","url":"https://bip.dopiewo.pl/ogloszenie-o-przetargu"}],"pagination":{"page":1,"per_page":20,"total":100,"total_pages":5,"has_next":true,"has_prev":false},"links":{"self":"https://api.dopiewo.pl/api/v1/bip/news?limit=20&page=1","first":"https://api.dopiewo.pl/api/v1/bip/news?limit=20&page=1","last":"https://api.dopiewo.pl/api/v1/bip/news?limit=20&page=5","next":"https://api.dopiewo.pl/api/v1/bip/news?limit=20&page=2"}}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"example":{"error":"rate_limit_exceeded","message":"Too many requests. Please try again later.","error-code":5,"error-solution":"Wait for the rate limit window to reset before making more requests","error-help":"https://api.dopiewo.pl/docs/errors/5"}}}},"503":{"description":"Service unavailable","content":{"application/json":{"example":{"error":"backend_error","message":"BIP service is temporarily unavailable","error-code":6,"error-solution":"Wait a few moments and retry your request","error-help":"https://api.dopiewo.pl/docs/errors/6"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/bip/orders":{"get":{"tags":["bip"],"summary":"Get Mayor's Executive Orders","description":"Retrieve Mayor's Executive Orders (Zarządzenia Wójta Gminy Dopiewo) from BIP.\n\n## About\n\nThis endpoint provides access to official executive orders issued by the Mayor of Gmina Dopiewo\nduring the current term (Kadencja IX: 2024-2029).\n\n## Features\n\n- **Public Access**: No authentication required\n- **Official Documents**: Direct from BIP\n- **Current Term**: 2024-2029\n- **Pagination**: Support for up to 100 items per page\n- **Complete Archive**: Access to all executive orders","operationId":"get_bip_orders_api_v1_bip_orders_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Page number","default":1,"title":"Page"},"description":"Page number"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Items per page (max 100)","default":20,"title":"Limit"},"description":"Items per page (max 100)"}],"responses":{"200":{"description":"Successful response with orders","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleBIPOrdersResponse"},"example":{"category_id":394,"category_name":"Kadencja IX (2024-2029)","items":[{"title":"Zarządzenie Nr 123/2024 w sprawie...","slug":"zarzadzenie-123-2024","published_date":"2024-11-10T14:20:00Z","url":"https://bip.dopiewo.pl/zarzadzenie-123-2024"}],"total":240}}}},"503":{"description":"BIP service unavailable"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/planning-permissions":{"get":{"tags":["wz"],"summary":"List all planning permissions (Warunki Zabudowy)","description":"Retrieve planning permissions and building conditions (Warunki Zabudowy) for Gmina Dopiewo.\n\n## About Planning Permissions\n\nPlanning permissions (Warunki Zabudowy - WZ) are official decisions that determine building\nconditions for plots where there is no local spatial development plan. They specify what type\nof development is allowed on a given plot.\n\n## Dataset Information\n\n- **Total Records**: 6,500+ planning permissions\n- **Data Source**: Official Gmina Dopiewo planning permissions database\n- **Update Frequency**: Twice daily\n- **Data Format**: Includes decision number, plot number, locality, building type, and status\n\n## Features\n\n- **Public Access**: No authentication required\n- **Pagination**: Up to 200 items per page\n- **Sorting**: Sort by decision number, locality, status, or plot number\n- **Polish Content**: All content in Polish language","operationId":"list_planning_permissions_api_v1_planning_permissions_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number (starts at 1)","default":1,"title":"Page"},"description":"Page number (starts at 1)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"description":"Items per page (max 200)","default":50,"title":"Limit"},"description":"Items per page (max 200)"},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort by field (nrdecyzji, miejscowosc, status, nrdzialki)","title":"Sort By"},"description":"Sort by field (nrdecyzji, miejscowosc, status, nrdzialki)"},{"name":"sort_order","in":"query","required":false,"schema":{"type":"string","pattern":"^(asc|desc)$","description":"Sort order (asc or desc)","default":"desc","title":"Sort Order"},"description":"Sort order (asc or desc)"}],"responses":{"200":{"description":"Successfully retrieved planning permissions","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanningPermissionList"},"example":{"items":[{"nrdecyzji":"2025/310","miejscowosc":"Dopiewo","nrdzialki":"191/12","rodzajzabudowy":"Budynek mieszkalny jednorodzinny","status":"Pozytywna"}],"pagination":{"page":1,"per_page":50,"total":6684,"total_pages":134,"has_next":true,"has_prev":false},"links":{"self":"https://api.dopiewo.pl/api/v1/planning-permissions?limit=50&page=1","first":"https://api.dopiewo.pl/api/v1/planning-permissions?limit=50&page=1","last":"https://api.dopiewo.pl/api/v1/planning-permissions?limit=50&page=134","next":"https://api.dopiewo.pl/api/v1/planning-permissions?limit=50&page=2"}}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"example":{"error":"rate_limit_exceeded","message":"Too many requests. Please try again later.","error-code":5,"error-solution":"Wait for the rate limit window to reset before making more requests","error-help":"https://api.dopiewo.pl/docs/errors/5"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/planning-permissions/search":{"get":{"tags":["wz"],"summary":"Search planning permissions (Warunki Zabudowy)","description":"Search through planning permissions by decision number, locality, or plot number.\n\n## Search Capabilities\n\nThis endpoint allows you to search through 6,684+ planning permissions using a simple\nquery string. The search is case-insensitive and partial matches are supported.\n\n## Search Fields\n\nThe query will search across the following fields:\n- **Decision Number** (nrdecyzji): e.g., \"2025/310\", \"2024/150\"\n- **Locality** (miejscowosc): e.g., \"Dopiewo\", \"Zakrzewo\", \"Skórzewo\"\n- **Plot Number** (nrdzialki): e.g., \"191/12\", \"98/13\"\n\n## Features\n\n- **Public Access**: No authentication required\n- **Partial Matching**: Query \"Dopiewo\" matches all Dopiewo locations\n- **Case Insensitive**: \"dopiewo\" and \"DOPIEWO\" return same results\n- **Pagination**: Up to 200 results per page\n\n## Usage Examples\n\n- Search by locality: `?q=Dopiewo`\n- Search by decision number: `?q=2025/310`\n- Search by plot number: `?q=191/12`\n- Search partial: `?q=2025` (finds all 2025 decisions)","operationId":"search_planning_permissions_api_v1_planning_permissions_search_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":1,"description":"Search query string","title":"Q"},"description":"Search query string"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number (starts at 1)","default":1,"title":"Page"},"description":"Page number (starts at 1)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"description":"Items per page (max 200)","default":50,"title":"Limit"},"description":"Items per page (max 200)"}],"responses":{"200":{"description":"Successfully retrieved search results","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanningPermissionList"},"example":{"items":[{"nrdecyzji":"2025/310","miejscowosc":"Dopiewo","nrdzialki":"191/12","rodzajzabudowy":"Budynek mieszkalny jednorodzinny","status":"Pozytywna"}],"pagination":{"page":1,"per_page":50,"total":45,"total_pages":1,"has_next":false,"has_prev":false},"links":{"self":"https://api.dopiewo.pl/api/v1/planning-permissions/search?q=Dopiewo&limit=50&page=1","first":"https://api.dopiewo.pl/api/v1/planning-permissions/search?q=Dopiewo&limit=50&page=1","last":"https://api.dopiewo.pl/api/v1/planning-permissions/search?q=Dopiewo&limit=50&page=1"}}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"example":{"error":"rate_limit_exceeded","message":"Too many requests. Please try again later.","error-code":5,"error-solution":"Wait for the rate limit window to reset before making more requests","error-help":"https://api.dopiewo.pl/docs/errors/5"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/planning-permissions/stats":{"get":{"tags":["wz"],"summary":"Get planning permissions statistics","description":"Get comprehensive statistics about planning permissions data for Gmina Dopiewo.\n\n## Statistics Provided\n\nThis endpoint returns aggregated statistics about the planning permissions dataset,\nincluding breakdowns by status, localities, and overall counts.\n\n## Included Data\n\n- **Total Records**: Total number of planning permissions in the database\n- **Status Breakdown**: Count of permissions by status (w toku, wydane, etc.)\n- **Localities**: List of all localities with planning permissions\n- **Last Updated**: Timestamp of the last data refresh\n\n## Features\n\n- **Public Access**: No authentication required\n- **Aggregated Data**: Pre-calculated statistics\n- **Auto-refresh**: Statistics update automatically with data refresh\n\n## Use Cases\n\n- Dashboard widgets showing planning permission trends\n- Analytics on building permit distribution\n- Locality-based statistics\n- Status monitoring of pending permissions\n\n## Notes\n\n- Statistics are calculated from the entire dataset\n- Counts are updated automatically when new data is loaded","operationId":"get_planning_permissions_stats_api_v1_planning_permissions_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanningPermissionStats"}}}}}}},"/api/v1/consultations":{"get":{"tags":["consultations"],"summary":"List all public consultations","description":"Retrieve a paginated list of public consultations from the civic engagement platform.\n\n## Features\n\n- **Pagination**: Support for up to 100 items per page\n- **Status Filtering**: Filter by consultation status (open, archived, draft)\n- **Multiple Selection**: Can filter by multiple statuses simultaneously\n- **Simplified Format**: Clean JSON with consultation details and attachments\n\n## Use Cases\n\n- Civic engagement platforms\n- Municipal transparency portals\n- Community feedback collection\n- Mobile apps for citizen participation","operationId":"list_consultations_api_v1_consultations_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number","default":1,"title":"Page"},"description":"Page number"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Items per page","default":20,"title":"Limit"},"description":"Items per page"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"enum":["open","archived","draft"],"type":"string"}},{"type":"null"}],"description":"Filter by status (can be multiple)","title":"Status"},"description":"Filter by status (can be multiple)"}],"responses":{"200":{"description":"Successfully retrieved consultations","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsultationsListResponse"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"example":{"error":"rate_limit_exceeded","message":"Too many requests. Please try again later."}}}},"503":{"description":"Service temporarily unavailable","content":{"application/json":{"example":{"detail":"Consultations service is currently unavailable"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/consultations/open":{"get":{"tags":["consultations"],"summary":"List open consultations","description":"Retrieve only active/open public consultations that are currently accepting input.\n\n## Features\n\n- **Active Only**: Returns consultations currently open for public participation\n- **Pagination**: Support for up to 100 items per page\n- **Real-time**: Shorter cache TTL for up-to-date information\n\n## Use Cases\n\n- Homepage widgets showing active consultations\n- Citizen participation dashboards\n- Mobile notifications for new consultations","operationId":"list_open_consultations_api_v1_consultations_open_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number","default":1,"title":"Page"},"description":"Page number"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Items per page","default":20,"title":"Limit"},"description":"Items per page"}],"responses":{"200":{"description":"Successfully retrieved open consultations","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsultationsListResponse"}}}},"503":{"description":"Service temporarily unavailable"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/consultations/archived":{"get":{"tags":["consultations"],"summary":"List archived consultations","description":"Retrieve archived/completed public consultations with results and summaries.\n\n## Features\n\n- **Historical Data**: Access past consultations and their outcomes\n- **Results**: Includes consultation summaries where available\n- **Pagination**: Support for up to 100 items per page\n- **Extended Cache**: Longer cache TTL for historical data\n\n## Use Cases\n\n- Archive browsing and research\n- Impact assessment of past consultations\n- Transparency reports\n- Historical participation tracking","operationId":"list_archived_consultations_api_v1_consultations_archived_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number","default":1,"title":"Page"},"description":"Page number"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Items per page","default":20,"title":"Limit"},"description":"Items per page"}],"responses":{"200":{"description":"Successfully retrieved archived consultations","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsultationsListResponse"}}}},"503":{"description":"Service temporarily unavailable"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/consultations/{consultation_id}":{"get":{"tags":["consultations"],"summary":"Get single consultation by ID","description":"Retrieve detailed information about a specific public consultation including survey form.\n\n## Features\n\n- **Complete Details**: Full consultation information with all metadata\n- **Survey Form**: Complete survey structure with questions and answer options\n- **Participation Settings**: Authentication and verification requirements\n- **Form Structure**: Questions organized by sections with answer options\n\n## Use Cases\n\n- Consultation detail pages\n- Survey form rendering\n- Participation verification checks\n- Mobile app consultation view\n- Integration with survey submission systems","operationId":"get_consultation_detail_api_v1_consultations__consultation_id__get","parameters":[{"name":"consultation_id","in":"path","required":true,"schema":{"type":"string","title":"Consultation Id"}}],"responses":{"200":{"description":"Successfully retrieved consultation details","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsultationDetailResponse"}}}},"404":{"description":"Consultation not found","content":{"application/json":{"example":{"detail":"Consultation not found"}}}},"503":{"description":"Service temporarily unavailable"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"APIKeyCreate":{"properties":{"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name","description":"Descriptive name for the API key (e.g., 'Mobile App', 'Production Frontend')"},"rate_limit":{"anyOf":[{"type":"integer","maximum":10000.0,"minimum":1.0},{"type":"null"}],"title":"Rate Limit","description":"Custom rate limit (requests per minute). If not specified, uses default."},"expires_in_days":{"anyOf":[{"type":"integer","maximum":3650.0,"minimum":1.0},{"type":"null"}],"title":"Expires In Days","description":"Number of days until key expires (default: 365, max: 3650)","default":365},"environment":{"type":"string","title":"Environment","description":"Environment: 'live' or 'test'","default":"live"}},"type":"object","required":["name"],"title":"APIKeyCreate","description":"Request model for creating a new API key"},"APIKeyCreateResponse":{"properties":{"key_id":{"type":"string","title":"Key Id","description":"Unique identifier for the key"},"name":{"type":"string","title":"Name","description":"Descriptive name"},"environment":{"type":"string","title":"Environment","description":"Environment (live/test)"},"rate_limit":{"type":"integer","title":"Rate Limit","description":"Rate limit (requests per minute)"},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"Creation timestamp"},"last_used":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used","description":"Last usage timestamp"},"expires_at":{"type":"string","format":"date-time","title":"Expires At","description":"Expiration timestamp"},"active":{"type":"boolean","title":"Active","description":"Whether the key is active","default":true},"key":{"type":"string","title":"Key","description":"The actual API key. IMPORTANT: Store this securely - it won't be shown again!"}},"type":"object","required":["key_id","name","environment","rate_limit","created_at","expires_at","key"],"title":"APIKeyCreateResponse","description":"Response model when creating a new API key (includes the actual key once)"},"APIKeyList":{"properties":{"keys":{"items":{"$ref":"#/components/schemas/APIKeyResponse"},"type":"array","title":"Keys"},"total":{"type":"integer","title":"Total","description":"Total number of keys"}},"type":"object","required":["total"],"title":"APIKeyList","description":"Response model for listing API keys"},"APIKeyResponse":{"properties":{"key_id":{"type":"string","title":"Key Id","description":"Unique identifier for the key"},"name":{"type":"string","title":"Name","description":"Descriptive name"},"environment":{"type":"string","title":"Environment","description":"Environment (live/test)"},"rate_limit":{"type":"integer","title":"Rate Limit","description":"Rate limit (requests per minute)"},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"Creation timestamp"},"last_used":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used","description":"Last usage timestamp"},"expires_at":{"type":"string","format":"date-time","title":"Expires At","description":"Expiration timestamp"},"active":{"type":"boolean","title":"Active","description":"Whether the key is active","default":true}},"type":"object","required":["key_id","name","environment","rate_limit","created_at","expires_at"],"title":"APIKeyResponse","description":"Response model for API key (excludes the actual key after creation)"},"APIKeyUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":100,"minLength":1},{"type":"null"}],"title":"Name","description":"New descriptive name"},"rate_limit":{"anyOf":[{"type":"integer","maximum":10000.0,"minimum":1.0},{"type":"null"}],"title":"Rate Limit","description":"New rate limit"},"active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Active","description":"Activate or deactivate the key"}},"type":"object","title":"APIKeyUpdate","description":"Request model for updating an API key"},"APIVersion":{"properties":{"major":{"type":"string","title":"Major","description":"Major version number"},"minor":{"type":"string","title":"Minor","description":"Minor version number"},"patch":{"type":"string","title":"Patch","description":"Patch version number"},"date_mod":{"type":"string","title":"Date Mod","description":"Last modification date (ISO 8601 format)"}},"type":"object","required":["major","minor","patch","date_mod"],"title":"APIVersion","description":"API version information according to PODP standard."},"ArticleDetailResponse":{"properties":{"id":{"type":"string","title":"Id","description":"Article UUID"},"title":{"type":"string","title":"Title","description":"Article title"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary","description":"Article summary/excerpt"},"published_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Published At","description":"Publication date (ISO 8601)"},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At","description":"Last update date (ISO 8601)"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url","description":"Absolute URL to article page"},"categories":{"items":{"$ref":"#/components/schemas/CategoryResponse"},"type":"array","title":"Categories","description":"Article categories with IDs"},"featured_media":{"anyOf":[{"$ref":"#/components/schemas/MediaResponse"},{"type":"null"}],"description":"Featured image/media"},"content":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Content","description":"Article content paragraphs"}},"type":"object","required":["id","title"],"title":"ArticleDetailResponse","description":"Article detail view (full content)","example":{"categories":[{"id":5,"name":"News"}],"content":[{"content":"<p>Article content here...</p>","type":"text"},{"alt":"Content image","caption":"Image caption","type":"image","url":"https://dopiewo.pl/ff/media-images/2025-11/image.jpg"}],"featured_media":{"alt":"Featured image","title":"News Image","url":"https://dopiewo.pl/ff/media-images/2025-11/featured.jpg"},"id":"a1b2c3d4-e5f6-7890-abcd-ef1234567890","published_at":"2025-11-13T21:43:10+00:00","summary":"Latest updates from the municipality office...","title":"Municipality News Update","updated_at":"2025-11-14T08:49:25+00:00","url":"https://dopiewo.pl/aktualnosci/2025-11-13/municipality-news"}},"ArticleListItem":{"properties":{"id":{"type":"string","title":"Id","description":"Article UUID"},"title":{"type":"string","title":"Title","description":"Article title"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary","description":"Article summary/excerpt"},"published_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Published At","description":"Publication date (ISO 8601)"},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At","description":"Last update date (ISO 8601)"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url","description":"Absolute URL to article page"},"categories":{"items":{"type":"string"},"type":"array","title":"Categories","description":"Category names"}},"type":"object","required":["id","title"],"title":"ArticleListItem","description":"Article in list view (summary only)","example":{"categories":["News","Announcements"],"id":"a1b2c3d4-e5f6-7890-abcd-ef1234567890","published_at":"2025-11-13T21:43:10+00:00","summary":"Latest updates from the municipality office...","title":"Municipality News Update","updated_at":"2025-11-14T08:49:25+00:00","url":"https://dopiewo.pl/aktualnosci/2025-11-13/municipality-news"}},"ArticleListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ArticleListItem"},"type":"array","title":"Items","description":"List of articles"},"pagination":{"$ref":"#/components/schemas/PaginationResponse","description":"Pagination metadata"},"links":{"anyOf":[{"$ref":"#/components/schemas/PaginationLinks"},{"type":"null"}],"description":"HATEOAS navigation links (PODP compliant)"}},"type":"object","required":["items","pagination"],"title":"ArticleListResponse","description":"Articles list response with pagination","example":{"items":[{"categories":["News"],"id":"8ad9d9ab-8a92-4fba-b129-13bb6d36353c","published_at":"2025-11-13T21:43:10+00:00","summary":"Latest updates...","title":"Municipality News Update","updated_at":"2025-11-14T08:49:25+00:00","url":"https://dopiewo.pl/aktualnosci/2025-11-13/news"}],"pagination":{"has_next":true,"has_prev":false,"page":1,"per_page":20,"total":150,"total_pages":8}}},"CategoryResponse":{"properties":{"id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Id","description":"Category term ID"},"name":{"type":"string","title":"Name","description":"Category name"}},"type":"object","required":["name"],"title":"CategoryResponse","description":"Category reference (taxonomy term)","example":{"id":5,"name":"News"}},"ConsultationAttachment":{"properties":{"id":{"type":"string","title":"Id","description":"Attachment UUID"},"url":{"type":"string","title":"Url","description":"Download URL"},"file_name":{"type":"string","title":"File Name","description":"Original file name"},"mime_type":{"type":"string","title":"Mime Type","description":"MIME type (e.g., application/pdf)"},"created_at":{"type":"string","title":"Created At","description":"Creation timestamp"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Attachment description"}},"type":"object","required":["id","url","file_name","mime_type","created_at"],"title":"ConsultationAttachment","description":"Attachment in a consultation"},"ConsultationDetailResponse":{"properties":{"id":{"type":"string","title":"Id","description":"Consultation UUID"},"name":{"type":"string","title":"Name","description":"Consultation title"},"description":{"type":"string","title":"Description","description":"HTML description"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category","description":"Consultation category"},"status":{"type":"string","enum":["open","archived","draft"],"title":"Status","description":"Consultation status"},"active_from":{"type":"string","title":"Active From","description":"Start date (ISO 8601)"},"active_to":{"type":"string","title":"Active To","description":"End date (ISO 8601)"},"total_votes":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Total Votes","description":"Number of votes/responses","default":0},"attachments":{"items":{"$ref":"#/components/schemas/ConsultationAttachment"},"type":"array","title":"Attachments","description":"Attached documents"},"photos":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Photos","description":"Photo objects"},"participation_constraints":{"$ref":"#/components/schemas/ParticipationConstraints","description":"Participation requirements"},"summary":{"$ref":"#/components/schemas/ConsultationSummary","description":"Consultation results/summary"},"additional_descriptions":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Additional Descriptions","description":"Additional description sections"},"browser_only":{"type":"boolean","title":"Browser Only","description":"Whether consultation is browser-only","default":false},"archival_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Archival Date","description":"Archival date if archived"},"form":{"items":{"$ref":"#/components/schemas/ConsultationFormSection"},"type":"array","title":"Form","description":"Consultation survey form"},"respondent_profile":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Respondent Profile","description":"Respondent profile settings"},"consulted_act":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Consulted Act","description":"Legal act being consulted"},"comments":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Comments","description":"Comments configuration"},"approvals":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Approvals","description":"Approval settings"},"authentication_required":{"type":"boolean","title":"Authentication Required","description":"Whether authentication is required","default":false},"board_settings":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Board Settings","description":"Discussion board settings"},"proposed_locations":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Proposed Locations","description":"Proposed location markers"},"participants_verification":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Participants Verification","description":"Participant verification settings"},"voter_identification_methods":{"items":{"type":"string"},"type":"array","title":"Voter Identification Methods","description":"Allowed identification methods"}},"type":"object","required":["id","name","description","status","active_from","active_to","participation_constraints","summary"],"title":"ConsultationDetailResponse","description":"Detailed consultation with form and additional data","example":{"active_from":"2025-11-19T11:00:10Z","active_to":"2025-12-02T22:59:00Z","additional_descriptions":[],"attachments":[],"authentication_required":false,"browser_only":false,"category":"Prawo lokalne","description":"<p>Konsultacje dotyczące kryteriów oceny...</p>","form":[{"allow_own_answer":false,"answers":[{"answer_text":"1 - zdecydowanie nie akceptuje","id":"019a97fd-b608-481d-9199-f95a4e7e0db6","order":0}],"id":"019a97fd-b608-43e6-a9f1-6d73ebb24eb3","is_optional":false,"order":0,"question_text":"Kryterium 1. (KI) Koszty inwestycji","question_type":"singleChoiceTable","questions":[{"id":"019a97fd-b608-43ea-8845-9616c6bed226","order":0,"question_text":"Miara ekonomiczno-finansowa..."}],"type":"question","use_weights":false,"weight":1.0}],"id":"019a54b0-5ef4-4902-a115-9b28ae521c16","name":"Kryteria oceny dróg gminnych","participation_constraints":{"require_company":false,"require_non_government_organization":false,"require_subordinate_organization":false,"require_verification":false},"photos":[],"status":"open","summary":{},"total_votes":52,"voter_identification_methods":["personalData"]}},"ConsultationFormSection":{"properties":{"id":{"type":"string","title":"Id","description":"Section UUID"},"order":{"type":"integer","title":"Order","description":"Section order"},"type":{"type":"string","title":"Type","description":"Section type (question, rodo, etc.)"},"question_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Question Type","description":"Question type (singleChoice, multipleChoice, etc.)"},"question_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Question Text","description":"Section question text"},"questions":{"items":{"$ref":"#/components/schemas/SurveyQuestion"},"type":"array","title":"Questions","description":"Questions in section"},"answers":{"items":{"$ref":"#/components/schemas/SurveyAnswer"},"type":"array","title":"Answers","description":"Answer options"},"weight":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Weight","description":"Section weight"},"use_weights":{"type":"boolean","title":"Use Weights","description":"Whether to use answer weights","default":false},"allow_own_answer":{"type":"boolean","title":"Allow Own Answer","description":"Allow custom answers","default":false},"own_answer_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Own Answer Name","description":"Custom answer field name"},"is_optional":{"type":"boolean","title":"Is Optional","description":"Whether section is optional","default":false}},"type":"object","required":["id","order","type"],"title":"ConsultationFormSection","description":"Form section with questions and answers"},"ConsultationResponse":{"properties":{"id":{"type":"string","title":"Id","description":"Consultation UUID"},"name":{"type":"string","title":"Name","description":"Consultation title"},"description":{"type":"string","title":"Description","description":"HTML description"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category","description":"Consultation category"},"status":{"type":"string","enum":["open","archived","draft"],"title":"Status","description":"Consultation status"},"active_from":{"type":"string","title":"Active From","description":"Start date (ISO 8601)"},"active_to":{"type":"string","title":"Active To","description":"End date (ISO 8601)"},"total_votes":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Total Votes","description":"Number of votes/responses","default":0},"attachments":{"items":{"$ref":"#/components/schemas/ConsultationAttachment"},"type":"array","title":"Attachments","description":"Attached documents"},"photos":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Photos","description":"Photo objects"},"participation_constraints":{"$ref":"#/components/schemas/ParticipationConstraints","description":"Participation requirements"},"summary":{"$ref":"#/components/schemas/ConsultationSummary","description":"Consultation results/summary"},"additional_descriptions":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Additional Descriptions","description":"Additional description sections"},"browser_only":{"type":"boolean","title":"Browser Only","description":"Whether consultation is browser-only","default":false},"archival_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Archival Date","description":"Archival date if archived"}},"type":"object","required":["id","name","description","status","active_from","active_to","participation_constraints","summary"],"title":"ConsultationResponse","description":"Single public consultation","example":{"active_from":"2025-11-19T11:00:10Z","active_to":"2025-12-02T22:59:00Z","additional_descriptions":[],"attachments":[{"created_at":"2025-11-18T17:21:29Z","file_name":"kryteria.pdf","id":"019a97fc-59ca-4ba6-b3b0-a63a0a6e1bed","mime_type":"application/pdf","url":"https://konsultacjejst.blob.core.windows.net/consultations/dopiewo/file.pdf"}],"browser_only":false,"category":"Prawo lokalne","description":"<p>Konsultacje dotyczące kryteriów oceny...</p>","id":"019a54b0-5ef4-4902-a115-9b28ae521c16","name":"Kryteria oceny dróg gminnych","participation_constraints":{"require_company":false,"require_non_government_organization":false,"require_subordinate_organization":false,"require_verification":false},"photos":[],"status":"open","summary":{},"total_votes":22}},"ConsultationSummary":{"properties":{"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note","description":"Summary note or conclusions"},"attachment":{"anyOf":[{"$ref":"#/components/schemas/ConsultationAttachment"},{"type":"null"}],"description":"Summary document attachment"}},"type":"object","title":"ConsultationSummary","description":"Summary/results of a consultation"},"ConsultationsListResponse":{"properties":{"consultations":{"items":{"$ref":"#/components/schemas/ConsultationResponse"},"type":"array","title":"Consultations","description":"Consultations array"},"count":{"type":"integer","minimum":0.0,"title":"Count","description":"Number of consultations on this page"},"total":{"type":"integer","minimum":0.0,"title":"Total","description":"Total number of consultations"},"statuses":{"items":{"type":"string"},"type":"array","title":"Statuses","description":"Included status filters"},"pagination":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Pagination","description":"Pagination metadata"},"links":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Links","description":"HATEOAS pagination links"}},"type":"object","required":["consultations","count","total","statuses"],"title":"ConsultationsListResponse","description":"List of consultations","example":{"consultations":[],"count":0,"links":{"first":"http://localhost:8080/api/v1/consultations?limit=20&page=1","last":"http://localhost:8080/api/v1/consultations?limit=20&page=2","next":"http://localhost:8080/api/v1/consultations?limit=20&page=2","self":"http://localhost:8080/api/v1/consultations?limit=20&page=1"},"pagination":{"has_next":true,"has_prev":false,"page":1,"per_page":20,"total":36,"total_pages":2},"statuses":["open","archived"],"total":36}},"ContentCounts":{"properties":{"articles":{"type":"integer","title":"Articles","description":"Total articles"},"events":{"type":"integer","title":"Events","description":"Total events"},"upcoming_events":{"type":"integer","title":"Upcoming Events","description":"Upcoming events only"},"places":{"type":"integer","title":"Places","description":"Total places"},"questions":{"type":"integer","title":"Questions","description":"Total questions"}},"type":"object","required":["articles","events","upcoming_events","places","questions"],"title":"ContentCounts","description":"Content counts for statistics","example":{"articles":881,"events":25,"places":218,"questions":631,"upcoming_events":12}},"DashboardResponse":{"properties":{"latest_articles":{"items":{"$ref":"#/components/schemas/ArticleListItem"},"type":"array","title":"Latest Articles","description":"Latest 5 articles"},"upcoming_events":{"items":{"$ref":"#/components/schemas/EventListItem"},"type":"array","title":"Upcoming Events","description":"Upcoming 5 events"},"recent_questions":{"items":{"$ref":"#/components/schemas/QuestionListItem"},"type":"array","title":"Recent Questions","description":"Recent 3 questions"},"statistics":{"$ref":"#/components/schemas/DashboardStatistics","description":"Content statistics"},"generated_at":{"type":"string","title":"Generated At","description":"Generation timestamp (ISO 8601)"},"cache_ttl":{"type":"integer","title":"Cache Ttl","description":"Cache TTL in seconds"}},"type":"object","required":["latest_articles","upcoming_events","recent_questions","statistics","generated_at","cache_ttl"],"title":"DashboardResponse","description":"Dashboard aggregation response","example":{"cache_ttl":180,"generated_at":"2025-11-17T12:00:00+00:00","latest_articles":[{"categories":["News"],"id":"8ad9d9ab-8a92-4fba-b129-13bb6d36353c","published_at":"2025-11-17T10:00:00+00:00","summary":"Latest news...","title":"Municipality News","updated_at":"2025-11-17T10:00:00+00:00","url":"https://dopiewo.pl/aktualnosci/2025-11-17/news"}],"recent_questions":[{"answer":"<p>Next month.</p>","author_name":"Jan Kowalski","created_at":"2025-11-10T10:00:00+00:00","id":"6ad9d9ab-8a92-4fba-b129-13bb6d36353c","question":"<p>When will repairs start?</p>","title":"Road repairs question"}],"statistics":{"total_articles":881,"total_events":25,"total_places":218,"total_questions":631},"upcoming_events":[{"categories":["Events"],"duration_minutes":120,"end_time":"2025-11-20T18:00:00+00:00","id":"7ad9d9ab-8a92-4fba-b129-13bb6d36353c","start_time":"2025-11-20T16:00:00+00:00","summary":"Monthly meeting","title":"Community Meeting","url":"https://dopiewo.pl/wydarzenia/meeting"}]}},"DashboardStatistics":{"properties":{"total_articles":{"type":"integer","title":"Total Articles","description":"Total number of articles"},"total_events":{"type":"integer","title":"Total Events","description":"Total number of events"},"total_places":{"type":"integer","title":"Total Places","description":"Total number of places"},"total_questions":{"type":"integer","title":"Total Questions","description":"Total number of questions"}},"type":"object","required":["total_articles","total_events","total_places","total_questions"],"title":"DashboardStatistics","description":"Statistics for dashboard","example":{"total_articles":881,"total_events":25,"total_places":218,"total_questions":631}},"EventDetailResponse":{"properties":{"id":{"type":"string","title":"Id","description":"Event UUID"},"title":{"type":"string","title":"Title","description":"Event title"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary","description":"Event description/summary"},"start_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start Time","description":"Event start time (ISO 8601)"},"end_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End Time","description":"Event end time (ISO 8601)"},"duration_minutes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Minutes","description":"Event duration in minutes"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url","description":"Absolute URL to event page"},"categories":{"items":{"$ref":"#/components/schemas/CategoryResponse"},"type":"array","title":"Categories","description":"Event categories with IDs"},"featured_media":{"anyOf":[{"$ref":"#/components/schemas/MediaResponse"},{"type":"null"}],"description":"Featured image/media"},"content":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Content","description":"Event content paragraphs"}},"type":"object","required":["id","title"],"title":"EventDetailResponse","description":"Event detail view (full content)"},"EventListItem":{"properties":{"id":{"type":"string","title":"Id","description":"Event UUID"},"title":{"type":"string","title":"Title","description":"Event title"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary","description":"Event description/summary"},"start_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start Time","description":"Event start time (ISO 8601)"},"end_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End Time","description":"Event end time (ISO 8601)"},"duration_minutes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Minutes","description":"Event duration in minutes"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url","description":"Absolute URL to event page"},"categories":{"items":{"type":"string"},"type":"array","title":"Categories","description":"Event categories"}},"type":"object","required":["id","title"],"title":"EventListItem","description":"Event in list view","example":{"categories":["Meetings","Community"],"duration_minutes":120,"end_time":"2025-11-20T18:00:00+00:00","id":"b2c3d4e5-f6g7-8901-bcde-f01234567891","start_time":"2025-11-20T16:00:00+00:00","summary":"Monthly community meeting to discuss local issues","title":"Community Meeting","url":"https://dopiewo.pl/wydarzenia/2025-11-20/community-meeting"}},"EventListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/EventListItem"},"type":"array","title":"Items","description":"List of events"},"pagination":{"$ref":"#/components/schemas/PaginationResponse","description":"Pagination metadata"},"links":{"anyOf":[{"$ref":"#/components/schemas/PaginationLinks"},{"type":"null"}],"description":"HATEOAS navigation links (PODP compliant)"}},"type":"object","required":["items","pagination"],"title":"EventListResponse","description":"Events list response with pagination"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"LocationResponse":{"properties":{"lat":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lat","description":"Latitude"},"lon":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lon","description":"Longitude"},"geo_type":{"type":"string","title":"Geo Type","description":"Geographic type (usually Point)","default":"Point"}},"type":"object","title":"LocationResponse","description":"Geographic location","example":{"geo_type":"Point","lat":52.4567,"lon":16.8234}},"MediaResponse":{"properties":{"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url","description":"Absolute URL to media file"},"alt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Alt","description":"Alternative text"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title","description":"Media title"}},"type":"object","title":"MediaResponse","description":"Media object (image, document, etc.)","example":{"alt":"Sample image","title":"Featured Image","url":"https://dopiewo.pl/ff/media-images/2025-11/image.jpg"}},"NearbyPlaceItem":{"properties":{"id":{"type":"string","title":"Id","description":"Place UUID"},"title":{"type":"string","title":"Title","description":"Place name"},"address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address","description":"Street address"},"phone":{"items":{"type":"string"},"type":"array","title":"Phone","description":"Phone numbers"},"email":{"anyOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Email","description":"Email address (can be string or array)"},"location":{"anyOf":[{"$ref":"#/components/schemas/LocationResponse"},{"type":"null"}],"description":"Geographic coordinates"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url","description":"Absolute URL to place page"},"categories":{"items":{"type":"string"},"type":"array","title":"Categories","description":"Place categories"},"distance_km":{"type":"number","minimum":0.0,"title":"Distance Km","description":"Distance from center point in kilometers"}},"type":"object","required":["id","title","distance_km"],"title":"NearbyPlaceItem","description":"Place with distance information","example":{"address":"ul. Leśna 1","categories":["Government"],"distance_km":1.2,"email":"api@dopiewo.pl","id":"8ad9d9ab-8a92-4fba-b129-13bb6d36353c","location":{"geo_type":"Point","lat":52.4567,"lon":16.8234},"phone":["+48 61 814 29 00"],"title":"Municipal Office","url":"https://dopiewo.pl/miejsca/urzad"}},"NearbyPlacesResponse":{"properties":{"center":{"$ref":"#/components/schemas/LocationResponse","description":"Center point for search"},"radius_km":{"type":"number","minimum":0.0,"title":"Radius Km","description":"Search radius in kilometers"},"places":{"items":{"$ref":"#/components/schemas/NearbyPlaceItem"},"type":"array","title":"Places","description":"Places within radius, sorted by distance"},"count":{"type":"integer","minimum":0.0,"title":"Count","description":"Number of places found"}},"type":"object","required":["center","radius_km","places","count"],"title":"NearbyPlacesResponse","description":"Nearby places response","example":{"center":{"geo_type":"Point","lat":52.356,"lon":16.672},"count":1,"places":[{"address":"ul. Leśna 1","categories":["Government"],"distance_km":1.2,"email":"api@dopiewo.pl","id":"8ad9d9ab-8a92-4fba-b129-13bb6d36353c","location":{"geo_type":"Point","lat":52.4567,"lon":16.8234},"phone":["+48 61 814 29 00"],"title":"Municipal Office","url":"https://dopiewo.pl/miejsca/urzad"}],"radius_km":5.0}},"PaginationLinks":{"properties":{"self":{"type":"string","title":"Self","description":"Link to current page"},"first":{"type":"string","title":"First","description":"Link to first page"},"last":{"type":"string","title":"Last","description":"Link to last page"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next","description":"Link to next page (null if on last page)"},"prev":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prev","description":"Link to previous page (null if on first page)"}},"type":"object","required":["self","first","last"],"title":"PaginationLinks","description":"HATEOAS navigation links for pagination (PODP compliant)","example":{"first":"https://api.dopiewo.pl/api/v1/articles?page=1&limit=20","last":"https://api.dopiewo.pl/api/v1/articles?page=8&limit=20","next":"https://api.dopiewo.pl/api/v1/articles?page=3&limit=20","prev":"https://api.dopiewo.pl/api/v1/articles?page=1&limit=20","self":"https://api.dopiewo.pl/api/v1/articles?page=2&limit=20"}},"PaginationResponse":{"properties":{"page":{"type":"integer","minimum":1.0,"title":"Page","description":"Current page number"},"per_page":{"type":"integer","minimum":1.0,"title":"Per Page","description":"Items per page"},"total":{"type":"integer","minimum":0.0,"title":"Total","description":"Total number of items"},"total_pages":{"type":"integer","minimum":0.0,"title":"Total Pages","description":"Total number of pages"},"has_next":{"type":"boolean","title":"Has Next","description":"Whether there is a next page"},"has_prev":{"type":"boolean","title":"Has Prev","description":"Whether there is a previous page"}},"type":"object","required":["page","per_page","total","total_pages","has_next","has_prev"],"title":"PaginationResponse","description":"Pagination metadata for list responses","example":{"has_next":true,"has_prev":false,"page":1,"per_page":20,"total":150,"total_pages":8}},"ParticipationConstraints":{"properties":{"require_non_government_organization":{"type":"boolean","title":"Require Non Government Organization","description":"Requires NGO affiliation"},"require_subordinate_organization":{"type":"boolean","title":"Require Subordinate Organization","description":"Requires subordinate organization"},"require_company":{"type":"boolean","title":"Require Company","description":"Requires company affiliation"},"require_verification":{"type":"boolean","title":"Require Verification","description":"Requires identity verification"}},"type":"object","required":["require_non_government_organization","require_subordinate_organization","require_company","require_verification"],"title":"ParticipationConstraints","description":"Constraints on who can participate"},"PlaceDetailResponse":{"properties":{"id":{"type":"string","title":"Id","description":"Place UUID"},"title":{"type":"string","title":"Title","description":"Place name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Place description (HTML)"},"address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address","description":"Street address"},"phone":{"items":{"type":"string"},"type":"array","title":"Phone","description":"Phone numbers"},"email":{"anyOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Email","description":"Email address (can be string or array)"},"website":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website","description":"Website URL"},"location":{"anyOf":[{"$ref":"#/components/schemas/LocationResponse"},{"type":"null"}],"description":"Geographic coordinates"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url","description":"Absolute URL to place page"},"categories":{"items":{"$ref":"#/components/schemas/CategoryResponse"},"type":"array","title":"Categories","description":"Place categories with IDs"},"featured_media":{"anyOf":[{"$ref":"#/components/schemas/MediaResponse"},{"type":"null"}],"description":"Featured image/media"}},"type":"object","required":["id","title"],"title":"PlaceDetailResponse","description":"Place detail view (full content)"},"PlaceListItem":{"properties":{"id":{"type":"string","title":"Id","description":"Place UUID"},"title":{"type":"string","title":"Title","description":"Place name"},"address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address","description":"Street address"},"phone":{"items":{"type":"string"},"type":"array","title":"Phone","description":"Phone numbers"},"email":{"anyOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Email","description":"Email address (can be string or array)"},"location":{"anyOf":[{"$ref":"#/components/schemas/LocationResponse"},{"type":"null"}],"description":"Geographic coordinates"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url","description":"Absolute URL to place page"},"categories":{"items":{"type":"string"},"type":"array","title":"Categories","description":"Place categories"}},"type":"object","required":["id","title"],"title":"PlaceListItem","description":"Place in list view","example":{"address":"ul. Leśna 1, 62-070 Dopiewo","categories":["Government","Services"],"email":"api@dopiewo.pl","id":"c3d4e5f6-g7h8-9012-cdef-012345678902","location":{"geo_type":"Point","lat":52.4567,"lon":16.8234},"phone":["+48 61 814 29 00"],"title":"Municipal Office","url":"https://dopiewo.pl/miejsca/urzad-gminy"}},"PlaceListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/PlaceListItem"},"type":"array","title":"Items","description":"List of places"},"pagination":{"$ref":"#/components/schemas/PaginationResponse","description":"Pagination metadata"},"links":{"anyOf":[{"$ref":"#/components/schemas/PaginationLinks"},{"type":"null"}],"description":"HATEOAS navigation links (PODP compliant)"}},"type":"object","required":["items","pagination"],"title":"PlaceListResponse","description":"Places list response with pagination"},"PlanningPermission":{"properties":{"nrdecyzji":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nrdecyzji","description":"Decision number (Numer decyzji)"},"data":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Data","description":"Decision date (Data decyzji)"},"nrdzialki":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nrdzialki","description":"Plot number (Numer działki)"},"miejscowosc":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Miejscowosc","description":"Locality/village (Miejscowość)"},"adres":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Adres","description":"Street address (Adres)"},"rodzaj":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rodzaj","description":"Type of development (Rodzaj inwestycji)"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status","description":"Status of the decision (Status)"},"uwagi":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Uwagi","description":"Additional notes (Uwagi)"}},"type":"object","title":"PlanningPermission","description":"Planning permission record (Warunek Zabudowy).\n\nRepresents a single planning permission decision for building/development.","example":{"miejscowosc":"Lisówki","nrdecyzji":"2025/316","nrdzialki":"295/41","rodzaj":"budynek mieszkalny jednorodzinny","status":"w toku"}},"PlanningPermissionList":{"properties":{"items":{"items":{"$ref":"#/components/schemas/PlanningPermission"},"type":"array","title":"Items","description":"Planning permission records"},"pagination":{"$ref":"#/components/schemas/PaginationResponse","description":"Pagination metadata"},"links":{"anyOf":[{"$ref":"#/components/schemas/PaginationLinks"},{"type":"null"}],"description":"HATEOAS navigation links (PODP compliant)"}},"type":"object","required":["items","pagination"],"title":"PlanningPermissionList","description":"List of planning permissions with pagination metadata."},"PlanningPermissionStats":{"properties":{"total_records":{"type":"integer","title":"Total Records","description":"Total number of records"},"status_breakdown":{"additionalProperties":{"type":"integer"},"type":"object","title":"Status Breakdown","description":"Count of records by status"},"localities":{"items":{"type":"string"},"type":"array","title":"Localities","description":"List of unique localities"},"last_updated":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Updated","description":"Last data refresh timestamp (ISO 8601)"}},"type":"object","required":["total_records","status_breakdown","localities"],"title":"PlanningPermissionStats","description":"Statistics about planning permissions data."},"QuestionDetailResponse":{"properties":{"id":{"type":"string","title":"Id","description":"Question UUID"},"title":{"type":"string","title":"Title","description":"Question title"},"author_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Author Name","description":"Name of person asking"},"question":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Question","description":"Question text (HTML)"},"answer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Answer","description":"Answer text (HTML)"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Additional description (HTML)"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At","description":"Creation date (ISO 8601)"},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At","description":"Last update date (ISO 8601)"}},"type":"object","required":["id","title"],"title":"QuestionDetailResponse","description":"Question detail view"},"QuestionListItem":{"properties":{"id":{"type":"string","title":"Id","description":"Question UUID"},"title":{"type":"string","title":"Title","description":"Question title"},"author_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Author Name","description":"Name of person asking"},"question":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Question","description":"Question text (HTML)"},"answer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Answer","description":"Answer text (HTML)"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At","description":"Creation date (ISO 8601)"}},"type":"object","required":["id","title"],"title":"QuestionListItem","description":"Question to mayor in list view","example":{"answer":"<p>The repairs are scheduled for next month.</p>","author_name":"Jan Kowalski","created_at":"2025-11-10T10:00:00+00:00","id":"d4e5f6g7-h8i9-0123-defg-123456789013","question":"<p>When will the road on Main Street be repaired?</p>","title":"Question about road repairs"}},"QuestionListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/QuestionListItem"},"type":"array","title":"Items","description":"List of questions"},"pagination":{"$ref":"#/components/schemas/PaginationResponse","description":"Pagination metadata"},"links":{"anyOf":[{"$ref":"#/components/schemas/PaginationLinks"},{"type":"null"}],"description":"HATEOAS navigation links (PODP compliant)"}},"type":"object","required":["items","pagination"],"title":"QuestionListResponse","description":"Questions list response with pagination"},"RelatedArticlesResponse":{"properties":{"article_id":{"type":"string","title":"Article Id","description":"Source article UUID"},"related":{"items":{"$ref":"#/components/schemas/ArticleListItem"},"type":"array","title":"Related","description":"Related articles"},"count":{"type":"integer","minimum":0.0,"title":"Count","description":"Number of related articles"}},"type":"object","required":["article_id","related","count"],"title":"RelatedArticlesResponse","description":"Related articles response","example":{"article_id":"a1b2c3d4-e5f6-7890-abcd-ef1234567890","count":5,"related":[{"categories":["News"],"id":"b2c3d4e5-f6g7-8901-bcde-f01234567891","published_at":"2025-11-10T10:00:00+00:00","summary":"Another article...","title":"Related Article","updated_at":"2025-11-10T10:00:00+00:00","url":"https://dopiewo.pl/aktualnosci/related"}]}},"SearchFacets":{"properties":{"article":{"type":"integer","title":"Article","description":"Number of article results","default":0},"event":{"type":"integer","title":"Event","description":"Number of event results","default":0},"place":{"type":"integer","title":"Place","description":"Number of place results","default":0},"question":{"type":"integer","title":"Question","description":"Number of question results","default":0}},"type":"object","title":"SearchFacets","description":"Search result counts by content type","example":{"article":25,"event":10,"place":5,"question":2}},"SearchResponse":{"properties":{"query":{"type":"string","title":"Query","description":"Search query string"},"total_results":{"type":"integer","minimum":0.0,"title":"Total Results","description":"Total number of results"},"items":{"items":{"$ref":"#/components/schemas/SearchResultItem"},"type":"array","title":"Items","description":"Search results"},"pagination":{"$ref":"#/components/schemas/PaginationResponse","description":"Pagination metadata"},"links":{"anyOf":[{"$ref":"#/components/schemas/PaginationLinks"},{"type":"null"}],"description":"HATEOAS navigation links (PODP compliant)"},"facets":{"$ref":"#/components/schemas/SearchFacets","description":"Result counts by content type"}},"type":"object","required":["query","total_results","items","pagination","facets"],"title":"SearchResponse","description":"Search results response","example":{"facets":{"article":25,"event":10,"place":5,"question":2},"items":[{"content_type":"article","id":"8ad9d9ab-8a92-4fba-b129-13bb6d36353c","matched_fields":["title"],"published_at":"2025-11-14T19:46:58+00:00","relevance_score":0.95,"summary":"Budget details...","title":"Budget Project","url":"https://dopiewo.pl/aktualnosci/budget"}],"pagination":{"has_next":true,"has_prev":false,"page":1,"per_page":20,"total":42,"total_pages":3},"query":"budget","total_results":42}},"SearchResultItem":{"properties":{"content_type":{"type":"string","title":"Content Type","description":"Content type (article, event, place, question)"},"id":{"type":"string","title":"Id","description":"Content UUID"},"title":{"type":"string","title":"Title","description":"Content title"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary","description":"Content summary/excerpt"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url","description":"Absolute URL to content page"},"relevance_score":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Relevance Score","description":"Relevance score (0.0-1.0)"},"published_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Published At","description":"Publication date (ISO 8601)"},"matched_fields":{"items":{"type":"string"},"type":"array","title":"Matched Fields","description":"Fields that matched the query"}},"type":"object","required":["content_type","id","title","relevance_score"],"title":"SearchResultItem","description":"Single search result item","example":{"content_type":"article","id":"a1b2c3d4-e5f6-7890-abcd-ef1234567890","matched_fields":["title","summary"],"published_at":"2025-11-14T19:46:58+00:00","relevance_score":0.95,"summary":"In the prepared budget project...","title":"Budget Project for 2026","url":"https://dopiewo.pl/aktualnosci/2025-11-14/budget-2026"}},"SimpleBIPNewsItem":{"properties":{"id":{"type":"integer","title":"Id","description":"Unique identifier"},"title":{"type":"string","title":"Title","description":"Article title"},"content":{"type":"string","title":"Content","description":"Article content/summary"},"slug":{"type":"string","title":"Slug","description":"URL-friendly identifier"},"published_date":{"type":"string","title":"Published Date","description":"Publication date (ISO 8601)"},"url":{"type":"string","title":"Url","description":"Full URL to article"}},"type":"object","required":["id","title","content","slug","published_date","url"],"title":"SimpleBIPNewsItem","description":"Simplified BIP news item for gateway response"},"SimpleBIPNewsResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/SimpleBIPNewsItem"},"type":"array","title":"Items","description":"List of news items"},"pagination":{"$ref":"#/components/schemas/PaginationResponse","description":"Pagination metadata"},"links":{"anyOf":[{"$ref":"#/components/schemas/PaginationLinks"},{"type":"null"}],"description":"HATEOAS navigation links (PODP compliant)"}},"type":"object","required":["items","pagination"],"title":"SimpleBIPNewsResponse","description":"Simplified BIP news response for gateway"},"SimpleBIPOrderItem":{"properties":{"id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Id","description":"Document identifier (if available)"},"title":{"type":"string","title":"Title","description":"Document title"},"slug":{"type":"string","title":"Slug","description":"Document slug"},"published_date":{"type":"string","title":"Published Date","description":"Publication date (ISO 8601)"},"url":{"type":"string","title":"Url","description":"Full URL to document"}},"type":"object","required":["title","slug","published_date","url"],"title":"SimpleBIPOrderItem","description":"Simplified order item for gateway response"},"SimpleBIPOrdersResponse":{"properties":{"category_id":{"type":"integer","title":"Category Id","description":"Category identifier"},"category_name":{"type":"string","title":"Category Name","description":"Category name"},"items":{"items":{"$ref":"#/components/schemas/SimpleBIPOrderItem"},"type":"array","title":"Items","description":"List of Mayor's Executive Orders"},"pagination":{"$ref":"#/components/schemas/PaginationResponse","description":"Pagination metadata"},"links":{"anyOf":[{"$ref":"#/components/schemas/PaginationLinks"},{"type":"null"}],"description":"HATEOAS navigation links (PODP compliant)"}},"type":"object","required":["category_id","category_name","items","pagination"],"title":"SimpleBIPOrdersResponse","description":"Simplified orders response for gateway"},"StatisticsResponse":{"properties":{"content_counts":{"$ref":"#/components/schemas/ContentCounts","description":"Content counts by type"},"latest_update":{"type":"string","title":"Latest Update","description":"Most recent content update (ISO 8601)"},"cache_expires_at":{"type":"string","title":"Cache Expires At","description":"Cache expiration timestamp (ISO 8601)"}},"type":"object","required":["content_counts","latest_update","cache_expires_at"],"title":"StatisticsResponse","description":"Statistics endpoint response","example":{"cache_expires_at":"2025-11-17T10:35:00+00:00","content_counts":{"articles":881,"events":25,"places":218,"questions":631,"upcoming_events":12},"latest_update":"2025-11-17T10:30:00+00:00"}},"SurveyAnswer":{"properties":{"id":{"type":"string","title":"Id","description":"Answer UUID"},"order":{"type":"integer","title":"Order","description":"Answer order"},"answer_text":{"type":"string","title":"Answer Text","description":"Answer text"},"weight":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Weight","description":"Answer weight for scoring"},"image":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image","description":"Answer image URL"}},"type":"object","required":["id","order","answer_text"],"title":"SurveyAnswer","description":"Survey answer option"},"SurveyQuestion":{"properties":{"id":{"type":"string","title":"Id","description":"Question UUID"},"order":{"type":"integer","title":"Order","description":"Question order"},"question_text":{"type":"string","title":"Question Text","description":"Question text"}},"type":"object","required":["id","order","question_text"],"title":"SurveyQuestion","description":"Survey question in a consultation"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"VersionResponse":{"properties":{"api-version":{"$ref":"#/components/schemas/APIVersion","description":"API version details"}},"type":"object","required":["api-version"],"title":"VersionResponse","description":"Version endpoint response."},"ErrorResponse":{"type":"object","properties":{"error":{"type":"string","description":"Error type identifier","example":"rate_limit_exceeded"},"message":{"type":"string","description":"Human-readable error message","example":"Too many requests. Please try again later."},"details":{"type":"array","items":{"type":"object"},"description":"Additional error details (optional)"}}}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key","description":"\nAPI key for authentication. Required for administrative endpoints.\n\n**How to get an API key:**\n1. Contact IT Department at api@dopiewo.pl\n2. Provide your use case and organization details\n3. Receive your API key securely\n\n**How to use:**\nInclude the API key in the `X-API-Key` header:\n```\nX-API-Key: your_api_key_here\n```\n\n**Security:**\n- Keep your API key confidential\n- Do not expose it in client-side code\n- Rotate keys periodically\n- Contact us immediately if compromised\n            "}}},"tags":[{"name":"articles","description":"News articles and announcements from Gmina Dopiewo. Retrieve paginated lists, detailed articles, and find related content."},{"name":"events","description":"Events and calendar from Gmina Dopiewo. Get event listings, details, and filter by upcoming events."},{"name":"places","description":"Places of interest and locations in Gmina Dopiewo. Search by location, find nearby places using geographic coordinates."},{"name":"questions","description":"Questions to the Mayor. Browse published questions and answers from citizens."},{"name":"aggregation","description":"Aggregated data from multiple content types. Get dashboard overview with latest content from all categories."},{"name":"search","description":"Full-text search across all content types (articles, events, places, questions). Search by keywords with relevance ranking."},{"name":"statistics","description":"Content statistics and counts. Get total counts for all content types."},{"name":"bip","description":"BIP (Biuletyn Informacji Publicznej) endpoints. Access official public information bulletin data including news and Mayor's Executive Orders."},{"name":"wz","description":"Planning permissions (Warunki Zabudowy) endpoints. Access building conditions and planning permission data. Search by decision number, locality, or plot number."},{"name":"consultations","description":"Public consultations (Konsultacje Społeczne) endpoints. Access civic engagement platform data including open, archived, and draft consultations on municipal matters."},{"name":"metadata","description":"Metadata and compliance endpoints. Provides DCAT-AP metadata for open data catalog integration and license information."},{"name":"health","description":"Health check and monitoring endpoints. Use these to check API and backend service status."},{"name":"admin","description":"Administrative endpoints (restricted access). Requires API key authentication. Manage cache, API keys, and system operations."}]}