Integrationen#

Dieselbe API, erreichbar aus den Tools, die du ohnehin nutzt. Ein MCP-Server bringt EnConvert in einen Coding-Agenten, ein n8n Node in einen Workflow, eine CLI in dein Terminal, zehn SDKs in deinen Anwendungscode und ein Web-Widget auf deine eigene Website.


Wähle deine Oberfläche#

Jede Oberfläche unten ruft dieselben öffentlichen REST-Endpunkte mit demselben API-Schlüssel auf, gegen dasselbe Projekt und dasselbe monatliche Ops-Kontingent.

Oberfläche Paket Wann du sie nimmst
MCP-Einrichtung @enconvert/mcp Ein Coding-Agent wie Claude Code, Cursor, Windsurf oder Claude Desktop soll die API selbst aufrufen, direkt im Chat, ohne dass du HTTP schreibst.
n8n @enconvert/n8n-nodes-enconvert Du baust einen n8n-Workflow und willst Konvertierungen, Scraping und Crawling als Node, der echte Binary Data ausgibt.
CLI @enconvert/cli Du willst Dateien konvertieren oder Web-Daten holen, aus einem Terminal oder einem Shell-Skript, mit --json-Ausgabe und stabilen Exit-Codes.
SDKs zehn Sprach-Clients Du schreibst Anwendungscode und willst typisierte Methoden mit Autovervollständigung im Editor statt selbst gebautem HTTP.

Es gibt eine fünfte Oberfläche ohne eigene Seite: Web-Widgets, weiter unten behandelt, die einzige, die deine Endnutzer direkt anfassen.

Wenn du noch unentschieden bist: REST, MCP und CLI vergleicht die Zugangsoberflächen nebeneinander, und Authentifizierung erklärt, welchen Key-Typ jede davon braucht.


Web-Widgets#

Web-Widgets betten URL- und Dateikonvertierung mit einem einzigen Script-Tag in jede Website ein, sodass deine Besucher eine URL zu einem PDF konvertieren, einen Screenshot erstellen oder eine hochgeladene Datei konvertieren, ohne deine Seite zu verlassen. Der Embed-Code enthält nur eine Widget-ID. Die Authentifizierung läuft im iframe über eine Cloudflare-Turnstile-Challenge und ein kurzlebiges JWT von POST /v1/widget/{widget_id}/token, sodass niemals ein API-Schlüssel in deinem Frontend-Code offengelegt wird.

Jedes Widget ist an einen Konvertierungs-Endpunkt und eine Liste erlaubter Domains gebunden, beides im Dashboard gesetzt. Hinter einem Widget kann jeder Konvertierungs-Endpunkt stehen:

So funktionieren Widgets#

Einrichtung#

  1. Gehe zu deinem EnConvert-Dashboard > Widgets und klicke auf Create Widget.
  2. Wähle den Konvertierungs-Endpunkt aus (z. B. /v1/convert/url-to-pdf) und gib die Domains an, auf denen das Widget eingebettet wird. Wildcard-Subdomains werden unterstützt (z. B. *.example.com).
  3. Für das Widget wird automatisch ein interner öffentlicher API-Schlüssel erstellt, beschränkt auf den ausgewählten Endpunkt und die erlaubten Domains. Dieser Schlüssel wird nie offengelegt.

Zwei Voraussetzungen werden gern übersehen: Deine Konto-E-Mail muss verifiziert sein, und die Liste der erlaubten Domains darf nicht leer sein. Fehlt eines von beidem, wird die Widget-Erstellung abgelehnt.

Einbettung#

Füge das Embed-Script zu deiner Website hinzu:

<script src="https://enconvert.com/embed.js" data-widget-id="your-widget-id"></script>

Das Script erstellt einen sandboxed iframe, der das EnConvert-Widget lädt. Im Embed-Code erscheint kein API-Schlüssel.

Laufzeitablauf#

  1. Widget lädt im iframe und ruft seine Konfiguration von GET /v1/widget/{widget_id}/config ab.
  2. Domain-Validierung: Das Widget prüft, ob der Origin der übergeordneten Seite mit der Liste der erlaubten Domains übereinstimmt. Unterstützt exakte Domains und Wildcard-Subdomain-Muster (*.example.com).
  3. Nutzer übermittelt eine URL oder Datei: Das Widget fordert ein unsichtbares Turnstile-Challenge-Token an.
  4. Token-Austausch: Das Widget sendet das Turnstile-Token an POST /v1/widget/{widget_id}/token und erhält ein JWT (1 Stunde gültig) sowie ein Refresh-Token-Cookie (7 Tage gültig).
  5. Konvertierung: Das Widget ruft den Konvertierungs-Endpunkt mit dem JWT auf.
  6. Ergebnis: Die API liefert eine JSON-Antwort mit einer presigned_url. Das Widget zeigt einen Download-Link an.
  7. Timeout-Recovery: Überschreitet die Konvertierung die Timeout-Grenzen des Reverse-Proxys, fragt das Widget GET /v1/convert/status/{job_id} mit der vorab generierten Job-ID ab.

