How it works
A chart is a function of your data.
Not a prompt, not a guess, not a screenshot of a dashboard. You send numbers and a form; a renderer draws exactly those numbers in exactly that form and hands back an image.
What happens on one call
- 01
Send the numbers
A chart type, your labels, and one or more series. That is the whole request body — there is no project to create, no dataset to upload, and no dashboard to configure first.
- 02
It is checked before it costs
Series lengths, finite numbers, series count, negative slices in a pie. If the spec cannot produce an honest chart you get a 400 that names the problem and says what to send instead — and you are not charged. Validation runs before any credit is reserved.
- 03
It is drawn, not generated
The chart is built as SVG by a renderer we wrote — no charting library, no model, no headless browser. Axis ticks land on round numbers, labels are measured before they are placed, and bars grow from a zero baseline.
- 04
You get a URL
A signed PNG or SVG, valid for 24 hours, plus the value table. Re-signing later is free. 1 credit is settled on delivery; if anything fails, the reserve goes back to the exact pools it came from.
What it will not do.
These are not settings. They are the reason the output can be trusted without checking it.
- Bars start at zero
- Always. A truncated bar axis misstates the ratio between bars, which is the only thing a bar chart exists to show. Line and scatter charts may use a padded data range, because reading a trend does not depend on the baseline.
- Gaps stay gaps
- Send null and the line breaks there. Nothing is interpolated across a hole in your data to make a prettier curve.
- Labels are measured, never clipped
- If category labels will not fit side by side they rotate; if they are short and merely numerous, every nth is drawn; if a value will not fit on a bar it moves outside or is dropped. Text is never cut off by its own mark.
- At most 8 series
- The palette is eight slots and is never cycled. A ninth series would reuse a colour, and two different things in one colour is a chart that lies. Fold the tail into an “Other” series, or split the chart.
- Colour is never the only channel
- Two or more series always get a legend. Scatter series get distinct marker shapes as well as hues. Every response carries the value table. A reader who cannot separate two colours can still read the chart.
- The picture is a pure function of the spec
- Same spec, same bytes, every time. Nothing depends on the time of day, a model, or a cache. The spec is stored with the chart, so it can always be redrawn.
Pick the one the numbers need.
The job the data does picks the chart, not the other way round. Each example below is real renderer output.
barComparing a magnitude across a handful of named things.lineChange over time, where the shape of the trend is the point.areaA single accumulating quantity read against its zero baseline.stackedBarA total AND its composition, when both matter.horizontalBarRanking things whose names are too long for an x axis.donutParts of one whole, when there are few enough parts to compare.pieThe same job as a donut, without a total in the middle.scatterWhether two measures move together at all.
Try it without spending anything — the composer runs the same renderer in your browser and refuses the same way.
Open the composer