Das folgende Dokument beschreibt die Übersicht über die
API des dgb-server
.
Um sich beim Server anzumelden, benötigt man ein Token, was
im HTTP-Header Authentication
gesendet wird. Um dieses Token
zu generieren, muss eine Form-Anfrage mit email
und passwort
nach /login
gePOSTet werden:
status
: String: immer"error"
token
: String: Token, 30 Minuten lang gültig
status
: String: immer"error"
code
: Integer: Fehlercode- 0: Benutzer nicht gefunden
- 500: Interner Fehler
text
: String: Fehlermeldung vorformatiert als Text
POST /login HTTP/1.1
Content-Type: application/x-www-form-urlencoded
email=max@mustermann.de&passwort=abc123
{
"status": "ok",
"token": "S0VLU0UhIExFQ0tFUiEK"
}
GET /suche/Mein%20Suchbegriff HTTP/1.1
Content-Type: application/json
Authorization: Bearer S0VLU0UhIExFQ0tFUiEK
{
"status": "ok",
"grundbuecher": [],
"aenderungen": []
}
- Suche:
GET /suche/{suchbegriff}
: Durchsucht die Grundbuchblätter und Änderungsmitteilungen nachsuchbegriff
- Download:
GET /download/gbx/{amtsgericht}/{grundbuch_von}/{blatt}
: gibt die .gbx (= JSON) Datei des Grundbuchblatts vonamtsgericht
,grundbuch_von
,blatt
als JSON ausGET /download/pdf/{amtsgericht}/{grundbuch_von}/{blatt}
: gibt das Grundbuchblatt als PDF aus oder eine JSON-Fehlermeldung
- Upload:
POST /upload
: Lädt eine Grundbuchänderung hoch (wenn Benutzerkonto + Signatur stimmen)
- Abonnements: Bei einer Änderung des abonnierten Grundbuchblatts wird der
entsprechede Webhook aktiviert bzw. eine E-Mail gesendet
POST /abo-neu/email/{amtsgericht}/{grundbuchbezirk}/{blatt}
POST /abo-neu/webhook/{amtsgericht}/{grundbuchbezirk}/{blatt}
POST /abo-loeschen/{id}
Durchsucht Grundbuchblätter nach einem Suchbegriff
URL: GET /suche
GET https://127.0.0.1/suche/Suchbegriff HTTP/1.1
Authorization: Bearer S0VLU0UhIExFQ0tFUiEK
status
: String: immer"ok"
grundbuecher
: Array[Objekt]: Grundbücher, die den Suchbegriff enthalten (max. 50 Ergebnisse)titelblatt
: Objekt: Titelblatt des gefundenen Grundbuchsamtsgericht
: String: Amtsgericht des gefundenen Grundbuchsgrundbuch_von
: String: Grundbuchblattbezirk des gefundenen Grundbuchsblatt
: String: Blatt-Nr. des gefundenen Grundbuchs
ergebnis
: Objekt: Suchergebnis im Suchindexland
: String: Bundesland des gefundenen Grundbuchsamtsgericht
: String: Amtsgericht des gefundenen Grundbuchsgrundbuch_von
: String: Grundbuchblattbezirk des gefundenen Grundbuchsblatt
: String: Blatt-Nr. des gefundenen Grundbuchsabteilung
: String: Abteilung, in der der Suchbegriff gefunden wurdebv
: Bestandsverzeichnisbv-herrschvermerke
: Bestandsverzeichnis, aber der gefundene Eintrag ist ein HVMbv-zuschreibungen
: Bestandsverzeichnis (Zuschreibungen)bv-abschreibungen
: Bestandsverzeichnis (Abschreibungen)abt1
: Abteilung 1, Spalte 1 - 2abt1-grundlagen-eintragungen
: Abteilung 1, Spalte 3 - 4abt1-veraenderungen
: Abteilung 1 (Veränderungen)abt1-loeschungen
: Abteilung 1 (Löschungen)abt2
: Abteilung 2abt2-veraenderungen
: Abteilung 2 (Veränderungen)abt2-loeschungen
: Abteilung 2 (Löschungen)abt3
: Abteilung 3abt3-veraenderungen
: Abteilung 3 (Veränderungen)abt3-loeschungen
: Abteilung 3 (Löschungen)
lfd_nr
: String: Laufende Nummer des gefundenen Textstext
: String: Gefundener Text
abos
: Array[Objekt]: Abonnements für dieses Grundbuchblatt (ein Blatt kann unter mehreren Aktenzeichen abonniert sein)amtsgericht
: String: Amtsgericht des Abonnementsgrundbuchbezirk
: String: Grundbuchbezirk des Abonnementsblatt
: String: Blatt-Nr. des Abonnementstext
: String: E-Mail des Abonnenten (= "max@mustermann.de"
)aktenzeichen
: String: Aktenzeichen des Abonnements
status
: String: immer"error"
code
: Integer: Fehlercode- 0: Benutzer nicht gefunden
- 500: Interner Fehler
text
: String: Fehlermeldung vorformatiert als Text
URL: GET /download/pdf/{amtsgericht}/{grundbuch_von}/{blatt}
Rendert den momentanen Stand des Grundbuchs in eine PDF-Datei
GET https://127.0.0.1/download/pdf/Prenzlau/Schenkenberg/289 HTTP/1.1
Authorization: Bearer S0VLU0UhIExFQ0tFUiEK
PDF-Datei im Format application/pdf
JSON-Objekt mit den Feldern:
status
: String: immer"error"
code
: Integer: Fehlercode- 0: Benutzer nicht gefunden
- 1: Ungültiges Amtsgericht / ungültiger Gemarkungsbezirk
- 404: Grundbuchblatt existiert (noch) nicht
- 500: Interner Fehler
text
: String: Fehlermeldung vorformatiert als Text
URL: GET /download/gbx/{amtsgericht}/{grundbuch_von}/{blatt}
Gibt den momentanen Stand des Grundbuchs im JSON-Format (.gbx) zurück
GET https://127.0.0.1/download/gbx/Prenzlau/Schenkenberg/289 HTTP/1.1
Authorization: Bearer S0VLU0UhIExFQ0tFUiEK
status
: String: immer"ok"
datei
,gbx_datei_pfad
,titelblatt
, ...: GBX-Datei, Format siehe unten
status
: String: immer"error"
code
: Integer: Fehlercode- 0: Benutzer nicht gefunden
- 1: Ungültiges Amtsgericht / ungültiger Gemarkungsbezirk
- 404: Grundbuchblatt existiert (noch) nicht
- 500: Interner Fehler
text
: String: Fehlermeldung vorformatiert als Text
Legt ein neues E-Mail-Abonnement für den Benutzer an (aktenzeichen
ist optional)
URL: POST /abo-neu/{typ}/{amtsgericht}/{grundbuchbezirk}/{blatt}
FORM:
- `typ`: Typ des Abonnements, `email` oder `webhook`
- `aktenzeichen`: Optional[String]: Aktenzeichen, was auf Benachrichtigungen bei
Grundbuchänderungen an diesem Blatt später bei "Ihr Zeichen" / "Unser Zeichen"
auftauchen wird.
POST https://127.0.0.1/abo-neu/email/Prenzlau/Schenkenberg/289 HTTP/1.1
Authorization: Bearer S0VLU0UhIExFQ0tFUiEK
Content-Type: application/x-www-form-urlencoded
aktenzeichen=ABC%20DEF
Wenn das Grundbuchblatt jetzt geändert wird, wird der Benutzer, welcher die Anfrage gestellt hat, eine E-Mail mit Hinweis auf die Änderung erhalten, mit dem Hinweis auf das Aktenzeichen "ABC DEF".
status
: String: immer"ok"
status
: String: immer"error"
code
: Integer: Fehlercode- 0: Benutzer nicht gefunden
- 500: Interner Fehler
text
: String: Fehlermeldung vorformatiert als Text
Funktioniert genau wie "EMail-Abonnement anlegen", siehe oben
URL: POST /abo-loeschen/{id}
Legt ein neues Webhook-Abonnement für den Benutzer an: In diesem Fall wird bei einer Änderung "https://meinwebhook.com:8080" benachrichtigt.
URL: POST /abo-neu/webhook/{amtsgericht}/{grundbuchbezirk}/{blatt}
FORM:
- `url`: String: Server-URL, welche bei einer Grundbuchänderung angepingt wird
- `aktenzeichen`: Optional[String]: Aktenzeichen, was auf Benachrichtigungen bei
Grundbuchänderungen an diesem Blatt später bei "Ihr Zeichen" / "Unser Zeichen"
auftauchen wird.
Achtung: Webhooks funktionieren aus Sicherheitsgründen nur mit HTTPS-Servern.
POST https://127.0.0.1/abo-neu/email/Prenzlau/Schenkenberg/289 HTTP/1.1
Authorization: Bearer S0VLU0UhIExFQ0tFUiEK
Content-Type: application/x-www-form-urlencoded
aktenzeichen=ABC%20DEF&url=meinwebhook.com:8080
status
: String: immer"ok"
status
: String: immer"error"
code
: Integer: Fehlercode- 0: Benutzer nicht gefunden
- 500: Interner Fehler
text
: String: Fehlermeldung vorformatiert als Text
Wenn eine Grundbuchänderung am Blatt {amtsgericht}/{grundbuchbezirk}/{blatt}
vorgenomment wird, wird die Änderung dem Webhook-Server gemeldet:
server_url
: String: URL des Servers, von dem die Benachrichtigung gesendet wurdeamtsgericht
: String: Amtsgericht des Grundbuchblatts, in dem die Änderung stattfandgrundbuchbezirk
: String: Grundbuchbezirk des Grundbuchblatts, in dem die Änderung stattfandblatt
: String: Blatt-Nr., in dem die Änderung stattfandwebhook
: String: URL des Webhooks, der benachrichtigt wurdeaktenzeichen
: Optional[String]: Aktenzeichen, unter dem das Abonnement geführt wirdaenderungs_id
: String: Änderungs-ID der Grundbuchänderung (SHA1-Hash)
Beispiel:
POST https://meinwebhook.com:8080 HTTP/1.1
Content-Type: application/json
{
"server_url": "https://127.0.0.1",
"amtsgericht": "Prenzlau",
"grundbuchbezirk": "Schenkenberg",
"blatt": "289",
"webhook": "https://meinwebhook.com:8080",
"aktenzeichen": "ABC DEF",
"aenderungs_id": "c913905482d2d22befe3e0f85e93795cf8a998cc"
}
Lädt eine neue Datei hoch. Hierbei muss das JSON der Änderung mit einem privaten Schlüssel unterzeichnet werden, wobei die Signatur separat übermittelt wird (Format siehe unten).
URL: POST /upload
POST https://127.0.0.1/upload HTTP/1.1
Content-Type: application/json
Authorization: Bearer S0VLU0UhIExFQ0tFUiEK
ÄNDERUNG_JSON (siehe unten)
Hierbei ist ÄNDERUNG_JSON
ein JSON-Objekt, das die Änderung beschreibt:
titel
: String: Beschreibung der Änderung (Überschrift)beschreibung
: Array[String]: Ausführliche Beschreibung der Änderung (Zeilen)fingerprint
: String: Fingerprint (Schlüssel-ID) des PGP-Schlüssels, der für die Unterschrift verwendet wurdesignatur
: Objekt: Signatur vondata
in JSON-Form (Format siehe Beispiel unten)hash
: String: Hashfunktion die zur Unterschrift verwendet wurde (üblicherweise "SHA512")pgp_signatur
: Array[String]: Zeilen zwischen "BEGIN PGP SIGNATURE" und "END PGP SIGNATURE"
data
: Objekt:neu
: Optional[Array[GbxDatei]]: Enthält Dateien, die keinen alten Stand haben (z.B. neu angelegte Blätter)geaendert
: Optional[Array[Objekt]]:alt
: GbxDatei: Der alte Stand der GBX-Datei vor der Änderungneu
: GbxDatei: Der neue Stand der GBX-Datei nach der Änderung
Beispiel: In einer neu angelegten Datei wird ein neuer BV-Eintrag eingefügt. Die leere GBX-Datei hat den Inhalt von:
{
"digitalisiert": false,
"land": "Brandenburg",
"inhalt": {
"titelblatt": {
"amtsgericht": "Prenzlau",
"grundbuch_von": "Schenkenberg",
"blatt": 456
}
}
}
Die geänderte Datei:
{
"digitalisiert": false,
"land": "Brandenburg",
"inhalt": {
"titelblatt": {
"amtsgericht": "Prenzlau",
"grundbuch_von": "Schenkenberg",
"blatt": 456
},
"bestandsverzeichnis": {
"eintraege": [
{
"lfd_nr": 1,
"flur": 1,
"flurstueck": "26",
"bezeichnung": [
"Landwirtschaftsfläche"
],
"groesse": 15035,
}
]
}
}
}
Die PGP-Nachricht muss dann so aussehen (Zeilenenden = CR/LF, eingerückt mit 4 Leerzeichen):
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256
{
"geaendert": [
{
"alt": {
"digitalisiert": false,
"land": "Brandenburg",
"inhalt": {
"titelblatt": {
"amtsgericht": "Prenzlau",
"grundbuch_von": "Schenkenberg",
"blatt": 456
}
}
},
"neu": {
"digitalisiert": false,
"land": "Brandenburg",
"inhalt": {
"titelblatt": {
"amtsgericht": "Prenzlau",
"grundbuch_von": "Schenkenberg",
"blatt": 456
},
"bestandsverzeichnis": {
"eintraege": [
{
"lfd_nr": 1,
"flur": 1,
"flurstueck": "26",
"bezeichnung": [
"Landwirtschaftsfläche"
],
"groesse": 15035,
}
]
}
}
}
}
]
}
-----BEGIN PGP SIGNATURE-----
iD8DBQFFxqRFCMEe9B/8oqERAqA2A
Tx4RziVzY4eR4Ms4MFsKAMqOoQCgg
e5AJIRuLUIUikjNWQIW63QE=J9167
=aAhry
-----END PGP SIGNATURE-----
Die Beschreibung (Änderungsmitteilung) ist nicht Teil der Nachricht selber. Das fertige JSON-Objekt sieht dann so aus:
{
"titel": "Meine Änderung 1",
"beschreibung": [
"Meine mehrzeilige",
"Beschreibung der Änderung"
],
"fingerprint": "F554A3687412CFFEBDEFE0A312F5F7B42F2B01E7",
"signatur": {
"hash": "SHA256",
"pgp_signatur": [
"iD8DBQFFxqRFCMEe9B/8oqERAqA2A",
"Tx4RziVzY4eR4Ms4MFsKAMqOoQCgg",
"e5AJIRuLUIUikjNWQIW63QE=J9167",
"=aAhry"
]
},
"data": {
"geaendert": [
{
"alt": { ... }, /* siehe oben */
"neu": { ... } /* siehe oben */
}
]
}
}
Nach dem Hochladen verifiziert der Server die Änderung gegen den öffentlichen Schlüssel (public key) und weist Änderungen zurück, die eine falsche Unterschrift besitzen.
status
: String: immer"ok"
status
: String: immer"error"
code
: Integer: Fehlercode- 0: Benutzer / Passwort stimmt nicht
- 1: Amtsgericht / Gemarkungsbezirk nicht gefunden
- 500: Signatur stimmt nicht überein
- 501: Interner Fehler bei Übernahme der Änderung
text
: String: Vorformatierter Fehlertext