Skip to content

Changelog

Muudatuste logi

Viimaste väljalasete kureeritud esiletõstmised. Täielike API versioonide ja katkestavate muudatuste poliitika kohta vaata API versioonihaldus ja LTS-poliitika.

Üksikasjalikud muudatused konkreetsetes otspunktides (endpoints): OpenAPI spetsifikatsioon ja interaktiivne API viide.


2026-10 · Värvid Dashboardis

  • Uus: Koodi detailvaates on kaart Värvid: esiplaan ja taust hex-väärtusena, läbipaistev taust ning eelvaade päris pildimarsruudi kaudu. Kontroll on sama mis PATCH /v1/codes/{id} puhul: kriitilised paarid vajavad kinnitust, alla 1,5:1 paare ei saa salvestada.
  • Taastamine must-valgeks annab kõigis neljas vormingus taas samad baidid nagu ilma värvideta. Värvideta koodid ei muutu.
  • Läbipaistvad koodid kuvatakse kõigis Dashboardi eelvaadetes malelauamustril. Üksikasjad: Värvid Dashboardis.

2026-10 · Värvid PDF-is ja EPS-is

  • Uus: qr.pdf ja qr.eps joonistavad fg ja bg nii parameetritena kui ka salvestatud värvidena. Must ja kõik halltoonid kirjutatakse halltoonina (ainult must plaat), mis tahes muu värv CMYK-vormingus täisprotsentides, näiteks 1F4E79 kui C74 M36 Y0 K53.
  • Taust nagu SVG puhul: Niipea kui värv on valitud, on koodi ja selle vaikse tsooni taga kattev pind, kas valge või bg. bg=transparent ei joonista midagi. Pealkiri jääb mustaks, logo alusplaat valgeks.
  • Muudatusteta ilma värvideta: Ilma fg/bg ja ilma salvestatud värvideta väljastavad mõlemad vormingud samad baidid nagu varem. Tootepassi PDF jääb värvimata.
  • Piirangud: puudub ICC-profiil, puudub PDF/X. Üksikasjad: Värvid trükis.

2026-09 · Staatilised koodid ilma suunamisvahemäluta, samaaegne kustutamine

  • Muudetud: Staatilised koodid ei asu enam suunamisvahemälus. Nende lühilingi (redirect_url) avamine loeb alati praegust olekut. Seetõttu ei suuna staatiline kood pärast päringut DELETE /v1/account järgmisel avamisel enam edasi (varem võis see toimida kuni 24 tundi). Samuti mõjub paketivahetus staatiliste koodide puhul koheselt. Dünaamilised koodid eemaldatakse konto kustutamisel nagu varemgi. Prinditud staatilised koodid sisaldavad oma sihtkohta otse ja neid see ei mõjuta.
  • Parandatud: Kaks samaaegset päringut DELETE /v1/codes/:id samale koodile tagastavad ühe korra 200 ja ühe korra 404. Webhook qr.deleted saadetakse täpselt üks kord, varem kaks korda.
  • Uus: Päringud POST ja DELETE /v1/codes/:id/logo vastavad koodiga 409 (errors/conflict), kui mõni teine päring on sama koodi logo samal ajal muutnud, ning ei muuda sel juhul midagi. Varem võis üleslaaditud logo jääda kasutamata salvestatuks. Kaks samaaegset päringut DELETE /v1/codes/:id/logo tagastavad mõlemad 200. Üksikasjad: Logo.

2026-09 · TypeScript-SDK 1.2.0

  • Uut versioonis @qr3/sdk 1.2.0: client.codes.update() võtab vastu parameetri appearance ja tagastab tulemuses kontrastikontrolli leiud väljal issues; leidude puudumisel see väli puudub. client.codes.imageUrl() võtab vastu parameetrid fg, bg ja ecc. Iga kood, mille API tagastab (get, list, create, update, batchCreate), sisaldab välju title ja appearance.
  • Uuendamine: npm install @qr3/sdk@latest. Python, Go ja PHP järgnevad. Detailid: SDK-d ja CLI ja Värvide salvestamine koodi juurde.

