Generation API

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).

no credit card1,000 free credits · instant API key · live in 10 seconds
Missing a Generation endpoint, or need a source we don't have yet?Contact us real people · same-day reply.
G
/generate/v1

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.

21 endpoints

pdf_render

4 cr

Render a PDF from inline HTML/CSS (Jinja2) or a built-in template_name + data (invoice/receip…

required
optional
html, template_name, data, paper, filename, allow_hosts

pdf_from_html

4 cr

Shortcut for rendering inline HTML directly to PDF.

required
html
optional
data, paper, filename, allow_hosts

pdf_from_url

4 cr

Render a built-in or inline template to PDF, populating it with data fetched live from a JSON…

required
data_url
optional
template_name, html, data_path, paper, filename

og_image

2 cr

Render a social / Open Graph card image (1200×630 default) from a built-in template or an inl…

required
optional
template_name, layout, vars, width, height, format, filename

image_from_template

2 cr

Alias of og_image (explicit Bannerbear 'create image from template' naming).

required
template_name
optional
vars, width, height, format, filename

image_from_url

2 cr

Render an image template with vars fetched from a JSON URL (proxy, SSRF-validated).

required
data_url
optional
template_name, layout, data_path, width, height, format, filename

chart

1 cr

Render a chart from a Chart.js-style spec.

required
spec
optional
format, filename

chart_types

0 cr

List all supported chart types with a description of each.

required
optional

batch_pdf

4 cr

Render up to 20 PDFs in one call.

required
jobs
optional

batch_image

2 cr

Render up to 20 images in one call.

required
jobs
optional

template_list

0 cr

List built-in templates (PDF + image) with their data contracts.

required
optional

validate_html

0 cr

Lint HTML/CSS for the PDF path WITHOUT rendering.

required
html
optional

health

0 cr

Renderer diagnostics.

required
optional

qr

1 cr

Generate a QR code (PNG or SVG) with custom fg/bg color, error-correction, and an OPTIONAL ce…

required
data
optional
format, error_correction, scale, border, color, background, logo_url, logo_size

barcode

1 cr

Generate a 1D barcode IMAGE (PNG or SVG) from data.

required
data, type
optional
format, show_text, module_height, color, background

code_image

2 cr

Render a syntax-highlighted code snippet as a PNG with a carbon/ray.so-style window frame.

required
code
optional
language, theme, window_style, line_numbers, font_size

favicon

2 cr

Turn one source image into a complete favicon bundle.

required
optional
image_url, image_base64

vcard

1 cr

Build a vCard (.vcf) contact file from contact fields (vCard 3.0 or 4.0).

required
optional
full_name, first_name, last_name, organization, title, phone, email, url, address, note, birthday, version, as_qr

ical

1 cr

Build an iCalendar (.ics) event file from event fields (RFC 5545).

required
summary, start
optional
end, duration_minutes, location, description, url, organizer_email, uid, as_qr

wifi

1 cr

Generate a WiFi-join QR code (PNG/SVG) from network credentials.

required
ssid
optional
password, encryption, hidden, format, scale, error_correction

batch

1 cr

Generate up to 50 small assets in one request.

required
items
optional

Every parameter, every allowed value →

Generation API

3 of 21 endpoints, ready to run

View docs ↗

A chart image from a JSON spec — labels, datasets and type in, a rendered file out.

1 credit1 required · 2 optional
POST/generate/v1/chart
ok183 ms · 1 records · sample
{
  "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/vnno3379nHsscfGlVde2eBvZWxPTU1NlJSURHV1tbMXwE7rMWF2oUeA3Wr5DcMLPQKwB2nK39hNCouWTFgAu0JYsLcRFkBTNOVv7Gb/HQsAAOCTT1gAAADJhAUAAJBMWAAAAMmEBQAAkKxJv2PBjvmGGfY2vmEGAIhwxgIAAMgDYQEAACQTFgAAQDJhAQAAJBMWAABAMmEBAAAkExYAAEAyYQEAACQTFgAAQDJhAQAAJBMWAABAMmEBAAAkExYAAEAyYQEAACQTFgAAQDJhAQAAJBMWAABAMmEBAAAkExYAAEAyYQEAACQTFgAAQDJhAQAAJBMWAABAMmEBAAAkExYAAEAyYQEAACQTFgAAQDJhAQAAJBMWAABAMmEBAAAkExYAAEAyYQEAACQTFgAAQDJhAQAAJBMWAABAMmEBAAAkExYAAEAyYQEAACRr09QD1q5dG7fddlssWLAg/uEf/iEGDx68zZq33norfvazn8WKFSuid+/ecdlll8V+++3X6OPuyjEAAEDL0KQzFjNnzoxjjjkm1qxZE7NmzYrly5dvs2blypUxYMCAePHFF+P444+PJ554IgYNGhTvvfdeg4+7K8cAAAAtR5PCYvDgwfGHP/whpkyZ0uCa66+/Pg466KC4//774+tf/3o88sgjUVtbGz/84Q/zegwAANByNCksunXrFplMptE1Dz/8cIwcOTJat24dERHt2rWLESNGxOzZs/N6DAAA0HLk9eLtjRs3xurVq6Nbt2719nfv3j1ef/31vB0TEVFbWxs1NTX1bgAAQGHkNSw2bdoUEREdOnSot79Dhw65+/JxTEREZWVllJSU5G5lZWUpowMAAAnyGhYdOnSIVq1abXPR9bp166JTp055OyYioqKiIqqrq3O3qqqq1PEBAIBd1OSvm21M27Zto2/fvvHqq6/W2//KK6/EUUcdlbdjIiIymcwOr/cAAAB2j7z/QN55550Xs2bNilWrVkVExKJFi+KRRx6J888/P7fmP//zP2PcuHFNOgYAAGi5mhQWr776apxzzjlxzjnnRETET37ykzjnnHPilltuya25+uqrY9CgQXH00UfHsGHD4oQTTojRo0fH2LFj6z3Offfd16RjAACAlqtJH4U64IAD4swzz4yIyP1nRESvXr1y/z2TycTs2bNj/vz5sXLlypg6dWoceeSR9R5n1KhR8ZnPfKZJxwAAAC1Xk8Kia9euubMVOzJw4MAYOHDgdu878sgjtxsOjR0DAAC0XHm/xgIAANj7CAsAACCZsAAAAJIJCwAAIJmwAAAAkgkLAAAgmbAAAACSCQsAACCZsAAAAJIJCwAAIJmwAAAAkgkLAAAgmbAAAACSCQsAACCZsAAAAJIJCwAAIJmwAAAAkgkLAAAgmbAAAACSCQsAACCZsAAAAJIJCwAAIJmwAAAAkgkLAAAgmbAAAACSCQsAACCZsAAAAJIJCwAAIJmwAAAAkgkLAAAgmbAAAACSCQsAACCZsAAAAJIJCwAAIJmwAAAAkgkLAAAgmbAAAACSCQsAACCZsAAAAJIJCwAAIJmwAAAAkgkLAAAgmbAAAACStcn3A77zzjuxZcuWbfbvu+++sf/++2/3mA8++CCqq6vr7WvVqlWUlpbmezwAAKAZ5D0szj777Fi2bFm9fW+99VaMGTMmZs2atd1jbrrppvje974XBxxwQG5fSUlJ/O///m++xwMAAJpB3sNi7ty59bYXLlwY/fv3j3PPPbfR4/r37x/PPfdcvscBAAB2g2a/xuLWW2+Ngw46KIYPH77DtevXr4+NGzc290gAAECeNWtYbNq0KWbOnBkXXXRRtGnT+MmRefPmRVlZWZSUlMTRRx8dTz75ZHOOBgAA5FGzhsV//dd/xfr162PcuHGNruvdu3fMnTs3ampqorq6OoYOHRrDhw+PRYsWNXhMbW1t1NTU1LsBAACF0axhMWPGjBg6dGj07Nmz0XVnn312fO5zn4uioqJo165dTJkyJT796U/HHXfc0eAxlZWVUVJSkruVlZXle3wAAGAnNVtYvPHGGzFnzpz42te+1uRjW7VqFT169Ijly5c3uKaioiKqq6tzt6qqqoRpAQCAFHn/VqiP3XbbbdGlS5c488wzt7mvpqYmNmzYkPudirq6umjV6v8bZ8OGDfHqq6/GCSec0ODjZzKZyGQyeZ8bAABoumY5Y1FXVxe33357XHjhhbHPPvtsc/8PfvCD6NevX2576NChMXPmzFi0aFE89dRTceaZZ0Y2m42vf/3rzTEeAACQZ80SFs8++2xks9kGPwZVXFwcBx98cG775z//efzmN7+J0aNHxzXXXBOHH354vPLKK66bAACAPURRNpvNFnqIfKipqYmSkpKorq6O4uLigs3RY8Lsgj03FMLyG3b8GzUtmfcse5s9/T0L7F5N+Ru72X8gDwAA+OQTFgAAQDJhAQAAJBMWAABAMmEBAAAka7YfyAMAyCff4sbeaE/6JjdnLAAAgGTCAgAASCYsAACAZMICAABIJiwAAIBkwgIAAEgmLAAAgGTCAgAASCYsAACAZMICAABIJiwAAIBkwgIAAEgmLAAAgGTCAgAASCYsAACAZMICAABIJiwAAIBkwgIAAEgmLAAAgGTCAgAASCYsAACAZMICAABIJiwAAIBkwgIAAEgmLAAAgGTCAgAASCYsAACAZMICAABIJiwAAIBkwgIAAEgmLAAAgGTCAgAASCYsAACAZMICAABIJiwAAIBkwgIAAEgmLAAAgGTCAgAASNYm3w/4+OOPx+zZs+vta9euXVRWVjZ6XHV1ddx9992xYsWK6N27d5x33nnRrl27fI8HAAA0g7yfsXj++efj/vvvjx49euRu3bp1a/SYNWvWxIABA+Lf//3fY999940f/ehHceKJJ8aHH36Y7/EAAIBmkPczFhERn/70p+Oqq67a6fXf//73o02bNjFnzpzIZDJx1VVXRXl5edx8881RUVHRHCMCAAB51CzXWLzzzjvx7W9/OyZPnhyPP/74Dtf/6le/itGjR0cmk4mIiM6dO8eIESPi/vvvb47xAACAPGuWsOjatWu0atUq1qxZE6NGjYqRI0dGNpvd7tra2tpYuXJl9OrVq97+Xr16xe9///sGn6O2tjZqamrq3QAAgMLI+0ehxo4dG9ddd11ue/z48TFgwIC4884748ILL9xm/R//+MeIiOjYsWO9/cXFxbn7tqeysjImTZqUp6kBAIAUeT9j0b1793rbRxxxRAwcODCeeuqp7a7/1Kc+FUVFRbF+/fp6+99///1tYuMvVVRURHV1de5WVVWVPDsAALBrmuXi7b+2efPm2LJly3bv22effeKwww6LxYsX19u/ePHi6NevX4OPmclkctdkAAAAhZX3MxZPPPFEve25c+fGiy++GF/60pdy+x599NF63/Y0ZsyYmDVrVrz//vsREVFVVRUPPfRQjBkzJt/jAQAAzSDvYXHnnXfGwIEDY9y4cXHGGWfEqaeeGpdffnmce+65uTXPPfdcTJ8+Pbc9YcKEKC0tjc9+9rNx4YUXxgknnBAnnnhijB8/Pt/jAQAAzSDvH4W68847Y9GiRfH8889H+/bt4wc/+ME23/h06qmnRteuXXPbHTp0iGeeeSZ+/etfx8qVK2Ps2LExdOjQKCoqyvd4AABAM2iWayz69u0bffv2bfD+448/Po4//vj6g7RpE8OHD2+OcQAAgGbWLL9jAQAA7F2EBQAAkExYAAAAyYQFAACQTFgAAADJhAUAAJBMWAAAAMmEBQAAkExYAAAAyYQFAACQTFgAAADJhAUAAJBMWAAAAMmEBQAAkExYAAAAyYQFAACQTFgAAADJhAUAAJBMWAAAAMmEBQAAkExYAAAAyYQFAACQTFgAAADJhAUAAJBMWAAAAMmEBQAAkExYAAAAyYQFAACQTFgAAADJhAUAAJBMWAAAAMmEBQAAkExYAAAAyYQFAACQTFgAAADJhAUAAJBMWAAAAMmEBQAAkExYAAAAyYQFAACQTFgAAADJhAUAAJBMWAAAAMnaFHqAiIhsNhtbt26tt6+oqChat25doIkAAICmyPsZixdeeCG++tWvxv777x8lJSXxxS9+MX73u981eszkyZOjbdu2se++++ZuXbt2zfdoAABAM8l7WEyePDnOP//8WLJkSSxfvjwOO+yw+OIXvxhvvvlmo8cdd9xx8dFHH+Vua9euzfdoAABAM8l7WPzqV7+Ks846K7p06RKdO3eOm2++OT788MN4/PHH8/1UAABAC9HsF2+vXbs2tm7dGp06dWp03cKFC6Ndu3bRuXPnGDZsWCxcuLC5RwMAAPKk2cPiiiuuiG7dusWwYcMaXFNaWhp33XVXrFmzJl5++eU48MAD4/Of/3ysWLGiwWNqa2ujpqam3g0AACiMZg2La6+9Nh5//PG47777on379g2uu/jii2P06NHRsWPHKCsri9tuuy2Ki4vj1ltvbfCYysrKKCkpyd3Kysqa4yUAAAA7odnC4rrrrovp06fHo48+GgMHDmzSsW3bto3y8vJYtmxZg2sqKiqiuro6d6uqqkodGQAA2EXN8jsWEydOjJtvvjkeffTROOGEE7a5v66uLrLZbIO/U7F58+ZYvHhxDBgwoMHnyGQykclk8jYzAACw6/J+xmLSpEnxwx/+MB566KE49thjc18fW1dXl1tz/fXXR5cuXXLbI0eOjCeffDLef//9+P3vfx9jx46NmpqaGD9+fL7HAwAAmkHew+LGG2+MjRs3xhe+8IV6P3j3/e9///+ftFWraNPm/0+WXHvttTF16tTo3bt3DB06NLZu3RovvPBClJeX53s8AACgGeT9o1AbNmzY4ZqJEyfGxIkTc9vHHXdczJ49O9+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"
    }
  }
}
Real response, fetched from the live endpoint with the parameters on the left — trimmed to the first few rows, with seller names left out. Press Try it for the untrimmed response.

