genuine Verified product
The unit exists, is activated and this is the first scan. It is the only case where the buyer reads that the product is genuine.
Documentation
Everything below is running. If something is not here, it is because it does not exist yet.
The order of step 4 matters: activating before applying means a roll lost in transit carries units that do authenticate. Activate once the label is already on the product.
They scan the QR with the phone camera and a page opens in the browser. There is no app to install and no data is asked of them. The page weighs under 30 KB so it loads on a shop floor with one bar of signal.
genuine The unit exists, is activated and this is the first scan. It is the only case where the buyer reads that the product is genuine.
already_seen The unit is valid but someone scanned it already. The buyer is shown when and from which country that first scan happened, so they can judge for themselves: bought here, first scanned in another country three months ago — something happened.
recalled The batch has been recalled. It replaces any other message, even if the unit is perfectly legitimate. You switch it on from the panel and it takes effect on the next scan.
unverified Made-up code, unit not activated, or a roll reported stolen. The buyer is never told "counterfeit": we cannot prove it to them and a false accusation is a legal problem. The suspicion, with all its evidence, shows up in your panel.
We generate the codes and they travel encrypted to the printer. You never have to handle a file with millions of codes, and whoever prints them never sees which customer they belong to: the code does not carry the brand inside.
Every roll carries a serial range and a state. The state is what gets audited when something does not add up.
| State | What it means |
|---|---|
ordered | Ordered from the printer. Codes are already generated and reserved. |
printed | Printed. Production of the range was confirmed. |
shipped | Dispatched to your plant. |
received | Received and under your custody. Only now can it be used. |
consumed | Fully applied onto product. |
stolen | Reported stolen. None of its units authenticate again. |
voided | Voided: defective print, range discarded. |
If a roll is stolen, flag it as stolen in the panel. All of its units stop authenticating immediately, including the ones already activated, and every attempt to verify them is recorded with country and time — which is how you trace where they came out.
A product is what you sell; a batch is a production run of that product; a unit is one container with its label. Alerts, recalls and reports all work on the batch, so it pays to keep the batch in the panel identical to the one in your production system.
Activation works in three ways, all from the panel:
Every activation lands in the audit log with who did it and when. That log is hash-chained: it cannot be edited afterwards without it showing, which is exactly what an auditor asks for.
You flag the batch as recalled and the next scan of any of its units shows the safety notice instead of "verified product". It propagates worldwide in seconds and requires no reprinting and no collection.
It is reversible: if the recall was precautionary and gets lifted, the batch verifies normally again. Both operations are audited.
Eleven rules watch the scan stream. The ones that fire most in practice:
Every alert arrives with its evidence —which units, where, when— and can be turned into a case: assign an owner, add notes and attachments, close it with a resolution. The case is what you later show a lawyer, a customs office or a distributor.
| Role | Can |
|---|---|
| Admin | Everything: users, API keys, webhooks, activation, batch recall and settings. |
| Analyst | Runs the day to day: activates, investigates alerts, manages cases, exports. Does not touch users or credentials. |
| Viewer | Read only. For management, external audit or the sales team. |
Each brand’s data is isolated in the database, not in the application: even if a programming error asked for another company’s data, the database would not return it.
Public verification. The same one the QR page uses. It carries no authentication —it has to work from any buyer’s phone— and it does not reveal which brand a code belongs to.
GET https://xyvona.com/api/v/K7M2QX9J4TB8WNPC5RDA
{
"result": "genuine",
"message": "Producto verificado.",
"product_id": 412,
"batch_id": 88
} When the unit was seen before, the response adds first_seen and first_country. When it does not verify, the body is only result and message: it never leaks whether the code does not exist, is not activated, or belongs to a stolen roll, because that difference is exactly what a counterfeiter needs to calibrate.
Panel API. Everything the panel does has an endpoint. It authenticates with a key you generate, with its own scope, shown only once.
curl https://xyvona.com/capi/api/v1/batches \
-H "X-API-Key: $XYVONA_API_KEY" Save the key as soon as it is generated: we do not show it again and cannot recover it. If it is lost, it gets revoked and a new one issued — which is what should happen when a credential goes missing.
You register a URL and we notify you when an alert is raised, filtered by minimum severity and by type. Retries use growing backoff and every delivery is logged, so you can check it when your team says "nothing reached us".
POST https://tu-sistema.com/hooks/xyvona
X-Xyvona-Signature: t=1755820800,v1=9f86d081...
{
"version": 1,
"type": "alert.created",
"tenant_id": 7,
"alert": {
"alert_type": "geo_impossible",
"severity": "high",
"severity_level": 4,
"status": "open",
"unit_id": 90210,
"batch_id": 88,
"created_at": "2026-08-21T14:03:11+00:00",
"evidence": { "km": 8410, "hours": 1.5 }
}
} Verify the signature before trusting the body: it is HMAC-SHA256 over «timestamp.body» with the secret we give you when you register the URL. Reject anything older than five minutes and compare the signature in constant time.
Write to us and we will add it. If you asked the question, someone else is asking it too.