Tema
Oglasi i pretraga
GET /v1/properties · GET /v1/properties/{idOrSlug} · opseg public:read
Šta sajt vidi
Javni API nikad ne vraća sve iz baze agencije, već samo oglase koji su:
- aktivni (
status: "active"; ne nacrti, rezervisani, prodati, izdati ni arhivirani) i nisu obrisani; - objavljeni na sajt: agencija ima kanal „Vaš sajt“ i oglas je na njega objavljen. Kanal nastaje sa prvim ključem; ako je u njemu uključeno „Automatski objavljuj nove oglase na sajtu“, svaki novi aktivan oglas se pojavi na sajtu sam, inače agencija bira oglase. Ako je kanal isključen, sajt ne vidi nijedan oglas;
- kod ključa za filijalu: oglasi te filijale.
Interna polja (beleške, vlasnik, ko je uneo oglas, dodatna polja za portale) se nikad ne vraćaju.
Pretraga
http
GET /api/v1/properties?dealType=sale&type=apartment&city=Beograd&municipality=Vračar&priceMax=250000&roomsMin=2&sort=priceAsc&page=1&pageSize=12
x-api-key: pk_…| Parametar | Tip | Značenje |
|---|---|---|
q | string (≤ 200) | slobodan tekst: pretraga celog teksta oglasa, plus delimično poklapanje u šifri (reference), naslovu i ulici |
type | apartment | house | land | commercial | garage | office | other | vrsta nekretnine |
dealType | sale | rent | prodaja ili izdavanje |
city | string | grad, tačan naziv bez obzira na velika/mala slova (beograd = Beograd) |
municipality | string | opština ili deo naziva (Vrač pogađa Vračar) |
priceMin, priceMax | broj | cena u valuti oglasa (uključivo) |
areaMin, areaMax | broj | površina u m² (uključivo) |
roomsMin, roomsMax | broj | broj soba (može 2.5) |
features | string | lista odvojena zarezom; oglas mora imati sve navedene, tačno kako su zapisane (Lift,Terasa,Parking) |
bbox | minLng,minLat,maxLng,maxLat | samo oglasi sa koordinatama unutar pravougaonika (za mapu) |
sort | newest (podrazumevano) | oldest | priceAsc | priceDesc | areaAsc | areaDesc | relevance | redosled; relevance ima smisla uz q |
page, pageSize | ceo broj | strana (od 1) i veličina strane (1–100, podrazumevano 20) |
Odgovor je paginiran: { items, page, pageSize, total }. Filijalu određuje ključ: ključ za filijalu vraća samo njene oglase. % i _ u pretrazi su obični znakovi, ne džokeri.
Lista nosi samo naslovnu sliku
U listi images sadrži samo naslovnu fotografiju, a imageCount ukupan broj fotografija. Sve fotografije vraća detalj oglasa.
Vrednosti features su srpski nazivi iz kataloga u aplikaciji, npr. Lift, Terasa, Parking, Garažno mesto, Klima, Novogradnja, Renoviran, Uknjižen, Odmah useljiv, Pet friendly. Agencija može upisati i sopstvene, pa listu za filtere na sajtu najbolje napravite iz stvarnih oglasa.
Detalj oglasa
http
GET /api/v1/properties/trosoban-stan-vracar-p-1042
x-api-key: pk_…idOrSlug je UUID oglasa (id) ili njegov slug. Oglas koji ne postoji, nije aktivan ili nije objavljen na sajt vraća 404 NOT_FOUND; tada sajt treba da vrati svoju stranicu 404 (ili 410 za oglas koji je postojao).
Slug se menja sa naslovom
slug je naslov u obliku za URL plus šifra oglasa (trosoban-stan-vracar-p-1042). Kada agent promeni naslov, menja se i slug, a stari slug više ne radi. Dva sigurna rešenja:
- adrese sa id-em:
/nekretnine/{id}/{slug}; učitajte oglas poid, a ako se slug u adresi razlikuje, uradite301na novu adresu; - adrese sa slugom: kada detalj vrati
404, uzmite šifru sa kraja sluga (p-1042), potražiteGET /v1/properties?q=P-1042, i ako stavka ima tačno tureference, uradite301na njen novi slug.
Model oglasa (PublicProperty)
json
{
"id": "5b1f0c7e-3a2d-4c51-9a7e-0f9a1f6d2c11",
"reference": "P-1042",
"slug": "trosoban-stan-vracar-p-1042",
"title": "Trosoban stan, Vračar",
"description": "Svetao, renoviran stan na drugom spratu…",
"type": "apartment",
"dealType": "sale",
"status": "active",
"price": 245000,
"currency": "EUR",
"pricePerSqm": 3500,
"areaSqm": 70,
"landAreaSqm": null,
"rooms": 3,
"bedrooms": 2,
"bathrooms": 1,
"floor": 2,
"totalFloors": 5,
"yearBuilt": 1972,
"heating": "central",
"furnished": "semi",
"features": ["Lift", "Terasa", "Uknjižen"],
"location": {
"country": "RS", "city": "Beograd", "municipality": "Vračar", "neighborhood": "Crveni krst",
"street": "Maksima Gorkog", "streetNumber": "12", "postalCode": "11000", "lat": 44.7953, "lng": 20.4781
},
"agentId": "a7c2…",
"branchId": null,
"agent": { "id": "a7c2…", "name": "Jelena Petrović", "phone": "+381 64 111 2233", "email": "jelena@agencija.rs" },
"images": [
{
"id": "c0de…", "propertyId": "5b1f…", "position": 0, "alt": null, "isCover": true, "status": "ready",
"originalName": "dnevna-soba.jpg", "createdAt": "2026-10-01T09:12:00.000Z",
"variants": [
{ "name": "thumb", "url": "https://app.propertio.rs/media/…/thumb.webp?md5=…&expires=1792483200", "width": 320, "height": 213, "bytes": 14873, "format": "webp" },
{ "name": "card", "url": "https://app.propertio.rs/media/…/card.webp?md5=…&expires=1792483200", "width": 800, "height": 533, "bytes": 61230, "format": "webp" },
{ "name": "large", "url": "https://app.propertio.rs/media/…/large.webp?md5=…&expires=1792483200", "width": 1600, "height": 1066, "bytes": 198004, "format": "webp" }
]
}
],
"imageCount": 14,
"createdAt": "2026-09-30T08:00:00.000Z",
"updatedAt": "2026-10-18T14:21:00.000Z",
"publishedAt": "2026-10-01T09:30:00.000Z"
}| Polje | Napomena |
|---|---|
reference | šifra oglasa u agenciji (npr. P-1042); prikažite je posetiocu, agenti po njoj traže oglas |
price, currency | cena u valuti oglasa; kod izdavanja je mesečna |
pricePerSqm | može biti null |
rooms | broj soba, može biti decimalan (2.5) |
heating | central, gas, electric, floor, heat_pump, wood, none, other ili null |
furnished | yes, no, semi ili null |
location | adresa kakva je u oglasu; lat/lng mogu biti null. Dogovorite sa agencijom da li sajt prikazuje ulicu i broj |
agent | agent koji vodi oglas (null ako nije dodeljen) |
images[].variants | thumb (320 px), card (800 px), large (1600 px); potpisani linkovi koji ističu, vidi Slike |
imageCount | samo u listi |
publishedAt | kada je oglas poslednji put postao aktivan (posle rezervacije ili arhive se pomera) |
Opcionalna polja mogu izostati ili biti null; tretirajte oba isto. Nova polja se mogu pojaviti; ignorišite ih.
Sitemap i statičko generisanje
Za sve oglase prođite kroz strane sa pageSize=100 (ili properties.all() u SDK-u) i za lastmod koristite updatedAt. Pošto linkovi slika ističu za 24 h, statički sajt treba ponovo da se izgradi bar jednom dnevno (bolje na nekoliko sati), ili da slike učitava pri prikazu.
ts
import { PropertioClient } from "@propertio/sdk";
const propertio = new PropertioClient({ baseUrl: "https://app.propertio.rs/api", apiKey: process.env.PROPERTIO_API_KEY! });
const urls: string[] = [];
for await (const p of propertio.properties.all({ dealType: "sale" })) {
urls.push(`<url><loc>https://www.agencija.rs/nekretnine/${p.slug}</loc><lastmod>${p.updatedAt}</lastmod></url>`);
}