---
title: Check passport registry readiness
description: "Check whether a passport would pass the EU DPP Registry's formal submission gate — mandatory fields, formatting, and a resolvable link. Battery only."
canonical: "https://www.tracepass.eu/docs/passport-registry-readiness"
locale: en
source: "https://www.tracepass.eu/docs/passport-registry-readiness"
---

# Check passport registry readiness

> Check whether a passport would pass the EU DPP Registry's formal submission gate — mandatory fields, formatting, and a resolvable link. Battery only.

```http
GET /api/v1/passports/{id}/registry-readiness
```

Returns whether a passport would pass the **EU DPP Registry's formal submission gate** — `{ ready, findings[] }`. This is the registry's *mechanical* pre-submission check, distinct from and complementary to the substantive `/compliance` verdict: a passport can be registry-ready yet not substantively compliant, and vice-versa. Call it before submitting to the registry to catch formal gaps early.

Three formal checks, each carried on the standard finding shape with a `REG-READY-*` `ruleId`. **`REG-READY-MANDATORY`**: every mandatory field that applies to this battery type is present and approved — applicability-aware, so a field not applicable to the battery's category (e.g. state-of-certified-energy on a non-EV battery) is not counted as missing, and an `unknown`-applicability field surfaces as a warning, not a block. **`REG-READY-FORMAT`**: filled fields are well-formed (types, enums, patterns, ranges). **`REG-READY-LINK`**: the passport's public link resolves — a live probe; on an unpublished passport this is an advisory warning rather than a block, since the preflight is meant to run before publishing.

`ready` is `true` only when there are zero critical findings; warnings never block readiness. **Battery passports only** in this version — a non-battery passport returns `ready: true` with a single `REG-READY-SCOPE` warning, because the registry's formal gate for other categories isn't modelled yet. Read-only; counts as one v1 passport read against the daily cap.

## 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. |
| `id` | path | ObjectId | yes | Passport ID. |

## Examples

```bash
curl -sS \
  https://app.tracepass.eu/api/v1/passports/6650b2c3d4e5f6a7b8c9d0e1/registry-readiness \
  -H "Authorization: Bearer tp_REDACTED_xxxxxxxxxxxx"
```

```typescript
const res = await fetch(
  `https://app.tracepass.eu/api/v1/passports/${id}/registry-readiness`,
  { headers: { Authorization: `Bearer ${process.env.TRACEPASS_API_KEY}` } },
);
const result = await res.json();

if (!result.ready) {
  // Each critical finding names the formal gap that blocks registry submission.
  for (const f of result.findings.filter((x) => x.severity === "critical")) {
    console.log(`${f.ruleId}: ${f.target ?? ""} — ${f.why}`);
  }
}
```

```python
import os, requests
res = requests.get(
    f"https://app.tracepass.eu/api/v1/passports/{passport_id}/registry-readiness",
    headers={"Authorization": f"Bearer {os.environ['TRACEPASS_API_KEY']}"},
)
res.raise_for_status()
result = res.json()
if not result["ready"]:
    for f in [x for x in result["findings"] if x["severity"] == "critical"]:
        print(f["ruleId"], f.get("target", ""), "—", f["why"])
```

## Responses

### 200 — not ready

```json
{
  "ready": false,
  "findings": [
    {
      "type": "missing_field",
      "severity": "critical",
      "target": "batteryUniqueIdentifier",
      "ruleId": "REG-READY-MANDATORY",
      "why": "A mandatory field that applies to this battery is missing.",
      "fix": "Provide batteryUniqueIdentifier before submitting to the registry."
    },
    {
      "type": "unverifiable_conditional",
      "severity": "warning",
      "target": "https://id.tracepass.eu/p/01/...",
      "ruleId": "REG-READY-LINK",
      "why": "This passport isn't published yet, so the registry link can't be checked live."
    }
  ]
}
```

### 200 — ready

```json
{
  "ready": true,
  "findings": []
}
```

### 404 — Not found

```json
{ "error": "Passport not found" }
```

## Related

- [Compliance verdict](https://www.tracepass.eu/docs/passport-compliance.md)
- [Get a single passport](https://www.tracepass.eu/docs/get-passport.md)
- [Update a field](https://www.tracepass.eu/docs/update-field.md)