Automatische Token-Erneuerung#

Das Widget stellt seine Funktion nie wegen abgelaufener Authentifizierung ein:

  • Bei der ersten Konvertierung stellt die API sowohl ein JWT (1 Stunde gültig) als auch ein Refresh-Token (7 Tage gültig, httpOnly-Cookie) aus.
  • Bei nachfolgenden Konvertierungen versucht das Widget zunächst, das JWT zu erneuern über POST /v1/widget/{widget_id}/refresh mithilfe des Refresh-Token-Cookies, ohne dass eine Turnstile-Challenge nötig ist.
  • Ist das Refresh-Token selbst abgelaufen (nach 7 Tagen Inaktivität), fällt das Widget auf eine neue Turnstile-Challenge zurück.
  • Das Refresh-Token wird bei jeder Erneuerung rotiert: Jede Erneuerung stellt ein neues 7-Tage-Cookie aus.

Das bedeutet, dass ein Widget-Besucher, der alle paar Tage konvertiert, nach der ersten Turnstile-Challenge nie wieder eine sieht.

Widget-Endpunkte#

Konfiguration#

Ruft die Konfiguration für ein bestimmtes Widget ab. Keine Authentifizierung erforderlich.

GET /v1/widget/{widget_id}/config

Antwort:

{
    "endpoint": "/v1/convert/url-to-pdf",
    "input_type": "url",
    "allowed_domains": ["https://example.com", "*.example.com"],
    "turnstile_site_key": "1x00000000000000000000AA",
    "widget_branding": true
}
Feld Beschreibung
endpoint Der Konvertierungs-Endpunkt, für den dieses Widget konfiguriert ist.
input_type "url" für URL-basierte Endpunkte, "file" für Datei-Upload-Endpunkte.
allowed_domains Domains, die berechtigt sind, dieses Widget einzubetten. Unterstützt Wildcards.
turnstile_site_key Cloudflare-Turnstile-Site-Key zur Bot-Verifizierung.
widget_branding Ob das „Powered by EnConvert“-Badge angezeigt wird. Wird durch den Subscription-Plan bestimmt.

Token-Austausch#

Tauscht ein Turnstile-Challenge-Token gegen ein JWT. Setzt ein Refresh-Token-Cookie.

POST /v1/widget/{widget_id}/token
X-Parent-Origin: https://your-website.com
Content-Type: application/json

{
    "turnstile_token": "cloudflare-challenge-response-token"
}

Antwort:

{
    "token": "eyJhbGciOiJIUzI1NiIs...",
    "token_type": "Bearer",
    "expires_in": 3600
}

Setzt zudem ein httpOnly-refresh_token-Cookie (7 Tage gültig, Secure, SameSite=none).

Token-Erneuerung#

Erneuert ein abgelaufenes JWT mithilfe des httpOnly-Refresh-Token-Cookies. Keine Turnstile-Challenge erforderlich.

POST /v1/widget/{widget_id}/refresh
X-Parent-Origin: https://your-website.com

Kein Request-Body erforderlich. Das Refresh-Token wird automatisch aus dem Cookie gelesen.

Antwort:

{
    "token": "eyJhbGciOiJIUzI1NiIs...",
    "token_type": "Bearer",
    "expires_in": 3600
}

Das Refresh-Token-Cookie wird bei jeder Erneuerung rotiert (neues 7-Tage-Cookie ausgestellt).

Fehlerantworten: - 401: kein Refresh-Token-Cookie vorhanden oder Refresh-Token abgelaufen - 403: Refresh-Token passt nicht zum Projekt des Widgets, oder Domain nicht autorisiert - 404: Widget nicht gefunden oder deaktiviert

Konvertierungsantwort#

Sowohl URL-basierte als auch datei-basierte Widget-Konvertierungen liefern eine konsistente JSON-Antwort mit einer presigned Download-URL:

{
    "presigned_url": "https://spaces.example.com/...",
    "object_key": "env/files/{project_id}/url-to-pdf/example_20260405_123456789.pdf",
    "filename": "example_20260405_123456789.pdf",
    "file_size": 123456,
    "conversion_time_seconds": 8.5,
    "job_id": "client-generated-uuid"
}

Das Widget verwendet die presigned_url, um einen Download-Link anzuzeigen. Presigned URLs laufen nach 15 Minuten ab. Was dieses Zeitfenster für deine Besucher bedeutet, steht unter Signierte URLs.

