Skip to content

API Κωδικών QR

Επισκόπηση

Το Codes API είναι η καρδιά του qr3.app. Με αυτό μπορείτε να δημιουργείτε, να ενημερώνετε και να διαγράφετε δυναμικούς και στατικούς κωδικούς QR.

Βασικό URL: https://qr3.app/v1/codes

Δεσμευτική σύμβαση REST

Η ακόλουθη σύμβαση ισχύει για όλους τους πελάτες:

  • Το POST /v1/codes δέχεται μόνο τους τύπους url, vcard, wifi, email, sms και location. Τα πεδία είναι επίπεδα: url; τουλάχιστον vcard_first_name ή vcard_last_name; wifi_ssid; email_to; sms_phone; ή και τα δύο location_lat και location_lng.
  • Μόνο οι κωδικοί url μπορούν να είναι δυναμικοί. Τα αιτήματα δημιουργίας μπορούν προαιρετικά να περιλαμβάνουν expires_at ως χρονική σήμανση ISO 8601· τα ab_enabled, ab_target_url_b και ab_weight_a (προορισμοί A/B) γίνονται δεκτά για δυναμικούς κωδικούς url· το redirect_after_expiry δεν αποτελεί μέρος του συμβολαίου δημιουργίας.
  • Το GET /v1/codes υποστηρίζει μόνο limit, cursor και status (live, paused, flagged, draft).
  • Το POST /v1/codes/batch δέχεται url, vcard και wifi. Το όριο είναι 10 για Free, 500 για Pro και 1.000 εγγραφές για Business/Agency/Enterprise ανά αίτημα. Οι έλεγχοι URL εκτελούνται συγχρονισμένα για έως 50 στοιχεία URL· πάνω από 50 απαιτείται skip_url_scan: true.

Δημιουργία Κωδικού QR

POST /v1/codes

Terminal window
curl -X POST https://qr3.app/v1/codes \
-H "Authorization: Bearer qr3_sk_..." \
-H "Content-Type: application/json" \
-d '{
"type": "url",
"url": "https://example.com",
"title": "Mein erster QR-Code",
"tags": ["marketing", "q1"],
"is_dynamic": true
}'

Απόκριση (HTTP 201):

{
"data": {
"id": "qr_a1b2c3d4",
"short_code": "r7f3Kx",
"redirect_url": "https://qr3.app/r7f3Kx",
"image_svg_url": "https://qr3.app/v1/codes/r7f3Kx/qr.svg",
"image_png_url": "https://qr3.app/v1/codes/r7f3Kx/qr.png",
"image_pdf_url": "https://qr3.app/v1/codes/r7f3Kx/qr.pdf",
"image_eps_url": "https://qr3.app/v1/codes/r7f3Kx/qr.eps",
"type": "url",
"target_url": "https://example.com",
"is_dynamic": true,
"status": "live",
"tags": ["marketing", "q1"],
"total_scans": 0,
"created_at": "2026-03-15T10:00:00.000Z"
},
"meta": { "request_id": "req_xyz123" }
}

Τύποι Κωδικών QR

ΤύποςΠεριγραφήΥποχρεωτικά πεδία
urlURL ιστότοπου (δυναμικό ή στατικό)url
vcardΕπαγγελματική κάρτα (vCard 3.0)vcard_first_name ή vcard_last_name
wifiΡύθμιση παραμέτρων Wi-Fiwifi_ssid
emailE-mail (mailto:)email_to
smsSMSsms_phone
locationΤοποθεσία (geo:)location_lat, location_lng

Μαζική Δημιουργία

POST /v1/codes/batch

Terminal window
curl -X POST https://qr3.app/v1/codes/batch \
-H "Authorization: Bearer qr3_sk_..." \
-H "Content-Type: application/json" \
-d '{
"items": [
{ "type": "url", "url": "https://produkt-1.example.com", "tags": ["batch"] },
{ "type": "url", "url": "https://produkt-2.example.com", "tags": ["batch"] },
{ "type": "wifi", "wifi_ssid": "GastWLAN", "wifi_password": "geheim123" }
],
"skip_url_scan": false
}'

Απόκριση (HTTP 201):

