Skip to content

Pakeitimų žurnalas

Pakeitimų žurnalas

Atrinkti svarbiausi pastarųjų leidimų akcentai. Norėdami sužinoti apie pilnas API versijas ir esminių pakeitimų politiką (Breaking-Change-Policy), žr. API versijavimas ir LTS politika.

Išsamūs atskirų galinių taškų (endpoints) pakeitimai: OpenAPI specifikacija ir interaktyvi API nuoroda.


2026-10 · Spalvos valdymo skydelyje

  • Nauja: kodo išsamios informacijos puslapyje yra kortelė Spalvos: priekinis planas ir fonas kaip šešioliktainė reikšmė, permatomas fonas, peržiūra per tikrąjį paveikslėlio maršrutą. Patikra tokia pati kaip PATCH /v1/codes/{id}: kritinėms poroms reikia patvirtinimo, poros, mažesnės nei 1,5:1, neišsaugomos.
  • Atkūrus juodą ant baltos, visi keturi formatai vėl pateikia tuos pačius baitus kaip be spalvų. Kodai be spalvų nesikeičia.
  • Permatomi kodai visose valdymo skydelio peržiūrose rodomi ant šachmatų lentos rašto. Išsamiau: Spalvos valdymo skydelyje.

2026-10 · Spalvos PDF ir EPS

  • Naujiena: qr.pdf ir qr.eps atvaizduoja fg ir bg kaip parametrus ir kaip išsaugotas spalvas. Juoda ir bet kokia pilka spalva įrašomos kaip pilkumo tonai (tik juoda plokštė), bet kuri kita spalva – kaip CMYK sveikaisiais procentais, pavyzdžiui, 1F4E79 kaip C74 M36 Y0 K53.
  • Fonas kaip ir SVG: Kai tik pasirenkama spalva, už kodo ir jo ramybės zonos atsiranda nepermatomas plotas, baltas arba bg. bg=transparent neatvaizduoja jokio fono. Pavadinimas lieka juodas, logotipo plokštė – balta.
  • Jokių pakeitimų be spalvų: Be fg/bg ir be išsaugotų spalvų abu formatai pateikia tuos pačius baitus kaip ir anksčiau. Produkto paso PDF lieka nespalvotas.
  • Apribojimai: nėra ICC profilio, nėra PDF/X. Išsami informacija: Spalvos spaudoje.

2026-09 · Statiniai kodai be nukreipimo talpyklos, lygiagretus trynimas

  • Pakeista: Statiniai kodai nebėra saugomi nukreipimo talpykloje. Iškvietus jų trumpąją nuorodą (redirect_url), visada nuskaitoma naujausia būsena. Todėl po DELETE /v1/account statinis kodas kito iškvietimo metu nebenukreipia, nors anksčiau tai galėjo trukti iki 24 valandų. Plano keitimas statiniams kodams taip pat įsigalioja iš karto. Dinaminiai kodai ištrinami naikinant paskyrą, kaip ir anksčiau. Atspausdinti statiniai kodai tiesiogiai nurodo savo tikslą, todėl jiems tai įtakos neturi.
  • Ištaisyta: Dvi lygiagrečios užklausos DELETE /v1/codes/:id tam pačiam kodui vieną kartą grąžina 200, o kitą kartą – 404. Webhook qr.deleted išsiunčiamas lygiai vieną kartą, anksčiau buvo siunčiamas du kartus.
  • Nauja: POST ir DELETE /v1/codes/:id/logo atsako kodu 409 (errors/conflict), jei kita užklausa tuo pačiu metu pakeitė to paties kodo logotipą, ir tada nieko nekeičia. Anksčiau įkeltas logotipas galėjo likti išsaugotas ir nenaudojamas. Dvi lygiagrečios užklausos DELETE /v1/codes/:id/logo abi grąžina 200. Išsamiau: Logotipas.

2026-09 · TypeScript-SDK 1.2.0

  • Naujiena @qr3/sdk 1.2.0: client.codes.update() priima appearance ir grąžina kontrasto patikros rezultatus kaip issues rezultate; jei išvadų nėra, šio lauko nėra. client.codes.imageUrl() priima fg, bg ir ecc. Kiekvienas kodas, kurį grąžina API (get, list, create, update, batchCreate), turi title ir appearance.
  • Atnaujinimas: npm install @qr3/sdk@latest. Python, Go ir PHP bus vėliau. Išsami informacija: SDK ir CLI ir Spalvų išsaugojimas kode.

