REST-API von e-Signature.eu — elektronisches Einschreiben

1. Überblick

Mit der REST-API von e-Signature.eu sendet Ihre Anwendung elektronische Einschreiben, ohne unsere Website zu nutzen. Sie senden das PDF, eine verifizierte Absenderadresse und den Empfänger; das Dokument erhält einen qualifizierten elektronischen Zeitstempel, und der Empfänger signiert nach Prüfung seiner Identität eine Empfangsbestätigung. Sie erhalten das Ergebnis über die API oder einen Callback.

Basis-URL https://api.e-signature.eu/v3/regis/
Postman Postman-Dokumentation und -Collection

Die bisherige Basis-URL https://www.e-signature.eu/wp-json/esig/v3/regis/ bleibt gültig. Wir empfehlen, die URL von api.e-signature.eu zu verwenden.

2. Authentifizierung

Ihre Zugangsdaten finden Sie unter Mein Konto > API-Signaturen, sobald Sie bei e-signature.eu angemeldet sind:

  • User ID: in der URL als Parameter userid jedes Aufrufs;
  • API token: im HTTP-Header x-api-key jedes Aufrufs.
curl -X GET "https://api.e-signature.eu/v3/regis/requestBalance?userid=123" \
  -H "x-api-key: YOUR_API_TOKEN"

Halten Sie Ihr Token geheim: Es gewährt über die API vollen Zugriff auf Ihr Konto. Aufrufe müssen von Ihrem Server erfolgen, nie aus einem Browser oder einer mobilen App.

3. Konventionen

Anfragen und Antworten

  • Nur HTTPS. Request-Bodies sind JSON (Content-Type: application/json).
  • Jede Antwort ist JSON, in einer dieser beiden Formen:
{ "success": true,  "result": { ... } }
{ "success": false, "error": "Readable error message" }

Limits

Limit Wert
Anfragen 10 pro Minute pro Konto und IP-Adresse (darüber HTTP 403, nach einer Minute erneut versuchen)
Dokument Ein PDF pro Anfrage, maximal 30 MB, nicht verschlüsselt / ohne Passwort
Download signierter Dokumente 30 Tage nach Abschluss (siehe Aufbewahrung)

4. Guthaben

Anfragen werden mit Ihrem Prepaid-Guthaben bei e-signature.eu bezahlt. Den Preis einer Methode liefert getMethods (Ihre individuellen Preise werden berücksichtigt). Ihr Guthaben liefern requestBalance und jedes Anfrageobjekt (credits_balance).

Automatische Aufladung des Guthabens

Damit Ihnen nie das Guthaben ausgeht, kann sich Ihr Konto automatisch aufladen. Dies wird einmalig unter Mein Konto > API-Signaturen eingerichtet, nicht über die API:

  1. Wählen Sie einen Schwellenwert (in Credits) und das zu bestellende Guthabenpaket.
  2. Speichern Sie eine Zahlungsmethode bei unserem Zahlungsanbieter Mollie (Karte oder SEPA-Lastschrift über Bancontact, iDEAL…). Einmalig wird eine Verifizierungszahlung von 0,01 € verlangt.
  3. Jedes Mal, wenn Guthaben abgebucht wird und Ihr Saldo unter den Schwellenwert fällt, wird eine Bestellung des gewählten Pakets erstellt und automatisch mit der gespeicherten Zahlungsmethode bezahlt. Die Rechnung erhalten Sie per E-Mail.
Automatische Aufladung
Auslöser Eine Abbuchung von Guthaben (z. B. eine neue Anfrage), durch die das Saldo unter den Schwellenwert fällt
Gutschrift des Guthabens Sobald die Zahlung bestätigt ist: sofort per Karte, nach einigen Werktagen per SEPA-Lastschrift
Laufende Aufladungen Jeweils eine
Sicherheitsgrenze Eine maximale Anzahl automatischer Aufladungen pro 30 Tage
Fehlgeschlagene Zahlung Die Bestellung wird als fehlgeschlagen markiert, die automatische Aufladung wird deaktiviert und Sie werden per E-Mail informiert
Die Aufladung wird durch eine Abbuchung ausgelöst. Eine Anfrage, die mehr kostet als Ihr aktuelles Guthaben, wird abgelehnt (HTTP 403, You do not have enough credits) und löst keine Aufladung aus: Wählen Sie einen Schwellenwert über den Kosten Ihrer größten Anfragen und halten Sie bei SEPA-Lastschrift eine Reserve. Ihr Guthaben ist jederzeit über requestBalance und credits_balance abrufbar.

