Altex API: produse, prețuri în lei și stoc pe magazine de pe altex.ro, în JSON
API-ul citește altex.ro așa cum îl vede un cumpărător: prețul în lei, prețul tăiat dinainte de reducere, PRP-ul producătorului, rata lunară, dacă produsul e în stoc online, la furnizor sau doar expus în magazin, și în câte magazine se găsește. Două lucruri merită știute din start: sunt incluse unitățile resigilate, fiecare cu prețul, motivul (ambalaj deteriorat, zgârieturi minore) și magazinul în care se află, și stocul pe fiecare magazin, cu orașul și adresa. Nu are legătură cu integrarea prin care vânzătorii din Altex Marketplace își încarcă produsele și comenzile: nu publică nimic, nu cere cont și doar citește paginile publice. Același catalog se poate citi și prin Media Galaxy, cu `site: "mediagalaxy"`.
Endpointuri
| endpoint | Ce returnează | Obligatorii |
|---|---|---|
| search | Căutare după cuvânt (minimum 3 caractere, ca pe site): SKU, EAN, brand, titlu, preț, preț tăiat, PRP, cel mai mic preț resigilat, rata lunară, starea stocului, numărul de magazine cu stoc, vânzătorul (Altex sau marketplace) și nota medie. Filtre pentru brand, interval de preț în lei, doar în stoc, vânzător, magazin și notă minimă; șapte sortări, până la 96 de produse pe pagină. | query |
| category | O categorie întreagă după slug-ul din adresă (de exemplu `frigidere`) sau după URL, cu aceleași filtre și sortări ca la căutare. Aici totalul e exact. | toate opționale |
| product | Pagina produsului, după `sku` (codul de pe pagină) sau URL: oferta fiecărui vânzător cu preț, preț tăiat, PRP, taxa verde și stoc; unitățile resigilate cu motive și magazin; distribuția notelor; specificațiile pe grupe; imaginile; calea categoriei; garanția extinsă și celelalte servicii, cu prețurile lor. | toate opționale |
| availability | Stocul pe magazine pentru un produs: fiecare magazin Altex sau Media Galaxy care îl are, cu oraș, județ, adresă și cantitate (site-ul nu arată mai mult de 6). | toate opționale |
| reviews | Recenziile scrise, cele mai noi sau cele mai utile întâi, opțional doar cu un anumit număr de stele: notă, titlu, text, dată, cumpărător verificat, voturi și răspunsurile magazinului. | toate opționale |
| stores | Lista magazinelor Altex, Media Galaxy și Brico: oraș, județ, adresă, coordonate și program pe zile. Se poate restrânge după oraș, județ sau rețea. | toate opționale |
| categories | Arborele de categorii, aplatizat: id, nume, slug-ul pentru `category`, părinte, nivel și calea completă. Se poate căuta după text. | toate opționale |
Fiecare apel se taxează în credite. Apelurile eșuate și blocate sunt gratuite.
Exemplu funcțional
Frigiderul BEKO B5RDNE504LDM, citit pe 28 octombrie 2026, are trei prețuri de referință care nu înseamnă același lucru: 2.999 lei e prețul de azi, 3.529 lei e prețul tăiat (reducere fixă de 530 lei, de aceea `discount_type: "fixed"`), iar 4.650 lei e PRP-ul, prețul recomandat de producător, nu un preț practicat de Altex. Taxa verde de 80 lei apare separat, în `offers`. Cele două unități resigilate se aflau la Altex București Vulcan (2.399,20 lei, cu deformări minore pe panourile laterale și fără ambalajul original) și la Altex Arad (2.699,10 lei, doar ambalaj deteriorat); amândouă veneau cu `in_stock: false`.
curl -X POST https://api.reefapi.com/altex/v1/product \
-H "x-api-key: CHEIA_TA" \
-H "content-type: application/json" \
-d '{"sku": "FRDB5RDNE504LDM"}'{
"ok": true,
"data": {
"product": {
"sku": "FRDB5RDNE504LDM",
"title": "Frigider cu doua usi BEKO B5RDNE504LDM, No Frost, 477 l, H 186 cm, Clasa E, Dozator apa, gri",
"brand": "BEKO",
"ean": "8690842492099",
"currency": "RON",
"price": 2999.0,
"was_price": 3529.0,
"discount_amount": 530.0,
"discount_percent": 15.0,
"discount_type": "fixed",
"recommended_retail_price": 4650.0,
"resealed_from_price": 2399.2,
"resealed_count": 2,
"installment_monthly_from": 88.0,
"availability": "in_stock",
"stores_with_stock": null,
"seller": { "id": 1, "name": "Altex", "type": "retailer" },
"rating": 4.62,
"review_count": 13,
"offers": [
{ "seller": { "id": 1, "name": "Altex", "type": "retailer" }, "price": 2999.0, "recommended_retail_price": 4650.0, "green_tax": 80.0, "in_stock": true, "available_in_store": true }
],
"rating_distribution": { "1": 1, "4": 1, "5": 11 },
"category_path": [
{ "name": "Electrocasnice mari", "url_key": "electrocasnice-mari-clima" },
{ "name": "Aparate frigorifice", "url_key": "aparate-frigorifice" },
{ "name": "Frigidere", "url_key": "frigidere" }
],
"resealed_offers": [
{
"resealed_code": "R2118587",
"price": 2399.2,
"new_price": 2999.0,
"discount_percent": 20.0,
"reasons": ["Se livrează în ambalaj compatibil", "Deformări minore ale panoului lateral stâng", "Deformări minore ale panoului lateral drept", "Zgârieturi minore pe suprafețe lucioase", "Ambalaj originial lipsă", "Probleme aspect produs"],
"in_stock": false,
"store": { "name": "Altex Bucuresti Vulcan", "city": "BUCURESTI SECTOR 5", "region": "Bucureşti" }
},
{
"resealed_code": "SM015898",
"price": 2699.1,
"discount_percent": 10.0,
"reasons": ["Ambalaj originial deteriorat"],
"in_stock": false,
"store": { "name": "Altex Arad Greenfield", "city": "ARAD", "region": "Arad" }
}
],
"services": [
{ "type": "extra_warranty", "name": "Garantie extinsa - 1 Ani", "price": 288.0 },
...
]
}
},
"meta": { "record_count": 1, "site": "altex", "charged_credits": 2, "cache_hit": false, "mode": "live" }
}Ce strică un scraper Altex: câmpuri cu nume înșelătoare și filtre care tac
Site-ul Altex e o aplicație care își ia datele dintr-un serviciu JSON propriu, iar câmpurile de acolo au nume care induc în eroare. `lowest_price` pare cel mai mic preț din ultimele 30 de zile, dar e prețul celei mai ieftine unități resigilate: la un iPhone, pagina scria «1 resigilat, de la 3.324,99 lei» și exact asta era valoarea. Un istoric de prețuri construit pe acest câmp amestecă produse noi cu produse resigilate. Nota are aceeași problemă: `reviews_value` este suma stelelor, nu media (482 la 102 recenzii, pe când pagina afișa 4,73).
Filtrele greșite nu dau eroare. Un brand inexistent (slug-ul «zzzz») sau o cheie de filtru inventată întorc toată lista, 1.128 de laptopuri, cu HTTP 200. Iar `min_price` trimis singur este ignorat complet, în timp ce `max_price` singur funcționează. Motorul verifică fiecare filtru în ecoul pe care îl trimite sursa și, când se dă doar un minim, trimite și un maxim.
Mai e și numărătoarea: la căutare, totalul se oprește la 720 («samsung» și «laptop» dau amândouă 720), iar stocul pe magazin nu trece niciodată de 6. Un script care împarte pe pagini după total sau adună stocul pe țară obține cifre plafonate fără să știe.
De Black Friday, când prețurile la frigidere se schimbă de la o zi la alta, un tabel construit pe aceste câmpuri arată perfect plauzibil: o «reducere» calculată față de un resigilat, o notă de 482 din 5 și un stoc de 6 bucăți care înseamnă de fapt «6 sau mai multe».
Limite și note oneste
- ReefAPI nu are nicio relație comercială cu Altex: magazinul nu a aprobat acest serviciu, nu îl sprijină și nu avem cu el vreun contract.
- În paginile pe care le citim, Altex nu publică cel mai mic preț din ultimele 30 de zile și nici un istoric. Pentru evoluția prețurilor, cereți aceleași SKU-uri la intervale regulate și păstrați voi răspunsurile, cu data lor.
- Căutarea după cuvânt aduce și ce nu e produsul căutat: la «frigider», primele 24 de rânduri includeau serviciul de schimbare a sensului ușilor (224,90 lei), un covor antivibrații și un termometru de la un vânzător marketplace. Pentru o listă curată folosiți `category: "frigidere"`.
- Totalul căutării se oprește la 720 (`total_capped`); la `category` totalul e exact.
- Cantitatea pe magazin e plafonată la 6 (`qty_capped: true` înseamnă 6 sau mai mult). Pentru frigiderul ARCTIC AD54240M40W, `availability` a listat 68 de magazine, deși numărătoarea sursei spunea 69.
- În fișa produsului, `stores_with_stock` a venit null, deși rândul de căutare al aceluiași frigider BEKO spunea 74 de magazine. Pentru stoc folosiți `availability`, nu `product`.
- Unitățile resigilate sunt listate și când nu se pot cumpăra în acel moment: ambele unități ale frigiderului BEKO aveau `in_stock: false`.
- Credite: 2 pentru `search`, `category`, `product`, `availability` și `stores`; 1 pentru `reviews`; 3 pentru `categories`.