Changelog
Changelog
Vybrané najdôležitejšie zmeny z posledných verzií. Pre úplné verzie API a pravidlá pre spätne nekompatibilné zmeny (Breaking-Change-Policy) si pozrite Verziovanie API & LTS pravidlá.
Podrobné zmeny jednotlivých endpointov: Špecifikácia OpenAPI a interaktívna API referencia.
2026-08 · Keyset kurzor teraz na všetkých zoznamových endpointoch
- Oprava: Oprava kurzora pre
GET /v1/codesaGET /v1/dpp(pozri nižšie) je teraz nasadená na všetky ostatné zoznamy s pagináciou pomocou kurzora:GET /v1/qr-codes/:id/comments,/v1/workspaces,/v1/gs1/identifiers,/v1/members,/v1/audit-logs,/v1/admin/orgs,/v1/admin/usersa/v1/webhooks/:id/deliveries. Všetky doteraz stránkovali iba na základecreated_at; riadky s identickou časovou pečiatkou (záznamy auditu z dávkovej operácie, opakované pokusy webhookov, importy členov) sa mohli na nasledujúcej stránke stratiť. Kľúčom na triedenie je teraz všade n-tica(created_at, id). - Zmena API: V týchto zoznamoch je
meta.pagination.next_cursorodteraz taktiež nepriehľadná hodnota (base64url) namiesto čistej časovej pečiatky; nečitateľné kurzory vracajú400, staré kurzory s časovou pečiatkou budú prechodne naďalej akceptované. Výnimkou jeGET /v1/webhooks/:id/deliveries: tam zostávanext_cursorID posledného doručenia (neznáme ID → prvá stránka). Klienti, ktorí vracajúnext_cursornezmenený — Dashboard, CLI, SDKs, MCP —, nemusia nič meniť. - Dopad: Nie je potrebná žiadna migrácia. Ak vám pri prechádzaní v niektorom z týchto zoznamov (napr. audit log alebo log doručení v Dashboarde) chýbali položky: Nikdy nezmizli — zoznamy ich odteraz zobrazujú kompletne.
2026-08 · Časové pečiatky po úprave a vymazaní opäť v súlade s OpenAPI
- Oprava: Po
PATCH /v1/codes/{id}saupdated_atvracal vo formáte SQLite bez časového pásma (2026-08-17 09:00:00), hoci špecifikácia OpenAPI sľubujeformat: date-timea vytvorenie (POST) poskytuje časovú pečiatku ISO (2026-08-17T09:00:00.000Z). To isté platilo predeleted_at/updated_atpri soft-delete, ako aj pre cesty úpravy/vymazania API kľúčov, organizácií, workspacov, členov, komentárov a webhookov, a navyše prelast_used_atAPI kľúčov alast_triggered_atwebhookov. Všetky zapisovacie cesty teraz ukladajú čas podľa ISO 8601 (UTC,TaZ). - Dopad: Klienti, ktorí parsujú
updated_atpomocounew Date(...)(SDKs, CLI, Dashboard), čítali formát s medzerou ako miestny čas — CLI zobrazovalo pri raz upravených kódoch čas posunutý o lokálny offset (Viedeň: −2 h). Toto je opravené. Okrem toho migrácia dát normalizuje už uložené hodnoty v starom formáte na ISO, aby triedenie a porovnávanie v zmiešaných záznamoch fungovalo správne. Žiadna zmena v názvoch polí ani v štruktúre odpovede. - Pozadie: Rovnaká trieda chýb ako pri dvoch opravách nižšie (expirácia API kľúča, cutoff re-scanu): funkcia
datetime('now')v SQLite zapisujeYYYY-MM-DD HH:MM:SS, zatiaľ čo všetci ostatní zapisovatelia používajú ISO 8601. Test v zdrojovom kóde (guard test) v budúcnosti zabráni novému výskytu tejto chyby.
2026-08 · Stránkovanie zoznamov už nestráca batch kódy
- Oprava:
GET /v1/codesaGET /v1/dppstránkovali iba na základecreated_at. Kódy zPOST /v1/codes/batch,POST /v1/dpp/batcha CSV/XLSX importu však zdieľajú jednu časovú pečiatku — akonáhle bol batch väčší akolimit(predvolene 20), druhá stránka už nevrátila zostávajúce riadky s rovnakou časovou pečiatkou. Kódy existovali a boli dostupné cezGET /v1/codes/:id, ale v zozname (Dashboard, CLIqr3 list, SDKs, MCP) sa nikdy neobjavili. Kurzor je teraz keyset nad(created_at, id). - Zmena API:
meta.pagination.next_cursorje odteraz nepriehľadná hodnota (base64url) namiesto čistej časovej pečiatky. Tí, ktorí vracajú kurzor nezmenený ako?cursor=— tak ako to robí Dashboard, CLI, všetky SDKs a MCP server — nemusia nič meniť. Staré kurzory s časovou pečiatkou budú prechodne naďalej akceptované; nečitateľné kurzory teraz vrátia400namiesto tichého vrátenia prvej stránky. - Dopad: Ak ste po batch importe videli v zozname menej kódov, než ich bolo vytvorených: Kódy sa nikdy nestratili — zoznam ich odteraz zobrazuje kompletne. Nie je potrebná žiadna migrácia.
2026-08 · Bezpečnostné re-scany opäť bežia v 24-hodinovom cykle
- Oprava: Periodické opätovné skenovanie cieľových URL a odkazov na vstupnej stránke (Google Web Risk) vynechávalo kódy, ktorých posledný sken bol v rovnaký kalendárny deň ako 24-hodinový cutoff — v závislosti od času sa opätovný sken oneskoril až o ďalší deň. Cutoff sa teraz počíta v rovnakom ISO formáte, v akom sú uložené časové pečiatky skenov.
- Dopad: Cieľová URL, ktorá je po poslednom skene vyhodnotená ako nebezpečná, opäť vedie k automatickému pozastaveniu kódu v rámci zdokumentovaného 24-hodinového okna. Žiadna zmena API alebo formátu odpovede.
2026-08 · API kľúče vypršia presne v čase expirácie
- Oprava: API kľúč, ktorého
expires_atbol v rovnaký deň, bol akceptovaný až do polnoci UTC. Expirácia sa teraz porovnáva ako časová pečiatka namiesto reťazca — expirovaný kľúč okamžite vráti401. - Pozadie:
expires_atsa ukladá ako ISO časová pečiatka (2026-08-14T09:00:00Z), porovnávacia strana poskytovala formát s medzerou (2026-08-14 09:00:00). Porovnanie surových reťazcov preto fungovalo správne iba vtedy, ak sa líšil už samotný dátum. - Dopad: Nie je potrebná žiadna migrácia, formát odpovede z
GET /v1/api-keyszostáva nezmenený. Nečitateľné hodnoty expirácie sa teraz považujú za expirované namiesto platných.
2026-08 · API referencia: Správa tenantov zdokumentovaná
- OpenAPI: Špecifikácia — a tým pádom aj interaktívna referencia — teraz dokumentuje organizácie (vrátane
GET /v1/organizations/usage), workspacy, členov & roly a auditovacie logy. - Billing: Prehľad programov (
GET /v1/billing/plans) je verejný; checkout (POST /v1/billing/checkout) a zákaznícky portál Stripe (GET /v1/billing/portal) sú označené ako endpointy pre administrátorov organizácie. - Export skenov: Štatistiky skenov (
GET /v1/codes/{id}/scans) a export surových dát (…/scans.csv,…/scans.xlsx) sú plne zdokumentované — vrátane upozornenia týkajúceho sa GDPR:ip_hashnie je nikdy súčasťou exportu. - Spracovanie chýb: Novo zdokumentovaná je aj odpoveď
400pri validácii požiadavky: telo (body) obsahuje surovú chybu Zod, nie dokument problému podľa RFC-7807 — napriek tomu je však odosielaný s Content-Typeapplication/problem+json.
2026-08 · Kopírovanie verejných odkazov na súbory
- Dashboard: Verejné súbory na stránke s podrobnosťami o kóde majú teraz tlačidlo, ktoré skopíruje ich verejný odkaz do schránky – dá sa použiť priamo ako cieľová URL adresa QR kódu, ak má naskenovanie okamžite otvoriť konkrétny dokument namiesto landing page so zoznamom súborov.
- API: Súborové endpointy (
/v1/files) navyše vracajúpublic_url. Toto pole je nastavené len pre súbory svisibility: public– súkromné súbory nedostanú verejnú adresu. - Správanie: Odkaz nevyžaduje prihlásenie a otvorí súbor priamo v prehliadači. Nahradenie súboru ho ponechá nezmenený, takže kód vytlačený na ňom zostáva platný. Podrobnosti: Súbory & dátové hárky.
2026-07 · Tímové roly: Editor bez možnosti mazania & Admin fakturácia
- Novinka: Rola člena Editor (bez mazania) — vytvára a upravuje QR kódy, súbory a Digital Product Passports, ale nemôže nič mazať ani vytvárať API kľúče. Všetky deštruktívne endpointy overujú rolu na strane servera (
403). - Fakturácia: Upgrady programov a zákaznícky portál Stripe (
POST /v1/billing/checkout,GET /v1/billing/portal) sú teraz vyhradené pre administrátorov organizácie — všetky ostatné roly vidia prehľad programov len na čítanie. - Dashboard: Akcie, ktoré vlastná rola neumožňuje, sú skryté: Čitateľ napríklad nevidí tlačidlá na vytváranie, úpravu alebo mazanie; zoznamy, sťahovania a štatistiky zostávajú viditeľné. Podrobnosti: Tím & roly.
2026-06 · Externé odkazy na landing page kódu
- Landing page: Landing page kódu hostovaná na qr3 môže teraz zobrazovať externé, vlastné hostované odkazy (
{ label, url }) – navyše k nahraným súborom alebo namiesto nich, napríklad pre dátové hárky na vašom vlastnom webe. - API:
POST/PATCH /v1/codesakceptujú polelinks(0–20 položiek,http(s), ≤ 2048 znakov). Každá URL adresa je kontrolovaná pomocou Google Web Risk; nebezpečná URL vráti422. Prázdne pole vymaže všetky odkazy. - Dashboard: Pridávanie, triedenie a odstraňovanie odkazov na stránke s podrobnosťami o kóde.
- Bezpečnosť: Vykreslené odkazy zostávajú zabezpečené proti XSS (escaped, iba
http(s)) a stránka si zachováva hlavičkunoindex.
2026-04 · Analytika pre jednotlivé QR kódy v Dashboarde
- Dashboard: Tlačidlo analytiky v zozname QR kódov teraz otvára stránku so štatistikami príslušného QR kódu na adrese
/dashboard/codes/{id}. - Routing: Alias
/dashboard/codesnaďalej presmerováva na/dashboard, ale už nezachytáva detailné cesty ako/dashboard/codes/{id}. - API: Stránka s podrobnosťami načítava QR kód priamo cez
GET /v1/codes/:id; vďaka tomu už nezávisí od limitov stránkovania zoznamu. - Testy: Regresné testy pokrývajú presmerovanie aliasu a priame načítanie kódu.
2026-04 · Dialógové okno na mazanie QR kódov v Dashboarde
- Dashboard: Ikona koša v zozname QR kódov teraz otvára vlastný React dialóg namiesto natívneho vyskakovacieho okna prehliadača.
- Spätná väzba: Po vymazaní sa zobrazí toast správa o úspechu alebo chybe.
- Testy:
packages/dashboard/tests/dashboard.test.tszabraňuje regresiám preconfirm()v procese mazania QR kódu.
2026-04 · Testovanie skrátených odkazov pre dynamické QR kódy v Dashboarde
- Dashboard: Shortcodes v zozname QR kódov sú teraz priamo klikateľné ako externé presmerovacie odkazy. Ikona externého odkazu vedľa napr.
wu3qaaotvoríhttps://qr3.app/{shortCode}na novej karte. - i18n: Doplnené texty tooltipov pre nemčinu a angličtinu.
- Testy:
packages/dashboard/tests/dashboard.test.tschráni href odkazu, správanie novej karty,noopener noreferrera ikonu pred regresiami.
2026-04 · Smerovanie Redirect-Workera pre dynamické QR kódy
- Oprava: Dynamické QR kódy na
https://qr3.app/{shortCode}sú opäť spracovávané Redirect-Workerom. Produkčná cesta teraz využívaqr3.app/*, pretože Cloudflare Worker cesty nepodporujú parametre cesty:code. - Zabezpečenie: Nezhodujúce sa cesty sa prepúšťajú na pôvodnú landing origin adresu, aby bežné stránky ako
/de/pricingneboli blokované Redirect-Workerom. - Testy:
packages/redirect/tests/unit/redirect.test.tsoveruje wildcard cestu, spracovanie shortcode a prepúšťanie na origin.
2026-04 · Prehľad skenovania DPP vo workspace (Q3.4.2)
- Novinka:
GET /v1/workspace/stats/dpp?days=30— agreguje všetkydpp_scanspre workspace daného API kľúča (active_dpps,scans_by_day,top_dppss názvom produktu/kategóriou). - Dashboard: Karta na domovskej stránke (
/dashboard) s 30-dňovým stĺpcovým grafom + top zoznamami — paralelne ku kartám QR kódov. - Verejné: Marketingový skrátený odkaz
GET /dpp/dpp_<id>(jeden segment) pre live ukážky, paralelne k/dpp/{gtin}/{serial}.
2026-04 · Analytika skenovania DPP (Q3.4.1)
- Novinka:
GET /v1/dpp/:id/stats?days=30— agregované skeny verejného GS1 resolvera pre jedno DPP. Polia:total_scans,period_scans,scans_by_day,top_countries,top_devices,top_representations. - Novinka: Tabuľka
dpp_scans(migrácia0011) — oddelená odscans(Redirect-Worker). IP adresy sú hashované pomocou denne rotujúcej soli (salt), surové IP adresy sa nikdy nedostanú do D1. - Dashboard: Mini grafová karta (SVG, bez knižnice na grafy) na
/dashboard/dpp/:dppIds 30-dňovými stĺpcami + top 3 prehľadmi. Prázdny stav (empty state), akonáhle je DPP aktívny, ale ešte nemal žiadne skeny.
2026-04 · Simulátor súladu s predpismi EÚ v reálnom čase (Q3.3.7)
- Novinka:
POST /v1/dpp/:id/validate-update— simuluje čiastočné aktualizácie bezstavovo (stateless) (status, zoznam trhov, …) bez perzistencie. Odpoveď obsahujeeu_compliance+preview.changed_fields. - Dashboard: Karta simulátora v detaile DPP (
/dashboard/dpp/:dppId) — čipy preDE/AT/FR/IT/ES/NL+ vlastné, rozbaľovací zoznam stavov, Preview EU impact / Save changes / Reset. Neblokujúce cez RemixuseFetcher. - Zabezpečenie: Vyčlenené pomocné funkcie simulátora (
readUpdatePatchFromForm,marketCountriesKey) + 18 nových unit testov; oprava chyby: osamotený ne-ISO vstup už nevymaže zoznam trhov.
2026-04 · Náhľad súladu s predpismi EÚ v reálnom čase vo formulári na vytvorenie (Q3.3.6)
- Zmena:
POST /v1/dpp/validatenavyše vraciaeu_compliance— rovnaký validátor akoGET /v1/dpp/:id/eu-compliance, bezstavovo pred uložením. - Dashboard: Náhľad pod existujúcim validačným panelom + nový Save-Guard banner pred odosielacími tlačidlami, ak sú otvorené chyby/varovania (i18n pluralizácia DE/EN).
EU validátor + textilné UI (Q3.3.4 + Q3.3.5)
- Novinka: Validátor súladu s predpismi EÚ s 5 textilnými pravidlami (
TEXTILE_AGEC_REQUIRED,TEXTILE_MICROPLASTICS_CONSISTENCY,TEXTILE_SVHC_THRESHOLD,TEXTILE_GREENWASHING,TEXTILE_ESPR_READY). - Novinka:
GET /v1/dpp/:id/eu-compliancescompliant/espr_ready/issues[]/summary. - Dashboard: Sekcia súladu s predpismi EÚ v detaile DPP (súhrnné dlaždice, zoskupené karty problémov, odznak ESPR-Ready v hlavičke).
Textil-DPP-Schema (Q3.3.1–Q3.3.3)
- Novinka: Kategória
textiles povinným reťazcom AGEC (tkanie/pletenie → farbenie/potlač → konfekcia), pre každé vláknoorigin_country+recycled_pct,svhc_substances[], ESPR-Opt-in (PEF, životnosť, Recyclability). - Novinka: Základné pole
market_countries: string[](ISO 3166-1 alpha-2) vo všetkých kategóriách DPP — riadi špecifické francúzske pravidlá AGEC a povinné francúzske upozornenie pre spotrebiteľov. - Novinka: Spotrebiteľská HTML šablóna s varovným boxom AGEC pre mikroplasty, 3-stupňovým reťazcom pôvodu (vlajkové pilulky), zoznamom SVHC, sekciou Durability a Recyclability.
- Migrácia:
0010_dpp_market_countries(D1).
DPP-Bulk-Import (Q3.2.1–Q3.2.5)
- Novinka:
POST /v1/dpp/importakceptuje CSV a XLSX (kompatibilné s Workerom cez SheetJSxlsx, ~283 KB gzip balík). - Škálovanie: limit na základe programu (Free 100 → Enterprise 10k) + dávkovanie
db.batch()po 100 + 5 MB limit pre body. - Novinka: Chybový report ako CSV v poli
errors_csvv odpovedi 201;GET /v1/dpp/import/templates/:category?format=csv|xlsxposkytuje hotové šablóny pre batérie a textil. - Dashboard: Nahrávanie pretiahnutím (Drag-and-Drop) na
/dashboard/dpp/imports proxy šablónou a priamym stiahnutím CSV.
Spätne kompatibilné zmeny (Non-Breaking) — rozšírenia LTS
Všetky vyššie uvedené zmeny sú aditívne:
- Existujúci klienti
POST /v1/dpp/validateignorujú nové poleeu_compliancebez akýchkoľvek zmien. - Existujúce procesy pre
batteryzostávajú nezmenené. market_countriesje voliteľné a predvolene nastavené na[].
Pozrite si Verziovanie API pre pravidlá pre spätne nekompatibilné zmeny (Breaking-Change-Policy).