apyhub
Back
▣ DEVELOPER TOOLS · SMART GENERATION

Diagram, Math and Code Render API

What it does

The Diagram API renders diagram-as-code into images. Send Mermaid, Graphviz, D2, or Vega-Lite source with the matching engine, and get back SVG, PNG, PDF, JPEG, or WebP. Two more endpoints in the same service render TeX math with MathJax and syntax-highlighted source code.

Every endpoint accepts format, scale (0.5 to 4), width, and background. The default json format returns a data_uri plus metadata: width, height, engine version, cache status, warnings, and render timing. Set download to get the file bytes instead. Diagrams also take theme and layout; math takes color, font_size, and display; code takes language, theme, line_numbers, and a window title bar.

Use it as the Mermaid to PNG or Mermaid to SVG step in a docs build, render architecture diagrams for pull requests, turn LaTeX math into PNG for emails and slides, or create code images for docs and social cards. AI agents can call the Diagram API through ApyHub MCP to turn the diagrams they write into images.

Raster output tops out at 8192 by 8192 pixels (WebP at 4096), and Vega-Lite specs need their data inlined.

Pairs well with: embed rendered SVGs in Markdown and export it with the Convert Markdown to PDF API, or place them in an HTML report and print it with the Convert URL/HTML to PDF API.

▣ ENDPOINT 01 / 03
POST
Render source code
https://api.eu.apyhub.com/callable-labs/diagram-math-code-render-api/code

QUICKSTART

GUIDE

Quickstart

Render a small snippet of source code with the default JSON output.

curl -X POST "https://api.eu.apyhub.com/callable-labs/diagram-math-code-render-api/code" \
  -H "apy-token: $APY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "source": "def add(a, b):\n    return a + b"
  }'

What you'll get back

Returns a JSON object with rendering metadata such as cache, width, engine, format, height, data_uri, warnings, queued_ms, render_ms, media_type, and engine_version. The example output below shows the typical shape.

{
  "format": "png",
  "media_type": "image/png",
  "width": 220,
  "height": 74,
  "data_uri": "data:image/png;base64,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",
  "warnings": [],
  "engine": "code",
  "engine_version": "2.21.0",
  "cache": "hit",
  "render_ms": 0,
  "queued_ms": 0
}
TRY ITLIVE · 50 ATOMS
Loading your default key…
The full key is used to call the gateway and stays in this tab — never sent to orbit or saved.
CodeRequest*
Render source code with Pygments highlighting.
Source code. ≤ 64 KiB via POST, ≤ 8 KiB via GET, ≤ 2000 lines. Long listings fit as `format=svg` (no pixel ceiling); raster output is limited to 8192×8192 px (~380 lines at 1×).
Zoom the output 0.5–4×. Ignored when `width` is set. Raster and PDF output is capped at 8192×8192 px on the hosted plans (WebP 4096×4096); SVG has no ceiling.
Pygments style name. Curated: `default`, `friendly`, `monokai`, `dracula`, `github-dark`, `solarized-dark`, `solarized-light`, `nord`, `one-dark`, `gruvbox-dark`; any other Pygments style name is accepted too.
Filename shown in the window bar (implies `window`).

About this endpoint

What it does

Renders source code with Pygments highlighting and returns the rendered output plus metadata about the render. The request body contains the source code and optional rendering options such as format, theme, width, and scale.

Request Body

ParameterTypeDescription
sourceStringSource code. ≤ 64 KiB via POST, ≤ 8 KiB via GET, ≤ 2000 lines. Long listings fit as format=svg (no pixel ceiling); raster output is limited to 8192×8192 px (~380 lines at 1×).
scaleNumberZoom the output 0.5–4×. Ignored when width is set. Raster and PDF output is capped at 8192×8192 px on the hosted plans (WebP 4096×4096); SVG has no ceiling. Default: 1.
themeStringPygments style name. Curated: default, friendly, monokai, dracula, github-dark, solarized-dark, solarized-light, nord, one-dark, gruvbox-dark; any other Pygments style name is accepted too. Default: default.
titleStringFilename shown in the window bar (implies window).
widthIntegerTarget width in pixels (16–4096); height follows the aspect ratio and must stay within the same pixel ceiling. Overrides scale.
formatENUMOutput format. Allowed values: json, svg, png, pdf, jpeg, webp. Default: json. json returns a PNG data URI plus metadata; svg/png/pdf/jpeg/webp return the bytes.
windowBooleanDraw a macOS-style window title bar. Default: false.
downloadBooleanSend Content-Disposition: attachment so browsers save the file. Default: false.
languageStringPygments language name, e.g. python; auto-detected when omitted.
backgroundStringBackground colour as #rrggbb/#rgb, a CSS name, or transparent for none.
line_numbersBooleanPrint a line-number gutter. Default: false.

