---
title: Get regulatory changes
description: List EU DPP regulatory changes and upcoming obligations for product categories since a given date. Curated, source-cited entries only.
canonical: "https://www.tracepass.eu/docs/get-regulatory-changes"
locale: en
source: "https://www.tracepass.eu/docs/get-regulatory-changes"
---

# Get regulatory changes

> List EU DPP regulatory changes and upcoming obligations for product categories since a given date. Curated, source-cited entries only.

```http
GET /api/v1/regulatory/changes
```

Returns curated regulatory change entries for the requested categories, filtered to those dated on or after `since`. Each entry carries a `kind` (`adopted`, `amended`, `date_moved`, `standard_published`, `standard_cited`, `applies_from`, …), the EU instrument or standard it concerns, the affected categories, a plain-language summary (in the response locale), and a primary source URL. The `data.upcoming` array lists dated DPP obligations and planned acts in the next 90 days for the given categories; planned entries are labelled 'Planned, not law yet' and never worded as a deadline.

The `since` date defaults to the date of the last `what_changed` answer this company's account made (from the answer log), or 90 days ago on first use. Pass an explicit `since` in ISO-8601 format (`YYYY-MM-DD`) to override. Available on every plan. Counts one scope answer (~100/day per company). Returns 429 `scope_answer_cap` at the limit.

Source: a curated `regulatory-changes.json` maintained in `tracepass-extraction-core`. Only entries that have been verified against a primary source enter the file; the `regulatory-status-change` skill appends to it. The raw regulatory-events feed is never exposed here.

## Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `Authorization` | header | string | yes | `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. |
| `categories` | query | string | no | Comma-separated category keys — e.g. `battery,detergents`. When absent, all categories are returned. |
| `since` | query | string (YYYY-MM-DD) | no | Return entries dated on or after this date. Defaults to the date of the company's last `what_changed` answer, or 90 days ago on first use. |
| `locale` | query | string | no | Response language for `answer` and each item's `summary` — `en`, `bg`, `de`, or `it`. Defaults to `Accept-Language`, then `en`. |

## Examples

```bash
curl -sS "https://app.tracepass.eu/api/v1/regulatory/changes?categories=battery&locale=en" \
  -H "Authorization: Bearer tp_REDACTED_xxxxxxxxxxxx"
```

```typescript
const res = await fetch(
  "https://app.tracepass.eu/api/v1/regulatory/changes?categories=battery&locale=en",
  { headers: { Authorization: `Bearer ${process.env.TRACEPASS_API_KEY}` } }
);
const envelope = await res.json();
// envelope.data.items — change entries since last check
// envelope.data.upcoming — obligations / planned acts in next 90 days
```

```python
import os, requests
resp = requests.get(
    "https://app.tracepass.eu/api/v1/regulatory/changes",
    params={"categories": "battery", "locale": "en"},
    headers={"Authorization": f"Bearer {os.environ['TRACEPASS_API_KEY']}"},
)
envelope = resp.json()
```

## Responses

### 200 — Regulatory changes

```json
{
  "status": "answered",
  "answer": "3 regulatory changes since 2026-07-13.",
  "locale": "en",
  "data": {
    "since": "2026-07-13",
    "items": [
      {
        "id": "battery-harmonised-standard-en18060-2026-09",
        "date": "2026-09-16",
        "kind": "standard_cited",
        "instrument": "32023R1542",
        "categories": ["battery"],
        "summary": "Commission Implementing Decision (EU) 2026/2048 (OJ 16 September 2026) publishes the reference of EN 18060:2025, a harmonised standard on the performance and durability of EV battery modules, under the Battery Regulation. Article 77 (the battery passport) is not among the articles for which conformity is presumed.",
        "source": {
          "url": "https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:32026D2048",
          "primary": true
        }
      }
    ],
    "upcoming": [
      {
        "celex": "32023R1542",
        "date": "2027-02-18",
        "kind": "applies_from"
      }
    ]
  },
  "profileUsed": [],
  "learnable": [],
  "citations": [
    { "celex": "", "ref": "battery-harmonised-standard-en18060-2026-09", "url": "https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:32026D2048" }
  ],
  "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"
}
```

### 401 — Unauthorized

```json
{ "error": "Invalid or revoked API key" }
```

### 403 — Account not eligible

```json
{ "error": "account_not_eligible", "reason": "disposable_email" }
```

### 429 — Answer cap exceeded

```json
{ "error": "scope_answer_cap", "limit": 100, "resetAt": "2026-10-12T00:00:00.000Z" }
```

### 503 — Regulatory data unavailable

```json
{ "error": "regulatory_data_unavailable" }
```

## Related

- [GET Required fields](https://www.tracepass.eu/docs/get-required-fields.md)
- [POST Check DPP scope](https://www.tracepass.eu/docs/check-scope.md)
