Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Some links on this page are affiliate links: if you buy through them we may earn a commission, at no extra cost to you.

To generate a comparison graph image from data, build a chart configuration, send it to a chart-rendering API, then save the returned image bytes or embed the resulting image URL. For a quick Chart.js workflow, QuickChart accepts both an encoded URL and a JSON POST request. Use grouped bars for side-by-side category comparisons, lines for ordered data such as time, and set the dimensions and output format for where the image will appear.

What you need to generate a comparison graph

A chart-image API renders a chart configuration into a static asset. You do not need a browser or a charting library running in the reader’s email client: your application sends the chart specification to the service and receives an image. This is useful for reports, email, SMS, chatbots, and other places where a static image is easier to distribute than an interactive chart.

The examples below use QuickChart’s Chart.js-compatible API. A configuration has three core parts: the chart type, labels for the shared categories, and one dataset per item or series you want to compare. The labels and values must line up: each dataset should contain one value for each label.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Build a comparison chart configuration

This example compares two products across three features. Each feature gets a grouped pair of bars, making the values directly comparable.

#1 Best Overall
Five Star Spiral Notebook + Study App, 1 Subject, Graph Ruled Paper, 8-1/2" x 11", 100 Sheets, Fights Ink Bleed, Water Resistant Cover, Black (73679)
  • Ideal for graphing, charts and engineering projects.
  • 1-subject notebook. 100 double-sided, graph ruled sheets. 4 squares per inch.
  • Sheets measure 8-1/2 in. x 11 in. when torn out. Overall notebook size is 11 in. x 9-3/4 in. Tough pockets help prevent tears and hold 8-1/2 in. x 11 in. loose sheets.
  • High-grade paper fights ink bleed. Perforated pages for easy tear out. Front cover is water-resistant to help protect your notes all year.
  • Spiral Lock wire helps prevent snags on clothes and backpacks. Made with SFI approved paper. Recyclable - remove reinforcement tape on pocket and recycle the rest.
const chart = {
  type: 'bar',
  data: {
    labels: ['Feature A', 'Feature B', 'Feature C'],
    datasets: [
      { label: 'Product 1', data: [12, 19, 7] },
      { label: 'Product 2', data: [15, 14, 10] }
    ]
  }
};

Use a separate dataset for each product or series. Give datasets clear labels so the legend explains which values belong to which item. For a grouped bar chart, the shared labels represent the categories being compared; for a time series, they can represent dates or other ordered intervals.

Choose the chart type for the comparison

  • Grouped bars: best when readers need to compare multiple values for the same categories side by side.
  • Lines: appropriate when the horizontal labels form an ordered sequence, such as time or rank.
  • Pie or radar: Image-Charts documents these chart types, alongside bar and line image output. Its request syntax differs from a Chart.js configuration.

Do not choose a chart type just because the API supports it. The key question is what relationship readers need to see. If the categories are independent and the goal is a direct value comparison, grouped bars are usually easier to scan than a line chart.

Generate the image with QuickChart

GET: convenient for short configurations

QuickChart documents a URL form at https://quickchart.io/chart?c=. Encode the JSON configuration before adding it to the query string; raw JSON can contain characters that have special meanings in a URL.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
const chart = {
  type: 'bar',
  data: {
    labels: ['Feature A', 'Feature B', 'Feature C'],
    datasets: [
      { label: 'Product 1', data: [12, 19, 7] },
      { label: 'Product 2', data: [15, 14, 10] }
    ]
  }
};

const url = 'https://quickchart.io/chart?width=900&height=500&format=png&version=4&c=' +
  encodeURIComponent(JSON.stringify(chart));

Open the URL in a browser to inspect the output, or request it from your application and write the response bytes to a file. The example explicitly asks for a 900 × 500 PNG and Chart.js version 4 rather than relying on service defaults.

POST: a better fit for complex configurations

Use POST when the configuration is large or contains enough options to make a URL unwieldy. The JSON request body avoids URL-length limits. QuickChart’s documented POST endpoint accepts a body with rendering options and a chart object; the response is image bytes.

Rank #2
Mead Spiral Notebook, 1 Subject, Graph Ruled Paper, 7-1/2" x 10-1/2", 100 Sheets, Black (05676AA5)
  • 1 subject notebook comes with 100 graph ruled, double-sided sheets with 5 squares per inch
  • Sheets measure 7-1/2" x 10-1/2" when torn out with an overall size of 8" x 10-1/2". Perforation easily tears out with clean edges.
  • Graph ruling is ideal for plotting graphs, drawing curves and more. Notebook is 3-hole punched to store in your favorite binder.
  • Covers are coated for durability and have writable label on front cover. Available in Black.
  • Assembled in U.S.A. with U.S. and foreign parts
