BYTETOOLS

Image-Charts API

Generate bar, line and pie chart images from a URL, Google Image Charts style, with no API key. Perfect for emails and READMEs where JavaScript cannot run.

No API key requiredCORS enabledHTTPSFree tier

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

What is the Image-Charts API?

Image-Charts renders charts as images from URL parameters alone. `GET https://image-charts.com/chart?cht=bvg&chd=t:60,40,30&chs=400x180` returns a PNG bar chart. No API key is needed for basic charts, and the parameter syntax is compatible with the retired Google Image Charts API.

There are places JavaScript charting libraries simply cannot go: HTML email, a Markdown README, a PDF generated by a headless renderer, a Slack unfurl. Image-Charts fills that gap by encoding the entire chart, data included, into a URL that responds with an image. Nothing to embed, nothing to run, and the result works anywhere an `<img>` tag does.

It deliberately reimplements the parameter grammar of Google Image Charts, which Google shut down years ago after a long deprecation. If you have inherited code full of `cht`, `chd` and `chs` parameters, changing the hostname is often the entire migration. The grammar is terse and unforgiving: `cht` picks the chart type, `chd=t:` introduces text-format data, and `chs` sets pixel dimensions, with everything else layered on as optional `ch*` parameters.

Quick facts

Base URL
https://image-charts.com
Authentication
No key is required for the endpoint documented here. Image-Charts also sells paid plans; check their pricing page for the current free-tier terms before shipping a high-volume integration.
Rate limit
Applied per IP on the free tier. Cache generated images rather than regenerating them on every page view or email open.
Pricing
Free tier with no signup, plus paid plans.
CORS
Enabled — callable directly from browser JavaScript
Official docs
Read the docs

How to use the Image-Charts 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 grouped vertical bar chart as PNG

GET https://image-charts.com/chart?cht=bvg&chd=t:60,40,30&chs=400x180&chxt=x,y

curl
curl 'https://image-charts.com/chart?cht=bvg&chd=t:60,40,30&chs=400x180&chxt=x,y'
JavaScript (fetch)
const res = await fetch("https://image-charts.com/chart?cht=bvg&chd=t:60,40,30&chs=400x180&chxt=x,y");
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://image-charts.com/chart?cht=bvg&chd=t:60,40,30&chs=400x180&chxt=x,y", 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
chtstringRequiredChart type. `bvg` grouped vertical bars, `bvs` stacked bars, `lc` line, `p`/`p3` pie, `gv` Graphviz. bvg
chdstringRequiredData series. `t:` for plain text values, `a:` for auto-scaled, `e:` for extended encoding. Series are separated by `|`. t:60,40,30
chsstringRequiredOutput size in pixels as `WIDTHxHEIGHT`. 400x180
chxtstringOptionalWhich axes to draw, comma-separated: `x`, `y`, `r`, `t`. x,y
chlstringOptionalValue labels drawn on the chart, separated by `|`. 60|40|30
chttstringOptionalChart title text. Weekly signups
chcostringOptionalSeries colours as hex without the leading hash, separated by commas. 4287f5,f54242

Response fields

(body)image/png
The chart itself as a PNG image. There is no JSON envelope, so use the URL directly as an `<img src>` or save the bytes to a file.
(error responses)image/png
Parameter errors are often rendered as an image containing the error text rather than returned as a 4xx status. Open the URL in a browser when debugging.

What you can build with the Image-Charts API

  • Embed a chart in an HTML email, where scripts are stripped
  • Add a live metrics graphic to a GitHub README
  • Include charts in server-rendered PDF reports without a headless browser
  • Post a chart into Slack or Discord as an image unfurl
  • Replace legacy Google Image Charts URLs by swapping the hostname

Common errors and how to fix them

Image containing an error message

A parameter is malformed; Image-Charts renders the problem into the image instead of failing the request.

Fix: Open the URL directly in a browser and read the rendered message; it names the offending parameter.

Blank or clipped chart

`chs` is too small for the labels and axes you asked for.

Fix: Increase the pixel dimensions, or drop `chl` labels on dense series.

URL truncated in email clients

Long `chd` data strings can exceed the URL limits of some clients and proxies.

Fix: Use extended encoding (`chd=e:`) to compress the data, or pre-render and host the image yourself.

Image-Charts API — frequently asked questions

Is Image-Charts a drop-in replacement for Google Image Charts?

For the common chart types the parameter grammar is intentionally compatible, so changing the hostname is often all that is needed. Less common Google parameters may behave differently, so re-check each chart visually.

Do I need an API key?

Not for the basic chart endpoint. Paid plans exist for higher volume and additional features, but the URL shown here works without any credential.

What formats can it return?

PNG by default. The service also supports other output types via parameters; the response documented here was captured as `image/png`.

Should I generate chart URLs on every request?

No. The URL is deterministic for a given dataset, so cache the rendered image or store it in your own asset storage, particularly for email where the same image is fetched many times.

Tools that pair with this API

Image-Charts 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.