BYTETOOLS

QuickChart API

Free chart image API with no key: pass a Chart.js config in the URL and get back a PNG or SVG chart. Works in emails, PDFs and READMEs. Tested example included.

No API key requiredCORS enabledHTTPSFree tier

Endpoint tested and returned HTTP 200 on 2026-08-21

What is the QuickChart API?

QuickChart is a free, key-free API that renders charts as images. You pass a Chart.js configuration object as a URL parameter and the API returns a PNG (or SVG) chart, which makes it usable anywhere an image URL works — email, PDF, Slack, a GitHub README.

Charting libraries assume a browser. That assumption breaks the moment you need a graph inside an email, a server-rendered PDF, a Slack message or a README, because none of those run JavaScript. QuickChart closes the gap by doing the rendering on its side and handing you back an ordinary image URL.

The configuration format is Chart.js, which is a deliberate choice: if you already have a working Chart.js config in your front end, you can paste the same object into a QuickChart URL and get a matching static image. Note that the config goes in the query string, so it must be URL-encoded — for anything beyond a toy chart, build the URL programmatically rather than by hand, or POST the config to `/chart` instead.

Quick facts

Base URL
https://quickchart.io
Authentication
No API key needed for the free tier. An optional paid account raises limits and unlocks short URLs, but every parameter documented here works anonymously.
Rate limit
Roughly 60 requests per minute on the free anonymous tier.
Pricing
Free tier with no key. Paid plans add higher throughput and an SLA. The renderer is open source and self-hostable.
CORS
Enabled — callable directly from browser JavaScript
Official docs
Read the docs

How to use the QuickChart API

Every request below was executed against the live API on 2026-08-21, and the response shown is the real body it returned — not an illustration.

1. Render a two-bar chart as a PNG

GET https://quickchart.io/chart?c=%7Btype%3A%27bar%27%2Cdata%3A%7Blabels%3A%5B%27A%27%2C%27B%27%5D%2Cdatasets%3A%5B%7Bdata%3A%5B10%2C20%5D%7D%5D%7D%7D&w=200&h=100

curl
curl 'https://quickchart.io/chart?c=%7Btype%3A%27bar%27%2Cdata%3A%7Blabels%3A%5B%27A%27%2C%27B%27%5D%2Cdatasets%3A%5B%7Bdata%3A%5B10%2C20%5D%7D%5D%7D%7D&w=200&h=100'
JavaScript (fetch)
const res = await fetch("https://quickchart.io/chart?c=%7Btype%3A%27bar%27%2Cdata%3A%7Blabels%3A%5B%27A%27%2C%27B%27%5D%2Cdatasets%3A%5B%7Bdata%3A%5B10%2C20%5D%7D%5D%7D%7D&w=200&h=100");
if (!res.ok) throw new Error(`Request failed: ${res.status}`);
const data = await res.json();
console.log(data);
Python (requests)
import requests

res = requests.get("https://quickchart.io/chart?c=%7Btype%3A%27bar%27%2Cdata%3A%7Blabels%3A%5B%27A%27%2C%27B%27%5D%2Cdatasets%3A%5B%7Bdata%3A%5B10%2C20%5D%7D%5D%7D%7D&w=200&h=100", timeout=20)
res.raise_for_status()
print(res.json())
Response — HTTP 200
# This endpoint returns image/png, not JSON.
# The response body is the image itself, so it can be used directly as an
# <img src="..."> or saved to a file — there is nothing to parse.
#
# Verified: HTTP 200, Content-Type: image/png

Parameters

ParameterTypeRequiredDescription
cstringRequiredThe Chart.js configuration object, URL-encoded. Accepts relaxed JSON, so unquoted keys and single quotes are tolerated. {type:'bar',data:{labels:['A','B'],datasets:[{data:[10,20]}]}}
wintegerOptionalImage width in pixels. Defaults to 500. 200
hintegerOptionalImage height in pixels. Defaults to 300. 100
formatstringOptionalOutput format: `png`, `svg` or `webp`. Defaults to PNG. svg
bkgstringOptionalBackground colour. Defaults to transparent, which looks wrong on dark email clients. white
devicePixelRatiofloatOptionalPixel density multiplier for retina screens. Defaults to 2. 1

Response fields

(body)image
The chart image itself as raw bytes, not JSON. Use the URL directly in an `<img>` tag or save the bytes to a file.
Content-Typeheader
`image/png` by default, or `image/svg+xml` / `image/webp` when requested via `format`.

What you can build with the QuickChart API

  • Embed a sales chart in a transactional email where JavaScript cannot run
  • Add a live metrics graph to a GitHub README as a plain image
  • Generate chart images for a server-side PDF report
  • Post an automatically updating chart into Slack or Discord via a webhook

Common errors and how to fix them

400

The chart configuration failed to parse.

Fix: Check that `c` is properly URL-encoded — an unescaped `&` or `#` inside the config silently truncates it.

429

Rate limit exceeded on the free tier.

Fix: Cache rendered images rather than re-requesting identical charts, or self-host the open-source renderer.

500

The config parsed but the renderer failed, usually an unsupported chart type or plugin.

Fix: Simplify the config until it renders, then add options back one at a time.

QuickChart API — frequently asked questions

Is the QuickChart API free?

Yes, there is a free anonymous tier with no API key and no signup, limited to roughly 60 requests per minute. Paid plans and a self-hostable open-source renderer are available for heavier use.

What chart configuration format does QuickChart use?

Chart.js. An existing Chart.js config from your front-end code can be pasted straight into the `c` parameter, so charts stay visually consistent between your app and your emails or reports.

Why does my QuickChart image come out blank or broken?

Almost always URL encoding. The config contains characters that must be percent-encoded; an unescaped ampersand ends the parameter early and the API sees a truncated config. Build the URL with encodeURIComponent rather than by hand.

Can I use QuickChart images in an email?

Yes — that is its main use case, because email clients block JavaScript but render images. Set `bkg=white` so the chart does not disappear against a dark background, and cache the image on your own host if you send at volume.

Tools that pair with this API

QuickChart is an independent third-party service and is not affiliated with ByteTools or ByteVancer. Details on this page were verified on 2026-08-21; always check the official documentation before relying on this API in production, as terms and limits can change.