Response

Returns a JSON object with cache, width, engine, format, height, data_uri, warnings, queued_ms, render_ms, media_type, and engine_version fields. cache is an ENUM string, warnings is an array of strings, width and height are integers, queued_ms and render_ms are integers, and the remaining fields are strings.

AttributeTypeDescription
cacheENUMRender cache outcome. Allowed values: hit, miss.
widthIntegerRendered output width in pixels.
engineStringRendering engine name.
formatStringOutput format.
heightIntegerRendered output height in pixels.
data_uriStringRendered data URI.
warningsString ArrayWarning messages returned by the renderer.
queued_msIntegerTime spent waiting in queue, in milliseconds.
render_msIntegerTime spent rendering, in milliseconds.
media_typeStringMedia type of the rendered output.
engine_versionStringRendering engine version.
▣ ENDPOINT 02 / 03
POST
Render a diagram
https://api.eu.apyhub.com/callable-labs/diagram-math-code-render-api/diagram

QUICKSTART

GUIDE

Quickstart

Render a simple Mermaid diagram from source and get back a JSON response.

curl -X POST "https://api.eu.apyhub.com/callable-labs/diagram-math-code-render-api/diagram" \
  -H 'apy-token: $APY_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{
    "engine": "mermaid",
    "source": "graph TD; A[Start] --> B{Ready?}; B -->|yes| C[Ship]; B -->|no| A;",
    "format": "json"
  }'

What you'll get back

Returns a JSON object with fields such as cache (string), width (integer), engine (string), format (string), height (integer), data_uri (string), warnings (array of strings), queued_ms (integer), render_ms (integer), media_type (string), and engine_version (string).

{
  "format": "png",
  "media_type": "image/png",
  "width": 123,
  "height": 367,
  "data_uri": "data:image/png;base64,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",
  "warnings": [],
  "engine": "mermaid",
  "engine_version": "11.17.2",
  "cache": "hit",
  "render_ms": 0,
  "queued_ms": 0
}
TRY ITLIVE · 50 ATOMS
Loading your default key…
The full key is used to call the gateway and stays in this tab — never sent to orbit or saved.
DiagramRequest*
Render diagram-as-code source to an image.
Diagram engine: `mermaid`, `graphviz`, `d2` or `vegalite` (Vega-Lite JSON spec).
Diagram source: Mermaid text, DOT, D2 or a Vega-Lite JSON spec. ≤ 64 KiB via POST, ≤ 8 KiB via GET. Vega-Lite specs must inline their data (`url` is refused); Graphviz attributes that read local files (`image=`, `shapefile=`, …) are refused.
Zoom the output 0.5–4×. Ignored when `width` is set. Raster and PDF output is capped at 8192×8192 px on the hosted plans (WebP 4096×4096); SVG has no ceiling.
Engine-specific theme. Mermaid: `default|base|dark|forest|neutral`. D2: a numeric theme id — `0` (neutral default), `1`, `3`, `4`, `5`, `8`, `101`, `200` (dark), `300`, `301`. Vega-Lite: `default|dark`. Graphviz ignores it.
Target width in pixels (16–4096); height follows the aspect ratio and must stay within the same pixel ceiling. Overrides `scale`.

About this endpoint

What it does

Renders diagram-as-code source into an output image or JSON response. You send the diagram source plus the selected engine and optional rendering settings; the response returns render metadata and, when format is json, a data_uri for the rendered PNG.

