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 userid jedes Aufrufs;
  • API token: im HTTP-Header x-api-key jedes 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:

  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 einer Signaturanfrage

  1. Sie erstellen die Anfrage mit dem PDF, den Unterzeichnern und den zugelassenen Signaturmethoden. Das Guthaben wird belastet.
  2. Jeder Unterzeichner erhält eine E-Mail mit einem persönlichen Signaturlink (oder Sie senden den signature_link selbst, wenn send_email false ist).
  3. Der Unterzeichner bestätigt seine Identität mit einer der zugelassenen Methoden (itsme®, Evrotrust, Veriff, OTP…) und signiert.
  4. Wenn alle signiert haben, ist die Anfrage finished: Das signierte PDF (PAdES) ist über getRequest verfü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.
Auch mit 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

POST/v3/signature/request?userid={userid}
{
  "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.

Tipp: Schreiben Sie die Markierungen in weißer Schrift (auf weißem Hintergrund), damit sie im signierten PDF unsichtbar sind. Sie müssen echter Text bleiben, kein Bild, um erkannt zu werden.

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…).

Enthält das signierte Dokument nicht genug freie Markierungen für alle Unterzeichner, wird die Anfrage abgelehnt (HTTP 400): Verwenden Sie 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

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

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

GET/v3/signature/getRequest?userid={userid}&id_sign=4521

Liefert das Objekt Signaturanfrage, mit dem signierten PDF nach Abschluss der Anfrage. Nutzen Sie zur Statusverfolgung die Callbacks statt wiederholter Aufrufe.

Eine Erinnerung senden

PATCH/v3/signature/remind?userid={userid}&id_sign=4521

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)

PATCH/v3/signature/skip?userid={userid}&id_sign=4521

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

DELETE/v3/signature/cancel?userid={userid}&id_sign=4521

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

DELETE/v3/signature/delete?userid={userid}&id_sign=4521

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

GET/v3/signature/requestAuditTrail?userid={userid}&id_sign=4521

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

GET/v3/signature/requestBalance?userid={userid}
{ "success": true, "result": { "credits_balance": 38.4 } }

Signaturmethoden auflisten

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

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_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.

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 empty
  • Field 'lang' is an invalid language code

signers

  • field 'signers' is omitted or is empty
  • Firstname, Lastname & email address must be of type string and can not be empty
  • … is not an email address
  • field 'sign_first' is not a boolean value
  • field '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 boolean
  • Field 'email_notification' should be of type boolean
  • Field 'note_html' should be of type string
  • Field 'signature_redirect' is not a valid url

external_reference, metadata, callback_url

  • Field 'external_reference' must be a string
  • Field 'external_reference' can not exceed 255 characters
  • Field 'metadata' must be a JSON object
  • Field 'metadata' can not exceed 4096 bytes
  • Field 'callback_url' must be a publicly reachable HTTPS URL

PDF

  • Field 'pdf_file_base64' should be of type string and not empty
  • Field 'pdf_file_base64' doesn't contains a base64 encoded string
  • Field 'pdf_file_base64' doesn't contains a base64 encoded PDF file
  • Your file is too big > 30 MB
  • Couldn't load your PDF document
  • PDF 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 incorrect
  • field 'sign_page' is empty or is not an integer
  • field '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.

Shopping cart

0
image/svg+xml

No products in the cart.

Continue Shopping
This site is registered on wpml.org as a development site. Switch to a production site key to remove this banner.