---
title: "Check product scope against EU DPP regulations."
method: POST
path: "/api/v1/scope/check"
tags: ["Scope"]
---

# Check product scope against EU DPP regulations.

`POST /api/v1/scope/check`

## Request

- Base URL: `https://app.tracepass.eu`
- URL: `https://app.tracepass.eu/api/v1/scope/check`
- Auth: one of:
  - HTTP bearer
  - OAuth 2 (authorization code, authorization URL `https://app.tracepass.eu/api/oauth/authorize`, token URL `https://app.tracepass.eu/api/oauth/token`, scopes: `regulatory:read`)
  - OAuth 2 (authorization code, authorization URL `https://app.tracepass.eu/api/oauth/authorize`, token URL `https://app.tracepass.eu/api/oauth/token`, scopes: `passports:read`)

Evaluates whether a product falls in scope of EU DPP obligations
given its category, facts, role in the supply chain, and optional
locale. Returns a deterministic scope answer with the relevant
regulation article, confidence level, and a human-readable
rationale.

Auth: Bearer API key OR OAuth with `regulatory:read` OR
`passports:read`. Does not count against the daily passport-read cap.

Rate limit: Free and Basic plans are capped at a daily scope-check
quota. A 429 with `error: scope_answer_cap` is returned when the
cap is reached; `Retry-After` gives the seconds until midnight UTC
reset.

## Request body

- object
  - `category` 'battery' | 'construction' | 'detergents' | 'electronics' | 'fmcg' | 'furniture' | 'jewelry' | 'packaging' | 'paints-coatings' | 'steel' | 'textile' | 'toys' | 'tyres' | 'vehicles' | 'other': DPP product category key. Use `other` for categories not yet covered by a specific regulation. `vehicles` is in scope (End-of-Life Vehicles Regulation) but has no passport template.
  - `facts` object: Act-namespaced product facts as key-value pairs (e.g. `{ "battery.use": "stationary_energy_storage", "battery.capacityKWh": 10 }`). Unknown keys or out-of-range values return 400 `invalid_input`. Common facts are not namespaced: `ownBrand: true` states that you place the product on the market under your own name or trademark.
  - `role` string: Your role in the act's own terms: `manufacturer`, `importer`, `distributor`, `authorised_representative` or `fulfilment_service_provider` (an act may define more). Selling under your own name is `manufacturer` with `facts.ownBrand: true`. Determines which duties are listed as yours. Defaults from the company profile when omitted; with no role at all, the answer lists the duties of every role.
  - `placedOnMarket` object, nullable: When the product was (or will be) placed on the market. A placing date is a day, a month or a year (`2027-03-01`, `2027-03`, `2027`); precision, when given, must fit the date string.
    - `date` string: Date as YYYY-MM-DD, YYYY-MM or YYYY.
    - `precision` 'day' | 'month' | 'year': Precision of the date string. Optional; inferred from the string length when omitted.
  - `lifecycleEvent` 'prepared_for_reuse' | 'prepared_for_repurposing' | 'repurposed' | 'remanufactured' | 'repaired' | 'became_waste' | 'recycled', nullable: A post-first-sale lifecycle event that may affect scope obligations (e.g. a repaired battery may still need a passport).
  - `contains` object[]: Component products (e.g. cells in a battery pack). Each entry may carry its own `label` and `facts` to resolve component-level scope rules. At most 5 items.
    - `label` string: Human-readable label for the component.
    - `facts` object: Act-namespaced facts for this component.
  - `locale` string: Response language — `en`, `bg`, `de`, or `it`. Defaults to the `Accept-Language` header, then `en`.
  - `productId` string: Pre-fill facts from this product's saved scope answers. Must belong to your company; returns 404 otherwise.
  - `passportId` string: Pre-fill facts from this passport's field values and the product's saved answers. Must belong to your company; returns 404 otherwise.

## Response `200`

Scope answer envelope.

- object
  - `status` 'answered' | 'needs_input' | 'not_covered', required: `answered` — a deterministic answer is available. `needs_input` — blocking facts are missing (see `ask`). `not_covered` — no rule covers this product/category.
  - `answer` string, required: Human-readable scope answer in the requested locale.
  - `locale` string, required: Locale the answer was rendered in.
  - `data` object, required
    - `inScope` 'yes' | 'no' | 'depends' | 'pending' | 'null', nullable: `yes` — in scope now. `no` — out of scope. `pending` — in scope from a future date. `depends` — depends on unanswered facts.
    - `verdict` string: Raw verdict from the rule engine.
    - `governing` object: Primary governing act result when one applies. Fields include `celex`, `name`, `verdict`, `citation`, `level`, `role`, `duties`, `appliesFrom`, and other act-specific data. The exact shape depends on the category and rule set.
    - `alsoApplies` object[]: Other acts that also apply alongside the governing act.
    - `suggestions` object[]
  - `ask` object[], required: Facts the engine needs to refine or complete the answer.
    - `fact` string, required: Fact key (e.g. `battery.use`).
    - `question` string, required: Human-readable question for the fact.
    - `blocking` boolean, required: Required to give any verdict when `true`.
    - `act` string, required: CELEX of the act that needs this fact.
    - `type` 'enum' | 'boolean' | 'string' | 'number', required
    - `values` string[]: Allowed values for `enum`-type facts.
    - `valueLabels` object: Human-readable labels for each allowed value.
  - `profileUsed` object[], required: Profile rules applied (currently always empty).
  - `citations` object[], required: EU law citations backing the answer.
    - `celex` string, required
    - `ref` string, required
    - `quote` string
    - `url` string, uri
  - `ruleIds` string[], required: Versioned rule IDs in the format `<celex>#<rule-name>@<version>` (e.g. `32023R1542#duty.storage@1`).
  - `asOf` string, date, required: Date the rules were current on (YYYY-MM-DD).
  - `ruleStatus` 'verified' | 'needs_recheck' | 'draft', required: Confidence in the rules behind this answer.
  - `recheckSince` string, date: Present when `ruleStatus` is `needs_recheck`; the date the governing act was updated.
  - `machineTranslated` boolean, required: Whether the answer text was machine-translated.
  - `disclaimer` string, required

## Other responses

- `400`: Invalid input. The `field` property names the offending field; `allowed` lists the valid values when the field is an enum.
- `401`: Missing or invalid API key.
- `403`: Plan-gate or workspace permission denied.
- `404`: Product or passport not found, or belongs to another company. Returned when `productId` or `passportId` is provided but does not resolve to a resource owned by the authenticated company.
- `429`: Daily scope-check cap reached. `Retry-After` header gives the seconds until midnight UTC reset.
- `503`: Scope rules temporarily unavailable.

---

[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)