{
"data": {
"created": [
{ "id": "qr_...", "short_code": "abc123", "redirect_url": "https://qr3.app/abc123" },
{ "id": "qr_...", "short_code": "def456", "redirect_url": "https://qr3.app/def456" },
{ "id": "qr_...", "short_code": "ghi789", "status": "live" }
],
"total": 3,
"failed": 0
}
}

Λίστα Κωδικών QR

GET /v1/codes

Terminal window
curl https://qr3.app/v1/codes?status=live&limit=20 \
-H "Authorization: Bearer qr3_sk_..."

Παράμετροι ερωτήματος (Query Parameters):

ΠαράμετροςΤύποςΠροεπιλογήΠεριγραφή
cursorstring—Δρομέας (cursor) για σελιδοποίηση
limitinteger20Αποτελέσματα ανά σελίδα (μέγ. 100)
statusstring—Φίλτρο: live, paused, flagged, draft

Ανάκτηση Κωδικού QR

GET /v1/codes/:id

Terminal window
curl https://qr3.app/v1/codes/qr_a1b2c3d4 \
-H "Authorization: Bearer qr3_sk_..."

Ενημέρωση Κωδικού QR

PATCH /v1/codes/:id

Update contract: url may be changed only for an existing type: "url" code, and its value must use http:// or https://. Other code types must not receive url; invalid requests return 422.

Οι δυναμικοί κωδικοί QR σάς επιτρέπουν να αλλάζετε το URL προορισμού ανά πάσα στιγμή — χωρίς να χρειάζεται να εκτυπώσετε ξανά τον κωδικό QR.

Terminal window
curl -X PATCH https://qr3.app/v1/codes/qr_a1b2c3d4 \
-H "Authorization: Bearer qr3_sk_..." \
-H "Content-Type: application/json" \
-d '{ "url": "https://neue-zielseite.example.com", "status": "live" }'

Σελίδα Προορισμού & Εξωτερικοί Σύνδεσμοι

Για δυναμικούς κωδικούς url, μπορείτε να ορίσετε is_landing_page: true (κατά τη δημιουργία ή μέσω PATCH). Μια σάρωση θα εμφανίσει τότε μια σελίδα που φιλοξενείται από το qr3 με τα δημόσια αρχεία και τους εξωτερικούς συνδέσμους του κωδικού, αντί να κάνει ανακατεύθυνση. Οι εξωτερικοί σύνδεσμοι μεταβιβάζονται ως πίνακας links:

{
"is_landing_page": true,
"links": [
{ "label": "Datenblatt", "url": "https://example.com/datenblatt.pdf" },
{ "label": "Zertifikat", "url": "https://example.com/zertifikat.pdf" }
]
}
  • 0–20 σύνδεσμοι ανά κωδικό. Το label πρέπει να είναι 1–100 χαρακτήρες. Το url πρέπει να είναι http(s) (≤ 2048 χαρακτήρες).
  • Κάθε URL ελέγχεται με το Google Web Risk — ένα μη ασφαλές URL επιστρέφει 422.
  • Εάν το Web Risk δεν είναι προσβάσιμο κατά την αποθήκευση, ο σύνδεσμος γίνεται παρ’ όλα αυτά αποδεκτός, αλλά επισημαίνεται για επανέλεγχο. Μια καθημερινή εργασία ελέγχει ξανά τους αποθηκευμένους συνδέσμους (και επανελέγχει περιοδικά τους συνδέσμους που έχουν χαρακτηριστεί ως ασφαλείς) και θέτει σε παύση αυτόματα τον κωδικό, εάν κάποιος σύνδεσμος αναγνωριστεί αργότερα ως μη ασφαλής.
  • Το "links": [] διαγράφει όλους τους συνδέσμους. Δείτε τον οδηγό σελίδας προορισμού.

Διαγραφή Κωδικού QR

DELETE /v1/codes/:id

Ήπια διαγραφή (Soft-Delete) — ο κωδικός QR αρχειοθετείται, τα δεδομένα σάρωσης διατηρούνται.

Ένα δεύτερο DELETE στον ίδιο κώδικα επιστρέφει 404, ακόμη και αν και τα δύο αιτήματα φτάσουν ταυτόχρονα. Το webhook qr.deleted αποστέλλεται ακριβώς μία φορά.

