Skip to content

Changelog

Changelog

Επιλεγμένα highlights των τελευταίων εκδόσεων. Για τις πλήρεις εκδόσεις του API και την πολιτική διασπαστικών αλλαγών (Breaking-Change-Policy), ανατρέξτε στο Έκδοση API & Πολιτική LTS.

Λεπτομερείς αλλαγές σε μεμονωμένα endpoints: Προδιαγραφή OpenAPI και διαδραστική αναφορά API.


2026-10 · Χρώματα στο Dashboard

  • Νέο: η σελίδα λεπτομερειών ενός κώδικα έχει την κάρτα Χρώματα: προσκήνιο και φόντο ως δεκαεξαδική τιμή, διαφανές φόντο, προεπισκόπηση μέσω της πραγματικής διαδρομής εικόνας. Ο έλεγχος είναι ο ίδιος με το PATCH /v1/codes/{id}: τα κρίσιμα ζεύγη χρειάζονται επιβεβαίωση, ζεύγη κάτω από 1,5:1 δεν αποθηκεύονται.
  • Η επαναφορά σε μαύρο πάνω σε λευκό επιστρέφει ξανά και στις τέσσερις μορφές τα ίδια bytes όπως χωρίς χρώματα. Οι κώδικες χωρίς χρώματα δεν αλλάζουν.
  • Οι διαφανείς κώδικες εμφανίζονται πάνω σε σκακιέρα σε όλες τις προεπισκοπήσεις του Dashboard. Λεπτομέρειες: Χρώματα στο Dashboard.

2026-10 · Χρώματα σε PDF και EPS

  • Νέο: Τα qr.pdf και qr.eps σχεδιάζουν τα fg και bg, ως παραμέτρους και ως αποθηκευμένα χρώματα. Το μαύρο και κάθε γκρι εγγράφονται ως διαβάθμιση του γκρι (μόνο κανάλι μαύρου), κάθε άλλο χρώμα ως CMYK σε ακέραια ποσοστά, για παράδειγμα το 1F4E79 ως C74 M36 Y0 K53.
  • Φόντο όπως στο SVG: Μόλις επιλεγεί ένα χρώμα, υπάρχει μια αδιαφανής επιφάνεια πίσω από τον κώδικα και τη ζώνη ασφαλείας του, λευκή ή bg. Το bg=transparent δεν σχεδιάζει καμία. Ο τίτλος παραμένει μαύρος, η πλάκα του λογοτύπου λευκή.
  • Καμία αλλαγή χωρίς χρώματα: Χωρίς fg/bg και χωρίς αποθηκευμένα χρώματα, και οι δύο μορφές αρχείων παρέχουν τα ίδια bytes όπως και πριν. Το PDF ενός διαβατηρίου προϊόντος παραμένει χωρίς χρώμα.
  • Περιορισμοί: χωρίς προφίλ ICC, χωρίς PDF/X. Λεπτομέρειες: Χρώματα στην εκτύπωση.

2026-09 · Στατικοί κώδικες χωρίς προσωρινή μνήμη ανακατεύθυνσης, ταυτόχρονη διαγραφή

  • Τροποποιήθηκε: Οι στατικοί κώδικες δεν βρίσκονται πλέον στην προσωρινή μνήμη ανακατεύθυνσης. Μια κλήση του σύντομου συνδέσμου τους (redirect_url) διαβάζει πάντα την τρέχουσα κατάσταση. Μετά από DELETE /v1/account, ένας στατικός κώδικας επομένως δεν ανακατευθύνει πλέον κατά την επόμενη κλήση, ενώ προηγουμένως αυτό ίσχυε για έως και 24 ώρες. Επίσης, μια αλλαγή προγράμματος εφαρμόζεται αμέσως στους στατικούς κώδικες. Η διαγραφή λογαριασμού εκκαθαρίζει τους δυναμικούς κώδικες όπως και πριν. Οι εκτυπωμένοι στατικοί κώδικες περιέχουν τον προορισμό τους απευθείας και δεν επηρεάζονται.
  • Διορθώθηκε: Δύο ταυτόχρονες κλήσεις DELETE /v1/codes/:id στον ίδιο κώδικα επιστρέφουν μία φορά 200 και μία φορά 404. Το webhook qr.deleted αποστέλλεται ακριβώς μία φορά, ενώ προηγουμένως αποστελλόταν δύο φορές.
  • Νέο: Οι κλήσεις POST και DELETE /v1/codes/:id/logo απαντούν με 409 (errors/conflict) εάν ένα άλλο αίτημα άλλαξε ταυτόχρονα το λογότυπο του ίδιου κώδικα, και σε αυτή την περίπτωση δεν αλλάζουν τίποτα. Προηγουμένως, ένα μεταφορτωμένο λογότυπο θα μπορούσε να παραμείνει αποθηκευμένο χωρίς να χρησιμοποιείται. Δύο ταυτόχρονες κλήσεις DELETE /v1/codes/:id/logo επιστρέφουν και οι δύο 200. Λεπτομέρειες: Λογότυπο.

2026-09 · TypeScript-SDK 1.2.0

  • Νέο στο @qr3/sdk 1.2.0: Η client.codes.update() δέχεται το appearance και επιστρέφει τα ευρήματα του ελέγχου αντίθεσης ως issues στο αποτέλεσμα· χωρίς ευρήματα, το πεδίο λείπει. Η client.codes.imageUrl() δέχεται τα fg, bg και ecc. Κάθε κώδικας που επιστρέφει το API (get, list, create, update, batchCreate) περιέχει τα title και appearance.
  • Ενημέρωση: npm install @qr3/sdk@latest. Ακολουθούν οι Python, Go και PHP. Λεπτομέρειες: SDKs & CLI και Αποθήκευση χρωμάτων στον κώδικα.

