/api/v1/regulatory/required-fieldsGet required fields
Returns the required and anticipated fields for a passport of the given category, with the EU regulation article each field rests on, its access tier (public / restricted / authority), and — for batteries — whether the data is usually held by the maker, a supplier, or the operator. Without `group`, the endpoint returns a summary: total counts broken down per group and per access tier, plus `requiredByHolder` (battery only) grouping required fields by data source. With `group`, it returns the full field list for that group.
Available on every plan. Counts one scope answer against the per-company answer cap (~100 answers per day, ~30 per minute, shared across the dashboard, API, and the DPP Assistant). At the cap the endpoint returns 429 `scope_answer_cap`. An unknown `category` returns 400 `invalid_input` with the `allowed` list of template categories. An invalid `subType` for the given category also returns 400. For batteries, `subType` filters `requiredBy` the same way the compliance engine does.
Add `X-Source: assistant` when calling on behalf of the DPP Assistant MCP server — the answer is then signed by the assistant and the OAuth account gate applies (verified, non-disposable email required). API keys bypass the account gate.
Query parameters
- categoryrequired
string
Template category key — e.g. `battery`, `detergents`, `toys`. Returns 400 `invalid_input` with the `allowed` list when not recognised.
e.g. detergents
- group
string
Template group key (the `category` field on each template field). When absent, returns a summary; when present, returns the full field list for that group.
e.g. general_info
- subType
string
Battery sub-type — `EV`, `LMT`, or `industrial_gt_2kwh`. Filters `requiredBy` the same way the compliance engine does. Returns 400 when the category has no sub-types or the value is not recognised.
e.g. industrial_gt_2kwh
- locale
string
Response language for the `answer` text — `en`, `bg`, `de`, or `it`. Defaults to the `Accept-Language` header, then `en`.
e.g. en
Headers
- Authorizationrequired
string
`Bearer <token>` — either a `tp_` API key (Developer → API Keys; simplest, for server-to-server) or an OAuth 2.0 access token (Developer → OAuth Apps; for user-authorized apps, scoped + revocable). The Authentication page has the full OAuth flow and scope list.
e.g. Bearer tp_REDACTED_xxxxxxxxxxxx
Request
curl -sS "https://app.tracepass.eu/api/v1/regulatory/required-fields?category=detergents&locale=en" \
-H "Authorization: Bearer tp_REDACTED_xxxxxxxxxxxx"Response
{
"status": "answered",
"answer": "detergents passports require 12 fields now, with 4 additional fields anticipated.",
"locale": "en",
"data": {
"category": "detergents",
"locale": "en",
"summary": {
"requiredNow": 12,
"anticipated": 4,
"optional": 61,
"byGroup": {
"product_id": { "required": 4, "anticipated": 0, "dynamic": 0, "total": 11 },
"economic_operator": { "required": 6, "anticipated": 0, "dynamic": 0, "total": 11 },
"composition": { "required": 0, "anticipated": 1, "dynamic": 0, "total": 11 },
"data_carrier": { "required": 2, "anticipated": 3, "dynamic": 0, "total": 8 },
"…": {}
},
"byAccessTier": { "public": 64, "restricted": 10, "authority": 3 }
}
},
"profileUsed": [],
"learnable": [],
"citations": [
{ "celex": "32026R0405", "ref": "Annex VI Part A, point (a)", "url": "https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:32026R0405" },
"…"
],
"ruleIds": [],
"asOf": "2026-10-09",
"ruleStatus": "verified",
"machineTranslated": false,
"disclaimer": "Regulatory information as of 9 Oct 2026, not legal advice. Check the cited articles before relying on it. — TracePass"
}