Terminal window
curl -X DELETE https://qr3.app/v1/codes/qr_a1b2c3d4 \
-H "Authorization: Bearer qr3_sk_..."

Λήψη Εικόνων QR

Όλες οι μορφές εικόνας είναι δημόσια προσβάσιμες — δεν απαιτείται έλεγχος ταυτότητας.

ΜορφήURLΧρήση
SVG (Διανυσματικό)/v1/codes/:code/qr.svgΙστός, Κλιμάκωση, Ψηφιακά μέσα
PNG (Ψηφιογραφικό)/v1/codes/:code/qr.pngE-mail, Παρουσιάσεις
PDF (Διανυσματικό)/v1/codes/:code/qr.pdfΠροεπιλογή: τετράγωνο (μόνο ο κώδικας), ?format=a4 για φύλλο εκτύπωσης
EPS (Διανυσματικό)/v1/codes/:code/qr.epsΕπαγγελματικές ροές εργασίας εκτύπωσης (Adobe, τυπογραφεία)

Προαιρετικά: ?size=N — Μέγεθος στοιχείου (module) σε pixel (2–20, προεπιλογή: 4) για SVG, PNG και EPS. Το PDF χρησιμοποιεί σταθερό μέγεθος στοιχείου.

Μόνο για PDF: ?format=a4|square — Μορφή σελίδας (προεπιλογή: square — μόνο ο κώδικας + Quiet Zone, χωρίς λευκό χώρο A4, a4 για ένα έτοιμο προς εκτύπωση φύλλο A4)

Terminal window
# SVG für Web
curl https://qr3.app/v1/codes/r7f3Kx/qr.svg
# PNG in hoher Auflösung
curl https://qr3.app/v1/codes/r7f3Kx/qr.png?size=10 -o qr-hires.png
# Kompaktes PDF (nur der Code, Standard)
curl https://qr3.app/v1/codes/r7f3Kx/qr.pdf -o qr.pdf
# Druckfertiges A4-Blatt
curl "https://qr3.app/v1/codes/r7f3Kx/qr.pdf?format=a4" -o qr-a4.pdf

Χρώματα και διόρθωση σφαλμάτων

Και οι τέσσερις διαδρομές εικόνας δέχονται τρεις προαιρετικές παραμέτρους. Ισχύουν για τη συγκεκριμένη ανάκτηση και υπερισχύουν των χρωμάτων που είναι αποθηκευμένα στον κώδικα (επόμενη ενότητα).

