genuine Producto verificado
La unidad existe, está activada y es la primera vez que se escanea. Es el único caso en el que el comprador lee que el producto es genuino.
Documentación
Todo lo que sigue está en funcionamiento. Si algo no está acá es porque todavía no existe.
El orden del paso 4 importa: activar antes de aplicar significa que un rollo que se pierde en el camino tiene unidades que sí autentican. Activá cuando la etiqueta ya está sobre el producto.
Escanea el QR con la cámara del teléfono y se abre una página en el navegador. No hay app que instalar y no se le pide ningún dato. La página pesa menos de 30 KB para que cargue en una góndola con una barra de señal.
genuine La unidad existe, está activada y es la primera vez que se escanea. Es el único caso en el que el comprador lee que el producto es genuino.
already_seen La unidad es válida pero alguien ya la escaneó. Se le muestra cuándo y desde qué país fue la primera vez, para que el propio comprador juzgue: si compró acá y la etiqueta se estrenó en otro país hace tres meses, algo pasó.
recalled El lote está retirado del mercado. Reemplaza a cualquier otro mensaje, incluso si la unidad es perfectamente legítima. Se activa desde el panel y toma efecto en el siguiente escaneo.
unverified Código inventado, unidad sin activar o rollo denunciado como robado. Al comprador nunca se le dice "falsificado": no tenemos cómo probarlo frente a él y acusar en falso es un problema legal. La sospecha, con toda su evidencia, aparece en tu panel.
Los códigos los generamos nosotros y viajan cifrados hasta la imprenta. Vos nunca tenés que manipular un archivo de millones de códigos, y quien imprime nunca ve a qué cliente pertenecen: el código no lleva la marca adentro.
Cada rollo trae un rango de series y un estado. El estado es lo que se audita cuando algo no cierra.
| Estado | Qué significa |
|---|---|
ordered | Pedido a la imprenta. Los códigos ya están generados y reservados. |
printed | Impreso. Se confirmó la producción del rango. |
shipped | Despachado hacia tu planta. |
received | Recibido y bajo tu custodia. Recién acá se puede usar. |
consumed | Aplicado por completo sobre producto. |
stolen | Denunciado como robado. Ninguna de sus unidades vuelve a autenticar. |
voided | Anulado: impresión defectuosa, rango descartado. |
Si te roban un rollo, marcalo como robado en el panel. Todas sus unidades dejan de autenticar en el acto, incluso las que ya estaban activadas, y cada intento de verificarlas te queda registrado con país y hora — que es cómo se rastrea por dónde salieron.
Un producto es lo que vendés; un lote es una corrida de producción de ese producto; una unidad es un envase con su etiqueta. Las alertas, el retiro y los informes trabajan sobre el lote, así que conviene que el lote del panel sea el mismo que el de tu sistema de producción.
La activación se hace de tres formas, todas desde el panel:
Cada activación queda en el registro de auditoría con quién la hizo y cuándo. Ese registro está encadenado por hash: no se puede editar después sin que se note, que es justo lo que pide un auditor.
Marcás el lote como retirado y el siguiente escaneo de cualquiera de sus unidades muestra la alerta sanitaria en lugar de "producto verificado". Tarda segundos en propagarse a todo el mundo y no requiere reimprimir ni recolectar nada.
Es reversible: si el retiro fue precautorio y se levanta, el lote vuelve a verificar normalmente. Las dos operaciones quedan auditadas.
Hay once reglas mirando el flujo de escaneos. Las que más se disparan en la práctica:
Cada alerta llega con su evidencia —qué unidades, dónde, cuándo— y se puede convertir en un caso: se le asigna un responsable, se le agregan notas y adjuntos, y se cierra con una resolución. El caso es lo que después se le muestra a un abogado, a una aduana o a un distribuidor.
| Rol | Puede |
|---|---|
| Admin | Todo: usuarios, llaves de API, webhooks, activación, retiro de lote y configuración. |
| Analyst | Opera el día a día: activa, investiga alertas, gestiona casos, exporta. No toca usuarios ni credenciales. |
| Viewer | Sólo lectura. Para dirección, auditoría externa o el equipo comercial. |
Los datos de cada marca están aislados en la base, no en la aplicación: aunque un error de programación pidiera datos de otra empresa, la base no los devuelve.
Verificación pública. Es la misma que usa la página del QR. No lleva autenticación —tiene que funcionar desde el teléfono de cualquier comprador— y no revela a qué marca pertenece el código.
GET https://xyvona.com/api/v/K7M2QX9J4TB8WNPC5RDA
{
"result": "genuine",
"message": "Producto verificado.",
"product_id": 412,
"batch_id": 88
} Cuando la unidad ya fue vista antes, la respuesta agrega first_seen y first_country. Cuando no verifica, el cuerpo es sólo result y message: no se filtra si el código no existe, si no está activado o si el rollo fue robado, porque esa diferencia es exactamente lo que un falsificador necesita para calibrar.
API del panel. Todo lo que hace el panel tiene su endpoint. Se autentica con una llave que generás vos, con su propio alcance, y que se muestra una sola vez.
curl https://xyvona.com/capi/api/v1/batches \
-H "X-API-Key: $XYVONA_API_KEY" Guardá la llave apenas se genera: no volvemos a mostrarla y no la podemos recuperar. Si se pierde, se revoca y se emite otra — que es lo que debe pasar cuando una credencial se extravía.
Registrás una URL y te avisamos cuando se genera una alerta, filtrando por severidad mínima y por tipo. Los reintentos van con espera creciente y cada entrega queda en un registro que podés consultar cuando tu equipo diga "no nos llegó".
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 }
}
} Verificá la firma antes de confiar en el cuerpo: es HMAC-SHA256 sobre «timestamp.cuerpo» con el secreto que te damos al registrar la URL. Rechazá lo que llegue con más de cinco minutos de antigüedad y compará la firma en tiempo constante.
Escribinos y lo agregamos. Si la pregunta te la hiciste vos, se la está haciendo otro.