2026-09 · Pakeistas galiojimo laikas įsigalioja maždaug per minutę

  • Ištaisyta: Atlikus PATCH užklausą laukui expires_at, dabar išvaloma kodo nukreipimo talpykla. Taigi naujas galiojimo laikas įsigalioja maždaug per minutę, o ne iki 24 valandų vėliau. Anksčiau pašalintas arba atidėtas galiojimo laikas iki 24 valandų toliau grąžindavo 410, o galiojimo laiką nustačius į „dabar“, nukreipimas veikdavo dar iki 24 valandų.
  • Ištaisyta: Kodas, sukurtas su expires_at, nustoja galioti laiku net ir tada, kai galiojimo pabaiga yra per pirmąsias 24 valandas.
  • Ištaisyta: Jei kodas ištrinamas jo logotipo įkėlimo ar pašalinimo metu, POST ir DELETE /v1/codes/:id/logo atsako 404 ir nekeičia ištrinto kodo, kaip jau daro PATCH.
  • Ištaisyta: Statinis kodas, kurio trumpoji nuoroda (redirect_url) buvo iškviesta, taip pat išsaugomas nukreipimo talpykloje. Dabar jį pakeitus, pristabdžius ar ištrynus, talpykla taip pat išvaloma, ne tik dinaminių kodų atveju.

