Free chart image API β€” line, bar and sparkline charts from numbers in a URL

You have five numbers and you want a chart β€” in a README, a markdown doc, an email, a chat message, a status page, an admin screen you don't want to add a chart library to. Wiring up Chart.js (bundle, canvas, config object, build step) for one <img>-sized picture is absurd. The URL-parameter pattern fixes it: put the numbers in a query string, get image bytes back.

Mockbird serves charts exactly that way β€” no key, no signup, no watermark, no JSON config to hand-write, and the same URL returns the same bytes forever, so caches and CDNs love it:

The 10-second version

# a 600x300 line chart PNG β€” this URL works right now
curl -o chart.png "https://mockbird.mockbird.workers.dev/m/demo/chart?data=3,7,4,9,6"

# bar chart with labels and a title
curl -o chart.png "https://mockbird.mockbird.workers.dev/m/demo/chart?data=12,19,7,24&type=bar&labels=q1,q2,q3,q4&title=Signups"

# compact README sparkline (no axes, dot on the last point)
curl -o spark.png "https://mockbird.mockbird.workers.dev/m/demo/chart/300x80?data=3,7,4,9,6,2,8&type=spark"

# vector output (crisp at any size)
curl -o chart.svg "https://mockbird.mockbird.workers.dev/m/demo/chart.svg?data=3,7,4,9,6&type=area"

Or straight in markdown β€” the README case:

![requests this week](https://mockbird.mockbird.workers.dev/m/demo/chart/300x80?data=3,7,4,9,6,2,8&type=spark)

area chart bar chart sparkline

All the parameters

ParamWhat it doesDefault
dataComma-separated numbers, 1–300 points (negative and decimal fine). Alias: values.required
typeline, area (line + fill), bar, or spark β€” a compact axis-free line+fill with a dot on the last point, made for READMEs.line
labelsX-axis labels, comma-separated β€” count must match the data. Auto-thinned when they'd overlap.none
titleChart title, ≀60 chars.none
min / maxY-range override. Auto-scaled with 5% padding otherwise; bars always anchor at 0 so heights don't lie.auto
colorSeries color, hex without #. Alias: fg.blue
bgBackground hex, or transparent (PNG keeps real alpha).theme
themelight or dark.light
grid=0 / points=1Hide gridlines / draw a dot on every data point.grid on
/chart/:WxHSize override, 40–2000 Γ— 20–2000 (PNG ≀1,000,000 px β€” use SVG beyond).600Γ—300
format=svg / .svgVector output with a real system font instead of the PNG's blocky pixel font.PNG

Charts people actually make this way

# uptime / response-time sparkline in a status README
…/chart/300x60?data=212,198,205,301,220,215,208&type=spark&color=10b981

# a dark-mode dashboard tile
…/chart?data=40,42,39,45,50,48,55&theme=dark&title=Weekly+active+users

# fixed y-range so consecutive screenshots are comparable
…/chart?data=71,74,69,80&min=0&max=100&type=bar&labels=mon,tue,wed,thu

# transparent background to sit on any page color
…/chart/400x150?data=3,7,4,9,6&type=area&bg=transparent

Numbers straight from a shell pipeline work too: data=$(printf '%s,' "${values[@]}") or a jq -r 'map(.count)|join(",")' away from any JSON. Because output is deterministic, re-running produces byte-identical files β€” safe for build pipelines and cached embeds.

Honest comparison

MockbirdQuickChartImage-Chartsa chart library
Key / signupnonenonenonen/a
Config formatflat query paramsChart.js JSON in the URLGoogle Image Charts paramscode
Chart typesline, area, bar, sparkthe full Chart.js set + plugins (pie, radar, scatter, sankey…)large Google-syntax set + GIF/WebPanything
Multi-series / legends✘ (one series today)βœ”βœ”βœ”
Free volumegenerous per-project daily cap1,000 charts/month, 60/min (their FAQ)free tier adds a corner watermarkunlimited (your CPU)
Watermarknonenoneon the free tiernone
Deterministic bytesβœ”not guaranteednot guaranteedβœ”
Self-hostableβœ˜βœ” (open-source, AGPL)βœ˜βœ”
Also a full mock REST APIβœ”βœ˜βœ˜βœ˜

Being upfront: QuickChart is excellent and open-source β€” if you need pie charts, multiple series, legends, or Chart.js-grade typography, use it (or self-host the AGPL server) and pay for volume if you outgrow the free 1,000/month. Image-Charts keeps the old Google Image Charts URL syntax alive, which matters if you're migrating code written before Google turned that API off in 2019 (chart.googleapis.com now 404s). Mockbird's angle is the zero-config tier: numbers in, picture out, no JSON to hand-write, no watermark, no monthly cap β€” and it lives next to your mock REST API, placeholder images, avatars, QR codes and OG cards under one project URL. For interactive charts in a real app, use a real chart library.

Pairs well with the rest of your mock backend

Seeded mock data + chart endpoint composes with plain string interpolation β€” an admin-dashboard prototype with zero chart code:

// chart the demo API's own product prices
const res = await fetch("https://mockbird.mockbird.workers.dev/m/demo/products?limit=12&select=price");
const prices = (await res.json()).map(p => p.price);
document.body.innerHTML =
  `<img src="https://mockbird.mockbird.workers.dev/m/demo/chart/500x200?data=${prices.join(",")}&type=bar&title=Prices">`;

Limits

⚑ These URLs run on the shared demo project and work forever. Want your own namespace (and a full mock REST API + placeholder/avatar/OG/QR endpoints alongside it)? One click creates a project β€” no signup. Or build your URL visually in the image playground.

Full reference in the docs. More image guides: placeholder image API Β· PNG placeholder API Β· OG image API Β· QR code API Β· avatar API. Create your API β†’