POST https://quickchart.io/chart/create
Content-Type: application/json

{
  "version": "4",
  "format": "png",
  "width": 900,
  "height": 500,
  "devicePixelRatio": 2,
  "chart": {
    "type": "bar",
    "data": {
      "labels": ["Feature A", "Feature B", "Feature C"],
      "datasets": [
        {"label": "Product 1", "data": [12, 19, 7]},
        {"label": "Product 2", "data": [15, 14, 10]}
      ]
    }
  }
}

QuickChart documents the JSON POST form and the available rendering controls at https://quickchart.io/documentation/usage/post-request/. Confirm the endpoint and request requirements in the current documentation when implementing a client.

Set image size, format, and rendering version

Specify the output to suit its destination instead of accepting defaults. QuickChart documents 500 × 300 as the default size, and offers width, height, device-pixel ratio, background color, Chart.js version, and format controls. Its documented output formats include PNG, JPG/JPEG, WebP, SVG, PDF, and base64.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
Control How to use it
width and height Set the image’s dimensions in pixels to fit the report, email, or other destination.
devicePixelRatio Adjust the rendering pixel ratio when you need a sharper image at a given displayed size.
backgroundColor Choose a background that works with the destination; a transparent background may be useful where supported by the selected format.
version Choose a Chart.js major version compatible with your configuration. QuickChart documents versions 2, 3, and 4; its default is the older v2 line.
format Select a format accepted by your destination, such as PNG, JPEG, WebP, SVG, PDF, or base64.

Version choice matters because a configuration written for one Chart.js generation may not behave as expected under another. Set it explicitly and test the resulting image when upgrading or using options associated with a particular version. QuickChart’s documented URL controls are described at https://quickchart.io/documentation/usage/parameters/.

Runnable examples in common languages

JavaScript in Node.js: download the GET response

This Node.js example requests the image and saves it as a PNG. It uses the same short configuration as above and encodes the chart JSON for the query parameter.

import { writeFile } from 'node:fs/promises';

const chart = {
  type: 'bar',
  data: {
    labels: ['Feature A', 'Feature B', 'Feature C'],
    datasets: [
      { label: 'Product 1', data: [12, 19, 7] },
      { label: 'Product 2', data: [15, 14, 10] }
    ]
  }
};

const params = new URLSearchParams({
  width: '900',
  height: '500',
  format: 'png',
  version: '4',
  c: JSON.stringify(chart)
});

const response = await fetch(`https://quickchart.io/chart?${params}`);
if (!response.ok) {
  throw new Error(`QuickChart request failed: ${response.status} ${response.statusText}`);
}

await writeFile('comparison.png', Buffer.from(await response.arrayBuffer()));

For long or elaborate charts, switch to the POST method documented by QuickChart rather than extending the GET URL indefinitely.

Rank #3
Mead Spiral Notebook, 1 Subject, Graph Ruled Paper, 7-1/2" x 10-1/2", 100 Sheets, Green (05676AC5)
  • 1 subject notebook comes with 100 graph ruled, double-sided sheets with 5 squares per inch
  • Sheets measure 7-1/2" x 10-1/2" when torn out with an overall size of 8" x 10-1/2". Perforation easily tears out with clean edges.
  • Graph ruling is ideal for plotting graphs, drawing curves and more. Notebook is 3-hole punched to store in your favorite binder.
  • Covers are coated for durability and have writable label on front cover. Available in Green.
  • Assembled in U.S.A. with U.S. and foreign parts

Python: request and save a PNG

Install the HTTP client with python -m pip install requests, then run this script. It checks for an HTTP error before writing the response body.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
import json
import requests

chart = {
    "type": "bar",
    "data": {
        "labels": ["Feature A", "Feature B", "Feature C"],
        "datasets": [
            {"label": "Product 1", "data": [12, 19, 7]},
            {"label": "Product 2", "data": [15, 14, 10]},
        ],
    },
}

response = requests.get(
    "https://quickchart.io/chart",
    params={
        "width": 900,
        "height": 500,
        "format": "png",
        "version": 4,
        "c": json.dumps(chart),
    },
    timeout=30,
)
response.raise_for_status()

with open("comparison.png", "wb") as image_file:
    image_file.write(response.content)