2026-09 · Spalvų išsaugojimas kode

  • Naujiena: PATCH /v1/codes/:id priima appearance su foreground_color ir background_color (#RRGGBB, fonas taip pat gali būti transparent). qr.svg ir qr.png atvaizduoja išsaugotas spalvas be jokių parametrų; užklausos parametras, pavyzdžiui, ?fg=000000, vis tiek turi pirmenybę. PDF ir EPS spalvas atvaizduos tik vėlesnėje versijoje.
  • Kontrasto patikra: Pora, kurios santykis mažesnis nei 1,5:1, grąžina 422. Silpnesnės poros yra išsaugomos ir apie jas pranešama meta.issues kaip apie warning arba critical; permatomas fonas visada yra critical, bet niekada nėra blokuojamas.
  • Sujungimas: Praleisti laukai išlaiko savo išsaugotą reikšmę, null ją anuliuoja. Vienu metu atliekami to paties kodo pakeitimai nebepersirašo vieni ant kitų.
  • Kiekviename kodo atsakyme: appearance yra pateikiamas kiekviename kodo atsakyme bei qr.created ir qr.updated webhook pranešimuose. POST, paketinis apdorojimas ir importavimas jį atmeta su 422.
  • Jokių pakeitimų esamiems kodams: Be išsaugotų spalvų kiekvienas kodas pateikia tuos pačius baitus kaip ir anksčiau. Išsami informacija: Spalvų išsaugojimas kode.

2026-09 · Spalvos ir klaidų taisymas kaip paveikslėlių maršrutų parametrai

  • Nauja: Visi keturi paveikslėlių maršrutai priima fg (priekinio plano spalva), bg (fono spalva arba transparent) ir ecc (klaidų taisymas L, M, Q, H). SVG ir PNG piešia spalvas; PDF ir EPS jas priima, bet pieš tik vėlesniame leidime. ecc veikia visais keturiais formatais, logotipas ir toliau reikalauja H.
  • Skaidrumas: bg=transparent grąžina SVG be fono ir PNG su tikru alfa kanalu. Pagrindas turi būti šviesus ir palikti laisvą ramybės zoną.
  • Niekada ne klaida: Neteisingos reikšmės ignoruojamos; tada paveikslėlis pateikiamas lygiai toks pat kaip be parametro.
  • Talpykla: Kiekvienas pritaikytas parametras pateikia Cache-Control: public, max-age=300 vietoj standartinio paveikslėlio 24 valandų.
  • Jokių pakeitimų be parametrų: Kiekvienas esamas kodas visais keturiais formatais pateikia tuos pačius baitus kaip anksčiau.
  • Prieinama visuose planuose. Išsami informacija: Spalvos ir klaidų taisymas.

2026-09 · PDF ir EPS dabar taip pat įterpia logotipą

  • Išplėtimas: qr.pdf ir qr.eps dabar įterpia nustatytą logotipą lygiai taip pat, kaip qr.svg ir qr.png (žr. žemiau) — kaip įterptą vaizdą (PDF per Image XObject, EPS per vaizdo žodyną PostScript, ten tik su %%LanguageLevel: 3), centruotą tame pačiame plote, su tuo pačiu klaidų taisymo lygio padidinimu iki H. Abu formatai iki šiol logotipo nepateikdavo; tai jau ištaisyta.
  • Talpykla: Su nustatytu logotipu dabar ir qr.pdf bei qr.eps pateikia Cache-Control: public, max-age=300 vietoj įprastų 24 valandų — lygiai taip pat, kaip SVG/PNG.
  • Atsarginis variantas: Jei pačio logotipo vaizdo nepavyksta apdoroti (pavyzdžiui, sugadintas išsaugotas objektas), klaidų taisymas išlieka H, tačiau rezervuotas plotas lieka tuščias vietoj vaizdo — niekada nekyla serverio klaida.
  • Jokių elgsenos pokyčių be logotipo: Kodai be logotipo ir toliau pateikia baitų atžvilgiu identiškus qr.pdf/qr.eps su nepakeista 24 valandų talpykla.
  • Informacija ir spausdinimo patarimai: Logotipas QR kode.

2026-09 · Logotipas QR kode — Valdymo skydelis ir API

  • Nauja: Kodas dabar gali turėti logotipą viduryje. Valdymo skydelis kodo detalių puslapyje sukuria atskirą logotipo kortelę: Pasirinkti logotipą, pridedant pirmą kartą arba šalinant patvirtinti įspėjimą su privaloma varnele (abu veiksmai keičia taškų šabloną), tada Įkelti logotipą/Pašalinti logotipą. Pakeitimui patvirtinimo nereikia — pasikeičia tik paveikslėlis, o ne šablonas. Rolė viewer mato būseną ir peržiūrą, bet neatlieka nė vieno iš trijų veiksmų.
  • API: POST /v1/codes/{id}/logo (daugiaveislis laukas file; PNG, JPEG arba WebP, ne daugiau kaip 1 MB, SVG atmetamas) sukuria arba pakeičia logotipą; DELETE /v1/codes/{id}/logo jį vėl pašalina ir yra idempotentiškas. Per didelis paveikslėlis grąžina 413, nepalaikomas formatas — 422, rolė viewer — 403.
  • Atvaizdavimas: qr.svg ir qr.png įterpia logotipą kaip tikrus pikselius (512 × 512, normalizuotas) ir tam padidina klaidų taisymą iki H. Pridėjimas ir pašalinimas taip pakeičia taškų šabloną (M ↔ H), o pakeitimas — ne. qr.pdf ir qr.eps neįterpia jokio logotipo ir lieka nepakeisti. Jau atspausdintas kodas bet kuriuo atveju veikia toliau, nes užkoduotas tikslas nepriklauso nuo logotipo — iš naujo spausdinti reikia tik tiems, kurie nori matyti (naują) logotipo išvaizdą ir ant medžiagos, bei neturėtų maišyti senų ir naujų spaudos failų.
  • Talpykla: Kai logotipas nustatytas, qr.svg ir qr.png grąžina Cache-Control: public, max-age=300 vietoj įprastų 24 valandų. Informacija, ribinės vertės ir spausdinimo nurodymai: Logotipas QR kode.

2026-08 · operationId visoms 75 operacijoms ir „kada naudoti“ instrukcija agentams

  • Papildymas: Visos 75 OpenAPI specifikacijos operacijos dabar turi operationId — listCodes, createCode, getCodeStats, archiveWorkspace ir taip toliau. Iki šiol šio lauko visiškai nebuvo, todėl kiekvienas generatorius turėjo išvesti metodo pavadinimą iš HTTP metodo ir kelio (postV1Codes). Tokie pavadinimai priklauso nuo kelio ir keičiasi su kiekviena kelio rekonstrukcija. Pavadinimo forma visose 75 vietose yra vienoda: list/get/create/update/replace/delete, kitu atveju – verslo veiksmo veiksmažodis (validateDpp, registerGs1Identifier, pingWebhook). Veiksmažodis atitinka verslo logiką, o ne HTTP metodą — archiveWorkspace yra DELETE, importDpps yra POST.
  • Poveikis pačių sugeneruotiems klientams: Tie, kurie generuoja savo SDK iš specifikacijos, kito paleidimo metu gaus pervadintus metodus (postV1Codes → createCode). Tai yra šio pakeitimo tikslas, tačiau tai yra pervadinimas svetimame kode — todėl čia tai aiškiai paminėta. Keliai, parametrai, atsakymų formos ir būsenos kodai lieka nepakeisti; oficialiems SDK, CLI ir MCP serveriams tai įtakos neturi.
  • Agentų įvadas: https://qr3.app/llms.txt turi skiltį ## When to use qr3.app — šešios užduotys vietoj šešių funkcijų, taip pat sakinys, kam qr3.app nėra tinkamas įrankis. Tą pačią informaciją dabar pateikia MCP serveris rankos paspaudimo metu: initialize užklausa į https://mcp.qr3.app/mcp atsako su lauku instructions (anksčiau: vienuolika įrankių be jokio suskirstymo). Taip pat nurodyta, kuriems iškvietimams reikalingas API raktas — initialize ir tools/list nereikia, o kiekvienam tools/call reikia.
  • Klaidų taisymai llms.txt: Keturi teiginiai buvo patikrinti gamybinėje aplinkoje ir nepasitvirtino: (1) Python SDK qr3app nėra paskelbtas PyPI — pip install eilutė pašalinta be pakeitimo; (2) Accept: text/markdown galioja pagrindiniam puslapiui ir tinklaraščiui, o ne kiekvienam serverio pusėje sugeneruotam puslapiui; (3) kontaktinis adresas yra [email protected], taip pat ir pagrindinio puslapio JSON-LD; (4) /de/security/ yra nukreipimas į inkarą, o ne atskiras puslapis. Nauja nuoroda: docs.qr3.app/de/skills/.
  • Apsauga: Trys teiginiai openapi-spec.test.ts faile — išsamumas, unikalumas, lowerCamelCase —, kiekvienas patikrintas mutacija. Dar devyni testai užfiksuoja keturis ištaisytus duomenis, kad jie vėl nepasikartotų.
  • Žinomas apribojimas: Dvi iš 75 operacijų yra aprašytos specifikacijoje, tačiau grąžina 404 (GET /v1/codes/{id}/stats ir GET /v1/account). Čia jos gavo pavadinimą ir vėl jį praras, kai tik bus nuspręsta, ar jos bus sukurtos, ar pašalintos.

2026-08 · Tarifų planų sumažinimai ir atšaukimai dabar veikia ir limitus

  • Ištaisyta: Stripe webhook keičiant planą ar jį atšaukiant įrašydavo tik plano pavadinimą, bet ne keturis organizacijos limitų stulpelius (max_workspaces, max_members, max_dynamic_codes, max_scans_per_month). Kadangi taikant ribojimus imama didžiausia reikšmė iš išsaugotos vertės ir bazinio plano lygio, plano lygį sumažinusi arba narystę nutraukusi organizacija išlaikydavo savo senus, didesnius limitus – plano sumažinimas neturėjo jokio poveikio. Dabar webhook kiekvieno tikro plano keitimo metu nustato stulpelių reikšmes pagal naujojo tarifo bazinį lygį, o atšaukimo atveju – pagal nemokamo plano bazinį lygį – lygiai taip pat, kaip tai jau daro administratoriaus valdymas.
  • Elgsena: Įprasti prenumeratos atnaujinimai (pratęsimas, mokėjimo priemonė, proporcingas perskaičiavimas) ir toliau nekeičia limitų; individualiai suteikti didesni limitai išlieka nepakitę. Tik tikras plano pakeitimas nustato juos pagal naujojo tarifo bazinį lygį.
  • Poveikis: Jokių API ar atsakymo formato pakeitimų. Organizacijos, kurių plano lygis buvo sumažintas prieš šį ištaisymą, išlaiko senąsias reikšmes, kol įsigalios kitas plano pakeitimas arba pagalbos tarnyba jas pakoreguos.

2026-08 · Keyset žymeklis (cursor) dabar visuose sąrašų galiniuose taškuose

  • Ištaisyta: Žymeklio (cursor) pataisymas, skirtas GET /v1/codes ir GET /v1/dpp (žr. žemiau), dabar pritaikytas visiems likusiems pagal žymeklį puslapiuojamiems sąrašams: GET /v1/qr-codes/:id/comments, /v1/workspaces, /v1/gs1/identifiers, /v1/members, /v1/audit-logs, /v1/admin/orgs, /v1/admin/users ir /v1/webhooks/:id/deliveries. Visi jie buvo puslapiuojami tik pagal created_at; eilutės su identiška laiko žyma (grupinių operacijų audito įrašai, pakartotiniai webhook bandymai, narių importavimas) kitame puslapyje galėjo būti prarastos. Rūšiavimo raktas dabar visur yra kortežas (created_at, id).
  • API pakeitimas: Šiuose sąrašuose meta.pagination.next_cursor nuo šiol taip pat yra nepermatoma reikšmė (base64url), o ne tiesioginė laiko žyma; neįskaitomi žymekliai grąžina 400, o seni laiko žymos žymekliai laikinai bus priimami toliau. Išimtis GET /v1/webhooks/:id/deliveries: čia next_cursor lieka paskutinio pristatymo ID (nežinomas ID → pirmas puslapis). Klientams, kurie grąžina next_cursor nepakeistą — Valdymo skydelis, CLI, SDKs, MCP —, nieko keisti nereikia.
  • Poveikis: Migracija nereikalinga. Jei kuriame nors iš šių sąrašų (pvz., audito žurnale arba pristatymo žurnale valdymo skydelyje) vartydami puslapius pasigedote įrašų: jie niekur nebuvo dingę — nuo šiol sąrašai juos rodo visus.

2026-08 · Laiko žymos po redagavimo ir trynimo vėl atitinka OpenAPI

  • Ištaisyta: Atlikus PATCH /v1/codes/{id}, updated_at buvo grąžinama SQLite formatu be laiko juostos (2026-08-17 09:00:00), nors OpenAPI specifikacija numato format: date-time, o sukūrimas (POST) pateikia ISO laiko žymą (2026-08-17T09:00:00.000Z). Tas pats galiojo deleted_at/updated_at švelnaus trynimo (Soft-Delete) atveju, taip pat API raktų, organizacijų, darbo sričių (Workspaces), narių, komentarų ir webhook redagavimo bei trynimo keliams, be to, API raktų laukui last_used_at ir webhook laukui last_triggered_at. Visi rašymo keliai dabar žymi laiką ISO 8601 formatu (UTC, T ir Z).
  • Poveikis: Klientai, kurie analizuoja updated_at naudodami new Date(...) (SDKs, CLI, Valdymo skydelis), tarpų formatą skaitė kaip vietos laiką — CLI rodė bent kartą redaguotų kodų laiką, pastumtą per vietinį poslinkį (Viena: −2 h). Tai ištaisyta. Be to, duomenų migracija normalizuoja jau išsaugotas senojo formato vertes į ISO, kad rūšiavimas ir palyginimai mišriuose rinkiniuose būtų teisingi. Jokių laukų pavadinimų ar atsakymo struktūros pakeitimų.
  • Kontekstas: Tokia pati klaidų klasė kaip ir du toliau pateikti pataisymai (API raktų galiojimo pabaiga, pakartotinio skenavimo riba): SQLite datetime('now') įrašo YYYY-MM-DD HH:MM:SS, o visi kiti rašymo keliai – ISO 8601. Ateityje naujiems atvejams užkirs kelią pirminio kodo apsaugos testas.

2026-08 · Sąrašų puslapiavimas nebepraranda grupinių kodų

  • Ištaisyta: GET /v1/codes ir GET /v1/dpp puslapiavo tik pagal created_at. Tačiau kodai iš POST /v1/codes/batch, POST /v1/dpp/batch ir CSV/XLSX importo dalijasi viena laiko žyma — kai tik grupė buvo didesnė nei limit (numatytoji reikšmė 20), antrasis puslapis nebegrąžindavo likusių tos pačios laiko žymos eilučių. Kodai egzistavo ir buvo pasiekiami per GET /v1/codes/:id, tačiau sąraše (Valdymo skydelis, CLI qr3 list, SDK, MCP) niekada nepasirodydavo. Dabar žymeklis yra raktų rinkinys (keyset) pagal (created_at, id).
  • API pakeitimas: nuo šiol meta.pagination.next_cursor yra nepermatoma (opaque) reikšmė (base64url), o ne tiesioginė laiko žyma. Tiems, kurie grąžina nepakeistą žymeklį kaip ?cursor= — kaip daro Valdymo skydelis, CLI, visi SDK ir MCP serveris — nieko keisti nereikia. Senieji laiko žymos žymekliai laikinai bus priimami toliau; neįskaitomi žymekliai dabar grąžina 400, užuot tyliai pateikę pirmąjį puslapį.
  • Poveikis: Jei po grupinio importavimo sąraše matėte mažiau kodų, nei buvo sukurta: kodai niekur nebuvo dingę — nuo šiol sąrašas juos rodo visus. Migracija nereikalinga.

2026-08 · Saugumo pakartotinis skenavimas vėl vyksta kas 24 valandas

  • Ištaisyta: Periodinis tikslinių URL adresų ir nukreipimo puslapių nuorodų pakartotinis skenavimas (Google Web Risk) praleisdavo kodus, kurių paskutinis skenavimas buvo tą pačią kalendorinę dieną kaip ir 24 valandų riba — priklausomai nuo paros laiko, pakartotinis skenavimas vėluodavo iki papildomos paros. Riba dabar skaičiuojama tuo pačiu ISO formatu, kuriuo saugomos skenavimo laiko žymos.
  • Poveikis: Tikslinis URL adresas, kuris po paskutinio skenavimo klasifikuojamas kaip nesaugus, vėl sukelia automatinį kodo pristabdymą per dokumentuotą 24 valandų langą. API ar atsakymo formato pakeitimų nėra.

2026-08 · API raktai nustoja galioti pasibaigus jų galiojimo laikui

  • Ištaisyta: API raktas, kurio expires_at buvo tą pačią dieną, buvo priimamas iki vidurnakčio UTC. Galiojimo pabaiga dabar lyginama kaip laiko žyma, o ne kaip simbolių eilutė – pasibaigusio galiojimo raktas iškart grąžina 401.
  • Kontekstas: expires_at saugomas kaip ISO laiko žyma (2026-08-14T09:00:00Z), o palyginamoji pusė pateikdavo formatą su tarpu (2026-08-14 09:00:00). Todėl tiesioginis simbolių eilučių palyginimas buvo teisingas tik tol, kol skyrėsi pati data.
  • Poveikis: Migracija nereikalinga, GET /v1/api-keys atsakymo formatas lieka nepakitęs. Neįskaitomos galiojimo pabaigos reikšmės dabar laikomos pasibaigusiomis, o ne galiojančiomis.

2026-08 · API nuoroda: Tenant valdymas dokumentuotas

  • OpenAPI: Specifikacija — o kartu ir interaktyvi nuoroda — dabar dokumentuoja organizacijas (įsk. GET /v1/organizations/usage), darbo sritis (Workspaces), narius ir roles bei audito žurnalus (Audit-Logs).
  • Billing: Planų apžvalga (GET /v1/billing/plans) yra vieša; Checkout (POST /v1/billing/checkout) ir Stripe klientų portalas (GET /v1/billing/portal) yra nurodyti kaip galiniai taškai organizacijos administratoriams.
  • Nuskaitymų eksportas: Nuskaitymų statistika (GET /v1/codes/{id}/scans) ir neapdorotų duomenų eksportas (…/scans.csv, …/scans.xlsx) yra visiškai dokumentuoti — įskaitant BDAR pranešimą: ip_hash niekada neįtraukiamas į eksportą.
  • Klaidų elgsena: Taip pat naujai dokumentuotas užklausos patvirtinimo 400 atsakymas: pranešimo turinys (body) yra neapdorota Zod klaida, o ne RFC-7807 problemos dokumentas — vis dėlto jis pateikiamas su Content-Type application/problem+json.

2026-08 · Viešųjų failų nuorodų kopijavimas

  • Valdymo skydelis: Vieši failai kodo išsamios informacijos puslapyje dabar turi mygtuką, kuris nukopijuoja jų viešąją nuorodą į iškarpinę. Ją galima iškart naudoti kaip QR kodo tikslo URL, kai nuskaičius kodą turi atsidaryti konkretus dokumentas, o ne nukreipimo puslapis su failų sąrašu.
  • API: Failų galiniai taškai (/v1/files) papildomai grąžina public_url. Šis laukas užpildomas tik failams su visibility: public – privatūs failai viešo adreso negauna.
  • Elgsena: Nuoroda veikia be prisijungimo ir atidaro failą tiesiai naršyklėje. Failą pakeitus funkcija Pakeisti, nuoroda nesikeičia, todėl su ja atspausdintas kodas lieka galioti. Išsamiau: Failai ir duomenų lapai.

2026-07 · Komandos vaidmenys: bendradarbiai be šalinimo teisės ir administratoriaus atsiskaitymas

  • Nauja: nario vaidmuo Bendradarbis (be šalinimo) — kuria ir redaguoja QR kodus, failus bei Digital Product Passports, tačiau negali nieko šalinti ar kurti API raktų. Visi destruktyvūs programinės sąsajos taškai tikrina vaidmenį serverio pusėje (403).
  • Atsiskaitymas: plano keitimas ir Stripe klientų portalas (POST /v1/billing/checkout, GET /v1/billing/portal) dabar yra prieinami tik organizacijos administratoriams — visiems kitiems vaidmenims rodoma tik skaitoma plano apžvalga.
  • Valdymo skydelis: veiksmai, kurių neleidžia naudotojo vaidmuo, yra paslepiami: pavyzdžiui, Žiūrovas nemato kūrimo, redagavimo ar šalinimo mygtukų, tačiau sąrašai, atsisiuntimai ir statistika lieka matomi. Išsamiau: Komanda ir vaidmenys.

2026-06 · Išorinės nuorodos kodo nukreipimo puslapyje

  • Nukreipimo puslapis: qr3 talpinamas kodo nukreipimo puslapis dabar gali pateikti išorines, savarankiškai talpinamas nuorodas ({ label, url }) kartu su įkeltais failais arba vietoj jų – pavyzdžiui, techninių duomenų lapams jūsų pačių svetainėje.
  • API: POST/PATCH /v1/codes priima masyvą links (0–20 įrašų, http(s), ≤ 2048 simbolių). Kiekvienas URL tikrinamas naudojant „Google Web Risk“; nesaugus URL grąžina 422. Tuščias masyvas pašalina visas nuorodas.
  • Valdymo skydelis: Pridėkite, pertvarkykite ir pašalinkite nuorodas kodo informacijos puslapyje.
  • Sauga: Atvaizduotos nuorodos lieka apsaugotos nuo XSS (su kaitos ženklais, tik http(s)), o puslapis išsaugo savo noindex antraštę.

2026-04 · Valdymo skydelio analitika kiekvienam QR kodui

  • Valdymo skydelis: Analitikos mygtukas QR kodų sąraše dabar atidaro atitinkamo QR kodo statistikos puslapį adresu /dashboard/codes/{id}.
  • Routing: Alternatyvus adresas (alias) /dashboard/codes ir toliau nukreipia į /dashboard, tačiau nebeperima detalių maršrutų, tokių kaip /dashboard/codes/{id}.
  • API: Detalusis puslapis įkelia QR kodą tiesiogiai per GET /v1/codes/:id; dėl to jis nebėra priklausomas nuo sąrašo puslapiavimo (pagination) ribojimų.
  • Testai: Regresijos testai apima alternatyvaus adreso nukreipimą (alias redirect) ir tiesioginį kodo įkėlimą.

2026-04 · QR kodų trynimo dialogas valdymo skydelyje

  • Valdymo skydelis: Šiukšliadėžės piktograma QR kodų sąraše dabar atidaro atskirą React dialogą, o ne naršyklės iššokantį langą (popup).
  • Feedback: Ištrynus pasirodo iškylantysis pranešimas (toast) apie sėkmę arba klaidą.
  • Testai: packages/dashboard/tests/dashboard.test.ts apsaugo nuo regresijų naudojant confirm() QR kodo trynimo sraute.

2026-04 · Trumpųjų nuorodų testas dinaminiams QR kodams valdymo skydelyje

  • Valdymo skydelis: Trumpieji kodai (shortcodes) QR kodų sąraše dabar yra tiesiogiai spustelėjami als išorinės nukreipimo nuorodos. Išorinės nuorodos piktograma šalia, pvz., wu3qaa, atidaro https://qr3.app/{shortCode} naujame skirtuke.
  • i18n: Pridėti patarimų (tooltip) tekstai vokiečių ir anglų kalbomis.
  • Testai: packages/dashboard/tests/dashboard.test.ts apsaugo nuorodos „href“, naujo skirtuko elgseną, noopener noreferrer ir piktogramą nuo regresijų.

2026-04 · Nukreipimo Worker maršrutas dinaminiams QR kodams

  • Ištaisyta: Dinaminius QR kodus adresu https://qr3.app/{shortCode} vėl apdoroja nukreipimo Worker. Gamybinis (production) maršrutas dabar naudoja qr3.app/*, nes Cloudflare Worker maršrutai nepalaiko :code kelio parametrų.
  • Sustiprinimas: Neatitinkantys keliai perduodami į pradinę svetainę (landing origin), kad nukreipimo Worker neblokuotų įprastų puslapių, tokių kaip /de/pricing.
  • Testai: packages/redirect/tests/unit/redirect.test.ts tikrina pakaitos simbolio (wildcard) maršrutą, trumpojo kodo apdorojimą ir pradinės svetainės praleidimą (origin pass-through).

2026-04 · Darbo srities DPP nuskaitymų apžvalga (Q3.4.2)

  • Nauja: GET /v1/workspace/stats/dpp?days=30 — agreguoja visus API rakto darbo srities (workspace) dpp_scans (active_dpps, scans_by_day, top_dpps su produkto pavadinimu / kategorija).
  • Valdymo skydelis: Kortelė pradiniame puslapyje (/dashboard) su 30 dienų stulpeline diagrama + populiariausių sąrašais — lygiagrečiai su QR kodo kortelėmis.
  • Public: Rinkodaros trumpoji nuoroda GET /dpp/dpp_<id> (vienas segmentas) tiesioginėms demonstracijoms, lygiagrečiai su /dpp/{gtin}/{serial}.

2026-04 · DPP nuskaitymų analitika (Q3.4.1)

  • Nauja: GET /v1/dpp/:id/stats?days=30 — agreguoti viešojo GS1 atpažintuvo (resolver) nuskaitymai vienam DPP. Laukai: total_scans, period_scans, scans_by_day, top_countries, top_devices, top_representations.
  • Nauja: Lentelė dpp_scans (migracija 0011) — atskirta nuo scans (nukreipimo Worker). IP adresai maišomi (hashed) naudojant kasdien keičiamą druską (salt), neapdoroti IP adresai niekada nepasiekia D1.
  • Valdymo skydelis: Mini diagramos kortelė (SVG, nenaudojant diagramų bibliotekos) adresu /dashboard/dpp/:dppId su 30 dienų stulpeliais + 3 populiariausių pasiskirstymais. Tuščia būsena (empty-state), kai tik DPP yra paskelbtas, bet dar neturėjo nuskaitymų.

2026-04 · Tiesioginis ES atitikties simuliatorius (Q3.3.7)

  • Nauja: POST /v1/dpp/:id/validate-update — simuliuoja dalinius atnaujinimus be būsenos išsaugojimo (stateless) (būsena, rinkų sąrašas, …) be išliekamumo. Atsakyme yra eu_compliance + preview.changed_fields.
  • Valdymo skydelis: Simuliatoriaus kortelė detaliame DPP puslapyje (/dashboard/dpp/:dppId) — žymos (chips) skirtos DE/AT/FR/IT/ES/NL + pasirinktinėms, būsenos išskleidžiamasis sąrašas, Preview EU impact / Save changes / Reset. Neblokuojantis veikimas per Remix useFetcher.
  • Sustiprinimas: Iškelti simuliatoriaus pagalbiniai įrankiai (helpers) (readUpdatePatchFromForm, marketCountriesKey) + 18 naujų vienetų testų (unit tests); klaidų pataisymas: vienišas ne ISO įvesties laukas nebeištrina rinkų sąrašo.

2026-04 · Tiesioginė ES atitikties peržiūra kūrimo formoje (Q3.3.6)

  • Pakeista: POST /v1/dpp/validate papildomai pateikia eu_compliance — tas pats tikrintuvas (validator) kaip ir GET /v1/dpp/:id/eu-compliance, veikiantis be būsenos išsaugojimo (stateless) prieš išsaugant.
  • Valdymo skydelis: Peržiūra po esamu patvirtinimo skydeliu + naujas apsauginis išsaugojimo skydelis (Save-Guard-Banner) prieš pateikimo mygtukus, jei yra klaidų / įspėjimų (i18n daugiskaitos formos DE/EN).

2026-04 · ES tikrintuvas + tekstilės vartotojo sąsaja (Q3.3.4 + Q3.3.5)

  • Nauja: ES atitikties tikrintuvas (EU-Compliance-Validator) su 5 tekstilės taisyklėmis (TEXTILE_AGEC_REQUIRED, TEXTILE_MICROPLASTICS_CONSISTENCY, TEXTILE_SVHC_THRESHOLD, TEXTILE_GREENWASHING, TEXTILE_ESPR_READY).
  • Nauja: GET /v1/dpp/:id/eu-compliance su compliant / espr_ready / issues[] / summary.
  • Valdymo skydelis: ES atitikties skiltis detaliame DPP puslapyje (suvestinės kortelės, sugrupuotos problemų kortelės, ESPR-Ready ženklelis antraštėje).

2026-04 · Tekstilės DPP schema (Q3.3.1–Q3.3.3)

  • Nauja: Kategorija textile su privaloma AGEC grandine (audimas / mezgimas → dažymas / spausdinimas → siuvimas / konfekcija), kiekvienam pluoštui origin_country + recycled_pct, svhc_substances[], ESPR-Opt-in (PEF, tarnavimo laikas, Recyclability).
  • Nauja: Bazinis laukas market_countries: string[] (ISO 3166-1 alpha-2) visose DPP kategorijose — valdo Prancūzijai būdingas AGEC taisykles ir privalomą prancūzišką pastabą vartotojui.
  • Nauja: Vartotojo HTML šablonas su AGEC mikroplastiko įspėjamuoju laukeliu, 3 pakopų kilmės grandine (vėliavėlių žymekliais), SVHC sąrašu, Durability ir Recyclability skiltimis.
  • Migracija: 0010_dpp_market_countries (D1).

2026-04 · Masinis DPP importas (Q3.2.1–Q3.2.5)

  • Nauja: POST /v1/dpp/import priima CSV ir XLSX (suderinama su Worker per SheetJS xlsx, ~283 KB gzip paketas).
  • Skaliuojama: planu pagrįstas limitas (Free 100 → Enterprise 10k) + suskaidytas db.batch() po 100 + 5 MB užklausos kūno (body) limitas.
  • Nauja: Klaidų ataskaita kaip CSV atsakymo 201 lauke errors_csv; GET /v1/dpp/import/templates/:category?format=csv|xlsx pateikia paruoštus šablonus baterijoms ir tekstilei.
  • Valdymo skydelis: Failų vilkimo ir nuleidimo (drag-and-drop) įkėlimas adresu /dashboard/dpp/import su šablonų tarpiniu serveriu (proxy) ir tiesioginiu CSV atsisiuntimu.

Neesminiai pakeitimai (Non-Breaking) — LTS išplėtimai

Visi aukščiau išvardyti pakeitimai yra papildomi:

  • Esami POST /v1/dpp/validate klientai ignoruoja naują eu_compliance lauką be jokių pakeitimų.
  • Esami battery srautai lieka nepakeisti.
  • market_countries yra neprivalomas ir jo numatytoji reikšmė yra [].

Žr. API versijavimas dėl esminių pakeitimų politikos (Breaking-Change-Policy).