Charts, OG cards and PDFs without hosting a renderer
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 active endpoints, on 0, 1, 2 and 4 credit tiers.
- POST/generate/v1/pdf_render
- POST/generate/v1/pdf_from_html
- POST/generate/v1/pdf_from_url
- POST/generate/v1/og_image
- POST/generate/v1/image_from_template
- POST/generate/v1/image_from_url
- POST/generate/v1/chart
- +14 more
What Generation endpoints does ReefAPI ship?
21 live read endpoints. Read-only data API: no writes, no account actions, no dashboard access on the target site.
Generation API
3 of 21 endpoints, ready to run
A chart image from a JSON spec — labels, datasets and type in, a rendered file out.
{ "ok": true, "meta": { "api": "generate", "endpoint": "chart", "mode": "live", "latency_ms": 182.5, "record_count": 1, "cache_hit": false }, "data": { "file": { "filename": "chart.png", "format": "png", "content_type": "image/png", "bytes": 9337, "chart_type": "bar", "file_b64": "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FgAAQDJhAQAAJBMWAABAMmEBAAAkExYAAEAyYQEAACQTFgAAQDJhAQAAJBMWAABAMmEBAAAkExYAAEAyYQEAACQTFgAAQDJhAQAAJBMWAABAMmEBAAAkExYAAEAyYQEAACQTFgAAQDJhAQAAJBMWAABAsja7clBNTU0sXbo0evbsGfvtt99217z55puxZcuW6NatW7Ru3brRx1u9enW89dZb9Qdr0yaOOeaYXRkPAADYzZoUFn/4wx/iX//1X+OBBx6It99+O+666644//zz6635t3/7t5g8eXJs2rQpWrduHbW1tTFt2rQ455xzGnzcGTNmxA033BCHH354bl/Hjh1jzpw5TXw5AABAITQpLF588cXo379/TJ06NTp27LjdNcuWLYvHH388Dj300IiI+PGPfxxjx46No446Ko444ogGH/vII4+M5557rinjAAAALUSTrrEYNWpUXHrppdGhQ4cG10yePDkXFRERl112WbRq1SqeffbZRh+7rq4ulixZEitWrIhsNtuUsQAAgAJr9ou3X3vttdi8eXP06NGj0XXz5s2LL3/5yzFo0KA46KCD4j/+4z+aezQAACBPduni7Z21adOmGDduXBx33HExdOjQBtf1798/lixZEuXl5ZHNZuNf/uVf4txzz42ePXvGoEGDtntMbW1t1NbW5rZramryPj8AALBzmu2MxZYtW2LMmDGxdu3auO+++6JVq4afavjw4VFeXh4REUVFRTFhwoTo1atX3HPPPQ0eU1lZGSUlJblbWVlZ3l8DAACwc5olLLZs2RJnn312vPrqqzFnzpw4+OCDm/wYBx10ULz55psN3l9RURHV1dW5W1VVVcrIAABAgryHxUcffRTnnHNOLFy4MObOnRvdunXbZs2qVati4cKFue1NmzbVu/+9996Ll156Kfr27dvg82QymSguLq53AwAACqNJ11h88MEHsWTJktz2G2+8Eb/73e/igAMOiO7du0dExHnnnRePPfZY3HHHHbFmzZpYs2ZNRESUlpZGaWlpRETccsstMW3atFi/fn1ERJx88skxZsyY6N+/f6xduzZuuOGGKCkpicsuuywfrxEAAGhmRdkmfLfrCy+8sN0/9s8888y47rrrIiLipJNOqndR9cfGjx8f48ePj4g/hcUvfvGL3A/gvfvuuzFt2rR4/vnno3379nHsscfGlVde2eBv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lJeX53s8AACgGeT9o1AbNmzY4ZqJEyfGxIkTc9vHHXdczJ49O9+jAAAAu0mzf90sAADwyScsAACAZMICAABIJiwAAIBkwgIAAEgmLAAAgGTCAgAASCYsAACAZMICAABIJiwAAIBkwgIAAEgmLAAAgGTCAgAASCYsAACAZMICAABIJiwAAIBkwgIAAEgmLAAAgGTCAgAASCYsAACAZMICAABIJiwAAIBkwgIAAEgmLAAAgGTCAgAASCYsAACAZMICAABIJiwAAIBkwgIAAEgmLAAAgGTCAgAASCYsAACAZMICAABIJiwAAIBkwgIAAEgmLAAAgGTCAgAASCYsAACAZMICAABIJiwAAIBkwgIAAEgmLAAAgGTCAgAASCYsAACAZG2a40E3b94cDz30UKxYsSJ69+4dp512WrRu3TrvxwAAAC1D3sOipqYmTj755Ni4cWN8/vOfj5tuuil69uwZjzzySGQymbwdAwAAtBx5D4vKysp477334uWXX47i4uJYtWpV9OvXL372s5/FFVdckbdjAACAliPv11jce++9MWbMmCguLo6IiNLS0jj99NPj3nvvzesxAABAy5HXMxabN2+O119/Pfr06VNvf58+feLRRx/N2zEREbW1tVFbW5vbrq6ujog/fayqkOpq/1jQ54fdrdDvuVTes+xt9uT3rPcre6NCv2c/fv5sNrvDtXkNiw8//DCy2WyUlJTU29+pU6fYsGFD3o6J+NPHpyZNmrTN/rKysl2YHNhVJdMKPQHQFN6zsGdpKe/ZDz74YJu/1/9aXsOiffv2EbFtWVVXV8enPvWpvB0TEVFRURFXX311bruuri7ee++96NKlSxQVFe3S/Oy5ampqoqysLKqqqnIfqQNaJu9X2LN4z+7dstlsfPDBB1FaWrrDtXkNi0wmE927d49ly5bV279s2bIoLy/P2zEfH/fX3xjVqVOnXRucT4zi4mL/pwd7CO9X2LN4z+69dnSm4mN5v3j7rLPOinvvvTc2btwYERHr1q2LBx98MEaOHJlb8/TTT8e0adOadAwAANByFWV35kqMJli3bl2ceOKJ0bFjxxg6dGg8+OCD0aFDh5g7d27uY0/f/e53Y9q0abF+/fqdPgYaU1NTEyUlJVFdXe1fU6CF836FPYv3LDsr779j0aVLl5g/f37MmjUrVq5cGd/61rdi9OjR9T62NHjw4HrXQezMMdCYTCYT3/nOd/xvBvYA3q+wZ/GeZWfl/YwFAACw98n7NRYAAMDeR1gAAADJhAUAAJBMWAAAAMmEBQDAXmzt2rUxf/783O+Jwa4SFrRY69ati9WrVxd6DGAnVVVVxcSJE+P888+Pe+65p9DjADvwzDPPxJAhQ+KYY46Ja6+9Np544olCj8QeTljQIi1ZsiTKy8tj4MCB8T//8z+FHgdoRHV1dXzjG9+IAQMGxLvvvhvZbDb+9m//Nh544IFCjwY04Ec/+lGMGjUqLr/88qiqqoonnngiRowYUeix2MMJC1qkfffdN9577704/fTT45RTTolbbrml0CMB2zFr1qzo06dPbNiwIRYtWhTTp0+Pu+++O0455ZR48MEHCz0esB3PPPNMVFRUxJw5c2LMmDH1frQYUggLWqRu3bpFu3btYty4cTFz5sz4xje+EZdeemls3ry50KMBf2HLli3xzjvvxNixY2P//fePiIi6urrYsGFDDBkyJOrq6go8IfDXbr755hg5cmQcfvjhhR6FTxhhQYtUVFQU5eXlsXTp0hg5cmTMmzcvnnrqqTjllFPi7bffLvR4wJ+dd955ccIJJ8SVV14ZdXV18cYbb8Rpp50Wr776alxxxRXRpUuXmDVrVqHHBP7C4sWL48ADDyz0GHwCCQtarD59+sTSpUsjIqJ3795xySWXxLPPPhsDBw6M559/vsDTARF/+keAm266KRYsWBBf+cpXYtCgQTF48OBYvXp1vPPOO3HGGWfEBRdcEK+//nqhRwX+7IADDoh58+Y1umbr1q27aRo+SYQFLdbHYfHUU0/FoEGD4r777ot58+bFBRdcEEOGDIkZM2YUekQgIj772c/GBRdcEI888kg8/fTT8e1vfztKSkqibdu2MXXq1Ni6dWs88sgjhR4T+LMRI0bEf//3f8f8+fO3e39dXV2cccYZPn5MkwkLWqw+ffrEAw88EOeee25cc8018fTTT8egQYOisrIyJk+eHNdff30sW7as0GMCEVFZWRnt27eP22+/vd7+1q1bR0TEIYccUoCpgO255JJLoqysLC6++OLYsGFDvfs++uijuPzyy6O0tDT22WefAk3Inqoom81mCz0EbM/8+fPjuOOOi3Xr1kVJSck292/dujX3RwtQeDfccEN85zvfiddeey169eoVq1evjvPOOy8ymUzMnj07WrXyb1nQUjzzzDPxpS99KcrLy6OysjL69u0bL7/8cvzzP/9zHHLIIXHHHXdE+/btCz0mexhhQYu1YcOG6NixY8yfPz8GDBhQ6HGAHaitrY1+/frFEUccESeddFJMmTIl/v7v/z4mTpzoXz6hBXrllVdiwoQJ8eSTT8ZHH30UgwYNissuuyzGjh1b6NHYQ7Up9ADQkA4dOkRpaWk8++yzwgL2AJlMJqZMmRIjR46M1q1bx/PPPx89e/Ys9FhAA4466qiYPXt2fPxvzH7PglTCghZtyJAhceihhxZ6DGAnnXXWWTFv3rwYNGhQoUcBdpKgIF98FAoAAEjmSjoAACCZsAAAAJIJCwAAIJmwAAAAkgkLAAAgmbAAAACSCQsAACCZsAAAAJIJCwAAIJmwAAAAkgkLAAAgmbAAAACS/R9sJzHblsZMJAAAAABJRU5ErkJggg==", "delivery": "inline" } } }
How the Generation API works
Generation is a normal ReefAPI surface — the same four rules that hold for every other engine on the key.
No OAuth app, no request signing, no per-site account. One key covers all 184 engines.
Every route is a POST with a JSON body. Parameters are validated against the published schema before anything is charged.
Credits, not seats. Failed and blocked calls are never charged, and cache hits cost nothing.
One envelope everywhere. meta carries latency_ms, record_count and the endpoint that answered.
Giving every page a social card without a rendering service
Per-page OG images are the standard reason teams end up running a headless browser in production — an entire moving part maintained for one image per page.
{"template_name": "og_basic", "vars": {"title": "Launch day"}}Returned a finished PNG at social dimensions in well under a tenth of a second.
{"spec": {"type": "bar", "data": {…}}}The same shape for charts. A JSON spec in, a rendered image out, with the chart type echoed back.
Files come back inline as base64 with their content type, byte size and filename, so they can be written to storage or returned straight to a browser without a second round-trip.
curl -X POST https://api.reefapi.com/generate/v1/chart \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"spec":{"type":"bar","data":{"labels":["A","B","C"],"datasets":[{"label":"x","data":[1,2,3]}]}}}'{
"ok": true,
"data": { … },
"meta": {
"api": "generate",
"endpoint": "chart",
"mode": "live",
"latency_ms": …,
"record_count": …
},
"error": null
}What comes back, and what gets rejected
Every action here is deterministic: the same input renders the same bytes. That also means the input checks are strict rather than forgiving, so knowing which mistakes are rejected outright saves a debugging session. All figures measured on 2026-08-27.
| Action | What you get back | Measured |
|---|---|---|
| pdf_render, pdf_from_html | file{file_b64, bytes, content_type, filename, delivery} | The built-in invoice template rendered to 9,075 bytes, delivery 'inline' |
| og_image | 1200x630 PNG by default, width and height overridable to 4000 | og_basic with a title and subtitle = 15,605 bytes |
| chart | PNG or SVG from a Chart.js-shaped spec, 8 chart types only | type 'violin' returned INVALID_PARAM listing bar, horizontal_bar, line, area, pie, doughnut, scatter, radar |
| barcode | Check digit computed or validated, never silently corrected | 5901234123456 returned INVALID_PARAM with detail.valid_code 5901234123457 |
| qr | png_base64 plus version, designator, modules and is_micro | A short URL at error correction m = version 2, designator 2-M, 25 modules |
| vcard, ical | Raw file text plus a data_uri, and a QR of it if as_qr is set | vCard 3.0 = 134 bytes, field_count 4; iCal uid is [email protected] |
| Remote images or CSS | Blocked at render unless the host is in allow_hosts | A PDF referencing one remote image returned INVALID_PARAM naming the blocked URL |
| validate_html | Lints without rendering, flags what the renderer will block | valid false, remote_resources listing both blocked URLs, tags_open 3 vs tags_close 1 |
| batch, batch_pdf, batch_image | Up to 50 small assets or 20 documents, per-item errors | 3 items returned count 3, ok_count 2, the bad barcode carrying its own error |
| template_list | The complete set of built-ins with a data_contract for each | 4 PDF templates, 4 image templates, and no stored-template CRUD |
code_image language auto-detection is unreliable, so pass `language` explicitly. Left to guess, a two-line Python function was labelled 'Tera Term macro' and a one-line SQL SELECT was labelled 'Text only'. Passing language 'python' for the same snippet returned language 'Python' and a correctly highlighted 7,095-byte PNG.
What renders, how fast, and where the line is
Measured across chart, image and PDF generation.
A chart rendered in about a sixth of a second and a social card in under a tenth. That is the difference between generating on demand and building a queue with a cache in front of it — at these times the queue is the more expensive design.
You send a specification — type, labels, datasets — rather than instructions for drawing. The supported chart types are their own endpoint with a description of each, so the available set is discoverable rather than something to find out by trying.
Each response carries the filename, the format, the content type, the byte size and the encoded file. Nothing has to be inferred from the bytes, and nothing needs a second call to find out what you received.
Either send markup or point it at a page. The URL path is the one that saves the most work, because it removes the step where you assemble a self-contained HTML document with its styles inlined.
Social cards are rendered from named templates with variables substituted. That is what makes them fast and predictable, and it means an arbitrary bespoke layout is not what this endpoint is for. Charts have the same shape of limit: a defined set of types rendered well, not an open drawing surface.
What people build with Generation
The jobs this data is most often used for.
endpoints
credits per call
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.
What Generation data costs
The cheapest call here is 0 credits, so $15/mo (Pro) buys 10,000 of them — $1.50 per 1,000 credits. Credits roll over and never expire, and failed or blocked calls are not charged.
Full pricing →- 1,000 free credits on signup, no card
- One key, all 184 APIs, one credit pool
- Failed and blocked calls are never charged
- Credits roll over and never expire
Call it in two lines
Sign up, get 1,000 credits and one key that works on every engine. Then this is the whole protocol.
curl -X POST https://api.reefapi.com/generate/v1/chart \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"spec":{"type":"bar","data":{"labels":["A","B","C"],"datasets":[{"label":"x","data":[1,2,3]}]}}}'import requests
r = requests.post(
"https://api.reefapi.com/generate/v1/chart",
headers={"x-api-key": REEF_KEY},
json={
"spec": {
"type": "bar",
"data": {
"labels": [
"A",
"B",
"C"
],
"datasets": [
{
"label": "x",
"data": [
1,
2,
3
]
}
]
}
}
},
)
print(r.json()["data"])Have a question? We got answers.
The questions people actually ask before wiring up Generation.
Get a free key →Is this a text or AI generation endpoint?▾
No. Despite the name, nothing here is model-backed and no prompt is involved. It renders files from structured input: HTML and template data to PDF, a card spec to PNG, a data series to a chart, a string to a QR or barcode, contact fields to .vcf and event fields to .ics. The same input renders the same bytes every time, and a health call reports the concrete renderers in use with their versions.
How does the file reach me?▾
Base64 in the response body. The PDF and image actions wrap it in a file object carrying file_b64, bytes, content_type, filename and a delivery field that read 'inline' on every render measured. QR, barcode, code_image and wifi return png_base64 plus a ready-to-use data_uri instead. vCard and iCal return the raw file text as well, so you can inspect a .vcf or .ics without decoding anything.
What happens if my EAN or UPC check digit is wrong?▾
It is rejected with the correct code in the error, not silently fixed. Sending 5901234123456 as an ean13 returned INVALID_PARAM with the message that the last digit is a computed checksum and detail.valid_code set to 5901234123457. Sending too few digits fails differently, with a message stating EAN must have 12 digits and how many arrived. Supply the 12 data digits and let the engine compute the thirteenth if you would rather not do the arithmetic.
Can my PDF or card pull in a logo from my CDN?▾
Only if you allow that host explicitly. By default the renderer runs with no outbound network at all, and HTML referencing a remote image returned INVALID_PARAM naming the blocked URL and suggesting a data: URI. Pass allow_hosts with a comma-separated list of https hosts to open specific ones. For a single logo, embedding it as a data: URI is usually simpler and makes the render fully reproducible. Run validate_html first if you want the list of resources that would be blocked before you spend a render.
Can I upload and store my own templates?▾
No, and that is deliberate. The engine is stateless: there is no create, upload, list-mine or delete. template_list returns the four built-in PDF templates (invoice, receipt, certificate, report) and the four card layouts (og_basic, og_article, og_quote, og_product), each with a data_contract naming the exact keys it expects. To go beyond them, send inline `html` for PDFs or an inline `layout` object for images on each request. Your template lives in your repo, not in ours.
What does validate_html tell me that a failed render would not?▾
It tells you before you spend the render, and it separates two different problems. Linting a small snippet returned valid false, a remote_resources array with both offending URLs, an issues array explaining that each will be blocked by the renderer, and tags_open 3 against tags_close 1. Note that self-closing tags count toward tags_open, so a mismatch there is a hint to check your markup rather than proof of a bug.
One item in my batch is broken. Does the whole call fail?▾
No. Items run independently and a bad one produces its own error entry. A three-item batch with a valid QR, an invalid barcode and a valid wifi code returned ok:true at the top with count 3 and ok_count 2, the barcode row carrying an inline INVALID_PARAM. batch takes up to 50 small assets across qr, barcode, code_image, favicon, vcard, ical and wifi; batch_pdf and batch_image take up to 20 documents each. Always read ok_count.
Why does a QR response report a version and a module count?▾
Because they decide how large the code must be printed to stay scannable. A short URL at error correction m came back as version 2, designator 2-M and 25 modules across. More data or a higher error-correction level pushes the version up and the modules with it. If you are embedding a center logo, use error_correction 'h' and keep logo_size at or below 0.25: the parameter accepts up to 0.30, and past 0.25 the code can stop scanning even at the highest recovery level.
What is the Generation API?▾
Generation API is a ReefAPI endpoint group for generation It returns live JSON through POST requests under /generate/v1.
Is the Generation API free to try?▾
Yes. ReefAPI starts with 1,000 free credits, no card required. Generation calls use the same shared credit balance as every other ReefAPI engine.
Do I need a Generation login or account?▾
No login to Generation 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 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 use?▾
Generation 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 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.
18 Developer Tools APIs on the same key
One key, one credit pool, one response envelope. If you are pulling Generation, you are one call away from the rest of the category — no second contract, no second integration.
Need something this API does not do?
Name the endpoint, the field, or a source we do not carry yet. We ship new APIs every week and you would be first to get the key. Real people read every message and reply the same day.
Try it on your own data before you pay anything
The call above is the real endpoint, not a recording. A free key gives you 1,000 credits, the other 183 APIs, and the same envelope everywhere.
Endpoints, parameters and credit costs on this page are read from the live catalog and cannot drift from what the API accepts. Field notes were captured on 2026-08-30.