Anwendungsfall
URL zu PDF
Adresse übergeben, Seite als Datei zurückbekommen. Chromium öffnet sie wie ein Browser, führt ihr JavaScript aus, wartet, bis sie geladen ist, und druckt sie mit dem eigenen Print-Stylesheet der Seite oder nimmt sie als Bild in der Fenstergröße auf, die Sie setzen. Die Seite muss öffentlich sein: Was einen Login braucht, senden Sie stattdessen als HTML.
Kostenloser Plan mit 100 Einheiten im Monat, keine Kreditkarte
PDF oder Screenshot
Ohne output ist die Antwort ein PDF. png, jpg und webp nehmen stattdessen das Fenster auf, mit image.fullPage die ganze Länge der Seite oder mit image.clipSelector ein einzelnes Element.
Das Print-CSS der Seite
Ein PDF wird gedruckt, nicht fotografiert: Die @media print-Regeln der Seite gelten, Hintergründe bleiben erhalten, und settings bestimmen Papier, Ränder und eine Kopf- und Fußzeile mit Seitenzahlen.
Seiten, die spät laden
Aufgenommen wird, wenn die Seite geladen, das Netzwerk ruhig und die Schriften bereit sind. waitFor.selector wartet auf ein Element, das Ihr Skript einfügt, und waitFor.delayMs fügt eine feste Pause hinzu.
Jedes Mal ein frischer Browser
Jedes Rendering beginnt ohne Cookies und ohne Speicher und öffnet die Adresse neu. Dieselbe Adresse zweimal sind zwei Renderings, und jedes zeigt die Seite, wie sie in diesem Moment ist.
Leitplanken
Nur öffentliche Adressen über HTTPS. Private, Loopback- und interne Adressen werden abgelehnt, für die Seite und für alles, was sie lädt, und eine Seite, die mit einem HTTP-Fehler antwortet, lässt das Rendering fehlschlagen, statt gedruckt zu werden.
In der EU gerendert
Chromium läuft in Frankfurt: Von dort kommt die Anfrage an die Seite, und die Datei wird in der EU gespeichert.
Eine Webseite mit einer Anfrage drucken
curl -X POST "https://api-eu.formfeed.dev/v1/renders?output=binary" \
-H "Authorization: Bearer $FORMFEED_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url": "https://example.com/", "settings": {"paper": {"format": "A4"}, "margin": {"top": "15mm", "bottom": "15mm"}}}' \
-o page.pdfVollständige Anfrage- und Antwortformate in der Doku.
Was die Seite erfüllen muss
Die Adresse muss über HTTPS aus dem öffentlichen Internet antworten. Private, Loopback- und interne Adressen werden abgelehnt, und auch nichts, was die Seite lädt, ein Bild, ein Skript, eine Schrift, darf von einer solchen Adresse kommen, wohin eine Weiterleitung auch führt. Eine Seite, die mit einem HTTP-Fehler antwortet oder nicht erreichbar ist, lässt das Rendering mit navigation_failed fehlschlagen, und ein fehlgeschlagenes Rendering wird nicht gezählt.
Die Anfrage trägt keine Cookies und keine Header von Ihnen; eine Seite hinter einem Login zeigt dem Renderer also ihr Anmeldeformular. Für eine solche Seite bauen Sie das HTML dort, wo die Sitzung ist, und senden es als html: HTML zu PDF. Eine Website, die automatisierte Browser abweist, antwortet auch dem Renderer mit ihrer Prüfung.
Papier, Ränder und das Print-Stylesheet der Seite
Ein PDF ist die Seite, wie ihr Print-Stylesheet sie setzt, so wie der Druckdialog eines Browsers sie zeigen würde. Papier, Ausrichtung und Ränder kommen aus settings, A4 hochkant, solange Sie nichts anderes sagen, eine Kopf- und eine Fußzeile können sich auf jeder Seite wiederholen, und mit preferCssPageSize entscheidet stattdessen eine @page-Regel der Seite über das Format.
{
"url": "https://example.com/reports/2026-09",
"settings": {
"paper": { "format": "A4", "landscape": true },
"margin": { "top": "15mm", "right": "12mm", "bottom": "18mm", "left": "12mm" },
"footer": {
"height": "10mm",
"html": "<div style=\"width:100%;text-align:center;font-size:8px\"><span class=\"pageNumber\"></span> / <span class=\"totalPages\"></span></div>"
}
}
}Zum Drucken ist die Seite so breit wie das Papier abzüglich seiner Ränder, und A4 hochkant ist 794 CSS-Pixel breit; eine responsive Seite druckt also das Layout, das sie für ein schmales Fenster hat. Querformat oder ein größeres Papier gibt ihr mehr Platz, scale verkleinert oder vergrößert den Inhalt zwischen 0,1 und 2, und pageRanges behält nur die Seiten, die Sie nennen. Kopf- und Fußzeile werden außerhalb der Seite gedruckt und tragen ihre eigenen Inline-Styles.
Ein Screenshot statt eines PDFs
Mit "output": "png", "jpg" oder "webp" wird die Seite nicht gedruckt, sondern so aufgenommen, wie der Bildschirm sie zeigt, mit ihren Bildschirm-Styles. settings.image setzt das Fenster: Breite und Höhe in CSS-Pixeln, 1200 × 630, solange Sie nichts anderes sagen, und deviceScaleFactor, der standardmäßig 2 ist und die Pixel der Datei verdoppelt. fullPage nimmt die ganze Länge der Seite auf, clipSelector ein einzelnes Element, und quality setzt die Kompression von JPG und WebP.
{
"url": "https://example.com/reports/2026-09",
"output": "png",
"settings": {
"image": { "width": 1440, "height": 900, "deviceScaleFactor": 1, "fullPage": true }
}
}Für das Vorschaubild einer eigenen Seite ist eine Vorlage die bessere Quelle als ein Screenshot: Open-Graph-Bild-API.
Seiten, die spät fertig werden
Eine Seite, die sich mit JavaScript selbst aufbaut, wird aufgenommen, wenn sie fertig ist, nicht wenn ihr erstes Byte ankommt: Der Renderer wartet auf das Load-Ereignis, auf Ruhe im Netzwerk und auf die Schriften. Wo das nicht reicht, wartet waitFor.selector auf ein Element, fünf Sekunden, solange waitFor.timeoutMs nichts anderes sagt, und waitFor.delayMs fügt eine Pause von bis zu zehn Sekunden hinzu. Eine Seite, die eine Verbindung offen hält, wird nie ruhig: waitFor.networkIdle: false nimmt sie direkt nach dem Load-Ereignis auf.
Eine Seite hat 30 Sekunden zum Laden. Eine Anfrage, auf die niemand warten soll, geht mit "mode": "async" hinaus und meldet sich per Webhook, und eine Liste von Adressen ist ein Batch: bis zu 1.000 Seiten in einer Anfrage.
Jede Anfrage lädt die Seite neu
Ein Live-Rendering aus einer Vorlage wird aus der gespeicherten Datei beantwortet, wenn die identische Anfrage innerhalb von 24 Stunden noch einmal kommt. Bei einer URL ist das anders: Die Seite dahinter kann sich geändert haben, ein URL-Rendering wird deshalb nie aus einem früheren beantwortet. Jede Anfrage öffnet die Seite, zeigt sie, wie sie in diesem Moment ist, und zählt als Rendering. Damit eine Wiederholung sicher ist, senden Sie einen Idempotency-Key: Sobald die erste Anfrage beantwortet ist, liefert derselbe Schlüssel 24 Stunden lang diese Antwort, und nichts wird doppelt gerendert.
Jedes Rendering beginnt in einem frischen Browser ohne Cookies und ohne Speicher, mit der Sprache en-GB und der Zeitzone Europe/Berlin, solange settings.locale und settings.timezone keine anderen nennen. Eine Seite, die einen ersten Besuch mit einem Consent-Banner begrüßt, zeigt es in der Aufnahme; im PDF fehlt es nur, wo das Print-Stylesheet der Seite es ausblendet, und image.clipSelector nimmt ein Element statt des Fensters auf. Die Seite, ihre Stylesheets und ihre Skripte werden jedes Mal neu geladen; ihre Bilder und Schriften können aus dem Cache des Renderers kommen, der eine Datei unter ihrer Adresse bis zu eine Woche behält.
Wenn die Seite Ihre eigene ist
Eine Adresse zu drucken, ist der kurze Weg für eine Seite, die es ohnehin gibt. Ist die Seite Ihre eigene und existiert nur, um ein PDF zu werden, eine Quittung, ein Bericht, ein Ticket, dann ist das Layout als Vorlage besser aufgehoben: Die Anfrage trägt die Daten statt einer Adresse, nichts muss aus dem Internet erreichbar sein, eine identische Live-Anfrage innerhalb von 24 Stunden kostet beim zweiten Mal nichts, und der Editor zeigt die Seiten, bevor etwas gesendet wird. HTML, das Ihr Server ohnehin rendert, kann so, wie es ist, als html kommen.
Was eine Seite kostet
Ein PDF mit bis zu fünf Seiten ist eine Einheit, und jede weiteren fünf Seiten kosten eine mehr; ein Screenshot ist eine Einheit. Der Free-Plan hat 100 Einheiten im Monat und verlangt keine Kreditkarte, und seine PDFs dürfen bis zu 20 Seiten haben. Starter hat 3.000 Einheiten für 19 € im Monat und druckt bis zu 200 Seiten. Renderings mit einem Test-Schlüssel kosten nichts, und ein fehlgeschlagenes Rendering wird nie gezählt. Alle Pläne stehen auf der Preisseite.
FAQ
- Gehen auch Seiten hinter einem Login?
- Nein. Die Anfrage trägt keine Cookies und keine Header von Ihnen; der Renderer sieht also, was ein Besucher ohne Konto sieht. Rendern Sie eine solche Seite dort, wo die Sitzung ist, und senden Sie das Ergebnis als
html. - Wird aus der EU gerendert?
- Ja. Chromium läuft in Frankfurt, und die Datei wird in der EU gespeichert.
- Warum sieht das PDF anders aus als die Seite in meinem Browser?
- Ein PDF verwendet das Print-Stylesheet der Seite und die Breite des Papiers, wie der Druckdialog eines Browsers. Für die Seite, wie der Bildschirm sie zeigt, fordern Sie
png,jpgoderwebpan. - Lässt sich die ganze Seite als ein Bild aufnehmen?
- Ja:
image.fullPagenimmt die ganze Länge der Seite auf, undimage.clipSelectorein einzelnes Element. - Wird dieselbe URL jedes Mal neu gerendert?
- Ja. Ein URL-Rendering wird nie aus einem früheren Ergebnis beantwortet, weil sich die Seite geändert haben kann; jede Anfrage lädt sie und zählt.
- Wie lange bleibt die Datei erhalten?
- Für die Aufbewahrung Ihres Plans, einen Tag im Free-Plan, 30 Tage bei Starter und 365 Tage bei Pro, oder kürzer mit
expires_in. Download-Links sind signiert; holen Sie die Datei ab und speichern Sie sie selbst, wenn Sie sie länger brauchen.