API

Shopflix API για developers: προϊόντα, έμποροι και τιμές σε JSON

Στο Shopflix ένα προϊόν το πουλάνε συχνά πολλοί έμποροι ταυτόχρονα, και η τιμή που βλέπετε στην κάρτα είναι μόνο μία από αυτές. Εδώ παίρνετε και τις υπόλοιπες: για τη σκούπα ρομπότ Xiaomi S40 του παραδείγματος, 15 τιμές από 168,90 έως 236,40 €, και για όσους εμπόρους κατονομάζει η σελίδα, απόθεμα σε τεμάχια, χρόνο παράδοσης και αριθμό δόσεων. Ό,τι επιστρέφεται είναι αυτό που βλέπει ένας αγοραστής στο shopflix.gr τη στιγμή του αιτήματος. Δεν πρόκειται για το API που χρησιμοποιούν οι έμποροι του Shopflix για το κατάστημά τους: δεν ανεβάζει προϊόντα, δεν αλλάζει τιμές ή απόθεμα και δεν βλέπει παραγγελίες. Οι όροι αναζήτησης μπορούν να είναι ελληνικοί ή αγγλικοί, όμως με ελληνικούς όρους καλύπτετε πολύ μεγαλύτερο μέρος του καταλόγου· οι τόνοι δεν αλλάζουν το αποτέλεσμα (το «σκουπα ρομπότ» έφερε τα ίδια 339 προϊόντα με το «σκούπα ρομπότ»).

Endpoints

endpointΤι επιστρέφειΥποχρεωτικά
searchΑναζήτηση με λέξεις, με φίλτρα κατηγορίας, μάρκας, εμπόρου και εύρους τιμής σε ευρώ και έξι ταξινομήσεις: συνάφεια, φθηνότερα, ακριβότερα, δημοφιλέστερα, βαθμολογία, μεγαλύτερη έκπτωση. Κάθε γραμμή έχει το `sku`, τον τίτλο, την τιμή του Shopflix (`price_eur`), τη φθηνότερη και την ακριβότερη τιμή εμπόρου, πόσοι έμποροι έχουν το προϊόν, τον χρόνο παράδοσης («Άμεση Παράδοση», «Παράδοση 4-9 ημέρες»), τη διαδρομή κατηγορίας, βαθμολογία και πλήθος κριτικών. Έως 50 γραμμές ανά σελίδα.query
categoryΟι ίδιες γραμμές με το search για μια ολόκληρη κατηγορία, χωρίς λέξη-κλειδί. Δέχεται το αριθμητικό id ή έναν σύνδεσμο /c/<id>/… του shopflix.gr· οι «Σκούπες Ρομπότ», για παράδειγμα, είναι η `2125`.category_id
productΗ καρτέλα ενός προϊόντος με `sku` (π.χ. `SF-200103781`) ή URL: περιγραφή σε απλό κείμενο και, χωριστά, το αρχικό HTML της (`description_html`), μάρκα, κωδικός κατασκευαστή (`mpn`), βάρος αποστολής, εικόνες και κάθε τεχνικό χαρακτηριστικό ως ζεύγος ονόματος και τιμής μαζί με την ομάδα του («Τεχνικά Χαρακτηριστικά», «Διαστάσεις»).sku
offersΟι έμποροι ενός προϊόντος σε δύο λίστες. Το `offers[]` έχει όνομα και αξιολόγηση καταστήματος, τιμή, απόθεμα, ημέρες παράδοσης και μέγιστο αριθμό δόσεων, για έως 5 εμπόρους, όσους κατονομάζει το Shopflix. Το `merchant_prices[]` έχει την τιμή κάθε εμπόρου που πουλά το προϊόν. Ο πραγματικός αριθμός εμπόρων είναι στο `merchant_count`.sku
reviewsΚριτικές πελατών με βαθμολογία, ημερομηνία και ένδειξη επιβεβαιωμένης αγοράς, μαζί με την κατανομή αστεριών που δημοσιεύει το Shopflix. Φιλτράρονται κατά ελάχιστη βαθμολογία, μόνο επιβεβαιωμένες αγορές ή μόνο κριτικές με φωτογραφίες.sku
categoriesΧωρίς παράμετρο, όλο το δέντρο κατηγοριών του Shopflix με γονέα και επίπεδο (659 κόμβοι σε 3 επίπεδα στη μέτρηση της 6ης Οκτωβρίου 2026). Με `query`, αναζήτηση κατηγορίας με το όνομά της: το «σκούπες ρομπότ» δίνει την `2125`.όλα προαιρετικά
suggestΟι προτάσεις που εμφανίζει το πεδίο αναζήτησης του Shopflix για ένα πρόθεμα, με δείκτη δημοτικότητας. Για «σκουπ» ήρθαν «σκουπα στικ», «σκούπα», «σκουπα ηλεκτρική», «σκουπάκι» κ.ά. Χρήσιμο για να δείτε ποια διατύπωση έχει πράγματι προϊόντα πίσω της, πριν ξοδέψετε κλήση search.query

