Entwickler · API · Webhooks

Ein POST. Zur Unterschrift verschickt.

Eine REST-API, mit der Sie PDFs zur Unterschrift senden und jeden Unterzeichner verfolgen, signierte Webhooks für jeden Schritt, Idempotenzschlüssel und stabile Fehlercodes. API-Schlüssel und Webhooks gibt es im Enterprise-Tarif.

Was Sie bauen können: Unterschriften aus Ihrer eigenen Software
curl https://api.wesign.now/v1/signing-requests \
  -H "Authorization: Bearer $WSK_KEY" \
  -H "Idempotency-Key: order-123/sign" \
  -F "file=@contract.pdf" \
  -F 'signers=[{"email":"jane@acme.com","role":"client"}]' \
  -F "placement=auto_append"

# → 201 Created
# {
#   "documentId": "8a1e4f9a-…",
#   "status": "pending",
#   "signers": [{
#     "role": "client",
#     "signingUrl": "https://acme.wesign.now/en/sign/…",
#     "emailed": true, …
#   }], …
# }
Was Sie bekommen

Eine API, Webhooks und eine Doku, die auch Ihre Tools lesen.

REST-API

PDF senden, jeden Unterzeichner verfolgen, erinnern oder zurückziehen, das versiegelte PDF und seinen Audit-Trail herunterladen. Bearer-Schlüssel, JSON-Antworten und eine OpenAPI-3.1-Spezifikation mit einer ID für jede Operation.

API-Überblick

Signierte Webhooks

signing_request.sent, .viewed, .signed, document.completed und weitere, jedes mit HMAC-SHA256 signiert. Eine fehlgeschlagene Zustellung wiederholen wir rund 45 Stunden lang; im Zustellprotokoll können Sie sie erneut senden.

Webhook-Events

Doku für KI-Assistenten

llms.txt listet jede Doku-Seite auf, llms-full.txt enthält sie alle als reinen Text, openapi.json die genauen Formen von Anfragen und Antworten. Geben Sie sie Ihrem Coding-Assistenten.

Für KI-Assistenten

Konkrete Beispiele.

Vier Aufrufe, die die meisten Integrationen brauchen. Feldnamen wie in der OpenAPI-Spezifikation.

1. Senden mit Anker-Platzierung

Setzen Sie einen Marker wie [[ls:signature:buyer]] in Ihr PDF. Wir platzieren dort das Signaturfeld des Käufers und blenden den Marker aus. Kein Marker im PDF? Dann hängen wir eine Signaturseite an.

POST /v1/signing-requests
Content-Type: multipart/form-data

file=@offer.pdf        # the PDF contains [[ls:signature:buyer]]
signers=[{"email":"buyer@acme.com","role":"buyer","name":"Ann Buyer"}]
placement=anchors

2. Mehrere Unterzeichnende, der Reihe nach

Drei Unterzeichnende, nacheinander. Unterzeichner 2 wird erst eingeladen, wenn Unterzeichner 1 unterschrieben hat.

POST /v1/signing-requests
Content-Type: multipart/form-data

file=@contract.pdf
signing_mode=sequential
placement=auto_append
signers=[
  {"email":"founder@acme.com","role":"founder"},
  {"email":"investor@vc.example","role":"investor"},
  {"email":"witness@law.example","role":"witness"}
]

3. Webhook-Empfänger

Prüfen Sie den Zeitstempel und den HMAC über den unveränderten Body, dann reagieren Sie auf das Event.

// Node + Express. The full verifier (Node and PHP) is in the docs.
app.post('/wesign/callback', express.raw({ type: 'application/json' }), (req, res) => {
  // X-WeSign-Signature: t=<unix seconds>,v1=<hex>  (two v1 for 24 h after a rotation)
  const parts = (req.get('x-wesign-signature') ?? '').split(',')
  const t = parts[0]?.startsWith('t=') ? parts[0].slice(2) : ''
  if (!t || Math.abs(Date.now() / 1000 - Number(t)) > 300) return res.status(401).end()
  const expected = crypto.createHmac('sha256', SECRET)
    .update(`${t}.${req.body}`).digest()
  const valid = parts.filter((p) => p.startsWith('v1=')).some((p) => {
    const got = Buffer.from(p.slice(3), 'hex')
    return got.length === expected.length && crypto.timingSafeEqual(got, expected)
  })
  if (!valid) return res.status(401).end()

  const evt = JSON.parse(req.body.toString('utf8'))
  if (evt.event === 'document.completed') {
    // fetch evt.signed_pdf_url with your API key, compare evt.sha256, keep a copy
  }
  res.sendStatus(200)
})

4. Idempotente Wiederholung

Derselbe Schlüssel mit demselben Body innerhalb von 24 Stunden liefert die erste Antwort erneut. Eine Wiederholung nach einem Netzwerkfehler sendet also nie doppelt.

POST /v1/signing-requests
Idempotency-Key: order-123/sign

# First call:                      201 Created
# Same key + same body (24 h):     201, the same body, Idempotent-Replayed: true
# Same key while the first runs:   409 idempotency_in_progress + Retry-After
# Same key + a different body:     422 idempotency_key_reuse
Rezepte

Was Sie heute bauen können.

Jedes Muster nutzt die REST-API und Webhooks. Die Karten verlinken auf die Doku, die es beschreibt.

Nicht verfügbar: ein SDK, eine Sandbox oder Testschlüssel sowie Apps oder Plug-ins für andere Tools.

Gebaut für den Produktivbetrieb.

Bearer-Schlüssel, zwei Scopes

Jeder Schlüssel gehört zu genau einem Workspace. Ein full-Schlüssel ruft die ganze API auf, ein embedded-Schlüssel verwaltet nur eingebettete Signatursitzungen. Beschränken Sie einen Schlüssel auf Ihre IP-Adressen; ein Widerruf wirkt sofort.

60 Anfragen pro Minute und Schlüssel

Ein festes Zeitfenster pro Schlüssel über alle /v1-Endpunkte. Erfolgreiche Antworten tragen RateLimit-*-Header, ein 429 trägt Retry-After.

Stabile Fehlercodes

Jeder Fehler ist JSON mit einer lesbaren Meldung (error), einem stabilen code und, wo es hilft, meta. Prüfen Sie den code; die Meldung kann sich ändern.

Versiegelte, prüfbare PDFs

Das unterschriebene PDF trägt ein PAdES-Siegel, das jeder konforme Reader prüfen kann. Der Audit-Trail listet jedes Ereignis mit Zeitpunkt, E-Mail-Adresse und maskierter IP-Adresse des Unterzeichners sowie jede SMS-Code-Prüfung.

API-Zugang gibt es mit Enterprise.

API-Schlüssel und Webhooks sind Teil des Enterprise-Tarifs. Sagen Sie uns, was Sie anbinden möchten. Die Doku ist öffentlich, Sie können sie also vorher lesen.