HonestQR API v1

Crie códigos QR e leia estatísticas de escaneamento programaticamente. Obtenha uma API key no painel (seção de chaves API) e envie-a como token Bearer.

URL base: https://qr.zalize.com

Autenticação: Authorization: Bearer hqr_…

Limite de requisições: 60 requisições por minuto por API key (HTTP 429 ao exceder).

Renderizar um código QR estático

GET /api/v1/static — retorna a imagem diretamente. Nada é armazenado; códigos estáticos nunca expiram. Parâmetros: data (obrigatório, máx. 2048 caracteres), format (png padrão ou svg), size (px, 128–4096, padrão 1024).

curl -H "Authorization: Bearer $HONESTQR_KEY" \
  "https://qr.zalize.com/api/v1/static?data=https%3A%2F%2Fexample.com&format=png&size=1024" \
  -o qr.png

curl -H "Authorization: Bearer $HONESTQR_KEY" \
  "https://qr.zalize.com/api/v1/static?data=https%3A%2F%2Fexample.com&format=svg" \
  -o qr.svg

Criar um código QR dinâmico

POST /api/v1/qrcodes — cria um link curto editável (https://qr.zalize.com/r/<slug>) e retorna as URLs de imagem. Campos do body: target_url (obrigatório), name, folder. O plano grátis inclui 3 códigos dinâmicos.

curl -X POST https://qr.zalize.com/api/v1/qrcodes \
  -H "Authorization: Bearer $HONESTQR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"target_url": "https://example.com/menu", "name": "Menu"}'
{
  "qrcode": { "id": "…", "slug": "abc1234", "short_url": "https://qr.zalize.com/r/abc1234", … },
  "image_png": "https://qr.zalize.com/api/v1/qrcodes/<id>/image?format=png",
  "image_svg": "https://qr.zalize.com/api/v1/qrcodes/<id>/image?format=svg"
}

Exemplo em JavaScript

Funciona no Node.js 18+ e em qualquer runtime com fetch (Workers, Deno, Bun; navegadores apenas via proxy de backend — nunca envie sua chave ao cliente).

const BASE = 'https://qr.zalize.com';
const headers = {
  Authorization: `Bearer ${process.env.HONESTQR_KEY}`,
  'Content-Type': 'application/json',
};

// Create a dynamic code
const res = await fetch(`${BASE}/api/v1/qrcodes`, {
  method: 'POST',
  headers,
  body: JSON.stringify({ target_url: 'https://example.com/menu', name: 'Menu' }),
});
if (!res.ok) throw new Error(`HonestQR ${res.status}: ${(await res.json()).error}`);
const { qrcode } = await res.json();

// Fetch its stats later
const stats = await (await fetch(`${BASE}/api/v1/qrcodes/${qrcode.id}/stats`, { headers })).json();
console.log(qrcode.short_url, stats.total);

Exemplo em Python

import os, requests

BASE = "https://qr.zalize.com"
HEADERS = {"Authorization": f"Bearer {os.environ['HONESTQR_KEY']}"}

# Render a static QR code (never stored, never expires)
png = requests.get(
    f"{BASE}/api/v1/static",
    params={"data": "https://example.com", "format": "png", "size": 1024},
    headers=HEADERS,
)
png.raise_for_status()
open("qr.png", "wb").write(png.content)

# Create a dynamic code
r = requests.post(
    f"{BASE}/api/v1/qrcodes",
    json={"target_url": "https://example.com/menu", "name": "Menu"},
    headers=HEADERS,
)
r.raise_for_status()
print(r.json()["qrcode"]["short_url"])

Baixar a imagem de um código dinâmico

GET /api/v1/qrcodes/:id/image — parâmetros format (png/svg) e size.

curl -H "Authorization: Bearer $HONESTQR_KEY" \
  "https://qr.zalize.com/api/v1/qrcodes/<id>/image?format=svg" -o menu.svg

Listar seus códigos QR

GET /api/v1/qrcodes

curl -H "Authorization: Bearer $HONESTQR_KEY" https://qr.zalize.com/api/v1/qrcodes

Estatísticas de escaneamento

GET /api/v1/qrcodes/:id/stats — totais e detalhamento por dia (últimos 30 dias), país e dispositivo.

curl -H "Authorization: Bearer $HONESTQR_KEY" https://qr.zalize.com/api/v1/qrcodes/<id>/stats

Erros

Todos os erros são JSON: {"error": "…"}.

StatusSignificadoO que fazer
400Requisição inválida (parâmetro ausente/inválido)Verifique a mensagem error; corrija o parâmetro.
401API key ausente ou inválidaEnvie Authorization: Bearer hqr_…; gere a chave novamente no painel se foi revogada.
402Limite do plano atingido (plano grátis: 3 códigos dinâmicos)Exclua códigos sem uso ou faça upgrade para o Pro.
404Código QR não encontrado (ou pertence a outra conta)Confira o id com GET /api/v1/qrcodes.
429Limite de requisições (60/minuto por chave)Aguarde um minuto e tente de novo; agrupe leituras quando possível.

Prefere incorporar sem código?

Você também pode colocar o gerador completo no seu próprio site como um widget incorporável gratuito — um snippet, sem API key.

Usando um agente de IA?

O HonestQR também oferece um servidor MCP gratuito para que Claude, Cursor e outros clientes MCP gerem e decodifiquem códigos QR diretamente — sem API key.