Κάθε κλήση χρεώνεται σε credits. Οι αποτυχημένες και μπλοκαρισμένες κλήσεις είναι δωρεάν.

Παράδειγμα που δουλεύει

Από τους 15 εμπόρους της Xiaomi S40 το Shopflix κατονομάζει τους 5 (`offers_named: 5`). Οι τιμές και των 15 βρίσκονται στο `merchant_prices[]`, από τη φθηνότερη προς την ακριβότερη, με κωδικό εμπόρου στη θέση του ονόματος. Ο έμπορος με `recommended: true` είναι ο ίδιος που δείχνει το `merchant_name` της γραμμής στο search, και στις 25 Οκτωβρίου 2026 ήταν και ο φθηνότερος. Το `shipping_lead_time_days` είναι το κάτω όριο του κειμένου παράδοσης: 0 για «Άμεση Παράδοση», 10 για «Παράδοση 10-30 ημέρες». Τα ονόματα καταστημάτων έχουν αντικατασταθεί με «...» σε αυτό το απόσπασμα.

Αίτημα
curl -X POST https://api.reefapi.com/shopflix/v1/offers \
  -H "x-api-key: ΤΟ_ΚΛΕΙΔΙ_ΣΑΣ" \
  -H "content-type: application/json" \
  -d '{"sku": "SF-200103781"}'
Απάντηση (συντομευμένη)
{
  "ok": true,
  "data": {
    "sku": "SF-200103781",
    "merchant_count": 15,
    "offers_named": 5,
    "price_min_eur": 168.9,
    "price_max_eur": 236.4,
    "offers": [
      {
        "merchant": "...",
        "merchant_reference": "MER19987",
        "merchant_rating_count": 0,
        "price_eur": 168.9,
        "currency": "EUR",
        "shipping_lead_time_days": 0,
        "in_stock": true,
        "stock_quantity": 2,
        "recommended": true,
        "max_instalments": 12
      },
      {
        "merchant": "...",
        "merchant_reference": "MER1609",
        "merchant_rating": 9.01,
        "merchant_rating_count": 2395,
        "price_eur": 170.0,
        "currency": "EUR",
        "shipping_lead_time_days": 2,
        "in_stock": true,
        "stock_quantity": 1,
        "recommended": false,
        "max_instalments": 12
      },
      ...
    ],
    "merchant_prices": [
      { "merchant_reference": "MER19987", "price_eur": 168.9, "shipping_lead_time": "Άμεση Παράδοση" },
      { "merchant_reference": "MER1609", "price_eur": 170.0, "shipping_lead_time": "Παράδοση 2-3 ημέρες" },
      ...
      { "merchant_reference": "MER169", "price_eur": 181.9, "shipping_lead_time": "Παράδοση 10-30 ημέρες" },
      ...
      { "merchant_reference": "MER814", "price_eur": 236.4, "shipping_lead_time": "Παράδοση 2-3 ημέρες" }
    ],
    "index_prices_stale": false
  },
  "meta": { "record_count": 5, "merchant_prices": 15, "cache_hit": false, "mode": "live" }
}

Scraping στο Shopflix: πού χάνονται οι αριθμοί

Η αναζήτηση του Shopflix κρατά κάθε προϊόν δύο φορές, μία για την ελληνική και μία για την αγγλική έκδοση του site. Χωρίς περιορισμό γλώσσας, ένα sku φέρνει δύο πανομοιότυπα αποτελέσματα και το «iphone» μετρούσε 1.432 προϊόντα αντί για 716 (μέτρηση 6ης Οκτωβρίου 2026). Εδώ κάθε ερώτημα περιορίζεται στον ελληνικό κατάλογο, οπότε το `total` μετρά κάθε προϊόν μία φορά.

Το ίδιο ποσό γράφεται σε δύο κλίμακες, ανάλογα με το σημείο του site: τα αποτελέσματα αναζήτησης δίνουν `1568`, η σελίδα του προϊόντος δίνει `156800`, και τα δύο σημαίνουν 1.568,00 €. Όποιος ενώνει τις δύο πηγές χωρίς μετατροπή συγκρίνει ευρώ με λεπτά. Στις απαντήσεις μας κάθε ποσό είναι σε ευρώ, στα πεδία που τελειώνουν σε `_eur`.

Η λίστα των εμπόρων στη σελίδα του προϊόντος δεν έχει δεύτερη σελίδα. Σε προϊόν με 14 εμπόρους, τέσσερις διαφορετικές παράμετροι σελιδοποίησης (`page=2`, `limit=50`, `offersPage=2`, `all=true`) επέστρεψαν τους ίδιους 5. Τις τιμές όλων τις έχει μόνο ο κατάλογος αναζήτησης, και εκεί χωρίς ονόματα καταστημάτων· γι' αυτό το `offers` δίνει και τις δύο λίστες χωριστά, αντί να τις ενώνει με εικασίες.

