Integrationen#
Dieselbe API, erreichbar aus den Tools, die du ohnehin nutzt. Ein MCP-Server bringt EnConvert in einen Coding-Agenten, ein ClawHub-Skill in OpenClaw, ein n8n Node und eine Zapier-Integration in deine Automatisierungen, ein Dify-Plugin in deine Agenten und Workflows, 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. |
| ClawHub | enconvert |
Du betreibst OpenClaw und willst dieselben Lese- und Konvertierungswerkzeuge einmalig als Skill installieren, den dein Agent im Chat aufrufen kann. |
| n8n | @enconvert/n8n-nodes-enconvert |
Du baust einen n8n-Workflow und willst Konvertierungen, Scraping und Crawling als Node, der echte Binary Data ausgibt. |
| Zapier | EnConvert (nur auf Einladung) | Du verdrahtest Apps in einem Zap und willst Konvertierungen, Seiten-Renderings, Crawls und Änderungsüberwachung als Actions, Searches und Trigger. |
| Dify | enconvert |
Du baust einen Agenten oder einen Workflow in Dify und willst Seiten-Rendering, Websuche, strukturierte Extraktion und Dateikonvertierung als Tools darin. |
| 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 achte 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:
- URL-basiert: url-to-pdf, url-to-screenshot
- Datei-basiert: Alle Endpunkte für Datenformate, Dokument zu PDF und Bildkonvertierung
So funktionieren Widgets#
Einrichtung#
- Gehe zu deinem EnConvert-Dashboard > Widgets und klicke auf Create Widget.
- 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). - 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#
- Widget lädt im iframe und ruft seine Konfiguration von
GET /v1/widget/{widget_id}/configab. - 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). - Nutzer übermittelt eine URL oder Datei: Das Widget fordert ein unsichtbares Turnstile-Challenge-Token an.
- Token-Austausch: Das Widget sendet das Turnstile-Token an
POST /v1/widget/{widget_id}/tokenund erhält ein JWT (1 Stunde gültig) sowie ein Refresh-Token-Cookie (7 Tage gültig). - Konvertierung: Das Widget ruft den Konvertierungs-Endpunkt mit dem JWT auf.
- Ergebnis: Die API liefert eine JSON-Antwort mit einer
presigned_url. Das Widget zeigt einen Download-Link an. - 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}/refreshmithilfe 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.
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). |
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. |
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 oder Zapier. Baust du einen Agenten oder einen Workflow in Dify, installiere das Dify-Plugin. Soll ein KI-Assistent die Arbeit machen, installiere den MCP-Server, oder den ClawHub-Skill, wenn du OpenClaw betreibst. 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.