{
  "info": {
    "name": "Collecta DPP API v1.0.0",
    "description": "Every battery placed on the EU market from 18 February 2027 needs a digital passport. This API lets an ERP, MES or BMS create battery models, issue one passport per physical battery, publish them and keep their dynamic data current.\n\nAuthenticate with an API key created in the app (Organisation → API keys): `Authorization: Bearer dpp_live_…`. Keys carry `read` and/or `write` scopes. Records are never deleted over the API — a passport must stay available for ten years.\n\n**Conventions.** Lists are cursor-paginated (`limit`, `cursor` → `data`, `has_more`, `next_cursor`). Writes accept `Idempotency-Key`. `dpp_test_` keys and the `X-DPP-Dry-Run: true` header validate a write without storing it. Every response carries `x-request-id`; every error body carries `request_id`. Within v1 only additive changes are made.\n\nSet the collection variable `dpp_api_key` to a `dpp_test_…` key to start: test keys validate every write and store nothing. Generated from the OpenAPI 3.1.0 specification at https://dppapi-production.up.railway.app/v1/openapi.json.",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "auth": {
    "type": "bearer",
    "bearer": [
      {
        "key": "token",
        "value": "{{dpp_api_key}}",
        "type": "string"
      }
    ]
  },
  "variable": [
    {
      "key": "baseUrl",
      "value": "https://dppapi-production.up.railway.app/v1",
      "type": "string"
    },
    {
      "key": "dpp_api_key",
      "value": "",
      "type": "string",
      "description": "Your API key: dpp_test_… or dpp_live_…"
    }
  ],
  "item": [
    {
      "name": "Account",
      "description": "Who the key belongs to, and the EU data-point catalogue.",
      "item": [
        {
          "name": "Who am I",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/me",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "me"
              ]
            },
            "description": "Connection test: the key (name, scopes, mode), the organisation, its plan and this year's usage."
          },
          "response": []
        },
        {
          "name": "EU data-point catalogue",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/field-catalog",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "field-catalog"
              ],
              "query": [
                {
                  "key": "category",
                  "value": "EV",
                  "description": "Only this category's obligation.",
                  "disabled": true
                }
              ]
            },
            "description": "All 71 data points of DG GROW's \"Digital Batteries Passport – data points by category\" v2.0 (15 Aug 2026). Each names its obligation per category (`required`, `conditional`, `na`) and where it lives in this API: a field (with its name, unit, Annex XIII point, access tier and the endpoint that writes it), a model attribute, a document, or a platform-managed value."
          },
          "response": []
        },
        {
          "name": "This document",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/openapi.json",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "openapi.json"
              ]
            },
            "auth": {
              "type": "noauth"
            },
            "description": "This document"
          },
          "response": []
        }
      ]
    },
    {
      "name": "Models",
      "description": "Battery models: the data every battery of a type shares.",
      "item": [
        {
          "name": "List models",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/models",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "models"
              ],
              "query": [
                {
                  "key": "limit",
                  "value": "50",
                  "description": "Page size.",
                  "disabled": true
                },
                {
                  "key": "cursor",
                  "value": "",
                  "description": "`next_cursor` from the previous page.",
                  "disabled": true
                },
                {
                  "key": "category",
                  "value": "EV",
                  "description": "Filter by battery category.",
                  "disabled": true
                },
                {
                  "key": "updated_since",
                  "value": "",
                  "description": "Only models changed since then.",
                  "disabled": true
                },
                {
                  "key": "complete",
                  "value": "true",
                  "description": "Only complete, or only incomplete, models.",
                  "disabled": true
                }
              ]
            },
            "description": "Newest first, each with its completeness for its category."
          },
          "response": []
        },
        {
          "name": "Create a model",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "Makes a retry safe: the first answer is stored for 24 h and returned again (with `Idempotent-Replayed: true`). Reusing a key for a different request is refused with 422."
              },
              {
                "key": "X-DPP-Dry-Run",
                "value": "true",
                "description": "Validate this write in full and store nothing. Test keys (`dpp_test_…`) always dry-run.",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/models",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "models"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"category\": \"EV\",\n  \"name\": \"PowerCell EV-90\",\n  \"capacityKwh\": 90,\n  \"chemistry\": \"Li-ion NMC811\",\n  \"fields\": {\n    \"manufacturerName\": \"Nordvolt Energy GmbH\",\n    \"modelDesignation\": \"NV-EV-90\",\n    \"ratedCapacity\": 225,\n    \"nominalVoltage\": 400\n  }\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Category and capacity decide which fields the passport needs. Industrial batteries are in scope above 2 kWh."
          },
          "response": []
        },
        {
          "name": "Get a model",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/models/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "models",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "",
                  "description": "Model id"
                }
              ]
            },
            "description": "Get a model"
          },
          "response": []
        },
        {
          "name": "Update a model",
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "Makes a retry safe: the first answer is stored for 24 h and returned again (with `Idempotent-Replayed: true`). Reusing a key for a different request is refused with 422."
              },
              {
                "key": "X-DPP-Dry-Run",
                "value": "true",
                "description": "Validate this write in full and store nothing. Test keys (`dpp_test_…`) always dry-run.",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/models/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "models",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "",
                  "description": "Model id"
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"fields\": {\n    \"minVoltage\": 300,\n    \"maxVoltage\": 450\n  }\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Field values are merged: fields you leave out are unchanged."
          },
          "response": []
        },
        {
          "name": "Missing-field analysis",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/models/:id/completeness",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "models",
                ":id",
                "completeness"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "",
                  "description": "Model id"
                }
              ]
            },
            "description": "What this model still owes for its category: fields, core attributes (chemistry) and documents (EU declaration of conformity)."
          },
          "response": []
        },
        {
          "name": "Upload a document",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "Makes a retry safe: the first answer is stored for 24 h and returned again (with `Idempotent-Replayed: true`). Reusing a key for a different request is refused with 422."
              },
              {
                "key": "X-DPP-Dry-Run",
                "value": "true",
                "description": "Validate this write in full and store nothing. Test keys (`dpp_test_…`) always dry-run.",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/models/:id/documents",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "models",
                ":id",
                "documents"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "",
                  "description": "Model id"
                }
              ]
            },
            "body": {
              "mode": "formdata",
              "formdata": [
                {
                  "key": "file",
                  "type": "file",
                  "src": ""
                },
                {
                  "key": "type",
                  "type": "text",
                  "value": "EU Declaration of Conformity"
                },
                {
                  "key": "name",
                  "type": "text",
                  "value": ""
                },
                {
                  "key": "point",
                  "type": "text",
                  "value": "1"
                }
              ]
            },
            "description": "Multipart upload. `type` names the document, e.g. `EU Declaration of Conformity` or `Test Report`; `point` 1 is public, 3 is authority-only."
          },
          "response": []
        },
        {
          "name": "Validate a model draft",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "Makes a retry safe: the first answer is stored for 24 h and returned again (with `Idempotent-Replayed: true`). Reusing a key for a different request is refused with 422."
              },
              {
                "key": "X-DPP-Dry-Run",
                "value": "true",
                "description": "Validate this write in full and store nothing. Test keys (`dpp_test_…`) always dry-run.",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/models/validate",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "models",
                "validate"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"templateKey\": \"battery\",\n  \"category\": \"LMT\",\n  \"industrialExternalStorage\": false,\n  \"name\": \"string\",\n  \"capacityKwh\": 1,\n  \"chemistry\": \"string\",\n  \"fields\": {},\n  \"documentTypes\": [\n    \"string\"\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "The same schema and completeness analysis as creating a model, with nothing stored. Use it in your ERP before you send anything — it tells you which required fields, attributes and documents are still missing, and which field names it does not recognise."
          },
          "response": []
        },
        {
          "name": "List facilities",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/plants",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "plants"
              ]
            },
            "description": "Manufacturing plants, with how many passports name each."
          },
          "response": []
        },
        {
          "name": "Add a facility",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "Makes a retry safe: the first answer is stored for 24 h and returned again (with `Idempotent-Replayed: true`). Reusing a key for a different request is refused with 422."
              },
              {
                "key": "X-DPP-Dry-Run",
                "value": "true",
                "description": "Validate this write in full and store nothing. Test keys (`dpp_test_…`) always dry-run.",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/plants",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "plants"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"name\": \"Leipzig Gigafactory\",\n  \"location\": \"Leipzig, DE\",\n  \"esprFacilityId\": \"FAC-LEJ-01\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Add a facility"
          },
          "response": []
        }
      ]
    },
    {
      "name": "Batteries",
      "description": "Physical batteries. Creating one issues its passport, as a draft.",
      "item": [
        {
          "name": "List a model's batteries",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/models/:id/items",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "models",
                ":id",
                "items"
              ],
              "query": [
                {
                  "key": "page",
                  "value": "1",
                  "description": "Page number.",
                  "disabled": true
                },
                {
                  "key": "pageSize",
                  "value": "12",
                  "description": "Rows per page.",
                  "disabled": true
                },
                {
                  "key": "status",
                  "value": "draft",
                  "description": "Derived display status.",
                  "disabled": true
                },
                {
                  "key": "q",
                  "value": "",
                  "description": "Serial number or identifier, case-insensitive.",
                  "disabled": true
                }
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "",
                  "description": "Model id"
                }
              ]
            },
            "description": "List a model's batteries"
          },
          "response": []
        },
        {
          "name": "Create one battery",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "Makes a retry safe: the first answer is stored for 24 h and returned again (with `Idempotent-Replayed: true`). Reusing a key for a different request is refused with 422."
              },
              {
                "key": "X-DPP-Dry-Run",
                "value": "true",
                "description": "Validate this write in full and store nothing. Test keys (`dpp_test_…`) always dry-run.",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/items",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "items"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"modelId\": \"<model id>\",\n  \"serialNumber\": \"EVX-100001\",\n  \"dateOfManufacture\": \"2026-09-01\",\n  \"placeOfManufacture\": \"Leipzig Gigafactory\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Issues its unique identifier and a draft passport. Publishing is a separate, deliberate step."
          },
          "response": []
        },
        {
          "name": "Create many batteries",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "Makes a retry safe: the first answer is stored for 24 h and returned again (with `Idempotent-Replayed: true`). Reusing a key for a different request is refused with 422."
              },
              {
                "key": "X-DPP-Dry-Run",
                "value": "true",
                "description": "Validate this write in full and store nothing. Test keys (`dpp_test_…`) always dry-run.",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/items/batch",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "items",
                "batch"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"modelId\": \"<model id>\",\n  \"placeOfManufacture\": \"Leipzig Gigafactory\",\n  \"dateOfManufacture\": \"2026-09-01\",\n  \"rows\": [\n    {\n      \"serialNumber\": \"EVX-100001\"\n    },\n    {\n      \"serialNumber\": \"EVX-100002\"\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Up to 1,000 batteries in one call, in one transaction: either all are created or none. Give explicit `rows` (serials you already printed) or a `count` with an optional `serialPrefix`. Each battery gets its identifier and a draft passport. Send an `Idempotency-Key` so a retried request never creates them twice."
          },
          "response": []
        },
        {
          "name": "Get a battery",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/items/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "items",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "",
                  "description": "Battery item id"
                }
              ]
            },
            "description": "Get a battery"
          },
          "response": []
        }
      ]
    },
    {
      "name": "Passports",
      "description": "Publishing, dynamic data, lifecycle and QR codes.",
      "item": [
        {
          "name": "Get a passport",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/passports/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "passports",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "",
                  "description": "Passport id"
                }
              ]
            },
            "description": "The passport with its battery, model, dynamic events and status."
          },
          "response": []
        },
        {
          "name": "Publish a passport",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "Makes a retry safe: the first answer is stored for 24 h and returned again (with `Idempotent-Replayed: true`). Reusing a key for a different request is refused with 422."
              },
              {
                "key": "X-DPP-Dry-Run",
                "value": "true",
                "description": "Validate this write in full and store nothing. Test keys (`dpp_test_…`) always dry-run.",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/passports/:id/publish",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "passports",
                ":id",
                "publish"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "",
                  "description": "Passport id"
                }
              ]
            },
            "description": "Makes it resolvable at the public URL encoded in its QR code — a ten-year commitment. Refused with 422 `publish_blocked` and the list of `blockers` when the model is incomplete for its category or the battery has no place of manufacture. Dry-run it first to see the answer without publishing."
          },
          "response": []
        },
        {
          "name": "Publish many passports",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "Makes a retry safe: the first answer is stored for 24 h and returned again (with `Idempotent-Replayed: true`). Reusing a key for a different request is refused with 422."
              },
              {
                "key": "X-DPP-Dry-Run",
                "value": "true",
                "description": "Validate this write in full and store nothing. Test keys (`dpp_test_…`) always dry-run.",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/passports/publish",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "passports",
                "publish"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"ids\": [\n    \"string\"\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Publish many passports"
          },
          "response": []
        },
        {
          "name": "Dynamic data history",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/passports/:id/events",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "passports",
                ":id",
                "events"
              ],
              "query": [
                {
                  "key": "limit",
                  "value": "50",
                  "description": "Page size.",
                  "disabled": true
                },
                {
                  "key": "cursor",
                  "value": "",
                  "description": "`next_cursor` from the previous page.",
                  "disabled": true
                },
                {
                  "key": "since",
                  "value": "",
                  "description": "Recorded at or after.",
                  "disabled": true
                },
                {
                  "key": "event_type",
                  "value": "",
                  "description": "Only one event type, e.g. SOH_READING.",
                  "disabled": true
                }
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "",
                  "description": "Passport id"
                }
              ]
            },
            "description": "Append-only readings for this passport, newest first."
          },
          "response": []
        },
        {
          "name": "Record dynamic data",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "Makes a retry safe: the first answer is stored for 24 h and returned again (with `Idempotent-Replayed: true`). Reusing a key for a different request is refused with 422."
              },
              {
                "key": "X-DPP-Dry-Run",
                "value": "true",
                "description": "Validate this write in full and store nothing. Test keys (`dpp_test_…`) always dry-run.",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/passports/:id/events",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "passports",
                ":id",
                "events"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "",
                  "description": "Passport id"
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"eventType\": \"SOH_READING\",\n  \"payload\": {\n    \"stateOfCertifiedEnergy\": 94,\n    \"cycleCount\": 412\n  }\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Append-only: state of health, cycle count, state of charge, temperatures, throughput, negative events. The payload is keyed by field name (see /field-catalog, kind `dynamic`). Triggers the `passport.event_recorded` webhook."
          },
          "response": []
        },
        {
          "name": "Mark as recycled",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "Makes a retry safe: the first answer is stored for 24 h and returned again (with `Idempotent-Replayed: true`). Reusing a key for a different request is refused with 422."
              },
              {
                "key": "X-DPP-Dry-Run",
                "value": "true",
                "description": "Validate this write in full and store nothing. Test keys (`dpp_test_…`) always dry-run.",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/passports/:id/recycle",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "passports",
                ":id",
                "recycle"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "",
                  "description": "Passport id"
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"note\": \"string\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "The passport ceases (Art. 77(6)); the public URL then answers 410 Gone."
          },
          "response": []
        },
        {
          "name": "Published versions",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/passports/:id/versions",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "passports",
                ":id",
                "versions"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "",
                  "description": "Passport id"
                }
              ]
            },
            "description": "Each publication freezes and hashes the content."
          },
          "response": []
        },
        {
          "name": "QR code (SVG)",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/passports/:id/qr.svg",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "passports",
                ":id",
                "qr.svg"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "",
                  "description": "Passport id"
                }
              ]
            },
            "description": "QR code (SVG)"
          },
          "response": []
        },
        {
          "name": "QR code (PNG, print grade)",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/passports/:id/qr.png",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "passports",
                ":id",
                "qr.png"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "",
                  "description": "Passport id"
                }
              ]
            },
            "description": "QR code (PNG, print grade)"
          },
          "response": []
        },
        {
          "name": "List passports",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/passports",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "passports"
              ],
              "query": [
                {
                  "key": "limit",
                  "value": "50",
                  "description": "Page size.",
                  "disabled": true
                },
                {
                  "key": "cursor",
                  "value": "",
                  "description": "`next_cursor` from the previous page.",
                  "disabled": true
                },
                {
                  "key": "model_id",
                  "value": "",
                  "description": "Only this model's passports.",
                  "disabled": true
                },
                {
                  "key": "serial",
                  "value": "",
                  "description": "Exact serial number.",
                  "disabled": true
                },
                {
                  "key": "unique_identifier",
                  "value": "",
                  "description": "Exact passport identifier.",
                  "disabled": true
                },
                {
                  "key": "status",
                  "value": "draft",
                  "description": "Derived display status.",
                  "disabled": true
                },
                {
                  "key": "published",
                  "value": "true",
                  "description": "Only published, or only draft, passports.",
                  "disabled": true
                },
                {
                  "key": "created_since",
                  "value": "",
                  "description": "Created at or after.",
                  "disabled": true
                },
                {
                  "key": "updated_since",
                  "value": "",
                  "description": "Changed, or given new dynamic data, at or after.",
                  "disabled": true
                }
              ]
            },
            "description": "Every passport in the organisation, across models, newest first. For an incremental sync, store the time of your last sync and pass it as `updated_since`: it returns passports whose status changed or that received new dynamic data since then."
          },
          "response": []
        },
        {
          "name": "Change status (repurpose, re-use, remanufacture, waste)",
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "Makes a retry safe: the first answer is stored for 24 h and returned again (with `Idempotent-Replayed: true`). Reusing a key for a different request is refused with 422."
              },
              {
                "key": "X-DPP-Dry-Run",
                "value": "true",
                "description": "Validate this write in full and store nothing. Test keys (`dpp_test_…`) always dry-run.",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/passports/:id/status",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "passports",
                ":id",
                "status"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "",
                  "description": "Passport id"
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"status\": \"REPURPOSED\",\n  \"note\": \"Second life as stationary storage\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Annex XIII 4(c). Repurposing, re-using or remanufacturing a battery forks a NEW passport, linked to this one, with its own identifier (201, `forked: true`); `WASTE` changes this passport in place."
          },
          "response": []
        }
      ]
    },
    {
      "name": "Fleet",
      "description": "The same change across many passports.",
      "item": [
        {
          "name": "Apply a lifecycle event to many passports",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "Makes a retry safe: the first answer is stored for 24 h and returned again (with `Idempotent-Replayed: true`). Reusing a key for a different request is refused with 422."
              },
              {
                "key": "X-DPP-Dry-Run",
                "value": "true",
                "description": "Validate this write in full and store nothing. Test keys (`dpp_test_…`) always dry-run.",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/passports/bulk-lifecycle",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "passports",
                "bulk-lifecycle"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"passportIds\": [\n    \"string\"\n  ],\n  \"event\": \"putInService\",\n  \"date\": \"2027-01-15T10:00:00.000Z\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Apply a lifecycle event to many passports"
          },
          "response": []
        },
        {
          "name": "Update many passports from matched rows",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "Makes a retry safe: the first answer is stored for 24 h and returned again (with `Idempotent-Replayed: true`). Reusing a key for a different request is refused with 422."
              },
              {
                "key": "X-DPP-Dry-Run",
                "value": "true",
                "description": "Validate this write in full and store nothing. Test keys (`dpp_test_…`) always dry-run.",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/passports/import-updates",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "passports",
                "import-updates"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"modelId\": \"string\",\n  \"rows\": [\n    {\n      \"uniqueIdentifier\": \"string\",\n      \"serialNumber\": \"string\",\n      \"putIntoServiceAt\": \"2027-01-15T10:00:00.000Z\",\n      \"status\": \"waste\",\n      \"readings\": {}\n    }\n  ],\n  \"dryRun\": true\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Rows are matched by unique identifier or serial number. Set `dryRun` to see how many match and how many are public before writing."
          },
          "response": []
        }
      ]
    },
    {
      "name": "Data portability",
      "description": "Everything you hold with us, in one export.",
      "item": [
        {
          "name": "Export all data (JSON)",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/export",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "export"
              ]
            },
            "description": "Export all data (JSON)"
          },
          "response": []
        },
        {
          "name": "Export archive (ZIP)",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/export/archive",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "export",
                "archive"
              ]
            },
            "description": "Structured data, JSON-LD per passport, document bytes, QR and label artwork, supplier uploads, audit trail, and a SHA-256 manifest."
          },
          "response": []
        }
      ]
    },
    {
      "name": "Documents",
      "description": "Evidence attached to models: declarations of conformity, test reports, data sheets.",
      "item": [
        {
          "name": "List documents",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/documents",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "documents"
              ],
              "query": [
                {
                  "key": "limit",
                  "value": "50",
                  "description": "Page size.",
                  "disabled": true
                },
                {
                  "key": "cursor",
                  "value": "",
                  "description": "`next_cursor` from the previous page.",
                  "disabled": true
                },
                {
                  "key": "model_id",
                  "value": "",
                  "description": "Only this model's documents.",
                  "disabled": true
                },
                {
                  "key": "type",
                  "value": "",
                  "description": "Exact document type, case-insensitive.",
                  "disabled": true
                }
              ]
            },
            "description": "List documents"
          },
          "response": []
        },
        {
          "name": "Get a document",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/documents/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "documents",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "",
                  "description": "Document id"
                }
              ]
            },
            "description": "Get a document"
          },
          "response": []
        },
        {
          "name": "Download a document",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/documents/:id/download",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "documents",
                ":id",
                "download"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "",
                  "description": "Document id"
                }
              ]
            },
            "description": "Download a document"
          },
          "response": []
        }
      ]
    },
    {
      "name": "Audit",
      "description": "The integrity log.",
      "item": [
        {
          "name": "Audit trail",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/audit",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "audit"
              ],
              "query": [
                {
                  "key": "limit",
                  "value": "50",
                  "description": "Page size.",
                  "disabled": true
                },
                {
                  "key": "cursor",
                  "value": "",
                  "description": "`next_cursor` from the previous page.",
                  "disabled": true
                },
                {
                  "key": "entity",
                  "value": "",
                  "description": "e.g. BatteryPassport",
                  "disabled": true
                },
                {
                  "key": "entity_id",
                  "value": "",
                  "description": "One record's history.",
                  "disabled": true
                },
                {
                  "key": "since",
                  "value": "",
                  "description": "At or after.",
                  "disabled": true
                }
              ]
            },
            "description": "Who changed what, and when (Art. 78(g)), newest first. Changes made over the API are attributed to the member who created the key."
          },
          "response": []
        }
      ]
    },
    {
      "name": "Webhooks",
      "description": "Be told about changes instead of polling.",
      "item": [
        {
          "name": "List webhook endpoints",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/webhooks",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "webhooks"
              ]
            },
            "description": "List webhook endpoints"
          },
          "response": []
        },
        {
          "name": "Add a webhook endpoint",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "Makes a retry safe: the first answer is stored for 24 h and returned again (with `Idempotent-Replayed: true`). Reusing a key for a different request is refused with 422."
              },
              {
                "key": "X-DPP-Dry-Run",
                "value": "true",
                "description": "Validate this write in full and store nothing. Test keys (`dpp_test_…`) always dry-run.",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/webhooks",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "webhooks"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"url\": \"https://erp.example.com/dpp/webhooks\",\n  \"description\": \"SAP passport sync\",\n  \"events\": [\n    \"passport.published\",\n    \"passport.event_recorded\"\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "HTTPS only, never a private address. The response carries the signing secret (`whsec_…`) — the only time it is shown."
          },
          "response": []
        },
        {
          "name": "Event types",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/webhooks/event-types",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "webhooks",
                "event-types"
              ]
            },
            "description": "Event types"
          },
          "response": []
        },
        {
          "name": "Get an endpoint",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/webhooks/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "webhooks",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "",
                  "description": "Endpoint id"
                }
              ]
            },
            "description": "Get an endpoint"
          },
          "response": []
        },
        {
          "name": "Update an endpoint",
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "Makes a retry safe: the first answer is stored for 24 h and returned again (with `Idempotent-Replayed: true`). Reusing a key for a different request is refused with 422."
              },
              {
                "key": "X-DPP-Dry-Run",
                "value": "true",
                "description": "Validate this write in full and store nothing. Test keys (`dpp_test_…`) always dry-run.",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/webhooks/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "webhooks",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "",
                  "description": "Endpoint id"
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"enabled\": false\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Change the URL or events, or pause it with `enabled: false`."
          },
          "response": []
        },
        {
          "name": "Rotate the signing secret",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "Makes a retry safe: the first answer is stored for 24 h and returned again (with `Idempotent-Replayed: true`). Reusing a key for a different request is refused with 422."
              },
              {
                "key": "X-DPP-Dry-Run",
                "value": "true",
                "description": "Validate this write in full and store nothing. Test keys (`dpp_test_…`) always dry-run.",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/webhooks/:id/rotate-secret",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "webhooks",
                ":id",
                "rotate-secret"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "",
                  "description": "Endpoint id"
                }
              ]
            },
            "description": "The old secret stops verifying immediately."
          },
          "response": []
        },
        {
          "name": "Send a test event",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "Makes a retry safe: the first answer is stored for 24 h and returned again (with `Idempotent-Replayed: true`). Reusing a key for a different request is refused with 422."
              },
              {
                "key": "X-DPP-Dry-Run",
                "value": "true",
                "description": "Validate this write in full and store nothing. Test keys (`dpp_test_…`) always dry-run.",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/webhooks/:id/test",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "webhooks",
                ":id",
                "test"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "",
                  "description": "Endpoint id"
                }
              ]
            },
            "description": "Sends a signed `ping` now and returns what your endpoint answered."
          },
          "response": []
        },
        {
          "name": "Delivery log",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/webhooks/:id/deliveries",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "webhooks",
                ":id",
                "deliveries"
              ],
              "query": [
                {
                  "key": "limit",
                  "value": "50",
                  "description": "Page size.",
                  "disabled": true
                },
                {
                  "key": "cursor",
                  "value": "",
                  "description": "`next_cursor` from the previous page.",
                  "disabled": true
                },
                {
                  "key": "status",
                  "value": "pending",
                  "description": "Only one outcome.",
                  "disabled": true
                }
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "",
                  "description": "Endpoint id"
                }
              ]
            },
            "description": "Delivery log"
          },
          "response": []
        },
        {
          "name": "Resend a delivery",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "Makes a retry safe: the first answer is stored for 24 h and returned again (with `Idempotent-Replayed: true`). Reusing a key for a different request is refused with 422."
              },
              {
                "key": "X-DPP-Dry-Run",
                "value": "true",
                "description": "Validate this write in full and store nothing. Test keys (`dpp_test_…`) always dry-run.",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/webhooks/deliveries/:deliveryId/resend",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "webhooks",
                "deliveries",
                ":deliveryId",
                "resend"
              ],
              "variable": [
                {
                  "key": "deliveryId",
                  "value": "",
                  "description": "Delivery id"
                }
              ]
            },
            "description": "Resend a delivery"
          },
          "response": []
        }
      ]
    },
    {
      "name": "Suppliers",
      "description": "Ask suppliers for the data you do not hold; accept what they send.",
      "item": [
        {
          "name": "List supplier data requests",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/upload-links",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "upload-links"
              ]
            },
            "description": "Each request with its status (sent, opened, responded, accepted, expired, cancelled) and how many uploaded files await review."
          },
          "response": []
        },
        {
          "name": "Ask a supplier for data",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "Makes a retry safe: the first answer is stored for 24 h and returned again (with `Idempotent-Replayed: true`). Reusing a key for a different request is refused with 422."
              },
              {
                "key": "X-DPP-Dry-Run",
                "value": "true",
                "description": "Validate this write in full and store nothing. Test keys (`dpp_test_…`) always dry-run.",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/upload-links",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "upload-links"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"supplierName\": \"CellCore GmbH\",\n  \"supplierEmail\": \"qa@cellcore.example\",\n  \"modelId\": \"<model id>\",\n  \"requestedFields\": [\n    \"criticalRawMaterials\",\n    \"detailedComposition\"\n  ],\n  \"expiresInDays\": 30,\n  \"message\": \"Please confirm the cathode composition for the 2027 passport.\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Creates a password-less link the supplier opens to enter the fields you ask for or upload documents. The response carries the link's `token`; the supplier's page is `/u/{token}` on the public passport host. Their answer triggers `supplier.submitted`; nothing reaches your model until you accept it."
          },
          "response": []
        },
        {
          "name": "Files a supplier uploaded",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/upload-links/:id/files",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "upload-links",
                ":id",
                "files"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "",
                  "description": "Request id"
                }
              ]
            },
            "description": "Files a supplier uploaded"
          },
          "response": []
        },
        {
          "name": "Accept a supplier's values into the model",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "Makes a retry safe: the first answer is stored for 24 h and returned again (with `Idempotent-Replayed: true`). Reusing a key for a different request is refused with 422."
              },
              {
                "key": "X-DPP-Dry-Run",
                "value": "true",
                "description": "Validate this write in full and store nothing. Test keys (`dpp_test_…`) always dry-run.",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/upload-links/:id/accept",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "upload-links",
                ":id",
                "accept"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "",
                  "description": "Request id"
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"fields\": [\n    \"string\"\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Copies the submitted values you choose into the model and records where each came from."
          },
          "response": []
        }
      ]
    }
  ]
}
