Okazii.ro API: produsele din piață, cu preț și vânzător, ca JSON
Pe Okazii vând deopotrivă magazine și persoane fizice, de la telefoane la timbre și monede de colecție. Interfața caută după cuvânt cheie în toată piața și întoarce pentru fiecare produs id-ul, titlul, adresa, prețul curent și imaginea; cu id-ul ceri apoi pagina completă: descriere, fotografii, câte bucăți mai are vânzătorul, starea, caracteristicile, calea de categorii și profilul public al vânzătorului (persoană fizică sau firmă, procentul de calificative pozitive, numărul lor). Pentru cine vinde pe Okazii nu ține locul contului de vânzător: nu listează produse, nu gestionează comenzi și nu se autentifică nicăieri; citește doar paginile publice ale pieței, aceleași pe care le deschide oricine caută ceva de cumpărat.
Endpointuri
| endpoint | Ce returnează | Obligatorii |
|---|---|---|
| search | Căutare după cuvânt cheie în toată piața (1–200 de caractere), pagină cu pagină (1–100). Pentru fiecare produs: `listing_id`, titlu, adresă, preț curent cu moneda și textul afișat, imagine. Răspunsul include totalul raportat de site și ultima pagină disponibilă. | query |
| detail | Pagina produsului după `listing_id` din căutare: titlu, preț (plus prețul din datele sursei și semnalul `price_mismatch`), descriere, fotografii, vânzător, marcă, caracteristici, stoc, disponibilitate, stare, tipul vânzării și calea de categorii. | listing_id |
Fiecare apel se taxează în credite. Apelurile eșuate și blocate sunt gratuite.
Exemplu funcțional
Pentru „timbre romania” site-ul raportează 47 847 de produse, dar paginarea se oprește la pagina 100 (`last_page`); dacă paginile rămân de câte 36 de produse, cât au avut acum, ajungi la cel mult 3 600. Pagina a doua a adus alte 36 de produse, fără niciun id repetat. Prețurile de pe prima pagină au mers de la 3 la 540,30 lei. Câmpul `display` („3 , 00 Lei”) e textul de pe site, cu spațiile lui; pentru calcule folosește `amount` și `currency`.
curl -X POST https://api.reefapi.com/okazii/v1/search \
-H "x-api-key: CHEIA_TA" \
-H "content-type: application/json" \
-d '{"query": "timbre romania"}'{
"ok": true,
"data": {
"query": "timbre romania",
"page": 1,
"total": 47847,
"last_page": 100,
"has_more": true,
"listings": [
{
"listing_id": "213298801",
"title": "Timbre Romania, taxa de plata, diferite, stamp.si nestamp. PRET/BUCATA",
"url": "https://www.okazii.ro/timbre-romania-taxa-de-plata-diferite-stamp-si-nestamp-pret-bucata-a213298801",
"price": { "amount": 3, "currency": "RON", "display": "3 , 00 Lei" },
"image": "https://images.okr.ro/serve/product/475d36d5714c7741cf3cd0d77bf984c6-1095892-160_160"
},
...
{
"listing_id": "229970221",
"title": "ROMANIA 1947 - 1 MAI, ZIUA MUNCII, MNH - LP 217",
"url": "https://www.okazii.ro/romania-1947-1-mai-ziua-muncii-mnh-lp-217-a229970221",
"price": { "amount": 10, "currency": "RON", "display": "10 , 00 Lei" },
"image": "https://images.okr.ro/serve/product/fdeef415f47eca878ddd747c70fc2f86-1349693-160_160"
},
...
]
}
}Okazii scraper: trei capcane verificate pe site
Căutarea de pe site nu rămâne întotdeauna căutare. Adresa /cautare/iphone.html te mută direct în categoria iPhone, unde la verificarea noastră erau 130 de oferte, în timp ce varianta fără redirecționare (linkul cu `noredirect=1`, publicat chiar de Okazii) întorcea 61 042. Un scraper care urmează redirecționarea crede că a văzut tot și pierde aproape toate rezultatele; noi folosim căutarea fără redirecționare.
Prețul din datele ascunse ale paginii nu e întotdeauna cel afișat. La un telefon (219844423) pagina arăta 120 de lei, cu prețul vechi de 200 de lei tăiat, iar variabila internă `okazii_vars.pret` avea aproximativ 22,45, în euro. Răspunsul ia prețul vizibil în lei și semnalează separat, prin `price_mismatch`, când datele produsului spun altceva.
Un anunț șters sau expirat poate veni cu HTTP 200 și textul „Produsul nu mai exista la aceasta adresa.”. Cine se uită doar la codul de stare salvează o pagină goală drept produs; aici primești NOT_FOUND.
Pentru un colecționar care urmărește câteva loturi, toate astea se văd cu ochiul liber. Într-un export zilnic de prețuri însă, o căutare redirecționată, un preț în altă monedă și un produs dispărut arată exact ca niște rânduri valide.
Limite și note oneste
- Okazii nu e implicat în acest serviciu: datele vin din paginile publice, fără vreun API oficial și fără vreun contract cu Okazii.
- Atât căutarea, cât și detaliul costă 3 credite pe apel. Căutarea dă doar cinci câmpuri pe produs; vânzătorul, stocul, starea și caracteristicile cer câte un apel `detail` pentru fiecare produs.
- Fără filtre, sortare sau navigare pe categorii: căutarea primește doar cuvântul și pagina. Numărul de produse pe pagină variază, iar parcurgerea completă a unui rezultat mare nu e promisă (`last_page` 100 la un total de 47 847).
- Licitațiile nu sunt interpretate: nu returnăm oferta curentă sau istoricul ofertelor. Tipul vânzării vine exact cum îl scrie site-ul (`sale_type`, de exemplu „instant-carusel”).
- `condition` e valoarea schema.org declarată în pagină, nu o evaluare a noastră. La timbrul din exemplu, caracteristica „Stare” era „Stampilat”, descrierea spunea „Stare buna”, iar `condition` venea `https://schema.org/NewCondition`.
- Prețul tăiat, cel de dinainte de reducere, nu e returnat; `price` e prețul curent afișat.
- Titlul din căutare poate diferi de cel din detaliu: căutarea arată titlul optimizat de site, detaliul pe cel scris de vânzător. Le dăm pe amândouă neschimbate.
- GTIN nu apărea în niciunul dintre produsele verificate (`gtin: null`), iar marca poate fi „Nespecificat”. Profilul vânzătorului e cel public, și la persoane fizice; date de contact nu returnăm.