Generate QR instantly
Drop in a payload, pick PNG or SVG, and we return a production-ready asset with caching headers.
Open /api/qrcodeTest the QR Code API in real-time. Change parameters and see instant results.
Enter content to generate QR code
Developer docs
Generate PNG/SVG QR codes or decode existing graphics via HTTPS, no API key required. Every request stays on QRCodeCat infrastructure, making it easy to embed in scripts, nocode tools, and backend jobs.
Drop in a payload, pick PNG or SVG, and we return a production-ready asset with caching headers.
Open /api/qrcodePoint us at a PNG/JPG or upload it directly—responses land in the goqr JSON schema.
Try /api/read-qr-codeMonitor uptime, current deployments, and maintenance windows from our public status page.
View status dashboardNeed higher quotas or EU-only routing? Drop us a note and reference your X-Request-ID.
Email [email protected]GET or POST
https://qrcodecat.com/api/qrcode
GET or POST
https://qrcodecat.com/api/read-qr-code
QRCodeCat runs a stateless HTTPS API with no sign-up or quotas. We log referrers/IPs for abuse detection but never persist QR payloads. Reach out if you plan to exceed 10k requests/day so we can allocate bandwidth accordingly.
For production usage, host the generated files on your CDN after the first call to minimize latency. All processing happens on our own infrastructure—there are zero calls to third-party QR services.
curl "https://qrcodecat.com/api/qrcode?size=150x150&data=Hello+QRCodeCat" \
--output hello.pngcurl "https://qrcodecat.com/api/read-qr-code/?fileurl=https%3A%2F%2Fqrcodecat.com%2Fapi%2Fqrcode%3Fdata%3DHelloWorld"Responses are cacheable for one hour. Invalid inputs return JSON/XML errors with HTTP 400.
Drop these snippets directly into backend jobs, Zapier webhooks, or CI scripts. They mirror the same endpoints, so you can mix and match languages without touching API keys.
Python (requests)
Uploads Wi-Fi payloads and saves the PNG response locally with automatic retries.
import requests
payload = {
"data": "WIFI:T:WPA;S:CatCafe;P:Coffee123;;",
"size": "420",
"format": "png"
}
response = requests.post("https://qrcodecat.com/api/qrcode", json=payload, timeout=10)
response.raise_for_status()
with open("wifi.png", "wb") as fh:
fh.write(response.content)Node.js (fetch)
Generates SVG output from an async job and logs the XML string.
import fetch from 'node-fetch';
async function run() {
const res = await fetch('https://qrcodecat.com/api/qrcode', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
data: 'https://status.qrcodecat.com/api',
format: 'svg',
color: '0f172a',
}),
});
if (!res.ok) {
console.error('API error', await res.text());
return;
}
const svg = await res.text();
console.log(svg.substring(0, 120) + '...');
}
run();PHP (cURL)
POSTs JSON with logos/colors applied and streams the binary response to disk.
<?php
$payload = json_encode([
'data' => 'https://qrcodecat.com/qr-api',
'color' => '111827',
'bgcolor' => 'ffffff',
'margin' => 2
]);
$ch = curl_init('https://qrcodecat.com/api/qrcode');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_POSTFIELDS => $payload,
CURLOPT_RETURNTRANSFER => true,
]);
$image = curl_exec($ch);
curl_close($ch);
file_put_contents('landing.png', $image);
?>Go (net/http)
Uses the reader endpoint to decode an existing QR stored on S3.
package main
import (
"encoding/json"
"fmt"
"net/http"
)
type symbol struct {
Data string `json:"data"`
}
type qrResponse struct {
Symbol []symbol `json:"symbol"`
}
func main() {
url := "https://qrcodecat.com/api/read-qr-code?fileurl=" +
"https%3A%2F%2Fcdn.example.com%2Fqr.png"
resp, err := http.Get(url)
if err != nil {
panic(err)
}
defer resp.Body.Close()
var payload []qrResponse
if err := json.NewDecoder(resp.Body).Decode(&payload); err != nil {
panic(err)
}
fmt.Println(payload[0].Symbol[0].Data)
}Java (HttpClient)
Streams an SVG from the generator endpoint and inspects HTTP headers.
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Demo {
public static void main(String[] args) throws Exception {
var client = HttpClient.newHttpClient();
var request = HttpRequest.newBuilder()
.uri(URI.create("https://qrcodecat.com/api/qrcode"))
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString("{"data":"Hello devs","format":"svg"}"))
.build();
var response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.headers().firstValue("content-type"));
System.out.println(response.body());
}
}Accepts classic create-qr-code parameters over GET or POST so you can generate images from any HTTP client.
| Parameter | Default | Description |
|---|---|---|
datarequired | — | Text/URL/payload you want encoded. URL-encode for GET requests. |
size | 360 | Square size in px. Accepts 300 or 300x300, clamped 64–1200. |
format | png | png or svg image output. |
ecc | M | QR error correction level (L, M, Q, H). |
margin | 4 | Quiet zone in px (0–32). |
color | #0f172a | Foreground color hex (FF3366, 0f0, etc.). |
bgcolor | #ffffff | Background color hex. |
filename | qrcodecat | Used for download filenames when download=1. |
download | false | Set to 1/true to add Content-Disposition headers. |
curl -X POST https://qrcodecat.com/api/qrcode \
-H 'Content-Type: application/json' \
-d '{
"data": "WIFI:T:WPA;S:CatCafe;P:Coffee123;H:false;;",
"format": "svg",
"color": "ff3366"
}' \
--output wifi.svgDecodes uploaded or remote images to JSON/XML so downstream systems can extract the embedded text.
| Parameter | Default | Description |
|---|---|---|
fileurlrequired | — | URL-encoded HTTP/HTTPS link to PNG, JPG, or GIF ≤1 MiB. Ignored when uploading file. |
file | — | Multipart/form-data upload field (POST only) containing the QR image ≤1 MiB. |
outputformat | json | json or xml to match the response schema documented below. |
curl -X POST https://qrcodecat.com/api/read-qr-code/ \
-F "file=@./qr.png" \
-F "outputformat=xml"JSON response matches goqr\'s structure: [{ "type": "qrcode", "symbol": [{"seq":0,"data":"...","error":null}] }]. XML requests wrap the payload in<barcodes> and place decoded text inside CDATA blocks.
Every response includes an X-Request-ID header to speed up debugging. When errors surface, cross-check the HTTP status below and keep a short retry/backoff policy in place for transient 5xx events.
| Status | Trigger | Resolution |
|---|---|---|
| 400 Bad Request | Missing data/fileurl, malformed hex colors, or unsupported format | Validate the payload locally and ensure data is URL-encoded or POSTed as UTF-8 JSON. |
| 401 Unauthorized | Only returned if the request is routed through an allow-listed partner proxy with expired credentials. | Remove stale Authorization headers; the public API never requires an API key. |
| 413 Payload Too Large | Uploads above 1 MiB or POST bodies exceeding 32 KiB for SVG. | Compress the source image or host it remotely and pass fileurl so we fetch it server-side. |
| 415 Unsupported Media Type | Non-JSON POST bodies or XML without proper Content-Type headers. | Send application/json (for JSON) or multipart/form-data (for uploads). |
| 429 Too Many Requests | Burst traffic above 50 requests/second from a single IP. | Back off for 30 seconds or email [email protected] so we can allocate additional worker pods. |
| 500 Internal Server Error | Unexpected barcode libraries errors or timeouts fetching remote fileurl targets. | Retry with exponential backoff; include the X-Request-ID header when contacting support. |
{
"error": {
"code": 400,
"message": "Missing data parameter",
"hint": "Add data=Hello+World or POST a JSON body",
"requestId": "3c7f7d18"
}
}QRCodeCat runs on edge containers with regional failover. We publish live metrics on status.qrcodecat.com, but the table below lists the most common SRE checkpoints our customers ask about.
| Metric | Value | Notes |
|---|---|---|
| P95 response time (NA/EU) | < 180 ms | Measured on generator endpoint with 360px PNG outputs. |
| Uptime (rolling 90d) | 99.97% | Backed by dual-region workers with global DNS failover. |
| Cold-start penalty | < 20 ms | Workers stay warm through synthetic health checks every 60s. |
| Daily free throughput | 10k+ requests | Soft limit; reach out for higher sustained usage. |
| Max burst rate | 50 req/sec/IP | Contact us for dedicated rate pools if you exceed bursts. |
Provide the text that should live inside the QR code. URL-encode content for GET requests or send it via POST to avoid encoding quirks. You can push a few thousand characters, but smaller payloads scan faster.
Best practice: Shorten URLs or move bulky metadata into landing pages so you can stay under ~900 characters for legacy scanners.
Square dimensions in pixels (PNG/JPG) or logical units (SVG). Use 64–1200 for raster output; vector exports can scale infinitely.
Example: size=600x600
Assume UTF-8 for modern payloads. If you POST Latin-1 bytes, set charset-source=ISO-8859-1 so we decode the body correctly before re-encoding to UTF-8.
Controls how the data itself is encoded prior to QR rendering. We default to UTF-8. Switching to ISO-8859-1 mirrors old QR readers but limits character coverage.
L, M, Q, or H. Higher redundancy preserves data when the code gets scuffed but increases pixel density.
Best practice: Use L for short-lived indoor prints, bump to Q/H if your code may suffer scratches or overlays.
Accepts 3- or 6-character hex (with or without #). Keep it darker than the background so scanners maintain contrast.
Same syntax as color. Default white. Aim for high contrast between color and bgcolor for reliable scans.
Pixel margin (0–32) around the QR. We add it inside the requested size so you retain the same outer dimension.
Quiet zone expressed in modules. Equivalent to margin but in multiples of a QR pixel. Works best when set to 4 for print.
Choose png or svg. PNG is ideal for web and quick shares; SVG remains infinitely scalable for print production.
Outputs intentionally mirror the classic goqr/zxing schema so your monitoring and parsing layers can be reused. Use the snippets below to verify status codes, headers, and payload structure in your integration tests.
Binary responses arrive with cache headers so you can persist them to your own CDN.
HTTP/2 200 OK
Content-Type: image/png
Cache-Control: public, max-age=3600
X-Request-ID: 8d4c2e5a
...binary data...Matches zxing/goqr conventions so downstream tooling can reuse the same parsing logic.
HTTP/2 200 OK
Content-Type: application/json; charset=utf-8
{
"type": "qrcode",
"symbol": [
{
"seq": 0,
"data": "https://demo.qrcodecat.com",
"error": null,
"format": "UTF-8"
}
]
}XML variants wrap payloads inside <barcodes>; CDATA ensures UTF-8 text stays intact.
HTTP/2 400 Bad Request
Content-Type: application/xml
<barcodes>
<error code="400" request-id="8d4c2e5a">
<![CDATA[ fileurl must be http(s) ]]>
</error>
</barcodes>| Header | Behavior |
|---|---|
Content-Type | image/png, image/svg+xml, application/json, or application/xml depending on endpoint. |
Cache-Control | public, max-age=3600 for generator outputs to encourage CDN caching. |
X-Request-ID | Unique ID per request—include it when emailing support for traces. |
X-Worker-Region | Region code (iad, fra, sin) returned on enterprise plans for compliance logging. |
Content-Disposition | Injected when download=1 so browsers prompt to save the file. |
Pro tip: Prefer POST + JSON to avoid query-string limits when merging personalized text.
Pro tip: Enable error catching around the HTTP module so Make.com automatically retries transient 5xx responses.
const FOLDER_ID = 'YOUR_DRIVE_FOLDER_ID';
function GENERATE_QR(value) {
const url = 'https://qrcodecat.com/api/qrcode';
const payload = {
data: value,
size: '360',
format: 'png'
};
const response = UrlFetchApp.fetch(url, {
method: 'post',
contentType: 'application/json',
payload: JSON.stringify(payload),
muteHttpExceptions: true,
});
if (response.getResponseCode() !== 200) {
throw new Error(response.getContentText());
}
const folder = DriveApp.getFolderById(FOLDER_ID);
const file = folder.createFile(response.getBlob()).setName('qr-' + new Date().getTime() + '.png');
file.setSharing(DriveApp.Access.ANYONE_WITH_LINK, DriveApp.Permission.VIEW);
return file.getUrl();
}Pro tip: Apps Script enforces a 6-minute runtime; batch operations should chunk rows (max 50) per invocation.
We do not throttle by default. If your automation expects more than 10k calls per day, send a quick note to [email protected] so we can provision bandwidth ahead of time.
No. The generator and reader endpoints are open—just call them over HTTPS.
PNG (<1200px) and SVG (vector). If you need PDF, run the PNG through your print workflow; the QR payload stays the same.
Yes—CORS is enabled for https://*.qrcodecat.com. For external domains, proxy through your backend to keep bandwidth predictable.
No. We inspect metadata (IP, referrer) strictly for abuse prevention. Payloads are processed in-memory and discarded immediately after the response is streamed back.
Make the first call to QRCodeCat, then persist the PNG/SVG in your storage bucket. Our cache headers allow you to re-serve the same asset without re-generating every time.
The reader endpoint returns the first valid symbol today. Multi-QR decoding is on our roadmap; for now, crop each code or call the endpoint per symbol.
Yes—use charset-source and charset-target parameters to map Latin-1 or Shift_JIS payloads into UTF-8 before rendering.
Absolutely. Agencies, SaaS tools, and enterprise teams embed this API in production. Drop us a note if you need DPAs or custom SLAs.
Email [email protected] with the X-Request-ID header. We answer most tickets within one business day.
Generate campaign-specific QR codes with UTM tags, drop them into HubSpot/Marketo assets, and source scans by channel without logging into another tool.
Bake QR creation into ERP workflows to label parts, pallets, or on-prem kiosks. Pair with our decoder to verify inventory stickers after printing.
Keep a simple POST /api/qrcode inside your property management scripts to refresh guest Wi-Fi posters every time passwords rotate.
Add QR export buttons to CI dashboards, internal design systems, or CLI tools knowing the response structure mirrors well-known QR APIs.
Issue single-use QR codes for concerts or conferences, then validate entry by decoding the payload server-side to prevent forgery.
Attach scannable troubleshooting trees to hardware shipments so field teams can access docs even when offline.
Schools embed QR stickers on library books or lab equipment. Nonprofits print donation QR codes that update landing pages without reprinting.
Print order-specific QR codes with loyalty URLs so unboxing experiences feel personalized and measurable.
Browse our QR guides for print sizing advice, or explore task-based generators if you prefer a UI. When you are ready to embed everything, the API is waiting for you—no keys, no rate limits, just HTTPS requests.