How the Generation API works

Generation is a normal ReefAPI surface — the same four rules that hold for every other engine on the key.

01
Authenticate
x-api-key header

No OAuth app, no request signing, no per-site account. One key covers all 184 engines.

02
Call
POST /generate/v1/…

Every route is a POST with a JSON body. Parameters are validated against the published schema before anything is charged.

03
Pay
0 or 1 or 2 or 4 credits per call

Credits, not seats. Failed and blocked calls are never charged, and cache hits cost nothing.

04
Read
{ ok, data, meta, error }

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.

01og_image
POST/generate/v1/og_image
{"template_name": "og_basic", "vars": {"title": "Launch day"}}

Returned a finished PNG at social dimensions in well under a tenth of a second.

02chart
POST/generate/v1/chart
{"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.

request
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]}]}}}'
response envelope
{
  "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.

ActionWhat you get backMeasured
pdf_render, pdf_from_htmlfile{file_b64, bytes, content_type, filename, delivery}The built-in invoice template rendered to 9,075 bytes, delivery 'inline'
og_image1200x630 PNG by default, width and height overridable to 4000og_basic with a title and subtitle = 15,605 bytes
chartPNG or SVG from a Chart.js-shaped spec, 8 chart types onlytype 'violin' returned INVALID_PARAM listing bar, horizontal_bar, line, area, pie, doughnut, scatter, radar
barcodeCheck digit computed or validated, never silently corrected5901234123456 returned INVALID_PARAM with detail.valid_code 5901234123457
qrpng_base64 plus version, designator, modules and is_microA short URL at error correction m = version 2, designator 2-M, 25 modules
vcard, icalRaw file text plus a data_uri, and a QR of it if as_qr is setvCard 3.0 = 134 bytes, field_count 4; iCal uid is [email protected]
Remote images or CSSBlocked at render unless the host is in allow_hostsA PDF referencing one remote image returned INVALID_PARAM naming the blocked URL
validate_htmlLints without rendering, flags what the renderer will blockvalid false, remote_resources listing both blocked URLs, tags_open 3 vs tags_close 1
batch, batch_pdf, batch_imageUp to 50 small assets or 20 documents, per-item errors3 items returned count 3, ok_count 2, the bad barcode carrying its own error
template_listThe complete set of built-ins with a data_contract for each4 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.

It is fast enough to sit in a request path

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.

Charts are specified, not drawn

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.

Files come back complete

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.

PDFs from HTML or from a URL

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.

Against us: templates, not a design tool

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.

21

endpoints

0/1/2/4

credits per call

01

SaaS products call pdf_from_html to turn invoices, reports and receipts into downloadable PDFs.

02

Marketing tools use og_image and image_from_template to auto-generate share images at scale.

03

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 →
$0.67–$1.50 / 1,000 credits
  • 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
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]}]}}}'
python
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"])
FAQ

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.

0/4000

No account needed · we reply from [email protected]

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.