Developers · Guides

Data portability

Take everything with you: the JSON export, the ZIP archive with JSON-LD, documents, labels, audit trail and a SHA-256 manifest.

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

Your data is yours, in formats that need nothing from us to read. Export is on every plan and keeps working even if the organisation is frozen.

Two exports

EndpointFormatUse it for
`GET /export`One JSON document, format collecta-dpp-export/1Loading into another system or a warehouse.
`GET /export/archive`ZIP, streamedA complete, verifiable copy — including files.

What the archive contains

PathContents
export.jsonOrganisation, plants, models, items, passports, dynamic events, registry records, declarations, conformity records, components.
passports/*.jsonldEach published passport as JSON-LD, with its version number and content hash.
documents/*The uploaded files — declarations of conformity, test reports and others.
qr/*.svgThe QR code of each passport, as vector artwork.
labels/*.svgPrint-ready label artwork produced for a passport.
uploads/*Files suppliers uploaded, with metadata in uploads.json.
mapping-templates.jsonSaved column-mapping templates from imports.
audit.jsonlThe audit trail, one entry per line.
manifest.jsonEvery entry with its size and SHA-256.
Download the archive
curl "https://dppapi-production.up.railway.app/v1/export/archive" \-H "Authorization: Bearer $DPP_API_KEY"
Save it to a file
curl -fSL "https://dppapi-production.up.railway.app/v1/export/archive" \-H "Authorization: Bearer $DPP_API_KEY" \-o collecta-dpp-export.zip

Verify it

manifest.json lists every other entry as { path, bytes, sha256 } under files. Recompute each SHA-256 and compare: a truncated or altered archive fails here.

// Node.js 18+. Node has no built-in ZIP reader, so extract with the system unzip first.import { execFileSync } from 'node:child_process';import { createHash } from 'node:crypto';import { readFile } from 'node:fs/promises';import { join } from 'node:path';const dir = 'collecta-dpp-export';execFileSync('unzip', ['-q', '-o', 'collecta-dpp-export.zip', '-d', dir]);const manifest = JSON.parse(await readFile(join(dir, 'manifest.json'), 'utf8'));let failures = 0;for (const entry of manifest.files) {const bytes = await readFile(join(dir, entry.path));const digest = createHash('sha256').update(bytes).digest('hex');const ok = bytes.length === entry.bytes && digest === entry.sha256;if (!ok) failures++;console.log(ok ? 'ok      ' : 'MISMATCH', entry.path);}console.log(`${manifest.files.length - failures} of ${manifest.files.length} files verified`);process.exitCode = failures ? 1 : 0;

Deliberately not included

  • Supplier upload-link tokens — they are live credentials, not data.
  • Passwords and session data, in any form.
  • Anything belonging to another organisation.

The identifiers

Identifiers are printed on batteries and never change, so an export does not move them: the printed address keeps pointing where it was printed to. Moving to another provider means the new provider takes the identifiers over and the printed address is redirected — arranged between providers. We accept identifiers issued elsewhere for exactly that reason, and the same works in reverse.

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