ΠαράμετροςΤιμέςΠροεπιλογήSVG, PNGPDF, EPS
fgHex RRGGBB ή RGB000000σχεδιάζεταισχεδιάζεται ως χρώμα εκτύπωσης
bgHex όπως το fg ή transparentffffffσχεδιάζεταισχεδιάζεται ως χρώμα εκτύπωσης
eccL, M, Q, HMεφαρμόζεταιεφαρμόζεται
  • Τρόπος γραφής: Δεν υπάρχει διάκριση πεζών-κεφαλαίων, το # είναι προαιρετικό. Αν το στείλετε, κωδικοποιήστε το ως %23.
  • Οι μη έγκυρες τιμές θεωρούνται ως μη ορισμένες. Το ?fg=lila επιστρέφει το χρώμα που είναι αποθηκευμένο στον κώδικα, ή το κανονικό μαύρο εάν δεν υπάρχει αποθηκευμένο χρώμα, με κωδικό 200 και ποτέ σφάλμα. Μόνο ένα ρητό ?fg=000000 επιβάλλει το μαύρο χρώμα.
  • bg=transparent επιστρέφει ένα SVG, PDF ή EPS χωρίς φόντο και ένα PNG με πραγματικό κανάλι άλφα. Το υπόβαθρο στο οποίο τοποθετείται ο κώδικας πρέπει να είναι ανοιχτόχρωμο και να αφήνει ελεύθερη μια ζώνη ησυχίας 4 μονάδων γύρω-γύρω. Ένας σκούρος κώδικας σε σκούρο υπόβαθρο δεν είναι αναγνώσιμος.
  • PDF και EPS γράφουν το μαύρο και το γκρι ως διαβάθμιση του γκρι (μόνο μαύρη πλάκα) και οποιοδήποτε άλλο χρώμα ως CMYK σε ακέραια ποσοστά, για παράδειγμα το 1F4E79 ως C74 M36 Y0 K53. Μόλις επιλεγεί ένα χρώμα, πίσω από τον κώδικα και τη ζώνη ησυχίας του υπάρχει ένα αδιαφανές γέμισμα, λευκό ή στο χρώμα του bg, όπως και στο SVG. Χωρίς χρώματα, και τα δύο αρχεία παραμένουν αμετάβλητα. Μετατροπή και όρια: Χρώματα στην εκτύπωση.
  • Αντίθεση: Η διαδρομή εικόνας δεν την ελέγχει. Συνιστάται τουλάχιστον 4:1 και σκούρες μονάδες σε ανοιχτόχρωμο υπόβαθρο. Το #1F4E79 σε λευκό έχει 8,7:1, το #ff6600 σε λευκό μόνο 2,9:1.
  • ecc αλλάζει το μοτίβο των κουκκίδων, όχι το περιεχόμενο. Ένας εκτυπωμένος κώδικας συνεχίζει να λειτουργεί, αλλά μην αναμιγνύετε παλιά και νέα αρχεία εκτύπωσης. Το Q ή το H καθιστούν τον κώδικα πιο ανθεκτικό, για παράδειγμα σε κυματοειδές χαρτόνι. Ένα λογότυπο επιβάλλει πάντα το H.
  • Με λογότυπο η περιοχή πίσω από το λογότυπο παραμένει λευκή, ακόμη και με έγχρωμο ή διαφανές φόντο.
  • Προσωρινή μνήμη: Μόνο η πραγματική προεπιλεγμένη εικόνα (μαύρο σε λευκό, διόρθωση σφαλμάτων M, χωρίς λογότυπο) παρέχεται ως αμετάβλητη για 24 ώρες· κάθε άλλη απεικόνιση για 5 λεπτά. Για PDF και EPS, οποιοδήποτε καθορισμένο υπόβαθρο θεωρείται ως απόκλιση: το bg=ffffff σχεδιάζει εκεί ένα λευκό γέμισμα που δεν έχει το προεπιλεγμένο αρχείο.
  • Πρόγραμμα χρέωσης: Τα χρώματα και η διόρθωση σφαλμάτων είναι διαθέσιμα σε κάθε πρόγραμμα, ακόμη και στο δωρεάν.
Terminal window
# Dark blue code on white
curl "https://qr3.app/v1/codes/r7f3Kx/qr.svg?fg=1F4E79" -o qr-blue.svg
# Transparent PNG for a layout on a light surface
curl "https://qr3.app/v1/codes/r7f3Kx/qr.png?size=10&bg=transparent" -o qr-transparent.png
# More robust for corrugated board: error correction Q
curl "https://qr3.app/v1/codes/r7f3Kx/qr.pdf?ecc=Q" -o qr-q.pdf

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

Το PATCH /v1/codes/:id αποθηκεύει χρώματα ως appearance στον κώδικα. Οι διαδρομές εικόνας τα σχεδιάζουν στη συνέχεια από προεπιλογή, χωρίς παραμέτρους.

Terminal window
curl -X PATCH https://qr3.app/v1/codes/qr_a1b2c3d4 \
-H "Authorization: Bearer qr3_sk_..." \
-H "Content-Type: application/json" \
-d '{"appearance": {"foreground_color": "#1F4E79"}}'

Απάντηση (HTTP 200, συντομευμένη):

