# Changelog (https://eulabel.eu/docs/documentation/changelog)

> Fetch the complete documentation index at: https://eulabel.eu/docs/llms.txt
> Use this file to discover all available pages before exploring further.
> Full content: https://eulabel.eu/docs/llms-full.txt
> Append .md to any page URL for markdown, or send Accept: text/markdown.



All notable changes to the EUlabel platform, API, and SDKs.

> **Note**
> Subscribe to the [EUlabel Status Page](https://status.eulabel.eu) for real-time incident and maintenance updates.

Releases [#releases]

### March 25, 2026 — Progressive single-call DPP creation

**API contract**

    * `POST /v1/passports` is now the primary entry point — send GTIN, product identity, and passport data in one call
    * Products are created implicitly when the GTIN is new; no separate `POST /v1/products` required
    * Partial data is accepted — passports start as `draft` and auto-promote to `published` when all required fields are present
    * Subsequent calls to the same GTIN deep-merge new fields into the existing passport instead of replacing
    * Every passport response includes a `compliance` object with `status` (`"compliant"` / `"incomplete"`), `regulation`, `completeness` percentage, and `missingFields[]` (each with `field`, `message`, `hint`, `documentationUrl`)
    * Every passport response now includes `updatedAt` alongside `createdAt`; database schema updated with `passports.updated_at` column

    **Guided developer experience**

    * Error responses now include `suggestion` and `documentationUrl` fields for actionable guidance
    * Passport IDs use the `ps_` prefix in API responses (Stripe-style short prefix)
    * Root API overview and `llms.txt` updated: `POST /v1/passports` as primary endpoint, `PATCH` for product updates, corrected analytics path

    **Dashboard**

    * Product detail page shows both draft and published passports
    * Compliance progress bar with percentage and color-coded status indicator
    * Missing fields listed for incomplete passports

    **OpenAPI specification**

    * New schemas: `PassportResponse`, `PassportDetail`, `Compliance`, `MissingField`
    * Updated `CreatePassportRequest` with product identity fields (`gtin`, `name`, `brand`, `category`, `sku`)
    * `PassportData` fields (except `productType`) are now optional for progressive enrichment
    * `Error` schema extended with `suggestion` and `documentationUrl`
    * Request/response examples for both complete and partial submissions

    **Webhook events**

    * New progressive lifecycle events: `passport.draft_created`, `passport.enriched`, `passport.published`

    **Architecture**

    * New `validatePassportCompliance()` in `packages/core` — progressive compliance validator for all sectors
    * `createPassport()` in `packages/db` supports `draft`/`published` status and deep-merge logic
    * Resolver remains passport-status-unaware by design; passport app handles 404s for draft-only products

  
### March 20, 2026 — Documentation audit, Knowledge Base expansion, and OpenAPI update

**Accuracy fixes**

    * Fixed API error format to match actual nested `{ error: { type, message, code, param } }` shape
    * Fixed pagination from `page`/`perPage` to `limit`/`offset` matching the API implementation
    * Fixed Python SDK page (unclosed code fence with embedded Callout)
    * Fixed home page curl example to include required `category` and `brand` fields
    * Corrected scan analytics event JSON to match implementation; marked aspirational event types as Planned
    * Marked rate-limit response headers as planned (not yet implemented)

    **OpenAPI and API reference**

    * Added 6 missing endpoints to `openapi.yaml`: suppliers list, product-supplier link, domains CRUD, API keys CRUD
    * Fixed pagination params to `limit`/`offset` in OpenAPI spec
    * Regenerated endpoint MDX; new pages for Domains and API Keys
    * Added Domains and API Keys Cards to API reference introduction

    **UX writing and framing**

    * Added wine-first Phase 1 callouts to home, introduction, and quickstart pages
    * Added wine-only passport constraint note to quickstart
    * Added idempotency note for passport creation (200 vs 201)

    **Knowledge Base expansion (+21 new pages)**

    * 6 new concepts: ESPR Regulation, DPP Architecture, Sector Timelines, Data Carriers, Linkset, JSON-LD and schema.org
    * 6 new guides: Passport Data Format, Textile DPP (Preview), Battery Passport (Preview), PIM Integration, API Versioning, Idempotency and Deduplication
    * 4 new best practices: Resolver Integration, QR Code Strategy, Compliance Checklist, Multi-Audience Design
    * 3 new examples: Wine Label End-to-End, Cross-Sector Comparison, PIM-to-Passport Pipeline
    * 2 new section hubs: Best Practices index, Examples index
    * Updated all `meta.json` navigation and Knowledge Base introduction with Cards for every new page

  
### March 20, 2026 — Project-scoped dashboard

* **Projects**: Group products by compliance type (wine, textile, food, electronics, battery) under organizations
    * **Project routing**: Dashboard now uses `/{orgSlug}/{projectSlug}/products` URL structure
    * **Product scoping**: Products belong to projects; category is inferred from project type
    * **Project overview**: Per-project dashboard with product count and compliance type

  
### March 19, 2026 — Multi-tenant dashboard and documentation redesign

* **Organization routing**: Dashboard URLs are now `/{orgSlug}/...` with organization-scoped navigation
    * **Onboarding flow**: New organizations choose a name and URL slug after first sign-up
    * **Organization switcher**: WorkOS-powered widget for switching between organizations
    * **Session management**: Cross-app session cookies scoped to `.eulabel.eu`
    * New information architecture with journey-based navigation
    * Icons throughout the sidebar for better scannability
    * New Guides section: Wine E-Label, GTIN Validation, Error Handling, Custom Domains
    * Interactive API playground with code examples in JavaScript, Python, cURL, and Go
    * AI/LLM-friendly: `Accept: text/markdown` content negotiation, `llms.txt`, per-page `.mdx` endpoints

  
### March 18, 2026 — Custom domains, i18n passport, and domain features

* **Custom Domains API**: Register, verify, and manage brand custom domains for passport pages (`POST /v1/domains`, `GET /v1/domains`, `DELETE /v1/domains/:id`)
    * **Passport i18n**: Product label pages now available in 6 EU languages (EN, DE, FR, IT, ES, PT) via next-intl
    * **JSON-LD structured data**: Passport pages include schema.org + GS1 Web Vocabulary structured data for machine readability
    * **Domain configuration**: Centralized `buildPassportUrl`, `buildResolverUrl`, `buildQrCodeUrl` helpers driven by environment variables
    * **Product-supplier linking**: `POST /v1/products/:id/suppliers` endpoint to associate operators with products

  
### March 17, 2026 — API hardening and OpenAPI docs

* **OpenAPI specification**: Full `openapi.yaml` with auto-generated interactive API reference pages
    * **Product categories**: `wine`, `textile`, `food`, `electronics`, `battery` enum with validation on create and update
    * **Dual passport identifiers**: `POST /v1/passports` now accepts either `productId` or `gtin` (but not both)
    * **API key ownership validation**: Revoking a key now validates it belongs to the authenticated organization
    * **Simplified scopes**: Default scope set applied when no scopes are specified at key creation

  
### March 16, 2026 — Auth migration, passport app, and DB workflow

* **WorkOS API key migration**: API key authentication now fully managed by WorkOS (local `api_keys` table deprecated)
    * **Product PATCH API**: Partial updates to products via `PATCH /v1/products/:id`
    * **Passport app**: Initial consumer-facing passport pages with wine e-label rendering
    * **Passport deduplication**: Data hash prevents duplicate passport versions when submitting identical data
    * **Database migrations**: Committed migration workflow with `pnpm db:generate` and `pnpm db:migrate`
    * **FumaDocs**: Documentation site launched with auto-generated OpenAPI reference

  
### March 14, 2026 — API v1 and resolver launch

* **GS1-conformant resolver**: Edge-deployed resolver at `/01/{gtin}` with HTTP 307 redirects, linkset (RFC 9264), `.well-known/gs1resolver`, scan event logging
    * **Products API**: Create and manage products with GS1 Digital Link identifiers
    * **Passports API**: Attach and retrieve Digital Product Passports with full wine e-label support
    * **QR Code generation**: SVG QR codes encoding GS1 Digital Link URIs
    * **Suppliers API**: Register and manage economic operators
    * **Analytics API**: Scan analytics with geographic, device, and referrer breakdown
    * **TypeScript SDK**: `@eulabel/sdk` on npm
    * **Python SDK**: `eulabel` on PyPI

    **Supported product categories**

    * Wine (EU Regulation 2021/2117 e-label compliance)

***

Roadmap [#roadmap]

Planned features (no committed dates):

* Food digital labels (Phase 2)
* Batteries and textiles DPP support (ESPR, Phase 3)
* Batch and serial-level tracking (GTIN + lot/serial)
* Additional PIM connectors (Salsify, Akeneo, Contentful)
* Go SDK
* Batch import API for bulk product registration
* Multi-audience routing (consumer, regulator, retailer, recycler views)

