HonestQR API v1

Crea códigos QR y consulta estadísticas de escaneo mediante programación. Obtén una API key en el panel (sección de claves API) y pásala como token Bearer.

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

Autenticación: Authorization: Bearer hqr_…

Límite de tasa: 60 solicitudes por minuto por API key (HTTP 429 al superarlo).

Renderizar un código QR estático

GET /api/v1/static — devuelve la imagen directamente. No se almacena nada; los códigos estáticos nunca caducan. Parámetros: data (obligatorio, máx. 2048 caracteres), format (png por defecto o svg), size (px, 128–4096, por defecto 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

Crear un código QR dinámico

POST /api/v1/qrcodes — crea un enlace corto editable (https://qr.zalize.com/r/<slug>) y devuelve las URLs de imagen. Campos del body: target_url (obligatorio), name, folder. El plan gratuito incluye 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"
}

Ejemplo en JavaScript

Funciona en Node.js 18+ y cualquier runtime con fetch (Workers, Deno, Bun; navegadores solo mediante un proxy de backend — nunca envíes tu clave al 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);

Ejemplo en 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"])

Descargar la imagen de un código dinámico

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

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

Listar tus códigos QR

GET /api/v1/qrcodes

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

Estadísticas de escaneo

GET /api/v1/qrcodes/:id/stats — totales más desgloses por día (últimos 30 días), país y dispositivo.

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

Errores

Todos los errores son JSON: {"error": "…"}.

EstadoSignificadoQué hacer
400Solicitud no válida (parámetro ausente o inválido)Revisa el mensaje error y corrige el parámetro.
401API key ausente o no válidaEnvía Authorization: Bearer hqr_…; regenera la clave en el panel si fue revocada.
402Límite del plan alcanzado (plan gratis: 3 códigos dinámicos)Elimina códigos sin uso o pasa a Pro.
404Código QR no encontrado (o pertenece a otra cuenta)Verifica el id con GET /api/v1/qrcodes.
429Límite de tasa (60 solicitudes/minuto por clave)Espera un minuto y reintenta; agrupa las lecturas cuando sea posible.

¿Prefieres una integración sin código?

También puedes poner el generador completo en tu propio sitio como widget integrable gratuito — un snippet, sin API key.

¿Usas un agente de IA?

HonestQR también ofrece un servidor MCP gratuito para que Claude, Cursor y otros clientes MCP generen y decodifiquen códigos QR directamente — sin API key.