📦 Dokumentacja API
API REST dla biur nieruchomości i deweloperów — automatyczny import i synchronizacja ofert z zewnętrznych systemów CRM. Oferty pojawiają się na portalu natychmiast po przesłaniu.
Wprowadzenie
Bazowy URL wszystkich endpointów:
API używa formatu JSON zarówno dla żądań (Content-Type: application/json), jak i odpowiedzi. Każde żądanie musi zawierać nagłówek autoryzacyjny z kluczem API.
Autentykacja
Każde żądanie musi zawierać nagłówek Authorization z tokenem Bearer:
Klucz API jest powiązany z kontem biura lub dewelopera. Wszystkie oferty importowane przez dany klucz trafiają automatycznie na to konto.
Nie powinien być przechowywany w publicznych repozytoriach ani udostępniany poza zaufanym środowiskiem.
W przypadku podejrzenia wycieku należy niezwłocznie wygenerować nowy klucz i dezaktywować poprzedni.
Limity zapytań
Każdy klucz API ma przypisany dzienny limit zapytań, ustalany przez administratora portalu. Domyślna wartość to 1 000 zapytań/dzień. Po przekroczeniu limitu API zwraca kod 429 Too Many Requests.
Aktualny stan wykorzystania limitu widoczny jest w Panelu konta → Klucze API.
Kody błędów
| Kod HTTP | Znaczenie |
|---|---|
200 | OK — zapytanie zakończone sukcesem |
201 | Created — oferta została utworzona |
400 | Bad Request — nieprawidłowy JSON lub brakujące pola |
401 | Unauthorized — brak lub nieważny klucz API |
404 | Not Found — oferta o podanym ref nie istnieje |
409 | Conflict — oferta o tym ref już istnieje (użyj PUT) |
422 | Unprocessable — błąd walidacji; szczegóły w polu error |
429 | Too Many Requests — przekroczono dzienny limit zapytań |
Każda odpowiedź zawiera pole success (bool) oraz opcjonalnie error z opisem błędu:
GET — Pobierz ofertę
Zwraca dane oferty identyfikowanej numerem ref z Twojego CRM.
Przykład
Odpowiedź 200
POST — Utwórz ofertę
Tworzy nową ofertę. Pole ref to unikalny identyfikator z Twojego CRM — służy do późniejszej aktualizacji i usuwania. Oferta trafia od razu ze statusem aktywnym.
Nagłówki
Ciało żądania
Odpowiedź 201
PUT — Zaktualizuj ofertę
Aktualizuje istniejącą ofertę. Wszystkie przesłane pola zostają nadpisane. Jeśli podasz tablicę images, stare zdjęcia zostaną zastąpione nowymi.
Przykład
Odpowiedź 200
DELETE — Usuń ofertę
Trwale usuwa ofertę i jej zdjęcia. Operacja jest nieodwracalna.
Przykład
Odpowiedź 200
Pola oferty
| Pole | Typ | Wymagane | Opis |
|---|---|---|---|
ref | string | tak | Unikalny ID oferty w Twoim CRM (maks. 100 znaków) |
title | string | tak | Tytuł ogłoszenia |
type | string | tak | Typ nieruchomości — patrz Typy |
deal | string | tak | sell lub rent |
city | string | tak | Miasto (np. Poznań) |
price | number | nie | Cena w PLN |
area | number | nie | Powierzchnia w m² |
market | string | nie | primary lub secondary |
description | string | nie | Opis oferty |
address | string | nie | Ulica i numer |
district | string | nie | Dzielnica |
rooms | integer | nie | Liczba pokoi |
floor | integer | nie | Piętro (0 = parter) |
floors_total | integer | nie | Liczba pięter w budynku |
build_year | integer | nie | Rok budowy |
building_type | string | nie | Typ budynku (np. blok, kamienica) |
build_material | string | nie | Materiał budowlany |
heating | string | array | nie | Ogrzewanie, np. ["miejskie"] |
amenities | array | nie | Udogodnienia, np. ["balkon","winda"] |
media | array | nie | Media, np. ["internet","gaz"] |
finish | string | nie | Stan wykończenia |
ownership | string | nie | Forma własności |
seller_type | string | nie | agency, developer lub private |
lat | number | nie | Szerokość geograficzna (np. 52.4064) |
lng | number | nie | Długość geograficzna (np. 16.9252) |
images | array | nie | Tablica publicznych URL-ów zdjęć (https). PUT zastępuje poprzednie. |
Typy i wartości
type — typ nieruchomości
| Wartość | Opis |
|---|---|
apartment | Mieszkanie |
house | Dom |
plot | Działka |
commercial | Lokal użytkowy |
garage | Garaż / miejsce parkingowe |
room | Pokój |
studio | Kawalerka |
other | Inne |
deal — transakcja
| Wartość | Opis |
|---|---|
sell | Sprzedaż |
rent | Wynajem |
market — rynek
| Wartość | Opis |
|---|---|
primary | Rynek pierwotny |
secondary | Rynek wtórny |
Przykłady kodu
PHP
Python
Lokale inwestycyjne — wprowadzenie
Oprócz standardowych ofert, API umożliwia import lokali w inwestycjach deweloperskich. Każdy lokal jest przypisany do konkretnej inwestycji i opcjonalnie do jej etapu.
Identyfikatory UUID inwestycji i etapów
Każda inwestycja i każdy etap posiadają unikalny identyfikator UUID, który jest wymagany przy wysyłaniu lokali przez API. Znajdziesz je w panelu edycji inwestycji — w sekcji „🔑 Identyfikatory API". Każdy UUID możesz skopiować jednym kliknięciem.
investment_uuid jest zawsze wymagane. Pole phase_uuid jest opcjonalne — jeśli inwestycja ma tylko jeden etap, możesz je pominąć. Bazowy URL endpointów lokali:
GET — Pobierz lokal
Zwraca dane lokalu identyfikowanego numerem ref z Twojego CRM w ramach wskazanej inwestycji.
Parametry URL
| Parametr | Wymagane | Opis |
|---|---|---|
ref | tak | Identyfikator lokalu w Twoim CRM (w URL) |
investment_uuid | tak | UUID inwestycji (query string) |
Przykład
Odpowiedź 200
POST — Utwórz lokal
Tworzy nowy lokal w inwestycji. Pole ref to unikalny identyfikator z Twojego CRM w obrębie danej inwestycji.
Nagłówki
Ciało żądania
Odpowiedź 201
PUT — Zaktualizuj lokal
Aktualizuje istniejący lokal. Wszystkie przesłane pola zostają nadpisane. Najczęstszy przypadek użycia to zmiana statusu (np. z available na reserved lub sold).
Przykład
Odpowiedź 200
DELETE — Usuń lokal
Trwale usuwa lokal z inwestycji. Operacja jest nieodwracalna.
Przykład
Odpowiedź 200
Pola lokalu
| Pole | Typ | Wymagane | Opis |
|---|---|---|---|
ref | string | tak | Unikalny ID lokalu w Twoim CRM (maks. 100 znaków). Wymagany przy POST; dla PUT podawany w URL. |
investment_uuid | string | tak | UUID inwestycji — widoczny w Panelu → Inwestycje → Edytuj → sekcja „Identyfikatory API" |
unit_number | string | tak | Numer / oznaczenie lokalu widoczne na portalu (np. M.1.01, A3) |
unit_type | string | nie | Typ lokalu z słownika unit_types (patrz Typy lokali). Domyślnie mieszkanie. |
phase_uuid | string | nie | UUID etapu inwestycji — widoczny obok nazwy etapu w sekcji „Identyfikatory API". Pomiń jeśli inwestycja ma jeden etap. |
rooms | integer | nie | Liczba pokoi |
floor | integer | nie | Piętro (0 = parter) |
area | number | nie | Powierzchnia lokalu w m² |
price | number | nie | Cena w PLN |
show_price | boolean | nie | true — cena widoczna publicznie; false — ukryta. Domyślnie false. |
status | string | nie | Status lokalu: available (dostępny), reserved (zarezerwowany), sold (sprzedany). Domyślnie available. |
description | string | nie | Opis lokalu |
external_url | string (URL) | nie | Link do strony zewnętrznej z ofertą tego lokalu (np. własna podstrona dewelopera). W karcie lokalu na portalu pojawia się przycisk "Zobacz szczegóły" prowadzący do tego URL. Wymagany schemat http:// lub https://, max 500 znaków. |
Wartości pola status
| Wartość | Opis |
|---|---|
available | Lokal dostępny — widoczny jako wolny |
reserved | Lokal zarezerwowany |
sold | Lokal sprzedany |
Pole show_price
true — cena lokalu jest publicznie widoczna w karcie inwestycji. false — ukrywamy ją (na portalu pojawia się "Cena na zapytanie"). Domyślnie false. Pole boolean — przyjmuje także wartości 1/0.
Pole floor_plan_url (read-only)
Zwracany w odpowiedzi GET. Aby ustawić rzut, użyj POST /api/v1/units/{ref}/floor-plan.
Pole photos (read-only)
Zwracany w odpowiedzi GET — tablica obiektów {id, url, sort_order}. Aby dodać zdjęcia użyj POST /api/v1/units/{ref}/photos.
Pole floors (read-only)
Zwracany w odpowiedzi GET — tablica kondygnacji wraz z pomieszczeniami. Edytujesz je osobnymi endpointami z sekcji Kondygnacje i pomieszczenia.
Kondygnacje i pomieszczenia — wprowadzenie
Każdy lokal może mieć rozplanowanie wewnętrzne podzielone na kondygnacje (np. parter, piętro, antresola) zawierające pomieszczenia z określonym typem (kuchnia, salon, łazienka itd.) i metrażem. Te dane są wyświetlane w karcie lokalu na portalu.
Workflow:
- Stwórz lokal przez
POST /api/v1/unitsi zapamiętaj jegoref. - Stwórz kondygnację przez
POST /api/v1/units/{ref}/floors— odpowiedź zwrócifloor.id. - Dodaj pomieszczenia do tej kondygnacji przez
POST /api/v1/floors/{id}/roomszroom_typeze słownika.
Pełną strukturę (lokal + kondygnacje + pomieszczenia + zdjęcia + rzut) pobierzesz jednym GET /api/v1/units/{ref}.
GET — Lista kondygnacji lokalu
Zwraca wszystkie kondygnacje lokalu, każda z zagnieżdżoną listą pomieszczeń. Kolejność jest zachowana zgodnie z polem sort_order.
Odpowiedź 200
POST — Dodaj kondygnację
Ciało żądania
Odpowiedź 201
PUT — Edytuj kondygnację
Ciało żądania
Pola opcjonalne — przesyłaj tylko te, które chcesz zmienić.
DELETE — Usuń kondygnację
Usuwa kondygnację wraz ze wszystkimi pomieszczeniami które się w niej znajdowały. Operacja nieodwracalna.
POST — Dodaj pomieszczenie
Ciało żądania
Odpowiedź 201
PUT — Edytuj pomieszczenie
Ciało żądania
Wszystkie pola opcjonalne — przesyłaj tylko te, które chcesz zmienić.
DELETE — Usuń pomieszczenie
POST — Dodaj zdjęcie lokalu
Endpoint przyjmuje multipart/form-data (nie JSON). Pole pliku: photo. investment_uuid przekazuj jako pole formularza lub query string.
Dozwolone formaty: JPG, PNG, WEBP, GIF. Maksymalny rozmiar: 8 MB.
Przykład cURL
Odpowiedź 201
DELETE — Usuń zdjęcie lokalu
Usuwa rekord zdjęcia oraz plik z dysku.
POST — Dodaj rzut lokalu
multipart/form-data. Pole pliku: floor_plan. Każdy lokal ma jeden rzut — kolejny upload zastępuje poprzedni.
Dozwolone formaty: JPG, PNG, WEBP, GIF (max 8 MB) oraz SVG (max 1 MB) — rzuty wektorowe są zalecane bo skalują się bez utraty jakości.
<script>, <foreignObject>, atrybuty event-handlerów (onclick, onload itd.) oraz hrefy javascript:/data:. Bezpieczne nawet jeśli pochodzą z niezaufanego źródła. Przykład cURL
Odpowiedź 201
DELETE — Usuń rzut lokalu
Czyści floor_plan_url w lokalu i usuwa plik z dysku.
GET — Słowniki
Zwraca wszystkie słowniki używane przez API: typy lokali, statusy, typy pomieszczeń, statusy etapów. Pobierz raz przy starcie integracji i cache'uj — zmieniają się rzadko.
Odpowiedź 200
Słownik: Typy lokali (unit_types)
Wartości pola unit_type używanego w POST/PUT lokalu.
| Kod | Etykieta |
|---|---|
mieszkanie | Mieszkanie |
dom | Dom |
miejsce_parkingowe | Miejsce parkingowe |
garaz | Garaż |
komorka | Komórka lokatorska |
lokal_uslugowy | Lokal usługowy |
Słownik: Typy pomieszczeń (room_types)
Wartości ID pola room_type używanego przy tworzeniu pomieszczeń. ID są stabilne — bezpiecznie hardkoduj je w integracji.
| ID | Etykieta |
|---|---|
1 | Przedpokój |
2 | Przedsionek |
3 | Spiżarnia |
4 | Suszarnia |
5 | Schowek |
6 | Garderoba |
7 | Pokój |
8 | Salon |
9 | Łazienka |
10 | Taras |
11 | Balkon |
12 | Garaż |
13 | Piwnica |
14 | Salon z aneksem |
15 | Kuchnia |
16 | WC |
17 | Sala sprzedaży |
18 | Magazyn |
19 | Kotłownia |
20 | Pomieszczenie techniczne |
21 | Szatnia |
22 | Biuro |
23 | Pomieszczenie socjalne |
24 | Pomieszczenie gospodarcze |
25 | Klatka schodowa |
26 | Korytarz |
27 | Antresola |
28 | Pralnia |
29 | Wnęka |
30 | Komunikacja |
31 | Wiatrołap |
32 | Loggia |
33 | Łazienka + Kotłownia |
34 | Gabinet |
35 | Ogródek |
36 | Podcień |
37 | Garaż - 1 miejsce postojowe |
38 | Pokój dzienny + aneks kuchenny |
39 | Korytarz zewnętrzny |
40 | Pokój dzienny |
41 | Aneks kuchenny |
42 | Schody |
43 | Pralnia + Piec |
44 | Sypialnia |
45 | Salon z jadalnią |
46 | Komórka |