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.
Endpoint tested and returned HTTP 200 on 21 Aug 2026
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 21 Aug 2026, 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 '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'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);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())# 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/pngParameters
| Parameter | Type | Required | Description |
|---|---|---|---|
c | string | Required | The 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]}]}} |
w | integer | Optional | Image width in pixels. Defaults to 500. 200 |
h | integer | Optional | Image height in pixels. Defaults to 300. 100 |
format | string | Optional | Output format: `png`, `svg` or `webp`. Defaults to PNG. svg |
bkg | string | Optional | Background colour. Defaults to transparent, which looks wrong on dark email clients. white |
devicePixelRatio | float | Optional | Pixel 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
Image to Base64 Converter
Convert an image to a Base64 data URL online. Get copy-ready HTML img tags and CSS background-image snippets. Free, instant and fully private.
CSV to JSON Converter
Convert CSV to a JSON array of objects online. Header-row detection, comma/semicolon/tab delimiters and pretty-printed output — 100% in your browser.
JSON Formatter
Format, beautify and minify JSON online with 2-space, 4-space or tab indentation. Sort keys alphabetically and catch syntax errors instantly — free and private.
Alternatives to QuickChart API
If QuickChart does not fit, these developer & testing apis cover similar ground. Every one was called before publishing, and each links to its own reference page with a working curl command and the response it returned.
| API | What it does | Auth | CORS | Last verified |
|---|---|---|---|---|
| GitHub REST API | GitHub REST API with no key for public data: repository details, users, issues, releases and commits. 60 req/hour unauthenticated, 5,000 with a token. | No key | Yes | 19 Aug 2026 |
| JSONPlaceholder | Free fake REST API for testing and prototyping. Posts, comments, users and todos with full GET, POST, PUT and DELETE support. No key. Real curl examples. | No key | Yes | 19 Aug 2026 |
| Postman Echo | Postman Echo reflects your HTTP request back as JSON: headers, body, query params and auth. Free, no key, ideal for debugging clients. Real POST example. | No key | No | 19 Aug 2026 |
| DummyJSON | Free fake REST API with realistic products, users, carts, recipes and auth. Supports search, pagination, sorting and POST. No key. Tested GET and POST examples. | No key | Yes | 19 Aug 2026 |
| Repology | Free Repology API with no key: which version of any package each Linux distribution ships, across 300+ repositories. Ideal for packaging work. Tested. | No key | No | 20 Aug 2026 |
| restful-api.dev | Free fake REST API with real GET, POST, PUT, PATCH and DELETE support and no key. Ideal for tutorials, HTTP client demos and integration tests. Live example included. | No key | Yes | 21 Aug 2026 |
QuickChart is an independent third-party service and is not affiliated with ByteTools or ByteVancer. Details on this page were verified on 21 Aug 2026; always check the official documentation before relying on this API in production, as terms and limits can change.