{
"data": {
"id": "qr_a1b2c3d4",
"short_code": "r7f3Kx",
"appearance": { "foreground_color": "#1F4E79", "background_color": null }
},
"meta": { "request_id": "req_xyz", "issues": [] }
}
  • Τιμές: foreground_color ως #RRGGBB, background_color ως #RRGGBB ή transparent. Άλλα κλειδιά επιστρέφουν 400.
  • Συγχώνευση: Ένα πεδίο που παραλείπεται διατηρεί την αποθηκευμένη του τιμή. Το null επαναφέρει ένα πεδίο, το "appearance": null και τα δύο. Το μαύρο και το λευκό δεν αποθηκεύονται· η απάντηση τα εμφανίζει ως null.
  • Κάθε απάντηση κώδικα περιέχει το appearance, όπως και τα webhook qr.created και qr.updated.
  • Σειρά προτεραιότητας στις διαδρομές εικόνας: πρώτα η παράμετρος, μετά το αποθηκευμένο χρώμα, μετά η προεπιλογή. Το ?fg=000000 επομένως παρέχει το μαύρο αρχείο εκτύπωσης ενός έγχρωμου κώδικα.
  • Ενσωματωμένες εικόνες: Μια URL εικόνας ακολουθεί τα αποθηκευμένα χρώματα, εφόσον δεν τα ορίζει η ίδια με fg και bg: μια URL χωρίς παραμέτρους και για τα δύο χρώματα, η ?fg=000000 για το φόντο, η ?ecc=Q επίσης και για τα δύο. Μετά από μια αλλαγή χρώματος, μια σελίδα που ενσωματώνει μια τέτοια URL μπορεί να εμφανίζει ακόμα την παλιά εικόνα: για έως και 24 ώρες εάν η URL επέστρεφε μέχρι τότε την προεπιλεγμένη εικόνα (μαύρο σε λευκό, διόρθωση σφαλμάτων M, χωρίς λογότυπο), διαφορετικά για έως και 5 λεπτά. Η λύση είναι μια δική σας παράμετρος στη URL που αλλάζει με κάθε αλλαγή χρώματος, όπως ?v=2 ή το updated_at του κώδικα όπως στο Dashboard. Οι διαδρομές εικόνας αγνοούν τις άγνωστες παραμέτρους.
  • Η διόρθωση σφαλμάτων δεν αποθηκεύεται ποτέ. Επιλέγεται ανά λήψη με ?ecc=.
  • Μόνο μέσω PATCH: Το POST /v1/codes, το batch και η εισαγωγή απορρίπτουν το appearance με 422.
  • Τα PDF και EPS σχεδιάζουν τα αποθηκευμένα χρώματα ως χρώματα εκτύπωσης, ακριβώς όπως και τις παραμέτρους. Επειδή το λευκό δεν αποθηκεύεται ποτέ, ένας κώδικας με αποθηκευμένο χρώμα προσκηνίου αποκτά εκεί ένα λευκό γέμισμα, όπως και στο SVG.

Έλεγχος αντίθεσης

Το API ελέγχει το ζεύγος που προκύπτει από το αίτημα και την αποθηκευμένη τιμή:

ΕπίπεδοΠότεΑπάντηση
blockedΑντίθεση κάτω από 1,5:1422, τίποτα δεν αποθηκεύεται
criticalκάτω από 2:1 ή διαφορά φωτεινότητας κάτω από 0,30· μια προειδοποίηση μαζί με ένα λογότυπο· οποιοδήποτε διαφανές υπόβαθρο200 με meta.issues
warningκάτω από 4:1 ή διαφορά φωτεινότητας κάτω από 0,50· φωτεινές μονάδες σε σκούρο φόντο200 με meta.issues
okόλα τα άλλα200, το meta.issues είναι κενό

Κάθε καταχώριση στο meta.issues έχει code, severity, field, message και προαιρετικά hints όπως contrast_ratio — την ίδια μορφή με τα μηνύματα συμμόρφωσης ενός Ψηφιακού Διαβατηρίου Προϊόντος. Ένα διαφανές υπόβαθρο δεν αποκλείεται ποτέ, επειδή ένας φωτεινός κώδικας σε σκούρα συσκευασία αποτελεί πραγματική περίπτωση χρήσης. Το υπόβαθρο παρ’ όλα αυτά χρειάζεται σαφή αντίθεση και μια ελεύθερη ζώνη ησυχίας (quiet zone) 4 μονάδων γύρω-γύρω.

Η μεταφόρτωση και η αφαίρεση ενός λογοτύπου (POST και DELETE /v1/codes/:id/logo) ελέγχουν επίσης τα αποθηκευμένα χρώματα και επιστρέφουν τα ευρήματα ομοίως στο meta.issues: με ένα λογότυπο μια προειδοποίηση γίνεται critical, χωρίς αυτό γίνεται ξανά προειδοποίηση.