Request Body

ParameterTypeDescription
engineENUMDiagram engine. Allowed values: mermaid, graphviz, d2, vegalite.
sourceStringDiagram source text or spec. Must be 1–65536 characters. Mermaid text, DOT, D2, or a Vega-Lite JSON spec. Via POST the limit is 64 KiB. Vega-Lite specs must inline their data (url is refused); Graphviz attributes that read local files (image=, shapefile=, …) are refused.
scaleNumberZoom factor from 0.5 to 4. Default: 1. Ignored when width is set. Raster and PDF output is capped at 8192×8192 px on hosted plans; WebP is capped at 4096×4096; SVG has no ceiling.
themeStringEngine-specific theme. Mermaid: default, base, dark, forest, neutral. D2: numeric theme id 0, 1, 3, 4, 5, 8, 101, 200, 300, 301. Vega-Lite: default, dark. Graphviz ignores this field. Nullable.
widthIntegerTarget width in pixels from 16 to 4096. Height follows the aspect ratio and must stay within the same pixel ceiling. Overrides scale. Nullable.
formatENUMOutput format. Allowed values: json, svg, png, pdf, jpeg, webp. Default: json. json returns a PNG data URI plus metadata; svg, png, pdf, jpeg, and webp return the bytes.
layoutStringGraphviz layout: dot, neato, fdp, sfdp, circo, twopi; or D2 layout: dagre, elk. Mermaid and Vega-Lite ignore this field. Nullable.
downloadBooleanWhen true, sends Content-Disposition: attachment so browsers save the file. Default: false.
backgroundStringBackground colour as #rrggbb, #rgb, a CSS name, or transparent for no background. Nullable.

Response

Returns a JSON object with render metadata. The top-level fields are cache (hit or miss), width (integer), engine (string), format (string), height (integer), data_uri (string), warnings (array of strings), queued_ms (integer), render_ms (integer), media_type (string), and engine_version (string).

ParameterTypeDescription
cacheENUMCache outcome. Allowed values: hit, miss.
widthIntegerRendered width in pixels.
engineStringEngine used for the render.
formatStringOutput format produced by the render.
heightIntegerRendered height in pixels.
data_uriStringPNG data URI returned when format is json.
warningsString ArrayWarning messages produced during rendering.
queued_msIntegerTime spent queued, in milliseconds.
render_msIntegerTime spent rendering, in milliseconds.
media_typeStringMedia type of the returned content.
engine_versionStringVersion of the rendering engine used.

Notes

source is limited to 64 KiB when sent with POST, and some inputs are explicitly refused: Vega-Lite specs must inline data instead of using url, and Graphviz file-loading attributes such as image= and shapefile= are not allowed.

▣ ENDPOINT 03 / 03
POST
Render a TeX expression
https://api.eu.apyhub.com/callable-labs/diagram-math-code-render-api/math

QUICKSTART

GUIDE

Quickstart

Render a simple TeX expression as JSON using the required tex field.

curl -X POST "https://api.eu.apyhub.com/callable-labs/diagram-math-code-render-api/math" \
  -H "apy-token: $APY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "tex": "\\frac{a}{b}"
}'

What you'll get back

Returns a JSON object with fields such as cache (hit or miss), width and height (integers), engine and engine_version (strings), format and media_type (strings), data_uri (string), warnings (array of strings), queued_ms and render_ms (integers), and, when present, width/height reflect the rendered output size.