Einschränkungen für Widget-Konvertierungen: - Nur eine einzelne URL / einzelne Datei - Nur synchroner Modus (kein async oder Batch) - Keine Webhook-Callbacks oder Benachrichtigungs-E-Mails - Endpunkt beschränkt auf den für das Widget konfigurierten

Widget-Branding#

Pläne, die Widget-Branding beinhalten, zeigen unten im Widget ein kleines „Powered by EnConvert“-Badge an. Dies wird durch das Feld widget_branding im Subscription-Plan gesteuert:

Plan Branding
Founding (kostenlos) Angezeigt
Indie, Studio, Production, Enterprise Ausgeblendet

Das Branding-Badge verlinkt zu https://www.enconvert.com und ist dezent gestaltet: kleiner Text unterhalb des Widget-Formulars mit reduzierter Deckkraft.

Um das Branding zu entfernen, wechsle vom kostenlosen Founding-Plan weg. Jeder kostenpflichtige Plan blendet es aus.

Widget-Verwaltung#

Widgets werden über das EnConvert-Dashboard oder die Backend-API verwaltet:

Operation Endpunkt Beschreibung
Erstellen POST /widgets Erstellt ein Widget und generiert automatisch einen internen öffentlichen API-Schlüssel.
Auflisten GET /widgets?project_id={id} Listet alle aktiven Widgets für ein Projekt auf.
Abrufen GET /widgets/{id} Ruft die Details eines einzelnen Widgets ab.
Aktualisieren PATCH /widgets/{id} Aktualisiert Widget-Name, Endpunkt oder API-Schlüssel.
Löschen DELETE /widgets/{id} Löscht das Widget weich (setzt active=false).
Anderer Host: Diese Verwaltungsrouten liegen auf dem EnConvert-Backend, das das Dashboard ausliefert, nicht auf api.enconvert.com. Die Konvertierungs- und Widget-Auth-Routen unter /v1/ gehören zum Gateway.

Embed-Code-Referenz#

Standard-HTML#

<script src="https://enconvert.com/embed.js" data-widget-id="your-widget-id"></script>

Das Script: - Erstellt einen sandboxed iframe (allow-scripts allow-same-origin allow-forms allow-popups) - Setzt width: 100%, initiale Höhe 400px, keinen Rahmen - Aktiviert die clipboard-write-Berechtigung - Verwendet Lazy Loading - Lauscht auf Enconvert:resize-Nachrichten, um die Höhe automatisch anzupassen

WordPress-Shortcode#

Wenn du das EnConvert-WordPress-Plugin verwendest, bette Widgets mit dem Shortcode ein:

[enconvert_widget id="your-widget-id"]

Stilanpassung#

Passe das Erscheinungsbild des Widgets über Query-Parameter in der Embed-Script-URL oder der iframe-Quelle an:

Parameter CSS-Variable Beschreibung
bg --w-bg Widget-Hintergrundfarbe
text --w-text Textfarbe
btn-bg --w-btn-bg Button-Hintergrundfarbe
btn-text --w-btn-text Button-Textfarbe
border --w-border Rahmenfarbe
radius --w-radius Rahmenradius
input-bg --w-input-bg Eingabefeld-Hintergrund
result-bg --w-result-bg Ergebnisbereich-Hintergrund
error --w-error Fehlertextfarbe
font --w-font Schriftfamilie
padding --w-padding Widget-Padding
max-width --w-max-width Maximale Widget-Breite

Iframe-Kommunikation#

Das Widget kommuniziert mit der übergeordneten Seite über postMessage. Lausche auf der übergeordneten Seite auf diese Events:

Event-Typ Daten Beschreibung
Enconvert:ready keine Widget wurde geladen und ist bereit.
Enconvert:resize { height: number } Die Inhaltshöhe des Widgets hat sich geändert. Zum Anpassen der iframe-Größe verwenden.
Enconvert:conversion:complete { url: string, filename?: string } Konvertierung abgeschlossen. url ist die presigned Download-URL.
Enconvert:conversion:error { error: string } Konvertierung fehlgeschlagen.

Diese vier Event-Namen sind ein eingefrorener Wire-Contract. Übernimm die Groß- und Kleinschreibung exakt.

Beispiel: Auf Events lauschen#

window.addEventListener("message", function(e) {
    if (!e.data || !e.data.type) return;

    if (e.data.type === "Enconvert:conversion:complete") {
        console.log("Conversion done:", e.data.data.url);
    }

    if (e.data.type === "Enconvert:conversion:error") {
        console.error("Conversion failed:", e.data.data.error);
    }
});

Sicherheit#

