API

Publi24 API: anunțurile de pe publi24.ro în JSON

Pe Publi24 apar anunțuri gratuite din toată România: garsoniere de închiriat în Timișoara, apartamente de vânzare, mașini, biciclete, locuri de muncă. Prin API ai la dispoziție căutarea după cuvânt în anunțurile publice, cu prețul, localitatea, începutul descrierii și marcajul de anunț promovat, iar cu `listing_id` primit de acolo citești anunțul întreg: descrierea completă, fotografiile, caracteristicile (suprafață utilă, etaj, compartimentare, an de construcție) și prețul în moneda în care l-a pus autorul. Dacă publici sau promovezi anunțuri pe Publi24, API-ul nu te ajută cu asta: nu adaugă anunțuri, nu le reactualizează și nu se conectează la contul tău. Lucrează doar cu paginile publice ale site-ului, din partea celui care caută.

Endpointuri

endpointCe returneazăObligatorii
searchCăutare după cuvânt în toate anunțurile (1–200 de caractere), doar paginile 1 și 2. Pe fiecare rând: `listing_id` (calea completă a anunțului), titlul, prețul afișat cu moneda, prețul din datele structurate ale sursei (`source_price`) și `price_disagreement` când cele două nu se potrivesc, imaginea, localitatea, începutul descrierii și `promoted`. Tot în răspuns: câte anunțuri spune site-ul că există (`total`) și numărul ultimei pagini de pe site (`last_page`).query
detailAnunțul complet după `listing_id` din căutare (sau adresa www.publi24.ro a anunțului): prețul în moneda originală, descrierea întreagă, fotografiile, caracteristicile în perechi nume–valoare, localitatea, tipul ofertantului (persoană fizică sau organizație) și `business_function`, din care se vede dacă e vânzare sau închiriere.listing_id

Fiecare apel se taxează în credite. Apelurile eșuate și blocate sunt gratuite.

Exemplu funcțional

Pentru „garsoniera timisoara” site-ul raportează 1 003 anunțuri; pe prima pagină 8 din 24 erau promovate, iar printre chirii a apărut și o garsonieră de vânzare (o recunoști după `de-vanzare` din `listing_id`). La 20 din 24 de rânduri `price_disagreement` era `true`: căutarea afișează suma în lei, iar datele sursei au altă sumă: garsoniera din zona Gării apare cu 1 390 RON, `source_price` are 260, iar `detail` pe același anunț dă 260 EUR. Pentru o medie a chiriilor, ia prețul din `detail` sau ține cont de semnal; nu trata `source_price` din căutare ca sumă în lei.

Cerere
curl -X POST https://api.reefapi.com/publi24/v1/search \
  -H "x-api-key: CHEIA_TA" \
  -H "content-type: application/json" \
  -d '{"query": "garsoniera timisoara"}'
Răspuns (prescurtat)
{
  "ok": true,
  "data": {
    "query": "garsoniera timisoara",
    "listings": [
      {
        "listing_id": "/anunturi/imobiliare/de-inchiriat/apartamente/garsoniera/anunt/de-inchiriat-garsoniera-in-zona-lipovei/1573d23f613f7847175d773955d8dd79.html",
        "title": "De inchiriat garsoniera in zona Lipovei",
        "price": { "amount": 1284.0, "currency": "RON", "display": "1 284 RON" },
        "source_price": { "amount": null, "currency": null },
        "price_disagreement": false,
        "location": "Lipovei, Timisoara, Timis",
        "promoted": true
      },
      ...
      {
        "listing_id": "/anunturi/imobiliare/de-inchiriat/apartamente/garsoniera/anunt/garsoniera-de-inchiriat-in-zona-garii/d2gf7e9fg3h27g25d3degd6fd15e42hg.html",
        "source_id": "d2gf7e9fg3h27g25d3degd6fd15e42hg",
        "url": "https://www.publi24.ro/anunturi/imobiliare/de-inchiriat/apartamente/garsoniera/anunt/garsoniera-de-inchiriat-in-zona-garii/d2gf7e9fg3h27g25d3degd6fd15e42hg.html",
        "title": "Garsonieră de închiriat în zona Gării",
        "price": { "amount": 1390.0, "currency": "RON", "display": "1 390 RON" },
        "source_price": { "amount": 260.0, "currency": "RON" },
        "price_disagreement": true,
        "location": "Garii, Timisoara, Timis",
        "description_excerpt": "Inchiriez apartament o camera , renovat , dotat cu tot ce trebuie , aproape de Gara de Nord , ...",
        "promoted": false
      },
      ...
      {
        "listing_id": "/anunturi/imobiliare/de-vanzare/apartamente/garsoniera/anunt/garsoniera-de-vanzare-in-zona-buziasului/461ie6fd1d2674g0d89136igi4190f0e.html",
        "title": "Garsonieră de vânzare în zona Buziașului",
        "price": { "amount": 294068.0, "currency": "RON", "display": "294 068 RON" },
        "source_price": { "amount": 55000.0, "currency": "RON" },
        "price_disagreement": true,
        "location": "Buziasului, Timisoara, Timis",
        "promoted": false
      },
      ...
    ],
    "total": 1003,
    "page": 1,
    "last_page": 51,
    "has_more": true,
    "paging_limit": 2,
    "source_has_more": true
  },
  "meta": { "record_count": 24, "charged_credits": 3, "cache_hit": false, "mode": "live" }
}

