---
title: Адрес за EU DPP Registry на паспорт на батерия
description: Уникалният идентификатор на продукта за онлайн формуляра на EU DPP Registry за паспорт на батерия. Операторът сам го регистрира. Платени планове.
canonical: "https://www.tracepass.eu/bg/docs/passport-registry-upi"
locale: bg
source: "https://www.tracepass.eu/bg/docs/passport-registry-upi"
---

# Адрес за EU DPP Registry на паспорт на батерия

> Уникалният идентификатор на продукта за онлайн формуляра на EU DPP Registry за паспорт на батерия. Операторът сам го регистрира. Платени планове.

```http
POST /api/v1/passports/{id}/registry-upi
```

Връща уникалния идентификатор на продукта (UPI), който се поставя в онлайн формуляра на EU DPP Registry за един публикуван паспорт на **батерия**, като `{ upi, preparedAt }`. Икономическият оператор регистрира паспорта на уебсайта на регистъра със собствения си EU Login (Product group: Batteries; Granularity: Item). TracePass подготвя адреса и записва, че го е подготвил; никога не подава нищо към регистъра.

**Първото извикване фиксира адреса** в паспорта като `registryUpi`, а следващите извиквания връщат същия адрес. Регистърът пази URL адреса, който е получил, затова този адрес трябва да продължи да се отваря, дори ако домейнът на акаунта ви се промени по-късно. Всяко извикване записва подготовката в паспорта (`registrationPreparedAt`, `registrationPreparedVia: "form"`). Подготовката не е регистрация: след като регистърът отговори, запишете отговора му с `POST /api/v1/passports/{id}/registration`.

Отказите връщат **409** с код в `error`: `not_a_battery`, `not_published` (само публикуван паспорт може да бъде регистриран), `registered_in_production` (паспортът вече е регистриран в производствения регистър), `registry_not_ready` (паспортът има блокираща констатация от проверката за готовност за регистъра; `findingDetails` изброява констатациите, като блокиращите са първи, от същата проверка като `GET /api/v1/passports/{id}/registry-readiness`) и `invalid_upi` (адресът не е `https://` URL с най-много 2000 знака).

**Само за платени планове** (`402` при Free: паспорт на Free изтича след 30 дни). OAuth извикванията трябва да са от името на администратор или собственик. Без тяло на заявката. Брои се като едно v1 записване, и то само когато извикването е успешно. Поддържа `Idempotency-Key`.

## Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `Authorization` | header | string | yes | `Bearer <token>` — или `tp_` API ключ (Developer → API Keys; най-просто, за server-to-server), или OAuth 2.0 access token (Developer → OAuth Apps; за приложения, авторизирани от потребител, scoped и отзоваеми). Страницата Authentication съдържа пълния OAuth поток и списъка със scopes. |
| `Idempotency-Key` | header | string | no | UUID v4. |
| `id` | path | string (24 hex chars) | yes | ID на публикуван паспорт на батерия. |

## Examples

```bash
curl -sS -X POST \
  https://app.tracepass.eu/api/v1/passports/6650b2c3d4e5f6a7b8c9d0e1/registry-upi \
  -H "Authorization: Bearer tp_REDACTED_xxxxxxxxxxxx" \
  -H "Idempotency-Key: 7c2e4a91-3d5b-4f8e-a6c0-1b9d2e4f6a80"
```

```typescript
const res = await fetch(
  `https://app.tracepass.eu/api/v1/passports/${id}/registry-upi`,
  {
    method: "POST",
    headers: {
      Authorization: `Bearer ${process.env.TRACEPASS_API_KEY}`,
      "Idempotency-Key": crypto.randomUUID(),
    },
  },
);

if (res.status === 409) {
  const { error, findingDetails } = await res.json();
  // e.g. registry_not_ready: findingDetails lists the blocking findings first.
  console.log(error, findingDetails ?? []);
} else if (res.ok) {
  // Paste upi into the EU DPP Registry's online form, under your own EU Login.
  const { upi } = await res.json();
  console.log(upi);
}
```

```python
import os, uuid, requests
res = requests.post(
    f"https://app.tracepass.eu/api/v1/passports/{passport_id}/registry-upi",
    headers={
        "Authorization": f"Bearer {os.environ['TRACEPASS_API_KEY']}",
        "Idempotency-Key": str(uuid.uuid4()),
    },
)
if res.status_code == 409:
    body = res.json()
    print(body["error"], body.get("findingDetails", []))
else:
    res.raise_for_status()
    print(res.json()["upi"])  # paste into the Registry's online form
```

## Responses

### 200 — Адрес за поставяне

```json
{
  "upi": "https://id.tracepass.eu/01/04012345000016/21/A1B2C3",
  "preparedAt": "2026-11-06T10:00:00.000Z"
}
```

### 409 — Регистърът не е готов

```json
{
  "error": "registry_not_ready",
  "findingDetails": [
    {
      "severity": "critical",
      "ruleId": "REG-READY-MANDATORY",
      "target": "batteryUniqueIdentifier",
      "why": "A mandatory field that applies to this battery is missing.",
      "fix": "Provide batteryUniqueIdentifier before submitting to the registry."
    }
  ]
}
```

### 409 — Вече регистриран

```json
{ "error": "registered_in_production" }
```

### 402 — План Free

```json
{ "error": "Available on every paid plan. Upgrade to use it." }
```

## Related

- [Записване на резултата от регистъра](https://www.tracepass.eu/bg/docs/record-passport-registration.md)
- [Създаване на файл за качване](https://www.tracepass.eu/bg/docs/registry-upload-file.md)
- [Проверка на готовността за регистъра](https://www.tracepass.eu/bg/docs/passport-registry-readiness.md)
