---
title: "Get the full regulatory schema for one DPP category."
method: GET
path: "/api/v1/templates/{category}"
tags: ["Templates"]
---

# Get the full regulatory schema for one DPP category.

`GET /api/v1/templates/{category}`

## Request

- Base URL: `https://app.tracepass.eu`
- URL: `https://app.tracepass.eu/api/v1/templates/{category}`
- Auth: none required

Returns the full field schema for one DPP category — every
field with its key, label, data type, whether it is required,
access level (public / restricted / authority), enum options,
validation bounds, and (where known) the regulation article /
annex that mandates it. This is the "what does a compliant
battery / textile / … passport actually need" lookup that
powers compliance-aware integrations and the MCP server's
compliance-copilot prompts.

**No authentication required** — see the list endpoint above.
Bounded by an IP rate limit (60 requests/min).

## Path parameters

- `category` 'battery' | 'textile' | 'electronics' | 'construction' | 'steel' | 'detergents' | 'paints-coatings' | 'packaging' | 'furniture' | 'tyres' | 'jewelry' | 'toys' | 'fmcg', required

## Response `200`

The category's full field schema.

- object
  - `category` string
  - `categoryLabel` string, nullable
  - `version` integer
  - `regulation` object
    - `name` string
    - `number` string
    - `effectiveDate` string, date-time
    - `mandatoryDate` string, date-time
    - `dateBasis` 'statutory' | 'indicative' | 'none': statutory = dates fixed by an adopted act; indicative = planning estimates with no legal force; none = no passport act is adopted or scheduled, and the dates are the sentinel 9999-12-31 — never display or compare them.
  - `fieldCount` integer
  - `requiredFieldCount` integer: Count of fields whose category-agnostic `required` is true. Where a template uses per-category applicability, see `requiredFieldCountByCategory` for the per-category totals.
  - `requiredFieldCountByCategory` object, nullable: Per-category required-field totals, present only for templates that use `requiredBy` (today: battery). Keys are the in-scope category values.
  - `fields` object[]
    - `key` string
    - `label` string, nullable
    - `description` string, nullable
    - `dataType` string
    - `unit` string, nullable
    - `required` boolean: Category-agnostic default. For templates that carry `requiredBy`, prefer that map — this boolean is the fallback used when the passport's category is unset or absent from the map. Note the battery exception below: for an out-of-scope battery category this boolean does NOT apply, because no field is mandatory at all.
    - `requiredBy` object, nullable: Per-category required-ness, present only where a field's applicability varies by product category (today: the battery template, keyed by `batteryCategory`). Absent means the field is category-agnostic — read `required` instead. IMPORTANT for battery: the map is keyed ONLY by the three categories that owe a battery passport under Art. 77(1) of Reg (EU) 2023/1542 — `EV`, `LMT`, `industrial_gt_2kwh`. A `portable`, `SLI` or `industrial_lte_2kwh` battery owes no passport, so NO field is required for it. Check scope first; falling through to `required` for those three values asserts an obligation the Regulation does not impose. An in-scope category that is not a key in the map falls back to `required` (e.g. `{EV: notApplicable}` means optional for LMT and industrial).
    - `entryProperties` object: For an `array` field whose entries are objects: the members of one entry. Absent on untyped lists. Battery composition, for example, is `{substanceName, casNumber, massPercent}`, with `massPercent` as a share of the battery's total mass.
    - `accessLevel` 'public' | 'restricted' | 'authority'
    - `category` string: Localized sub-section header this field belongs to.
    - `enumOptions` object[], nullable
      - `value` string
      - `label` string, nullable
    - `validation` object
      - `minLength` integer, nullable
      - `maxLength` integer, nullable
      - `min` number, nullable
      - `max` number, nullable
      - `pattern` string, nullable
    - `regulationRef` object, nullable: The regulation article/annex that mandates this field, when known. null for platform- derived fields.
      - `article` string
      - `annex` string
      - `instrument` string, nullable: CELEX id of the instrument.
      - `provision` string, nullable
      - `kind` 'legislation' | 'standard' | 'scheme' | 'national' | 'international' | 'specification' | 'null', nullable: What kind of claim the reference is. Only `legislation` can make a field required.
      - `standards` string[]: Keys into the standards registry (`standards.json` in @tracepass/dpp-schemas) for the technical standards this field relates to. Relating to a standard is not a claim of conformity and never makes a field required.
      - `description` string, nullable

## Other responses

- `404`: No template for that category.
- `429`: Rate limit exceeded (60 requests/min per IP).

---

[API](https://skmtc.dev/tracepass/apis/tracepass-api.md) · [All operations](https://skmtc.dev/tracepass/apis/tracepass-api/llms.txt) · [OpenAPI document](https://skmtc.dev/tracepass/apis/tracepass-api/revisions/60ddeb25638b?raw)
