Przejdź do treści

COMPLIANCE · 4 MIN

Strona dewelopera 2026 — checklista wymogów po 1 lipca 2025

Co konkretnie musi mieć strona dewelopera mieszkaniowego po nowelizacji ustawy. Paragrafy art. 19a, format dane.gov.pl, pułapki harvestera.

·

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:

  1. Publikowanie cen ofertowych w sposób jawny na własnej stronie (art. 19a)
  2. Codzienna aktualizacja feedu CSV/XML w portalu dane.gov.pl (art. 19b)
  3. 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.

Spodobało się? Podziel się.

Zaczynamy?

Odpowiem do końca dnia roboczego.