Méthode GET/p /{serial}
Traduire le numéro de série imprimé sur un article en adresse de sa page consommateur. Point d'entrée public, sans clef d'API, qui répond par une redirection.
Sur cette page
Vous transformez le numéro de série d'un article en adresse de la page qui le présente à un consommateur, par une redirection.
#Autorisation
Aucune, point d'entrée public. Nous n'attendons ni clef d'API, ni cookie de
session, ni en-tête Authorization. Vous pouvez appeler cette adresse depuis
un serveur.
#Plafond d'appels
Cette adresse a un plafond dédié et appliqué de 60 appels par 60 secondes,
compté par adresse IP appelante. Le compteur lui est propre : il porte sur tous
les chemins /p/ confondus et n'est partagé avec aucune autre famille.
Prévoyez le code 429 dans votre client et respectez l'en-tête Retry-After
qu'il porte. La valeur de ce compteur peut changer sans préavis, donc
n'inscrivez aucun nombre en dur dans votre code.
La réponse porte les en-têtes X-RateLimit-Limit, X-RateLimit-Remaining et
X-RateLimit-Reset, ce dernier donnant l'heure de remise à zéro en secondes
depuis le 1er janvier 1970. Ne faites pas dépendre votre client de leur
présence : traitez une réponse qui ne les porte pas comme une réponse normale,
et fondez votre rythme d'appel sur les valeurs que vous recevez.
Cette adresse ne consomme aucun quota de votre offre.
#Paramètres de chemin et de requête
| Nom | Type | Obligatoire | Description |
|---|---|---|---|
serial | string | oui | Le numéro de série public de l'article, 12 caractères. Paramètre de chemin. |
k | string | non | La clef d'étiquette, 10 caractères. Les étiquettes imprimées depuis la console ou avec le print_url de l'API partenaire la portent : /p/{serial}?k=…. Avec la bonne clef, l'ouverture compte comme un scan de l'étiquette (voir plus bas). Une clef fausse, absente ou mal formée ne change rien à la réponse. |
linkType | string | non | Demande le passeport plutôt que la page consommateur. Cinq valeurs le déclenchent : dpp, passport, gs1:dpp, gs1:digitalproductpassport, digitalproductpassport. La casse et les espaces de bord n'ont pas d'importance. Nous traitons toute autre valeur comme si le paramètre était absent. Nous acceptons aussi l'orthographe linktype, tout en minuscules. |
Ce numéro de série est l'identifiant unique de produit au sens de la norme EN 18219, celui que le registre européen des passeports numériques attend, et celui qu'encode le QR code imprimé sur vos articles. C'est votre marque qui déclare cet identifiant au registre, en tant qu'opérateur économique vérifié. SealTrust prépare le fichier que vous y déposez, voir Conformité.
Ce point d'entrée adresse un exemplaire physique. Un passeport n'a pas besoin
de porter sur un exemplaire : le règlement ESPR prévoit trois niveaux, le
modèle, le lot et l'article. Nous servons les trois. Pour un passeport de
modèle, l'identifiant à utiliser est
GET /01/{gtin}, qui résout le passeport de
référence partagé par tous les exemplaires qui portent le même code produit.
Pour un passeport de lot, c'est
GET /01/{gtin}/10/{lot}. Vous n'avez donc
pas à numéroter chaque exemplaire pour publier un passeport.
Le numéro de série s'écrit dans un alphabet de 32 caractères : les chiffres de
0 à 9 et les lettres de A à Z, sauf I, L, O et U. Ces quatre
lettres sont écartées parce qu'elles se confondent avec des chiffres sur une
étiquette.
Avant toute recherche, nous nettoyons la valeur reçue : nous retirons les
espaces de bord, nous remplaçons I et L par 1, O par 0, et nous
passons le tout en majuscules. Une personne qui recopie un numéro à la main
peut donc se tromper sur I, L et O sans conséquence. Nous comprenons
ilo2345678ab comme 1102345678AB, et c'est cette forme corrigée qui apparaît
dans l'adresse de destination. La lettre U n'est pas corrigée : une valeur
qui en contient part en 404.
Après ce nettoyage, nous refusons en 404 toute valeur qui ne fait pas exactement 12 caractères, ou qui contient un caractère hors de l'alphabet. Les paramètres d'authentification que certaines puces NFC ajoutent à l'adresse au moment du scan sont des paramètres de requête : nous ne les lisons pas ici et ils ne changent rien à la réponse.
#Corps de la requête
Aucun. C'est une requête GET : tout passe par le chemin et les paramètres de
requête.
#Requête d'exemple
Ne suivez pas la redirection. Ce que vous voulez lire, c'est l'en-tête
Location.
#Deux adresses pour la même route
Pour un appel serveur, appelez https://api.sealtrust.io/v1/p/{serial}. Le
même point d'entrée répond aussi sans le préfixe /v1. Pour une intégration
serveur nouvelle, utilisez la forme /v1.
Le QR code que nous générons pour vos articles, lui, porte la forme sans
préfixe, sur le nom de domaine de vos pages consommateur, par exemple
https://sealtrust.io/p/{serial}. C'est cette forme-là qui est imprimée et qui
sert d'identifiant, parce qu'un identifiant imprimé sur une étiquette ne se
corrige plus.
curl -i https://api.sealtrust.io/v1/p/000000000000 \
-H "Accept-Language: fr"const response = await fetch("https://api.sealtrust.io/v1/p/000000000000", {
headers: { "Accept-Language": "fr" },
redirect: "manual",
});
console.log(response.status);
console.log(response.headers.get("Location"));import requests
response = requests.get(
"https://api.sealtrust.io/v1/p/000000000000",
headers={"Accept-Language": "fr"},
allow_redirects=False,
timeout=30,
)
print(response.status_code)
print(response.headers["Location"])#Réponse d'exemple
Code HTTP 302Found
Code HTTP 302. Le corps est vide, toute l'information est dans l'en-tête
Location.
HTTP/1.1 302 Found
Location: https://sealtrust.io/en/product/000000000000Avec Accept-Language: fr-FR,fr;q=0.9, la même requête renvoie la version
anglaise de la page.
HTTP/1.1 302 Found
Location: https://sealtrust.io/en/product/000000000000Avec ?linkType=dpp, la destination devient le passeport de l'article.
HTTP/1.1 302 Found
Location: https://sealtrust.io/fr/passport/0x0000000000000000000000000000000000000000000000000000000000000000#Comment nous choisissons la destination
Ce point d'entrée ne rend aucun verdict d'authenticité. Nous retrouvons
l'article qui porte ce numéro de série, puis nous renvoyons l'adresse de la
page à afficher. Pour un verdict, appelez
GET /qr/verify avec les paramètres signés du QR
code.
| Cas | Destination |
|---|---|
Article en catalogue, sans linkType reconnu | La page consommateur de l'article, adressée par son numéro de série corrigé. |
linkType reconnu | Le passeport de l'article, adressé par son empreinte. Si l'article n'a pas d'empreinte, par son identifiant de jeton, et à défaut par son numéro de série. |
| Article retiré du catalogue | Le passeport, avec ou sans linkType. Un article remplacé par une frappe plus récente ou archivé reste donc résolvable, ce qu'exige la norme EN 18219 pour un identifiant retiré. |
La langue de la destination vient d'abord de votre en-tête
Accept-Language : nous prenons la première langue déclarée qui est le
français ou l'anglais, et nous ignorons une langue que vous refusez par
q=0.
Si vous ne demandez aucune des deux, ni par l'en-tête ni du tout, la réponse
dépend du domaine appelé. Sur le nom de domaine vérifié d'une marque, c'est la
langue déclarée pour cette marque. Sur le nôtre, ou si elle n'en a déclaré
aucune, c'est l'anglais : une étiquette voyage plus loin que la marque, et
l'anglais est une meilleure supposition que le français pour un lecteur dont
nous ne savons rien. Et si vous avez refusé l'anglais par q=0, nous servons
l'autre langue plutôt que celle que vous venez d'écarter. Votre demande passe toujours avant celle de
la marque : un lecteur qui demande l'anglais reçoit l'anglais, quelle que soit
la langue retenue par la marque.
La réponse porte Vary: Accept-Language, puisque sa destination dépend de cet
en-tête. Un cache partagé qui l'ignorerait servirait à un lecteur la langue
demandée par un autre.
Si vous servez vos pages consommateur sur votre propre nom de domaine, nous
construisons la destination sur ce nom de domaine, en https, et le visiteur
ne quitte donc pas votre domaine. Il en va de même sur le domaine partagé de
votre revendeur, pour les seules marques qu'il sert.
Quand plusieurs enregistrements portent le même numéro de série, parce que vous avez refrappé un article, nous répondons pour l'enregistrement encore en catalogue. S'il n'y en a aucun, nous répondons pour le plus récent.
#Quand l'étiquette porte sa clef
Chaque pièce a sa propre clef d'étiquette, tirée au hasard (10 caractères, environ 50 bits) et imprimée dans l'adresse de son QR code. Quand l'adresse ouverte porte la bonne clef, nous enregistrons un scan de la pièce, situé d'après le réseau de l'appelant seulement, et il passe par la même détection qu'un scan vérifié : activation, puis contrôle du marché gris.
Ce que la clef prouve, et ce qu'elle ne prouve pas : que la personne a lu l'étiquette imprimée, ou une photo de l'étiquette. Une photo se rejoue, donc un scan seul ne dépasse jamais le niveau de confiance « Faible » : il est visible dans la console, il ne déclenche aucune notification. Seules plusieurs pièces distinctes d'une même commande ou d'un même distributeur, vues hors de leur territoire, font monter le niveau. Le même visiteur qui rouvre l'adresse dans les 30 minutes ne compte qu'une fois, et les scans d'une même pièce dans un même pays sur 24 heures se regroupent dans une seule alerte.
La redirection ne transmet jamais la clef, et elle porte
Referrer-Policy: no-referrer. Une clef fausse ne change rien à la réponse ;
au-delà de 20 clefs fausses en une heure depuis une même adresse, la clef
n'est plus examinée pour cette adresse. Une étiquette imprimée avant la clef
fonctionne exactement comme avant.
#Quand la marque affiche ses passeports chez un partenaire
Une marque, ou son revendeur, peut afficher ses passeports dans la page d'un
partenaire, voir Afficher le passeport dans votre page.
Quand elle l'a activé dans la console, cette adresse répond 302 vers la page
du partenaire au lieu de la nôtre, avec les paramètres level (qui vaut
unit), serial et lang. Une demande qui porte ?linkType=dpp reçoit
toujours notre passeport, comme un exemplaire retiré. Le scan est enregistré au moment de la redirection.
#Erreurs
Un navigateur, qui demande text/html dans son en-tête Accept, reçoit à la place du JSON une courte page dans sa langue : même statut, et même texte pour toutes les erreurs, pour ne rien révéler de plus que le JSON. Un programme qui demande du JSON, ou qui n'envoie pas d'en-tête Accept, reçoit les corps décrits ci-dessous.
| Code | Condition | Que faire |
|---|---|---|
| 400 | L'appel arrive sur un nom d'hôte que nous ne servons pas, par exemple un domaine de marque dont la vérification n'est plus valide. La réponse ne porte pas de corps JSON. | Appelez api.sealtrust.io, ou faites vérifier à nouveau votre nom de domaine dans la console. |
| 404 | Le numéro de série est mal formé : longueur différente de 12 après nettoyage, ou caractère hors de l'alphabet. Message Unknown product identifier. | Vérifiez la valeur recopiée. N'ajoutez rien au numéro dans le chemin, tout paramètre supplémentaire se met dans la requête. |
| 404 | Aucun article ne porte ce numéro de série. Message Unknown product identifier. | Rien à corriger dans l'appel. Le numéro n'a jamais été attribué, ou il appartient à un autre système. |
| 404 | L'appel arrive sur le nom de domaine d'une marque et l'article appartient à une autre marque. Message Unknown product identifier. | Appelez ce numéro de série sur le domaine de la marque à laquelle il appartient, ou sur api.sealtrust.io. |
| 429 | Plus de 60 appels en 60 secondes depuis la même adresse IP, tous chemins /p/ confondus. Message Rate limit exceeded: 60 requests per 60s. La réponse porte l'en-tête Retry-After, en secondes. | Attendez le nombre de secondes indiqué par Retry-After. Répartissez vos appels au lieu de les envoyer en rafale. |
| 500 | Erreur inattendue de notre côté. Corps figé {"detail": "Internal Server Error"}. | Réessayez. L'en-tête X-Request-Id identifie l'appel, transmettez-le-nous s'il se répète. |
#Voir aussi
GET /01/{gtin}/21/{serial}, résoudre un lien GS1 qui porte un GTIN et un numéro de série.GET /01/{gtin}, résoudre un lien GS1 qui ne porte qu'un GTIN.GET /qr/verify, vérifier un article depuis une adresse de vérification de l'ancienne forme.GET /resolve/{identifier}, lire en un appel tout ce qu'une page produit affiche.- Identification physique, QR et NFC, choisir le porteur physique et la forme exacte du lien GS1 Digital Link.
Cette page vous a-t-elle été utile ?
Votre réponse ouvre un courriel pré-rempli dans votre messagerie, à destination de contact@sealtrust.io. Vous le relisez avant de l'envoyer.