5. Ablauf eines Einschreibens

  1. Sie senden das PDF, eine verifizierte Absenderadresse und den Empfänger. Das Dokument erhält einen qualifizierten elektronischen Zeitstempel und das Guthaben wird belastet.
  2. Der Empfänger erhält eine E-Mail mit zwei Links: einen, um die Empfangsbestätigung zu signieren und das Dokument zu öffnen, einen zum Ablehnen.
  3. Zum Signieren bestätigt der Empfänger seine Identität mit einer der zugelassenen Methoden (itsme®, Evrotrust, OTP…).
  4. Das Einschreiben wird finished (signiert), declined (abgelehnt) oder expired, wenn nach 14 Tagen nichts geschehen ist.

Ein Absender, ein Empfänger pro Einschreiben. Wie auf der Website wird alle 4 Tage automatisch eine Erinnerung gesendet (nicht einstellbar); es gibt weder manuelle Erinnerung noch Stornierung.

6. Absenderadresse

Wie auf der Website muss die Absenderadresse (sender_email) vor der Verwendung verifiziert sein:

  1. Rufen Sie verifySender auf: Eine E-Mail mit einem Bestätigungslink wird an die Adresse gesendet (Antwort 202). Ist die Adresse bereits verifiziert, lautet die Antwort 200 mit "verified": true.
  2. Der Inhaber der Adresse klickt auf den Link.
  3. Die Adresse kann dann in request verwendet werden.
POST/v3/regis/verifySender?userid={userid}
{ "email": "[email protected]", "lang": "en" }
{
  "success": true,
  "result": {
    "email": "[email protected]",
    "verified": false,
    "message": "A verification email has been sent to [email protected]. The address can be used as sender_email once the link in this email has been clicked."
  }
}
GET/v3/regis/senders?userid={userid}

Listet die Absenderadressen Ihres Kontos mit ihrem Status auf.

{
  "success": true,
  "result": [
    {
      "email": "[email protected]",
      "verified": true
    },
    {
      "email": "[email protected]",
      "verified": false
    }
  ]
}

7. Ein Einschreiben senden

POST/v3/regis/request?userid={userid}
{
  "title": "Formal notice rent October",
  "lang": "en",
  "sender_email": "[email protected]",
  "recipient": {
    "firstname": "Ann",
    "lastname": "Peeters",
    "email": "[email protected]",
    "phone": "+32475111222"
  },
  "methods": [
    "itsme-qes-signature",
    "evrotrust-signature"
  ],
  "send_email": true,
  "note_html": "Please acknowledge receipt.",
  "signature_redirect": "https://www.example.com/thank-you",
  "external_reference": "INV-2026-0042",
  "metadata": {
    "customer_id": 311
  },
  "pdf_file_base64": "JVBERi0xLjcKJeLjz9MK..."
}
Feld Pflicht Typ Beschreibung
title ja string Name des Dokuments. Buchstaben, Ziffern und Bindestriche bleiben erhalten; existiert der Name bereits, wird -1, -2… angehängt.
lang ja string Sprache der E-Mails und Seiten: fr, nl, en, de, es.
sender_email ja string Verifizierte Absenderadresse, siehe Absenderadresse.
recipient.lastname, recipient.email ja string
recipient.firstname nein string
recipient.phone nein string Internationales Format (+32…). Eine ungültige Nummer wird ignoriert.
methods ja array Zugelassene Methoden zum Signieren der Empfangsbestätigung, siehe getMethods.
pdf_file_base64 ja string Das PDF, base64-kodiert. Eine Datei, maximal 30 MB, nicht verschlüsselt.
send_email nein boolean Standard true. Mit false wird weder an den Empfänger noch an den Absender eine E-Mail gesendet: Übermitteln Sie signature_link und declined_link selbst.
note_html nein string Nachricht in der E-Mail an den Empfänger.
signature_redirect nein string (URL) Seite, die dem Empfänger nach der Signatur angezeigt wird.
external_reference nein string Ihre eigene Kennung (Rechnung, Akte…), maximal 255 Zeichen.
metadata nein object Freies JSON-Objekt, maximal 4 KB, unverändert zurückgegeben.
callback_url nein string (URL) Callback-URL nur für dieses Einschreiben (öffentliches HTTPS). Standard: die URL Ihres Kontos.

Kosten

Preis der teuersten Methode in methods für einen Empfänger. Wird beim Erstellen des Einschreibens belastet.

Antwort 201 Created

