OLX România API: anunțuri și chirii de pe olx.ro, cu prețul în moneda anunțului
Primești în JSON ce vede pe olx.ro oricine caută ceva, fără să intre în cont: titlul, prețul cu moneda lui, dacă e negociabil, starea produsului, orașul și județul, fotografiile și caracteristicile din anunț (suprafață, etaj, compartimentare la imobiliare). Nu înlocuiește integrarea prin care agențiile imobiliare și magazinele își încarcă anunțurile pe OLX: aici nu există cont, mesagerie sau publicare, ci doar listările publice ale site-ului. Pentru România adaugi `"country": "ro"` la fiecare apel. Orașul se transformă în id cu `locations`: „Cluj” întoarce Cluj-Napoca, `city_id` 52953.
Endpointuri
| endpoint | Ce returnează | Obligatorii |
|---|---|---|
| search | Căutare după cuvânt și/sau categorie: sortare, stare (nou sau utilizat), interval de preț în moneda site-ului, livrare prin OLX, doar cu poze, filtrare pe județ, oraș sau cartier. Implicit 40 de anunțuri pe pagină (maximum 50), paginare prin `offset`. Anunțurile promovate pe care OLX le intercalează în listă sunt scoase. Are nevoie de `query` sau `category_id`. | toate opționale |
| count | Câte anunțuri corespund căutării și filtrelor, fără să descarce vreunul. | toate opționale |
| locations | Transformă denumiri în id-uri de localizare. Fără parametri: județele; cu `region_id`: orașele județului; cu `city_id`: cartierele; cu `query`: caută numele în toată țara. | toate opționale |
| offer | Anunțul complet după id-ul numeric: descriere, preț, stare, caracteristicile categoriei, fotografii, punctul pe hartă și ce canale de contact a lăsat vânzătorul. | id |
| categories | Categoriile și sugestiile de filtre pe care OLX le asociază unei căutări, plus definițiile generale ale filtrelor. | toate opționale |
| filters | Definițiile filtrelor de pe olx.ro, cu cheile filter_enum și filter_float care se pot trimite direct în parametrul `filters`. | toate opționale |
| user | Profilul public al unui vânzător. | user_id |
| user_offers | Toate anunțurile active ale unui vânzător, paginate prin `offset`. | user_id |
| suggested | Anunțurile pe care OLX le arată ca asemănătoare cu un anunț dat. | id |
| breadcrumbs | Calea de categorii a unei categorii sau a unui anunț; așa afli, de exemplu, că 1157 înseamnă Imobiliare › Apartamente - Garsoniere de inchiriat › 2 camere. | toate opționale |
Fiecare apel se taxează în credite. Apelurile eșuate și blocate sunt gratuite.
Exemplu funcțional
Am cerut chiriile de apartamente cu 2 camere din Cluj-Napoca (categoria 1157). `count` a dat 2 082 de anunțuri. Primele trei poziții din pagină erau anunțuri promovate și au fost scoase (`promoted_filtered: 3`). Cu `limit: 5` au venit de data asta 5 rânduri, la o rulare anterioară din aceeași zi doar 4, așa că nu te baza pe `limit` ca număr fix de rânduri. Toate chiriile erau în euro. Câmpul `previous_value` e cel mai apropiat lucru de un „istoric de preț” pe care îl afișează OLX: la anunțul de 500 € se vede că prețul a fost înainte 520 €.
curl -X POST https://api.reefapi.com/olx/v1/search \
-H "x-api-key: CHEIA_TA" \
-H "content-type: application/json" \
-d '{"country": "ro", "category_id": 1157, "city_id": 52953, "limit": 5}'{
"ok": true,
"data": {
"offers": [
{
"id": 310690216,
"url": "https://www.olx.ro/d/oferta/apartament-2-camere-chirie-IDl1CIv.html",
"title": "Apartament 2 camere chirie",
"created_time": "2026-10-15T20:33:58+03:00",
"price": {
"value": 450,
"currency": "EUR",
"type": "price",
"negotiable": false,
"converted_value": null,
"previous_value": null,
"label": "450 €"
},
"params": [
{ "key": "compartimentare", "name": "Compartimentare", "value": { "key": "decomandat", "label": "Decomandat" } },
{ "key": "m", "name": "Suprafata utila", "value": { "key": "60", "label": "60 m²" } },
{ "key": "floor", "name": "Etaj", "value": { "key": "fl_1", "label": "1" } }
],
"city": "Cluj-Napoca",
"region": "Cluj",
"category_id": 1157
},
{
"id": 310097526,
"title": "PF inchiriez ap 2 camere, decomandat, zona BIG",
"price": {
"value": 500,
"currency": "EUR",
"previous_value": 520,
"label": "500 €",
"previous_label": "520 €"
},
"...": "..."
}
],
"total": 2082,
"has_more": true,
"next_offset": 5
},
"meta": { "country": "ro", "record_count": 5, "promoted_filtered": 3, "charged_credits": 1, "cache_hit": false, "mode": "live" }
}Scraper OLX în Python: trei lucruri măsurate pe olx.ro
Eticheta prețului nu e prețul. Același anunț din Gheorgheni, o chirie de 550 €, a venit în aceeași zi cu `label` „2 945,15 lei” la căutarea după cuvânt („apartament 2 camere”) și cu „550 €” la răsfoirea categoriei. La căutarea după cuvânt, toate anunțurile în euro aveau eticheta convertită în lei (38 din 38, iar la o a doua rulare 37 din 37). Un scraper care citește textul afișat pune la un loc sume în euro și în lei fără să-și dea seama. Valoarea sigură e perechea `value` + `currency`, iar `converted_value` apare doar când OLX face singur conversia.
O căutare după cuvânt nu rămâne într-o singură categorie. „apartament 2 camere” în Cluj-Napoca a întors pe prima pagină circa 30 de chirii cu 2 camere, dar și 5 apartamente de vânzare, câteva anunțuri din categoriile de 3 camere, o garsonieră oferită la schimb și o cazare în regim hotelier la 180 lei. O medie făcută pe rezultate pune la un loc 550 € pe lună și 115 324 € preț de vânzare. Cu `category_id` (1157 pentru chirii cu 2 camere, 1165 pentru vânzare) problema dispare.
Iar anunțurile promovate stau chiar în listă, nu într-un bloc separat. În exemplul de mai sus au ocupat primele trei poziții ale paginii. Dacă le păstrezi, le vezi apărând din nou pe paginile următoare și pare că paginarea se repetă; aici sunt scoase, iar numărul lor e în `meta.promoted_filtered`.
Niciuna dintre cele trei nu aruncă o eroare. Dacă din datele astea calculezi o chirie medie pe cartier, pentru Mărăști sau Gheorgheni, rezultatul pare plauzibil chiar și atunci când amestecă lei cu euro, vânzări cu chirii și același anunț numărat de două ori.
Limite și note oneste
- Nu este un API oficial OLX: OLX nu l-a creat și nu îl susține, iar între noi și OLX nu există niciun acord sau parteneriat.
- Valoarea implicită pentru `country` este `pl`: dacă uiți `"country": "ro"`, primești anunțuri de pe olx.pl, în zloți.
- Moneda vine din fiecare anunț: în aceeași căutare pot fi prețuri în RON și în EUR. În măsurătorile noastre din Cluj-Napoca, canapelele (20 din 20) erau în lei, iar apartamentele (38 din 40) în euro. Nu convertim noi nimic; `converted_value` există doar când îl trimite OLX.
- Id-urile de categorie sunt ale olx.ro și nu se potrivesc cu cele de pe alte site-uri OLX; le iei din `categories` sau `breadcrumbs` cu `country: "ro"`.
- Numărul de rânduri nu e garantat egal cu `limit`: după scoaterea anunțurilor promovate pot veni mai puține (39 la `limit: 40` în căutarea după cuvânt, o dată 4 la `limit: 5`). Pagina următoare se cere cu `next_offset` din răspuns.
- Numărul de telefon nu e în răspuns: `contact.phone` spune doar dacă vânzătorul a lăsat unul. Suma e cea cerută de vânzător; prețul cu care s-a încheiat tranzacția nu apare pe OLX.
- Nu ținem copii ale anunțurilor: un preț modificat azi-dimineață pe olx.ro apare deja modificat la următorul apel.