Εάν ένα άλλο αίτημα τροποποιήσει τον ίδιο κώδικα την ίδια στιγμή, το API εφαρμόζει τις αλλαγές στην πιο πρόσφατη κατάσταση. Μόνο εάν αυτό αποτύχει τρεις συνεχόμενες φορές, απαντά με 409· στη συνέχεια, ο client φορτώνει ξανά τον κώδικα και επαναλαμβάνει την αλλαγή.


Λογότυπο

Αίτημα Multipart, πεδίο file: PNG, JPEG ή WebP, το πολύ 1 MB, αναγνωρίζεται από τα Magic Bytes. Κανονικοποιεί την εικόνα σε ένα διαφανές 512×512 PNG και αντικαθιστά ένα υπάρχον λογότυπο.

Terminal window
curl -X POST https://qr3.app/v1/codes/qr_a1b2c3d4/logo \
-H "Authorization: Bearer qr3_sk_..." \

Απάντηση (HTTP 201): ο ενημερωμένος κώδικας, με ορισμένο το logo_file_id.

Αφαιρεί το λογότυπο και διαγράφει το αποθηκευμένο αντικείμενο. Idempotent — μια κλήση χωρίς να υπάρχει ήδη λογότυπο εξακολουθεί να επιστρέφει 200.

Εάν ένα άλλο αίτημα τροποποιήσει το λογότυπο του ίδιου κώδικα την ίδια στιγμή (μια δεύτερη μεταφόρτωση ή μια αφαίρεση), τα POST και DELETE /v1/codes/:id/logo απαντούν με 409 (errors/conflict) και δεν αλλάζουν τίποτα· μια μεταφορτωμένη εικόνα απορρίπτεται. Φορτώστε ξανά τον κώδικα και δοκιμάστε ξανά. Δύο ταυτόχρονες κλήσεις του DELETE /v1/codes/:id/logo δεν αποτελούν διένεξη· και οι δύο επιστρέφουν 200.

Εάν έχει οριστεί, και τα τέσσερα αρχεία — qr.svg, qr.png, qr.pdf και qr.eps — ενσωματώνουν τα pixel του λογοτύπου και αυξάνουν τη διόρθωση σφαλμάτων σε H. Το πλήρες συμβόλαιο — συμπεριλαμβανομένου του ποια αλλαγή (προσθήκη/αφαίρεση έναντι αντικατάστασης) αλλάζει το μοτίβο κουκκίδων — καθώς και οδηγίες εκτύπωσης βρίσκονται στο Λογότυπο στον κώδικα QR.


Σχόλια

Τα σχόλια επιτρέπουν κύκλους ανατροφοδότησης (feedback loops) μεταξύ διαφημιστικών εταιρειών (agencies) και πελατών.

GET /v1/codes/:id/comments

POST /v1/codes/:id/comments

PATCH /v1/codes/:id/comments/:commentId

DELETE /v1/codes/:id/comments/:commentId

Τα σχόλια που δημιουργούνται από το Dashboard αποδίδονται στον χρήστη που τα δημιούργησε (author_id), ενώ τα σχόλια που δημιουργούνται μέσω απλών API-Keys παραμένουν χωρίς απόδοση (author_id: null). Διαγραφή ενός σχολίου επιτρέπεται μόνο από τον ίδιο τον συντάκτη του ή από έναν org_admin/ws_admin — τα απλά API-Keys μπορούν να διαγράψουν μόνο σχόλια χωρίς απόδοση που έχουν δημιουργηθεί μέσω API.

Terminal window
# Kommentar hinzufügen
curl -X POST https://qr3.app/v1/codes/qr_a1b2c3d4/comments \
-H "Authorization: Bearer qr3_sk_..." \
-H "Content-Type: application/json" \
-d '{ "body": "QR-Code bitte auf grünen Hintergrund abstimmen.", "author_name": "Max Müller" }'
# Offene Kommentare auflisten
curl "https://qr3.app/v1/codes/qr_a1b2c3d4/comments?resolved=false" \
-H "Authorization: Bearer qr3_sk_..."
# Kommentar als erledigt markieren
curl -X PATCH https://qr3.app/v1/codes/qr_a1b2c3d4/comments/cmt_xyz \
-H "Authorization: Bearer qr3_sk_..." \
-H "Content-Type: application/json" \
-d '{ "resolved": true }'