{
  "success": true,
  "result": {
    "type": "regis",
    "id_sign": 123,
    "doc_name": "Formal-notice-rent-October",
    "lang": "en",
    "sender_email": "[email protected]",
    "status_id": "pending",
    "date_added": "2026-10-20 11:50:00",
    "date_status": "2026-10-20 11:50:00",
    "date_expired": "2026-11-03 11:50:00",
    "timezone": "Europe/Brussels",
    "methods": [
      "itsme-qes-signature",
      "evrotrust-signature"
    ],
    "reminder": 4,
    "last_reminder": null,
    "send_email": true,
    "from_api": true,
    "credits": 1,
    "credits_balance": 41,
    "recipient": {
      "firstname": "Ann",
      "lastname": "Peeters",
      "email": "[email protected]",
      "phone": "+32475111222",
      "status": "pending",
      "signing_time": "",
      "signing_method": "",
      "verified_firstname": "",
      "verified_lastname": "",
      "signature_link": "https://www.e-signature.eu/en/sign-regis/?key=…",
      "declined_link": "https://www.e-signature.eu/en/sign-regis/?key=…"
    },
    "external_reference": "INV-2026-0042",
    "metadata": {
      "customer_id": 311
    }
  }
}

8. Das Objekt Einschreiben

Zurückgegeben von request, getRequest, modifyRecipient, delete und in den Callbacks gesendet. Das Feld "type": "regis" unterscheidet es von einer Signaturanfrage, wenn beide dieselbe Callback-URL nutzen.

Feld Beschreibung
id_sign Kennung des Einschreibens
status_id pending wartet auf den Empfänger · finished Bestätigung signiert · declined vom Empfänger abgelehnt · expired nach 14 Tagen nicht signiert · deleted
date_added, date_status, date_expired Erstellung, letzte Statusänderung, Ablauf (Zeitzone des Einschreibens)
sender_email, lang, methods, reminder, send_email Wie bei der Erstellung festgelegt
last_reminder Datum der letzten Erinnerung oder null
credits, credits_balance Guthaben des Einschreibens, aktuelles Guthaben Ihres Kontos
recipient firstname, lastname, email, phone, status; nach der Signatur signing_time, signing_method, verified_firstname, verified_lastname; solange offen signature_link und declined_link
pdf_file_base64 Zeitgestempeltes Dokument, sobald das Einschreiben nicht mehr offen ist
receipt_file_base64 Signierte Empfangsbestätigung, bei finished
external_reference, metadata Wie bei der Erstellung gesendet

9. Weitere Endpoints

Alle Endpoints erhalten userid in der URL und x-api-key in den Headern. id_sign wird in der URL übergeben.

Einschreiben auflisten

GET/v3/regis/list?userid={userid}&status_id=pending

status_id (optional): pending, finished, declined oder expired. external_reference (optional): nur die Einschreiben mit dieser Referenz.

{
  "success": true,
  "result": [
    {
      "id_sign": 123,
      "status_id": "pending",
      "doc_name": "Formal-notice-rent-October",
      "date_added": "2026-10-20 11:50:00",
      "external_reference": "INV-2026-0042"
    }
  ]
}

Ein Einschreiben abrufen

GET/v3/regis/getRequest?userid={userid}&id_sign=123

Den Empfänger ändern

PATCH/v3/regis/modifyRecipient?userid={userid}&id_sign=123
{ "email": "[email protected]", "phone": "+32475333444" }

Nur Einschreiben pending. Senden Sie nur die zu ändernden Felder aus firstname, lastname, email, phone. Ändert sich die E-Mail, wird der bisherige Empfänger über die Stornierung informiert und der neue Empfänger erhält das Einschreiben.

Ein Einschreiben löschen

DELETE/v3/regis/delete?userid={userid}&id_sign=123

Nur Status finished, declined oder expired. Löscht die Dateien und den Verlauf; die Antwort enthält das Einschreiben ein letztes Mal (status_id: deleted): Laden Sie die Dokumente vor dem Löschen herunter.

Den Audit-Trail herunterladen

GET/v3/regis/requestAuditTrail?userid={userid}&id_sign=123

Nicht verfügbar, solange offen. Liefert das Einschreiben mit audit_trail_base64: ein zeitgestempeltes PDF mit dem vollständigen Verlauf.

Das Guthaben abrufen

GET/v3/regis/requestBalance?userid={userid}

Methoden auflisten

GET/v3/regis/getMethods?userid={userid}&lang=en

Für Einschreiben in methods zugelassene Methoden mit dem Preis für Ihr Konto. Die Liste kann von der der Signatur-API abweichen.

{
  "success": true,
  "result": [
    {
      "id": "itsme-qes-signature",
      "label": "itsme® | QES",
      "credits": 1
    },
    {
      "id": "otp-email-non-qualified",
      "label": "OTP by Email/SMS | SES",
      "credits": 0.4
    }
  ]
}

