Alle Pfade dieser Seite hängen an der Basisadresse des Mandanten:
https://<mandant>.stp-cloud.de/documents/dms-cloud-api/api
Die Basisadresse trägt keine Versionsangabe – die
steht am Anfang jedes Pfades. Der vollständige Aufruf der Aktensuche
lautet also
https://<mandant>.stp-cloud.de/documents/dms-cloud-api/api/v1/dms/documents/container.
Der Vorteil dieser Aufteilung: Adressen, die die Schnittstelle selbst
zurückgibt – etwa die statusUrl eines Vorgangs – lassen
sich unverändert an die Basisadresse hängen.
Jeder Aufruf braucht zwei Scopes im Token: den
Lizenz-Scope des Mandanten
(dms.cloud.api.standalone oder die partnergebundene
Entsprechung) und den in der Spalte Benötigter Scope genannten
Capability-Scope des Endpunkts.
„Scope“ meint hier genau das, was im Zugriffstoken steht – dieselben Zeichenketten, die auch in der Client-Registrierung unter erlaubte Bereiche auswählbar sind. Fehlt einer der beiden, wird der Aufruf abgelehnt; welcher davon fehlt, sagt der Fehlercode (
403 LICENSE_MISSINGbzw.403 INSUFFICIENT_SCOPE). Einzelheiten in Lizenzen und Berechtigungen.
Akten, Ordner und Dokumente
| Verfahren und Adresse | Zweck | Benötigter Scope | Antwort |
|---|---|---|---|
GET /v1/dms/documents/container |
Akten und Ordner suchen oder durchblättern; beim Durchblättern wird jeweils eine Art gewählt | dms.cloud.api.documents.read |
200 |
GET /v1/dms/documents/container/{containerId}/documents |
Alle Dokumente einer Akte oder eines Ordners | dms.cloud.api.documents.read |
200 |
GET /v1/dms/documents/container/{containerId}/filing-tray |
Register einer Akte oder eines Ordners | dms.cloud.api.documents.read |
200 |
GET /v1/dms/documents/container/{containerId}/filing-tray/{trayId}/documents |
Dokumente eines einzelnen Registers, mit
?recursive=true einschließlich seiner Unterregister;
trayId=0 liefert die Dokumente, die direkt in der Akte
liegen und in keinem Register |
dms.cloud.api.documents.read |
200 |
GET /v1/dms/documents/{documentId} |
Stammdaten eines Dokuments (inkl. Ablageort, Herkunft und Sperrzustand) | dms.cloud.api.documents.read |
200 |
GET /v1/dms/documents/{documentId}/versions |
Versionsverlauf eines Dokuments | dms.cloud.api.documents.read |
200 |
GET /v1/dms/documents/{documentId}/versions/{version} |
Eine einzelne Version | dms.cloud.api.documents.read |
200 |
GET /v1/dms/documents/{documentId}/renditions |
Renditions einer Version | dms.cloud.api.documents.read |
200 |
POST /v1/dms/documents |
Ein bereitgestelltes Dokument importieren | dms.cloud.api.documents.write |
202 |
GET /v1/dms/documents/{documentId}/content |
Ein Dokument exportieren | dms.cloud.api.documents.read |
202 |
POST /v1/dms/documents/{documentId}/versions |
Eine neue Version eines vorhandenen Dokuments einstellen | dms.cloud.api.documents.write |
202 |
POST /v1/dms/documents/{documentId}/move |
Ein Dokument in eine andere Akte bzw. einen anderen Ordner umlegen | dms.cloud.api.documents.write |
200 |
Beim Umlegen werden Zielakte und Zielregister vorab geprüft: gibt es
die Akte nicht oder hat sie das angegebene Register nicht, ist die
Antwort 404 NOT_FOUND mit einer Meldung, die das Fehlende
benennt. targetTrayId darf 0 sein – das legt
das Dokument direkt in die Akte, in kein Register.
Register und Registerstruktur im Detail
Die Dokumentliste einer Akte ist flach – sie nennt nicht, in welchem
Register ein Dokument liegt. Die Untergliederung liefert
.../filing-tray, und zwar die gesamte
Registerstruktur der Akte in einer Antwort, nicht nur die oberste
Ebene.
Ein Eintrag nennt trayId, name und
displayText, dazu drei Felder, die die Struktur tragen:
| Feld | Bedeutung |
|---|---|
parentTrayId |
Das übergeordnete Register. 0 heißt, das Register hängt
unmittelbar an der Akte; jeder andere Wert ist die trayId
des Registers eine Ebene darüber. Daraus wird der Registerbaum
gebildet. |
position |
Die Reihenfolge unter den Geschwisterregistern, so wie sie im
Dokumentenmanagement angezeigt wird. Danach wird sortiert – nicht nach
trayId und nicht nach Name. |
documentCount |
Die Zahl der Dokumente unmittelbar in diesem Register, ohne die seiner Unterregister. |
Register sind also verschachtelbar, und die Schnittstelle bildet das
vollständig ab. Ein einzelnes Register wird über
.../filing-tray/{trayId}/documents gelesen; mit
?recursive=true liefert der Aufruf zusätzlich die Dokumente
aller darunter liegenden Register. Damit lässt sich ein Teilbaum der
Akte gezielt übernehmen, statt alle Dokumente der Akte zu holen und
anschließend auszusortieren.
trayId=0 ist kein Register, sondern die Ablage direkt in
der Akte – die Dokumente, die in keinem Register einsortiert sind. In
der Registerliste erscheint 0 deshalb nicht, und
recursive bleibt dort ohne Wirkung.
Beim Import und beim Umlegen benennt trayId bzw.
targetTrayId das Zielregister; 0 legt das
Dokument direkt in die Akte. Welchem Register ein einzelnes Dokument
zugeordnet ist, steht in seinen Stammdaten unter
filing.
Versionen und Renditions im Detail
Ein Dokument kann mehrere Versionen haben – jede Version ist ein eigener Inhaltsstand, die neueste ist die aktuelle. Zu jeder Version kann es zusätzlich Renditions geben: alternative Darstellungen desselben Inhalts, etwa eine PDF-Vorschau oder ein Volltextauszug.
| Was Sie tun wollen | Aufruf |
|---|---|
| Stammdaten eines Dokuments lesen | GET …/{documentId} |
| Vorhandene Versionen auflisten | GET …/{documentId}/versions |
| Eine einzelne Version lesen | GET …/{documentId}/versions/3 |
| Vorhandene Renditions auflisten | GET …/{documentId}/renditions |
| Aktuelle Version im Originalformat abrufen | GET …/{documentId}/content |
| Eine bestimmte Version abrufen | GET …/{documentId}/content?version=3 |
| Eine Rendition abrufen | GET …/{documentId}/content?rendition=stp.doc.preview |
| Eine neue Version einstellen | Datei bereitstellen, dann
POST …/{documentId}/versions
|
Die Stammdaten nennen neben Titel, Kommentar und Klasse auch,
wie das Dokument ins Dokumentenmanagement gelangt ist
(source, etwa bea oder scan), ob
es Ein- oder Ausgang ist (mailRoute), das Datum des
Schreibens – und ob eine Änderung derzeit abgelehnt würde
(lockState). Letzteres lohnt sich vor dem
Bereitstellen einer Datei: ein gesperrtes Dokument nimmt keine neue
Version an.
Wer ein Dokument angelegt oder zuletzt geändert hat, wird bewusst nicht ausgegeben. Das Dokumentenmanagement führt dort Benutzerkonten Ihrer Kanzlei; die Schnittstelle nennt Zeitpunkte, keine Namen.
Beim Einstellen einer neuen Version ändert sich nur der
Inhalt: Akte, Register, Titel und Dokumentklasse bleiben, wie
sie sind. Das Feld comment beschreibt die neue Version –
anders als beim Import eines neuen Dokuments wird daraus
nicht der Titel des Dokuments. Ohne
comment wird der Kommentar der bisherigen Version
übernommen.
Ist das Dokument gerade von jemand anderem in Bearbeitung, wurde es
zwischenzeitlich geändert, ist es eingefroren oder zum Löschen
vorgemerkt, scheitert der Vorgang mit
errorCode: "CONFLICT". Dann das Dokument erneut lesen und
den Aufruf wiederholen.
Zu beachten:
-
Renditions können nur abgerufen werden. Diese
Schnittstelle bietet keinen Weg, eine Rendition zu hinterlegen oder zu
löschen; sie entstehen im Dokumentenmanagement selbst – bekannte Namen
sind
stp.doc.preview(PDF-Vorschau) undstp.doc.fulltext.txt(Volltext). -
Ohne
versiongilt die neueste Version. Welche es war, steht im Ergebnis des Vorgangs. -
Welche Versionen und Renditions es gibt, sagt Ihnen die
Schnittstelle. Der Versionsverlauf nennt die Versionsnummern,
die Renditions-Liste die Namen – beides ist genau das, was
?version=und?rendition=beim Abruf erwarten. Eine Nummer oder einen Namen, den es nicht gibt, beantwortet die Schnittstelle mit404. - Der Versionsverlauf nennt je Version nur die Anzahl
der Renditions, nicht deren Namen – so bleibt die Antwort auch bei
vielen Versionen kompakt. Die Namen liefert
GET …/{documentId}/renditions.
Die Suche nach Akten und Ordnern im Detail
GET /v1/dms/documents/container kennt vier
Betriebsarten. Es darf höchstens einer der drei Suchparameter gesetzt
sein:
| Parameter | Wirkung |
|---|---|
name |
Exakte Suche über den Aktennamen (nur Akten, keine Ordner) |
fileReference |
Exakte Suche über das Aktenzeichen (nur Akten, keine Ordner) |
searchTerm |
Präfixsuche über Name und Aktenzeichen – bei Akten immer, bei Ordnern nur, wenn die Aktensuche selbst unter 1000 Treffer bleibt |
| (keiner) | Seitenweises Durchblättern – ohne weitere Angabe aller
Akten, mit containerType=folder aller
eigenen Ordner
|
containerType |
Nur beim Durchblättern: dossier (Akten, Voreinstellung)
oder folder (Ordner). Nicht mit name,
fileReference oder searchTerm
kombinierbar |
pageSize |
Anzahl der Treffer je Seite, 1 bis 25, Voreinstellung 15 |
continuationToken |
Der Wert aus nextContinuationToken der vorherigen
Seite |
Ein Suchparameter, der zwar mitgeschickt wird, aber leer ist oder nur
aus Leerzeichen besteht, wird mit 400 VALIDATION_FAILED
abgelehnt. Wer alle Akten durchblättern möchte, lässt ihn weg – sonst
wäre nicht zu unterscheiden, ob nichts gefunden wurde oder ohne
Kriterium gesucht wurde.
Beim Durchblättern wird immer genau eine Art
gelistet: Akten und Ordner liegen im Dokumentenmanagement in getrennten
Beständen mit eigener Zählung, eine gemischte Liste beider Arten gibt es
deshalb nicht. Wer beides braucht, blättert zweimal – einmal ohne
containerType und einmal mit
containerType=folder. Ein anderer Wert als
dossier oder folder wird mit
400 VALIDATION_FAILED abgelehnt, ebenso
containerType zusammen mit einem der drei Suchparameter:
name und fileReference suchen ausschließlich
in Akten, und bei searchTerm entscheidet das
Dokumentenmanagement selbst über die Arten.
containerType=folder setzt einen aktualisierten
Connector voraus. Ein Connector, der diesen Parameter noch
nicht kennt, meldet trotzdem 200 – blättert dann aber
unbemerkt Akten statt Ordner, ohne Fehlermeldung. Bleiben die
zurückgegebenen Treffer bei containerType=folder unerwartet
vom Typ Akte, zunächst die installierte Connector-Version prüfen, bevor
die eigene Integration verdächtigt wird.
Der continuationToken gehört zu genau der Abfrage, die
ihn erzeugt hat: zur Betriebsart und zu den
Suchkriterien, beim Durchblättern einschließlich
containerType. Wird er mit einem anderen Kriterium
weiterverwendet, ist die Antwort 400 VALIDATION_FAILED und
nicht etwa eine Seite aus der falschen Treffermenge. Eine Seite aus dem
Ordner-Durchblättern lässt sich also nicht im Akten-Durchblättern
fortsetzen. Dasselbe gilt für die beiden Dokumentlisten – dort ist der
Zeiger an die Akte und, beim Register, zusätzlich an Register und
recursive gebunden. Die Seitengröße der beiden
Dokumentlisten reicht von 1 bis 200, Voreinstellung 50.
Ein Treffer nennt Kennung, Bezeichnung, das kanzleiinterne
Aktenzeichen, das gerichtliche Aktenzeichen und die Art (Akte oder
Ordner) – dazu accessLevel, also was der aufrufende
Benutzer mit dieser Akte darf (none, read,
write, full). Damit lässt sich ein nur
lesbarer Treffer erkennen, bevor ein Schreibversuch daran scheitert.
Fehlt das Feld, meldet das Dokumentenmanagement eine Berechtigung, die
diese Schnittstelle nicht kennt – dann sagt erst der Aufruf selbst, was
erlaubt ist.
Ein Eintrag der beiden Dokumentlisten nennt Kennung,
name, title, documentType,
sizeBytes, modifiedAt und
letterDate. name und title
beantworten zwei verschiedene Fragen und werden deshalb beide
ausgegeben:
| Feld | Bedeutung |
|---|---|
name |
Der Dateiname der aktuellen Fassung. Häufig eine Scanner- oder Systembezeichnung – und er ändert sich, wenn eine neue Fassung unter anderem Dateinamen abgelegt wird |
title |
Der Titel aus dem Dokumentenmanagement – was ein Benutzer erfasst hat und in einer Liste wiedererkennt. Maßgeblich ist der Titel der aktuellen Fassung, weil eine Umbenennung dort festgehalten wird |
modifiedAt |
Wann das Dokument im Dokumentenmanagement zuletzt geändert wurde |
letterDate |
Das Datum, das das Dokument selbst trägt (Schreiben vom). Leer, wenn keines hinterlegt ist – es wird nicht durch ein anderes Datum ersetzt |
Für eine Übersicht ist title die richtige Anzeigespalte
und letterDate das fachlich richtige Sortierkriterium;
modifiedAt ist ein technischer Zeitstempel und sagt nichts
darüber, wann ein Schreiben verfasst wurde.
title und letterDate setzen einen
aktualisierten Connector voraus. Ein Connector, der die beiden
Felder noch nicht kennt, meldet trotzdem 200 – dann trägt
title denselben Wert wie name und
letterDate bleibt bei allen Dokumenten leer. Sieht eine
Übersicht durchgehend nach Dateinamen aus und bleibt die Datumsspalte
leer, zuerst die installierte Connector-Version prüfen, bevor die eigene
Integration verdächtigt wird.
Ist im Dokumentenmanagement kein Titel erfasst, trägt
title die Kennung des Dokuments – denselben Wert wie
documentId, und damit auch hier den Wert, den der
Einzelabruf meldet. Eine Anzeige, die das nicht erwartet, zeigt in
solchen Zeilen eine lange Zeichenfolge.
Beteiligte einer Akte – Mandant, Gegner, Sachbearbeiter – gibt die Schnittstelle bewusst nicht aus. Es sind personenbezogene Daten, und keine Funktion dieser Schnittstelle braucht sie.
Bereitstellung von Dateien
Diese Endpunkte gehören zur Plattform und sind unabhängig vom Dokumentenmanagement. Sie erzeugen zeitlich befristete, signierte Adressen; die Dateibytes laufen nicht über die Schnittstelle.
| Verfahren und Adresse | Zweck | Benötigter Scope |
|---|---|---|
POST /v1/platform/uploads/single |
Eine Ablageadresse für eine Datei erzeugen | dms.cloud.api.uploads |
DELETE /v1/platform/uploads/{objectKey} |
Ein bereitgestelltes, nicht mehr benötigtes Objekt löschen | dms.cloud.api.uploads |
POST /v1/platform/multipart/initiate |
Mehrteilige Ablage beginnen, Adressen je Teil erzeugen | dms.cloud.api.uploads |
POST /v1/platform/multipart/complete |
Mehrteilige Ablage aus den Teilen zusammenführen | dms.cloud.api.uploads |
DELETE /v1/platform/multipart/abort |
Mehrteilige Ablage abbrechen und Teile verwerfen | dms.cloud.api.uploads |
GET /v1/platform/multipart/refresh |
Abgelaufene Teil-Adressen neu erzeugen | dms.cloud.api.uploads |
GET /v1/platform/multipart/parts |
Bereits abgelegte Teile auflisten, um fortzusetzen | dms.cloud.api.uploads |
Die mehrteilige Variante ist für große Dateien gedacht. Für alles,
was in einem Zug übertragen werden kann, genügt
uploads/single.
Vorgänge und Betriebszustand
| Verfahren und Adresse | Zweck | Benötigter Scope |
|---|---|---|
GET /v1/platform/operations/{operationId} |
Zustand und Ergebnis eines mit 202 angenommenen
Vorgangs |
derjenige des auslösenden Aufrufs |
GET /v1/platform/connector/heartbeat |
Verbindungszustand des Connectors dieser Kanzlei | dms.cloud.api.connector.read |
Die Vorgangsabfrage verlangt genau denselben Scope wie der Aufruf, der den Vorgang ausgelöst hat. Ein Abruf verrät also nie mehr, als der ursprüngliche Aufruf gedurft hätte.
Der Zustandsabruf des Connectors verlangt einen eigenen Scope (
dms.cloud.api.connector.read), der bewusst nicht mit dem Bereitstellen von Dateien zusammenfällt: Wer nur wissen will, ob der Connector läuft, soll dafür keine Schreibberechtigung brauchen. Der Bereich muss der Rolle ausdrücklich zugewiesen sein – ohne ihn antwortet der Endpunkt mit403 INSUFFICIENT_SCOPE, auch wenn alle übrigen Aufrufe funktionieren.
Zustände eines Vorgangs
status |
Bedeutung |
|---|---|
pending |
Läuft noch. Später erneut abfragen. |
succeeded |
Fertig. result enthält die Antwort des auslösenden
Aufrufs. |
failed |
Abgelehnt — der Vorgang hat nicht stattgefunden.
reason und errorCode nennen den Grund. |
ambiguous |
Beendet, aber unentschieden: es lässt sich nicht feststellen, ob das
DMS den Vorgang ausgeführt hat (OPERATION_TIMEOUT,
OPERATION_RESULT_UNREADABLE,
OPERATION_OUTCOME_UNKNOWN). Vor dem erneuten Senden im DMS
nachsehen — sonst droht ein doppeltes Dokument. |
(404) |
Unbekannte Kennung, oder der Abrufzeitraum von sieben Tagen ist abgelaufen. |
Welche Aufrufe synchron und welche asynchron sind
| Art | Endpunkte | Grund |
|---|---|---|
Synchron (200) |
Alle Suchen, Auflistungen und Stammdaten-Abrufe, Umlegen | Antwort in Sekundenbruchteilen |
Asynchron (202 und Abfrage) |
Import und Export von Dokumenten, neue Versionen | Kann bei großen Dateien länger dauern, als das Zeitlimit der Schnittstelle zulässt |
Ein 202 bedeutet angenommen, nicht
erledigt. Die Prüfung der Anfrage findet trotzdem
sofort statt: Eine fehlerhafte Anfrage ist ein 400 auf
diesen Aufruf und wird nie zu einem gescheiterten Vorgang.
Immer sinnvolle Kopfzeilen
| Kopfzeile | Zweck |
|---|---|
Authorization: Bearer … |
Pflicht bei jedem Aufruf |
X-Correlation-Id |
Eigene Vorgangskennung, erscheint in Antwort und Protokollen |
Idempotency-Key |
Bei verändernden Aufrufen – siehe Idempotenz und Wiederholungen |
Es gibt keine Kopfzeile für den Mandanten. Der Mandant wird ausschließlich dem Token entnommen.
Weiterführend
Verknüpfung mit