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. Το webhookqr.deletedαποστέλλεται ακριβώς μία φορά, ενώ προηγουμένως αποστελλόταν δύο φορές. - Νέο: Οι κλήσεις
POSTκαιDELETE /v1/codes/:id/logoαπαντούν με409(errors/conflict) εάν ένα άλλο αίτημα άλλαξε ταυτόχρονα το λογότυπο του ίδιου κώδικα, και σε αυτή την περίπτωση δεν αλλάζουν τίποτα. Προηγουμένως, ένα μεταφορτωμένο λογότυπο θα μπορούσε να παραμείνει αποθηκευμένο χωρίς να χρησιμοποιείται. Δύο ταυτόχρονες κλήσειςDELETE /v1/codes/:id/logoεπιστρέφουν και οι δύο200. Λεπτομέρειες: Λογότυπο.
2026-09 · TypeScript-SDK 1.2.0
- Νέο στο
@qr3/sdk1.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περιλαμβάνεται σε κάθε απάντηση κώδικα και στα webhooksqr.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(πεδίο multipartfile· PNG, JPEG ή WebP, το πολύ 1 MB, το SVG απορρίπτεται) δημιουργεί ένα λογότυπο ή το αντικαθιστά·DELETE /v1/codes/{id}/logoτο αφαιρεί ξανά και είναι idempotent. Μια πολύ μεγάλη εικόνα επιστρέφει413, μια μη υποστηριζόμενη μορφή422, ο ρόλοςviewer403. - Εμφάνιση: Τα
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 SDKqr3appδεν έχει δημοσιευτεί στο 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, CLIqr3 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-Typeapplication/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) μέσω του RemixuseFetcher. - Θωράκιση: Εξωτερικευμένοι βοηθοί προσομοιωτή (
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 μέσω του SheetJSxlsx, ~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).