← LumenSign API reference English version

Eingebettetes Signieren

Ihre Kunden unterschreiben direkt in Ihrer Anwendung: Sie zeigen unsere Signierseite in einem iframe auf Ihrer eigenen Website. Das geht in allen Stufen, in denen externe Empfänger handeln (EES, FES), und für Freigebende und Betrachter. Qualifizierte Unterschriften (QES) werden nie eingebettet – Mitglieder mit Zertifikat unterschreiben im Dashboard oder über den Freigabe-Link.

Maßgeblich für Ihre Geschäftslogik bleibt der Webhook (bzw. GET /v1/events). Die Nachrichten der eingebetteten Seite sind Hinweise für Ihre Oberfläche, keine Bestätigung.

1. Erlaubte Websites festlegen

Nur Websites auf der Liste Ihrer Organisation dürfen die Signierseite einbetten. Die Liste ist leer, bis Sie sie füllen – leer heißt: Einbettung aus.

PUT /v1/embed-settings
Authorization: Bearer qgw_live_…
Idempotency-Key: 5d1f…
Content-Type: application/json

{ "allowedOrigins": ["https://app.example.com", "https://*.beispiel.de"] }

Antwort:

{ "object": "embed_settings", "allowedOrigins": ["https://app.example.com", "https://*.beispiel.de"] }

Regeln für jeden Eintrag:

Änderungen gelten sofort für unsere Signierseite und für neue Einbettungs-Sitzungen. Für den Unterschriftsschritt bei EES/FES erhält der Signaturdienst die Liste beim Start der Unterschriftsrunde; eine spätere Änderung wirkt erst für neue Runden. Dort zählen nur exakte Origins (Einträge mit * erlauben nur unsere Seite, nicht den Unterschriftsschritt), und je Runde höchstens neun Ihrer Origins.

Für Signierseite, Einbettungs-Sitzungen und Unterschriftsschritt gilt dieselbe Regel je Modus: Im Live-Modus zählen nur die https-Einträge, http://localhost:<port> und andere Nur-Test-Einträge ausschließlich im Testmodus. Ist die Einbettung für Ihre Organisation ausgeschaltet (Stufenfunktion) oder im Live-Modus noch gesperrt, erhält auch der Unterschriftsschritt keine Ihrer Origins. Qualifizierte Unterschriften (QES) werden nie eingebettet.

2. Einbettungs-Sitzung anfordern

Sobald ein Empfänger an der Reihe ist („dran“, Ereignis recipient.ready), fordert Ihr Server eine Sitzung für die Website an, auf der Sie die Seite zeigen:

POST /v1/envelopes/{id}/recipients/{rid}/embedded-session
Authorization: Bearer qgw_test_…
Idempotency-Key: 8c2e…
Content-Type: application/json

{ "origin": "https://app.example.com", "locale": "de" }
{
  "object": "embedded_session",
  "url": "https://sign.<domain>/s/<token>?embed=1",
  "expiresAt": "2026-09-30T12:05:00Z",
  "origin": "https://app.example.com"
}

Mögliche Fehler, in dieser Reihenfolge geprüft:

Status / CodeBedeutung
404Vorgang oder Empfänger gehören nicht zu Ihrer Organisation oder nicht zum Modus des Schlüssels
403 / 9039Einbettung ist für Ihre Organisation abgeschaltet
403 / 9038origin steht nicht auf der Liste (auch: Platzhalter statt exakter Origin, http://localhost im Live-Modus)
422 / 9012 qes_not_embeddableDer Empfänger unterschreibt qualifiziert (QES)
409 / 9033Der Empfänger ist nicht an der Reihe (details.reason)
409 / 9030 signing_page_disabledDie Signierseite ist abgeschaltet
403 / 9030 embedding_live_disabledLive-Schlüssel: Einbettung ist für den Live-Betrieb noch nicht freigegeben
403Dem Schlüssel fehlt envelopes:signing_urls

Ein Signierlink (POST …/signing-url) oder der Link der Einladungsmail lässt sich ebenfalls einbetten: Hängen Sie ?embed=1 an. Dann darf jede Website Ihrer Liste die Seite zeigen, und der Link gilt wie gewohnt (15 Minuten bis zum ersten Öffnen, danach 60 Minuten Sitzung). Die Einbettungs-Sitzung ist vorzuziehen, weil sie an genau eine Website gebunden ist.

3. Seite anzeigen mit dem Widget

<div id="unterschrift"></div>
<script src="https://sign.<domain>/embed/v1/onesign.js"></script>
<script>
  const widget = OneSign.mountSigning(document.getElementById('unterschrift'), {
    url: sessionUrl, // die URL aus Schritt 2, von Ihrem Server
    minHeight: 600,
    title: 'Mietvertrag unterschreiben',
    onEvent(event) {
      if (event.type === 'completed') zeigeAbschluss();
      if (event.type === 'declined') zeigeAblehnung();
      if (event.type === 'error') zeigeFehler(event.code);
    },
  });
  // widget.destroy() entfernt das iframe wieder.
</script>

Das Widget hat keine Abhängigkeiten und setzt keine Cookies. Es erzeugt das iframe mit allow="camera; microphone; fullscreen" (die Identitätsprüfung der FES braucht die Kamera auf jeder Rahmen-Ebene) und referrerpolicy="no-referrer", passt die Höhe an (resize) und gibt nur Nachrichten weiter, die von der Origin der Signierseite stammen und zum Protokoll passen.

Ohne Widget: Ein eigenes iframe mit denselben Attributen funktioniert ebenso; hören Sie dann selbst auf message und prüfen Sie event.origin gegen die Origin der URL sowie source und v der Nachricht.

4. Nachrichten der Seite

Jede Nachricht hat die Form { source: "onesign", v: 1, type, …, at } und enthält nie Namen, E-Mail-Adressen, Tokens oder Links. Die Seite schickt sie nur an die gebundene Origin (bzw. die geprüfte Website Ihrer Liste), nie an *.

typeZusatzfelderBedeutung
readyenvelopeId, recipientIdSeite geladen
resizeheightHöhe der Seite in Pixeln
signedenvelopeId, recipientIdDer Empfänger hat unterschrieben
approvedenvelopeId, recipientIdDer Empfänger hat freigegeben
viewedenvelopeId, recipientIdDer Empfänger hat das Ansehen bestätigt
declinedenvelopeId, recipientIdDer Vorgang wurde abgelehnt (auch im Unterschriftsschritt)
completedenvelopeIdDer Vorgang ist abgeschlossen
expiredenvelopeId, recipientIdDer Vorgang ist abgelaufen
errorcodelink_invalid, rate_limited, unavailable, action_failed, envelope_cancelled, envelope_failed, qes_new_window

envelopeId und recipientId stehen nur in Nachrichten einer Einbettungs-Sitzung; bei einem Signierlink mit ?embed=1 fehlen sie. Die Seite leitet im eingebetteten Modus nie selbst weiter – reagieren Sie auf completed (oder den Webhook). Datenschutzhinweis und Fußzeile mit Impressum bleiben im Rahmen sichtbar.

5. Sicherheit und Browser