Zum Hauptinhalt springen

Authentifizierung

Jede Anfrage trägt einen API-Schlüssel. Schlüssel werden in der App unter API-Schlüssel → Schlüssel erstellen angelegt, von Inhabern und Admins der Organisation. Ein Schlüssel gehört zu genau einem Workspace, und sein Geheimnis wird einmal angezeigt, beim Anlegen; danach zeigt die App nur noch seine ersten Zeichen (das Präfix).

Authorization: Bearer ff_live_3f9c...

X-API-Key: ff_live_3f9c... wird ebenfalls akzeptiert; sendet eine Anfrage beides, zählt Authorization. Ein Schlüssel ist ff_live_ oder ff_test_, gefolgt von 43 Buchstaben und Ziffern.

Wenn ein Schlüssel abgelehnt wird​

AntwortGrund
401 unauthorizedEs wurde kein Schlüssel gesendet (die Antwort trägt WWW-Authenticate: Bearer), der Schlüssel hat nicht das Format ff_live_…/ff_test_…, oder er ist unbekannt oder widerrufen. detail sagt, was zutrifft.
403 forbiddenDem Schlüssel fehlt der Scope, den der Endpunkt braucht (This API key lacks the "template:write" scope).
403 forbiddenDie Anfrage kommt von einer Webseite (sie hat einen Origin-Header). Schlüssel sind für Server; siehe Aus dem Browser.
403 forbiddenDer Plan enthält die Funktion nicht; das Problem nennt sie in feature (post_processing, office, einvoice, channels …). Siehe Plan-Limits.

Test- und Live-Schlüssel​

Das Präfix zeigt die Umgebung. Sie wählen sie beim Anlegen des Schlüssels (Test oder Live).

ff_live_…ff_test_…
Verwenden fürProduktionEntwicklung, CI, Staging, das Dev-Kit
EinheitenWerden gegen den Plan gezählt (Einheiten)Werden nicht gezählt. Test-E-Rechnungen sind stattdessen auf eine Anzahl pro Tag begrenzt
Wenn die Einheiten des Free-Plans aufgebraucht sindRenderings stoppen mit 402 quota_exceededRenderings laufen weiter
Aufbewahrung der AusgabenDie Aufbewahrungsfrist des Plans oder die kürzere des Workspace (Aufbewahrung)Höchstens 24 Stunden
Testmarkierung auf der DateiNieIm Free-Plan auf jeder Testdatei; in jedem Plan auf einer Test-E-Rechnung
DeduplizierungJaNein, jede Anfrage rendert
version: "latest" (der Entwurf)Wird mit 400 invalid_request abgelehntErlaubt
Word- und PowerPoint-VorlagenAb dem Starter-PlanIm Free-Plan nur das PDF (403 test_output_unavailable für docx und pptx)
Rate-LimitDie Anfragen pro Sekunde des PlansDerselbe Bucket wie für Live-Schlüssel, im Free-Plan zusätzlich 30 Anfragen pro Minute
Webhook-EreignisseGehen an jeden Endpunkt, der live in seinen environments hatGehen an jeden Endpunkt, der test in seinen environments hat (beides ist der Standard)

Alles andere ist identisch: dieselben Endpunkte, dieselben Vorlagen, dieselbe Ausgabe. Für den Wechsel in die Produktion tauschen Sie nur den Schlüssel aus.

Scopes​

Ein Schlüssel kann nur, was seine Scopes erlauben. Wählen Sie sie beim Anlegen des Schlüssels; ein ✓ markiert die, die der Dialog standardmäßig ankreuzt.

ScopeErlaubtStandard
render:createPOST /renders, POST /renders/batch, die PDF-Tools POST /pdf/merge, /pdf/protect, /pdf/watermark und /pdf/convert, die Kompatibilitätsendpunkte✓
render:readGET /renders, GET /renders/{id}, GET /renders/{id}/result, GET /jobs/{id}, POST /pdf/info✓
render:inputGET /renders/{id}/input, die aufbewahrte Anfrage eines Renderings (formfeed renders pull); jeder Lesezugriff wird protokolliert. Siehe Ein fehlgeschlagenes Rendering nachstellen
template:readVorlagen, Versionen, Dateien, Schemas und Channels lesen, POST /templates/{id}/validate, Brand Kit und geteilte Partials lesen (formfeed templates pull)✓
template:writeVorlagen anlegen, ändern, veröffentlichen und archivieren, Release Channels verschieben, geteilte Partials schreiben (formfeed templates push)
webhook:manageWebhook-Endpunkte verwalten (nötig für die Trigger der No-Code-Integrationen), Ereignisse erneut an sie senden und Live-Ereignisse mit formfeed listen --live
webhook:listenSitzungen von formfeed listen und Ereignisse erneut an sie senden. Siehe Webhooks lokal entwickeln
account:readGET /account, GET /usage (formfeed whoami)✓
file:readGET /files, GET /files/{id} (die Dateibibliothek des Workspace)
file:writePOST /files (Hochladen in die Bibliothek)
file:deleteDELETE /renders/{id}/outputs, DELETE /files/{id}
workspace:deleteDELETE /workspaces/{id} für jeden Workspace der Organisation des Schlüssels, auch seinen eigenen (formfeed workspaces delete). Nie Teil eines Standards oder eines CLI-Anmeldeschlüssels