2026-09 · Muudetud aegumisaeg hakkab kehtima umbes ühe minuti jooksul

  • Parandatud: Päring PATCH väljale expires_at tühjendab nüüd koodi suunamisvahemälu. Uus aegumisaeg hakkab seega kehtima umbes ühe minuti jooksul, mitte alles kuni 24 tundi hiljem. Eelmise lahenduse puhul tagastas eemaldatud või edasilükatud aegumine kuni 24 tundi edasi koodi 410 ning praegusele hetkele määratud aegumine laskis suunamisel kuni 24 tundi edasi töötada.
  • Parandatud: Väljaga expires_at loodud kood aegub õigeaegselt ka siis, kui aegumine on määratud esimese 24 tunni sisse.
  • Parandatud: Kui kood kustutatakse ajal, mil selle logo laaditakse üles või eemaldatakse, vastavad POST ja DELETE /v1/codes/:id/logo staatusega 404 ega muuda kustutatud koodi, sarnaselt päringule PATCH.
  • Parandatud: Ka staatiline kood, mille lühilinki (redirect_url) on külastatud, salvestatakse suunamisvahemällu. Selle muutmine, peatamine ja kustutamine tühjendavad nüüd samuti vahemälu, mitte ainult dünaamiliste koodide puhul.

2026-09 · Värvide salvestamine koodi juurde

  • Uus: PATCH /v1/codes/:id aktsepteerib parameetrit appearance koos väärtustega foreground_color ja background_color (#RRGGBB, taustaks ka transparent). qr.svg ja qr.png joonistavad salvestatud värvid ilma parameetriteta; päringu parameeter nagu ?fg=000000 on endiselt eelistatud. PDF ja EPS joonistavad värve alles hilisemas versioonis.
  • Kontrastsuse kontroll: Paar, mille suhe on alla 1,5:1, annab tulemuseks 422. Nõrgema kontrastsusega paarid salvestatakse ja neist teavitatakse jaotises meta.issues märkega warning või critical; läbipaistev taust on alati critical, seda ei blokeerita kunagi.
  • Ühendamine: Väljajäetud väljad säilitavad oma salvestatud väärtuse, null lähtestab selle. Sama koodi samaaegsed muudatused ei kirjuta enam üksteist üle.
  • Igas koodi vastuses: appearance on olemas igas koodi vastuses ning webhookides qr.created ja qr.updated. Päring POST, partii ja import lükkavad selle tagasi veakoodiga 422.
  • Olemasolevate koodide puhul muudatusi pole: Ilma salvestatud värvideta tagastab iga kood täpselt samad baidid nagu varem. Üksikasjad: Värvide salvestamine koodi juurde.

2026-09 · Värvid ja veaparandus pildimarsruutide parameetritena

  • Uus: Kõik neli pildimarsruuti aktsepteerivad parameetreid fg (esiplaani värv), bg (taustavärv või transparent) ja ecc (veaparandus L, M, Q, H). SVG ja PNG joonistavad värvid; PDF ja EPS aktsepteerivad neid, kuid joonistavad need alles hilisemas versioonis. ecc toimib kõigis neljas vormingus, logo nõuab jätkuvalt taset H.
  • Läbipaistev: bg=transparent tagastab ilma taustata SVG ja tõelise alfakanaliga PNG. Aluspind peab olema hele ja jätma vaikse tsooni vabaks.
  • Mitte kunagi viga: Vigaseid väärtusi ignoreeritakse; pilt tagastatakse täpselt samasugusena nagu ilma parameetriteta.
  • Vahemälu: Iga toimiv parameeter tagastab päise Cache-Control: public, max-age=300 vaikimisi pildi 24 tunni asemel.
  • Käitumise muutuseta ilma parameetriteta: Mis tahes olemasolev kood tagastab kõigis neljas vormingus täpselt samad baidid nagu varem.
  • Saadaval igas paketis. Üksikasjad: Värvid ja veaparandus.
  • Laiendus: qr.pdf ja qr.eps manustavad määratud logo nüüd samamoodi nagu qr.svg ja qr.png (vt allpool) — manustatud pildina (PDF läbi Image XObject, EPS läbi pildisõnastiku PostScriptis, seal ainult koos %%LanguageLevel: 3 märgistusega), tsentreerituna samale alale, koos veaparanduse tõstmisega tasemele H. Mõlemad formaadid ei väljastanud varem logo; see on nüüd lahendatud.
  • Vahemälu: Määratud logoga tagastavad nüüd ka qr.pdf ja qr.eps päise Cache-Control: public, max-age=300 tavapärase 24 tunni asemel — täpselt nagu SVG/PNG.
  • Varulahendus: Kui logo pilti ennast ei saa töödelda (näiteks kahjustatud salvestatud objekt), jääb veaparandus tasemele H, kuid reserveeritud ala jääb pildi asemel tühjaks — see ei põhjusta kunagi serveritõrget.
  • Käitumise muutuseta ilma logota: Ilma logota koodid väljastavad qr.pdf/qr.eps faile endiselt bait-haaval identselt, muutmata 24-tunnise vahemäluga.
  • Üksikasjad ja trükijuhised: Logo QR-koodis.

2026-09 · Logo QR-koodis — Dashboard ja API

  • Uus: Koodil võib nüüd olla logo keskel. Dashboardis loob koodi üksikasjade leht eraldi logo-kaardi: Vali logo, esmakordsel lisamisel või eemaldamisel kinnita kohustusliku märkeruuduga hoiatus (mõlemad muudavad punktimustrit), seejärel Laadi logo üles/Eemalda logo. Asendamine ei vaja kinnitust — muutub ainult pilt, mitte muster. Roll viewer näeb staatust ja eelvaadet, kuid mitte ühtegi kolmest toimingust.
  • API: POST /v1/codes/{id}/logo (multipart-väli file; PNG, JPEG või WebP, maksimaalselt 1 MB, SVG lükatakse tagasi) loob logo või asendab selle; DELETE /v1/codes/{id}/logo eemaldab selle uuesti ja on idempotentne. Liiga suur pilt tagastab 413, toetamata formaat 422, roll viewer 403.
  • Renderdamine: qr.svg ja qr.png põimivad logo tegelike pikslitena (512 × 512, normaliseeritud) ja tõstavad selleks veaparanduse tasemele H. Lisamine ja eemaldamine muudavad seega punktimustrit (M ↔ H), asendamine mitte. qr.pdf ja qr.eps ei põimi logo ja jäävad muutmata. Juba prinditud kood töötab igal juhul edasi, sest kodeeritud sihtkoht ei sõltu logost — uuesti peab printima vaid see, kes soovib (uut) logo välimust ka materjalil näha, ning sealjuures ei tohiks vanu ja uusi prindifaile omavahel segada.
  • Vahemälu: Määratud logoga tagastavad qr.svg ja qr.png päise Cache-Control: public, max-age=300 tavapärase 24 tunni asemel. Üksikasjad, piirangud ja printimisjuhised: Logo QR-koodis.

2026-08 · operationId kõigile 75 operatsioonile ja „millal kasutada“ juhend agentidele

  • Täiendus: Kõik OpenAPI spetsifikatsiooni 75 operatsiooni sisaldavad nüüd välja operationId — listCodes, createCode, getCodeStats, archiveWorkspace ja nii edasi. Seni puudus see väli täielikult, mistõttu pidi iga generaator tuletama meetodi nime HTTP-meetodist ja teest (postV1Codes). Sellised nimed sõltuvad teest ja muutuvad iga tee muutmise korral. Nime kuju on kõigis 75 kohas sama: list/get/create/update/replace/delete, muul juhul äriloogika tegevust väljendav tegusõna (validateDpp, registerGs1Identifier, pingWebhook). Tegusõna järgib äriloogikat, mitte HTTP-meetodit — archiveWorkspace on DELETE, importDpps on POST.
  • Mõju ise genereeritud klientidele: Need, kes genereerivad oma SDK spetsifikatsioonist, saavad järgmisel käivitamisel ümbernimetatud meetodid (postV1Codes → createCode). See ongi muudatuse eesmärk, kuid tegemist on ümbernimetamisega võõras koodis — seetõttu on see siin eraldi välja toodud. Teed, parameetrid, vastuse vormingud ja staatusekoodid on muutmata; ametlikud SDK-d, CLI ja MCP-server ei ole mõjutatud.
  • Agentide sissejuhatus: Failis https://qr3.app/llms.txt on jaotis ## When to use qr3.app — kuus ülesannet kuue funktsiooni asemel, pluss lause selle kohta, mille jaoks qr3.app ei ole õige tööriist. Sama teavet jagab MCP-server nüüd ühenduse loomisel: päring initialize aadressile https://mcp.qr3.app/mcp vastab väljaga instructions (varem: üksteist tööriista ilma igasuguse liigituseta). Samuti on kirjas, millised päringud vajavad API-võtit — initialize ja tools/list mitte, kuid iga tools/call vajab.
  • Parandused failis llms.txt: Nelja andmetust kontrolliti toodangukeskkonnas ja need ei pidanud paika: (1) Pythoni SDK qr3app ei ole PyPI-s avaldatud — rida pip install on ilma asenduseta eemaldatud; (2) Accept: text/markdown kehtib avalehe ja blogi kohta, mitte iga serveris renderdatud lehe kohta; (3) kontaktiaadress on [email protected], samuti avalehe JSON-LD-s; (4) /de/security/ on ümbersuunamine ankrulinkile, mitte eraldi leht. Uus link: docs.qr3.app/de/skills/.
  • Tagamine: Kolm kontrolli failis openapi-spec.test.ts — täielikkus, kordumatus, lowerCamelCase —, igaüks neist mutatsioonitestiga üle kontrollitud. Üheksa täiendavat testi fikseerivad neli parandatud andmetust, et need uuesti ei ilmneks.
  • Teadaolev piirang: Kaks 75-st operatsioonist on spetsifikatsioonis kirjeldatud, kuid vastavad koodiga 404 (GET /v1/codes/{id}/stats ja GET /v1/account). Neile anti siin nimi ja nad kaotavad selle uuesti, kui on otsustatud, kas need luuakse või eemaldatakse.

2026-08 · Paketi taseme alandamised ja tühistamised mõjutavad nüüd ka limiite

  • Parandus: Stripe’i webhook kirjutas paketi vahetusel ja tühistamisel ainult paketi nime, mitte organisatsiooni nelja limiidisveergu (max_workspaces, max_members, max_dynamic_codes, max_scans_per_month). Kuna piirangute rakendamine võtab maksimumi salvestatud väärtusest ja paketi baseline’ist, säilitas madalamale paketile viidud või tühistatud organisatsioon oma vanad, kõrgemad limiidid — downgraadimine oli mõjutu. Webhook määrab nüüd iga tegeliku paketivahetuse korral veerud uue paketi baseline’ile ja tühistamise korral Free-baseline’ile — täpselt nii, nagu admin-haldus juba teeb.
  • Käitumine: Tellimuse (subscription) rutiinsed uuendused (pikendamine, makseviis, proration) ei puuduta endiselt limiite; individuaalselt antud kõrgemad limiidid jäävad muutumatuks. Alles tegelik paketivahetus viib need uue paketi baseline’ile.
  • Mõju: API või vastusevormingu muudatusi ei ole. Organisatsioonid, kelle paketi taset alandati enne seda parandust, säilitavad vanad väärtused, kuni rakendub järgmine paketivahetus või tugi neid kohandab.

2026-08 · Keyset-kursor nüüd kõigil loendi lõpp-punktidel

  • Parandus: Kursori parandus lõpp-punktide GET /v1/codes ja GET /v1/dpp jaoks (vt allpool) on nüüd laiendatud kõigile ülejäänud kursoriga lehekülgedeks jagatud loenditele: GET /v1/qr-codes/:id/comments, /v1/workspaces, /v1/gs1/identifiers, /v1/members, /v1/audit-logs, /v1/admin/orgs, /v1/admin/users ja /v1/webhooks/:id/deliveries. Kõik need lehitsesid ainult välja created_at alusel; identse ajatempliga read (batch-operatsiooni auditisissekanded, veebikonksude korduskatsed, liikmete impordid) võisid järgmisel lehel kaduma minna. Sorteerimisvõtmeks on nüüd igal pool tuupel (created_at, id).
  • API muudatus: Nendes loendites on meta.pagination.next_cursor nüüdsest samuti läbipaistmatu väärtus (base64url) palja ajatempli asemel; loetamatud kursorid tagastavad vastuse 400, vanu ajatempliga kursoreid aktsepteeritakse üleminekuperioodil edasi. Erand on GET /v1/webhooks/:id/deliveries: seal jääb next_cursor viimase kohaletoimetamise ID-ks (tundmatu ID → esimene lehekülg). Kliendid, mis tagastavad väärtuse next_cursor muutmata kujul — Töölaud, CLI, SDK-d, MCP —, ei pea midagi muutma.
  • Mõju: Migratsiooni pole vaja. Kui keegi tundis mõnes neist loenditest (nt auditi logi või kohaletoimetamise logi Töölaual) lehitsemisel puudust mõnest sissekandest: need polnud kunagi kadunud — loendid kuvavad neid nüüdsest täielikult.

2026-08 · Ajatemplid pärast muutmist ja kustutamist taas OpenAPI-ga kooskõlas

  • Parandus: Pärast PATCH /v1/codes/{id} päringut tagastati updated_at SQLite-vormingus ilma ajavööndita (2026-08-17 09:00:00), kuigi OpenAPI-spetsifikatsioon lubab format: date-time ja loomine (POST) tagastab ISO-ajatempli (2026-08-17T09:00:00.000Z). Sama kehtis deleted_at/updated_at kohta pehme kustutamise puhul ning API-võtmete, organisatsioonide, tööruumide (Workspaces), liikmete, kommentaaride ja veebikonksude (Webhooks) muutmise/kustutamise teede puhul, samuti API-võtmete last_used_at ja veebikonksude last_triggered_at puhul. Kõik kirjutusteed kasutavad nüüd ISO 8601 ajatemplit (UTC, T ja Z).
  • Mõju: Kliendid, mis parsivad updated_at väärtust funktsiooniga new Date(...) (SDK-d, CLI, Töölaud), lugesid tühikuga vormingut kui kohalikku aega — CLI näitas korra muudetud koodide puhul aega kohaliku nihke võrra nihutatuna (Viin: −2 h). See on lahendatud. Lisaks normaliseerib andmete migratsioon juba salvestatud vana vorminguga väärtused ISO-vormingusse, et sorteerimine ja võrdlused segatud andmete puhul toimiksid õigesti. Väljade nimesid ega vastuse struktuuri ei muudeta.
  • Taust: Sama veaklass nagu kahel allpool toodud parandusel (API-võtmete aegumine, korduvskannimise piiraeg): SQLite’i datetime('now') kirjutab YYYY-MM-DD HH:MM:SS, kõik ülejäänud kirjutajad ISO 8601. Lähtekoodi kaitsetest (guard-test) hoiab edaspidi ära uued juhtumid.

2026-08 · Loendi pagineerimine ei kaota enam batch-koode

  • Parandus: GET /v1/codes ja GET /v1/dpp pagineerisid varem ainult created_at järgi. Kuid koodid päringutest POST /v1/codes/batch, POST /v1/dpp/batch ja CSV/XLSX-impordist jagavad ühte ajatemplit — niipea kui batch oli suurem kui limit (vaikimisi 20), ei tagastanud teine lehekülg enam sama ajatempliga ülejäänud ridu. Koodid olid olemas ja kättesaadavad päringuga GET /v1/codes/:id, kuid ei ilmunud kunagi loendisse (Töölaud, CLI qr3 list, SDK-d, MCP). Kursor on nüüd võtmekogum (keyset) üle (created_at, id).
  • API muudatus: meta.pagination.next_cursor on nüüdsest läbipaistmatu väärtus (base64url) palja ajatempli asemel. Need, kes edastavad kursori muutmata kujul parameetrina ?cursor= — nagu teevad Töölaud, CLI, kõik SDK-d ja MCP-server —, ei pea midagi muutma. Vanu ajatempli kursoreid aktsepteeritakse üleminekuperioodil edasi; loetamatud kursorid tagastavad nüüd koodi 400, selle asemel et vaikselt esimene lehekülg tagastada.
  • Mõju: Kui nägite pärast batch-importi loendis vähem koode, kui tegelikult loodi: koodid ei olnud kunagi kadunud — loend kuvab neid nüüdsest täielikult. Migreerimine pole vajalik.

2026-08 · Turvalisuse korduvskannimised toimuvad taas 24-tunnise intervalliga

  • Parandus: Siht-URL-ide ja maandumislehtede linkide (Google Web Risk) perioodiline korduvskannimine jättis vahele koodid, mille viimane skannimine toimus samal kalendripäeval kui 24-tunnine piiraeg — olenevalt kellaajast viibis korduvskannimine kuni ühe päeva võrra. Piiraega arvutatakse nüüd samas ISO-vormingus, milles on salvestatud skannimise ajatemplid.
  • Mõju: Siht-URL, mis liigitatakse pärast viimast skannimist ebaturvaliseks, põhjustab taas koodi automaatse peatamise dokumenteeritud 24-tunnise akna jooksul. API või vastuse vormingu muudatusi ei ole.

2026-08 · API-võtmed aeguvad täpselt aegumisajal

  • Parandus: API-võtit, mille expires_at oli samal päeval, aktsepteeriti edasi kuni UTC keskööni. Aegumist võrreldakse nüüd ajatemplina, mitte sõnena — aegunud võti tagastab kohe 401.
  • Taust: expires_at salvestatakse ISO-ajatemplina (2026-08-14T09:00:00Z), kuid võrdluspool andis tühikuga vormingu (2026-08-14 09:00:00). Seetõttu klappis toores sõnevõrdlus ainult siis, kui juba kuupäev oli erinev.
  • Mõju: Migreerimine pole vajalik, päringu GET /v1/api-keys vastuse vorming jääb muutmata. Loetamatuid aegumisväärtusi loetakse nüüd aegunuks, mitte kehtivaks.

2026-08 · API viide: tenandi haldus dokumenteeritud

  • OpenAPI: Spetsifikatsioon — ja seega ka interaktiivne viide — dokumenteerib nüüd organisatsioone (sh GET /v1/organizations/usage), tööruume (Workspaces), liikmeid ja rolle ning auditiloge.
  • Arveldus: Pakettide ülevaade (GET /v1/billing/plans) on avalik; Checkout (POST /v1/billing/checkout) ja Stripe’i kliendiportaal (GET /v1/billing/portal) on määratletud lõpp-punktidena organisatsiooni administraatoritele.
  • Skannimise eksport: Skannimisstatistika (GET /v1/codes/{id}/scans) ja toorandmete eksport (…/scans.csv, …/scans.xlsx) on täielikult dokumenteeritud — sealhulgas GDPR-i märkus: ip_hash ei sisaldu kunagi ekspordis.
  • Vigade käitumine: Uuena on dokumenteeritud ka päringu valideerimise 400-vastus: vastuse keha on töötlemata Zod-viga, mitte RFC-7807 probleemidokument — sellest hoolimata väljastatakse see sisutüübiga application/problem+json.

2026-08 · Avalike faililinkide kopeerimine

  • Dashboard: Koodi detailide lehel olevatel avalikel failidel on nüüd nupp, mis kopeerib nende avaliku lingi lõikelauale – seda saab kohe kasutada QR-koodi siht-URL-ina, kui skannimine peab avama kindla dokumendi failide loendiga maandumislehe asemel.
  • API: Failide lõpp-punktid (/v1/files) tagastavad lisaks välja public_url. Väli on määratud ainult failidel, millel on visibility: public – privaatsed failid avalikku aadressi ei saa.
  • Käitumine: Link ei vaja sisselogimist ja avab faili otse brauseris. Toiming Asenda jätab selle muutmata, nii et selle lingiga trükitud kood jääb kehtima. Üksikasjad: Failid ja andmelehed.

2026-07 · Meeskonna rollid: Kaastööline ilma kustutamisõiguseta ja administraatori arveldus

  • Uus: liikmeroll Kaastööline (kustutamiseta) — loob ja muudab QR-koode, faile ning Digital Product Passports, kuid ei saa midagi kustutada ega API-võtmeid luua. Kõik destruktiivsed lõpp-punktid kontrollivad rolli serveri poolel (403).
  • Arveldus: paketi uuendamised ja Stripe kliendiportaal (POST /v1/billing/checkout, GET /v1/billing/portal) on nüüd reserveeritud organisatsiooni administraatoritele — kõik teised rollid näevad kirjutuskaitstud paketi ülevaadet.
  • Dashboard: toimingud, mida kasutaja roll ei luba, peidetakse: Vaataja ei näe näiteks loomise, muutmise ega kustutamise nuppe; loendid, allalaadimised ja statistika jäävad nähtavaks. Üksikasjad: Meeskond ja rollid.

2026-06 · Välised lingid koodi maandumislehel

  • Maandumisleht: Koodi qr3-majutatud maandumisleht võib nüüd loetleda väliseid, ise majutatud linke ({ label, url }) lisaks üleslaaditud failidele või nende asemel – näiteks andmelehtede jaoks sinu enda saidil.
  • API: POST/PATCH /v1/codes aktsepteerivad massiivi links (0–20 kirjet, http(s), ≤ 2048 märki). Iga URL kontrollitakse teenusega Google Web Risk; ebaturvaline URL tagastab 422. Tühi massiiv kustutab kõik lingid.
  • Dashboard: Linkide lisamine, ümberjärjestamine ja eemaldamine koodi üksikasjade lehel.
  • Turvalisus: Renderdatud lingid jäävad XSS-turvaliseks (escape’itud, ainult http(s)) ja leht säilitab oma noindex päise.

2026-04 · Dashboardi analüütika QR-koodi kohta

  • Dashboard: QR-koodide loendis olev analüütika nupp avab nüüd vastava QR-koodi statistikalehe aadressil /dashboard/codes/{id}.
  • Marsruutimine (Routing): Alias /dashboard/codes suunab endiselt aadressile /dashboard, kuid ei püüa enam kinni detailseid marsruute nagu /dashboard/codes/{id}.
  • API: Detailne leht laeb QR-koodi otse päringuga GET /v1/codes/:id; seetõttu ei sõltu see enam loendi lehekülgede jaotuse (pagination) piirangutest.
  • Testid: Regressioonitestid katavad aliase ümbersuunamist ja koodi otsest laadimist.

2026-04 · Dashboardi kustutamise dialoog QR-koodidele

  • Dashboard: QR-koodide loendis olev prügikasti ikoon avab nüüd brauseri algupärase (native) hüpikakna asemel spetsiaalse Reacti dialoogiakna.
  • Tagasiside: Pärast kustutamist kuvatakse edu või vea kohta teavitustekst (toast-teavitus).
  • Testid: packages/dashboard/tests/dashboard.test.ts hoiab ära regressioonid funktsioonile confirm() QR-koodi kustutamise voos.

2026-04 · Dashboardi lühilingi test dünaamilistele QR-koodidele

  • Dashboard: QR-koodide loendis olevad lühikoodid (shortcodes) on nüüd otse klõpsatavad väliste ümbersuunamislinkidena. Välimise lingi ikoon näiteks koodi wu3qaa kõrval avab aadressi https://qr3.app/{shortCode} uuel vahekaardil.
  • i18n: Lisatud saksa- ja ingliskeelsed vihjetekstid (tooltips).
  • Testid: packages/dashboard/tests/dashboard.test.ts kaitseb lingi href-i, uue vahekaardi käitumist, atribuuti noopener noreferrer ja ikooni regressioonide eest.

2026-04 · Suunamise Workeri marsruut dünaamilistele QR-koodidele

  • Parandus: Dünaamilisi QR-koode aadressil https://qr3.app/{shortCode} töötleb uuesti suunamise Worker (Redirect Worker). Tootmismarsruut (production route) kasutab nüüd mustrit qr3.app/*, kuna Cloudflare Workeri marsruudid ei toeta :code teekonnaparameetreid.
  • Tugevdamine: Mittesobivad teed suunatakse edasi maandumislehe algpunkti (landing origin), et suunamise Worker ei blokeeriks tavalisi lehti nagu /de/pricing.
  • Testid: packages/redirect/tests/unit/redirect.test.ts kontrollib metamärgi (wildcard) marsruuti, lühikoodi töötlemist ja algpunkti edasisuunamist (origin pass-through).

2026-04 · Tööruumi (Workspace) DPP skannimiste ülevaade (Q3.4.2)

  • Uus: GET /v1/workspace/stats/dpp?days=30 — koondab kõik API-võtme tööruumi dpp_scans andmed (active_dpps, scans_by_day, top_dpps koos tootenime/kategooriaga).
  • Dashboard: Kaart avalehel (/dashboard) koos 30 päeva tulpdiagrammiga + edetabelid — paralleelselt QR-koodi kaartidega.
  • Avalik: Turunduse lühilink GET /dpp/dpp_<id> (üks segment) reaalajas demode jaoks, paralleelselt teega /dpp/{gtin}/{serial}.

2026-04 · DPP skannimiste analüütika (Q3.4.1)

  • Uus: GET /v1/dpp/:id/stats?days=30 — avaliku GS1 lahendaja (resolver) koondatud skannimised DPP kohta. Väljad: total_scans, period_scans, scans_by_day, top_countries, top_devices, top_representations.
  • Uus: Tabel dpp_scans (migratsioon 0011) — eraldiseisev tabelist scans (suunamise Worker). IP-aadressid räsivad iga päev roteeruva soolaga (salt), toored IP-aadressid ei jõua kunagi andmebaasi D1.
  • Dashboard: Mini-graafiku kaart (SVG, ilma graafikute teegita) aadressil /dashboard/dpp/:dppId koos 30 päeva tulpade + top 3 jaotustega. Tühja oleku (empty state) vaade, kui DPP on avalik, kuid pole veel skannimisi saanud.

2026-04 · Reaalajas EL-i vastavuse simulaator (Q3.3.7)

  • Uus: POST /v1/dpp/:id/validate-update — simuleerib osalisi värskendusi olekuta (stateless) (olek, turgude loend jne) ilma andmete salvestamiseta. Vastus sisaldab välju eu_compliance + preview.changed_fields.
  • Dashboard: Simulaatori kaart DPP detailvaates (/dashboard/dpp/:dppId) — nupud (chips) riikidele DE/AT/FR/IT/ES/NL + kohandatud, oleku rippmenüü, Preview EU impact / Save changes / Reset. Mitteblokeeriv Remixi useFetcher kaudu.
  • Tugevdamine: Eraldatud simulaatori abifunktsioonid (readUpdatePatchFromForm, marketCountriesKey) + 18 uut üksustesti (unit tests); veaparandus: üksik mitte-ISO sisend ei kustuta enam turgude loendit.

2026-04 · Reaalajas EL-i vastavuse eelvaade loomisvormis (Q3.3.6)

  • Muudetud: POST /v1/dpp/validate tagastab lisaks välja eu_compliance — sama validaator mis GET /v1/dpp/:id/eu-compliance, olekuta (stateless) enne salvestamist.
  • Dashboard: Eelvaade olemasoleva valideerimispaneeli all + uus Save-Guard-bänner enne saatmisnuppe (submit), kui esineb lahendamata vigu/hoiatusi (i18n mitmuse vormid DE/EN).

2026-04 · EL-i validaator + tekstiili kasutajaliides (Q3.3.4 + Q3.3.5)

  • Uus: EL-i vastavuse validaator 5 tekstiilireegliga (TEXTILE_AGEC_REQUIRED, TEXTILE_MICROPLASTICS_CONSISTENCY, TEXTILE_SVHC_THRESHOLD, TEXTILE_GREENWASHING, TEXTILE_ESPR_READY).
  • Uus: GET /v1/dpp/:id/eu-compliance koos väljadega compliant / espr_ready / issues[] / summary.
  • Dashboard: EL-i vastavuse jaotis (EU-Compliance-Section) DPP detailvaates (kokkuvõtte kaardid, rühmitatud probleemide kaardid, ESPR-Ready-märk päises).

2026-04 · Tekstiili DPP skeem (Q3.3.1–Q3.3.3)

  • Uus: Kategooria textile koos kohustusliku AGEC-ahelaga (kudumine/silmkoes valmistamine → värvimine/trükkimine → rõivaste valmistamine), kiu kohta origin_country + recycled_pct, svhc_substances[], ESPR-Opt-in (PEF, kasutusiga, ringlussevõetavus).
  • Uus: Baasväli market_countries: string[] (ISO 3166-1 alpha-2) kõikides DPP kategooriates — juhib Prantsusmaa-spetsiifilisi AGEC-reegleid ja prantsuskeelset kohustuslikku tarbijateavet.
  • Uus: Tarbija HTML-mall koos AGEC mikroplasti hoiatuskastiga, 3-astmelise päritoluahelaga (lipu-mullid), SVHC-loendiga ning vastupidavuse (Durability) ja ringlussevõetavuse (Recyclability) jaotisega.
  • Migratsioon: 0010_dpp_market_countries (D1).

2026-04 · DPP hulgisissevedu (Bulk Import) (Q3.2.1–Q3.2.5)

  • Uus: POST /v1/dpp/import toetab CSV- ja XLSX-vormingut (Worker-ühilduv SheetJS xlsx kaudu, ~283 KB gzip-pakett).
  • Skaleeritud: paketipõhine limiit (Free 100 → Enterprise 10k) + osadeks jaotatud db.batch() à 100 + 5 MB päringu keha (body) limiit.
  • Uus: Veaaruanne CSV-vormingus vastuse 201 väljal errors_csv; GET /v1/dpp/import/templates/:category?format=csv|xlsx pakub valmis malle aku ja tekstiili jaoks.
  • Dashboard: Pukseeri (Drag-and-Drop) üleslaadimine aadressil /dashboard/dpp/import koos malli puhverserveri (template proxy) ja vahetu CSV-allalaadimisega.

Mitte-katkestavad (Non-Breaking) — LTS-laiendused

Kõik ülaltoodud muudatused on additiivsed (lisanduvad):

  • Olemasolevad POST /v1/dpp/validate kliendid ignoreerivad uut välja eu_compliance ilma muudatusteta.
  • Olemasolevad battery vood on muutmata.
  • market_countries on valikuline ja selle vaikeväärtus on [].

Katkestavate muudatuste poliitika kohta vaata API versioonihaldus.