2026-09 · Ο τροποποιημένος χρόνος λήξης ισχύει εντός περίπου ενός λεπτού

  • Διορθώθηκε: Ένα PATCH στο expires_at εκκαθαρίζει πλέον την προσωρινή μνήμη ανακατεύθυνσης του κώδικα. Έτσι, ο νέος χρόνος λήξης ισχύει εντός περίπου ενός λεπτού αντί για έως και 24 ώρες αργότερα. Προηγουμένως, μια κατάργηση ή μετάθεση της λήξης συνέχιζε να επιστρέφει 410 για έως και 24 ώρες, και μια λήξη που οριζόταν για τώρα επέτρεπε στην ανακατεύθυνση να συνεχίσει να λειτουργεί για έως και 24 ώρες.
  • Διορθώθηκε: Ένας κώδικας που δημιουργείται με expires_at λήγει επίσης στην ώρα του, ακόμη και αν η λήξη είναι εντός των πρώτων 24 ωρών.
  • Διορθώθηκε: Εάν ένας κώδικας διαγραφεί ενώ το λογότυπό του μεταφορτώνεται ή αφαιρείται, τα POST και DELETE /v1/codes/:id/logo απαντούν με 404 και δεν τροποποιούν τον διαγραμμένο κώδικα, όπως ακριβώς συμβαίνει ήδη με το PATCH.
  • Διορθώθηκε: Ακόμη και ένας στατικός κώδικας του οποίου ο σύντομος σύνδεσμος (redirect_url) έχει κληθεί, βρίσκεται στην προσωρινή μνήμη ανακατεύθυνσης. Η τροποποίηση, η παύση και η διαγραφή τον εκκαθαρίζουν πλέον επίσης, όχι μόνο στους δυναμικούς κώδικες.

