Developer Tools

Generation API API

The Generation API creates PDFs, social/OG images and charts on the fly and returns them as clean JSON (base64 or a download token).

21 actionsLive JSON1,000 free creditsMCP-ready
Get a free keyOpen in playground

🤖 Using an AI assistant? Copy this link into ChatGPT / Claude / Cursor — it reads every endpoint and parameter instantly and tells you if this API fits your use case.

The primary pdf_render endpoint returns a rendered PDF with filename, content type, byte size and a page hint, and the set also covers PDF from HTML or a URL, OG and template images, charts of many types and batch rendering. It is built for products that need server-side document and image generation without running a headless-browser render farm. One ReefAPI key, one shared credit pool, the standard envelope.

Live example

Real request and response JSON

Captured from the indexed primary action, pdf_render, on .

Captured request
{
  "method": "POST",
  "url": "https://api.reefapi.com/generate/v1/pdf_render",
  "headers": {
    "x-api-key": "$REEF_KEY",
    "content-type": "application/json"
  },
  "body": {
    "template_name": "invoice",
    "data": {
      "company": {
        "name": "Acme"
      },
      "items": [
        {
          "description": "Widget",
          "qty": 2,
          "unit_price": 9.5
        }
      ],
      "subtotal": 19,
      "total": 19
    }
  }
}
Captured response
{
  "ok": true,
  "meta": {
    "api": "generate",
    "endpoint": "pdf_render",
    "mode": "live",
    "latency_ms": 1384.7,
    "record_count": 1,
    "bytes": 9074,
    "cache_hit": false
  },
  "data": {
    "file": {
      "filename": "invoice.pdf",
      "format": "pdf",
      "content_type": "application/pdf",
      "bytes": 9074,
      "source": "template",
      "pages_hint": null,
      "file_b64": "JVBERi0xLjcKJfCflqQKNSAwIG9iago8PC9GaWx0ZXIgL0ZsYXRlRGVjb2RlL0xlbmd0aCA4MDY+PgpzdHJlYW0KeNqtV8uO0zAU3ecr8gPjuU/bVxqNBOIlJEBABQLEYigzbOgCWPD7XCdt3g20g6LWaZycc3yPfZxiDX5coH9lwZCzpSj1dlf9qCAkbXq7k+Zyf1w+wAD1t19+Z7YMbH6ngeZM5YRQo9VvnlZY/65iDpJIBGsyDplz4ljvKiYJqJJFhte/V2+r136cyLEMtquE1J/lrPwfSJbBdpWKBWGK/4FiCWpXJScmyiz/QgHCyMmRm5b9hMFZpVDQ2A5NATQy88SO/vqZHMtgYzvuTbIMNrTj3hRLUGM7/kqBrb9+EiFl8RPqqmQxZPX5IDWLhsRGWvRHDGY50vDy6eiLMCPxc/TLm7+X5ue36uGmwkN29NMJwWUkRNF6s6suX3589Oj9q5piiDECxnpzV326AiC5Bm8kNo1C+ytfw+d687x6vDkyqimtkI+OAHNtPtc4WhzTQse3bRgY28bahppm30etFhqJELQIuRRAEmhRo+CXcF4AC+5/Rq0RUxAAl99Ieffm",
      "delivery": "inline"
    }
  }
}
Actions

What the Generation API API does

