Dieser Artikel liegt noch nicht auf Deutsch vor und wird unten auf Englisch angezeigt.
On this page400 · Bad request
Every value of error the API answers with — 36 in all — grouped by HTTP status. Each has a stable link, so a log line or a support ticket can point straight at it. Most are snake_case codes; a few older routes answer with a short English message such as Not found, listed here under its own spelling. For the error shape, validation details and request IDs, see Errors.
{"error": "idempotency_key_reused","message": "This Idempotency-Key was already used for a different request. Use a new key for a new request.","request_id": "3f1c2a9e-8d4b-4c6f-9e2a-7b5d1c0e8f34"}400 Bad request
The body or the query string failed schema validation.
Fix
detailsmaps each invalid field to its messages. Fix the request; sending it again unchanged fails again.Extra properties:
detailsEvery endpoint that takes a body or query parametersThe
Idempotency-Keyheader is empty or longer than 255 characters.FixSend 1–255 characters; a UUID per logical operation is ideal. See Idempotency.
Any write (POST, PATCH, PUT)The request said
Content-Type: application/jsonbut sent no body.FixSend
{}for a write without parameters (for examplePOST /passports/{id}/publish), or drop the header.Any write (POST, PATCH, PUT)A document upload arrived without a
filepart.FixSend
multipart/form-datawith the file in a part namedfile.A document upload arrived without a
type.FixAdd a
typepart, for exampleEU Declaration of Conformity.
401 Unauthorised
402 Payment required
Your plan does not include this. API access itself (
erp_api) is on every plan; publishing needs a paid plan and supplier requests need Growth.Fix
featurenames what is missing andrequiredPlanthe plan that includes it. Upgrade, then retry.Extra properties:
featurerequiredPlanThe organisation is on the Maintenance plan, which keeps published passports resolving but pauses creating and publishing.
Fix
featurenames what is paused. Return to a production plan to resume; reads and exports keep working.Extra properties:
featureThe same operations as plan_upgrade_required
403 Forbidden
The key is valid but lacks the scope this call needs:
readfor GET (andPOST /models/validate),writefor everything else.FixUse a key with the
writescope for writes. Scopes are fixed when a key is created; see Authentication.Any write (POST, PATCH, PUT)A
DELETEwas sent with an API key. Records are never deleted over the API — a passport must stay available for ten years.FixRecycle or change the status instead, or delete in the app, where deletions are audited. See Why there is no DELETE.
Any DELETE
404 Not found
- not_found404
Also spelled
Not foundNo record with this id in your organisation. Records of other organisations are indistinguishable from records that do not exist. Older routes spell it
Not found; both share this entry. Bulk endpoints also usenot_foundper row, with the response itself succeeding.FixCheck the id and that the key belongs to the organisation that owns the record. Branch on the status, not on the spelling.
modelId(or the model in the path) does not name a model in your organisation.FixCreate the model first, or use the id
POST /modelsreturned.The method and path are not part of the API — usually a typo, a missing
/v1, or the wrong method.Fix
messagerepeats what was called. Compare with the API reference.Any unknown /v1 pathThe public resolver has no published passport under this identifier: it was never issued, or it is still a draft.
FixPublish the passport. A fabricated identifier and an unpublished one answer the same, on purpose.
409 Conflict
The organisation is frozen and read-only. Published passports keep resolving and data stays exportable.
Fix
frozenAtandreasonsay when and why. Reads and exports keep working; contact us to reactivate.Extra properties:
frozenAtreasonAny write (POST, PATCH, PUT)The
uniqueIdentifieryou brought over already exists. An identifier resolves to exactly one battery and is never reused.FixLook the battery up with
GET /passports?unique_identifier=…instead of creating it again.The first request with this
Idempotency-Keyis still running.FixRetry shortly with the same key; you will get the stored answer once the first request finishes.
Any write (POST, PATCH, PUT)The battery was recycled, so its passport has ceased (Art. 77(8)) and can no longer be published or change status.
FixNothing to retry. A recycled passport is final; the resolver answers 410 for it.
- no_model409
The supplier request is not attached to a model, so there is nowhere to accept its values into.
FixCreate supplier requests with a
modelIdwhen you mean to accept values into a model.
410 Gone
Also spelled
Passport has ceasedThe battery was recycled and its passport has ceased. The JSON-LD resolver answers
Passport has ceasedfor the same case.FixShow the reader that the battery was recycled — 410, unlike 404, means the passport existed.
413 · 415 Payload too large, unsupported type
The document is larger than 25 MB.
FixCompress or split the document; the limit is per file.
The document is not a PDF, JPEG or PNG.
FixConvert it to PDF, which is what market surveillance authorities expect for declarations and reports.
The request body has a
Content-Typethe API does not parse.FixSend
application/json, ormultipart/form-datafor document uploads.Any write (POST, PATCH, PUT)
422 Unprocessable
The passport cannot be published yet: the battery has no place of manufacture, or the model is missing required data for its category.
Fix
blockerslists each reason (missing_place_of_manufacture,model_incompletewith themissingfields). Fill them, then publish again. Check ahead withGET /models/{id}/completeness.Extra properties:
blockersA
uniqueIdentifieryou brought over breaks the identifier rules (characters, length, format).Fix
violationslists each broken rule andmessageexplains them. OmituniqueIdentifierto have one minted for you.Extra properties:
violationsThe
putInServicelifecycle event needs an in-service date.FixAdd
date(ISO 8601) to the request.The webhook URL is not acceptable: not https, credentials in the URL, a host that does not resolve, or one that resolves to a private address.
Fix
messagenames the problem. Use a public https URL; authenticate deliveries with the signature, not the URL.This
Idempotency-Keywas already used, within 24 hours, for a request with a different method, path or body.FixUse a new key for a new request. Reuse a key only to retry the exact same request.
Any write (POST, PATCH, PUT)None of the fields you asked to accept were proposed by the supplier on this request.
FixRead the request first (
GET /upload-links) and accept only fields it carries.
429 · 5xx Rate limits and server errors
More requests than the key’s per-minute limit: 600 for live keys, 60 for test keys.
FixWait for the seconds in
retry-after, then retry. See Rate limits.Every endpointSomething failed on our side.
FixRetry with backoff and the same
Idempotency-Key— a 5xx is never stored, so the retry runs again. Quoterequest_idif you contact us.Every endpoint
207 Per-row codes in bulk responses
Bulk endpoints answer for every row. When any row fails the response is 207, and each failed row carries ok: false and one of these codes in error. not_found is also used per row; it is documented above.
- ceasedper row
The passport in this row was recycled, so it cannot be published.
FixDrop the row; nothing will change its outcome.
- missing_place_of_manufactureper row
The battery in this row has no place of manufacture. The EU registry refuses a passport without one.
FixSet
placeOfManufactureon the battery, then publish the row again. Also appears as ablockers[].reasonofpublish_blocked. - model_incompleteper row
The model is missing data required for its battery category;
messagenames it.FixFill the fields
GET /models/{id}/completenesslists, then publish again. Also appears as ablockers[].reasonofpublish_blocked. - already_recycledper row
The passport in this row has ceased (recycled), so the change was skipped.
FixNothing to do; the skip is reported so you can see it happened.
- nothing_to_changeper row
The row matched a battery but none of its values differ from what is stored.
FixNothing to do. Send only rows that change something to keep the result short.