Changelog
Changelog
Odabrani naglasci iz nedavnih izdanja. Za potpune verzije API-ja i pravila o prekinutim promjenama pogledajte Verzioniranje API-ja i LTS pravila.
Detaljne promjene na pojedinačnim krajnjim točkama: OpenAPI specifikacija i interaktivna API referenca.
2026-08 · Keyset kursor sada na svim endpointima popisa
- Ispravak: Ispravak kursora za
GET /v1/codesiGET /v1/dpp(vidi dolje) sada je primijenjen na sve preostale popise s paginacijom pomoću kursora:GET /v1/qr-codes/:id/comments,/v1/workspaces,/v1/gs1/identifiers,/v1/members,/v1/audit-logs,/v1/admin/orgs,/v1/admin/usersi/v1/webhooks/:id/deliveries. Svi su listali isključivo premacreated_at; redovi s identičnim vremenskim oznakama (zapisi revizije skupne operacije, ponovni pokušaji webhooka, uvozi članova) mogli su se izgubiti na sljedećoj stranici. Ključ sortiranja sada je posvuda torka(created_at, id). - Promjena API-ja: Na ovim popisima
meta.pagination.next_cursorod sada je također neprozirna vrijednost (base64url) umjesto same vremenske oznake; nečitljivi kursori vraćaju400, a stari kursori s vremenskom oznakom privremeno se i dalje prihvaćaju. Iznimka jeGET /v1/webhooks/:id/deliveries: tamonext_cursorostaje ID zadnje isporuke (nepoznati ID → prva stranica). Klijenti koji vraćajunext_cursornepromijenjen — nadzorna ploča, CLI, SDK-ovi, MCP — ne moraju ništa mijenjati. - Utjecaj: Nije potrebna migracija. Ako su vam u nekom od ovih popisa (npr. zapisnik revizije ili zapisnik isporuka na nadzornoj ploči) nedostajali zapisi prilikom listanja: nikada nisu nestali — popisi ih od sada prikazuju u cijelosti.
2026-08 · Vremenske oznake nakon uređivanja i brisanja ponovno usklađene s OpenAPI
- Ispravak: Nakon
PATCH /v1/codes/{id},updated_atse vraćao u SQLite formatu bez vremenske zone (2026-08-17 09:00:00), iako OpenAPI specifikacija obećavaformat: date-time, a kreiranje (POST) isporučuje ISO vremensku oznaku (2026-08-17T09:00:00.000Z). Isto je vrijedilo zadeleted_at/updated_atkod soft-deletea, kao i za putanje uređivanja/brisanja za API ključeve, organizacije, radne prostore, članove, komentare i webhookove, te dodatno zalast_used_atAPI ključeva ilast_triggered_atwebhookova. Sve putanje pisanja sada zapisuju ISO 8601 (UTC,TiZ). - Utjecaj: Klijenti koji analiziraju
updated_atpomoćunew Date(...)(SDK-ovi, CLI, nadzorna ploča) čitali su format s razmakom kao lokalno vrijeme — CLI je za jednom uređene kodove prikazivao vrijeme pomaknuto za lokalno odstupanje (Beč: −2 h). To je ispravljeno. Dodatno, migracija podataka normalizira već pohranjene vrijednosti u starom formatu na ISO, kako bi sortiranje i usporedbe u mješovitim podacima bili ispravni. Nema promjena u nazivima polja ili strukturi odgovora. - Pozadina: Ista klasa pogreške kao i dva ispravka u nastavku (istek API ključa, granica ponovnog skeniranja): SQLite-ov
datetime('now')zapisujeYYYY-MM-DD HH:MM:SS, dok svi ostali zapisivači koriste ISO 8601. Guard test izvornog koda spriječit će buduće pojave.
2026-08 · Paginacija popisa više ne gubi batch kodove
- Ispravak:
GET /v1/codesiGET /v1/dppkoristili su paginaciju isključivo putemcreated_at. Međutim, kodovi izPOST /v1/codes/batch,POST /v1/dpp/batchi CSV/XLSX uvoza dijele jednu vremensku oznaku — čim je batch bio veći odlimit(zadano 20), druga stranica više nije vraćala preostale retke s istom vremenskom oznakom. Kodovi su postojali i bili su dostupni putemGET /v1/codes/:id, ali se nikada nisu pojavljivali na popisu (nadzorna ploča, CLIqr3 list, SDK-ovi, MCP). Kursor je sada skup ključeva (keyset) preko(created_at, id). - Promjena API-ja:
meta.pagination.next_cursorod sada je neprozirna vrijednost (base64url) umjesto obične vremenske oznake. Svatko tko vraća kursor nepromijenjen kao?cursor=— kao što to čine nadzorna ploča, CLI, svi SDK-ovi i MCP poslužitelj — ne mora ništa mijenjati. Stari kursori s vremenskom oznakom i dalje će se privremeno prihvaćati; nečitljivi kursori sada vraćaju400umjesto prešutnog vraćanja prve stranice. - Utjecaj: Ako ste nakon batch uvoza na popisu vidjeli manje kodova nego što ih je stvoreno: kodovi nikada nisu nestali — popis ih od sada prikazuje u cijelosti. Nije potrebna migracija.
2026-08 · Sigurnosna ponovna skeniranja ponovno se izvode u 24-satnom ciklusu
- Ispravak: Periodičko ponovno skeniranje ciljnih URL-ova i poveznica landing stranica (Google Web Risk) preskakalo je kodove čije je posljednje skeniranje bilo na isti kalendarski dan kao i 24-satna granica — ovisno o dobu dana, ponovno skeniranje odgađalo se za još najviše jedan dan. Granica se sada izračunava u istom ISO formatu u kojem su pohranjene vremenske oznake skeniranja.
- Utjecaj: Ciljni URL koji se nakon posljednjeg skeniranja klasificira kao nesiguran ponovno dovodi do automatskog pauziranja koda unutar dokumentiranog 24-satnog prozora. Nema promjena u API-ju ili formatu odgovora.
2026-08 · API ključevi istječu u trenutku isteka
- Ispravak: API ključ čiji je
expires_atbio na isti dan nastavio se prihvaćati do ponoći UTC. Istek se sada uspoređuje kao vremenska oznaka umjesto kao tekstualni niz — istekli ključ odmah vraća401. - Pozadina:
expires_atse pohranjuje kao ISO vremenska oznaka (2026-08-14T09:00:00Z), dok je strana za usporedbu isporučivala format s razmakom (2026-08-14 09:00:00). Usporedba sirovih tekstualnih nizova stoga je bila točna samo dok se već i sam datum razlikovao. - Utjecaj: Nije potrebna migracija, format odgovora za
GET /v1/api-keysostaje nepromijenjen. Nečitljive vrijednosti isteka sada se smatraju isteklima umjesto valjanima.
2026-08 · API referenca: Dokumentirano upravljanje tenantima
- OpenAPI: Specifikacija — a time i interaktivna referenca — sada dokumentira organizacije (uklj.
GET /v1/organizations/usage), radne prostore, članove i uloge i revizijske zapisnike. - Billing: Pregled tarifa (
GET /v1/billing/plans) je javan; Checkout (POST /v1/billing/checkout) i Stripe korisnički portal (GET /v1/billing/portal) označeni su kao krajnje točke za administratore organizacije. - Izvoz skeniranja: Statistika skeniranja (
GET /v1/codes/{id}/scans) i izvoz sirovih podataka (…/scans.csv,…/scans.xlsx) potpuno su dokumentirani — uključujući napomenu o GDPR-u:ip_hashnikada nije uključen u izvoz. - Ponašanje pri pogreškama: Također je novo dokumentiran
400odgovor validacije zahtjeva: tijelo (body) je sirova Zod pogreška, a ne RFC-7807 dokument o problemu — ipak se isporučuje pod Content-Typeapplication/problem+json.
2026-08 · Kopiranje javnih poveznica na datoteke
- Nadzorna ploča: Javne datoteke na stranici s detaljima koda sada imaju gumb koji njihovu javnu poveznicu kopira u međuspremnik – odmah spremnu za upotrebu kao ciljni URL QR koda kada skeniranje treba otvoriti određeni dokument umjesto landing stranice s popisom datoteka.
- API: Krajnje točke za datoteke (
/v1/files) dodatno isporučujupublic_url. Polje je postavljeno samo za datoteke svisibility: public– privatne datoteke ne dobivaju javnu adresu. - Ponašanje: Poveznica ne zahtijeva prijavu i otvara datoteku izravno u pregledniku. Opcija Zamijeni ne mijenja tu poveznicu, pa tiskani kod ostaje valjan. Pojedinosti: Datoteke i tehnički listovi.
2026-07 · Timske uloge: Suradnik bez brisanja i administratorska naplata
- Novo: Članska uloga Suradnik (bez brisanja) — stvara i uređuje QR kodove, datoteke i Digital Product Passports, ali ne može ništa brisati niti stvarati API ključeve. Svi destruktivni endpointi provjeravaju ulogu na strani poslužitelja (
403). - Naplata: Nadogradnje tarifa i Stripe korisnički portal (
POST /v1/billing/checkout,GET /v1/billing/portal) sada su rezervirani isključivo za organizacijske Administratore — sve ostale uloge vide pregled tarifa samo za čitanje. - Dashboard: Radnje koje korisnička uloga ne dopušta automatski se skrivaju: Pregledatelj tako ne vidi gumbe za stvaranje, uređivanje ili brisanje, dok popisi, preuzimanja i statistike ostaju vidljivi. Pojedinosti: Tim i uloge.
2026-06 · Vanjske poveznice na landing stranici koda
- Landing stranica: qr3-hostana landing stranica koda sada može navesti vanjske, samostalno hostane poveznice (
{ label, url }) uz prenesene datoteke ili umjesto njih – primjerice za tehničke listove na vašoj vlastitoj stranici. - API:
POST/PATCH /v1/codesprihvaćaju poljelinks(0–20 unosa,http(s), ≤ 2048 znakova). Svaki URL provjerava se pomoću Google Web Risk; nesiguran URL vraća422. Prazno polje briše sve poveznice. - Nadzorna ploča: Dodavanje, promjena redoslijeda i uklanjanje poveznica na stranici s detaljima koda.
- Sigurnost: Prikazane poveznice ostaju sigurne od XSS-a (escapirane, samo
http(s)) i stranica zadržava svojenoindexzaglavlje.
2026-04 · Analitika nadzorne ploče po QR kodu
- Nadzorna ploča: Gumb za analitiku na popisu QR kodova sada otvara stranicu sa statistikama za odgovarajući QR kod na
/dashboard/codes/{id}. - Usmjeravanje: Alias
/dashboard/codesi dalje preusmjerava na/dashboard, ali više ne presreće detaljne rute poput/dashboard/codes/{id}. - API: Stranica s detaljima učitava QR kod izravno putem
GET /v1/codes/:id; time više ne ovisi o ograničenjima paginacije popisa. - Testovi: Regresijski testovi pokrivaju preusmjeravanje aliasa i izravno učitavanje koda.
2026-04 · Dijalog za brisanje QR kodova na nadzornoj ploči
- Nadzorna ploča: Ikona kante za smeće na popisu QR kodova sada otvara namjenski React dijalog umjesto izvornog skočnog prozora preglednika.
- Povratna informacija: Nakon brisanja pojavljuje se toast obavijest o uspjehu ili pogrešci.
- Testovi:
packages/dashboard/tests/dashboard.test.tssprječava regresije naconfirm()u tijeku brisanja QR koda.
2026-04 · Test kratkih poveznica na nadzornoj ploči za dinamičke QR kodove
- Nadzorna ploča: Kratki kodovi (shortcodes) na popisu QR kodova sada se mogu izravno kliknuti kao vanjske poveznice za preusmjeravanje. Ikona vanjske poveznice pokraj npr.
wu3qaaotvarahttps://qr3.app/{shortCode}u novoj kartici. - i18n: Dodani tekstovi opisa (tooltips) za njemački i engleski jezik.
- Testovi:
packages/dashboard/tests/dashboard.test.tsštiti href poveznice, ponašanje nove kartice,noopener noreferreri ikonu od regresija.
2026-04 · Ruta Redirect Workera za dinamičke QR kodove
- Ispravak: Dinamički QR kodovi na
https://qr3.app/{shortCode}ponovno se obrađuju putem Redirect Workera. Produkcijska ruta sada koristiqr3.app/*jer Cloudflare rute Workera ne podržavaju parametre staze:code. - Učvršćivanje: Nepodudarne staze prosljeđuju se na izvorište odredišne stranice (landing origin) kako normalne stranice poput
/de/pricingne bi bile blokirane od strane Redirect Workera. - Testovi:
packages/redirect/tests/unit/redirect.test.tsprovjerava zamjensku (wildcard) rutu, obradu kratkog koda i prosljeđivanje izvorištu (origin pass-through).
2026-04 · Pregled DPP skeniranja za radni prostor (Q3.4.2)
- Novo:
GET /v1/workspace/stats/dpp?days=30— agregira svadpp_scansskeniranja radnog prostora API ključa (active_dpps,scans_by_day,top_dppss nazivom proizvoda/kategorijom). - Nadzorna ploča: Kartica na početnoj stranici (
/dashboard) s 30-dnevnim stupčastim grafikonom + top listama — paralelno s karticama QR kodova. - Javno: Marketinška kratka poveznica
GET /dpp/dpp_<id>(jedan segment) za demonstracije uživo, paralelno s/dpp/{gtin}/{serial}.
2026-04 · Analitika DPP skeniranja (Q3.4.1)
- Novo:
GET /v1/dpp/:id/stats?days=30— agregirana skeniranja javnog GS1 resolvera po DPP-u. Polja:total_scans,period_scans,scans_by_day,top_countries,top_devices,top_representations. - Novo: Tablica
dpp_scans(migracija0011) — odvojena odscans(Redirect Worker). IP adrese se hashiraju s dnevno rotirajućom soli (salt), sirove IP adrese nikada ne dolaze do D1. - Nadzorna ploča: Mini kartica s grafikonom (SVG, bez biblioteke za grafikone) na
/dashboard/dpp/:dppIds 30-dnevnim stupcima + top 3 raščlambe. Prikaz praznog stanja (empty-state) čim je DPP aktivan, ali još nema skeniranja.
2026-04 · Simulator usklađenosti s EU propisima uživo (Q3.3.7)
- Novo:
POST /v1/dpp/:id/validate-update— simulira djelomična ažuriranja bez stanja (stateless) (status, popis tržišta, …) bez perzistencije. Odgovor sadržieu_compliance+preview.changed_fields. - Nadzorna ploča: Kartica simulatora u detaljima DPP-a (
/dashboard/dpp/:dppId) — oznake (chips) zaDE/AT/FR/IT/ES/NL+ prilagođeno, padajući izbornik statusa, Preview EU impact / Save changes / Reset. Neblokirajuće putem RemixuseFetcher. - Učvršćivanje: Izdvojeni pomoćni alati simulatora (
readUpdatePatchFromForm,marketCountriesKey) + 18 novih jediničnih testova; ispravak pogreške: samostalni unos koji nije u ISO formatu više ne briše popis tržišta.
2026-04 · Pregled usklađenosti s EU propisima uživo u obrascu za izradu (Q3.3.6)
- Izmijenjeno:
POST /v1/dpp/validatedodatno isporučujeeu_compliance— isti validator kaoGET /v1/dpp/:id/eu-compliance, bez stanja (stateless) prije spremanja. - Nadzorna ploča: Pregled ispod postojećeg panela za validaciju + novi Save-Guard-Banner ispred gumba za slanje ako postoje otvorene pogreške/upozorenja (i18n pluralizacija DE/EN).
2026-04 · EU validator + tekstilno sučelje (Q3.3.4 + Q3.3.5)
- Novo: Validator usklađenosti s EU propisima s 5 tekstilnih pravila (
TEXTILE_AGEC_REQUIRED,TEXTILE_MICROPLASTICS_CONSISTENCY,TEXTILE_SVHC_THRESHOLD,TEXTILE_GREENWASHING,TEXTILE_ESPR_READY). - Novo:
GET /v1/dpp/:id/eu-compliancescompliant/espr_ready/issues[]/summary. - Nadzorna ploča: Odjeljak za usklađenost s EU propisima u detaljima DPP-a (sažeti prikazi, grupirane kartice problema, ESPR-Ready značka u zaglavlju).
2026-04 · Shema tekstilnog DPP-a (Q3.3.1–Q3.3.3)
- Novo: Kategorija
textiles obveznim AGEC lancem (tkanje/pleenje → bojenje/tisak → konfekcija), po vlaknuorigin_country+recycled_pct,svhc_substances[], ESPR-Opt-in (PEF, životni vijek, mogućnost recikliranja). - Novo: Osnovno polje
market_countries: string[](ISO 3166-1 alpha-2) na svim DPP kategorijama — upravlja specifičnim francuskim AGEC pravilima i obveznom napomenom za francuske potrošače. - Novo: HTML predložak za potrošače s AGEC okvirom upozorenja za mikroplastiku, trostupanjskim lancem podrijetla (oznake sa zastavicama), SVHC popisom te odjeljcima za trajnost i mogućnost recikliranja.
- Migracija:
0010_dpp_market_countries(D1).
2026-04 · Skupni uvoz DPP-a (Q3.2.1–Q3.2.5)
- Novo:
POST /v1/dpp/importprihvaća CSV i XLSX (kompatibilno s Workerima putem SheetJSxlsx, ~283 KB gzip paket). - Skalirano: ograničenje temeljeno na pretplati (Free 100 → Enterprise 10k) + podijeljeni
db.batch()u serijama od 100 + ograničenje tijela zahtjeva od 5 MB. - Novo: Izvješće o pogreškama kao CSV u polju
errors_csvodgovora 201;GET /v1/dpp/import/templates/:category?format=csv|xlsxpruža gotove predloške za baterije i tekstil. - Nadzorna ploča: Drag-and-drop prijenos na
/dashboard/dpp/imports proxyjem predloška i ugrađenim preuzimanjem CSV-a.
Bez prekidanja kompatibilnosti — LTS proširenja
Sve gore navedene promjene su aditivne:
- Postojeći klijenti koji koriste
POST /v1/dpp/validatezanemaruju novo poljeeu_compliancebez potrebe za izmjenama. - Postojeći
batterytijekovi ostaju nepromijenjeni. market_countriesje opcionalno polje i zadano je postavljeno na[].
Pogledajte Verzioniranje API-ja za pravila o prekinutim promjenama.