2026-09 · Αποθήκευση χρωμάτων στον κώδικα

  • Νέο: Το PATCH /v1/codes/:id δέχεται το appearance με foreground_color και background_color (#RRGGBB, το φόντο επίσης transparent). Τα qr.svg και qr.png σχεδιάζουν τα αποθηκευμένα χρώματα χωρίς καμία παράμετρο· μια παράμετρος ερωτήματος όπως η ?fg=000000 εξακολουθεί να έχει προτεραιότητα. Τα PDF και EPS θα σχεδιάζουν χρώματα μόνο σε μεταγενέστερη έκδοση.
  • Έλεγχος αντίθεσης: Ένα ζεύγος κάτω από 1,5:1 επιστρέφει 422. Τα πιο αδύναμα ζεύγη αποθηκεύονται και αναφέρονται στο meta.issues ως warning ή critical· ένα διαφανές υπόβαθρο είναι πάντα critical, ποτέ δεν αποκλείεται.
  • Συγχώνευση: Τα πεδία που παραλείπονται διατηρούν την αποθηκευμένη τους τιμή, το null κάνει επαναφορά. Οι ταυτόχρονες αλλαγές στον ίδιο κώδικα δεν αντικαθιστούν πλέον η μία την άλλη.
  • Σε κάθε απάντηση κώδικα: Το appearance περιλαμβάνεται σε κάθε απάντηση κώδικα και στα webhooks qr.created και qr.updated. Το POST, το batch και η εισαγωγή το απορρίπτουν με 422.
  • Καμία αλλαγή για υπάρχοντες κώδικες: Χωρίς αποθηκευμένα χρώματα, κάθε κώδικας επιστρέφει τα ίδια bytes όπως και πριν. Λεπτομέρειες: Αποθήκευση χρωμάτων στον κώδικα.

2026-09 · Χρώματα και διόρθωση σφαλμάτων ως παράμετροι των διαδρομών εικόνας

  • Νέο: Και οι τέσσερις διαδρομές εικόνας δέχονται fg (χρώμα προσκηνίου), bg (χρώμα φόντου ή transparent) και ecc (διόρθωση σφαλμάτων L, M, Q, H). Τα SVG και PNG σχεδιάζουν τα χρώματα· τα PDF και EPS τα δέχονται, αλλά θα τα σχεδιάζουν σε μεταγενέστερη έκδοση. Το ecc λειτουργεί και στα τέσσερα φορμάτ, ενώ ένα λογότυπο εξακολουθεί να επιβάλλει το H.
  • Διαφανές: Το bg=transparent παρέχει ένα SVG χωρίς φόντο και ένα PNG με πραγματικό κανάλι άλφα. Το υπόβαθρο πρέπει να είναι ανοιχτόχρωμο και να αφήνει ελεύθερη τη ζώνη ησυχίας.
  • Ποτέ σφάλμα: Οι μη έγκυρες τιμές αγνοούνται· η εικόνα εμφανίζεται ακριβώς όπως και χωρίς παραμέτρους.
  • Προσωρινή αποθήκευση: Κάθε ενεργή παράμετρος παρέχει Cache-Control: public, max-age=300 αντί για τις 24 ώρες της προεπιλεγμένης εικόνας.
  • Καμία αλλαγή στη συμπεριφορά χωρίς παραμέτρους: Κάθε υφιστάμενος κώδικας παρέχει τα ίδια ακριβώς byte όπως και πριν, και στα τέσσερα φορμάτ.
  • Διαθέσιμο σε κάθε πρόγραμμα. Λεπτομέρειες: Χρώματα και διόρθωση σφαλμάτων.

2026-09 · Το PDF και το EPS ενσωματώνουν πλέον επίσης το λογότυπο

  • Επέκταση: Τα qr.pdf και qr.eps ενσωματώνουν πλέον ένα ορισμένο λογότυπο με τον ίδιο ακριβώς τρόπο όπως τα qr.svg και qr.png (δείτε παρακάτω) — ως ενσωματωμένη εικόνα (PDF μέσω ενός Image XObject, EPS μέσω ενός λεξικού εικόνας στο PostScript, εκεί μόνο με %%LanguageLevel: 3), κεντραρισμένη στην ίδια επιφάνεια, με την ίδια αύξηση της διόρθωσης σφαλμάτων σε H. Και οι δύο μορφές αρχείων δεν παρείχαν καθόλου το λογότυπο μέχρι τώρα· αυτό έχει πλέον διορθωθεί.
  • Προσωρινή αποθήκευση: Με ορισμένο λογότυπο, τα qr.pdf και qr.eps παρέχουν πλέον επίσης Cache-Control: public, max-age=300 αντί για τις συνήθεις 24 ώρες — ακριβώς όπως τα SVG/PNG.
  • Εφεδρική λειτουργία: Αν η ίδια η εικόνα του λογοτύπου δεν μπορεί να υποστεί επεξεργασία (για παράδειγμα, ένα κατεστραμμένο αποθηκευμένο αντικείμενο), η διόρθωση σφαλμάτων παραμένει στο H, αλλά η δεσμευμένη περιοχή παραμένει κενή αντί για εικόνα — ποτέ δεν προκύπτει σφάλμα διακομιστή.
  • Καμία αλλαγή συμπεριφοράς χωρίς λογότυπο: Οι κώδικες χωρίς λογότυπο συνεχίζουν να παρέχουν τα qr.pdf/qr.eps πανομοιότυπα σε επίπεδο byte, με αμετάβλητη προσωρινή μνήμη 24 ωρών.
  • Λεπτομέρειες και οδηγίες εκτύπωσης: Λογότυπο στον κώδικα QR.

2026-09 · Λογότυπο στον κώδικα QR — Dashboard και API

  • Νέο: Ένας κώδικας μπορεί πλέον να φέρει ένα λογότυπο στο κέντρο. Στο Dashboard, η σελίδα λεπτομερειών ενός κώδικα δημιουργεί μια δική της κάρτα λογοτύπου: Επιλογή λογοτύπου, κατά την πρώτη προσθήκη ή κατά την αφαίρεση επιβεβαιώστε μια προειδοποίηση με υποχρεωτικό πλαίσιο επιλογής (και τα δύο αλλάζουν το μοτίβο κουκκίδων), στη συνέχεια Μεταφόρτωση λογοτύπου/Αφαίρεση λογοτύπου. Μια Αντικατάσταση δεν απαιτεί επιβεβαίωση — αλλάζει μόνο η εικόνα, όχι το μοτίβο. Ο ρόλος viewer βλέπει την κατάσταση και την προεπισκόπηση, αλλά καμία από τις τρεις ενέργειες.
  • API: POST /v1/codes/{id}/logo (πεδίο multipart file· PNG, JPEG ή WebP, το πολύ 1 MB, το SVG απορρίπτεται) δημιουργεί ένα λογότυπο ή το αντικαθιστά· DELETE /v1/codes/{id}/logo το αφαιρεί ξανά και είναι idempotent. Μια πολύ μεγάλη εικόνα επιστρέφει 413, μια μη υποστηριζόμενη μορφή 422, ο ρόλος viewer 403.
  • Εμφάνιση: Τα qr.svg και qr.png ενσωματώνουν το λογότυπο ως πραγματικά pixel (512 × 512, κανονικοποιημένο) και αυξάνουν για τον σκοπό αυτό τη διόρθωση σφαλμάτων σε H. Η προσθήκη και η αφαίρεση αλλάζουν έτσι το μοτίβο κουκκίδων (M ↔ H), ενώ η αντικατάσταση όχι. Τα qr.pdf και qr.eps δεν ενσωματώνουν λογότυπο και παραμένουν αμετάβλητα. Ένας ήδη εκτυπωμένος κώδικας συνεχίζει να λειτουργεί σε κάθε περίπτωση, επειδή ο κωδικοποιημένος προορισμός δεν εξαρτάται από το λογότυπο — εκ νέου εκτύπωση χρειάζεται μόνο όποιος θέλει να δει τη (νέα) εμφάνιση του λογοτύπου και πάνω στο υλικό, χωρίς να αναμιγνύει παλιά και νέα αρχεία εκτύπωσης.
  • Προσωρινή αποθήκευση: Με ορισμένο λογότυπο, τα qr.svg και qr.png παρέχουν Cache-Control: public, max-age=300 αντί για τις συνήθεις 24 ώρες. Λεπτομέρειες, όρια και οδηγίες εκτύπωσης: Λογότυπο στον κώδικα QR.

2026-08 · operationId για όλες τις 75 λειτουργίες, και ένας οδηγός «πότε να χρησιμοποιήσετε» για πράκτορες

  • Προσθήκη: Όλες οι 75 λειτουργίες των προδιαγραφών OpenAPI φέρουν πλέον μια operationId — listCodes, createCode, getCodeStats, archiveWorkspace και ούτω καθεξής. Μέχρι τώρα, αυτό το πεδίο έλειπε εντελώς, με αποτέλεσμα κάθε γεννήτρια να πρέπει να παράγει το όνομα της μεθόδου από τη μέθοδο HTTP και τη διαδρομή (postV1Codes). Τέτοια ονόματα εξαρτώνται από τη διαδρομή και αλλάζουν με κάθε αναδόμηση της διαδρομής. Η μορφή του ονόματος είναι ίδια και στα 75 σημεία: list/get/create/update/replace/delete, διαφορετικά το ρήμα της επιχειρηματικής ενέργειας (validateDpp, registerGs1Identifier, pingWebhook). Το ρήμα ακολουθεί την επιχειρηματική λογική, όχι τη μέθοδο HTTP — το archiveWorkspace είναι ένα DELETE, το importDpps ένα POST.
  • Επίπτωση σε αυτόματα δημιουργημένους clients: Όσοι δημιουργούν το δικό τους SDK από τις προδιαγραφές, θα λάβουν μετονομασμένες μεθόδους (postV1Codes → createCode) στην επόμενη εκτέλεση. Αυτός είναι ο σκοπός της αλλαγής, αλλά πρόκειται για μετονομασία σε ξένο κώδικα — γι’ αυτό και αναφέρεται ρητά εδώ. Οι διαδρομές, οι παράμετροι, οι μορφές απόκρισης και οι κωδικοί κατάστασης παραμένουν αμετάβλητοι· τα επίσημα SDKs, το CLI και ο MCP-server δεν επηρεάζονται.
  • Είσοδος πρακτόρων: Το https://qr3.app/llms.txt έχει μια ενότητα ## When to use qr3.app — έξι εργασίες αντί για έξι λειτουργίες, συν την πρόταση για το τι δεν αποτελεί το qr3.app το κατάλληλο εργαλείο. Την ίδια πληροφορία παρέχει τώρα ο MCP-server κατά τη χειραψία: το initialize προς το https://mcp.qr3.app/mcp απαντά με ένα πεδίο instructions (προηγουμένως: έντεκα εργαλεία χωρίς καμία κατηγοριοποίηση). Περιλαμβάνεται επίσης ποιες κλήσεις απαιτούν κλειδί API — το initialize και το tools/list όχι, κάθε tools/call ναι.
  • Διορθώσεις στο llms.txt: Τέσσερα στοιχεία ελέγχθηκαν έναντι του περιβάλλοντος παραγωγής και δεν ίσχυαν: (1) το Python SDK qr3app δεν έχει δημοσιευτεί στο PyPI — η γραμμή pip install αφαιρέθηκε χωρίς αντικατάσταση· (2) το Accept: text/markdown ισχύει για την αρχική σελίδα και το ιστολόγιο, όχι για κάθε σελίδα που αποδίδεται από την πλευρά του διακομιστή· (3) η διεύθυνση επικοινωνίας είναι [email protected], επίσης στο JSON-LD της αρχικής σελίδας· (4) το /de/security/ είναι μια ανακατεύθυνση σε μια άγκυρα, όχι ξεχωριστή σελίδα. Νέος σύνδεσμος: docs.qr3.app/de/skills/.
  • Διασφάλιση: Τρεις διαβεβαιώσεις στο openapi-spec.test.ts — πληρότητα, μοναδικότητα, lowerCamelCase —, καθεμία ελεγμένη με μια μετάλλαξη. Εννέα επιπλέον δοκιμές διασφαλίζουν τα τέσσερα διορθωμένα στοιχεία, ώστε να μην επανέλθουν.
  • Γνωστός περιορισμός: Δύο από τις 75 λειτουργίες περιγράφονται στις προδιαγραφές, αλλά απαντούν με 404 (GET /v1/codes/{id}/stats και GET /v1/account). Έλαβαν ένα όνομα εδώ και θα το χάσουν ξανά μόλις αποφασιστεί αν θα υλοποιηθούν ή αν θα καταργηθούν.

2026-08 · Οι υποβαθμίσεις προγραμμάτων και οι ακυρώσεις επηρεάζουν πλέον και τα όρια

  • Διόρθωση: Το Stripe webhook κατά την αλλαγή προγράμματος και την ακύρωση κατέγραφε μόνο το όνομα του προγράμματος, και όχι τις τέσσερις στήλες ορίων του οργανισμού (max_workspaces, max_members, max_dynamic_codes, max_scans_per_month). Καθώς η επιβολή λαμβάνει το μέγιστο μεταξύ της αποθηκευμένης τιμής και της βασικής γραμμής (baseline) του προγράμματος, ένας οργανισμός που είχε υποβαθμιστεί ή ακυρωθεί διατηρούσε τα παλιά, υψηλότερα όριά του — η υποβάθμιση δεν είχε κανένα αποτέλεσμα. Το webhook ορίζει πλέον αυτές τις στήλες στη βασική γραμμή (baseline) του νέου προγράμματος κατά τη διάρκεια κάθε πραγματικής αλλαγής προγράμματος, και στη βασική γραμμή του δωρεάν προγράμματος (Free baseline) σε περίπτωση ακύρωσης — ακριβώς όπως κάνει ήδη η διαχείριση διαχειριστή.
  • Συμπεριφορά: Οι ενημερώσεις ρουτίνας της συνδρομής (ανανέωση, μέθοδος πληρωμής, αναλογική χρέωση) συνεχίζουν να μην επηρεάζουν τα όρια. Τα υψηλότερα όρια που έχουν παραχωρηθεί μεμονωμένα παραμένουν αμετάβλητα. Μόνο μια πραγματική αλλαγή προγράμματος τα επαναφέρει στη βασική γραμμή (baseline) του νέου προγράμματος.
  • Αντίκτυπος: Καμία αλλαγή στο API ή στη μορφή απάντησης. Οι οργανισμοί των οποίων η υποβάθμιση πραγματοποιήθηκε πριν από αυτή τη διόρθωση διατηρούν τις παλιές τιμές, μέχρι να εφαρμοστεί η επόμενη αλλαγή προγράμματος ή να τις προσαρμόσει η υποστήριξη.

2026-08 · Keyset cursor πλέον σε όλα τα endpoints λιστών

  • Διόρθωση: Η διόρθωση του κέρσορα για τα GET /v1/codes και GET /v1/dpp (δείτε παρακάτω) έχει πλέον επεκταθεί σε όλες τις υπόλοιπες λίστες με σελιδοποίηση κέρσορα: GET /v1/qr-codes/:id/comments, /v1/workspaces, /v1/gs1/identifiers, /v1/members, /v1/audit-logs, /v1/admin/orgs, /v1/admin/users και /v1/webhooks/:id/deliveries. Όλες έκαναν σελιδοποίηση αποκλειστικά μέσω του created_at· σειρές με πανομοιότυπη χρονική σήμανση (καταγραφές ελέγχου μιας batch λειτουργίας, webhook retries, εισαγωγές μελών) θα μπορούσαν να χαθούν στην επόμενη σελίδα. Το κλειδί ταξινόμησης είναι πλέον παντού η πλειάδα (created_at, id).
  • Αλλαγή API: Σε αυτές τις λίστες, το meta.pagination.next_cursor είναι πλέον επίσης μια αδιαφανής τιμή (base64url) αντί για μια απλή χρονική σήμανση· μη αναγνώσιμοι κέρσορες επιστρέφουν 400, ενώ παλιοί κέρσορες χρονικής σήμανσης θα συνεχίσουν να γίνονται δεκτοί μεταβατικά. Εξαίρεση το GET /v1/webhooks/:id/deliveries: εκεί το next_cursor παραμένει το ID της τελευταίας παράδοσης (άγνωστο ID → πρώτη σελίδα). Οι clients που επιστρέφουν αμετάβλητο το next_cursor — Dashboard, CLI, SDKs, MCP — δεν χρειάζεται να αλλάξουν τίποτα.
  • Αντίκτυπος: Δεν απαιτείται μετανάστευση. Αν κάποιος παρατήρησε ότι έλειπαν εγγραφές κατά τη σελιδοποίηση σε μία από αυτές τις λίστες (π.χ. στο audit log ή στο log παραδόσεων στο Dashboard): Δεν είχαν χαθεί ποτέ — οι λίστες τις εμφανίζουν πλέον πλήρως.

2026-08 · Χρονικές σημάνσεις μετά από επεξεργασία και διαγραφή ξανά συμβατές με το OpenAPI

  • Διόρθωση: Μετά το PATCH /v1/codes/{id}, το updated_at επέστρεφε σε μορφή SQLite χωρίς ζώνη ώρας (2026-08-17 09:00:00), αν και η προδιαγραφή OpenAPI υπόσχεται format: date-time και η δημιουργία (POST) παρέχει τη χρονική σήμανση ISO (2026-08-17T09:00:00.000Z). Το ίδιο ίσχυε για τα deleted_at/updated_at κατά το soft-delete, καθώς και για τις διαδρομές επεξεργασίας/διαγραφής των API-Keys, οργανισμών, Workspaces, μελών, σχολίων και webhooks, επιπλέον για το last_used_at των API-Keys και το last_triggered_at των webhooks. Όλες οι διαδρομές εγγραφής καταγράφουν πλέον σε μορφή ISO 8601 (UTC, T και Z).
  • Αντίκτυπος: Οι clients που κάνουν parse το updated_at με new Date(...) (SDKs, CLI, Dashboard), διάβαζαν τη μορφή με το κενό διάστημα ως τοπική ώρα — το CLI εμφάνιζε την ώρα μετατοπισμένη κατά την τοπική διαφορά (offset) για κώδικες που είχαν υποστεί επεξεργασία μία φορά (Βιέννη: −2 ώρες). Αυτό διορθώθηκε. Επιπλέον, μια μετανάστευση δεδομένων (data migration) κανονικοποιεί τις ήδη αποθηκευμένες τιμές στην παλιά μορφή σε ISO, ώστε η ταξινόμηση και οι συγκρίσεις σε μεικτά δεδομένα να είναι σωστές. Καμία αλλαγή στα ονόματα των πεδίων ή στη δομή της απόκρισης.
  • Υπόβαθρο: Ίδια κατηγορία σφάλματος με τις δύο διορθώσεις παρακάτω (λήξη API-Key, όριο επανασάρωσης): το datetime('now') της SQLite γράφει YYYY-MM-DD HH:MM:SS, ενώ όλοι οι άλλοι εγγραφείς γράφουν ISO 8601. Μια δοκιμή προστασίας πηγαίου κώδικα (source code guard test) θα αποτρέψει μελλοντικές εμφανίσεις.

2026-08 · Η σελιδοποίηση λίστας δεν χάνει πλέον κωδικούς batch

  • Διόρθωση: Τα GET /v1/codes και GET /v1/dpp πραγματοποιούσαν σελιδοποίηση αποκλειστικά μέσω του created_at. Ωστόσο, οι κωδικοί από τα POST /v1/codes/batch, POST /v1/dpp/batch και την εισαγωγή CSV/XLSX μοιράζονται μία κοινή χρονική σήμανση — μόλις ένα batch ήταν μεγαλύτερο από το limit (προεπιλογή 20), η δεύτερη σελίδα δεν επέστρεφε πλέον τις υπόλοιπες γραμμές της ίδιας χρονικής σήμανσης. Οι κωδικοί υπήρχαν και ήταν προσβάσιμοι μέσω του GET /v1/codes/:id, αλλά δεν εμφανίζονταν ποτέ στη λίστα (Dashboard, CLI qr3 list, SDKs, MCP). Ο κέρσορας είναι πλέον ένα keyset μέσω του (created_at, id).
  • Αλλαγή API: Το meta.pagination.next_cursor είναι πλέον μια αδιαφανής τιμή (base64url) αντί για μια απλή χρονική σήμανση. Όσοι επιστρέφουν τον κέρσορα αμετάβλητο ως ?cursor= — όπως ακριβώς κάνουν το Dashboard, το CLI, όλα τα SDKs και ο MCP-server — δεν χρειάζεται να αλλάξουν τίποτα. Οι παλιοί κέρσορες χρονικής σήμανσης θα συνεχίσουν να γίνονται δεκτοί μεταβατικά· οι μη αναγνώσιμοι κέρσορες επιστρέφουν πλέον 400 αντί να επιστρέφουν σιωπηρά την πρώτη σελίδα.
  • Αντίκτυπος: Αν μετά από μια εισαγωγή batch βλέπατε στη λίστα λιγότερους κωδικούς από όσους είχαν δημιουργηθεί: Οι κωδικοί δεν είχαν χαθεί ποτέ — η λίστα τους εμφανίζει πλέον πλήρως. Δεν απαιτείται μετανάστευση.

2026-08 · Οι επανασαρώσεις ασφαλείας εκτελούνται ξανά σε 24ωρη βάση

  • Διόρθωση: Η περιοδική επανασάρωση των URL προορισμού και των συνδέσμων της σελίδας προορισμού (Google Web Risk) παρέλειπε κώδικες των οποίων η τελευταία σάρωση έγινε την ίδια ημερολογιακή ημέρα με το όριο (cutoff) των 24 ωρών — ανάλογα με την ώρα, η επανασάρωση καθυστερούσε έως και μία επιπλέον ημέρα. Το όριο (cutoff) υπολογίζεται πλέον στην ίδια μορφή ISO στην οποία αποθηκεύονται οι χρονικές σημάνσεις (timestamps) σάρωσης.
  • Αντίκτυπος: Ένα URL προορισμού που χαρακτηρίζεται ως μη ασφαλές μετά την τελευταία σάρωση, οδηγεί ξανά στην αυτόματη παύση του κώδικα εντός του τεκμηριωμένου παραθύρου 24 ωρών. Καμία αλλαγή στο API ή στη μορφή απόκρισης.

2026-08 · Τα API-Keys λήγουν τη στιγμή της λήξης τους

  • Διόρθωση: Ένα API-Key, του οποίου το expires_at ήταν την ίδια ημέρα, γινόταν δεκτό μέχρι τα μεσάνυχτα UTC. Η λήξη συγκρίνεται πλέον ως χρονική σήμανση αντί για συμβολοσειρά — ένα ληγμένο Key επιστρέφει αμέσως 401.
  • Υπόβαθρο: Το expires_at αποθηκεύεται ως ISO χρονική σήμανση (2026-08-14T09:00:00Z), ενώ η πλευρά σύγκρισης παρείχε τη μορφή με κενό διάστημα (2026-08-14 09:00:00). Η απλή σύγκριση συμβολοσειρών ήταν επομένως σωστή μόνο εφόσον διέφερε ήδη η ημερομηνία.
  • Αντίκτυπος: Δεν απαιτείται μετανάστευση, η μορφή απόκρισης του GET /v1/api-keys παραμένει αμετάβλητη. Μη αναγνώσιμες τιμές λήξης θεωρούνται πλέον ληγμένες αντί για έγκυρες.

2026-08 · Αναφορά API: Τεκμηρίωση διαχείρισης Tenant

  • OpenAPI: Η προδιαγραφή — και συνεπώς η διαδραστική αναφορά — τεκμηριώνει πλέον Οργανισμούς (συμπεριλαμβανομένου του GET /v1/organizations/usage), Workspaces, Μέλη & Ρόλους και Audit-Logs.
  • Billing: Η επισκόπηση προγραμμάτων (GET /v1/billing/plans) είναι δημόσια· το Checkout (POST /v1/billing/checkout) και η πύλη πελατών Stripe (GET /v1/billing/portal) ορίζονται ως endpoints για διαχειριστές οργανισμών.
  • Εξαγωγή σαρώσεων: Τα στατιστικά σαρώσεων (GET /v1/codes/{id}/scans) και η εξαγωγή ακατέργαστων δεδομένων (…/scans.csv, …/scans.xlsx) είναι πλήρως τεκμηριωμένα — συμπεριλαμβανομένης της σημείωσης για τον ΓΚΠΔ: Το ip_hash δεν περιλαμβάνεται ποτέ στην εξαγωγή.
  • Συμπεριφορά σφάλματος: Έχει επίσης τεκμηριωθεί πρόσφατα η απάντηση 400 της επικύρωσης αιτήματος: Το body είναι το ακατέργαστο σφάλμα Zod, όχι ένα έγγραφο προβλήματος RFC-7807 — παρόλα αυτά, παραδίδεται με το Content-Type application/problem+json.

2026-08 · Αντιγραφή δημόσιων συνδέσμων αρχείων

  • Dashboard: Τα δημόσια αρχεία στη σελίδα λεπτομερειών κώδικα διαθέτουν πλέον ένα κουμπί που αντιγράφει τον δημόσιο σύνδεσμό τους στο πρόχειρο – έτοιμο προς χρήση ως URL προορισμού ενός QR-Code, εάν θέλετε η σάρωση να ανοίγει αμέσως ένα συγκεκριμένο έγγραφο αντί για τη σελίδα προορισμού με τη λίστα αρχείων.
  • API: Τα endpoints αρχείων (/v1/files) επιστρέφουν επιπλέον το πεδίο public_url. Το πεδίο αυτό ορίζεται μόνο για αρχεία με visibility: public – τα ιδιωτικά αρχεία δεν λαμβάνουν δημόσια διεύθυνση.
  • Συμπεριφορά: Ο σύνδεσμος δεν απαιτεί σύνδεση και ανοίγει το αρχείο απευθείας στο πρόγραμμα περιήγησης. Η αντικατάσταση του αρχείου τον αφήνει αμετάβλητο, επομένως ένας εκτυπωμένος κώδικας που οδηγεί σε αυτόν παραμένει έγκυρος. Λεπτομέρειες: Αρχεία & Φύλλα Δεδομένων.

2026-07 · Ρόλοι ομάδας: Συντάκτης χωρίς διαγραφή & Χρέωση διαχειριστή

  • Νέο: Ρόλος μέλους Συντάκτης (χωρίς διαγραφή) — δημιουργεί και επεξεργάζεται QR-Codes, αρχεία και Digital Product Passports, αλλά δεν μπορεί να διαγράψει τίποτα ούτε να δημιουργήσει API-Keys. Όλα τα καταστροφικά endpoints ελέγχουν τον ρόλο στην πλευρά του διακομιστή (403).
  • Χρέωση: Οι αναβαθμίσεις προγραμμάτων και η πύλη πελατών Stripe (POST /v1/billing/checkout, GET /v1/billing/portal) προορίζονται πλέον αποκλειστικά για τους διαχειριστές του οργανισμού — όλοι οι άλλοι ρόλοι βλέπουν μια επισκόπηση προγράμματος μόνο για ανάγνωση.
  • Dashboard: Οι ενέργειες που δεν επιτρέπονται από τον ρόλο του χρήστη αποκρύπτονται: Ένας Αναγνώστης δεν βλέπει, για παράδειγμα, κουμπιά για δημιουργία, επεξεργασία ή διαγραφή, ενώ οι λίστες, οι λήψεις και τα στατιστικά στοιχεία παραμένουν ορατά. Λεπτομέρειες: Ομάδα & Ρόλοι.

2026-06 · Εξωτερικοί σύνδεσμοι στη σελίδα προορισμού του κώδικα

  • Σελίδα προορισμού: Η σελίδα προορισμού ενός κώδικα που φιλοξενείται από το qr3 μπορεί πλέον να εμφανίζει εξωτερικούς, αυτο-φιλοξενούμενους συνδέσμους ({ label, url }) – επιπλέον ή αντί για μεταφορτωμένα αρχεία, για παράδειγμα για φύλλα δεδομένων στον δικό σας ιστότοπο.
  • API: Τα POST/PATCH /v1/codes αποδέχονται έναν πίνακα links (0–20 εγγραφές, http(s), ≤ 2048 χαρακτήρες). Κάθε URL ελέγχεται με το Google Web Risk. Ένα μη ασφαλές URL επιστρέφει 422. Ένας κενός πίνακας διαγράφει όλους τους συνδέσμους.
  • Dashboard: Προσθήκη, ταξινόμηση και αφαίρεση συνδέσμων στη σελίδα λεπτομερειών του κώδικα.
  • Ασφάλεια: Οι σύνδεσμοι που αποδίδονται παραμένουν ασφαλείς από XSS (escaped, μόνο http(s)) και η σελίδα διατηρεί την κεφαλίδα noindex.

2026-04 · Analytics πίνακα ελέγχου (Dashboard) ανά QR-Code

  • Dashboard: Το κουμπί Analytics στη λίστα των QR-Codes ανοίγει πλέον τη σελίδα στατιστικών του αντίστοιχου QR-Code στη διαδρομή /dashboard/codes/{id}.
  • Routing: Το ψευδώνυμο (alias) /dashboard/codes εξακολουθεί να ανακατευθύνει στο /dashboard, αλλά δεν παρεμποδίζει πλέον τις διαδρομές λεπτομερειών όπως η /dashboard/codes/{id}.
  • API: Η σελίδα λεπτομερειών φορτώνει τον QR-Code απευθείας μέσω GET /v1/codes/:id. Έτσι, δεν εξαρτάται πλέον από τα όρια σελιδοποίησης (pagination limits) της λίστας.
  • Δοκιμές: Οι δοκιμές παλινδρόμησης (regression tests) καλύπτουν την ανακατεύθυνση του ψευδωνύμου και την απευθείας φόρτωση του κώδικα.

2026-04 · Διάλογος διαγραφής πίνακα ελέγχου (Dashboard) για QR-Codes

  • Dashboard: Το εικονίδιο του κάδου απορριμμάτων στη λίστα των QR-Codes ανοίγει πλέον έναν προσαρμοσμένο διάλογο React αντί για ένα εγγενές αναδυόμενο παράθυρο (popup) του προγράμματος περιήγησης.
  • Ανατροφοδότηση: Μετά τη διαγραφή, εμφανίζεται μια ειδοποίηση toast για επιτυχία ή σφάλμα.
  • Δοκιμές: Το αρχείο packages/dashboard/tests/dashboard.test.ts αποτρέπει παλινδρομήσεις στη χρήση της confirm() στη ροή διαγραφής QR-Code.

2026-04 · Δοκιμή σύντομου συνδέσμου πίνακα ελέγχου (Dashboard) για δυναμικά QR-Codes

  • Dashboard: Οι σύντομοι κωδικοί (shortcodes) στη λίστα των QR-Codes είναι πλέον άμεσα κλικάσιμοι ως εξωτερικοί σύνδεσμοι ανακατεύθυνσης. Το εικονίδιο εξωτερικού συνδέσμου δίπλα στο π.χ. wu3qaa ανοίγει τη διεύθυνση https://qr3.app/{shortCode} σε νέα καρτέλα.
  • i18n: Προσθήκη κειμένων tooltip για Γερμανικά και Αγγλικά.
  • Δοκιμές: Το αρχείο packages/dashboard/tests/dashboard.test.ts προστατεύει το href του συνδέσμου, τη συμπεριφορά νέας καρτέλας, τα χαρακτηριστικά noopener noreferrer και το εικονίδιο από παλινδρομήσεις.

2026-04 · Διαδρομή Redirect-Worker για δυναμικά QR-Codes

  • Διόρθωση: Τα δυναμικά QR-Codes στη διεύθυνση https://qr3.app/{shortCode} επεξεργάζονται ξανά από τον Redirect-Worker. Η διαδρομή παραγωγής (production route) χρησιμοποιεί πλέον το qr3.app/*, επειδή οι διαδρομές Cloudflare Workers δεν υποστηρίζουν παραμέτρους διαδρομής :code.
  • Θωράκιση: Οι διαδρομές που δεν ταιριάζουν προωθούνται στην αρχική προέλευση (landing origin), ώστε οι κανονικές σελίδες όπως η /de/pricing να μην αποκλείονται από τον Redirect-Worker.
  • Δοκιμές: Το αρχείο packages/redirect/tests/unit/redirect.test.ts ελέγχει τη διαδρομή wildcard, την επεξεργασία shortcode και την προώθηση στην προέλευση (origin pass-through).

2026-04 · Επισκόπηση σαρώσεων DPP χώρου εργασίας (Q3.4.2)

  • Νέο: GET /v1/workspace/stats/dpp?days=30 — συγκεντρώνει όλες τις σαρώσεις dpp_scans του χώρου εργασίας του API-Key (active_dpps, scans_by_day, top_dpps με όνομα προϊόντος/κατηγορία).
  • Dashboard: Κάρτα στην αρχική σελίδα (/dashboard) με ραβδόγραμμα 30 ημερών + λίστες κορυφαίων στοιχείων — παράλληλα με τις κάρτες QR-Code.
  • Δημόσιο: Σύντομος σύνδεσμος μάρκετινγκ GET /dpp/dpp_<id> (ένα τμήμα) για ζωντανές επιδείξεις (live demos), παράλληλα με το /dpp/{gtin}/{serial}.

2026-04 · Analytics σαρώσεων DPP (Q3.4.1)

  • Νέο: GET /v1/dpp/:id/stats?days=30 — συγκεντρωτικές σαρώσεις του δημόσιου GS1-Resolver ανά DPP. Πεδία: total_scans, period_scans, scans_by_day, top_countries, top_devices, top_representations.
  • Νέο: Πίνακας dpp_scans (μεταφορά 0011) — ξεχωριστά από τις scans (Redirect-Worker). Οι διευθύνσεις IP κατακερματίζονται (hashed) με καθημερινά εναλλασσόμενο salt, οι ακατέργαστες IP δεν φτάνουν ποτέ στη D1.
  • Dashboard: Κάρτα μικρογραφήματος (SVG, χωρίς βιβλιοθήκη γραφημάτων) στη διαδρομή /dashboard/dpp/:dppId με ράβδους 30 ημερών + αναλύσεις των κορυφαίων 3 (top-3 breakdowns). Κατάσταση κενού (empty-state) μόλις ένα DPP είναι ενεργό αλλά δεν έχει ακόμη σαρώσεις.

2026-04 · Προσομοιωτής συμμόρφωσης ΕΕ σε πραγματικό χρόνο (Q3.3.7)

  • Νέο: POST /v1/dpp/:id/validate-update — προσομοιώνει μερικές ενημερώσεις χωρίς διατήρηση κατάστασης (stateless) (κατάσταση, λίστα αγορών, …) χωρίς μόνιμη αποθήκευση. Η απόκριση περιέχει τα eu_compliance + preview.changed_fields.
  • Dashboard: Κάρτα προσομοιωτή στις λεπτομέρειες DPP (/dashboard/dpp/:dppId) — ετικέτες (chips) για DE/AT/FR/IT/ES/NL + προσαρμοσμένες, αναπτυσσόμενο μενού κατάστασης, Preview EU impact / Save changes / Reset. Μη αποκλειστικό (non-blocking) μέσω του Remix useFetcher.
  • Θωράκιση: Εξωτερικευμένοι βοηθοί προσομοιωτή (readUpdatePatchFromForm, marketCountriesKey) + 18 νέες δοκιμές μονάδας (unit tests). Διόρθωση σφάλματος: Η μεμονωμένη εισαγωγή μη ISO τιμής δεν διαγράφει πλέον τη λίστα αγορών.

2026-04 · Προεπισκόπηση συμμόρφωσης ΕΕ σε πραγματικό χρόνο στη φόρμα δημιουργίας (Q3.3.6)

  • Τροποποιήθηκε: Το POST /v1/dpp/validate επιστρέφει επιπλέον το eu_compliance — ο ίδιος επικυρωτής (validator) με το GET /v1/dpp/:id/eu-compliance, stateless πριν από την αποθήκευση.
  • Dashboard: Προεπισκόπηση κάτω από το υπάρχον πλαίσιο επικύρωσης (validation panel) + νέο πλαίσιο προστασίας αποθήκευσης (Save-Guard-Banner) πριν από τα κουμπιά υποβολής, εάν υπάρχουν εκκρεμή σφάλματα/προειδοποιήσεις (i18n-pluralization DE/EN).

2026-04 · Εργαλείο επικύρωσης ΕΕ + UI κλωστοϋφαντουργικών (Q3.3.4 + Q3.3.5)

  • Νέο: Εργαλείο επικύρωσης συμμόρφωσης ΕΕ με 5 κανόνες κλωστοϋφαντουργικών (TEXTILE_AGEC_REQUIRED, TEXTILE_MICROPLASTICS_CONSISTENCY, TEXTILE_SVHC_THRESHOLD, TEXTILE_GREENWASHING, TEXTILE_ESPR_READY).
  • Νέο: GET /v1/dpp/:id/eu-compliance με compliant / espr_ready / issues[] / summary.
  • Dashboard: Ενότητα συμμόρφωσης ΕΕ (EU-Compliance-Section) στις λεπτομέρειες DPP (πλακίδια σύνοψης, ομαδοποιημένες κάρτες προβλημάτων, σήμα ESPR-Ready στην κεφαλίδα).

2026-04 · Σχήμα DPP κλωστοϋφαντουργικών (Q3.3.1–Q3.3.3)

  • Νέο: Κατηγορία textile με υποχρεωτική αλυσίδα AGEC (Ύφανση/Πλέξιμο → Βαφή/Εκτύπωση → Ραφή/Κατασκευή), ανά ίνα origin_country + recycled_pct, svhc_substances[], ESPR-Opt-in (PEF, διάρκεια ζωής, Recyclability).
  • Νέο: Βασικό πεδίο market_countries: string[] (ISO 3166-1 alpha-2) σε όλες τις κατηγορίες DPP — ελέγχει τους ειδικούς κανόνες AGEC για τη Γαλλία (FR) και τη γαλλική υποχρεωτική σημείωση καταναλωτή.
  • Νέο: Πρότυπο HTML καταναλωτή με πλαίσιο προειδοποίησης μικροπλαστικών AGEC, αλυσίδα προέλευσης 3 σταδίων (flag-pills), λίστα SVHC, ενότητα Durability και Recyclability.
  • Μεταφορά: 0010_dpp_market_countries (D1).

2026-04 · Μαζική εισαγωγή DPP (Q3.2.1–Q3.2.5)

  • Νέο: Το POST /v1/dpp/import αποδέχεται CSV και XLSX (συμβατό με Workers μέσω του SheetJS xlsx, ~283 KB gzip bundle).
  • Κλιμακούμενο: όριο βάσει προγράμματος (Free 100 → Enterprise 10k) + τμηματοποιημένο db.batch() ανά 100 + όριο σώματος (body limit) 5 MB.
  • Νέο: Αναφορά σφαλμάτων ως CSV στο πεδίο errors_csv της απόκρισης 201. Το GET /v1/dpp/import/templates/:category?format=csv|xlsx παρέχει έτοιμα πρότυπα για μπαταρίες και κλωστοϋφαντουργικά.
  • Dashboard: Μεταφόρτωση με μεταφορά και απόθεση (Drag-and-Drop) στη διαδρομή /dashboard/dpp/import με διαμεσολαβητή προτύπων (template proxy) και ενσωματωμένη λήψη CSV.

Μη διασπαστικές αλλαγές (Non-Breaking) — Επεκτάσεις LTS

Όλες οι παραπάνω αλλαγές είναι προσθετικές:

  • Οι υπάρχοντες πελάτες του POST /v1/dpp/validate αγνοούν το νέο πεδίο eu_compliance χωρίς να απαιτείται αλλαγή.
  • Οι υπάρχουσες ροές battery παραμένουν αμετάβλητες.
  • Το πεδίο market_countries είναι προαιρετικό και έχει ως προεπιλογή το [].

Δείτε την Έκδοση API για την πολιτική διασπαστικών αλλαγών (Breaking-Change-Policy).