REST-API von e-Signature.eu — elektronische Signaturen (SES, AES, QES)
1. Überblick
Mit der REST-API von e-Signature.eu sendet Ihre Anwendung Dokumente zur elektronischen Signatur (einfach SES, fortgeschritten AES oder qualifiziert QES nach eIDAS), ohne unsere Website zu nutzen. Sie senden das PDF und die Unterzeichner; wir übernehmen die Identitätsprüfung, die Signatur und die Nachverfolgung; Sie erhalten das signierte Dokument über die API oder einen Callback.
| Basis-URL | https://api.e-signature.eu/v3/signature/ |
Diese Dokumentation beschreibt die API v3. Sie nutzen bereits die API v2 (https://api.e-signature.eu/v2/signature/)? Siehe Changelog.
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
useridjedes Aufrufs; - API token: im HTTP-Header
x-api-keyjedes Aufrufs.
curl -X GET "https://api.e-signature.eu/v3/signature/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:
- Wählen Sie einen Schwellenwert (in Credits) und das zu bestellende Guthabenpaket.
- Speichern Sie eine Zahlungsmethode bei unserem Zahlungsanbieter Mollie (Karte oder SEPA-Lastschrift über Bancontact, iDEAL…). Einmalig wird eine Verifizierungszahlung von 0,01 € verlangt.
- 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 |
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 einer Signaturanfrage
- Sie erstellen die Anfrage mit dem PDF, den Unterzeichnern und den zugelassenen Signaturmethoden. Das Guthaben wird belastet.
- Jeder Unterzeichner erhält eine E-Mail mit einem persönlichen Signaturlink (oder Sie senden den
signature_linkselbst, wennsend_emailfalseist). - Der Unterzeichner bestätigt seine Identität mit einer der zugelassenen Methoden (itsme®, Evrotrust, Veriff, OTP…) und signiert.
- Wenn alle signiert haben, ist die Anfrage
finished: Das signierte PDF (PAdES) ist übergetRequestverfügbar und wird im Callback gesendet.
Signaturreihenfolge
Standardmäßig signieren alle Unterzeichner parallel. Um eine Reihenfolge festzulegen, setzen Sie sign_first: true bei den Unterzeichnern der ersten Gruppe: Sie werden sofort eingeladen, gegebenenfalls mehrere parallel. Die übrigen Unterzeichner werden erst eingeladen, wenn die gesamte erste Gruppe signiert hat. Höchstens zwei Gruppen.
Zwei Integrationsmodi
| Modus | Funktionsweise |
|---|---|
E-Mail-Modus (send_email: true, Standard) |
Wir senden in Ihrem Namen die Einladungen, Erinnerungen und Abschluss-E-Mails an die Unterzeichner. |
Eingebetteter Modus (send_email: false) |
Beim Erstellen wird keine E-Mail gesendet: Der signature_link jedes Unterzeichners wird in der Antwort zurückgegeben, und Sie leiten Ihre Nutzer aus Ihrer eigenen Oberfläche dorthin weiter. |
send_email: false sendet eine im Online-Dashboard ausgelöste Erinnerung oder Stornierung eine E-Mail an die ausstehenden Unterzeichner.Fragen Sie die API nicht in Schleife ab
Rufen Sie getRequest nicht wiederholt auf, um den Status einer Anfrage zu verfolgen: Nutzen Sie die Callbacks, die bei jeder Änderung automatisch gesendet werden. Übermäßige Aufrufe lösen eine automatische Drosselung aus, die die Verarbeitung Ihrer Anfragen vorübergehend aussetzt.
6. Eine Signaturanfrage erstellen
{
"title": "Sales agreement 2026-114",
"lang": "en",
"methods": [
"itsme-qes-signature",
"evrotrust-signature"
],
"signature_place": "position_auto",
"reminder": 3,
"send_email": true,
"email_notification": false,
"note_html": "Please sign the agreement before Friday.",
"signature_redirect": "https://www.example.com/thank-you",
"external_reference": "QUOTE-2026-114",
"metadata": {
"crm_deal_id": 8812
},
"callback_url": "https://erp.example.com/hooks/esignature",
"signers": [
{
"firstname": "Ann",
"lastname": "Peeters",
"email": "[email protected]",
"phone": "+32475111222",
"sign_first": true
},
{
"firstname": "Marc",
"lastname": "Dubois",
"email": "[email protected]",
"sign_first": false
}
],
"pdf_file_base64": "JVBERi0xLjcKJeLjz9MK..."
}
Signaturmethoden
| Methode | Stufe | Abdeckung | Preis |
|---|---|---|---|
itsme-qes-signature — itsme® |
QES (qualifiziert) | 32 europäische Länder | 1 Guthaben / Unterzeichner |
evrotrust-signature — Evrotrust |
QES (qualifiziert) | 69 Länder | 1 Guthaben / Unterzeichner |
veriff-advanced-signature — Veriff |
AES (fortgeschritten) | 198 Länder | 0,7 Guthaben / Unterzeichner |
otp-email-non-qualified — OTP per E-Mail oder SMS |
SES (einfach) | Weltweit | 0,4 Guthaben / Unterzeichner |
Dies sind die Standardpreise: getMethods liefert die verfügbaren Methoden und die Preise für Ihr Konto. Nur eine qualifizierte elektronische Signatur (QES) ist nach der eIDAS-Verordnung einer handschriftlichen Unterschrift rechtlich gleichgestellt. otp-email-non-qualified umfasst E-Mail und SMS: Der Code wird per SMS gesendet, wenn der Unterzeichner eine phone hat, sonst per E-Mail, zum gleichen Preis.
Felder des Request-Body
| Feld | Pflicht | Typ | Beschreibung |
|---|---|---|---|
title |
ja | string | Name des Dokuments. Buchstaben, Ziffern und Bindestriche bleiben erhalten; existiert der Name bereits in Ihrem Konto, wird ein Suffix -1, -2… angehängt. |
lang |
ja | string | Sprache der E-Mails und Signaturseiten: fr, nl, en, de, es. |
methods |
ja | array | Zugelassene Signaturmethoden, siehe Signaturmethoden. Sind mehrere zugelassen, wählt jeder Unterzeichner. |
signers |
ja | array | Unterzeichner, siehe unten. |
pdf_file_base64 |
ja | string | Das PDF, base64-kodiert. Eine Datei, maximal 30 MB, nicht verschlüsselt. |
signature_place |
nein | string | position_auto (Standard) oder position_manual, siehe Platzierung der Signaturen. |
reminder |
nein | number | Automatische Erinnerung alle N Tage, 0 bis 14. Standard 0 (keine Erinnerung). |
send_email |
nein | boolean | Standard true (E-Mail-Modus). Mit false (eingebetteter Modus) werden weder Einladungs- noch Abschluss-E-Mails gesendet: Übermitteln Sie den signature_link selbst. Nicht kombinierbar mit sign_first: true. |
email_notification |
nein | boolean | Standard false. Mit true erhalten Sie bei jeder Signatur eine E-Mail. |
note_html |
nein | string | Nachricht in den E-Mails an die Unterzeichner (E-Mail-Modus). HTML-Tags sind erlaubt, z. B. Note with <strong>HTML</strong>. |
signature_redirect |
nein | string (URL) | Seite, die dem Unterzeichner nach der Signatur angezeigt wird. Muss eine gültige URL sein (leere Zeichenkette wird abgelehnt). Standard: Bestätigungsseite auf e-signature.eu. |
external_reference |
nein | string | Ihre eigene Kennung (Angebot, Vertrag…), maximal 255 Zeichen. Wird in jeder Antwort und jedem Callback zurückgegeben. |
metadata |
nein | object | Freies JSON-Objekt, maximal 4 KB, unverändert zurückgegeben. |
callback_url |
nein | string (URL) | Callback-URL nur für diese Anfrage (öffentliches HTTPS). Standard: die URL Ihres Kontos. |
Felder eines Unterzeichners
| Feld | Pflicht | Typ | Beschreibung |
|---|---|---|---|
lastname |
ja | string | |
email |
ja | string | Gültige E-Mail-Adresse |
firstname |
nein | string | |
phone |
nein | string | Internationales Format mit + und Ländervorwahl (+32…); Leerzeichen werden entfernt. Eine ungültige Nummer wird ignoriert. Bei der OTP-Methode wird der Code per SMS gesendet, wenn eine Nummer angegeben ist, sonst per E-Mail. |
sign_first |
nein | boolean | Standard false. Siehe Signaturreihenfolge. |
sign_page, sign_left, sign_bottom |
mit position_manual |
number | Siehe Platzierung der Signaturen. |
Kosten
Preis der teuersten Methode in methods × Anzahl der Unterzeichner. Das Guthaben wird beim Erstellen der Anfrage belastet. Das Guthaben von Unterzeichnern, die nicht signiert haben, wird erstattet, wenn die Anfrage storniert oder beendet wird.
Antwort 201 Created
{
"success": true,
"result": {
"id_sign": 4521,
"lang": "en",
"doc_name": "Sales-agreement-2026-114",
"send_email": true,
"from_api": true,
"signature_redirect": "https://www.example.com/thank-you",
"status_id": "pending",
"date_status": "2026-10-20 10:15:02",
"last_reminder": null,
"timezone": "Europe/Brussels",
"credits": 2,
"credits_balance": 38.4,
"signers": {
"1": {
"firstname": "Ann",
"lastname": "Peeters",
"email": "[email protected]",
"phone": "+32475111222",
"sign_first": true,
"status": "pending",
"signature_link": "https://www.e-signature.eu/en/sign/?key=…"
},
"2": {
"firstname": "Marc",
"lastname": "Dubois",
"email": "[email protected]",
"sign_first": false,
"status": "pending",
"signature_link": "https://www.e-signature.eu/en/sign/?key=…"
}
},
"external_reference": "QUOTE-2026-114",
"metadata": {
"crm_deal_id": 8812
}
}
}
7. Platzierung der Signaturen
position_auto (Standard)
Setzen Sie die Markierungen #SIG01, #SIG02… (auch zulässig: #SIG01#) als Text in Ihr Dokument, dort, wo jeder Unterzeichner signieren soll (#SIG01 = erster Unterzeichner des Arrays signers). Die Signatur wird oben links an der Markierung platziert. Kommt dieselbe Markierung mehrmals vor, gilt ihr erstes Vorkommen. Eine Markierung wird übersprungen, wenn ihr Signaturbereich eine bereits platzierte (oder vorhandene) Signatur überdecken würde: Der Unterzeichner erhält dann die nächste freie Markierung. Eine Markierung, die so nah am Seitenrand liegt, dass die Signatur verschoben werden muss, wird nur als letzte Möglichkeit verwendet.
Noch nicht signiertes Dokument
Enthält das Dokument keine Markierung oder fehlt die Markierung eines Unterzeichners, wird am Ende des Dokuments eine Signaturseite mit den Markierungen angefügt, und alle Signaturen werden auf dieser Seite platziert (6 Unterzeichner auf der ersten angefügten Seite, danach 10 pro weiterer Seite).
Bereits signiertes Dokument
Einem bereits elektronisch signierten PDF kann keine Seite hinzugefügt werden: Das würde die vorhandenen Signaturen ungültig machen. Mit position_auto werden die Signaturen auf den freien Markierungen platziert, also den Markierungen, deren Signaturbereich keine vorhandene Signatur überdeckt. Freie Markierungen werden den Unterzeichnern der Reihe nach zugewiesen (#SIG01, #SIG02…).
position_manual.position_manual
Geben Sie für jeden Unterzeichner die Position der Signatur in Zentimetern an:
| Feld | Wert |
|---|---|
sign_page |
Seitennummer, ab 1 (Ganzzahl) |
sign_left |
Abstand vom linken Seitenrand bis zur linken Kante der Signatur, in cm (Dezimalstellen erlaubt) |
sign_bottom |
Abstand vom unteren Seitenrand bis zur Oberkante der Signatur, in cm (Dezimalstellen erlaubt) |
{ "lastname": "Peeters", "email": "[email protected]", "sign_page": 3, "sign_left": 2.5, "sign_bottom": 6 }
sign_left und sign_bottom geben die obere linke Ecke der Signatur an. Die Signatur wird unterhalb und rechts dieses Punkts platziert.
Die Grenzen hängen von der tatsächlichen Seitengröße und der Größe des sichtbaren Stempels ab: Die gesamte Signatur muss mindestens 2 cm von jedem Seitenrand entfernt bleiben. Sind mehrere Signaturmethoden zugelassen, gilt der größte Stempel. Liegt ein Wert außerhalb der Grenzen, nennt die Fehlermeldung den zulässigen Bereich für diese Seite.
Eine Signatur darf weder eine andere Signatur der Anfrage noch eine vorhandene Signatur überdecken, wenn das Dokument bereits signiert ist.
8. Das Objekt Signaturanfrage
Zurückgegeben von request, getRequest, cancel, skip, remind, delete und in den Callbacks gesendet.
| Feld | Beschreibung |
|---|---|
id_sign |
Kennung der Anfrage |
doc_name |
Name des Dokuments |
status_id |
pending laufend · finished von allen signiert · skipped beendet, teilweise signiert · cancelled · deleted |
signers |
Objekt der Unterzeichner, nach Schlüssel ("1", "2"…) — siehe unten |
lang, send_email, signature_redirect, timezone |
Wie bei der Erstellung festgelegt |
from_api |
true, wenn die Anfrage über die API erstellt wurde |
date_status |
Datum der letzten Statusänderung (Zeitzone der Anfrage) |
last_reminder |
Datum der letzten Erinnerung oder null |
credits |
Guthaben der Anfrage (reserviert, solange sie läuft, verbraucht nach Abschluss) |
credits_balance |
Aktuelles Guthaben Ihres Kontos |
pdf_file_base64 |
Signiertes PDF, sobald die Anfrage nicht mehr läuft |
external_reference, metadata |
Wie bei der Erstellung gesendet |
Unterzeichner
| Feld | Beschreibung |
|---|---|
firstname, lastname, email, phone, sign_first |
Wie bei der Erstellung gesendet |
status |
pending · signed · skipped |
signature_link |
Persönlicher Signaturlink, solange der Unterzeichner nicht signiert hat |
signing_time, signing_method |
Nach der Signatur: Datum und verwendete Methode |
verified_firstname, verified_lastname |
Nach der Signatur: von der Signaturmethode geprüfte Identität |
{
"1": {
"firstname": "Ann",
"lastname": "Peeters",
"email": "[email protected]",
"status": "signed",
"signing_time": "2026-10-20 11:02:47",
"signing_method": "itsme-qes-signature",
"verified_firstname": "Ann",
"verified_lastname": "Peeters"
}
}
9. Weitere Endpoints
Alle Endpoints erhalten userid in der URL und x-api-key in den Headern. id_sign wird in der URL übergeben.
Anfragen auflisten
status_id (optional): pending, finished oder skipped. external_reference (optional): nur die Anfragen mit dieser Referenz.
{
"success": true,
"result": [
{
"id_sign": 4521,
"status_id": "pending",
"external_reference": "QUOTE-2026-114"
},
{
"id_sign": 4498,
"status_id": "finished"
}
]
}
Eine Anfrage abrufen
Liefert das Objekt Signaturanfrage, mit dem signierten PDF nach Abschluss der Anfrage. Nutzen Sie zur Statusverfolgung die Callbacks statt wiederholter Aufrufe.
Eine Erinnerung senden
Sendet eine Erinnerungs-E-Mail an die Unterzeichner mit status: pending der aktuell eingeladenen Gruppe (zuerst die Gruppe sign_first). Nur für Anfragen pending. Funktioniert auch bei Anfragen mit send_email: false.
Eine Anfrage beenden (bereits geleistete Signaturen bleiben erhalten)
Möglich, wenn mindestens ein Unterzeichner signiert hat und mindestens einer nicht. Die Anfrage wird skipped, das teilweise signierte PDF ist verfügbar und das Guthaben der Nicht-Unterzeichner wird erstattet.
Eine Anfrage stornieren
Möglich, solange niemand signiert hat; um eine teilweise signierte Anfrage zu beenden, verwenden Sie skip. Die Antwort enthält die Anfrage mit status_id: cancelled; danach werden Anfrage und Dokument aus Ihrem Dashboard entfernt, die Signaturlinks funktionieren nicht mehr und das Guthaben wird erstattet.
Eine Anfrage löschen
Nur Anfragen finished oder skipped. Löscht die Dokumente und die Anfrage. Die Antwort enthält die Anfrage ein letztes Mal, mit status_id: deleted: Laden Sie das signierte PDF vor dem Löschen herunter.
Den Audit-Trail herunterladen
Nicht verfügbar, solange die Anfrage läuft (HTTP 412). Liefert das Anfrageobjekt mit audit_trail_base64: ein PDF mit dem Verlauf der Anfrage (Daten, Methoden, geprüfte Identitäten).
Das Guthaben abrufen
{ "success": true, "result": { "credits_balance": 38.4 } }
Signaturmethoden auflisten
In methods zugelassene Methoden mit dem Preis in Guthaben pro Unterzeichner für Ihr Konto. lang (optional) übersetzt die Bezeichnungen.
{
"success": true,
"result": [
{
"id": "itsme-qes-signature",
"label": "itsme® | QES",
"credits": 1
},
{
"id": "evrotrust-signature",
"label": "Evrotrust | QES",
"credits": 1
},
{
"id": "veriff-advanced-signature",
"label": "Veriff | AES",
"credits": 0.7
},
{
"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änderungen der Unterzeichner, z. B. [{"signer_key": 1, "from": "pending", "to": "signed"}] (nur wenn sich ein Unterzeichner geändert hat) |
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 |
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.
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_iderneut 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 übergetRequestabrufbar. - Weiterleitungen werden befolgt (die Methode
POSTbleibt erhalten).localhostund private Adressen sind nicht zulässig.
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 | OK / Anfrage erstellt |
| 400 | Fehlendes oder ungültiges Feld (die Meldung nennt das Feld) |
| 400 | Fehlende id_sign oder ungültiger Filter status_id |
| 401 | Ungültige userid oder x-api-key |
| 403 | Nicht genug Guthaben oder Anfragelimit erreicht (10 pro Minute) |
| 404 | Unbekannte id_sign für dieses Konto |
| 412 | Aktion im aktuellen Status nicht möglich (z. B. Stornieren nach einer Signatur, Löschen einer laufenden Anfrage) |
Fehler nach Endpoint
| Endpoint | HTTP-Code | Meldung | Ursache |
|---|---|---|---|
| Alle Endpoints | 401 | Please provide a valid x-api-key in headers & userid in url parameters. |
Ungültige userid oder x-api-key |
| Alle Endpoints | 403 | Rate limit exceeded: 10 requests per minute is allowed. Please try again after a minute. |
Mehr als 10 Anfragen pro Minute |
request |
400 | Siehe Validierungsmeldungen | Fehlendes oder ungültiges Feld, PDF oder Position |
request |
403 | You do not have enough credits |
Guthaben niedriger als die Kosten der Anfrage |
list |
400 | Incorrect value for status_id. |
Unbekannter Filter status_id |
getRequest, remind, skip, cancel, delete, requestAuditTrail |
400 | please provide id_sign parameter. |
id_sign fehlt |
getRequest, remind, skip, cancel, delete, requestAuditTrail |
404 | invalid id_sign value. |
Unbekannte id_sign für dieses Konto |
remind |
412 | request can not be remind to user(s): wrong status |
Die Anfrage läuft nicht |
skip |
412 | request can not be skipped: wrong status |
Noch niemand hat signiert, alle haben signiert, oder die Anfrage läuft nicht mehr |
cancel |
412 | request can not be cancelled: someone already signed the PDF |
Mindestens ein Unterzeichner hat signiert |
delete |
412 | request can not be deleted: wrong status_id |
Die Anfrage läuft noch |
requestAuditTrail |
412 | Can not download Audit Trail while the signature request is pending |
Die Anfrage läuft noch |
Validierungsmeldungen bei der Erstellung (request, HTTP 400)
Die Meldung nennt das Feld oder das Problem; … steht für einen Wert Ihrer Anfrage. Stützen Sie Ihren Code auf den HTTP-Code und zeigen Sie die Meldung an, um die Anfrage zu korrigieren.
Alle Validierungsmeldungen anzeigen
Request-Body
Request body can not be empty
title, lang
Field 'title' must be of type string and can not be emptyField 'lang' is an invalid language code
signers
field 'signers' is omitted or is emptyFirstname, Lastname & email address must be of type string and can not be empty… is not an email addressfield 'sign_first' is not a boolean valuefield 'sign_first' can not be 'true' when field 'send_email' is 'false'
methods
You must set at least one signing method… is not a valid method
Optionen
Field 'reminder' should be of type numeric between 0 & 14 (days)Field 'send_email' should be of type booleanField 'email_notification' should be of type booleanField 'note_html' should be of type stringField 'signature_redirect' is not a valid url
external_reference, metadata, callback_url
Field 'external_reference' must be a stringField 'external_reference' can not exceed 255 charactersField 'metadata' must be a JSON objectField 'metadata' can not exceed 4096 bytesField 'callback_url' must be a publicly reachable HTTPS URL
Field 'pdf_file_base64' should be of type string and not emptyField 'pdf_file_base64' doesn't contains a base64 encoded stringField 'pdf_file_base64' doesn't contains a base64 encoded PDF fileYour file is too big > 30 MBCouldn't load your PDF documentPDF file is encrypted and password protected. Please unprotected your PDF file.Couldn't get pages from PDF document
Platzierung der Signaturen
field 'signature_place' is incorrectfield 'sign_page' is empty or is not an integerfield 'sign_left' is empty or is not a number (cm)field 'sign_bottom' is empty or is not a number (cm)Field 'sign_left' for signer … must be between … and … cm (page … is … x … cm, signature … x … cm, margin … cm)Field 'sign_bottom' for signer … must be between … and … cm (…)Field 'sign_page' for signer … is too big: the document has … page(s)Page … is too small for the signature of … (…)The signature of … on page … overlaps an existing signature of the document (…)The signatures of … and … overlap on page … (…)The existing signatures of the document could not be read: the position of the signature of … can not be checked
Bereits signiertes Dokument (position_auto)
Your PDF file is already signed: pages can not be added without invalidating the existing signatures. It contains … free marker(s) for … signer(s): place the signatures manually (signature_place: position_manual).Your PDF file is already signed: pages can not be added without invalidating the existing signatures. The free markers could not be determined: place the signatures manually (signature_place: position_manual).
Verarbeitung
Couldn't extract markers from PDF document: …Unknown error: Request could not be saved into the Database- Fehlermeldung des Signaturanbieters (eID Easy)
12. Aufbewahrung
Signierte Dokumente können 30 Tage nach Abschluss über getRequest oder den Callback request.completed heruntergeladen werden. Der Audit-Trail wird für den in unserem DPA festgelegten Zeitraum aufbewahrt. Archivieren Sie das signierte Dokument und den Audit-Trail innerhalb von 30 Tagen bei sich.
13. Changelog
API v3 — Unterschiede zur API v2
Die API v2 (https://api.e-signature.eu/v2/signature/) bleibt verfügbar und unverändert. Endpoints, Parameter und Authentifizierung sind in beiden Versionen identisch: Um auf die API v3 umzustellen, ersetzen Sie die Basis-URL durch https://api.e-signature.eu/v3/signature/. Sie können Endpoint für Endpoint umstellen.
Die bisherigen URLs (https://www.e-signature.eu/wp-json/signature/ für API v2 und https://www.e-signature.eu/wp-json/esig/v3/signature/ für API v3) bleiben gültig. Wir empfehlen, die URLs von api.e-signature.eu zu verwenden.
| Thema | API v2 | API v3 |
|---|---|---|
| Basis-URL | /v2/signature/ |
/v3/signature/ |
| Ihre eigenen Referenzen | — | Neue Felder external_reference und metadata, in jeder Antwort und jedem Callback zurückgegeben; Filter list nach external_reference |
| Callback-URL | Eine URL pro Konto | Auch pro Anfrage (callback_url) |
| Inhalt des Callbacks | Vollständiger Status der Anfrage | Vollständiger Status der Anfrage + event, event_id, event_at, changes |
| Sicherheit des Callbacks | — | HMAC-SHA256-Signatur im Header X-Esig-Signature |
| Wiederholungen des Callbacks | Stündlich bei Netzwerkfehler, bis zum Empfang | Stündlich bei Netzwerkfehler, Zeitüberschreitung, HTTP 429 oder 5xx, bis zu 24 Versuche, gleiche event_id |
Fehlende id_sign, ungültiger Filter status_id |
HTTP 401 | HTTP 400 |
Unbekannte id_sign |
HTTP 401 | HTTP 404 |
| Audit-Trail einer laufenden Anfrage | HTTP 401 | HTTP 412 |
Manuelle Platzierung: sign_left / sign_bottom |
Feste Grenzen für eine A4-Seite im Hochformat (0 bis 15 cm / 4 bis 28,7 cm), Signaturhöhe 2,5 cm | Grenzen nach tatsächlicher Seitengröße und Stempelgröße der zugelassenen Methoden berechnet, 2 cm Rand; Dezimalstellen erlaubt; die Fehlermeldung nennt den zulässigen Bereich |
| Manuelle Platzierung: Überlappungen | Nicht geprüft | Abgelehnt, wenn eine Signatur eine andere Signatur der Anfrage oder eine vorhandene Signatur des Dokuments überdeckt |
Manuelle Platzierung: sign_page |
Eine Seitennummer, die um eins über der letzten Seite liegt, wurde nicht abgelehnt | Jede nicht vorhandene Seite wird abgelehnt |
Callbacks folgen der Version, mit der die Anfrage erstellt wurde: Eine mit der API v2 erstellte Anfrage erhält weiterhin Callbacks der API v2.