For a complex configuration, use a POST request with the JSON body shape shown above; the response content is still the image data to save.

cURL: save a chart response

For a short configuration, cURL’s --get and URL-encoding options build a GET request without manually encoding the JSON.

curl --get 'https://quickchart.io/chart' 
  --data-urlencode 'width=900' 
  --data-urlencode 'height=500' 
  --data-urlencode 'format=png' 
  --data-urlencode 'version=4' 
  --data-urlencode 'c={"type":"bar","data":{"labels":["Feature A","Feature B","Feature C"],"datasets":[{"label":"Product 1","data":[12,19,7]},{"label":"Product 2","data":[15,14,10]}]}}' 
  --output comparison.png

For a large chart definition, create a JSON request body and use the documented POST interface. That is easier to maintain and avoids a long encoded URL.

Embed or distribute the resulting image

After rendering, you can use the image bytes in an application or make a chart URL available to a destination that can load it. For example, a webpage can point an image element at a generated chart URL:

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
Rank #4
Five Star Spiral Notebook + Study App, 1 Subject, Graph Ruled Paper, 8-1/2" x 11", 100 Sheets, Fights Ink Bleed, Water Resistant Cover, Tidewater Blue (06190AA4)
  • LASTS ALL YEAR. GUARANTEED!* Water resistant covers protect your notes all year.
  • High-quality paper resists ink bleed** so notes stay clear and legible. Notebook has 100 graph ruled sheets, 4 squares per inch.
  • Includes storage pocket to hold loose sheets from the notebook. Patented, reinforced storage pocket helps prevent tears.***
  • Spiral Lock wire prevents coil snags so it won’t get caught on your clothes or backpack. The Neat Sheet perforated pages easily tear out with clean edges.
  • Perforated sheets measure 11" x 8-1/2" when torn out. Overall size of 11" x 9 1/8". Available in Teal.
<img src="YOUR_ENCODED_QUICKCHART_URL" alt="Comparison of Product 1 and Product 2 across three features">

Write useful alternative text that communicates what the chart compares; do not rely on color or the image alone to convey the point. For email and other constrained clients, a static PNG or JPEG is a practical compatibility choice. If the chart contains private or sensitive values, review the provider’s data-handling terms and avoid exposing credentials or confidential data in a publicly accessible URL.

Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Limits, authentication, and production checks

Payload and label limits

QuickChart documents free-request limits of 200,000 characters for the request string and 250 entries in a label array; its authenticated limits are 1,500 label entries. These are provider-documented limits, not a guarantee that a very large chart will be readable or fast to render. Check the current limits before designing around large requests: https://quickchart.io/documentation/limits/.

Keep credentials out of public code

QuickChart documents API-key parameters, server-side use, and signed URLs for untrusted clients. Treat an API key as a secret: keep it in server-side configuration rather than frontend JavaScript or a public repository. When a URL must be distributed to a client you do not trust, review the documented signed-URL approach and avoid placing secrets in a link that can be copied or logged. See https://quickchart.io/documentation/usage/advanced/.

Licensing and service expectations

QuickChart states that its implementation is dual licensed under GNU AGPLv3 and a commercial license, and that generated images may be used for any purpose. If you distribute or host software using its implementation, read the current licensing terms and determine which license applies to your use: https://quickchart.io/license/. For a production dependency, establish your own latency and availability requirements and check the provider’s current terms; do not infer a service-level commitment from a chart-rendering API example.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

QuickChart’s homepage currently claims more than 4 billion charts rendered (accessed September 29, 2026). That is a provider-reported cumulative figure, not a measure of latency, uptime, or suitability for a particular workload: https://quickchart.io/.

Best Value
SUNEE Spiral Notebook, 1-Subject, Graph Ruled Paper, 8" x 10-1/2", 100 Sheets per Notebook, 3-Hole Punched Paper, Water Resistant Cover, Spiral Grid Notebooks for Work, Home, School, Writing, Black
  • SUNEE 1 SUBJECT NOTEBOOK: Single subject spiral notebook with 100 sheets/200 Pages of graph paper, you'll have plenty of space for notes and assignments. Get the best value with our graph paper notebook and stay organized.
  • GRAPH NOTEBOOK: Each 8" x 10-1/2" grid notebook features 100 double-sided sheets with red margin lines and is 3-hole punched, easily transfer to your favorite binder. It's the ideal grid paper notebook for all your academic and professional needs.
  • 3-HOLE PUNCHED DESIGN: Designed with 3-hole punched graph paper, this math notebook integrates seamlessly into standard binders; Perfect for who need to keep their notes organized in one place, notebook grid clutter in your study or work area.
  • CLEAN TEAR-OUT: Micro-perforated pages ensure a neat tear-out, leaving you with 10 1/2" x 7 1/2" sheets. Accommodates double-sided writing. Sunee graph paper spiral notebook offers premium quality at an affordable price. A graphing notebook is perfect for students, teachers, and professionals.
  • DURABLE & FUNCTIONAL DESIGN: Water-resistant plastic cover provides extra protection, making this spiral graph paper notebook ideal for on-the-go, frequent transfers in and out of backpacks, briefcases, and vehicles. The double-sided pockets are great for storing loose papers and handouts, making this one subject graph spiral notebook a practical choice for students and professionals.