ActionDescriptionConcrete use caseKey params
pdf_renderRender a PDF from inline HTML/CSS (Jinja2) or a built-in template_name + data (invoice/receipt/certificate/report). WeasyPrint, fonts pinned, network-off. Output: inline base64 (≤8MB) or one-time download token.Ops teams call pdf_render to render a PDF from inline HTML/CSS (Jinja2) or a built-in template_name + data (invoice/receip….html, template_name, data, paper, filename, ...
pdf_from_htmlShortcut for rendering inline HTML directly to PDF — the same WeasyPrint engine as pdf_render; `html` is required.Developer tools call pdf_from_html to get shortcut for rendering inline HTML directly to PDF.html, data, paper, filename, allow_hosts
pdf_from_urlRender a built-in or inline template to PDF, populating it with data fetched live from a JSON URL you supply. Useful when your invoice or report data lives at a public API endpoint — no manual copy-paste needed.Validation workflows call pdf_from_url to render a built-in or inline template to PDF, populating it with data fetched live from a JSON….data_url, template_name, html, data_path, paper, ...
og_imageRender a social / Open Graph card image (1200×630 default) from a built-in template or an inline layout spec. Supports automatic text-wrap and font scaling for long titles, colour gradients and badge overlays.Data-quality teams call og_image to render a social / Open Graph card image (1200×630 default) from a built-in template or an inl….template_name, layout, vars, width, height, ...
image_from_templateAlias of og_image (explicit Bannerbear 'create image from template' naming). template_name + vars → PNG.Ops teams call image_from_template to get alias of og_image (explicit Bannerbear 'create image from template' naming).template_name, vars, width, height, format, ...
image_from_urlRender an image template with `vars` fetched from a JSON URL (proxy, SSRF-validated). Data-driven banner generation.Developer tools call image_from_url to render an image template with `vars` fetched from a JSON URL (proxy, SSRF-validated).data_url, template_name, layout, data_path, width, ...
chartRender a chart from a Chart.js-style spec — returns a PNG or SVG image. Supported chart types: bar, horizontal_bar, line, area, pie, doughnut, scatter and radar. Powered by a matplotlib backend.Validation workflows call chart to render a chart from a Chart.js-style spec.spec, format, filename
chart_typesList all supported chart types with a description of each. No input required.Data-quality teams call chart_types to list all supported chart types with a description of each.none
batch_pdfRender up to 20 PDFs in one call. `jobs` = array of pdf_render param objects.Ops teams call batch_pdf to render up to 20 PDFs in one call.jobs
batch_imageRender up to 20 images in one call. `jobs` = array of og_image param objects.Developer tools call batch_image to render up to 20 images in one call.jobs
template_listList built-in templates (PDF + image) with their data contracts. Stateless — there is NO stored-template management (create/upload/delete out of scope).Validation workflows call template_list to list built-in templates (PDF + image) with their data contracts.none
validate_htmlLint HTML/CSS for the PDF path WITHOUT rendering: flags remote resources that the SSRF-safe renderer will block, size, and tag-balance hints. Deterministic.Data-quality teams call validate_html to get lint HTML/CSS for the PDF path WITHOUT rendering.html
healthRenderer diagnostics — which backends (WeasyPrint/Pillow/matplotlib) are loadable and their versions. No input.Ops teams call health to get renderer diagnostics.none
qrGenerate a QR code (PNG or SVG) with custom fg/bg color, error-correction, and an OPTIONAL center logo fetched from logo_url (SSRF-guarded, via proxy). Use error_correction=h when embedding a logo so it stays scannable.Developer tools call qr to generate a QR code (PNG or SVG) with custom fg/bg color, error-correction, and an OPTIONAL ce….data, format, error_correction, scale, border, ...
barcodeGenerate a 1D barcode IMAGE (PNG or SVG) from data: EAN-13/8, UPC-A, Code-128, Code-39, ISBN-10/13, ITF, GS1-128, JAN, PZN, Codabar. Check digits are validated — a wrong EAN/UPC/ISBN check digit returns a structured error, not a silent fix.Validation workflows call barcode to generate a 1D barcode IMAGE (PNG or SVG) from data.data, type, format, show_text, module_height, ...
code_imageRender a syntax-highlighted code snippet as a PNG with a carbon/ray.so-style window frame. 500+ languages (Pygments), 40+ themes, optional line numbers.Data-quality teams call code_image to render a syntax-highlighted code snippet as a PNG with a carbon/ray.so-style window frame.code, language, theme, window_style, line_numbers, ...
faviconTurn one source image into a complete favicon bundle: multi-resolution favicon.ico, a named PNG set (16→512 incl. apple-touch-icon + android-chrome), site.webmanifest, and the ready-to-paste <head> <link> snippet. Source from image_url (SSRF-guarded) or a base64 upload.Ops teams call favicon to turn one source image into a complete favicon bundle.image_url, image_base64
vcardBuild a vCard (.vcf) contact file from contact fields (vCard 3.0 or 4.0). Returns the raw.vcf text + a base64 data-URI you can download or encode into a QR.Developer tools call vcard to build a vCard (.vcf) contact file from contact fields (vCard 3.0 or 4.0).full_name, first_name, last_name, organization, title, ...
icalBuild an iCalendar (.ics) event file from event fields (RFC 5545). Supports timed or all-day events, end-time or duration, location, description, organizer. Returns the raw.ics + a base64 data-URI.Validation workflows call ical to build an iCalendar (.ics) event file from event fields (RFC 5545).summary, start, end, duration_minutes, location, ...
wifiGenerate a WiFi-join QR code (PNG/SVG) from network credentials — scan to connect, no typing. Encodes the standard WIFI: payload (WPA/WEP/open, hidden networks).Data-quality teams call wifi to generate a WiFi-join QR code (PNG/SVG) from network credentials.ssid, password, encryption, hidden, format, ...
batchGenerate up to 50 small assets in one request. Items run independently — a bad item yields its own error entry, never fails the batch. NOTE: items that fetch a remote logo_url/image_url ARE supported and SSRF-guarded.Ops teams call batch to generate up to 50 small assets in one request.items
Code samples

Call pdf_render from your stack

curl -X POST https://api.reefapi.com/generate/v1/pdf_render \
  -H "x-api-key: $REEF_KEY" \
  -H "content-type: application/json" \
  -d '{"template_name":"invoice","data":{"company":{"name":"Acme"},"items":[{"description":"Widget","qty":2,"unit_price":9.5}],"subtotal":19,"total":19}}'
MCP one-liner
Ask your MCP-connected assistant: call reefapi.generate.pdf_render with {"template_name":"invoice","data":{"company":{"name":"Acme"},"items":[{"description":"Widget","qty":2,"unit_price":9.5}],"subtotal":19,"total":19}}.
Use cases

Who uses this API and why

  • SaaS products call pdf_from_html to turn invoices, reports and receipts into downloadable PDFs.
  • Marketing tools use og_image and image_from_template to auto-generate share images at scale.
  • Dashboards use chart to render server-side charts for emails and PDFs where JS cannot run.
FAQ

Questions developers ask before integrating

What is the Generation API API?

Generation API API is a ReefAPI endpoint group for generation api It returns live JSON through POST requests under /generate/v1.

Is the Generation API API free to try?

Yes. ReefAPI starts with 1,000 free credits, no card required. Generation API calls use the same shared credit balance as every other ReefAPI engine.

Do I need a Generation API login or account?

No login to Generation API is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.

How fresh is the Generation API data?

The page example is captured from a live pdf_render call, and production requests fetch live data through ReefAPI rather than a static sample.

How many credits does the Generation API API use?

Generation API actions currently cost 1-4 credits per successful call. Failed or blocked calls are free, and all APIs draw from one credit pool.

Can I call Generation API from an AI assistant or MCP client?

Yes. Connect ReefAPI once through MCP and your assistant can call generate actions with the same key, credit pool and JSON envelope used by normal REST requests.

Is the Generation API API a Generation API scraper?

It is the managed alternative to a DIY Generation API scraper. Instead of building and maintaining your own scraper — proxies, headless browsers, captcha and constant breakage — you call one ReefAPI endpoint and get the same generation api back as clean JSON.

Why does my Generation API scraper keep getting blocked?

Most Generation API scrapers break on anti-bot defenses, rate limits and IP bans that need rotating residential proxies and browser fingerprinting to clear. ReefAPI handles all of that for you — no proxies, no captchas, no maintenance — and returns live JSON. Blocked or failed calls are free.

docs / generate

Generation API

Generation API

base /generate/v121 endpoints
post/generate/v1/pdf_render4 credits

Render a PDF from inline HTML/CSS (Jinja2) or a built-in template_name + data (invoice/receipt/certificate/report). WeasyPrint, fonts pinned, network-off. Output: inline base64 (≤8MB) or one-time download token.

ParameterAllowed / rangeDescription
htmloptionalInline HTML/CSS document (Jinja2 syntax allowed; rendered in a SANDBOXED env — no code execution). Mutually exclusive with template_name.
template_nameoptionalinvoice · receipt · certificate · reportBuilt-in PDF template (stateless — lives in engine, not stored). Supply `data` matching its contract (see template_list).
dataoptionalTemplate variables (JSON object) — merged into the template. For built-ins see each template's data_contract.
paperoptionalA4 · A4 landscape · Letter · Letter landscape · A5 · LegalPage size override for built-in templates.
filenameoptionalSuggested download filename.
allow_hostsoptionalComma-separated https hosts whose images/CSS the PDF may fetch (default NONE = network-off, SSRF-safe). Use data: URIs to embed assets without this.
Try in playground →
post/generate/v1/pdf_from_html4 credits

Shortcut for rendering inline HTML directly to PDF — the same WeasyPrint engine as pdf_render; `html` is required.

ParameterAllowed / rangeDescription
htmlrequiredHTML/CSS document to render (Jinja2 allowed, sandboxed).
dataoptionalOptional Jinja2 variables for the HTML.
paperoptionalA4 · A4 landscape · Letter · A5 · LegalPage size (only if your CSS uses {{ paper }}).
filenameoptionalSuggested filename.
allow_hostsoptionalAllowlisted https hosts for remote assets (default none).
Try in playground →
post/generate/v1/pdf_from_url4 credits

Render a built-in or inline template to PDF, populating it with data fetched live from a JSON URL you supply. Useful when your invoice or report data lives at a public API endpoint — no manual copy-paste needed.

ParameterAllowed / rangeDescription
data_urlrequiredhttps URL returning a JSON object used as template `data`.
template_nameoptionalinvoice · receipt · certificate · reportBuilt-in template to fill.
htmloptionalInline HTML template (instead of template_name).
data_pathoptionalOptional dotted path into the fetched JSON to use as data (e.g. 'result.invoice').
paperoptionalA4 · A4 landscape · Letter · A5 · LegalPage size override.
filenameoptionalSuggested filename.
Try in playground →
post/generate/v1/og_image2 credits

Render a social / Open Graph card image (1200×630 default) from a built-in template or an inline layout spec. Supports automatic text-wrap and font scaling for long titles, colour gradients and badge overlays.

ParameterAllowed / rangeDescription
template_name = og_basicoptionalog_basic · og_article · og_quote · og_productBuilt-in card layout. See template_list for each layout's vars.
varsoptionalCard content (JSON): title/subtitle/badge/quote/author/site/name/tagline/cta + colors bg/bg2/fg/accent (hex).
layoutoptionalInline layout override (JSON) — {size:[w,h], ...} for a fully custom card without a built-in template.
width = 1200optional200–4000Canvas width px.
height = 630optional200–4000Canvas height px.
format = pngoptionalpng · jpeg · webpOutput image format.
filenameoptionalSuggested filename.
Try in playground →
post/generate/v1/image_from_template2 credits

Alias of og_image (explicit Bannerbear 'create image from template' naming). template_name + vars → PNG.

ParameterAllowed / rangeDescription
template_namerequiredog_basic · og_article · og_quote · og_productBuilt-in image template.
varsoptionalTemplate variables (see template_list).
width = 1200optional200–4000Canvas width px.
height = 630optional200–4000Canvas height px.
format = pngoptionalpng · jpeg · webpOutput format.
filenameoptionalSuggested filename.
Try in playground →
post/generate/v1/image_from_url2 credits

Render an image template with `vars` fetched from a JSON URL (proxy, SSRF-validated). Data-driven banner generation.

ParameterAllowed / rangeDescription
data_urlrequiredhttps URL returning a JSON object used as card `vars`.
template_name = og_basicoptionalog_basic · og_article · og_quote · og_productBuilt-in template.
layoutoptionalInline layout override (JSON).
data_pathoptionalDotted path into the JSON to use as vars.
width = 1200optional200–4000Canvas width px.
height = 630optional200–4000Canvas height px.
format = pngoptionalpng · jpeg · webpOutput format.
filenameoptionalSuggested filename.
Try in playground →
post/generate/v1/chart1 credit

Render a chart from a Chart.js-style spec — returns a PNG or SVG image. Supported chart types: bar, horizontal_bar, line, area, pie, doughnut, scatter and radar. Powered by a matplotlib backend.

ParameterAllowed / rangeDescription
specrequiredChart spec: {type, data:{labels:[...], datasets:[{label, data:[...], color?}]}, options:{title, x_label, y_label, width, height, legend}}.
format = pngoptionalpng · svgOutput format.
filenameoptionalSuggested filename.
Try in playground →
post/generate/v1/chart_typesfree

List all supported chart types with a description of each. No input required.

Try in playground →
post/generate/v1/batch_pdf4 credits

Render up to 20 PDFs in one call. `jobs` = array of pdf_render param objects.

ParameterAllowed / rangeDescription
jobsrequiredArray of ≤20 pdf_render param objects ({html|template_name, data, ...}).
Try in playground →
post/generate/v1/batch_image2 credits

Render up to 20 images in one call. `jobs` = array of og_image param objects.

ParameterAllowed / rangeDescription
jobsrequiredArray of ≤20 og_image param objects ({template_name|layout, vars, ...}).
Try in playground →
post/generate/v1/template_listfree

List built-in templates (PDF + image) with their data contracts. Stateless — there is NO stored-template management (create/upload/delete out of scope).

Try in playground →
post/generate/v1/validate_htmlfree

Lint HTML/CSS for the PDF path WITHOUT rendering: flags remote resources that the SSRF-safe renderer will block, size, and tag-balance hints. Deterministic.

ParameterAllowed / rangeDescription
htmlrequiredHTML document to lint.
Try in playground →
post/generate/v1/healthfree

Renderer diagnostics — which backends (WeasyPrint/Pillow/matplotlib) are loadable and their versions. No input.

Try in playground →
post/generate/v1/qr1 credit

Generate a QR code (PNG or SVG) with custom fg/bg color, error-correction, and an OPTIONAL center logo fetched from logo_url (SSRF-guarded, via proxy). Use error_correction=h when embedding a logo so it stays scannable.

ParameterAllowed / rangeDescription
datarequiredThe content to encode: a URL, text, vCard string, etc.
format = pngoptionalpng · svgOutput image format. png supports logo-embed + colors; svg is scalable (logo-embed requires png).
error_correction = moptionall · m · q · hRecovery level: l~7% · m~15% · q~25% · h~30%. Use h with a logo.
scale = 8optional1–40Module size in pixels.
border = 4optional0–20Quiet-zone width in modules (spec default 4).
coloroptionalForeground (dark) color: #rrggbb / #rgb / basic CSS name.
backgroundoptionalBackground color, or 'transparent'.
logo_urloptionalURL of a logo to embed in the center (PNG output only). Fetched through the proxy with a full SSRF guard.
logo_size = 0.22optional0.05–0.3Logo size as a fraction of the QR side (0.05–0.30; >0.25 risks unscannable codes even at EC-H).
Try in playground →
post/generate/v1/barcode1 credit

Generate a 1D barcode IMAGE (PNG or SVG) from data: EAN-13/8, UPC-A, Code-128, Code-39, ISBN-10/13, ITF, GS1-128, JAN, PZN, Codabar. Check digits are validated — a wrong EAN/UPC/ISBN check digit returns a structured error, not a silent fix.

ParameterAllowed / rangeDescription
datarequiredThe value to encode. For EAN/UPC supply the digits; the check digit is computed (or validated if you include it).
typerequiredean13 · ean8 · ean14 · upca · code128 · code39 · isbn13 · isbn10 · issn · itf · gs1_128 · jan · pzn · codabarBarcode symbology.
format = pngoptionalpng · svgOutput image format.
show_text = trueoptionalPrint the human-readable value under the bars.
module_height = 15optional2–100Bar height in mm.
coloroptionalBar color (#rrggbb / name).
backgroundoptionalBackground color (#rrggbb / name).
Try in playground →
post/generate/v1/code_image2 credits

Render a syntax-highlighted code snippet as a PNG with a carbon/ray.so-style window frame. 500+ languages (Pygments), 40+ themes, optional line numbers.

ParameterAllowed / rangeDescription
coderequiredThe source code to render.
languageoptionalLanguage for highlighting (python, javascript, go, rust, sql…). Omit to auto-detect.
theme = monokaioptionalabap · algol · algol_nu · arduino · autumn · borland · bw · coffee · colorful · default · dracula · emacs · friendly · friendly_grayscale · fruity · github-dark · gruvbox-dark · gruvbox-light · igor · inkpot · lightbulb · lilypond · lovelace · manni · material · monokai · murphy · native · nord · nord-darker · one-dark · paraiso-dark · paraiso-light · pastie · perldoc · rainbow_dash · rrt · sas · solarized-dark · solarized-light · staroffice · stata-dark · stata-light · tango · trac · vim · vs · xcode · zenburnColor theme (Pygments style).
window_style = darkoptionaldark · darker · light · noneFrame: dark/darker/light window chrome with traffic-light dots, or 'none' for a bare image.
line_numbers = falseoptionalShow line numbers in the gutter.
font_size = 20optional10–48Font size in px.
Try in playground →
post/generate/v1/favicon2 credits

Turn one source image into a complete favicon bundle: multi-resolution favicon.ico, a named PNG set (16→512 incl. apple-touch-icon + android-chrome), site.webmanifest, and the ready-to-paste <head> <link> snippet. Source from image_url (SSRF-guarded) or a base64 upload.

ParameterAllowed / rangeDescription
image_urloptionalURL of the source image (PNG/JPG/etc). Fetched through the proxy with a full SSRF guard. Provide this OR image_base64.
image_base64optionalBase64-encoded source image (data-URI prefix accepted). Use instead of image_url for direct uploads.
Try in playground →
post/generate/v1/vcard1 credit

Build a vCard (.vcf) contact file from contact fields (vCard 3.0 or 4.0). Returns the raw.vcf text + a base64 data-URI you can download or encode into a QR.

ParameterAllowed / rangeDescription
full_nameoptionalFull display name (or supply first_name/last_name).
first_nameoptionalGiven name.
last_nameoptionalFamily name.
organizationoptionalCompany/organization.
titleoptionalJob title.
phoneoptionalPhone number(s) — string or array.
emailoptionalEmail address(es) — string or array.
urloptionalWebsite URL(s) — string or array.
addressoptionalPostal address (single line).
noteoptionalFree-text note.
birthdayoptionalBirthday (YYYY-MM-DD).
version = 3.0optional3.0 · 4.0vCard spec version (3.0 = widest compatibility, 4.0 = modern).
as_qr = falseoptionalAlso return a scannable PNG QR of the vCard (add-to-contacts).
Try in playground →
post/generate/v1/ical1 credit

Build an iCalendar (.ics) event file from event fields (RFC 5545). Supports timed or all-day events, end-time or duration, location, description, organizer. Returns the raw.ics + a base64 data-URI.

ParameterAllowed / rangeDescription
summaryrequiredEvent title.
startrequiredStart: ISO-8601 (2026-07-01T15:00:00+00:00) or YYYY-MM-DD (all-day).
endoptionalEnd time (ISO-8601 or YYYY-MM-DD). Omit to use duration_minutes.
duration_minutes = 0optional0–100000Event length in minutes (used when `end` is absent).
locationoptionalEvent location.
descriptionoptionalEvent details.
urloptionalEvent URL.
organizer_emailoptionalOrganizer email.
uidoptionalStable UID (auto-generated if omitted).
as_qr = falseoptionalAlso return a scannable PNG QR of the event.
Try in playground →
post/generate/v1/wifi1 credit

Generate a WiFi-join QR code (PNG/SVG) from network credentials — scan to connect, no typing. Encodes the standard WIFI: payload (WPA/WEP/open, hidden networks).

ParameterAllowed / rangeDescription
ssidrequiredNetwork name (SSID).
passwordoptionalNetwork password (required unless encryption=nopass).
encryption = WPAoptionalWPA · WEP · nopassSecurity type: WPA (incl. WPA2/WPA3), WEP, or nopass (open network).
hidden = falseoptionalMark the network as hidden (non-broadcast SSID).
format = pngoptionalpng · svgOutput image format.
scale = 8optional1–40Module size in pixels.
error_correction = moptionall · m · q · hQR recovery level.
Try in playground →
post/generate/v1/batch1 credit

Generate up to 50 small assets in one request. Items run independently — a bad item yields its own error entry, never fails the batch. NOTE: items that fetch a remote logo_url/image_url ARE supported and SSRF-guarded.

ParameterAllowed / rangeDescription
itemsrequiredUp to 50 items, each {action, params} where action is qr|barcode|code_image|favicon|vcard|ical|wifi.
Try in playground →