1 lipca 2025 weszła w życie nowelizacja ustawy o ochronie praw nabywcy lokalu mieszkalnego lub domu jednorodzinnego oraz Deweloperskim Funduszu Gwarancyjnym. Z perspektywy strony internetowej dewelopera — trzy nowe obowiązki:
- Publikowanie cen ofertowych w sposób jawny na własnej stronie (art. 19a)
- Codzienna aktualizacja feedu CSV/XML w portalu dane.gov.pl (art. 19b)
- Zachowanie 3-letniej historii zmian cen (audyt UOKiK)
Konsekwencja niezgodności: kara administracyjna nakładana przez Prezesa UOKiK do wysokości 10% rocznego obrotu dewelopera (art. 28a). To nie żart — UOKiK w 2025 roku już wszczął kilkanaście postępowań. Obrót średniego dewelopera = kara w setkach tysięcy złotych. Dla dużego — dziesiątki milionów.
Co dokładnie musisz mieć
1. Tabelę / listę lokali z cenami brutto
Aktualne ceny ofertowe wszystkich lokali (dostępnych, w rezerwacji, sprzedanych) muszą być widoczne w HTML-u strony. Nie w PDF-ie prospektu. Nie „dostępne na życzenie”. Na stronie HTML.
Status lokalu jest wymagany — UOKiK wymaga widoczności wszystkich lokali, nie tylko dostępnych. Status sprzedany usuwa lokal z widoku — narusza to wymóg jawności.
2. Cenę za m²
Wyliczoną automatycznie z ceny brutto i powierzchni. Klient widzi cenę za m² obok ceny lokalu. To wymóg art. 19a + interpretacja UOKiK.
W kodzie WordPressa to hook save_post_unit z priorytetem 5:
add_action('save_post_unit', function($post_id) {
$price = (float) get_post_meta($post_id, 'jtm_price_gross', true);
$area = (float) get_post_meta($post_id, 'jtm_area', true);
if ($price > 0 && $area > 0) {
update_post_meta($post_id, 'jtm_price_per_m2',
round($price / $area, 2));
}
}, 5);
3. Datę aktualizacji
Każda lista lokali musi mieć widoczną datę ostatniej zmiany. „Ostatnia aktualizacja: 06.05.2026″. UOKiK skontroluje, czy cena na stronie zgadza się z wykazem w portalu dane.gov.pl — data jest dowodem.
4. Prospekt informacyjny
Link do prospektu w PDF-ie przy każdym lokalu. Prospekt musi być aktualny (data wydania widoczna w pliku).
Format CSV — 58 kolumn
Codzienny feed CSV publikowany na własnej stronie i zarejestrowany w portalu dane.gov.pl. Specyfikacja:
- Kodowanie: UTF-8 z BOM (
xEFxBBxBF) - Separator pól:
,(przecinek, NIE średnik) - Separator dziesiętny:
.(kropka, NIE przecinek) - Liczba kolumn: dokładnie 58 (nie 57, nie 60)
Najczęstsze pułapki:
- Excel zapisuje CSV z separatorem ; — domyślne ustawienie polskiego Excela. Trzeba zmienić w opcjach lub zapisywać z poziomu kodu (PHP
fputcsv). - Brak BOM — harvester czyta polskie znaki jako krzaki. Pierwsze 3 bajty pliku to
xEFxBBxBF. - Cena z „zł” w polu numerycznym — walidacja XSD failuje. Cena to
499000.60, bez waluty, bez spacji.
Format XML — schemat XSD v1.13
Plik manifestu XML z metadanymi zbioru. Walidowany przeciwko schematowi otwarte_dane_latest.xsd v1.13 (do pobrania z dane.gov.pl).
<datasets xmlns="urn:otwarte-dane:harvester:1.13"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<dataset>
<extIdent>dane_jtm_mieszkania_001</extIdent>
<extTitle>Ceny ofertowe — JTM Development</extTitle>
<category>ECON</category>
<frequency>daily</frequency>
<licenseId>14</licenseId>
<resources>
<resource>
<extIdent>jtm_20260506</extIdent>
<url>https://.../ceny-2026-05-06.csv</url>
<format>csv</format>
<availability>active</availability>
</resource>
</resources>
</dataset>
</datasets>
Walidacja przed publikacją:
xmllint --schema otwarte_dane_latest.xsd feed.xml --noout
3-letnia historia zmian cen
Art. 19b ust. 3 wymaga przechowywania historii zmian cen przez 3 lata od daty zmiany. UOKiK może wezwać do okazania.
W WordPressie najprościej dedykowana tabela:
CREATE TABLE wp_jtm_price_history (
id BIGINT UNSIGNED AUTO_INCREMENT,
unit_id BIGINT UNSIGNED NOT NULL,
old_price DECIMAL(12,2) NOT NULL,
new_price DECIMAL(12,2) NOT NULL,
changed_at DATETIME NOT NULL,
PRIMARY KEY (id),
KEY unit_id (unit_id),
KEY changed_at (changed_at)
);
Hook na save_post lokalu wpisuje wpisy. Auto-purge po 3 latach — cron miesięczny.
Co zrobić preventywnie
- Zarejestrować zbiór na dane.gov.pl zanim UOKiK zapyta — sama rejestracja zajmuje 24-72h
- Walidować feed XML/CSV przeciwko XSD codziennie — automation w cronie
- Trzymać archive XML/CSV przez 3 lata (Docker volume z backup)
- Polityka prywatności + RODO + cookie banner — to też pod skanowaniem UOKiK
- Audyt prawny przed startem sprzedaży
Pełna checklista
Pełny PDF z 12-ma wymogami, paragrafami ustawy, kodem PHP do każdego — pobierz tutaj. 14 stron, bez ściemy.