Troubleshoot common failures

  • The request returns an error or no usable image: inspect the HTTP status and response body before writing the result to a file. Confirm that the request endpoint, method, and parameter names match the current API documentation.
  • The chart is missing labels or values: check that each dataset has the intended number of values for the labels and that the JSON is valid.
  • The chart renders differently than expected: set the Chart.js version explicitly and verify that the configuration uses syntax supported by that major version.
  • The GET URL is too long or malformed: URL-encode the configuration; if it is large or complicated, send it in a JSON POST body instead.
  • The image is blurry or clipped in its destination: set width, height, and device-pixel ratio for the actual display size, then render again and inspect it in the target context.
  • The downloaded file is not a valid image: ensure the response is successful before saving its body. An error response saved with a .png extension is still an error response, not a chart.
  • An authenticated request leaks a key: move the request to a server-side component, rotate exposed credentials, and use documented signed URLs where the client should receive access without the secret.

Or skip the browser setup

If you need a screenshot of a webpage rather than a graph rendered from chart data, ScreenshotNeo is a website screenshot API and MCP server for developers. It uses one GET request to return a PNG, JPEG, WebP, or PDF. Its browser workflow can accept cookie or consent banners like a visitor and remove more than 60 known consent platforms, newsletter popups, and chat widgets before capture; each step can be turned off. Bot checks and CAPTCHAs, blank pages, timeouts, failed loads, and cache hits cost nothing, with the page verdict and billing status reported in response headers. Its MCP server provides take_screenshot, get_page_info, and capture_pdf tools for AI agents using Claude, Cursor, or another MCP client.

Example request (replace the target URL and use your API key):

curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://stripe.com -o shot.webp

See the ScreenshotNeo API documentation for request details. The free plan includes 1,000 screenshots per month with no card; paid plans start at $5 for 3,000. Sign up for 1,000 free screenshots a month, with no card.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Frequently Asked Questions

Can I use a chart image in an email?

Yes. A static image can be embedded in an email; choose dimensions and a format supported by your email workflow, and provide descriptive alt text.

Is a screenshot API the same as a chart-image API?

No. A chart-image API turns structured chart data into a graph. A screenshot API captures a webpage or other rendered page.

Quick Recap

Bestseller No. 1
Five Star Spiral Notebook + Study App, 1 Subject, Graph Ruled Paper, 8-1/2' x 11', 100 Sheets, Fights Ink Bleed, Water Resistant Cover, Black (73679)
Five Star Spiral Notebook + Study App, 1 Subject, Graph Ruled Paper, 8-1/2" x 11", 100 Sheets, Fights Ink Bleed, Water Resistant Cover, Black (73679)
Ideal for graphing, charts and engineering projects.; 1-subject notebook. 100 double-sided, graph ruled sheets. 4 squares per inch.
$6.00
Bestseller No. 2
Mead Spiral Notebook, 1 Subject, Graph Ruled Paper, 7-1/2' x 10-1/2', 100 Sheets, Black (05676AA5)
Mead Spiral Notebook, 1 Subject, Graph Ruled Paper, 7-1/2" x 10-1/2", 100 Sheets, Black (05676AA5)
1 subject notebook comes with 100 graph ruled, double-sided sheets with 5 squares per inch
$5.00
Bestseller No. 3
Mead Spiral Notebook, 1 Subject, Graph Ruled Paper, 7-1/2' x 10-1/2', 100 Sheets, Green (05676AC5)
Mead Spiral Notebook, 1 Subject, Graph Ruled Paper, 7-1/2" x 10-1/2", 100 Sheets, Green (05676AC5)
1 subject notebook comes with 100 graph ruled, double-sided sheets with 5 squares per inch
$5.00

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.