10. Callbacks (Webhooks)

Legen Sie Ihre Callback-URL unter Mein Konto > API-Signaturen fest (HTTPS, öffentlich erreichbar). Sie können zusätzlich eine callback_url pro Anfrage angeben. Der Callback ist ein POST mit einem JSON-Body, der den vollständigen aktuellen Status der Anfrage enthält (gleiches Format wie getRequest), gesendet für über die API erstellte Anfragen.

Ereignisfelder

Feld Beschreibung
event Ereignistyp (siehe unten)
event_id Eindeutige Kennung des Ereignisses (evt_…). Bei jeder Wiederholung identisch: Nutzen Sie sie, um Duplikate zu ignorieren.
event_at Datum des Ereignisses (UTC, ISO 8601)
changes Statusänderung des Empfängers, z. B. [{"signer_key": 1, "from": "pending", "to": "signed"}] (nur bei einer Änderung)
changes (signer.email_failed) Nicht zugestellte E-Mail, z. B. [{"signer_key": 2, "email": "[email protected]", "bounce_type": "permanent", "reason": "smtp; 550 5.1.1 user unknown"}]
external_reference, metadata Wie bei der Erstellung der Anfrage gesendet

Ereignistypen

Ereignis Wann
signer.signed Ein Unterzeichner hat signiert, die Anfrage läuft noch
signer.declined, signer.skipped, signer.expired Ein Unterzeichner hat abgelehnt, wurde übersprungen oder ist abgelaufen
request.completed Alle Unterzeichner haben signiert: Das signierte PDF ist enthalten (pdf_file_base64)
request.stopped Die Anfrage wurde beendet: Das teilweise signierte PDF ist enthalten
request.cancelled Die Anfrage wurde storniert
request.deleted Die Anfrage wurde gelöscht
request.expired Die Anfrage ist abgelaufen
request.declined Einschreiben vom Empfänger abgelehnt
signer.email_failed Eine E-Mail an einen Unterzeichner konnte nicht zugestellt werden, siehe Nicht zugestellte E-Mails
request.updated Jede andere Änderung: Erinnerung gesendet, Unterzeichner geändert, neue Signaturlinks…

Der Body enthält stets den vollständigen aktuellen Status: Ihre Integration kann sich auf status_id und den Status jedes Unterzeichners stützen statt nur auf den Ereignistyp.

Nicht zugestellte E-Mails

Wird eine von e-Signature.eu an einen Unterzeichner (oder an den Empfänger eines Einschreibens) gesendete E-Mail von dessen Mailserver zurückgewiesen (unbekannte Adresse, volles Postfach, Server lehnt die Nachricht ab…), erhalten Sie den Callback signer.email_failed. Der Status der Anfrage und des Unterzeichners ändert sich nicht.

Feld von changes Beschreibung
signer_key Schlüssel des Unterzeichners in signers (bei einem Einschreiben immer 1)
email Fehlerhafte Adresse
bounce_type permanent: die Adresse existiert nicht oder lehnt Nachrichten ab · transient: vorübergehendes Problem (Postfach voll, Server nicht erreichbar), Zustellung nach mehreren Versuchen abgebrochen · undetermined: unbekannter Grund
reason Technische Meldung des Mailservers des Empfängers, falls vorhanden

Korrigieren Sie die Adresse mit modifySigner (Signaturanfrage) oder modifyRecipient (Einschreiben): die Einladung wird an die neue Adresse gesendet, und an die fehlerhafte Adresse wird keine Stornierungs-E-Mail gesendet. Der Kontoinhaber wird zudem per E-Mail informiert, und der Unterzeichner wird im Online-Dashboard mit E-Mail nicht zugestellt markiert.

permanent: für diese Anfrage werden keine E-Mails mehr an diese Adresse gesendet (auch keine Erinnerungen), bis sie korrigiert ist. transient oder undetermined: E-Mails werden nicht blockiert; die nächste Erinnerung wird normal gesendet, und schlägt sie erneut fehl, erhalten Sie einen neuen Callback signer.email_failed.

Betroffen sind nur laufende Anfragen und Unterzeichner, die noch nicht unterschrieben haben. Mit send_email: false sendet e-Signature.eu keine E-Mails an die Unterzeichner, daher tritt dieses Ereignis nicht auf.

Header

Header Beispiel
X-Esig-Api-Version 3
X-Esig-Event signer.signed
X-Esig-Event-Id evt_4f0c2b9e1d7a3c55e8b1a2f0
X-Esig-Delivery-Attempt 1, 2, …
X-Esig-Signature t=1792407600,v1=5d41402abc4b2a76b9719d911017c592…

