EnConvert API-Endpunkte#
EnConvert hat drei Endpunktgruppen. Perceive liest eine einzelne Webseite, Ingest crawlt eine gesamte Website in Chunks, und Convert verwandelt Dateien und URLs in andere Formate. Sie teilen sich eine Basis-URL, einen API-Schlüssel und ein monatliches Ops-Kontingent, deshalb gilt der Request-Vertrag weiter unten für alle drei.
Perceive#
POST /v2/perceive rendert eine URL einmal in einem Headless-Browser und gibt aus diesem einen Render alles zurück, was du angefordert hast: Markdown, bereinigtes oder rohes HTML, einen Screenshot, ein PDF, das Link- und Bildinventar sowie strukturierte Seitendaten. Insgesamt fünf Routen, darunter ein Batch-Endpunkt, der eine Liste von URLs unter einem gemeinsamen Satz Optionen entgegennimmt, gedeckelt durch das Batch-Limit deines Plans. Siehe Perceive.
Ingest#
POST /v2/ingest crawlt eine Website und schreibt jede Seite in eine einzige JSONL-Datei mit RAG-fertigen Chunks; POST /v2/ingest/files tut dasselbe für Dokumente, die du hochlädst. Ingest ist immer asynchron: Der POST antwortet mit 202 und einer job_id, und du fragst sie entweder ab oder nimmst einen signierten Webhook. Acht Routen, inklusive Rotation des Webhook-Secrets und manueller Neuzustellung. Siehe Ingest.
Convert#
51 Konvertierungs-Endpunkte, alle in der Form POST /v1/convert/<id>, gegliedert in vier Familien: Webseiten, Dokumente, Datenformate und Bilder. Jeder nimmt einen Datei-Upload oder eine URL entgegen und schreibt das Ergebnis in den Speicher. Siehe Convert.
In Entwicklung#
Distill, Lookup, Watch und Discover stehen in privater Beta und werden hier nicht behandelt. Sie sind unter Demnächst beschrieben, zusammen mit der Phase, zu der sie jeweils gehören.
Gemeinsame Request-Parameter#
Alles in diesem Abschnitt gilt über die drei Gruppen hinweg. Was nur für eine einzelne Konvertierung gilt, steht auf der Seite des jeweiligen Endpunkts.
Basis-URL#
https://api.enconvert.com
Jeder Pfad auf dieser Seite ist relativ zu diesem Host. Das Gateway hält eine Anfrage höchstens 300 Sekunden offen; hat bis dahin keine Antwort begonnen, bekommst du 504 mit {"error": "Request timeout"}.
Authentifizierung#
Jede Anfrage trägt einen der beiden Credential-Header. Das Bearer-Token wird zuerst gelesen, der API-Schlüssel als Zweites. Sendest du keinen von beiden, antwortet die API mit 401 und Authentication required.
| Header | Erforderlich | Beschreibung |
|---|---|---|
X-API-Key |
Einer der beiden | Dein API-Schlüssel. Private Schlüssel beginnen mit sk_, öffentliche mit pk_. |
Authorization |
Einer der beiden | Bearer <token>, wobei das Token ein JWT ist, das unter POST /v1/auth/token aus einem öffentlichen Schlüssel erzeugt wird. Zugriffstoken gelten eine Stunde. |
Content-Type |
Ja | application/json für JSON-Bodies, multipart/form-data für Datei-Uploads. |
X-Parent-Origin |
Nur Widgets | Die übergeordnete Domain, die das Widget einbettet, erforderlich für den Token-Austausch mit öffentlichem Schlüssel. |
Origin-Header trägt und dabei einen sk_-Schlüssel vorzeigt, wird mit 403 Private API keys cannot be used from browsers abgelehnt. Tausche in Client-seitigem Code stattdessen einen öffentlichen Schlüssel gegen ein JWT.
Das vollständige Schlüsselmodell, inklusive Domain-Allowlists und Endpunkt-Scopes je Schlüssel, steht unter Authentifizierung.
Content-Types#
Es gibt zwei Request-Formen.
JSON-Body (application/json)
- Jeder
/v2-Endpunkt außerPOST /v2/ingest/files. - Die fünf Endpunkte zur Webseiten-Konvertierung. Ihr Feld
urlnimmt einen URL-String oder ein Array von URL-Strings entgegen.
Multipart-Formular (multipart/form-data)
- Die 46 Endpunkte zur Dateikonvertierung, die den Upload aus einem Feld
filelesen. POST /v2/ingest/files, das eine Liste von Uploads aus einem Feldfilesliest.
Uploads werden anhand der Dateiendung und über eine Magic-Byte-Prüfung der ersten Bytes geprüft. Eine Abweichung mit hoher Konfidenz, etwa eine Datei mit dem Namen .pdf, deren Bytes ein PNG sind, ergibt 400. Textformate wie JSON, CSV, XML, YAML, TOML, Markdown, HTML und SVG tragen keine Byte-Signatur, kommen also durch die Prüfung und scheitern erst später im Konverter, wenn der Inhalt fehlerhaft ist.
Gemeinsame Parameter#
| Parameter | Gilt für | Wirkung |
|---|---|---|
output_filename |
V1-Convert-Endpunkte | Benennt die Ausgabedatei. Ein UTC-Zeitstempel wird immer angehängt: {output_filename}_{YYYYMMDD_HHMMSSmmm}.{ext}. Enthält dein Name bereits die Zielerweiterung, wird sie zuvor entfernt, sodass du nie eine doppelte Erweiterung bekommst. |
direct_download |
Alle V1-Convert-Endpunkte, POST /v2/perceive |
Gibt die Artefakt-Bytes als Response-Body zurück statt eines JSON-Envelopes. Der Standardwert hängt vom Endpunkt ab: true bei Datei-Uploads, false bei den URL-Endpunkten mit privatem Schlüssel. Siehe Signierte URLs. |
async_mode, callback_url, notification_email |
V1-URL-Endpunkte | Stellen die Arbeit in die Warteschlange, statt auf sie zu warten, und melden dir, wenn sie fertig ist. Siehe Synchrone und asynchrone Jobs und Webhooks. |
pdf_options |
Endpunkte, die PDF erzeugen | Seitengröße, Ränder, Ausrichtung, Skalierung, Kopf- und Fußzeile, Graustufen. Die Feldliste steht auf der Seite jedes PDF-Endpunkts. |
Standard-Ausgabenamen, wenn du kein output_filename übergibst:
- Datei-Uploads: abgeleitet vom Eingabe-Dateinamen, aus
report.docxwird alsoreport_20260405_123456789.pdf. - URL-Konvertierungen: abgeleitet vom Domainnamen, also
example_20260405_123456789.pdf. - Fallback:
output_20260405_123456789.{ext}.
Antwort-Envelope#
Eine synchrone V1-Konvertierung antwortet mit 200 und dem Ort der Datei statt mit der Datei selbst:
{
"presigned_url": "https://spaces.example.com/...signed...",
"object_key": "live/files/4127/url-to-pdf/example_20260405_123456789.pdf",
"filename": "example_20260405_123456789.pdf",
"file_size": 48213,
"conversion_time_seconds": 2.41
}
Konvertierungsantworten wiederholen diese Metadaten in Headern:
| Header | Beschreibung |
|---|---|
Content-Disposition |
inline; filename="{filename}" |
X-Object-Key |
Speicherpfad der konvertierten Datei |
X-File-Size |
Größe der konvertierten Datei in Bytes |
X-Conversion-Time |
Für die Konvertierung benötigte Zeit in Sekunden |
X-Filename |
Generierter Dateiname |
V2-Endpunkte geben eigene JSON-Envelopes zurück, dokumentiert auf ihren jeweiligen Seiten, aber jedes gespeicherte Artefakt in diesen Envelopes hat dieselbe Form:
{
"url": "https://spaces.example.com/...signed...",
"object_key": "live/files/4127/v2-perceive/per_3f9a..._markdown.md",
"size_bytes": 8421,
"content_type": "text/markdown; charset=utf-8",
"expires_in": 900
}
Mehr zu Ablauf, Wiederverwendung und Aufbewahrung: Signierte URLs.
Fehler#
Fehlschläge kommen als JSON-Objekt mit einem Feld detail zurück:
{
"detail": "Monthly operations limit reached (500/500). Upgrade your plan to continue."
}
413 Payload Too Large ist die Ausnahme: Sein detail ist ein Objekt mit error, file_size, max_size, tier und key_type. Die Statuscodes und die Meldungen dahinter stehen unter Fehler. Die Plan-Limits, die 402, 413 und 429 auslösen, stehen unter Rate-Limits und Kontingente.
Service-Endpunkte#
| Endpunkt | Methode | Beschreibung |
|---|---|---|
/health |
GET |
Health-Check. Liefert 200, wenn Datenbank, Speicher und Browser alle antworten, und 503, wenn eines davon nicht antwortet. Keine Authentifizierung. |
/v1/whoami |
GET |
Liefert {"project_id": ..., "plan_slug": ...} für den privaten Schlüssel, den du vorzeigst. Ein öffentlicher Schlüssel oder ein JWT bekommt 403. |
Das Erzeugen, Erneuern und Prüfen von Token liegt unter /v1/auth/ und wird unter Authentifizierung behandelt. Die Widget-Config- und Token-Routen liegen unter /v1/widget/ und werden unter Integrationen behandelt.
Häufig gestellte Fragen#
Welche Endpunkte akzeptieren Datei-Uploads?#
Die 46 Endpunkte zur Dateikonvertierung und POST /v2/ingest/files. Sie lesen multipart/form-data. Alles andere nimmt einen JSON-Body entgegen, auch die fünf Endpunkte zur Webseiten-Konvertierung, die einen url-String oder ein Array von URLs akzeptieren.
Verwenden die V2-Endpunkte denselben API-Schlüssel wie die Konvertierungs-Endpunkte?#
Ja. Ein Schlüssel, ein Projekt, ein monatliches Kontingent. Jede Arbeitseinheit kostet eine Op, egal ob es eine Dateikonvertierung, eine per perceive verarbeitete URL oder eine ingestierte Seite ist. Es gibt keine Zähler pro Endpunkt und keine Credit-Multiplikatoren.
Wie prüfe ich, ob die API erreichbar ist?#
Rufe GET /health auf. Der Endpunkt liefert 200, wenn Datenbank, Speicher und Browser alle antworten, und 503, wenn eines davon nicht antwortet, und er braucht keine Authentifizierung.
Wie lange bleiben die Download-URLs gültig?#
15 Minuten. Eine URL lässt sich vor ihrem Ablauf mehrfach verwenden, und ein erneutes Abfragen des Status-Endpunkts eines Jobs liefert eine frisch signierte URL für dieselbe Datei.
Warum liefert eine Konvertierung eine URL statt der Datei?#
Zwei Gründe. Eine große Konvertierung kann 60 bis 120 Sekunden laufen, lang genug, dass ein Reverse Proxy vor deinem Code eine gestreamte Antwort aufgibt, und dasselbe Ergebnis muss oft mehr als einmal abgeholt werden. Also gehen die Bytes in den Speicher, und du bekommst eine signierte URL darauf. Wo dir ein einziger Roundtrip besser passt, liefert direct_download die Bytes inline.