Ebene Schutz
Domain-Whitelisting Das Widget funktioniert nur auf gelisteten Domains. Unterstützt exakte Übereinstimmungen und Wildcard-Subdomains. Serverseitige Validierung bei der Token-Ausstellung.
Turnstile-Verifizierung Jede initiale Token-Anfrage erfordert eine gültige Cloudflare-Turnstile-Challenge-Antwort.
Endpunkt-Beschränkung Jedes Widget ist über allowed_endpoints im JWT auf einen einzelnen Konvertierungs-Endpunkt festgelegt.
Token-Ablauf Das JWT läuft nach 1 Stunde ab. Das Refresh-Token läuft nach 7 Tagen ab. Beide werden bei Erneuerung rotiert.
Refresh-Token-Sicherheit httpOnly-Cookie mit Secure und SameSite=none, für JavaScript nicht zugänglich, wird nur über HTTPS gesendet.
CORS-Schutz Das API-Gateway validiert bei jeder Anfrage den Origin des Widget-iframes.
CSP frame-ancestors Widget-Konfigurations- und Token-Endpunkte setzen frame-ancestors-Header, die einschränken, welche Domains den iframe einbetten dürfen.
Keine offengelegten Keys Der Embed-Code enthält nur die Widget-ID. Der interne API-Schlüssel ist nie sichtbar.
Niemals einen privaten Schlüssel in eine Seite schreiben. Widgets existieren, damit Browser-Traffic über einen eingeschränkten öffentlichen Schlüssel und ein kurzlebiges JWT läuft. Ein privater sk_-Schlüssel, der aus einem Browser gesendet wird, wird sofort mit HTTP 403 abgelehnt. Siehe Öffentliche Schlüssel und JWT.

Häufig gestellte Fragen#

Wie bette ich ein Datei-Konverter-Widget auf meiner Website ein?#

Erstelle ein Widget im EnConvert-Dashboard (Dashboard > Widgets > Create Widget), und füge dann ein Script-Tag zu deiner Seite hinzu: <script src="https://enconvert.com/embed.js" data-widget-id="your-widget-id"></script>. Läuft deine Site mit WordPress, kannst du stattdessen den [enconvert_widget id="your-widget-id"]-Shortcode aus dem EnConvert-WordPress-Plugin verwenden.

Muss ich einen API-Schlüssel offenlegen, um ein Konvertierungs-Widget einzubetten?#

Nein. Der Embed-Code enthält nur die Widget-ID. Für jedes Widget wird automatisch ein interner öffentlicher API-Schlüssel generiert, beschränkt auf seinen konfigurierten Endpunkt und die erlaubten Domains, und er ist nie in deinem Frontend-Code sichtbar.

Wie authentifiziert das Widget Nutzer ohne API-Schlüssel?#

Das Widget fordert eine unsichtbare Cloudflare-Turnstile-Challenge an und tauscht sie bei POST /v1/widget/{widget_id}/token gegen ein JWT mit 1 Stunde Gültigkeit sowie ein httpOnly-Refresh-Token-Cookie mit 7 Tagen Gültigkeit. Nachfolgende Konvertierungen erneuern das JWT über POST /v1/widget/{widget_id}/refresh ohne neue Challenge, und das Refresh-Token wird bei jeder Erneuerung rotiert.

Kann ich einschränken, welche Domains mein eingebettetes Widget nutzen dürfen?#

Ja. Jedes Widget hat eine Liste erlaubter Domains, die exakte Domains und Wildcard-Subdomains wie *.example.com unterstützt, serverseitig bei der Token-Ausstellung validiert wird und über frame-ancestors-CSP-Header einschränkt, welche Seiten den iframe einbetten dürfen.

Wie entferne ich das „Powered by EnConvert“-Badge vom Widget?#

Das Badge wird durch das Feld widget_branding in deinem Subscription-Plan gesteuert. Nur der kostenlose Founding-Plan zeigt es an. Indie, Studio, Production und Enterprise blenden es alle aus, jeder kostenpflichtige Plan entfernt das Badge also.

Mit welcher Integration fange ich an?#

Schreibst du Code, fang mit einem SDK für deine Sprache an. Automatisierst du ohne Code, nimm n8n. Soll ein KI-Assistent die Arbeit machen, installiere den MCP-Server. Willst du nur, dass deine eigenen Besucher Dateien konvertieren, nimm ein Web-Widget.

Teilen sich die Integrationen einen API-Schlüssel und ein Kontingent?#

Ja. Sie alle authentifizieren sich als dasselbe Projekt, Operationen zählen also gegen ein einziges monatliches Kontingent, egal welche Oberfläche den Aufruf abgesetzt hat. Siehe Rate-Limits und Kontingente.