Ein Write-Scope bringt seinen Read-Scope mit: Wer im Dialog render:create ankreuzt, kreuzt auch render:read an, template:write kreuzt template:read an und file:write kreuzt file:read an, weil Schreiben das Objekt zurückgibt und ein Schlüssel lesen können soll, was er geschrieben hat.

Geben Sie jeder Integration einen eigenen Schlüssel mit den kleinstmöglichen Scopes: Ein Backend, das nur rendert, braucht render:create und render:read; der Schlüssel in Ihrem CI-Schritt zum Veröffentlichen braucht template:write.

Schlüssel sicher aufbewahren​

  • Halten Sie Schlüssel auf dem Server. Die API lehnt einen Schlüssel ab, der von einer Webseite gesendet wird (Aus dem Browser), und ein Schlüssel in einer mobilen App oder einem Browser-Bundle ist ohnehin öffentlich: Jeder, der ihn findet, kann auf Ihre Kosten rendern.
  • Speichern Sie Schlüssel in Ihrem Secret-Manager oder in der Umgebung (FORMFEED_API_KEY), nie im Repository.
  • Benennen Sie Schlüssel nach ihrem Einsatzort (billing-service-prod, github-actions). Die Liste unter API-Schlüssel zeigt, wann jeder Schlüssel Zuletzt genutzt wurde. Ein ungenutzter Schlüssel fällt so leicht auf und lässt sich widerrufen.
  • Rotieren Sie ohne Ausfallzeit: Legen Sie den neuen Schlüssel an, bringen Sie ihn in Betrieb, prüfen Sie, dass sich die Angabe Zuletzt genutzt des alten Schlüssels nicht mehr ändert, und widerrufen Sie dann den alten Schlüssel (Schlüssel widerrufen). Ein widerrufener Schlüssel funktioniert innerhalb einer Minute nicht mehr, weil die API die Angaben eines Schlüssels bis zu 60 Sekunden vorhält.

Die App und KI-Agenten​

Die App und KI-Agenten, die über den MCP-Server mit einer Anmeldung bei Formfeed verbunden sind, verwenden keine API-Schlüssel. Sie senden das Sitzungstoken des Mitglieds als Authorization: Bearer …, und die App nennt den Workspace in X-Formfeed-Workspace. Ein solches Token kann, was die Rolle des Mitglieds erlaubt. Das Token eines Agenten ist weiter eingeschränkt, auf render:create, render:read, template:read und account:read: Ein Agent kann weder veröffentlichen, löschen, Webhooks verwalten noch einen Entwurf (latest) rendern, gleich welche Rolle das Mitglied hat. Erlaubt das Mitglied es diesem Agenten und darf seine Rolle Vorlagen bearbeiten, kann der Agent außerdem Vorlagen als Entwürfe speichern (POST /templates und POST /templates/{id}/versions ohne publish; siehe Vorlagen-Entwürfe). Nutzt das Mitglied die Zwei-Faktor-Authentifizierung, arbeitet ein Agent erst, nachdem das Mitglied ihn in Formfeed bestätigt hat. Für Ihre eigenen Integrationen brauchen Sie nichts davon: Verwenden Sie einen API-Schlüssel.

CLI-Anmeldung​

formfeed login verwendet einen Geräte-Flow statt eines eingefügten Schlüssels: Die CLI zeigt einen Code, Sie bestätigen ihn im Browser unter app.formfeed.dev/device und wählen einen Workspace, und die CLI erhält einen Live-Schlüssel (ff_live_…) mit dem Namen Formfeed CLI on <machine> und den Scopes Ihrer Rolle in der Organisation. Renderings mit ihm sind Live-Renderings und zählen gegen die Einheiten des Plans; wenn Sie nur ausprobieren, melden Sie sich mit formfeed login --api-key ff_test_… und einem Test-Schlüssel an.

RolleScopes des CLI-Schlüssels
Betrachterrender:read, template:read, account:read, file:read
Editordie des Betrachters, dazu render:create, template:write, file:write, render:input, webhook:listen
Admin und Inhaberdie des Editors, dazu webhook:manage und file:delete

Der Schlüssel erhält nie workspace:delete. Er erscheint wie jeder andere unter API-Schlüssel und lässt sich dort widerrufen. formfeed logout entfernt den Schlüssel nur von Ihrem Rechner; gültig bleibt er, bis Sie ihn in der App widerrufen. In der CI setzen Sie stattdessen FORMFEED_API_KEY. Siehe CLI-Installation.