Die Signatur prüfen

Ihr Signaturgeheimnis wird unter Mein Konto > API-Signaturen angezeigt und kann dort neu erstellt werden. v1 ist der HMAC-SHA256 von "<t>.<raw request body>" mit Ihrem Geheimnis, hexadezimal kodiert. Verwenden Sie den unveränderten Body vor jedem JSON-Parsing und lehnen Sie Callbacks ab, die älter als 5 Minuten sind.

PHP

$body   = file_get_contents( 'php://input' );
$header = $_SERVER['HTTP_X_ESIG_SIGNATURE'] ?? '';
preg_match( '/t=(\d+),v1=([a-f0-9]{64})/', $header, $m );
$valid = $m
    && abs( time() - (int) $m[1] ) <= 300
    && hash_equals( hash_hmac( 'sha256', $m[1] . '.' . $body, $secret ), $m[2] );

Node.js

const crypto = require('crypto');
function verify(rawBody, header, secret) {
  const m = /t=(\d+),v1=([a-f0-9]{64})/.exec(header || '');
  if (!m || Math.abs(Date.now() / 1000 - Number(m[1])) > 300) return false;
  const expected = crypto.createHmac('sha256', secret).update(`${m[1]}.${rawBody}`).digest('hex');
  return crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(m[2]));
}

C# (.NET)

using System.Security.Cryptography; using System.Text; using System.Text.RegularExpressions;
static bool Verify(string rawBody, string header, string secret) {
    var m = Regex.Match(header ?? "", @"t=(\d+),v1=([a-f0-9]{64})");
    if (!m.Success || Math.Abs(DateTimeOffset.UtcNow.ToUnixTimeSeconds() - long.Parse(m.Groups[1].Value)) > 300) return false;
    using var h = new HMACSHA256(Encoding.UTF8.GetBytes(secret));
    var expected = Convert.ToHexString(h.ComputeHash(Encoding.UTF8.GetBytes(m.Groups[1].Value + "." + rawBody))).ToLowerInvariant();
    return CryptographicOperations.FixedTimeEquals(Encoding.ASCII.GetBytes(expected), Encoding.ASCII.GetBytes(m.Groups[2].Value));
}

Antworten und Wiederholungen

  • Antworten Sie mit HTTP 2xx, sobald der Callback eingegangen ist, und verarbeiten Sie ihn bei Bedarf asynchron.
  • Bei Netzwerkfehler, Zeitüberschreitung (30 s), HTTP 429 oder 5xx wird der Callback stündlich mit derselben event_id erneut gesendet, bis zu 24 Versuche. Andere 4xx-Antworten gelten als endgültig. Ändert sich die Anfrage vor einer erfolgreichen Zustellung erneut, enthält der nächste Callback ein neues Ereignis und den vollständigen aktuellen Status. Der aktuelle Status bleibt jederzeit über getRequest abrufbar.
  • Weiterleitungen werden befolgt (die Methode POST bleibt erhalten). localhost und private Adressen sind nicht zulässig.

Bei Einschreiben wird der Callback gesendet, wenn die Bestätigung signiert, abgelehnt oder abgelaufen ist, bei jeder automatischen Erinnerung und wenn der Empfänger geändert wird (auf der Website oder über die API). Der Empfänger ist signer_key 1 in changes.

11. Fehler

Fehler werden mit "success": false und einer lesbaren Meldung error zurückgegeben. Stützen Sie Ihre Logik auf den HTTP-Code: Die Meldungen können sich ändern.

HTTP-Code Bedeutung
200 / 201 / 202 OK / Einschreiben erstellt / Bestätigungs-E-Mail gesendet
400 Fehlendes oder ungültiges Feld (die Meldung nennt das Feld)
401 Ungültige userid oder x-api-key
403 Nicht genug Guthaben oder Anfragelimit erreicht (10 pro Minute)
404 id_sign fehlt oder ist für dieses Konto unbekannt
412 Aktion im aktuellen Status nicht möglich (Absenderadresse nicht verifiziert, falscher Status)

12. Aufbewahrung

Das zeitgestempelte Dokument und die signierte Empfangsbestätigung können 30 Tage lang über getRequest oder den Callback heruntergeladen werden. Der Audit-Trail wird für den in unserem DPA festgelegten Zeitraum aufbewahrt. Archivieren Sie die Dokumente innerhalb von 30 Tagen bei sich.

Shopping cart

0
image/svg+xml

No products in the cart.

Continue Shopping