Skip to content

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/codes i GET /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/users i /v1/webhooks/:id/deliveries. Svi su listali isključivo prema created_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_cursor od sada je također neprozirna vrijednost (base64url) umjesto same vremenske oznake; nečitljivi kursori vraćaju 400, a stari kursori s vremenskom oznakom privremeno se i dalje prihvaćaju. Iznimka je GET /v1/webhooks/:id/deliveries: tamo next_cursor ostaje ID zadnje isporuke (nepoznati ID → prva stranica). Klijenti koji vraćaju next_cursor nepromijenjen — 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_at se vraćao u SQLite formatu bez vremenske zone (2026-08-17 09:00:00), iako OpenAPI specifikacija obećava format: date-time, a kreiranje (POST) isporučuje ISO vremensku oznaku (2026-08-17T09:00:00.000Z). Isto je vrijedilo za deleted_at/updated_at kod soft-deletea, kao i za putanje uređivanja/brisanja za API ključeve, organizacije, radne prostore, članove, komentare i webhookove, te dodatno za last_used_at API ključeva i last_triggered_at webhookova. Sve putanje pisanja sada zapisuju ISO 8601 (UTC, T i Z).
  • Utjecaj: Klijenti koji analiziraju updated_at pomoću new 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') zapisuje YYYY-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/codes i GET /v1/dpp koristili su paginaciju isključivo putem created_at. Međutim, kodovi iz POST /v1/codes/batch, POST /v1/dpp/batch i CSV/XLSX uvoza dijele jednu vremensku oznaku — čim je batch bio veći od limit (zadano 20), druga stranica više nije vraćala preostale retke s istom vremenskom oznakom. Kodovi su postojali i bili su dostupni putem GET /v1/codes/:id, ali se nikada nisu pojavljivali na popisu (nadzorna ploča, CLI qr3 list, SDK-ovi, MCP). Kursor je sada skup ključeva (keyset) preko (created_at, id).
  • Promjena API-ja: meta.pagination.next_cursor od 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ćaju 400 umjesto 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_at bio 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ća 401.
  • Pozadina: expires_at se 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-keys ostaje 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_hash nikada nije uključen u izvoz.
  • Ponašanje pri pogreškama: Također je novo dokumentiran 400 odgovor validacije zahtjeva: tijelo (body) je sirova Zod pogreška, a ne RFC-7807 dokument o problemu — ipak se isporučuje pod Content-Type application/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čuju public_url. Polje je postavljeno samo za datoteke s visibility: 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/codes prihvaćaju polje links (0–20 unosa, http(s), ≤ 2048 znakova). Svaki URL provjerava se pomoću Google Web Risk; nesiguran URL vraća 422. 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 svoje noindex zaglavlje.

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/codes i 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.ts sprječava regresije na confirm() 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. wu3qaa otvara https://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 noreferrer i 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 koristi qr3.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/pricing ne bi bile blokirane od strane Redirect Workera.
  • Testovi: packages/redirect/tests/unit/redirect.test.ts provjerava 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 sva dpp_scans skeniranja radnog prostora API ključa (active_dpps, scans_by_day, top_dpps s 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 (migracija 0011) — odvojena od scans (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/:dppId s 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ži eu_compliance + preview.changed_fields.
  • Nadzorna ploča: Kartica simulatora u detaljima DPP-a (/dashboard/dpp/:dppId) — oznake (chips) za DE/AT/FR/IT/ES/NL + prilagođeno, padajući izbornik statusa, Preview EU impact / Save changes / Reset. Neblokirajuće putem Remix useFetcher.
  • 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/validate dodatno isporučuje eu_compliance — isti validator kao GET /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-compliance s compliant / 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 textile s obveznim AGEC lancem (tkanje/pleenje → bojenje/tisak → konfekcija), po vlaknu origin_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/import prihvaća CSV i XLSX (kompatibilno s Workerima putem SheetJS xlsx, ~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_csv odgovora 201; GET /v1/dpp/import/templates/:category?format=csv|xlsx pruža gotove predloške za baterije i tekstil.
  • Nadzorna ploča: Drag-and-drop prijenos na /dashboard/dpp/import s 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/validate zanemaruju novo polje eu_compliance bez potrebe za izmjenama.
  • Postojeći battery tijekovi ostaju nepromijenjeni.
  • market_countries je opcionalno polje i zadano je postavljeno na [].

Pogledajte Verzioniranje API-ja za pravila o prekinutim promjenama.