Referenz: Dokumente
Basisadresse: https://<Ihre CMS-Adresse>/api/ext/v1. Jede Anfrage braucht Authorization: Bearer <Schlüssel>. Berechtigung sagt, was der Schlüssel braucht.
Das Dokument-Objekt
pdf.id, versionNo, checksum (SHA-256, hex), sizeBytes, mimeType, createdAt.updatedAt ist die letzte Änderung – siehe Änderungsfeed.PUT /documents/ref/{ref} – einspielen
Berechtigung Schreiben. Legt das Dokument mit dieser Referenz in der Push-Quelle des Schlüssels an, oder aktualisiert es. Siehe Dokumente einspielen.
Inhalt: multipart/form-data mit
name, categoryPath, categoryIds, categoryRefs, mimeType, tags, titles, groupName – alle optional. Mit categoryIds und/oder categoryRefs liegt das Dokument genau dort, mit categoryPath zusätzlich in der Kategorie des Pfads.oder application/json mit denselben Feldern wie metadata, plus
Antwort: 201 (angelegt) oder 200, mit { "outcome": "created" | "versioned" | "unchanged" | "skipped", "document": Dokument | null }.
Fehler: 400 ungültige Angaben · 403 Nur-Lesen-Schlüssel, Push-Quelle fehlt oder ist aus, fehlende Rechte · 409 eine Freigabe läuft · 413 Datei zu groß oder Speicher voll · 415 falscher Content-Type · 422 fileUrl nicht ladbar.
Anfrage
curl -X PUT "https://ddm.example.com/api/ext/v1/documents/ref/PIM-4711" \
-H "Authorization: Bearer $DDM_API_KEY" \
-F "file=@Price-list-2026.pdf;type=application/pdf" \
-F 'metadata={"categoryPath": "Products/Price lists", "tags": ["Prices", "2026"], "titles": {"DE": "Preisliste 2026"}};type=application/json'
Antwort · 201 Created
{
"outcome": "created",
"document": {
"id": "dc8594e0-0ead-4049-aaee-2ef899bcf76f",
"externalRef": "PIM-4711",
"sourceId": "5d02b7aa-5175-42e9-9277-aa19063833f2",
"name": "Price-list-2026.pdf",
"fileType": "pdf",
"mimeType": "application/pdf",
"sizeBytes": 589,
"status": "draft",
"shareable": true,
"highlighted": false,
"titles": {
"DE": "Preisliste 2026"
},
"tags": [
"2026",
"Prices"
],
"categoryIds": [
"078a554f-19a2-4285-b854-8546de01f815"
],
"currentVersion": {
"id": "b5a8ce67-c8f1-439a-aadb-86e1b73223e2",
"versionNo": 1,
"checksum": "5db6ba22797a193286fdebf4919730b4571146bde75bb4ad3dc856a38f2f71c1",
"sizeBytes": 589,
"mimeType": "application/pdf",
"createdAt": "2026-10-27T20:01:46.510Z"
},
"createdAt": "2026-10-27T20:01:46.510Z",
"updatedAt": "2026-10-27T20:01:46.838Z"
}
}
Dieselbe Datei noch einmal, dann eine geänderte:
200,"outcome": "unchanged"– dieselbe Version200,"outcome": "versioned"–currentVersion.versionNoist jetzt 2
PUT /documents/{id} – neue Bytes über die id
Berechtigung Schreiben. Dieselben Inhalte wie beim Einspielen – Multipart mit file und metadata oder JSON mit fileUrl –, aber für ein Dokument, das Sie über die id von DDM ansprechen:
- Gehört es zur Push-Quelle des Schlüssels, ist es dasselbe wie
PUT /documents/ref/{ref}mit seiner Referenz – mit den Regeln der Quelle. - Jedes andere Dokument, z. B. eines, das im CMS hochgeladen wurde, bekommt eine neue Version wie bei einem Upload.
tags,titles,categoryIdsundcategoryRefsgelten wie beim Einspielen.
Antwort: 200 mit outcome und dem Dokument.
GET /documents – Liste und Änderungsfeed
Berechtigung Lesen. Die Dokumente, die der Schlüssel sieht, älteste Änderung zuerst.
nextCursor der vorigen Seite.categoryId.categoryId oder categoryRef: die Kategorien darunter einschließen.Antwort: { "data": Dokument[], "nextCursor": string | null }.
Anfrage
curl "https://ddm.example.com/api/ext/v1/documents?limit=2&own=true" \
-H "Authorization: Bearer $DDM_API_KEY"
Antwort · 200 OK
{
"data": [
{
"id": "dc8594e0-0ead-4049-aaee-2ef899bcf76f",
"externalRef": "PIM-4711",
"sourceId": "5d02b7aa-5175-42e9-9277-aa19063833f2",
"name": "Price-list-2026.pdf",
"fileType": "pdf",
"mimeType": "application/pdf",
"sizeBytes": 605,
"status": "draft",
"shareable": true,
"highlighted": false,
"titles": {
"DE": "Preisliste 2026"
},
"tags": [
"2026",
"Prices"
],
"categoryIds": [
"078a554f-19a2-4285-b854-8546de01f815"
],
"currentVersion": {
"id": "1730e7bb-2f98-4761-aa9b-964c521351b3",
"versionNo": 2,
"checksum": "0bcb7c3b4886f699a985563d7bc9476bf75b4af35a57ff959f46c37e386cf54f",
"sizeBytes": 605,
"mimeType": "application/pdf",
"createdAt": "2026-10-27T20:01:46.904Z"
},
"createdAt": "2026-10-27T20:01:46.510Z",
"updatedAt": "2026-10-27T20:01:47.169Z"
}
],
"nextCursor": null
}
GET /documents/{id} · GET /documents/ref/{ref}
Berechtigung Lesen. Ein Dokument. 404, wenn es nicht existiert oder der Schlüssel es nicht sieht. Über die Referenz nur innerhalb der Push-Quelle des Schlüssels.
Anfrage
curl https://ddm.example.com/api/ext/v1/documents/dc8594e0-0ead-4049-aaee-2ef899bcf76f \
-H "Authorization: Bearer $DDM_API_KEY"
curl https://ddm.example.com/api/ext/v1/documents/ref/PIM-4711 \
-H "Authorization: Bearer $DDM_API_KEY"
Antwort · 200 OK
{
"id": "dc8594e0-0ead-4049-aaee-2ef899bcf76f",
"externalRef": "PIM-4711",
"sourceId": "5d02b7aa-5175-42e9-9277-aa19063833f2",
"name": "Price-list-2026.pdf",
"fileType": "pdf",
"mimeType": "application/pdf",
"sizeBytes": 605,
"status": "draft",
"shareable": true,
"highlighted": false,
"titles": {
"DE": "Preisliste 2026"
},
"tags": [
"2026",
"Prices"
],
"categoryIds": [
"078a554f-19a2-4285-b854-8546de01f815"
],
"currentVersion": {
"id": "1730e7bb-2f98-4761-aa9b-964c521351b3",
"versionNo": 2,
"checksum": "0bcb7c3b4886f699a985563d7bc9476bf75b4af35a57ff959f46c37e386cf54f",
"sizeBytes": 605,
"mimeType": "application/pdf",
"createdAt": "2026-10-27T20:01:46.904Z"
},
"createdAt": "2026-10-27T20:01:46.510Z",
"updatedAt": "2026-10-27T20:01:47.169Z"
}
PATCH /documents/{id} · PATCH /documents/ref/{ref}
Berechtigung Schreiben. Ändert nur, was gesendet wird:
null entfernt ein Ende.categoryIds zählen beide: 1–20 Kategorien insgesamt.Antwort: das Dokument. Fehler: 400, 403, 404, 409 (Freigabe läuft).
Anfrage
curl -X PATCH https://ddm.example.com/api/ext/v1/documents/dc8594e0-0ead-4049-aaee-2ef899bcf76f \
-H "Authorization: Bearer $DDM_API_KEY" -H "Content-Type: application/json" \
-d '{"shareable":false,"tags":["Prices","2026","Export"]}'
curl -X PATCH https://ddm.example.com/api/ext/v1/documents/ref/PIM-4711 \
-H "Authorization: Bearer $DDM_API_KEY" -H "Content-Type: application/json" \
-d '{"shareable":false,"tags":["Prices","2026","Export"]}'
Antwort · 200 OK
{
"id": "dc8594e0-0ead-4049-aaee-2ef899bcf76f",
"externalRef": "PIM-4711",
"sourceId": "5d02b7aa-5175-42e9-9277-aa19063833f2",
"name": "Price-list-2026.pdf",
"fileType": "pdf",
"mimeType": "application/pdf",
"sizeBytes": 605,
"status": "draft",
"shareable": false,
"highlighted": false,
"titles": {
"DE": "Preisliste 2026"
},
"tags": [
"2026",
"Export",
"Prices"
],
"categoryIds": [
"078a554f-19a2-4285-b854-8546de01f815"
],
"currentVersion": {
"id": "1730e7bb-2f98-4761-aa9b-964c521351b3",
"versionNo": 2,
"checksum": "0bcb7c3b4886f699a985563d7bc9476bf75b4af35a57ff959f46c37e386cf54f",
"sizeBytes": 605,
"mimeType": "application/pdf",
"createdAt": "2026-10-27T20:01:46.904Z"
},
"createdAt": "2026-10-27T20:01:46.510Z",
"updatedAt": "2026-10-27T20:01:47.260Z"
}
DELETE /documents/{id} · DELETE /documents/ref/{ref}
Berechtigung Schreiben. Löscht das Dokument. Antwort: 204. Fehler: 403, 404, 409 (Aufbewahrungsschutz, Freigabe läuft).
Anfrage
curl -X DELETE https://ddm.example.com/api/ext/v1/documents/dc8594e0-0ead-4049-aaee-2ef899bcf76f \
-H "Authorization: Bearer $DDM_API_KEY"
curl -X DELETE https://ddm.example.com/api/ext/v1/documents/ref/PIM-4711 \
-H "Authorization: Bearer $DDM_API_KEY"
Antwort · 204 No Content – Kein Inhalt.
GET /documents/{id}/content · GET /documents/ref/{ref}/content
Berechtigung Lesen. Die Datei.
Header: Range, If-None-Match. Antwort: 200, 206 oder 304, mit Content-Type, Content-Length, ETag und Content-Disposition. Mit einem Schlüssel für freigegebene Inhalte lassen sich nur Dokumente herunterladen, die die App verlassen dürfen (shareable), sonst 403.
Anfrage
curl -o Price-list-2026.pdf -D - \
https://ddm.example.com/api/ext/v1/documents/dc8594e0-0ead-4049-aaee-2ef899bcf76f/content \
-H "Authorization: Bearer $DDM_API_KEY"
Antwort · 200 OK – Header der Antwort – der Inhalt ist die Datei selbst:
HTTP/1.1 200 OK
accept-ranges: bytes
content-disposition: attachment; filename="Price-list-2026.pdf"; filename*=UTF-8''Price-list-2026.pdf
content-length: 605
content-type: application/pdf
etag: "1730e7bb-2f98-4761-aa9b-964c521351b3"
Mit dem letzten ETag als If-None-Match antwortet eine unveränderte Datei ohne Inhalt:
HTTP/1.1 304 Not Modified
cache-control: private, max-age=300, must-revalidate
etag: "1730e7bb-2f98-4761-aa9b-964c521351b3"
Mit Range: bytes=0-99 nur ein Teil davon:
HTTP/1.1 206 Partial Content
accept-ranges: bytes
content-disposition: attachment; filename="Price-list-2026.pdf"; filename*=UTF-8''Price-list-2026.pdf
content-length: 100
content-range: bytes 0-99/605
content-type: application/pdf
etag: "1730e7bb-2f98-4761-aa9b-964c521351b3"
GET /documents/{id}/text · GET /documents/ref/{ref}/text
Berechtigung Lesen. Der Text, den DDM aus der aktuellen Version gelesen hat, für einen Suchindex: { "versionId", "versionNo", "language", "content" }. Folgt den Regeln für Leser, auch bei einem Schlüssel, der alles sieht.
Anfrage
curl https://ddm.example.com/api/ext/v1/documents/dc8594e0-0ead-4049-aaee-2ef899bcf76f/text \
-H "Authorization: Bearer $DDM_API_KEY"
Antwort · 200 OK
{
"versionId": "1730e7bb-2f98-4761-aa9b-964c521351b3",
"versionNo": 2,
"language": null,
"content": "Price list 2026, second edition"
}
GET /documents/{id}/thumbnail · GET /documents/ref/{ref}/thumbnail
Berechtigung Lesen. Das Vorschaubild der ersten Seite. versionId wie bei content.
Anfrage
curl -o preview.webp https://ddm.example.com/api/ext/v1/documents/dc8594e0-0ead-4049-aaee-2ef899bcf76f/thumbnail \
-H "Authorization: Bearer $DDM_API_KEY"
Antwort · 200 OK – Header der Antwort – der Inhalt ist die Datei selbst:
HTTP/1.1 200 OK
cache-control: private, max-age=300, must-revalidate
content-length: 5052
content-type: image/webp
etag: "1730e7bb-2f98-4761-aa9b-964c521351b3"