Η περιγραφή έρχεται από την πηγή ως HTML. Μέχρι τις 6 Οκτωβρίου 2026 το `description` την περνούσε αυτούσια, με τα `<div class="desc_shopflix">` μέσα στο κείμενο, χωρίς να το επισημαίνει κανένας έλεγχος. Από εκείνη την ημέρα το `description` είναι απλό κείμενο και το HTML βρίσκεται ακέραιο στο `description_html`: στη Xiaomi S40, 2.742 και 7.117 χαρακτήρες αντίστοιχα.

Σε καμία από τις τέσσερις περιπτώσεις δεν εμφανίζεται μήνυμα σφάλματος. Ο scraper συνεχίζει να γράφει αριθμούς στη βάση σας, και το λάθος φαίνεται μόνο όταν κάποιος τους συγκρίνει με τη σελίδα.

Όρια και ειλικρινείς σημειώσεις

  • Η ReefAPI δεν ανήκει στο Shopflix ούτε έχει υπογράψει μαζί του οποιαδήποτε συμφωνία, και οι κλήσεις αυτές δεν περνούν από κάποιο επίσημο API του Shopflix.
  • Αναζήτηση με barcode δεν γίνεται: η αναζήτηση του Shopflix καλύπτει τίτλο, sku, όνομα εμπόρου και τιμές χαρακτηριστικών. Ένα EAN επιστρέφει `ok: true` με 0 γραμμές, όχι σφάλμα. Στις 25 Οκτωβρίου 2026 το `6941812786604`, δηλαδή το `gtin13` της Xiaomi S20 από την ίδια λίστα αποτελεσμάτων, έφερε 0· στις 6 Οκτωβρίου, 10 EAN-13 προϊόντων που πουλά το ίδιο το Shopflix έφεραν 0 στα 10.
  • Το `gtin13` ανακτάται από τις εικόνες του ίδιου του προϊόντος και κρατιέται μόνο αν περάσει το ψηφίο ελέγχου του EAN-13· αλλιώς λείπει. Στις 6 Οκτωβρίου βρέθηκε σε 111 από 382 γραμμές (29%)· σε ένα προηγούμενο δείγμα 250 γραμμών, σε 21 από τις 25 στα LEGO, 15 από τις 25 στις τηλεοράσεις και 1 από τις 25 στα adidas. Στις 10 πρώτες σκούπες ρομπότ ταξινομημένες κατά δημοτικότητα υπήρχε σε μία. Χρησιμεύει για αντιστοίχιση με δικό σας κατάλογο EAN, όχι για αναζήτηση.
  • Όνομα, απόθεμα και δόσεις υπάρχουν μόνο για τους έως 5 εμπόρους του `offers[]`. Οι υπόλοιποι εμφανίζονται στο `merchant_prices[]` με κωδικό (`MER…`), τιμή και κείμενο παράδοσης.
  • Το `merchant_prices[]` είναι στιγμιότυπο του καταλόγου αναζήτησης και μπορεί να μένει πίσω από τη ζωντανή λίστα· τότε το `index_prices_stale` γίνεται true, και στο search το αντίστοιχο `price_band_stale`. Στις 6 Οκτωβρίου συνέβη σε 7 από 382 γραμμές. Η τιμή που ισχύει είναι το `price_eur`.
  • Το φίλτρο `merchant` κρατά τα προϊόντα στα οποία ο έμπορος είναι ο προτεινόμενος πωλητής, όχι όλα όσα πουλά. Για όλους τους πωλητές ενός προϊόντος χρησιμοποιήστε το `offers`.
  • Στο `product` το `review_count` ήρθε 0 και στα τρία προϊόντα που ελέγξαμε στις 25 Οκτωβρίου 2026, παρότι η βαθμολογία υπήρχε. Για τη Xiaomi S40 το search έδειξε 3 κριτικές και το `reviews` επέστρεψε 3 (μέσος όρος 4,67)· για τη Xiaomi S20 το search έδειξε 17. Το πλήθος κριτικών πάρτε το από το search ή το reviews.
  • Στα `specs` οι αριθμητικές τιμές έρχονται χωρίς μονάδα: «Απορρόφηση» `10000`, «Διάρκεια Μπαταρίας (Αυτονομία)» `180`, «Ύψος» `9.8`. Τη μονάδα τη βρίσκετε μόνο στην περιγραφή (στη Xiaomi S40: 10.000 Pa, έως 180 λεπτά).
  • Η σελιδοποίηση σταματά γύρω στις 1.000 γραμμές ανά ερώτημα: πέρα από αυτό η σελίδα έρχεται κενή, όσο μεγάλο κι αν είναι το `total`.
  • Ο αριθμός προϊόντων κάθε πρότασης στο `suggest` (`product_count_all_locales`) δεν αντιστοιχεί στο `total` του search: για «σκουπα ρομπότ» το suggest έδειξε 2.489, το search 339.
  • Το `shipping_fee_eur` δεν εμφανίστηκε σε καμία από τις 5 κατονομασμένες προσφορές της 25ης Οκτωβρίου, και το `merchant_rating` λείπει όταν το κατάστημα δεν έχει ακόμη αξιολογήσεις (`merchant_rating_count: 0`).