{
    "openapi": "3.1.0",
    "info": {
        "title": "Składy Opałów - API",
        "version": "1.0.0",
        "summary": "Składy opału przypisane do gmin, ceny opału (GUS i składy) i przepisy antysmogowe województw.",
        "description": "Publiczne API tylko do odczytu, bez klucza. Dokumentacja i zasady użycia: https://skladyopalow.pl/api/. Każdy wpis składu ma pole source.data_status - cytując, podawaj je razem z adresem strony (pole url).",
        "contact": {
            "name": "Składy Opałów",
            "email": "kontakt@skladyopalow.pl",
            "url": "https://skladyopalow.pl/kontakt/"
        },
        "termsOfService": "https://skladyopalow.pl/api/#zasady",
        "license": {
            "name": "Cytowanie z podaniem źródła; dane OpenStreetMap na licencji ODbL - zasady: https://skladyopalow.pl/api/#zasady",
            "url": "https://skladyopalow.pl/api/#zasady"
        }
    },
    "security": [],
    "servers": [
        {
            "url": "https://skladyopalow.pl/wp-json/so/v1"
        }
    ],
    "externalDocs": {
        "description": "Dokumentacja z przykładami",
        "url": "https://skladyopalow.pl/api/"
    },
    "paths": {
        "/locations": {
            "get": {
                "operationId": "locations",
                "summary": "Wyszukiwanie lokalizacji",
                "description": "Zamienia nazwę miejscowości, gminy albo kod pocztowy na stronę gminy w katalogu. Zwraca do 8 podpowiedzi.",
                "parameters": [
                    {
                        "name": "q",
                        "in": "query",
                        "required": true,
                        "description": "Nazwa miejscowości, gminy albo kod pocztowy (także fragment, bez polskich znaków też działa).",
                        "schema": {
                            "type": "string",
                            "minLength": 2
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "array",
                                    "items": {
                                        "$ref": "#/components/schemas/Lokalizacja"
                                    }
                                },
                                "examples": {
                                    "przyklad1": {
                                        "summary": "Gdzie w katalogu jest Mińsk Mazowiecki?",
                                        "description": "GET /locations?q=Mińsk Mazowiecki (odpowiedź skrócona)",
                                        "value": [
                                            {
                                                "type": "municipality",
                                                "label": "Mińsk Mazowiecki (gmina wiejska)",
                                                "name": "Mińsk Mazowiecki",
                                                "description": "pow. miński, mazowieckie",
                                                "url": "https://skladyopalow.pl/sklady-opalu/mazowieckie/minski/gmina-minsk-mazowiecki/"
                                            },
                                            {
                                                "type": "municipality",
                                                "label": "Mińsk Mazowiecki",
                                                "name": "Mińsk Mazowiecki",
                                                "description": "pow. miński, mazowieckie",
                                                "url": "https://skladyopalow.pl/sklady-opalu/mazowieckie/minski/minsk-mazowiecki/"
                                            }
                                        ]
                                    },
                                    "przyklad2": {
                                        "summary": "Do której gminy należy kod 05-300?",
                                        "description": "GET /locations?q=05-300 (odpowiedź skrócona)",
                                        "value": [
                                            {
                                                "type": "postcode",
                                                "label": "05-300 Mińsk Mazowiecki, Karolina, Stojadła, T…",
                                                "description": "pow. miński, mazowieckie",
                                                "url": "https://skladyopalow.pl/sklady-opalu/mazowieckie/minski/gmina-minsk-mazowiecki/?kod=05-300"
                                            }
                                        ]
                                    }
                                }
                            }
                        }
                    },
                    "400": {
                        "description": "Błędne albo brakujące parametry",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Blad"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Nie znaleziono (jednostki, kodu, składu, paliwa)",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Blad"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/locate": {
            "get": {
                "operationId": "locate",
                "summary": "Gmina dla punktu",
                "description": "Zwraca gminę, w której leży punkt (granice z Państwowego Rejestru Granic, dokładność około 100 m), i adres jej strony.",
                "parameters": [
                    {
                        "name": "lat",
                        "in": "query",
                        "required": true,
                        "description": "Szerokość geograficzna (WGS84), w Polsce 48,8-55,1.",
                        "schema": {
                            "type": "number"
                        }
                    },
                    {
                        "name": "lon",
                        "in": "query",
                        "required": true,
                        "description": "Długość geograficzna (WGS84), w Polsce 13,9-24,3.",
                        "schema": {
                            "type": "number"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Gdzie"
                                },
                                "examples": {
                                    "przyklad1": {
                                        "summary": "W jakiej gminie jest punkt 52,18 N 21,56 E?",
                                        "description": "GET /locate?lat=52.18&lon=21.56 (odpowiedź skrócona)",
                                        "value": {
                                            "municipality": "Mińsk Mazowiecki",
                                            "teryt": "1412011",
                                            "description": "pow. miński, mazowieckie",
                                            "url": "https://skladyopalow.pl/sklady-opalu/mazowieckie/minski/minsk-mazowiecki/?p=52.18,21.56"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "400": {
                        "description": "Błędne albo brakujące parametry",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Blad"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Nie znaleziono (jednostki, kodu, składu, paliwa)",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Blad"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/stores": {
            "get": {
                "operationId": "stores",
                "summary": "Składy opału",
                "description": "Składy w jednostce (teryt) albo najbliższe od punktu (kod pocztowy albo lat i lon), z odległością w linii prostej. Każdy wpis ma status danych - cytując, podawaj go.",
                "parameters": [
                    {
                        "name": "lat",
                        "in": "query",
                        "required": false,
                        "description": "Szerokość geograficzna punktu (WGS84). Razem z lon - składy posortowane od najbliższego.",
                        "schema": {
                            "type": "number",
                            "minimum": 48.8,
                            "maximum": 55.1
                        }
                    },
                    {
                        "name": "lon",
                        "in": "query",
                        "required": false,
                        "description": "Długość geograficzna punktu (WGS84).",
                        "schema": {
                            "type": "number",
                            "minimum": 13.9,
                            "maximum": 24.3
                        }
                    },
                    {
                        "name": "postcode",
                        "in": "query",
                        "required": false,
                        "description": "Kod pocztowy - punktem odniesienia jest środek zabudowy obszaru kodu. Zamiast lat i lon.",
                        "schema": {
                            "type": "string",
                            "pattern": "^[0-9]{2}-?[0-9]{3}$"
                        }
                    },
                    {
                        "name": "teryt",
                        "in": "query",
                        "required": false,
                        "description": "TERYT gminy, powiatu albo województwa - składy przypisane do jednostki (bez odległości). Ma pierwszeństwo przed punktem.",
                        "schema": {
                            "type": "string",
                            "pattern": "^[0-9]{2}([0-9]{2}([0-9]{3})?)?$"
                        }
                    },
                    {
                        "name": "radius",
                        "in": "query",
                        "required": false,
                        "description": "Promień wyszukiwania od punktu w km (linia prosta).",
                        "schema": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 50,
                            "default": 25
                        }
                    },
                    {
                        "name": "fuel",
                        "in": "query",
                        "required": false,
                        "description": "Tylko składy z tym paliwem w ofercie. \"wegiel\" obejmuje też sortymenty (kostka, orzech, groszek, ekogroszek, miał).",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "wegiel",
                                "ekogroszek",
                                "wegiel-kostka",
                                "wegiel-orzech",
                                "wegiel-groszek",
                                "mial-weglowy",
                                "pellet",
                                "brykiet",
                                "drewno-kominkowe"
                            ]
                        }
                    },
                    {
                        "name": "limit",
                        "in": "query",
                        "required": false,
                        "description": "Maksymalna liczba wyników.",
                        "schema": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 100,
                            "default": 20
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "array",
                                    "items": {
                                        "$ref": "#/components/schemas/Sklad"
                                    }
                                },
                                "examples": {
                                    "przyklad1": {
                                        "summary": "Najbliższe składy z ekogroszkiem od kodu 05-300",
                                        "description": "GET /stores?postcode=05-300&fuel=ekogroszek&limit=5 (odpowiedź skrócona)",
                                        "value": [
                                            {
                                                "id": 584,
                                                "name": "Selmat",
                                                "url": "https://skladyopalow.pl/sklad/selmat-minsk-mazowiecki/",
                                                "address": "Wyszyńskiego 56, 05-300 Mińsk Mazowiecki",
                                                "nip": "8221259640",
                                                "phone": "25 758 27 39",
                                                "website": "https://www.facebook.com/selmatbud",
                                                "lat": 52.182763,
                                                "lon": 21.547012,
                                                "location_approximate": false,
                                                "distance_km": 1.4,
                                                "municipality": {
                                                    "name": "Mińsk Mazowiecki",
                                                    "teryt": "1412011",
                                                    "url": "https://skladyopalow.pl/sklady-opalu/mazowieckie/minski/minsk-mazowiecki/"
                                                },
                                                "fuels": [
                                                    "Drewno kominkowe",
                                                    "Ekogroszek",
                                                    "Miał węglowy"
                                                ],
                                                "hours": null,
                                                "featured": false,
                                                "source": {
                                                    "data_status": "unverified",
                                                    "description": "Dane z otwartych źródeł, niezweryfikowane",
                                                    "origin": "Składy Opałów",
                                                    "verified_at": null,
                                                    "updated_at": "2026-10-01"
                                                }
                                            },
                                            {
                                                "id": 581,
                                                "name": "AVANT Michał Kamiński",
                                                "url": "https://skladyopalow.pl/sklad/sklad-opalu-stojadla-stojadla/",
                                                "address": "Warszawska 6, 05-300 Mińsk Mazowiecki",
                                                "nip": "8222234501",
                                                "phone": "797 328 708",
                                                "website": "https://www.facebook.com/100063804563052",
                                                "lat": 52.188981,
                                                "lon": 21.540827,
                                                "location_approximate": false,
                                                "distance_km": 2.1,
                                                "municipality": {
                                                    "name": "Mińsk Mazowiecki",
                                                    "teryt": "1412112",
                                                    "url": "https://skladyopalow.pl/sklady-opalu/mazowieckie/minski/gmina-minsk-mazowiecki/"
                                                },
                                                "fuels": [
                                                    "Brykiet",
                                                    "Ekogroszek",
                                                    "Miał węglowy"
                                                ],
                                                "hours": null,
                                                "featured": false,
                                                "source": {
                                                    "data_status": "unverified",
                                                    "description": "Dane z otwartych źródeł, niezweryfikowane",
                                                    "origin": "Składy Opałów",
                                                    "verified_at": null,
                                                    "updated_at": "2026-10-01"
                                                }
                                            }
                                        ]
                                    },
                                    "przyklad2": {
                                        "summary": "Składy w mieście Mińsk Mazowiecki (TERYT 1412011)",
                                        "description": "GET /stores?teryt=1412011 (odpowiedź skrócona)",
                                        "value": [
                                            {
                                                "id": 649,
                                                "name": "\"Hydro Centrum D. K. Koperscy, M. Mastalerz sp.j.\"",
                                                "url": "https://skladyopalow.pl/sklad/hydro-centrum-d-k-koperscy-m-mastalerz-sp-j-minsk-mazowiecki/",
                                                "address": "Stefana Kardynała Wyszyńskiego 77, 05-300 Mińsk Mazowiecki",
                                                "nip": "8222101415",
                                                "phone": "25 758 18 19",
                                                "website": "https://www.hydrocentrum.pl",
                                                "lat": 52.181961,
                                                "lon": 21.54568,
                                                "location_approximate": true,
                                                "distance_km": null,
                                                "municipality": {
                                                    "name": "Mińsk Mazowiecki",
                                                    "teryt": "1412011",
                                                    "url": "https://skladyopalow.pl/sklady-opalu/mazowieckie/minski/minsk-mazowiecki/"
                                                },
                                                "fuels": [
                                                    "Węgiel"
                                                ],
                                                "hours": null,
                                                "featured": false,
                                                "source": {
                                                    "data_status": "unverified",
                                                    "description": "Dane z otwartych źródeł, niezweryfikowane",
                                                    "origin": "Składy Opałów",
                                                    "verified_at": null,
                                                    "updated_at": "2026-10-01"
                                                }
                                            },
                                            {
                                                "id": 6428,
                                                "name": "PHU Topaz sp. z o.o. sklep nr 52",
                                                "url": "https://skladyopalow.pl/sklad/phu-topaz-sp-z-o-o-sklep-nr-52-minsk-mazowiecki/",
                                                "address": "Dąbrówki 52, 05-300 Mińsk Mazowiecki",
                                                "nip": null,
                                                "phone": "519 759 116",
                                                "website": null,
                                                "lat": 52.172631,
                                                "lon": 21.586205,
                                                "location_approximate": false,
                                                "distance_km": null,
                                                "municipality": {
                                                    "name": "Mińsk Mazowiecki",
                                                    "teryt": "1412011",
                                                    "url": "https://skladyopalow.pl/sklady-opalu/mazowieckie/minski/minsk-mazowiecki/"
                                                },
                                                "fuels": [
                                                    "Węgiel",
                                                    "Węgiel groszek"
                                                ],
                                                "hours": null,
                                                "featured": false,
                                                "source": {
                                                    "data_status": "unverified",
                                                    "description": "Dane z otwartych źródeł, niezweryfikowane",
                                                    "origin": "Składy Opałów",
                                                    "verified_at": null,
                                                    "updated_at": "2026-10-02"
                                                }
                                            }
                                        ]
                                    },
                                    "przyklad3": {
                                        "summary": "Składy z pelletem w promieniu 15 km od punktu",
                                        "description": "GET /stores?lat=52.23&lon=21.01&radius=15&fuel=pellet (odpowiedź skrócona)",
                                        "value": [
                                            {
                                                "id": 1353,
                                                "name": "Bricoman Warszawa Połczyńska",
                                                "url": "https://skladyopalow.pl/sklad/bricoman-warszawa-polczynska-warszawa/",
                                                "address": "Połczyńska 121/125, 01-303 Warszawa",
                                                "nip": "1132568413",
                                                "phone": "22 123 02 60",
                                                "website": "https://www.bricoman.pl/nasze-sklepy/warszawa-polczynska.html",
                                                "lat": 52.216386,
                                                "lon": 20.885707,
                                                "location_approximate": false,
                                                "distance_km": 8.6,
                                                "municipality": {
                                                    "name": "Warszawa",
                                                    "teryt": "1465011",
                                                    "url": "https://skladyopalow.pl/sklady-opalu/mazowieckie/warszawa/"
                                                },
                                                "fuels": [
                                                    "Brykiet",
                                                    "Pellet"
                                                ],
                                                "hours": {
                                                    "mon": "6:00-21:00",
                                                    "tue": "6:00-21:00",
                                                    "wed": "6:00-21:00",
                                                    "thu": "6:00-21:00",
                                                    "fri": "6:00-21:00",
                                                    "sat": "7:00-21:00",
                                                    "sun": "nieczynne"
                                                },
                                                "featured": false,
                                                "source": {
                                                    "data_status": "unverified",
                                                    "description": "Dane z otwartych źródeł, niezweryfikowane",
                                                    "origin": "Składy Opałów",
                                                    "verified_at": null,
                                                    "updated_at": "2026-10-01"
                                                }
                                            },
                                            {
                                                "id": 721,
                                                "name": "Tiplox",
                                                "url": "https://skladyopalow.pl/sklad/tiplox-sp-z-o-o-zabki/",
                                                "address": "Józefa Chełmońskiego 1, 05-091 Ząbki",
                                                "nip": "5272981836",
                                                "phone": "571 525 273",
                                                "website": null,
                                                "lat": 52.29033,
                                                "lon": 21.11219,
                                                "location_approximate": true,
                                                "distance_km": 9.7,
                                                "municipality": {
                                                    "name": "Ząbki",
                                                    "teryt": "1434031",
                                                    "url": "https://skladyopalow.pl/sklady-opalu/mazowieckie/wolominski/zabki/"
                                                },
                                                "fuels": [
                                                    "Brykiet",
                                                    "Drewno kominkowe",
                                                    "Pellet"
                                                ],
                                                "hours": {
                                                    "mon": "8:00-17:00",
                                                    "tue": "8:00-17:00",
                                                    "wed": "8:00-17:00",
                                                    "thu": "8:00-17:00",
                                                    "fri": "8:00-17:00",
                                                    "sat": "10:00-15:00",
                                                    "sun": ""
                                                },
                                                "featured": false,
                                                "source": {
                                                    "data_status": "unverified",
                                                    "description": "Dane z otwartych źródeł, niezweryfikowane",
                                                    "origin": "Składy Opałów",
                                                    "verified_at": null,
                                                    "updated_at": "2026-10-02"
                                                }
                                            }
                                        ]
                                    }
                                }
                            }
                        }
                    },
                    "400": {
                        "description": "Błędne albo brakujące parametry",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Blad"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Nie znaleziono (jednostki, kodu, składu, paliwa)",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Blad"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/stores/{id}": {
            "get": {
                "operationId": "storesId",
                "summary": "Jeden skład",
                "description": "Pełny wpis składu z cennikiem: najnowsza cena każdego paliwa z ostatnich 12 miesięcy, z datą.",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "description": "Identyfikator składu (pole id z listy składów).",
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/SkladPelny"
                                },
                                "examples": {
                                    "przyklad1": {
                                        "summary": "Dane i cennik składu",
                                        "description": "GET /stores/584 (odpowiedź skrócona)",
                                        "value": {
                                            "id": 584,
                                            "name": "Selmat",
                                            "url": "https://skladyopalow.pl/sklad/selmat-minsk-mazowiecki/",
                                            "address": "Wyszyńskiego 56, 05-300 Mińsk Mazowiecki",
                                            "nip": "8221259640",
                                            "phone": "25 758 27 39",
                                            "website": "https://www.facebook.com/selmatbud",
                                            "lat": 52.182763,
                                            "lon": 21.547012,
                                            "location_approximate": false,
                                            "distance_km": null,
                                            "municipality": {
                                                "name": "Mińsk Mazowiecki",
                                                "teryt": "1412011",
                                                "url": "https://skladyopalow.pl/sklady-opalu/mazowieckie/minski/minsk-mazowiecki/"
                                            },
                                            "fuels": [
                                                "Drewno kominkowe",
                                                "Ekogroszek",
                                                "Miał węglowy"
                                            ],
                                            "hours": null,
                                            "featured": false,
                                            "source": {
                                                "data_status": "unverified",
                                                "description": "Dane z otwartych źródeł, niezweryfikowane",
                                                "origin": "Składy Opałów",
                                                "verified_at": null,
                                                "updated_at": "2026-10-01"
                                            },
                                            "price_list": []
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "400": {
                        "description": "Błędne albo brakujące parametry",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Blad"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Nie znaleziono (jednostki, kodu, składu, paliwa)",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Blad"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/prices": {
            "get": {
                "operationId": "prices",
                "summary": "Ceny GUS",
                "description": "Oficjalne średnie roczne ceny detaliczne GUS (Bank Danych Lokalnych): węgiel kamienny za tonę, prąd G11 i gaz W-1.1 za kWh - Polska i województwa, od 1999 roku.",
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "additionalProperties": {
                                        "$ref": "#/components/schemas/SeriaGus"
                                    }
                                },
                                "examples": {
                                    "przyklad1": {
                                        "summary": "Ile kosztowała tona węgla według GUS?",
                                        "description": "GET /prices (odpowiedź skrócona)",
                                        "value": {
                                            "wegiel-kamienny": {
                                                "name": "Węgiel kamienny",
                                                "unit": "zł/t",
                                                "period": "średnia roczna",
                                                "poland": {
                                                    "2023": 2137.88,
                                                    "2024": 1703.46,
                                                    "2025": 1601.7
                                                },
                                                "voivodeships": {
                                                    "dolnośląskie": {
                                                        "2023": 2332.89,
                                                        "2024": 1866.43,
                                                        "2025": 1781.98
                                                    },
                                                    "kujawsko-pomorskie": {
                                                        "2023": 2023.41,
                                                        "2024": 1602.16,
                                                        "2025": 1530.04
                                                    }
                                                },
                                                "source": {
                                                    "name": "GUS, Bank Danych Lokalnych, zmienna 5029",
                                                    "url": "https://bdl.stat.gov.pl/bdl/metadane/cechy/5029"
                                                }
                                            },
                                            "prad-g11": {
                                                "name": "Energia elektryczna (G11)",
                                                "unit": "zł/kWh",
                                                "period": "średnia roczna",
                                                "poland": {
                                                    "2023": 0.91,
                                                    "2024": 1.01,
                                                    "2025": 1.15
                                                },
                                                "voivodeships": {
                                                    "dolnośląskie": {
                                                        "2023": 0.88,
                                                        "2024": 0.97,
                                                        "2025": 1.09
                                                    },
                                                    "kujawsko-pomorskie": {
                                                        "2023": 0.92,
                                                        "2024": 1.01,
                                                        "2025": 1.14
                                                    }
                                                },
                                                "source": {
                                                    "name": "GUS, Bank Danych Lokalnych, zmienna 5071",
                                                    "url": "https://bdl.stat.gov.pl/bdl/metadane/cechy/5071"
                                                }
                                            },
                                            "gaz-w11": {
                                                "name": "Gaz ziemny (W-1.1)",
                                                "unit": "zł/kWh",
                                                "period": "średnia roczna",
                                                "poland": {
                                                    "2023": 0.4,
                                                    "2024": 0.46,
                                                    "2025": 0.52
                                                },
                                                "voivodeships": {
                                                    "dolnośląskie": {
                                                        "2023": 0.4,
                                                        "2024": 0.47,
                                                        "2025": 0.53
                                                    },
                                                    "kujawsko-pomorskie": {
                                                        "2023": 0.4,
                                                        "2024": 0.46,
                                                        "2025": 0.52
                                                    }
                                                },
                                                "source": {
                                                    "name": "GUS, Bank Danych Lokalnych, zmienna 478247",
                                                    "url": "https://bdl.stat.gov.pl/bdl/metadane/cechy/478247"
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "400": {
                        "description": "Błędne albo brakujące parametry",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Blad"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Nie znaleziono (jednostki, kodu, składu, paliwa)",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Blad"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/prices/{fuel}": {
            "get": {
                "operationId": "pricesFuel",
                "summary": "Bieżące ceny paliwa",
                "description": "Mediana zatwierdzonych cen ze składów z ostatnich 6 miesięcy (cenniki składów i zgłoszenia czytelników) - te same liczby co strona ceny paliwa. Dla paliw węglowych dodatkowo punkt odniesienia GUS, nigdy wliczony do mediany.",
                "parameters": [
                    {
                        "name": "fuel",
                        "in": "path",
                        "required": true,
                        "description": "Paliwo (slug).",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "wegiel",
                                "ekogroszek",
                                "wegiel-kostka",
                                "wegiel-orzech",
                                "wegiel-groszek",
                                "mial-weglowy",
                                "pellet",
                                "brykiet",
                                "drewno-kominkowe"
                            ]
                        }
                    },
                    {
                        "name": "voivodeship",
                        "in": "query",
                        "required": false,
                        "description": "Województwo: slug (np. mazowieckie) albo 2-cyfrowy TERYT (np. 14). Bez parametru - cała Polska z podziałem na województwa i miesiące.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "values",
                        "in": "query",
                        "required": false,
                        "description": "Dołącz pole values: posortowane ceny (zł), z których liczona jest mediana kraju - bez nazw składów.",
                        "schema": {
                            "type": "boolean",
                            "default": false
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/CenyPaliwa"
                                },
                                "examples": {
                                    "przyklad1": {
                                        "summary": "Ceny pelletu w województwie mazowieckim",
                                        "description": "GET /prices/pellet?voivodeship=mazowieckie (odpowiedź skrócona)",
                                        "value": {
                                            "fuel": "pellet",
                                            "name": "Pellet",
                                            "area": {
                                                "level": "voivodeship",
                                                "name": "mazowieckie",
                                                "teryt": "14"
                                            },
                                            "unit": "t",
                                            "unit_name": "tona",
                                            "window_months": 6,
                                            "from": null,
                                            "to": null,
                                            "n": 15,
                                            "median": 2320,
                                            "quartile_1": null,
                                            "quartile_3": null,
                                            "min": null,
                                            "max": null,
                                            "price_lists": null,
                                            "submissions": null,
                                            "source": null,
                                            "method": "Mediana zatwierdzonych cen z ostatnich 6 miesięcy (cenniki składów i zgłoszenia czytelników po moderacji); jeden skład = jedna, najnowsza cena; ceny spoza wiarygodnych widełek i wartości odstające odrzucone; mediana od 3 cen. Średnie GUS to osobne dane i nie wchodzą do mediany.",
                                            "page": "https://skladyopalow.pl/ceny-opalu/pellet/"
                                        }
                                    },
                                    "przyklad2": {
                                        "summary": "Cena ekogroszku w Polsce i w województwach",
                                        "description": "GET /prices/ekogroszek (odpowiedź skrócona)",
                                        "value": {
                                            "fuel": "ekogroszek",
                                            "name": "Ekogroszek",
                                            "area": {
                                                "level": "poland",
                                                "name": "Polska",
                                                "teryt": ""
                                            },
                                            "unit": "t",
                                            "unit_name": "tona",
                                            "window_months": 6,
                                            "from": "2026-04-09",
                                            "to": "2026-10-03",
                                            "n": 321,
                                            "median": 1900,
                                            "quartile_1": 1690,
                                            "quartile_3": 2100,
                                            "min": 1200,
                                            "max": 2600,
                                            "price_lists": 321,
                                            "submissions": 0,
                                            "source": "cenniki składów",
                                            "rejected": 1,
                                            "bag_kg": 25,
                                            "bag_price": 47.5,
                                            "voivodeships": [
                                                {
                                                    "voivodeship": "śląskie",
                                                    "teryt": "24",
                                                    "median": 1647,
                                                    "n": 24
                                                },
                                                {
                                                    "voivodeship": "opolskie",
                                                    "teryt": "16",
                                                    "median": 1650,
                                                    "n": 10
                                                },
                                                {
                                                    "voivodeship": "podlaskie",
                                                    "teryt": "20",
                                                    "median": 1730,
                                                    "n": 13
                                                }
                                            ],
                                            "months": [
                                                {
                                                    "month": "2026-04",
                                                    "median": 1620,
                                                    "n": 17
                                                },
                                                {
                                                    "month": "2026-05",
                                                    "median": 1557.5,
                                                    "n": 16
                                                },
                                                {
                                                    "month": "2026-06",
                                                    "median": 1590,
                                                    "n": 16
                                                }
                                            ],
                                            "gus": {
                                                "description": "Średnia roczna cena detaliczna węgla kamiennego ogółem (bez podziału na sortymenty), zł/t",
                                                "year": 2025,
                                                "price": 1601.7,
                                                "area": "Polska",
                                                "source": {
                                                    "name": "GUS, Bank Danych Lokalnych, zmienna 5029",
                                                    "url": "https://bdl.stat.gov.pl/bdl/metadane/cechy/5029"
                                                }
                                            },
                                            "method": "Mediana zatwierdzonych cen z ostatnich 6 miesięcy (cenniki składów i zgłoszenia czytelników po moderacji); jeden skład = jedna, najnowsza cena; ceny spoza wiarygodnych widełek i wartości odstające odrzucone; mediana od 3 cen. Średnie GUS to osobne dane i nie wchodzą do mediany.",
                                            "page": "https://skladyopalow.pl/ceny-opalu/ekogroszek/"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "400": {
                        "description": "Błędne albo brakujące parametry",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Blad"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Nie znaleziono (jednostki, kodu, składu, paliwa)",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Blad"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/regulations": {
            "get": {
                "operationId": "regulations",
                "summary": "Przepisy antysmogowe",
                "description": "Stan prawny uchwał antysmogowych województw: akt, publikacja, tekst urzędowy, terminy jako dane i najbliższy termin. Z parametrem teryt albo kod - tylko województwo tej jednostki.",
                "parameters": [
                    {
                        "name": "teryt",
                        "in": "query",
                        "required": false,
                        "description": "TERYT dowolnej jednostki (gmina, powiat, województwo) - zwraca stan prawny jej województwa.",
                        "schema": {
                            "type": "string",
                            "pattern": "^[0-9]{2}([0-9]{2}([0-9]{3})?)?$"
                        }
                    },
                    {
                        "name": "postcode",
                        "in": "query",
                        "required": false,
                        "description": "Kod pocztowy - zwraca stan prawny województwa, w którym leży.",
                        "schema": {
                            "type": "string",
                            "pattern": "^[0-9]{2}-?[0-9]{3}$"
                        }
                    },
                    {
                        "name": "voivodeship",
                        "in": "query",
                        "required": false,
                        "description": "Województwo: slug (np. malopolskie) albo 2-cyfrowy TERYT.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "array",
                                    "items": {
                                        "$ref": "#/components/schemas/Przepis"
                                    }
                                },
                                "examples": {
                                    "przyklad1": {
                                        "summary": "Jakie przepisy antysmogowe obowiązują w gminie Mińsk Mazowiecki?",
                                        "description": "GET /regulations?teryt=1412011 (odpowiedź skrócona)",
                                        "value": [
                                            {
                                                "voivodeship": "mazowieckie",
                                                "teryt": "14",
                                                "has_resolution": true,
                                                "resolution": {
                                                    "title": "Uchwała nr 162/17 Sejmiku Województwa Mazowieckiego z dnia 24 października 2017 r. w sprawie wprowadzenia na obszarze województwa mazowieckiego ograniczeń i zakazów w zakresie eksploatacji instalacji, w których następuje spalanie paliw",
                                                    "publication": "Dz. Urz. Woj. Mazowieckiego z 2017 r. poz. 9600 (ogłoszono 27 października 2017 r.); zmiana: Dz. Urz. Woj. Mazowieckiego z 2022 r. poz. 5147",
                                                    "text": "https://edziennik.mazowieckie.pl/WDU_W/2017/9600/akt.pdf",
                                                    "as_of": "2026-10-02",
                                                    "summary": "W województwie mazowieckim obowiązuje uchwała antysmogowa nr 162/17, zmieniona raz uchwałą nr 59/22 z 2022 r. Kotły pozaklasowe są zakazane od 1 stycznia 2023 r., a kotły klasy 3 i 4 można eksploatować do 31 grudnia 2027 r. Od 1 października 2023 r. w Warszawie nie wolno stosować węgla kamiennego, a w gminach dziewięciu powiatów wokół stolicy zakaz węgla wchodzi w życie 1 stycznia 2028 r. W nowych budynkach możliwych do podłączenia do sieci ciepłowniczej nie wolno eksploatować kotłów na paliwa stałe.",
                                                    "page": "https://skladyopalow.pl/przepisy/uchwala-antysmogowa-mazowieckie/",
                                                    "next_deadline": {
                                                        "date": "2028-01-01",
                                                        "applies_to": "kotły klasy 3 i klasy 4 normy PN-EN 303-5:2012 uruchomione przed 11 listopada 2017 r. (całe województwo)",
                                                        "description": "Można je eksploatować do 31 grudnia 2027 r. Od 1 stycznia 2028 r. dopuszczalne są wyłącznie instalacje spełniające wymagania ekoprojektu z rozporządzenia (UE) 2015/1189 (§ 10 pkt 2 lit. b)."
                                                    },
                                                    "deadlines": [
                                                        {
                                                            "date": "2018-07-01",
                                                            "applies_to": "całe województwo - wszystkie instalacje (zakaz paliw z § 4)",
                                                            "description": "Od 1 lipca 2018 r. obowiązuje zakaz stosowania mułów, flotokoncentratów, węgla brunatnego, węgla kamiennego sypkiego 0-3 mm i paliw z biomasą o wilgotności powyżej 20%."
                                                        },
                                                        {
                                                            "date": "2023-01-01",
                                                            "applies_to": "kotły pozaklasowe (niespełniające klasy 3, 4 ani 5 normy PN-EN 303-5:2012) uruchomione przed 11 listopada 2017 r. oraz kominki i piece uruchomione przed tą datą",
                                                            "description": "Od 1 stycznia 2023 r. eksploatacja kotłów niespełniających wymagań klasy 3, 4 lub 5 jest zakazana (§ 10 pkt 2 lit. a). Kominki i piece uruchomione przed 11 listopada 2017 r. muszą od tego dnia spełniać wymagania ekoprojektu (rozporządzenie Komisji (UE) 2015/1185), chyba że zostały wyposażone w urządzenie redukujące emisję pyłu do wartości z pkt 2 lit. a załącznika II do tego rozporządzenia (§ 10 pkt 3)."
                                                        },
                                                        {
                                                            "date": "2023-01-02",
                                                            "applies_to": "cały obszar - nowo budowane budynki (wniosek o pozwolenie na budowę lub zgłoszenie złożone po 1 stycznia 2023 r., czyli od 2 stycznia 2023 r.)",
                                                            "description": "Zakazana jest eksploatacja instalacji na paliwa stałe w nowo budowanym budynku, jeśli istnieje techniczna możliwość podłączenia go do sieci ciepłowniczej na terenie bezpośrednio przylegającym do działki inwestora (§ 6a, dodany uchwałą 59/22). Brak takiej możliwości trzeba potwierdzić dokumentem operatora sieci albo oświadczeniem projektanta (§ 6b)."
                                                        }
                                                    ]
                                                },
                                                "requested_unit": {
                                                    "name": "Mińsk Mazowiecki",
                                                    "level": "municipality",
                                                    "teryt": "1412011",
                                                    "url": "https://skladyopalow.pl/sklady-opalu/mazowieckie/minski/minsk-mazowiecki/"
                                                }
                                            }
                                        ]
                                    },
                                    "przyklad2": {
                                        "summary": "Co wolno palić pod kodem 31-001 (Kraków)?",
                                        "description": "GET /regulations?postcode=31-001 (odpowiedź skrócona)",
                                        "value": [
                                            {
                                                "voivodeship": "małopolskie",
                                                "teryt": "12",
                                                "has_resolution": true,
                                                "resolution": {
                                                    "title": "Uchwała nr XXXII/452/17 Sejmiku Województwa Małopolskiego z dnia 23 stycznia 2017 r. w sprawie wprowadzenia na obszarze województwa małopolskiego ograniczeń i zakazów w zakresie eksploatacji instalacji, w których następuje spalanie paliw (z wyłączeniem Gminy Miejskiej Kraków) oraz Uchwała nr XVIII/243/16 Sejmiku Województwa Małopolskiego z dnia 15 stycznia 2016 r. w sprawie wprowadzenia na obszarze Gminy Miejskiej Kraków ograniczeń w zakresie eksploatacji instalacji, w których następuje spalanie paliw",
                                                    "publication": "Dz. Urz. Woj. Małopolskiego z 2017 r. poz. 787 (ogłoszono 27 stycznia 2017 r.); zmiana: Dz. Urz. Woj. Małopolskiego z 2022 r. poz. 6497; uchwała dla Krakowa: Dz. Urz. Woj. Małopolskiego z 2016 r. poz. 812 (ogłoszono 1 lutego 2016 r.)",
                                                    "text": "https://edziennik.malopolska.uw.gov.pl/WDU_K/2017/787/akt.pdf",
                                                    "as_of": "2026-10-02",
                                                    "summary": "W Małopolsce obowiązują dwie uchwały antysmogowe: dla Krakowa (od 1 września 2019 r. całkowity zakaz paliw stałych, dozwolony tylko gaz i lekki olej opałowy) oraz dla reszty województwa (uchwała nr XXXII/452/17, zmieniona w 2022 r.). Poza Krakowem kotły pozaklasowe są zakazane od 1 maja 2024 r., a kotły klasy 3 i 4 można eksploatować do 31 grudnia 2026 r. - od 1 stycznia 2027 r. dopuszczalne są tylko nowsze kotły spełniające ekoprojekt z automatycznym podawaniem paliwa albo kotły klasy 5 uruchomione przed 1 lipca 2017 r. Zakazane są też paliwa, w których udział węgla o uziarnieniu 0-3 mm przekracza 15%, oraz paliwa zawierające biomasę (np. drewno) o wilgotności powyżej 20%.",
                                                    "page": "https://skladyopalow.pl/przepisy/uchwala-antysmogowa-malopolskie/",
                                                    "next_deadline": {
                                                        "date": "2027-01-01",
                                                        "applies_to": "województwo poza Krakowem - kotły klasy 3 i klasy 4 normy PN-EN 303-5:2012 uruchomione przed 1 lipca 2017 r.",
                                                        "description": "Można je eksploatować do 31 grudnia 2026 r. Od 1 stycznia 2027 r. dopuszczalne są wyłącznie instalacje spełniające wymagania ekoprojektu i umożliwiające tylko automatyczne podawanie paliwa albo - dla kotłów uruchomionych przed 1 lipca 2017 r. - kotły klasy 5. W sezonie grzewczym 2026/2027 kotły klasy 3 i 4 mogą więc pracować tylko do 31 grudnia 2026 r."
                                                    },
                                                    "deadlines": [
                                                        {
                                                            "date": "2017-07-01",
                                                            "applies_to": "województwo poza Krakowem - nowo uruchamiane kotły, kominki i piece oraz wszystkie instalacje (zakaz paliw)",
                                                            "description": "Od 1 lipca 2017 r. obowiązuje zakaz paliw z § 3. Kotły uruchamiane od tego dnia muszą spełniać wymagania ekoprojektu (rozporządzenie Komisji (UE) 2015/1189) i umożliwiać wyłącznie automatyczne podawanie paliwa (wyjątek: kotły zgazowujące paliwo). Kominki i piece uruchamiane od tego dnia muszą spełniać wymagania ekoprojektu (rozporządzenie Komisji (UE) 2015/1185)."
                                                        },
                                                        {
                                                            "date": "2019-09-01",
                                                            "applies_to": "Kraków (granice administracyjne Gminy Miejskiej Kraków) - wszystkie instalacje spalania paliw",
                                                            "description": "Od 1 września 2019 r. w instalacjach spalania paliw wolno stosować wyłącznie gaz ziemny wysokometanowy lub zaazotowany (w tym skroplony), propan-butan, biogaz rolniczy lub inny rodzaj gazu palnego oraz lekki olej opałowy. Oznacza to całkowity zakaz paliw stałych. Uchwała dla Krakowa nie przewiduje okresów przejściowych po tej dacie."
                                                        },
                                                        {
                                                            "date": "2024-05-01",
                                                            "applies_to": "województwo poza Krakowem - kotły pozaklasowe (niespełniające wymagań klasy 3, 4 ani 5 normy PN-EN 303-5:2012) uruchomione przed 1 lipca 2017 r. oraz kominki i piece uruchomione przed 1 lipca 2017 r.",
                                                            "description": "Od 1 maja 2024 r. eksploatacja takich kotłów jest zakazana (pierwotnie termin wynosił 1 stycznia 2023 r.; przesunęła go uchwała nr LIX/842/22). Kominki i piece uruchomione przed 1 lipca 2017 r. muszą od tego dnia spełniać wymagania ekoprojektu, chyba że osiągają sprawność cieplną co najmniej 80% albo zostały wyposażone w urządzenie redukujące emisję pyłu do wartości z pkt 2 lit. a załącznika II do rozporządzenia (UE) 2015/1185."
                                                        }
                                                    ]
                                                },
                                                "requested_unit": {
                                                    "name": "Kraków",
                                                    "level": "municipality",
                                                    "teryt": "1261011",
                                                    "url": "https://skladyopalow.pl/sklady-opalu/malopolskie/krakow/"
                                                }
                                            }
                                        ]
                                    }
                                }
                            }
                        }
                    },
                    "400": {
                        "description": "Błędne albo brakujące parametry",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Blad"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Nie znaleziono (jednostki, kodu, składu, paliwa)",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Blad"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/subsidy": {
            "get": {
                "operationId": "subsidy",
                "summary": "Kalkulator dopłaty Czyste Powietrze",
                "description": "Poziom dofinansowania (podstawowy, podwyższony, najwyższy), procent i maksymalne kwoty dotacji dla wybranych prac według programu Czyste Powietrze (progi i limity z dokumentów programu, wersja i data stanu w polu program). Wynik orientacyjny - decyduje WFOŚiGW. Przyjmuje też POST z tymi samymi parametrami (formularz serwisu używa POST, żeby dochód nie trafiał do adresu). Dochodu nie zapisujemy.",
                "parameters": [
                    {
                        "name": "people",
                        "in": "query",
                        "required": false,
                        "description": "Liczba osób w gospodarstwie domowym (1 - gospodarstwo jednoosobowe). Wymagana razem z dochodem.",
                        "schema": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 20
                        }
                    },
                    {
                        "name": "income",
                        "in": "query",
                        "required": false,
                        "description": "Przeciętny miesięczny dochód (zł) - na osobę albo całego gospodarstwa (parametr dochod_typ). Decyduje o poziomie podwyższonym i najwyższym. Nie jest zapisywany.",
                        "schema": {
                            "type": "number",
                            "minimum": 0,
                            "maximum": 10000000
                        }
                    },
                    {
                        "name": "income_type",
                        "in": "query",
                        "required": false,
                        "description": "Czy dochod to kwota na osobę (osoba), czy całego gospodarstwa (gospodarstwo - dzielimy przez osoby).",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "person",
                                "household"
                            ],
                            "default": "person"
                        }
                    },
                    {
                        "name": "benefit",
                        "in": "query",
                        "required": false,
                        "description": "Ustalone prawo do zasiłku stałego, okresowego, rodzinnego albo specjalnego zasiłku opiekuńczego - kwalifikuje do poziomu najwyższego.",
                        "schema": {
                            "type": "boolean",
                            "default": false
                        }
                    },
                    {
                        "name": "annual_income",
                        "in": "query",
                        "required": false,
                        "description": "Roczny dochód wnioskodawcy (zł, PIT \"Podstawa obliczenia podatku\") - próg poziomu podstawowego. Nie jest zapisywany.",
                        "schema": {
                            "type": "number",
                            "minimum": 0,
                            "maximum": 10000000
                        }
                    },
                    {
                        "name": "business",
                        "in": "query",
                        "required": false,
                        "description": "Wnioskodawca lub małżonek prowadzi działalność gospodarczą (także najem) - wynik dopisze limit przychodu.",
                        "schema": {
                            "type": "boolean",
                            "default": false
                        }
                    },
                    {
                        "name": "current_heating",
                        "in": "query",
                        "required": false,
                        "description": "Obecne ogrzewanie: stale - tylko paliwo stałe poniżej 5 klasy; stale5 - kocioł klasy 5 lub ekoprojekt; inne - gaz, olej, prąd, pompa, sieć albo kilka źródeł.",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "solid_fuel",
                                "solid_fuel_class5",
                                "other"
                            ],
                            "default": "solid_fuel"
                        }
                    },
                    {
                        "name": "eu",
                        "in": "query",
                        "required": false,
                        "description": "Wskaźnik zapotrzebowania na energię użytkową do ogrzewania z audytu = rodzaj przedsięwzięcia: 1 - poniżej 80, 2 - od 80 do 140, 3 - powyżej 140 kWh/(m² rok); niewiem - wynik w trzech wariantach.",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "unknown",
                                "1",
                                "2",
                                "3"
                            ],
                            "default": "unknown"
                        }
                    },
                    {
                        "name": "new_source",
                        "in": "query",
                        "required": false,
                        "description": "Nowe źródło ciepła (Załącznik nr 2, tabela 2). Przy gruntowej pompie ciepła doliczamy dolne źródło.",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "none",
                                "district_heating",
                                "heat_pump_air_water",
                                "heat_pump_air_air",
                                "heat_pump_ground",
                                "gasification_boiler",
                                "pellet_boiler",
                                "electric"
                            ],
                            "default": "none"
                        }
                    },
                    {
                        "name": "central_heating_dhw",
                        "in": "query",
                        "required": false,
                        "description": "Nowa instalacja centralnego ogrzewania i ciepłej wody użytkowej.",
                        "schema": {
                            "type": "boolean",
                            "default": false
                        }
                    },
                    {
                        "name": "ceiling",
                        "in": "query",
                        "required": false,
                        "description": "Powierzchnia w m²: ocieplenie stropu lub dachu (Załącznik nr 2, tabela 3, lp. 1). Puste - poza zakresem.",
                        "schema": {
                            "type": "number",
                            "minimum": 0,
                            "maximum": 5000
                        }
                    },
                    {
                        "name": "floor",
                        "in": "query",
                        "required": false,
                        "description": "Powierzchnia w m²: ocieplenie podłogi (Załącznik nr 2, tabela 3, lp. 2). Puste - poza zakresem.",
                        "schema": {
                            "type": "number",
                            "minimum": 0,
                            "maximum": 5000
                        }
                    },
                    {
                        "name": "walls",
                        "in": "query",
                        "required": false,
                        "description": "Powierzchnia w m²: ocieplenie ścian (Załącznik nr 2, tabela 3, lp. 3). Puste - poza zakresem.",
                        "schema": {
                            "type": "number",
                            "minimum": 0,
                            "maximum": 5000
                        }
                    },
                    {
                        "name": "windows",
                        "in": "query",
                        "required": false,
                        "description": "Powierzchnia w m²: okna (Załącznik nr 2, tabela 3, lp. 4). Puste - poza zakresem.",
                        "schema": {
                            "type": "number",
                            "minimum": 0,
                            "maximum": 5000
                        }
                    },
                    {
                        "name": "doors",
                        "in": "query",
                        "required": false,
                        "description": "Powierzchnia w m²: drzwi zewnętrzne (Załącznik nr 2, tabela 3, lp. 5). Puste - poza zakresem.",
                        "schema": {
                            "type": "number",
                            "minimum": 0,
                            "maximum": 5000
                        }
                    },
                    {
                        "name": "gates",
                        "in": "query",
                        "required": false,
                        "description": "Powierzchnia w m²: brama garażowa (Załącznik nr 2, tabela 3, lp. 6). Puste - poza zakresem.",
                        "schema": {
                            "type": "number",
                            "minimum": 0,
                            "maximum": 5000
                        }
                    },
                    {
                        "name": "ventilation",
                        "in": "query",
                        "required": false,
                        "description": "Wentylacja mechaniczna z odzyskiem ciepła (zestaw).",
                        "schema": {
                            "type": "boolean",
                            "default": false
                        }
                    },
                    {
                        "name": "audit",
                        "in": "query",
                        "required": false,
                        "description": "Zwrot kosztu audytu energetycznego (audyt jest obowiązkowy).",
                        "schema": {
                            "type": "boolean",
                            "default": true
                        }
                    },
                    {
                        "name": "energy_certificate",
                        "in": "query",
                        "required": false,
                        "description": "Zwrot kosztu świadectwa charakterystyki energetycznej po pracach.",
                        "schema": {
                            "type": "boolean",
                            "default": true
                        }
                    },
                    {
                        "name": "cost_district_heating",
                        "in": "query",
                        "required": false,
                        "description": "Opcjonalnie: koszt netto (zł) pozycji \"sieć ciepłownicza\". Bez kosztu liczymy maksymalną kwotę dotacji.",
                        "schema": {
                            "type": "number",
                            "minimum": 0,
                            "maximum": 10000000
                        }
                    },
                    {
                        "name": "cost_heat_pump_air_water",
                        "in": "query",
                        "required": false,
                        "description": "Opcjonalnie: koszt netto (zł) pozycji \"pompa ciepła powietrze/woda\". Bez kosztu liczymy maksymalną kwotę dotacji.",
                        "schema": {
                            "type": "number",
                            "minimum": 0,
                            "maximum": 10000000
                        }
                    },
                    {
                        "name": "cost_heat_pump_air_air",
                        "in": "query",
                        "required": false,
                        "description": "Opcjonalnie: koszt netto (zł) pozycji \"pompa ciepła powietrze/powietrze\". Bez kosztu liczymy maksymalną kwotę dotacji.",
                        "schema": {
                            "type": "number",
                            "minimum": 0,
                            "maximum": 10000000
                        }
                    },
                    {
                        "name": "cost_heat_pump_ground",
                        "in": "query",
                        "required": false,
                        "description": "Opcjonalnie: koszt netto (zł) pozycji \"gruntowa pompa ciepła\". Bez kosztu liczymy maksymalną kwotę dotacji.",
                        "schema": {
                            "type": "number",
                            "minimum": 0,
                            "maximum": 10000000
                        }
                    },
                    {
                        "name": "cost_ground_source_loop",
                        "in": "query",
                        "required": false,
                        "description": "Opcjonalnie: koszt netto (zł) pozycji \"dolne źródło\". Bez kosztu liczymy maksymalną kwotę dotacji.",
                        "schema": {
                            "type": "number",
                            "minimum": 0,
                            "maximum": 10000000
                        }
                    },
                    {
                        "name": "cost_gasification_boiler",
                        "in": "query",
                        "required": false,
                        "description": "Opcjonalnie: koszt netto (zł) pozycji \"kocioł zgazowujący drewno\". Bez kosztu liczymy maksymalną kwotę dotacji.",
                        "schema": {
                            "type": "number",
                            "minimum": 0,
                            "maximum": 10000000
                        }
                    },
                    {
                        "name": "cost_pellet_boiler",
                        "in": "query",
                        "required": false,
                        "description": "Opcjonalnie: koszt netto (zł) pozycji \"kocioł na pellet\". Bez kosztu liczymy maksymalną kwotę dotacji.",
                        "schema": {
                            "type": "number",
                            "minimum": 0,
                            "maximum": 10000000
                        }
                    },
                    {
                        "name": "cost_electric",
                        "in": "query",
                        "required": false,
                        "description": "Opcjonalnie: koszt netto (zł) pozycji \"ogrzewanie elektryczne\". Bez kosztu liczymy maksymalną kwotę dotacji.",
                        "schema": {
                            "type": "number",
                            "minimum": 0,
                            "maximum": 10000000
                        }
                    },
                    {
                        "name": "cost_central_heating_dhw",
                        "in": "query",
                        "required": false,
                        "description": "Opcjonalnie: koszt netto (zł) pozycji \"instalacja c.o. i c.w.u.\". Bez kosztu liczymy maksymalną kwotę dotacji.",
                        "schema": {
                            "type": "number",
                            "minimum": 0,
                            "maximum": 10000000
                        }
                    },
                    {
                        "name": "cost_ceiling",
                        "in": "query",
                        "required": false,
                        "description": "Opcjonalnie: koszt netto (zł) pozycji \"ocieplenie stropu lub dachu\". Bez kosztu liczymy maksymalną kwotę dotacji.",
                        "schema": {
                            "type": "number",
                            "minimum": 0,
                            "maximum": 10000000
                        }
                    },
                    {
                        "name": "cost_floor",
                        "in": "query",
                        "required": false,
                        "description": "Opcjonalnie: koszt netto (zł) pozycji \"ocieplenie podłogi\". Bez kosztu liczymy maksymalną kwotę dotacji.",
                        "schema": {
                            "type": "number",
                            "minimum": 0,
                            "maximum": 10000000
                        }
                    },
                    {
                        "name": "cost_walls",
                        "in": "query",
                        "required": false,
                        "description": "Opcjonalnie: koszt netto (zł) pozycji \"ocieplenie ścian\". Bez kosztu liczymy maksymalną kwotę dotacji.",
                        "schema": {
                            "type": "number",
                            "minimum": 0,
                            "maximum": 10000000
                        }
                    },
                    {
                        "name": "cost_windows",
                        "in": "query",
                        "required": false,
                        "description": "Opcjonalnie: koszt netto (zł) pozycji \"okna\". Bez kosztu liczymy maksymalną kwotę dotacji.",
                        "schema": {
                            "type": "number",
                            "minimum": 0,
                            "maximum": 10000000
                        }
                    },
                    {
                        "name": "cost_doors",
                        "in": "query",
                        "required": false,
                        "description": "Opcjonalnie: koszt netto (zł) pozycji \"drzwi zewnętrzne\". Bez kosztu liczymy maksymalną kwotę dotacji.",
                        "schema": {
                            "type": "number",
                            "minimum": 0,
                            "maximum": 10000000
                        }
                    },
                    {
                        "name": "cost_gates",
                        "in": "query",
                        "required": false,
                        "description": "Opcjonalnie: koszt netto (zł) pozycji \"brama garażowa\". Bez kosztu liczymy maksymalną kwotę dotacji.",
                        "schema": {
                            "type": "number",
                            "minimum": 0,
                            "maximum": 10000000
                        }
                    },
                    {
                        "name": "cost_ventilation",
                        "in": "query",
                        "required": false,
                        "description": "Opcjonalnie: koszt netto (zł) pozycji \"wentylacja z rekuperacją\". Bez kosztu liczymy maksymalną kwotę dotacji.",
                        "schema": {
                            "type": "number",
                            "minimum": 0,
                            "maximum": 10000000
                        }
                    },
                    {
                        "name": "cost_audit",
                        "in": "query",
                        "required": false,
                        "description": "Opcjonalnie: koszt netto (zł) pozycji \"audyt energetyczny\". Bez kosztu liczymy maksymalną kwotę dotacji.",
                        "schema": {
                            "type": "number",
                            "minimum": 0,
                            "maximum": 10000000
                        }
                    },
                    {
                        "name": "cost_energy_certificate",
                        "in": "query",
                        "required": false,
                        "description": "Opcjonalnie: koszt netto (zł) pozycji \"świadectwo energetyczne\". Bez kosztu liczymy maksymalną kwotę dotacji.",
                        "schema": {
                            "type": "number",
                            "minimum": 0,
                            "maximum": 10000000
                        }
                    },
                    {
                        "name": "html",
                        "in": "query",
                        "required": false,
                        "description": "Dołącz gotowe fragmenty HTML wyniku (używa ich formularz na stronie kalkulatora).",
                        "schema": {
                            "type": "boolean",
                            "default": false
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object"
                                },
                                "examples": {
                                    "przyklad1": {
                                        "summary": "Ile dotacji na pompę ciepła i ocieplenie ścian dla 4 osób z dochodem 2000 zł na osobę?",
                                        "description": "GET /subsidy?people=4&income=2000&current_heating=solid_fuel&eu=3&new_source=heat_pump_air_water&central_heating_dhw=1&walls=140 (odpowiedź skrócona)",
                                        "value": {
                                            "level": "elevated",
                                            "level_name": "podwyższony",
                                            "condition": null,
                                            "intensity": 0.7,
                                            "household": "multi_person",
                                            "project_type": 3,
                                            "items": [
                                                {
                                                    "item": "heat_pump_air_water",
                                                    "name": "Pompa ciepła powietrze/woda o podwyższonej klasie efektywności",
                                                    "clause": "Załącznik nr 2, tabela 2, lp. 2",
                                                    "quantity": 1,
                                                    "unit": "pcs",
                                                    "limit_pln": 24640,
                                                    "net_cost_pln": null,
                                                    "subsidy_pln": 24640,
                                                    "eligible": true
                                                },
                                                {
                                                    "item": "central_heating_dhw",
                                                    "name": "Instalacja centralnego ogrzewania i ciepłej wody użytkowej (w tym kolektory słoneczne)",
                                                    "clause": "Załącznik nr 2, tabela 2, lp. 8",
                                                    "quantity": 1,
                                                    "unit": "pcs",
                                                    "limit_pln": 14350,
                                                    "net_cost_pln": null,
                                                    "subsidy_pln": 14350,
                                                    "eligible": true
                                                },
                                                {
                                                    "item": "walls",
                                                    "name": "Ocieplenie ścian",
                                                    "clause": "Załącznik nr 2, tabela 3, lp. 3",
                                                    "quantity": 140,
                                                    "unit": "m2",
                                                    "limit_pln": 27020,
                                                    "net_cost_pln": null,
                                                    "subsidy_pln": 27020,
                                                    "eligible": true
                                                }
                                            ],
                                            "table_3_sum_pln": 27020,
                                            "table_3_limit_pln": 58100,
                                            "max_subsidy_pln": 67130,
                                            "own_contribution_net_pln": null,
                                            "audit_variants": [],
                                            "notes": [
                                                "Instalacja c.o. i c.w.u.: W limicie mieszczą się niezbędne prace towarzyszące (lp. 8a) - dotacja na nie to najwyżej 10% dotacji z kosztów instalacji."
                                            ],
                                            "conditions": [
                                                {
                                                    "text": "Jesteś właścicielem lub współwłaścicielem domu od co najmniej 3 lat przed złożeniem wniosku. Wystarczy rok przy zakupie co najmniej 50% udziałów albo przy darowiźnie lub dożywociu od wstępnych (np. rodziców); przy spadku i zasiedzeniu okres nie obowiązuje. Przy współwłasności potrzebna jest zgoda pozostałych współwłaścicieli.",
                                                    "clause": "program, ust. 8.1-8.3 pkt 1"
                                                },
                                                {
                                                    "text": "Dom jednorodzinny jest oddany do użytkowania, a wniosek o pozwolenie na budowę albo zgłoszenie budowy złożono najpóźniej 31 grudnia 2020 r. Budynki używane sezonowo i gospodarcze nie dostaną dotacji.",
                                                    "clause": "program, ust. 9.3.1 pkt 4 i 16"
                                                },
                                                {
                                                    "text": "Do wniosku dołączasz dokument podsumowujący audyt energetyczny, podpisany przez osobę z rejestru uprawnionych do sporządzania świadectw charakterystyki energetycznej. Dofinansowanie obejmuje tylko prace z audytu, a dotacja należy się po wykonaniu całego wskazanego zakresu. Kosztu audytu program nie zwraca, jeśli dla domu skorzystano z bonu na audyt z gminy.",
                                                    "clause": "program, ust. 9.3.1 pkt 18; Załącznik nr 2, tabela 1, przypis 1"
                                                }
                                            ],
                                            "disclaimer": "Wynik orientacyjny. O przyznaniu i wysokości dotacji decyduje wojewódzki fundusz ochrony środowiska i gospodarki wodnej (WFOŚiGW) na podstawie wniosku, audytu energetycznego i umowy o dofinansowanie. Dane: program w wersji od 20 lipca 2026, stan na 2 października 2026.",
                                            "program": {
                                                "version_from": "2026-07-20",
                                                "as_of": "2026-10-02"
                                            },
                                            "sources": [
                                                {
                                                    "name": "Program priorytetowy Czyste Powietrze, wersja od 20 lipca 2026 r. (NFOŚiGW)",
                                                    "url": "https://czystepowietrze.gov.pl/wez-dofinansowanie/dokumenty-programowe/dokumenty-obowiazujace/01_czyste_powietrze_program_priorytetowy_od_2026_07_20.pdf"
                                                },
                                                {
                                                    "name": "Załącznik nr 2 do programu - koszty kwalifikowane oraz maksymalny poziom dofinansowania, wersja od 20 lipca 2026 r.",
                                                    "url": "https://czystepowietrze.gov.pl/wez-dofinansowanie/dokumenty-programowe/dokumenty-obowiazujace/03_zalacznik_nr_2_do_programu_koszty_kwalifikowane_oraz_maksymymalny_poziom_dofinansowania_od_2026_07_20.pdf"
                                                }
                                            ],
                                            "page": "https://skladyopalow.pl/kalkulatory/doplata-czyste-powietrze/"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "400": {
                        "description": "Błędne albo brakujące parametry",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Blad"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Nie znaleziono (jednostki, kodu, składu, paliwa)",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Blad"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/boiler-check": {
            "get": {
                "operationId": "boilerCheck",
                "summary": "/boiler-check",
                "description": "",
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object"
                                }
                            }
                        }
                    },
                    "400": {
                        "description": "Błędne albo brakujące parametry",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Blad"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Nie znaleziono (jednostki, kodu, składu, paliwa)",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Blad"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/boiler-check/places": {
            "get": {
                "operationId": "boilerCheckPlaces",
                "summary": "/boiler-check/places",
                "description": "",
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object"
                                }
                            }
                        }
                    },
                    "400": {
                        "description": "Błędne albo brakujące parametry",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Blad"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Nie znaleziono (jednostki, kodu, składu, paliwa)",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Blad"
                                }
                            }
                        }
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "Location": {
                "type": "object",
                "properties": {
                    "type": {
                        "type": "string",
                        "enum": [
                            "municipality",
                            "voivodeship",
                            "locality",
                            "postcode"
                        ]
                    },
                    "label": {
                        "type": "string"
                    },
                    "description": {
                        "type": "string"
                    },
                    "url": {
                        "type": "string",
                        "description": "Strona gminy w katalogu (z parametrem sortowania od miejscowości lub kodu)."
                    }
                }
            },
            "Locate": {
                "type": "object",
                "properties": {
                    "municipality": {
                        "type": "string"
                    },
                    "teryt": {
                        "type": "string"
                    },
                    "description": {
                        "type": "string"
                    },
                    "url": {
                        "type": "string"
                    }
                }
            },
            "Store": {
                "type": "object",
                "required": [
                    "id",
                    "name",
                    "url",
                    "source"
                ],
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "name": {
                        "type": "string"
                    },
                    "url": {
                        "type": "string",
                        "description": "Adres kanoniczny strony składu - podawaj go przy cytowaniu."
                    },
                    "address": {
                        "type": "string"
                    },
                    "nip": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "NIP firmy (dana jawna z rejestru)."
                    },
                    "phone": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "website": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "lat": {
                        "type": [
                            "number",
                            "null"
                        ]
                    },
                    "lon": {
                        "type": [
                            "number",
                            "null"
                        ]
                    },
                    "location_approximate": {
                        "type": "boolean",
                        "description": "true, gdy położenie to środek miejscowości albo obszaru kodu, a nie adres."
                    },
                    "distance_km": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "description": "Odległość w linii prostej od punktu zapytania (null przy zapytaniu po teryt)."
                    },
                    "municipality": {
                        "type": [
                            "object",
                            "null"
                        ],
                        "properties": {
                            "name": {
                                "type": "string"
                            },
                            "teryt": {
                                "type": "string"
                            },
                            "url": {
                                "type": "string"
                            }
                        }
                    },
                    "fuels": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    },
                    "hours": {
                        "type": [
                            "object",
                            "null"
                        ],
                        "description": "Godziny otwarcia: pn, wt, sr, cz, pt, so, nd.",
                        "additionalProperties": {
                            "type": "string"
                        }
                    },
                    "featured": {
                        "type": "boolean",
                        "description": "Płatne wyróżnienie - nie zmienia kolejności według odległości."
                    },
                    "source": {
                        "type": "object",
                        "properties": {
                            "data_status": {
                                "type": "string",
                                "enum": [
                                    "unverified",
                                    "verified",
                                    "owner"
                                ]
                            },
                            "description": {
                                "type": "string"
                            },
                            "origin": {
                                "type": "string",
                                "description": "Atrybucja (OpenStreetMap ODbL) albo nazwa serwisu."
                            },
                            "verified_at": {
                                "type": [
                                    "string",
                                    "null"
                                ],
                                "description": "Data weryfikacji przez redakcję lub właściciela (RRRR-MM-DD)."
                            },
                            "updated_at": {
                                "type": "string",
                                "description": "Data ostatniej zmiany wpisu (RRRR-MM-DD)."
                            }
                        }
                    }
                }
            },
            "StoreFull": {
                "type": "object",
                "required": [
                    "id",
                    "name",
                    "url",
                    "source"
                ],
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "name": {
                        "type": "string"
                    },
                    "url": {
                        "type": "string",
                        "description": "Adres kanoniczny strony składu - podawaj go przy cytowaniu."
                    },
                    "address": {
                        "type": "string"
                    },
                    "nip": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "NIP firmy (dana jawna z rejestru)."
                    },
                    "phone": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "website": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "lat": {
                        "type": [
                            "number",
                            "null"
                        ]
                    },
                    "lon": {
                        "type": [
                            "number",
                            "null"
                        ]
                    },
                    "location_approximate": {
                        "type": "boolean",
                        "description": "true, gdy położenie to środek miejscowości albo obszaru kodu, a nie adres."
                    },
                    "distance_km": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "description": "Odległość w linii prostej od punktu zapytania (null przy zapytaniu po teryt)."
                    },
                    "municipality": {
                        "type": [
                            "object",
                            "null"
                        ],
                        "properties": {
                            "name": {
                                "type": "string"
                            },
                            "teryt": {
                                "type": "string"
                            },
                            "url": {
                                "type": "string"
                            }
                        }
                    },
                    "fuels": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    },
                    "hours": {
                        "type": [
                            "object",
                            "null"
                        ],
                        "description": "Godziny otwarcia: pn, wt, sr, cz, pt, so, nd.",
                        "additionalProperties": {
                            "type": "string"
                        }
                    },
                    "featured": {
                        "type": "boolean",
                        "description": "Płatne wyróżnienie - nie zmienia kolejności według odległości."
                    },
                    "source": {
                        "type": "object",
                        "properties": {
                            "data_status": {
                                "type": "string",
                                "enum": [
                                    "unverified",
                                    "verified",
                                    "owner"
                                ]
                            },
                            "description": {
                                "type": "string"
                            },
                            "origin": {
                                "type": "string",
                                "description": "Atrybucja (OpenStreetMap ODbL) albo nazwa serwisu."
                            },
                            "verified_at": {
                                "type": [
                                    "string",
                                    "null"
                                ],
                                "description": "Data weryfikacji przez redakcję lub właściciela (RRRR-MM-DD)."
                            },
                            "updated_at": {
                                "type": "string",
                                "description": "Data ostatniej zmiany wpisu (RRRR-MM-DD)."
                            }
                        }
                    },
                    "price_list": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "fuel": {
                                    "type": "string"
                                },
                                "name": {
                                    "type": "string"
                                },
                                "price": {
                                    "type": "number",
                                    "description": "zł brutto za jednostkę"
                                },
                                "unit": {
                                    "type": "string",
                                    "enum": [
                                        "t",
                                        "mp",
                                        "mnp"
                                    ]
                                },
                                "date": {
                                    "type": "string"
                                },
                                "source": {
                                    "type": "string",
                                    "description": "Domena strony firmy albo kategoria źródła."
                                }
                            }
                        }
                    }
                }
            },
            "GusSeries": {
                "type": "object",
                "properties": {
                    "name": {
                        "type": "string"
                    },
                    "unit": {
                        "type": "string"
                    },
                    "period": {
                        "type": "string"
                    },
                    "poland": {
                        "type": "object",
                        "description": "rok => cena",
                        "additionalProperties": {
                            "type": "number"
                        }
                    },
                    "voivodeships": {
                        "type": "object",
                        "description": "nazwa województwa => (rok => cena)",
                        "additionalProperties": {
                            "type": "object",
                            "additionalProperties": {
                                "type": "number"
                            }
                        }
                    },
                    "source": {
                        "type": "object",
                        "properties": {
                            "name": {
                                "type": "string"
                            },
                            "url": {
                                "type": "string"
                            }
                        }
                    }
                }
            },
            "FuelPrices": {
                "type": "object",
                "description": "Te same liczby co strona /ceny-opalu/{paliwo}/. Dla województwa tylko mediana i liczba cen.",
                "properties": {
                    "fuel": {
                        "type": "string"
                    },
                    "name": {
                        "type": "string"
                    },
                    "area": {
                        "type": "object",
                        "properties": {
                            "level": {
                                "type": "string",
                                "enum": [
                                    "poland",
                                    "voivodeship"
                                ]
                            },
                            "name": {
                                "type": "string"
                            },
                            "teryt": {
                                "type": "string"
                            }
                        }
                    },
                    "unit": {
                        "type": "string",
                        "enum": [
                            "t",
                            "mp",
                            "mnp"
                        ]
                    },
                    "unit_name": {
                        "type": "string"
                    },
                    "window_months": {
                        "type": "integer",
                        "description": "Ceny starsze nie wchodzą do mediany."
                    },
                    "from": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "Data najstarszej ceny w próbie (RRRR-MM-DD)."
                    },
                    "to": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "Data najnowszej ceny w próbie."
                    },
                    "n": {
                        "type": "integer",
                        "description": "Liczba cen po oczyszczeniu (jeden skład = jedna cena)."
                    },
                    "median": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "description": "zł za jednostkę; null, gdy cen jest mniej niż 3"
                    },
                    "quartile_1": {
                        "type": [
                            "number",
                            "null"
                        ]
                    },
                    "quartile_3": {
                        "type": [
                            "number",
                            "null"
                        ]
                    },
                    "min": {
                        "type": [
                            "number",
                            "null"
                        ]
                    },
                    "max": {
                        "type": [
                            "number",
                            "null"
                        ]
                    },
                    "price_lists": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "description": "Liczba cen z cenników składów (null dla województwa)."
                    },
                    "submissions": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "description": "Liczba cen ze zgłoszeń czytelników (null dla województwa)."
                    },
                    "rejected": {
                        "type": "integer",
                        "description": "Ceny odrzucone jako powtórzenia składu lub wartości odstające."
                    },
                    "source": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "Kategoria źródła cen"
                    },
                    "bag_kg": {
                        "type": "integer"
                    },
                    "bag_price": {
                        "type": "number",
                        "description": "Mediana przeliczona na typowy worek."
                    },
                    "monthly_change": {
                        "type": "object",
                        "description": "Mediana zmian cen tych samych składów między dwoma ostatnimi pełnymi miesiącami.",
                        "properties": {
                            "percent": {
                                "type": "number"
                            },
                            "from": {
                                "type": "string"
                            },
                            "to": {
                                "type": "string"
                            },
                            "pairs": {
                                "type": "integer"
                            }
                        }
                    },
                    "voivodeships": {
                        "type": "array",
                        "description": "Tylko bez parametru voivodeship; województwa z co najmniej 3 cenami.",
                        "items": {
                            "type": "object",
                            "properties": {
                                "voivodeship": {
                                    "type": "string"
                                },
                                "teryt": {
                                    "type": "string"
                                },
                                "median": {
                                    "type": "number"
                                },
                                "n": {
                                    "type": "integer"
                                }
                            }
                        }
                    },
                    "months": {
                        "type": "array",
                        "description": "Mediana miesięczna (miesiące z co najmniej 5 cenami).",
                        "items": {
                            "type": "object",
                            "properties": {
                                "month": {
                                    "type": "string"
                                },
                                "median": {
                                    "type": "number"
                                },
                                "n": {
                                    "type": "integer"
                                }
                            }
                        }
                    },
                    "values": {
                        "type": "array",
                        "description": "Tylko z values=true.",
                        "items": {
                            "type": "number"
                        }
                    },
                    "gus": {
                        "type": "object",
                        "description": "Punkt odniesienia dla paliw węglowych - osobne dane, nie wchodzą do mediany."
                    },
                    "method": {
                        "type": "string"
                    },
                    "page": {
                        "type": "string"
                    }
                }
            },
            "Regulation": {
                "type": "object",
                "properties": {
                    "voivodeship": {
                        "type": "string"
                    },
                    "teryt": {
                        "type": "string"
                    },
                    "has_resolution": {
                        "type": "boolean",
                        "description": "false w województwach bez uchwały antysmogowej (obowiązują przepisy krajowe)."
                    },
                    "resolution": {
                        "type": [
                            "object",
                            "null"
                        ],
                        "properties": {
                            "title": {
                                "type": "string"
                            },
                            "publication": {
                                "type": "string"
                            },
                            "text": {
                                "type": "string",
                                "description": "Adres tekstu urzędowego"
                            },
                            "as_of": {
                                "type": "string"
                            },
                            "summary": {
                                "type": "string"
                            },
                            "page": {
                                "type": "string"
                            },
                            "next_deadline": {
                                "oneOf": [
                                    {
                                        "type": "object",
                                        "properties": {
                                            "date": {
                                                "type": "string"
                                            },
                                            "applies_to": {
                                                "type": "string"
                                            },
                                            "description": {
                                                "type": "string"
                                            }
                                        }
                                    },
                                    {
                                        "type": "null"
                                    }
                                ]
                            },
                            "deadlines": {
                                "type": "array",
                                "items": {
                                    "type": "object",
                                    "properties": {
                                        "date": {
                                            "type": "string"
                                        },
                                        "applies_to": {
                                            "type": "string"
                                        },
                                        "description": {
                                            "type": "string"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "requested_unit": {
                        "type": "object",
                        "description": "Jednostka z zapytania (teryt, postcode)."
                    }
                }
            },
            "Error": {
                "type": "object",
                "properties": {
                    "code": {
                        "type": "string"
                    },
                    "message": {
                        "type": "string"
                    },
                    "date": {
                        "type": "object",
                        "properties": {
                            "status": {
                                "type": "integer"
                            }
                        }
                    }
                }
            }
        }
    }
}