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_key400 invalid_body— quasi sempre un URL che non lo è.402 plan_limit_reached429 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.