Compari.ro API: ofertele magazinelor din România, în lei, ca JSON
Compari.ro este varianta românească a platformei Árukereső, iar motorul care o citește se numește `arukereso`: același cod servește arukereso.hu, compari.ro și pazaruvaj.com, așa că pentru România trimiți `"country": "ro"` la fiecare apel. Pentru un produs primești datele de pe pagina lui de comparare: prețul minim actual în lei, fiecare ofertă de magazin cu costul livrării și prețul total acolo unde magazinul le declară, nota magazinului, termenul de livrare și dacă poziția e plătită ca sponsorizare. În plus, `price_history` dă graficul prețului minim și al celui mediu, așa cum îl desenează site-ul. Nu e interfața prin care magazinele își trimit feed-ul de produse în Compari și nici panoul lor de administrare: API-ul nu încarcă și nu modifică nimic, doar citește paginile publice ale comparatorului.
Endpointuri
| endpoint | Ce returnează | Obligatorii |
|---|---|---|
| search | Căutare după cuvinte în tot catalogul, 20 de rânduri pe pagină, cel mult 100 de pagini. Pe rând: `product_id`, titlu, marcă, preț „de la”, preț maxim, numărul de oferte, nota și numărul de recenzii, categoria. Interval de preț în lei și șase ordonări. Rândurile `shop_offer` sunt produse listate de un singur magazin. | query |
| category | Produsele unei categorii după id (de exemplu 3277 = telefoane mobile), cu totalul categoriei, ordonare și paginare de câte 25. | category |
| product | Fișa produsului: titlu, marcă, calea de categorii, prețul minim și maxim actual, numărul de oferte plătite, sponsorizate și gratuite, nota (0–5 și procent), specificațiile și cel mai mic preț al aceluiași produs pe arukereso.hu și pazaruvaj.com, convertit de site în lei. | toate opționale |
| offers | Toate ofertele magazinelor pentru un produs, în ordinea site-ului: magazin, preț, cost de livrare și total, livrare gratuită, termen de livrare, stele și număr de recenzii ale magazinului, marcajul de magazin de încredere, tipul poziției (`sponsored`, `paid`, `free`) și linkul de redirecționare spre magazin. | toate opționale |
| price_history | Graficul de preț al produsului: seria prețului minim și seria prețului mediu din magazine, cu dată și sumă, puncte aproximativ lunare și mai dese spre prezent. | toate opționale |
Fiecare apel se taxează în credite. Apelurile eșuate și blocate sunt gratuite.
Exemplu funcțional
Pentru Samsung Galaxy S25 128GB, `offers` a întors 36 de oferte în ordinea de pe compari.ro. Primele trei poziții sunt sponsorizate și niciuna nu e cea mai ieftină: oferta minimă, 2 713,86 RON cu livrare gratuită, era pe poziția 5. Atenție la `listing_type: "free"`: înseamnă o listare neplătită a magazinului, nu livrare gratuită (aceea e `free_shipping`). La 23 din cele 36 de oferte magazinul nu declara costul livrării, deci `shipping_cost` și `total_price` sunt null; o comparație corectă pe preț total se poate face doar între ofertele care îl au.
curl -X POST https://api.reefapi.com/arukereso/v1/offers \
-H "x-api-key: CHEIA_TA" \
-H "content-type: application/json" \
-d '{"product_id": "1170024967", "country": "ro"}'{
"ok": true,
"data": {
"product_id": "1170024967",
"title": "Samsung Galaxy S25 5G 128GB 12GB RAM Dual (SM-S931)",
"url": "https://www.compari.ro/telefoane-mobile-c3277/samsung/galaxy-s25-5g-128gb-12gb-ram-dual-sm-s931-p1170024967/",
"country": "ro",
"currency": "RON",
"lowest_price": 2713.86,
"cheapest_total_price": 2713.86,
"offer_count": 36,
"source_offer_counts": { "paid": 25, "sponsored": 3, "free": 12 },
"duplicates_removed": 2,
"offers": [
...
{
"position": 2,
"shop_name": "notebookgsm.ro",
"shop_rating_stars": 5.0,
"shop_review_count": 540,
"shop_trusted": true,
"offer_title": "Samsung Galaxy S25 5G - Icyblue 12 GB 128 GB (SM-S931BLBDEUE)",
"price": 2828,
"price_text": "2 828,00 RON",
"shipping_cost": 29.0,
"free_shipping": false,
"shipping_text": "+ 29,00 RON costul livrarii",
"total_price": 2857.0,
"in_stock": null,
"delivery_time": "Detalii de livrare la magazin",
"condition": "new",
"listing_type": "sponsored"
},
...
{
"position": 5,
"shop_name": "mobiro.eu",
"shop_rating_stars": 1.0,
"shop_review_count": 1,
"shop_trusted": false,
"offer_title": "Samsung Galaxy S25 12GB 128GB 5G Black Smartphone (SM-S931BZKDEUE)",
"price": 2713.86,
"price_text": "2 713,86 RON",
"shipping_cost": 0,
"free_shipping": true,
"shipping_text": "Livrare gratuita",
"total_price": 2713.86,
"delivery_time": "Livrare: max 2 sapt.",
"condition": "new",
"listing_type": "paid"
},
...
]
},
"meta": { "record_count": 36, "country": "ro", "charged_credits": 3, "cache_hit": false, "mode": "live" }
}Scraper pentru Compari: ce am reparat la verificare
Rândurile cu un singur magazin nu au pagina acolo unde te-ai aștepta. Adresa scurtă a produsului (`/x/x-p<id>/`) redirecționează spre un subdomeniu de categorie al site-ului. Prima noastră versiune refuza orice redirecționare spre alt nume de gazdă, așa că la verificarea din 15 octombrie 2026 primele patru id-uri dintr-o căutare filtrată pe preț (pe arukereso.hu) au dat eroare la `offers` și `product`, 4 din 4. După corectură, redirecționarea e urmată doar în domeniul site-ului, iar 30 din 30 de rânduri din cele trei țări au trecut prin `offers` și `product` cu același id și cu prețul minim egal cu cel din rând.
O categorie inexistentă nu dă 404: site-ul servește pagina principală. La prima rulare de verificare, motorul a raportat asta drept succes cu zero produse; acum întoarce NOT_FOUND. Tot atunci am găsit că un cuvânt căutat poate duce direct într-o pagină de categorie, unde pagina are 25 de produse, nu 20; motorul cerea a doua pagină cu pasul căutării (20) în loc de cel al categoriei (25). Am corectat și asta înainte de a doua rulare.
Iar ordinea ofertelor nu e ordinea prețului: pozițiile sponsorizate vin primele, apoi ofertele plătite, apoi listările gratuite. Un script care ia „prima ofertă” drept cea mai ieftină raportează, pentru telefonul din exemplu, 3 194,99 RON în loc de 2 713,86.
Pentru o singură comparație ajunge pagina site-ului. Cine urmărește în fiecare zi prețul la anvelope de iarnă sau la telefoane are nevoie ca fiecare rând să ducă la produsul corect și ca „cel mai mic preț” să fie chiar cel mai mic.
Limite și note oneste
- Compari și Árukereső n-au construit și nu susțin acest API; nu e o interfață oficială a comparatorului, iar noi nu suntem parteneri ai lor.
- Fără `"country": "ro"` cererea ajunge pe arukereso.hu, cu prețuri în forinți. Id-urile de produs și de categorie sunt comune celor trei site-uri.
- Numărul de oferte din căutare nu e același cu lista din `offers`: rândul Galaxy S25 128GB arăta 160 de oferte, `offers` a întors 36. Pentru număr și prețuri pe magazine, folosește `offers`.
- Costul livrării apare doar când magazinul îl declară (13 din 36 de oferte în exemplu). Stocul nu e un număr: `in_stock` era null la 28 din 36, iar termenul vine ca text în `delivery_time`.
- La unele produse nu există tabel de specificații: la telefonul din exemplu `specs` a venit null și descrierea tehnică e doar text liber, în `spec_text`.
- Căutarea nu întoarce totalul de rezultate, doar `last_page`, și se oprește la pagina 100. La „anvelope iarna 205/55 r16” toate cele 20 de rânduri erau oferte ale unui singur magazin (`shop_offer`), fără comparație între magazine pe rând.
- Istoricul de preț e cel din graficul site-ului: pentru telefonul din exemplu, 30 de puncte între 28 ianuarie 2025 și 26 octombrie 2026, nu fiecare zi.
- `search`, `category`, `product` și `offers` costă câte 3 credite pe apel; `price_history` 1 credit.