Ce ascunde publi24.ro unui scraper făcut în casă

Același anunț are trei prețuri, în funcție de unde te uiți. La construirea motorului, o locuință apărea în lista de rezultate cu 1 336 RON, în datele JSON ale aceleiași pagini cu 250.00 RON, iar în pagina anunțului cu 250 EUR. Un parser care ia numărul din JSON și moneda de lângă el salvează 250 de lei pentru o chirie de 250 de euro. Motorul păstrează pe fiecare suprafață suma vizibilă, nu face nicio conversie proprie și pune suma diferită în `source_price`, cu semnalul `price_disagreement`.

Formatul prețului nu e unul singur. O mașină promovată avea în căutare 36,891 RON, cu 41,694 RON tăiat alături, iar în anunț „6 990 EUR negociabil”: separatoare de mii diferite și un cuvânt lipit de sumă. Tocmai aici a picat a doua noastră rulare de verificare (7 din 9), pe prețul negociabil și pe fotografiile pierdute la anunțurile auto; ambele au fost reparate înainte de rulările finale, care au trecut 9 din 9 de două ori.

Nici id-urile nu au o singură formă: alături de cele de 32 de caractere există anunțuri vechi cu id de 16 (`7b01677e706d6456`). Iar o căutare fără niciun rezultat nu arată o pagină goală, ci carduri cu alte anunțuri recomandate; aici ea întoarce zero rânduri.

Toate astea contează abia când rulezi zilnic: o listă de chirii pe cartiere din Timișoara pare corectă și atunci când jumătate din sume sunt euro citiți drept lei.

Limite și note oneste

  • Publi24 nu are nicio legătură cu acest API: nu e o interfață oficială, iar între noi și site nu există un parteneriat.
  • O căutare se oprește la a doua pagină, deci la cel mult 48 de anunțuri, chiar dacă `total` e mult mai mare (1 003 la „garsoniera timisoara”, 7 324 la „bicicleta”). O cerere cu `page: 3` primește `INVALID_PARAM` și nu se taxează.
  • Singurul parametru de căutare e textul: categoria, prețul, orașul și ordinea rezultatelor nu se pot alege. Cum site-ul caută și în descrieri, la „bicicleta” au venit și apartamente; 3 din cele 4 anunțuri promovate de pe prima pagină erau imobiliare.
  • În căutare, prețurile anunțurilor puse în euro apar convertite în lei. Suma originală e în `source_price`, dar câmpul ei `currency` vine tot RON (garsoniera de mai sus: 260, cu RON). Moneda corectă o dă doar `detail` (260 EUR).
  • Câmpul `location` din căutare e textul sursei și poate conține resturi de codificare sau text de interfață: „Take%25252bIonescu”, „Complexul%252bStudentesc” și „Vezi pe hartă” la aceeași căutare.
  • Anunțurile de servicii sau „cumpăr” pot veni fără preț numeric (`price` null). GTIN nu am găsit în niciun anunț verificat. API-ul nu cere de la site numărul de telefon al vânzătorului, dar nici nu filtrează textul anunțului: la „bicicleta” un autor își scrisese numărul în litere chiar în descriere.
  • Un apel `search` costă 3 credite, la fel și un apel `detail`.