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:
# 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:

| Param | What it does | Default |
|---|---|---|
data | Comma-separated numbers, 1β300 points (negative and decimal fine). Alias: values. | required |
type | line, area (line + fill), bar, or spark β a compact axis-free line+fill with a dot on the last point, made for READMEs. | line |
labels | X-axis labels, comma-separated β count must match the data. Auto-thinned when they'd overlap. | none |
title | Chart title, β€60 chars. | none |
min / max | Y-range override. Auto-scaled with 5% padding otherwise; bars always anchor at 0 so heights don't lie. | auto |
color | Series color, hex without #. Alias: fg. | blue |
bg | Background hex, or transparent (PNG keeps real alpha). | theme |
theme | light or dark. | light |
grid=0 / points=1 | Hide gridlines / draw a dot on every data point. | grid on |
/chart/:WxH | Size override, 40β2000 Γ 20β2000 (PNG β€1,000,000 px β use SVG beyond). | 600Γ300 |
format=svg / .svg | Vector output with a real system font instead of the PNG's blocky pixel font. | PNG |
# 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.
| Mockbird | QuickChart | Image-Charts | a chart library | |
|---|---|---|---|---|
| Key / signup | none | none | none | n/a |
| Config format | flat query params | Chart.js JSON in the URL | Google Image Charts params | code |
| Chart types | line, area, bar, spark | the full Chart.js set + plugins (pie, radar, scatter, sankeyβ¦) | large Google-syntax set + GIF/WebP | anything |
| Multi-series / legends | β (one series today) | β | β | β |
| Free volume | generous per-project daily cap | 1,000 charts/month, 60/min (their FAQ) | free tier adds a corner watermark | unlimited (your CPU) |
| Watermark | none | none | on the free tier | none |
| Deterministic bytes | β | not guaranteed | not 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.
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">`;
data string β€4000 chars. One series per chart today β pipe-separated multi-series is on the list; tell us if you need it.?format=svg for larger./img) β legible and honest about being a placeholder; the SVG twin uses a real system font.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 β