Developers · Core concepts

Requests and responses

Base URL, JSON conventions, identifiers, dates, request IDs and the headers every request and response carries.

Version
v1.0.0
Base URL
https://dppapi-production.up.railway.app/v1
Format
JSON · OpenAPI 3.1
FeedbackLast updated
On this pageBase URL and transport

Base URL and transport

All endpoints are under https://dppapi-production.up.railway.app/v1, over HTTPS only. The public resolver lives at https://dppapi-production.up.railway.app/p/…, outside /v1, because it is the address printed in QR codes. Cross-origin requests are allowed on /v1 from any origin — keys travel in a header, never a cookie — but keys are secrets: call the API from your servers.

JSON in, JSON out

  • Request bodies are JSON with Content-Type: application/json, except document uploads (multipart/form-data).
  • Send Content-Type: application/json only when there is a body. A write without a body (publish, test webhook) that declares JSON is rejected with 400.
  • Responses are JSON (application/json; charset=utf-8), except QR images, documents, the export archive and JSON-LD (application/ld+json).
  • Property names are camelCase on resources; list envelopes, error fields and query parameters use snake_case (has_more, request_id, updated_since).

Identifiers

KindExampleNotes
Record idcm1q8y0bq0006l70fx9y8z7w6Opaque string. Store it as text; do not parse it.
Battery unique identifierC-7KQ2M9XHT4RC- + 11 characters, no ambiguous letters. Immutable, printed on the label, resolvable at /p/{uniqueIdentifier}.
Serial numberC48-2027-0001Yours. Searchable, not unique across models.
Request id3f1c2a9e-8d4b-4c6f-9e2a-7b5d1c0e8f34Per request; see below.

Dates and times

Timestamps are ISO 8601 in UTC (2027-01-15T10:02:11.000Z). Date inputs accept a date (2027-01-15) or a full timestamp. Filters such as updated_since accept a date or a date-time with an offset.

Request IDs

Every response carries an X-Request-Id header, and every /v1 error body repeats it as request_id. Log it with every failure: quoting it is the fastest way for us to find exactly what happened. You may also send your own X-Request-Id (for example your trace id) and it is used for the request.

404 · a mistyped path
{"error": "route_not_found","message": "GET /v1/pasports is not part of the API. See /v1/openapi.json.","request_id": "3f1c2a9e-8d4b-4c6f-9e2a-7b5d1c0e8f34"}

Headers at a glance

HeaderDirectionPurpose
Authorization: Bearer dpp_…RequestYour API key. Required on /v1 except /openapi.json.
Content-Type: application/jsonRequestOnly with a JSON body.
Idempotency-KeyRequestMakes a POST or PATCH safe to retry. Details.
X-DPP-Dry-Run: trueRequestLive key: validate without storing. Details.
X-Request-IdBothCorrelates a request with our logs.
X-DPP-ModeResponselive or test.
X-DPP-Dry-Run: trueResponseThis answer is a dry run; nothing was stored.
X-DPP-Api-VersionResponseThe API version that answered, e.g. 1.0.0.
Idempotent-Replayed: trueResponseThis is a stored response being replayed.
x-ratelimit-limit / -remaining / -resetResponseYour rate-limit budget. Details.
retry-afterResponseOn 429: seconds to wait.

Success codes

StatusMeaning
200 OKRead, update, or a dry run that would have succeeded.
201 CreatedA record was created (model, battery, document, event, linked passport).
207 Multi-StatusA bulk request where at least one row failed; read results.

Every failure is described in Errors.

Cookie preferences

You choose which cookies are used. You can change your choice at any time with “Cookie settings” in the footer. Privacy policy

Necessary

Always on

Needed for the site to work: your light/dark theme and this cookie choice are stored in your browser. They do not track you.

Analytics

Google Analytics 4 measures how pages are used through statistics, which helps us improve the site. If you accept, it sets cookies and measures your visit in full. If you decline, it sets no cookies, but Google may still receive technical data such as the page viewed, your browser type and IP address.

_ga, _ga_* · up to 2 years · Google