{
  "format": "png",
  "media_type": "image/png",
  "width": 18,
  "height": 33,
  "data_uri": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAAhCAYAAADUIPtUAAABW0lEQVR4nO1Vy1XDMBAcggswJ67pAFMBzpFbOsBUQDqgBagAc+MGVIBTAU4FmBs3TAfsPq0iRehjvXCDeW/eOhvteD1eyQXiuCIuiCXxUeI9cXAXFhGRO+IpsSaOxJZ4QVznCC2JjQiNkhskdr6CA/jxJv/NrVwnsfYVzDy5UgSenPwZAt2EhOYSeytXw3TFj11NEWKBLyd3bQk1ML5tcQg/Pogr4jHxEuqVn8tvvsmDWxAyW6OCeUTtXe9bmBKajBl+Cf9Cadib9oZ4gjxsoOZtR6iFmpUcbCf8j84RHxcvwgZ7CPHmfIY5s6OIHf6Ddd1hDyFIN5spHaXM1uc0z1cVWxibIy58hfJqLWI8+Qtfh7GOaom3UNugIR7J9Q8UCSH2p7Vyn8j4rmm43zHt04CMjiop7LDbIaPPERqdyOBJf4c6biYLDVJUWt0sEfCHkXr9LYwnKwT8YXwDbINAQMEZMTgAAAAASUVORK5CYII=",
  "warnings": [],
  "engine": "mathjax",
  "engine_version": "3.2.2",
  "cache": "hit",
  "render_ms": 0,
  "queued_ms": 0
}
TRY ITLIVE · 50 ATOMS
Loading your default key…
The full key is used to call the gateway and stays in this tab — never sent to orbit or saved.
MathRequest*
Render a TeX expression with MathJax (SVG paths, no fonts required).
TeX source, e.g. `\frac{a}{b}` or `\int_0^\infty e^{-x}\,dx`. ≤ 64 KiB via POST, ≤ 8 KiB via GET.
Text colour as `#rrggbb`/`#rgb`.
Zoom the output 0.5–4×. Ignored when `width` is set. Raster and PDF output is capped at 8192×8192 px on the hosted plans (WebP 4096×4096); SVG has no ceiling.
Target width in pixels (16–4096); height follows the aspect ratio and must stay within the same pixel ceiling. Overrides `scale`.

About this endpoint

What it does

Renders a TeX expression into the requested output format using the fields in the request body. The response returns a JSON object with render metadata and, for json output, a data_uri field containing the rendered image data.

Request Body

ParameterTypeDescription
texStringTeX source, e.g. \frac{a}{b} or \int_0^\infty e^{-x}\,dx. ≤ 64 KiB via POST, ≤ 8 KiB via GET.
colorStringText colour as #rrggbb/#rgb.
scaleNumberZoom the output 0.5–4×. Default: 1. Ignored when width is set. Raster and PDF output is capped at 8192×8192 px on the hosted plans (WebP 4096×4096); SVG has no ceiling.
widthIntegerTarget width in pixels (16–4096); height follows the aspect ratio and must stay within the same pixel ceiling. Overrides scale.
formatENUMOutput format. Allowed values: json, svg, png, pdf, jpeg, webp. Default: json. json returns a PNG data URI plus metadata; svg/png/pdf/jpeg/webp return the bytes.
displayBooleanDisplay style (centred, larger) vs inline style. Default: true.
downloadBooleanSend Content-Disposition: attachment so browsers save the file. Default: false.
font_sizeIntegerFont size in pixels (6–96). Default: 16.
backgroundStringBackground colour as #rrggbb/#rgb, a CSS name, or transparent for none.

Response

Returns a JSON object with cache, width, engine, format, height, data_uri, warnings, queued_ms, render_ms, media_type, and engine_version fields. cache is a string enum, width/height/queued_ms/render_ms are integers, warnings is an array of strings, and the remaining fields are strings.

AttributeTypeDescription
cacheENUMhit or miss.
widthIntegerRendered output width in pixels.
engineStringRendering engine used.
formatStringOutput format returned.
heightIntegerRendered output height in pixels.
data_uriStringData URI for the rendered output.
warningsString ArrayRender warnings, if any.
queued_msIntegerTime spent queued, in milliseconds.
render_msIntegerTime spent rendering, in milliseconds.
media_typeStringMedia type of the rendered output.
engine_versionStringRendering engine version.
▣ COMMON ERRORS

Errors any endpoint can return

400bad_request

Required parameter missing or malformed body.

401unauthorized

API key missing, revoked, or not authorized for this service.

429rate_limited

Your plan's per-second rate exceeded. Retry with exponential backoff.

503upstream_busy

Backend temporarily unavailable. Try again in a few seconds.