Download a rendered QR image
curl --request POST \
--url https://api.scanova.io/qr/download/ \
--header 'Authorization: <api-key>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "Summer Sale Landing",
"data": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0i...",
"size": 600
}
'import requests
url = "https://api.scanova.io/qr/download/"
payload = {
"name": "Summer Sale Landing",
"data": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0i...",
"size": 600
}
headers = {
"Authorization": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'Summer Sale Landing',
data: 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0i...',
size: 600
})
};
fetch('https://api.scanova.io/qr/download/', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.scanova.io/qr/download/",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'name' => 'Summer Sale Landing',
'data' => 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0i...',
'size' => 600
]),
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.scanova.io/qr/download/"
payload := strings.NewReader("{\n \"name\": \"Summer Sale Landing\",\n \"data\": \"data:image/svg+xml;base64,PHN2ZyB4bWxucz0i...\",\n \"size\": 600\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.scanova.io/qr/download/")
.header("Authorization", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Summer Sale Landing\",\n \"data\": \"data:image/svg+xml;base64,PHN2ZyB4bWxucz0i...\",\n \"size\": 600\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.scanova.io/qr/download/")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"Summer Sale Landing\",\n \"data\": \"data:image/svg+xml;base64,PHN2ZyB4bWxucz0i...\",\n \"size\": 600\n}"
response = http.request(request)
puts response.read_bodyQR Code Management
Download QR Code (Printable)
Generate a print-optimized QR Code in black and white for professional printing. This endpoint ensures only black ink (CMYK: 0) is used, reducing printing costs and maintaining maximum scan contrast. Authentication required.
POST
/
qr
/
download
/
Download a rendered QR image
curl --request POST \
--url https://api.scanova.io/qr/download/ \
--header 'Authorization: <api-key>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "Summer Sale Landing",
"data": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0i...",
"size": 600
}
'import requests
url = "https://api.scanova.io/qr/download/"
payload = {
"name": "Summer Sale Landing",
"data": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0i...",
"size": 600
}
headers = {
"Authorization": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'Summer Sale Landing',
data: 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0i...',
size: 600
})
};
fetch('https://api.scanova.io/qr/download/', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.scanova.io/qr/download/",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'name' => 'Summer Sale Landing',
'data' => 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0i...',
'size' => 600
]),
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.scanova.io/qr/download/"
payload := strings.NewReader("{\n \"name\": \"Summer Sale Landing\",\n \"data\": \"data:image/svg+xml;base64,PHN2ZyB4bWxucz0i...\",\n \"size\": 600\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.scanova.io/qr/download/")
.header("Authorization", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Summer Sale Landing\",\n \"data\": \"data:image/svg+xml;base64,PHN2ZyB4bWxucz0i...\",\n \"size\": 600\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.scanova.io/qr/download/")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"Summer Sale Landing\",\n \"data\": \"data:image/svg+xml;base64,PHN2ZyB4bWxucz0i...\",\n \"size\": 600\n}"
response = http.request(request)
puts response.read_bodyDescription
This endpoint generates a high-quality, print-ready QR Code in PDF format, specifically designed for offset or laser printing.The output file is optimized for grayscale printing with strict CMYK color control (black only).
Request Parameters
Form Data (multipart/form-data)
| Name | Type | Required | Description |
|---|---|---|---|
qrid | string | ✅ | Unique QR Code ID (e.g., Q184ebe392f46414a) |
for_print | string | ✅ | Must be set to 'true' to enable printable mode |
name | string | No | Output filename for the downloaded PDF (e.g., qrCode.pdf) |
size | string | No | QR code size in pixels (range 300–600px, default 600) |
Notes
- The generated QR Code is vector-based (PDF) — ideal for professional printing.
- All colors are automatically converted to pure black (K:100) for print efficiency.
- The endpoint ignores any existing design styles — the QR is output in plain black and white for best scannability.
- Minimum size: 300 pixels; Maximum size: 600 pixels
- Default size: 600×600 pixels.
- File output type:
application/pdf.Request Body (Form Data)
Examples
Download Printable QR Code (Default Size)
curl -X POST "https://management.scanova.io/qr/download/" \
-H "Authorization: YOUR_API_KEY" \
-F "qrid=Q184ebe392f46414a" \
-F "for_print=true" \
-F "name=qrCode.pdf"
Download Printable QR Code (Custom Size)
# Download 400px printable QR code
curl -X POST "https://management.scanova.io/qr/download/" \
-H "Authorization: YOUR_API_KEY" \
-F "qrid=Q184ebe392f46414a" \
-F "for_print=true" \
-F "size=400" \
-F "name=qrCode-400px.pdf"
# Download 300px printable QR code
curl -X POST "https://management.scanova.io/qr/download/" \
-H "Authorization: YOUR_API_KEY" \
-F "qrid=Q184ebe392f46414a" \
-F "for_print=true" \
-F "size=300" \
-F "name=qrCode-300px.pdf"
Download with Different File Names
# Business card QR code
curl -X POST "https://management.scanova.io/qr/download/" \
-H "Authorization: YOUR_API_KEY" \
-F "qrid=Q184ebe392f46414a" \
-F "for_print=true" \
-F "size=300" \
-F "name=business-card-qr.pdf"
# Poster QR code
curl -X POST "https://management.scanova.io/qr/download/" \
-H "Authorization: YOUR_API_KEY" \
-F "qrid=Q184ebe392f46414a" \
-F "for_print=true" \
-F "size=600" \
-F "name=poster-qr.pdf"
Error Handling
Invalid Size Parameter
If the size parameter is outside the allowed range (300-600), the API will return an error:{
"error": "Invalid size parameter",
"message": "Size must be between 300 and 600 pixels for printable format"
}
QR Code Not Found
If the QR code ID doesn’t exist:{
"error": "Not found",
"message": "QR code not found"
}
Missing Required Parameters
Iffor_print is not set to “true”:
{
"error": "Invalid parameter",
"message": "for_print must be set to true for printable format"
}
Best Practices
- ✅ Use
for_print=trueonly when generating files for offset or large-format printing. - ✅ Maintain high resolution (≥400px) for print clarity.
- ⚠️ Avoid applying design layers or colors — print mode always outputs black-only QR codes.
- 💡 Include the
nameparameter to generate descriptive filenames for easy organization (e.g.,event-qr-print.pdf). - 🔒 Store API keys securely and restrict access to authorized systems only.
When to Use: Printable vs Standard Download
- Use
Standardfor digital applications where colors, frames, or logos are needed. - Use
Printablewhen you need a print-ready, high-contrast, black-only QR code for professional printing.
Authorizations
Send your Management API key as the raw value of the Authorization header — no "Bearer " or "Token " prefix, and no other characters. Example: Authorization: YOUR_API_KEY. A header containing more than one space-separated part is rejected outright. Requests also require the request's Host header to be the management API host (e.g. api.scanova.io) — the same key sent to the regular API host will not authenticate.
Response
The rendered file, as a binary attachment.
Was this page helpful?