Referenz: Abgleich-Manifest
GET /sync
Berechtigung Lesen. Jedes Dokument und jede Kategorie, die der Schlüssel sieht, mit nur den Feldern, die man zum Vergleichen braucht. Damit finden Sie, was weg ist: gelöscht, aus der freigegebenen Sicht archiviert, oder außer Reichweite der handelnden Person.
false, wenn es mehr als 50.000 Dokumente gibt und die Liste abgeschnitten wurde. Dann löschen Sie danach nichts.Anfrage
curl https://ddm.example.com/api/ext/v1/sync \
-H "Authorization: Bearer $DDM_API_KEY"
Antwort · 200 OK
{
"generatedAt": "2026-10-27T20:01:47.990Z",
"complete": true,
"documents": [
{
"id": "dc8594e0-0ead-4049-aaee-2ef899bcf76f",
"externalRef": "PIM-4711",
"sourceId": "5d02b7aa-5175-42e9-9277-aa19063833f2",
"status": "draft",
"currentVersionId": "1730e7bb-2f98-4761-aa9b-964c521351b3",
"checksum": "0bcb7c3b4886f699a985563d7bc9476bf75b4af35a57ff959f46c37e386cf54f",
"categoryIds": [
"078a554f-19a2-4285-b854-8546de01f815"
],
"updatedAt": "2026-10-27T20:01:47.284Z"
}
],
"categories": [
{
"id": "7a7afae0-f77b-478b-975d-d29eace15d51",
"parentId": null,
"externalRef": "CAT-10",
"updatedAt": "2026-10-27T20:01:46.086Z"
},
{
"id": "078a554f-19a2-4285-b854-8546de01f815",
"parentId": "7a7afae0-f77b-478b-975d-d29eace15d51",
"externalRef": "CAT-11",
"updatedAt": "2026-10-27T20:01:46.138Z"
},
{
"id": "45dc485e-d982-466a-8ab6-e8ac328b800f",
"parentId": "7a7afae0-f77b-478b-975d-d29eace15d51",
"externalRef": null,
"updatedAt": "2026-10-27T20:01:46.200Z"
}
]
}
Beispiel: gelöschte Dokumente finden
Bewahren Sie das Manifest jedes Laufs auf. Beim nächsten Lauf holen Sie ein neues und vergleichen: Jede id, die im alten stand und im neuen fehlt, ist für diesen Schlüssel weg. Das Dokument kann gelöscht, aus der freigegebenen Sicht archiviert oder dorthin verschoben worden sein, wo die Person des Schlüssels es nicht sieht.
# Das Manifest des letzten Laufs liegt in manifest-previous.json.
curl -s https://ddm.example.com/api/ext/v1/sync \
-H "Authorization: Bearer $DDM_API_KEY" > manifest.json
# Über 50.000 Dokumenten abgeschnitten? Dann nichts vergleichen.
if [ "$(jq .complete manifest.json)" != "true" ]; then
echo "Manifest unvollständig – es wird nichts gelöscht" >&2; exit 1
fi
# Die IDs, die beim letzten Mal da waren und jetzt nicht mehr.
jq -r '.documents[].id' manifest-previous.json | sort > previous.txt
jq -r '.documents[].id' manifest.json | sort > current.txt
comm -23 previous.txt current.txt > gone.txt
while read -r id; do
echo "weg: $id" # hier aus Ihrem System entfernen
done < gone.txt
mv manifest.json manifest-previous.json
import { readFile, writeFile } from 'node:fs/promises'
const response = await fetch('https://ddm.example.com/api/ext/v1/sync', {
headers: { Authorization: `Bearer ${process.env.DDM_API_KEY}` }
})
const manifest = await response.json()
// Über 50.000 Dokumenten abgeschnitten? Dann nichts vergleichen.
if (!manifest.complete) throw new Error('Manifest unvollständig – es wird nichts gelöscht')
const previous = JSON.parse(await readFile('manifest-previous.json', 'utf8').catch(() => '{"documents":[]}'))
const present = new Set(manifest.documents.map(document => document.id))
const gone = previous.documents.filter(document => !present.has(document.id))
for (const document of gone) {
// externalRef ist bei eingespielten Dokumenten gesetzt – oft die ID, die Ihr System kennt.
console.log('weg:', document.id, document.externalRef ?? '')
// hier aus Ihrem System entfernen
}
await writeFile('manifest-previous.json', JSON.stringify(manifest))
import json, os, requests
manifest = requests.get(
"https://ddm.example.com/api/ext/v1/sync",
headers={"Authorization": f"Bearer {os.environ['DDM_API_KEY']}"},
).json()
# Über 50.000 Dokumenten abgeschnitten? Dann nichts vergleichen.
if not manifest["complete"]:
raise SystemExit("Manifest unvollständig – es wird nichts gelöscht")
try:
with open("manifest-previous.json") as file:
previous = json.load(file)
except FileNotFoundError:
previous = {"documents": []}
present = {document["id"] for document in manifest["documents"]}
gone = [document for document in previous["documents"] if document["id"] not in present]
for document in gone:
print("weg:", document["id"], document.get("externalRef") or "")
# hier aus Ihrem System entfernen
with open("manifest-previous.json", "w") as file:
json.dump(manifest, file)
$headers = @{ Authorization = "Bearer $env:DDM_API_KEY" }
$manifest = Invoke-RestMethod -Uri "https://ddm.example.com/api/ext/v1/sync" -Headers $headers
# Über 50.000 Dokumenten abgeschnitten? Dann nichts vergleichen.
if (-not $manifest.complete) { throw "Manifest unvollständig – es wird nichts gelöscht" }
$previous = if (Test-Path manifest-previous.json) { Get-Content manifest-previous.json -Raw | ConvertFrom-Json } else { @{ documents = @() } }
$present = [System.Collections.Generic.HashSet[string]]::new([string[]]$manifest.documents.id)
foreach ($document in $previous.documents) {
if (-not $present.Contains($document.id)) {
Write-Output "weg: $($document.id) $($document.externalRef)"
# hier aus Ihrem System entfernen
}
}
$manifest | ConvertTo-Json -Depth 5 | Set-Content manifest-previous.json
„Weg“ bedeutet in allen drei Fällen dasselbe: Entfernen Sie das Dokument aus Ihrem System, oder blenden Sie es dort aus. Wenn Sie wissen müssen, warum es weg ist, fragen Sie GET /documents/{id} mit einem Schlüssel, der alles sieht. 404 heißt gelöscht; sonst sagen status und categoryIds, was sich geändert hat.
completetrue ist. Und misstrauen Sie einem Manifest, das plötzlich leer oder viel kleiner ist – ein entzogenes Recht oder eine andere handelnde Person lässt alles auf einmal „verschwinden“. Eine sinnvolle Sicherung: anhalten und jemanden benachrichtigen, wenn in einem Lauf mehr als etwa 10 % der Dokumente gelöscht würden.Änderungsfeed oder Manifest?
| Frage | Nehmen Sie |
|---|---|
| Was ist seit meinem letzten Lauf neu oder geändert? | GET /documents?updatedSince=… – klein, schnell, seitenweise |
| Was ist weg? | GET /sync – vollständig, aber größer |
| Wurde im CMS etwas neu abgelegt oder neu verschlagwortet? | GET /sync für die Ablage, GET /documents/{id} für die Schlagwörter |
Ein guter Rhythmus: der Änderungsfeed alle paar Minuten, das Manifest einmal pro Stunde oder pro Nacht.