Enqre

Dal team Enqre·Pubblicato il 16/08/2026

QR code dinamici da Python, Node e C#

Ognuno di questi linguaggi ha una buona libreria locale: qrcode per Python, node-qrcode per Node, QRCoder per .NET. Disegnano PNG e SVG offline, senza chiave, senza quota e senza costi — e per un codice la cui destinazione non cambia mai, questa è tutta la risposta.

L'API serve all'altra metà: un codice statico è la sua destinazione — l'URL sta nel disegno, e spostarla impone di ristampare tutto. Se ciò che generate verrà stampato, incollato su una macchina o legato a un record che sopravvivrà alla struttura di URL di quest'anno, il codice deve portare un indirizzo breve che controllate voi. È hosting, non disegno.

Creare un codice

Python

import os, requests

r = requests.post(
    "https://enqre.com/api/v1/qrcodes",
    headers={"Authorization": f"Bearer {os.environ['ENQRE_API_KEY']}"},
    json={
        "name": "Asset 4471 – service log",
        "url": "https://maint.example/assets/4471",
    },
    timeout=10,
)
r.raise_for_status()          # 4xx and 5xx become exceptions, not silence

code = r.json()["data"]
code["id"]        # store this against your record
code["shortUrl"]  # the address the QR image should encode

Node

const res = await fetch("https://enqre.com/api/v1/qrcodes", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.ENQRE_API_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    name: "Asset 4471 – service log",
    url: "https://maint.example/assets/4471",
  }),
});

// fetch does NOT throw on 4xx. Check the status or you will store undefined.
if (!res.ok) throw new Error(`enqre: ${res.status} ${await res.text()}`);

const { data: code } = await res.json();

Notate il controllo: fetch non fallisce su 402 né su 429; senza di esso salvate undefined.

C#

using var http = new HttpClient();
http.DefaultRequestHeaders.Authorization =
    new AuthenticationHeaderValue("Bearer", Environment.GetEnvironmentVariable("ENQRE_API_KEY"));

var payload = JsonContent.Create(new {
    name = "Asset 4471 – service log",
    url  = "https://maint.example/assets/4471",
});

var res = await http.PostAsync("https://enqre.com/api/v1/qrcodes", payload);
res.EnsureSuccessStatusCode();

using var doc = JsonDocument.Parse(await res.Content.ReadAsStringAsync());
var code = doc.RootElement.GetProperty("data");
var id       = code.GetProperty("id").GetString();
var shortUrl = code.GetProperty("shortUrl").GetString();

Spostare la destinazione

PATCH https://enqre.com/api/v1/qrcodes/{id}
Authorization: Bearer enq_…
Content-Type: application/json

{ "url": "https://maint.example/assets/4471/v2" }

Il codice stampato resta intatto; la scansione successiva va altrove.

Leggere le scansioni

GET /api/v1/qrcodes/{id}/scans risponde { total, data }, dalla più recente, fino a 1.000 record: ora, tipo di dispositivo, sistema, browser.

Nessuna identità e nessuna posizione: né città né paese.

Cosa fallirà davvero

  • 401 invalid_api_key
  • 400 invalid_body — quasi sempre un URL che non lo è.
  • 402 plan_limit_reached
  • 429 rate_limited — oltre 60 richieste al minuto.

Ogni linguaggio nasconde l'errore in modo diverso: requests tace senza raise_for_status, fetch rifiuta solo su errore di rete, HttpClient richiede EnsureSuccessStatusCode.

Due regole che valgono più del codice

Rendete idempotente la creazione. Due chiamate creano due codici.

Non stampate ciò che non avete riletto.

Quando non scrivere un'integrazione

Per qualche centinaio di codici una tantum, il caricamento CSV è più veloce di qualsiasi codice scriviate.

Risposte rapide

  • Migliore libreria? qrcode, node-qrcode, QRCoder.
  • L'API restituisce un'immagine? No, shortUrl.
  • Autenticazione? Authorization: Bearer enq_….
  • Limite? 60 al minuto.
  • Posizione nelle scansioni? No.
  • Modificabile dopo la stampa? È tutto il punto — PATCH.

Continua a leggere