Méthode GET/resolve/{identifier}

Lire en un seul appel tout ce qu'une page produit affiche : identité, certificat, passeport public, médias, historique et preuves d'ancrage. Point d'entrée public, sans clef d'API.

Sur cette page

Vous obtenez en un seul appel tout ce qu'une page produit affiche : l'identité de l'article, son certificat en cours, son passeport publié, ses médias, son historique et ses preuves d'ancrage sur la chaîne. Aucune clef d'API n'est demandée.

L'adresse complète est https://api.sealtrust.io/v1/resolve/{identifier}. La même route existe sans le préfixe /v1, et c'est la forme /v1 qui est recommandée pour une nouvelle intégration.

Un seul paramètre suffit : l'identifiant de l'article. Quatre formes sont acceptées, et vous n'avez pas à déclarer laquelle vous envoyez. Le serveur les essaie dans l'ordre.

#Autorisation

Aucune, point d'entrée public. Il n'attend ni clef d'API, ni cookie de session, ni en-tête Authorization. Un appel serveur à serveur est accepté.

#Plafond d'appels

600 appels par fenêtre de 60 secondes, comptés par adresse IP appelante. Le plafond est large parce que des centaines de visiteurs d'un salon ou d'un réseau mobile partagent souvent une même adresse. Il est partagé par toutes les adresses qui commencent par /resolve, et il s'applique aussi bien à /resolve/{identifier} qu'à /v1/resolve/{identifier}. Le compteur est commun à toutes les valeurs d'identifiant : parcourir mille identifiants différents consomme mille appels du même budget.

Les réponses 200, 404, 405 et 429 portent 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. Une réponse 500 ne les porte pas. Lisez-les toujours avec une valeur de repli. Un dépassement renvoie 429 avec en plus Retry-After, en secondes.

Ce point d'entrée ne consomme aucun quota de votre offre.

Une réponse réussie porte l'en-tête Cache-Control: public, max-age=30, s-maxage=120 : elle ne lit aucune session et reste la même pour tout appelant. Une erreur porte no-store, max-age=0. Pour réduire le nombre de vos appels, gardez le résultat dans votre propre cache applicatif, avec la durée de fraîcheur que votre usage tolère.

#Paramètres de chemin et de requête

NomTypeObligatoireDescription
identifierstringouiL'identifiant de l'article. Quatre formes acceptées, décrites ci-dessous. Le serveur retire les espaces de bord avant la recherche.
langstringnonLa langue du nom de catégorie : fr ou en. À défaut, le serveur lit l'en-tête Accept-Language, puis retombe sur en.

Un seul paramètre de requête, lang, et il est optionnel. Il ne change qu'une chose dans la réponse : la langue de category_name. Tout le reste est identique quelle que soit sa valeur.

Le serveur choisit la langue dans cet ordre : le paramètre lang s'il vaut fr ou en, sinon le premier tag reconnu de l'en-tête Accept-Language, sinon en. Une valeur que le serveur ne reconnaît pas est ignorée sans erreur : vous obtenez en, et non un 422.

#Les quatre formes d'identifiant

Le serveur les essaie dans cet ordre et s'arrête à la première qui trouve un article.

OrdreFormeReconnue àSensible à la casse
1Empreinte de l'article0x suivi de 64 caractères hexadécimaux, soit 66 caractèresnon
2Identifiant du jetonToute valeur, comparée telle quelle à l'identifiant de jeton enregistréoui
3Numéro de série imprimé12 caractères de l'alphabet Crockford Base32, qui exclut les lettres I, L, O et Unon
4Numéro de certificatLa valeur exacte du champ certificate_number, par exemple ST-CERT-000000000000oui

Le numéro de série est celui que porte le QR code imprimé sur l'article. Le serveur le canonicalise avant la recherche : il ramène les lettres I et L au chiffre 1, et la lettre O au chiffre 0. Le serveur reconnaît donc quand même un numéro ressaisi à la main avec un I, un L ou un O à la place d'un 1 ou d'un 0.

Une forme qui ne trouve rien n'arrête pas la recherche. Une valeur de 66 caractères commençant par 0x qui ne correspond à aucune empreinte est ensuite essayée comme identifiant de jeton, puis comme numéro de série, puis comme numéro de certificat, avant le 404.

Seuls les articles encore au catalogue répondent. Le serveur traite comme introuvables un article détruit, un article remplacé par une frappe ultérieure et un article archivé.

Si plusieurs enregistrements correspondent à une empreinte, à un identifiant de jeton ou à un numéro de série, le serveur rend le plus récemment créé. Un numéro de certificat est unique, il désigne un seul article.

#Corps de la requête

Aucun. C'est une requête GET, tout passe par le chemin.

#Requête d'exemple

curl -i https://api.sealtrust.io/v1/resolve/0x0000000000000000000000000000000000000000000000000000000000000000

#Réponse d'exemple

Code HTTP 200OK

Code HTTP 200. Un article complet, avec certificat, passeport publié, un média, un événement et les deux preuves d'ancrage.

JSON
{
  "token_id": "1024",
  "uid_hash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "product_name": "Sac de voyage Exemple SAS",
  "brand_name": "Exemple SAS",
  "category_name": "Maroquinerie",
  "sku": null,
  "description": null,
  "metadata_uri": "ipfs://bafyexemple00000000000000000000000000000000000000000000000",
  "created_at": "2026-08-14T09:12:33.418000Z",
  "tx_hash": "0x4444444444444444444444444444444444444444444444444444444444444444",
  "contract_address": "0x0000000000000000000000000000000000000000",
  "certificate": {
    "certificate_number": "ST-CERT-000000000000",
    "status": "active",
    "issued_at": "2026-08-14T09:14:02.117043Z",
    "expires_at": null,
    "issuer_name": "Exemple SAS"
  },
  "passport": {
    "schema_version": "1.0",
    "passport_version": 3,
    "data": {
      "product_identity": {
        "gtin": "03701234567891",
        "model": "Sac de voyage",
        "brand": "Exemple SAS",
        "made_in": "FR",
        "production_facility": "Atelier Exemple SAS"
      },
      "circularity": {
        "recyclability_percentage": 62,
        "recycled_content_percentage": 0
      },
      "compliance": {
        "eu_espr": true,
        "reach": true
      }
    },
    "published_at": "2026-08-18T07:03:11.902000Z",
    "data_hash": "0000000000000000000000000000000000000000000000000000000000000000"
  },
  "media": [
    {
      "id": 4821,
      "file_name": "sac-face.jpg",
      "media_type": "image",
      "url": "https://cdn.example.com/exemple-sas/sac-face.jpg",
      "alt_text": "Sac de voyage vu de face"
    }
  ],
  "events": [
    {
      "id": 9137,
      "event_type": "warranty_activation",
      "description": "Garantie activée à l'achat en boutique.",
      "occurred_at": "2026-08-19T14:32:07.481920Z",
      "actor_name": "Boutique Exemple SAS Lyon"
    }
  ],
  "merkle_anchor": {
    "anchor_tx_hash": "0x1111111111111111111111111111111111111111111111111111111111111111",
    "root": "0x2222222222222222222222222222222222222222222222222222222222222222",
    "leaf_index": 17,
    "leaf": "0x3333333333333333333333333333333333333333333333333333333333333333",
    "proof": [
      "0x5555555555555555555555555555555555555555555555555555555555555555",
      "0x6666666666666666666666666666666666666666666666666666666666666666"
    ]
  },
  "passport_anchor": {
    "tx_hash": "0x7777777777777777777777777777777777777777777777777777777777777777",
    "basescan_url": "https://basescan.org/tx/0x7777777777777777777777777777777777777777777777777777777777777777",
    "merkle_root": "0x2222222222222222222222222222222222222222222222222222222222222222",
    "anchored_at": "2026-08-18T07:05:44.220118Z",
    "confirmed_at": null,
    "block_timestamp": "2026-08-18T07:05:58.000000Z",
    "block_number": 34129877,
    "passport_version": 3,
    "data_hash_matches": true
  },
  "evidence": {
    "sections": {
      "identity": "verified",
      "integrity": "verified",
      "composition": "declared"
    },
    "legend": {
      "declared": "Stated by the brand. Recorded, dated and attributable, but not independently checked.",
      "verified": "Rests on an on-chain reference that anyone can re-check independently. SealTrust records it and does not re-query the chain on each request."
    },
    "derived": true,
    "note": "Statuses are computed by SealTrust from verifiable facts. A brand cannot set them."
  }
}

Code HTTP 200 également pour un article minimal. Un article sans certificat en cours, sans passeport publié, sans média, sans historique et dont le lot n'a pas été ancré rend la même structure avec des valeurs vides.

JSON
{
  "token_id": null,
  "uid_hash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "product_name": "Sac de voyage Exemple SAS",
  "brand_name": "Exemple SAS",
  "category_name": null,
  "sku": null,
  "description": null,
  "metadata_uri": "ipfs://bafyexemple00000000000000000000000000000000000000000000000",
  "created_at": "2026-08-14T09:12:33.418000Z",
  "tx_hash": null,
  "contract_address": "0x0000000000000000000000000000000000000000",
  "certificate": null,
  "passport": null,
  "media": [],
  "events": [],
  "merkle_anchor": null,
  "passport_anchor": null,
  "unit_anchor": null,
  "evidence": null
}

#Les champs de premier niveau

ChampTypeDescription
token_idstring ou nullL'identifiant du jeton, sous forme de chaîne. null tant que la frappe n'a pas été confirmée sur la chaîne.
uid_hashstring ou nullL'empreinte de l'article, telle qu'elle est enregistrée.
product_namestring ou nullLe nom de l'article.
brand_namestring ou nullLe nom de la marque propriétaire. null si aucune marque n'est rattachée.
brand_hide_powered_bybooleantrue quand la mention « Powered by SealTrust » doit disparaître. Deux conditions, et il faut les deux : l'offre de la marque comprend la marque blanche et la marque a choisi de masquer la mention dans sa console. Par défaut la mention reste affichée, y compris pour une marque qui vient de souscrire à l'offre Inside sans rien avoir décoché.
brand_public_hoststring ou nullLe nom de domaine sous lequel la marque publie ses pages publiques, par exemple verify.exemple-sas.test. Renseigné seulement quand la marque a la marque blanche et que ce domaine a été vérifié, ou, pour une marque cliente d'un revendeur sans domaine à elle, quand le domaine partagé de ce revendeur est vérifié. Sinon null. Une page s'en sert pour déclarer son adresse canonique et ses aperçus de partage sous le domaine de la marque plutôt que sous le nôtre.
brand_served_hostsarray de stringTous les noms de domaine vérifiés sur lesquels les pages de cette marque sont servies : le sien et celui, partagé, de son revendeur. brand_public_host n'est que le préféré. Une page s'en sert pour accepter les deux, afin qu'une étiquette déjà imprimée sur le domaine du revendeur continue d'ouvrir sa page quand la marque adopte son propre domaine. Liste vide quand la marque n'est servie que sur le nôtre.
category_namestring ou nullLe nom de la catégorie, dans la langue de l'appelant : voir le paramètre lang plus haut. null si aucune catégorie n'est rattachée.
skunullToujours null. Le champ figure dans la réponse et n'est jamais renseigné par ce point d'entrée.
descriptionnullToujours null. Même remarque que pour sku.
metadata_uristring ou nullL'adresse des métadonnées de l'article.
created_atstring ou nullDate de création de l'enregistrement, au format ISO 8601 en temps universel.
tx_hashstring ou nullLa transaction de frappe. Elle ne change pas quand l'article est transféré, donc c'est le lien de preuve d'origine.
contract_addressstring ou nullL'adresse du contrat qui porte ce jeton.
certificateobjet ou nullLe certificat en cours de validité. null si l'article n'en a aucun.
passportobjet ou nullLe passeport publié, filtré au niveau consommateur. null si aucun passeport publié n'existe.
mediatableauLes médias de l'article. Tableau vide si aucun.
eventstableauL'historique public de l'article. Tableau vide si aucun.
merkle_anchorobjet ou nullLa preuve d'appartenance de l'article à un lot ancré sur Base.
passport_anchorobjet ou nullL'ancrage du contenu du passeport.
unit_anchorobjet ou nullPour une pièce enregistrée par son lot (mode ancré) : la racine du lot inscrite sur Base et la preuve de la pièce. null pour toute autre pièce.
evidenceobjet ou nullSur quelle base chaque section peut être crue. Voir ci-dessous. null quand aucun passeport publié n'est servi.

#certificate

Le serveur rend le certificat le plus récemment émis parmi ceux qui sont encore actifs à l'instant de l'appel. Il écarte un certificat révoqué, et il écarte un certificat dont la date d'expiration est passée.

ChampTypeDescription
certificate_numberstringLe numéro du certificat. C'est aussi l'une des quatre formes d'identifiant acceptées par ce point d'entrée.
statusstringVaut toujours active sur ce point d'entrée. Un certificat révoqué ou périmé n'est pas rendu ici, le champ certificate vaut alors null. Pour lire l'état revoked ou expired, appelez GET /v1/certificate/{identifier}.
issued_atstringDate d'émission, au format ISO 8601.
expires_atstring ou nullDate de fin de validité. Aucun certificat émis par la plateforme n'en porte aujourd'hui, la valeur est toujours null. Ne construisez pas votre intégration sur une date de fin.
issuer_namestring ou nullLe nom de la marque qui a émis le certificat. Le serveur calcule ce champ à la lecture. null quand le certificat n'est rattaché à aucune marque.

#passport

Le passeport rendu est celui qui porte le numéro de version le plus élevé parmi les versions publiées. Le serveur cherche d'abord un passeport rattaché à l'article lui-même, puis celui de son lot de production, et ne retombe sur le passeport de référence du modèle que s'il n'en trouve aucun. L'ordre compte : un article qui a son propre passeport ne doit jamais recevoir celui d'un autre exemplaire du même modèle, avec le numéro de série et l'état de batterie de cet autre exemplaire. Le serveur ne rend ici ni les brouillons, ni les passeports réservés à la marque.

ChampTypeDescription
schema_versionstringLa version du schéma de données du passeport.
passport_versionintegerLe numéro de version du passeport, incrémenté à chaque publication.
dataobjetLe contenu du passeport, filtré au niveau public. Sa structure dépend de la catégorie de produit et de ce que la marque a rempli.
published_atstring ou nullDate de publication de cette version.
data_hashstring ou nullL'empreinte du contenu, 64 caractères hexadécimaux, sans préfixe 0x. Cette empreinte entre dans la feuille de l'arbre dont la racine est inscrite sur la chaîne. Le champ passport_anchor.merkle_root rend cette racine.

Le filtrage retient les sections destinées au public, quand le passeport les contient : identité du produit, identification du fabricant, conformité ESPR, conformité REACH, marquage CE, marquages des articles 13(4) et 13(5), lien vers la déclaration UE de conformité, étiquettes, spécification de batterie, ingrédients, nom et adresse de la personne responsable d'un cosmétique, et dans la circularité le taux de recyclabilité, le contenu recyclé, l'agent extincteur et le lien sur la gestion des déchets.

L'impact environnemental, le reste de la circularité, la durabilité, l'efficacité énergétique, l'empreinte carbone, les matières principales, l'entretien et le mouvement relèvent du niveau end_user : ils ne sortent pas par ce point d'entrée. Un client connecté les lit sur GET /passport/{identifier}.

Une section distincte, « déclaration UE de conformité », porte le contenu de la déclaration elle-même quand la marque l'a rempli : numéro, date et lieu d'émission, personne morale sous la responsabilité de laquelle elle est établie, objet, textes de l'Union couverts, normes harmonisées appliquées, et le cas échéant l'organisme notifié avec son numéro d'identification et son attestation. Les champs laissés vides ne sont pas publiés, et la section entière est absente tant que rien n'a été rempli : un bloc vide affirmerait qu'un document existe sans rien en dire.

Pour un passeport batterie, ce découpage suit l'annexe XIII du règlement (UE) 2023/1542 : le point 1 y ajoute les substances dangereuses, les matières premières critiques, l'empreinte carbone et sa classe, le rapport de diligence raisonnable, le contenu recyclé après consommation par métal et la part de contenu renouvelable. En sens inverse, trois champs en sortent, parce que les points 2 et 4 les réservent aux personnes ayant un intérêt légitime : les références de pièces, l'état de la batterie et la durée de vie en cycles.

Pour un passeport textile, le nom et le pourcentage de chaque matière sont publics : c'est la composition en fibres que le règlement (UE) n° 1007/2011 impose sur l'étiquette et veut visible avant l'achat, en ligne compris. L'origine des matières reste réservée. Pour un passeport chaussure, la matière de la tige, de la doublure, de la première de propreté et de la semelle est publique, comme sur l'étiquette que la directive 94/11/CE fait porter à la chaussure. Ces mentions d'étiquette, comme les données publiques de l'annexe XIII, restent publiques quelles que soient les règles de la marque.

Les champs que la console écrit à la racine du passeport (composition, care_instructions, size...) ont chacun leur propre niveau, décrit dans Les règles d'accès au passeport. Ceux qui identifient le produit, la composition en fibres, les matières d'une chaussure, la taille, la couleur et le poids sont publics. Les conseils d'entretien relèvent du niveau end_user.

Le serveur retire tout le reste avant l'envoi, y compris à l'intérieur d'une section partiellement retenue. Dans l'exemple ci-dessus, la section circularity du passeport complet porte aussi l'indice de réparabilité et la durée de vie estimée : ces deux entrées ne sortent pas par ce point d'entrée.

Une marque peut définir ses propres règles d'accès pour ses groupes de produits. Ces règles remplacent alors entièrement le découpage par défaut décrit ci-dessus, y compris pour le niveau public : une règle publique posée sur la nomenclature de fabrication la fait sortir par ce point d'entrée.

#media

Jusqu'à 20 entrées, dans l'ordre d'affichage défini par la marque.

Le serveur prend d'abord les médias rattachés à l'article. S'il n'y en a aucun, il prend ceux du modèle. En dernier recours, il rend l'image de couverture du modèle, seule, avec l'identifiant 0. Cette valeur 0 signale une entrée fabriquée pour l'occasion, sans enregistrement propre.

ChampTypeDescription
idintegerL'identifiant du média. 0 pour l'image de couverture de dernier recours.
file_namestringLe nom du fichier.
media_typestringimage, video, document ou 3d_model.
urlstringL'adresse publique du fichier. Le serveur retire de la liste un média dont il ne peut pas construire l'adresse. Pour une image, c'est sa copie allégée (WebP, 800 pixels au plus sur le grand côté, 100 Ko au plus, sans données EXIF) quand elle existe, sinon l'original.
alt_textstring ou nullLe texte alternatif saisi par la marque.

#events

Jusqu'à 20 entrées, de la plus récente à la plus ancienne. La liste est tirée des 60 derniers événements enregistrés, puis nettoyée.

Le serveur retire deux familles d'événements. Les étapes de rachat qui n'ont rien changé à l'objet : proposition, refus, expiration, accord non réglé. Et les transferts de propriété, qui ne figurent pas dans cette liste.

ChampTypeDescription
idintegerL'identifiant de l'événement.
event_typestringLe type d'événement. Valeurs possibles : repair, warranty_activation, warranty_extension, resale, return, inspection, recall, end_of_life, custom, quality_control, reconditioning, distribution, after_sale_service, maintenance, certification, recycling, donation, destruction.
descriptionstring ou nullLe texte libre saisi par l'auteur de l'événement.
occurred_atstringDate de l'événement, au format ISO 8601.
actor_namestring ou nullLe nom de l'auteur de l'événement. Vaut null dès que la valeur enregistrée contient un @. Ce point d'entrée est entièrement public et accepte le numéro de série imprimé sur l'étiquette : tenir l'objet ne doit pas donner l'adresse e-mail de son propriétaire, et une adresse tronquée se devinerait. Un nom choisi par l'acteur, lui, reste affiché.

#merkle_anchor

Présent seulement si trois conditions sont réunies : l'article appartient à un lot dont la racine a été ancrée sur Base, l'article porte un identifiant de jeton, et la racine recalculée aujourd'hui est identique à la racine ancrée. Si le lot a changé depuis l'ancrage, la preuve serait invérifiable sur la chaîne et le champ vaut null. Le serveur ne rend jamais une preuve trompeuse.

ChampTypeDescription
anchor_tx_hashstringLa transaction qui a inscrit la racine sur Base.
rootstringLa racine ancrée.
leaf_indexintegerLa position de la feuille de cet article, comptée à partir de 0.
leafstringL'empreinte de la feuille de cet article.
prooftableau de stringLes empreintes sœurs, de bas en haut, qui permettent de recalculer la racine à partir de la feuille.

Vous pouvez vérifier cette preuve vous-même, sans nous faire confiance. La recomposition part de leaf, applique les entrées de proof dans l'ordre, et doit aboutir à root.

L'empreinte utilisée est keccak256. La convention de couple est celle d'OpenZeppelin : à chaque étage, vous concaténez les 32 octets de la valeur courante et les 32 octets de l'entrée de proof dans l'ordre croissant, puis vous appliquez keccak256 au résultat.

Recomposer la racine
from eth_utils import keccak  # pip install eth-utils

root = "0x2222222222222222222222222222222222222222222222222222222222222222"
leaf = "0x3333333333333333333333333333333333333333333333333333333333333333"
proof = [
    "0x5555555555555555555555555555555555555555555555555555555555555555",
    "0x6666666666666666666666666666666666666666666666666666666666666666",
]

node = bytes.fromhex(leaf[2:])
for entree in proof:
    voisin = bytes.fromhex(entree[2:])
    node = keccak(node + voisin) if node < voisin else keccak(voisin + node)

print("0x" + node.hex() == root)

Les valeurs ci-dessus sont inventées, donc ce programme affiche False. Remplacez-les par celles d'une réponse réelle et il affiche True.

#passport_anchor

Présent seulement si cette version exacte du passeport a été ancrée et si la transaction d'ancrage existe. Ce champ date le contenu du passeport. Le champ merkle_anchor ci-dessus date l'article. Les deux restent séparés parce qu'ils ne prouvent pas la même chose.

ChampTypeDescription
tx_hashstringLa transaction qui a inscrit la racine sur Base.
basescan_urlstring ou nullLe lien direct vers cette transaction sur l'explorateur de la chaîne.
merkle_rootstring ou nullLa racine ancrée.
block_timestampstring ou nullLa date de l'inscription, au format ISO 8601. C'est l'instant où la chaîne a scellé le bloc, et la seule date qui fasse foi.
confirmed_atnullToujours nul sur cette route. Ce champ dit quand nous avons lu le reçu de la transaction, pas quand la chaîne a scellé : sur un ancrage vérifié après coup, c'est le jour de la vérification. Il n'a aucune valeur pour qui vérifie un produit, et cette route ne le sert donc pas.
block_numberinteger ou nullLe bloc qui contient la transaction.
anchored_atstring ou nullLa date d'ENVOI de la transaction, au format ISO 8601. Elle précède l'inscription et ne la prouve pas. La date qui fait foi est l'horodatage du bloc, servi ci-dessus dans block_timestamp.
passport_versioninteger ou nullLa version du passeport couverte par cet ancrage.
data_hash_matchesboolean ou nulltrue quand le contenu stocké aujourd'hui correspond à ce qui a été ancré. false signale que le passeport a changé depuis.

Aucune preuve d'inclusion n'accompagne l'ancrage du passeport. Pour vérifier l'appartenance vous-même, appelez GET /v1/passport/{identifier}/proof, qui rend la feuille, sa position et les empreintes sœurs.

#unit_anchor

Présent seulement pour une pièce créée en mode ancré : son lot est inscrit sur Base sous une seule racine, et la pièce n'a son propre jeton qu'à partir de sa première revendication (pièces enregistrées par lot). Le bloc est le même que la réponse de GET /v1/verify/unit-anchor/{identifier}, sans la lecture du contrat : onchain_root_matches vaut toujours null ici.

ChampTypeDescription
statusstringrecorded quand la transaction est confirmée et réussie, pending avant, failed si la chaîne l'a refusée.
leaf_fieldsobjetLes champs inscrits : serial, brand_code, product_model_id, lot_code, uid_hash, created_at_unix.
leafstringL'empreinte de la feuille de cette pièce.
leaf_indexintegerLa position de la feuille, comptée à partir de 0.
prooftableau de stringLes empreintes sœurs, de la feuille vers la racine.
proof_validbooleanLa feuille recalculée à partir de leaf_fields et remontée par proof donne merkle_root.
merkle_rootstringLa racine du lot.
onchain_batch_idintegerL'identifiant sous lequel le contrat garde cette racine.
tx_hashstring ou nullLa transaction qui a inscrit la racine. null tant qu'elle n'est pas partie.
explorer_urlstring ou nullLe lien vers cette transaction sur l'explorateur de la chaîne.
recorded_atstring ou nullLa date de l'inscription, l'horodatage du bloc. null tant que status n'est pas recorded.
token_mintedbooleantrue quand la pièce a déjà son propre jeton.

#evidence

Sur quelle base chaque section du passeport peut être crue. C'est le même bloc, calculé par la même fonction, que celui de GET /v1/passport/{identifier}.

Trois valeurs existent, et elles sont calculées par SealTrust. Une marque ne peut pas les choisir.

ValeurCe qu'elle dit
verifiedRepose sur une référence inscrite sur une chaîne publique, que n'importe qui peut recouper. SealTrust l'enregistre et ne réinterroge pas la chaîne à chaque requête.
document_backedUn document tiers est joint et peut être récupéré. Son contenu n'a pas été audité par SealTrust.
declaredDéclaré par la marque. Enregistré, daté, attribuable, non vérifié de façon indépendante.

Quatre sections peuvent porter une de ces valeurs : identity, integrity, composition et substances_of_concern. Seules les sections que le passeport contient réellement en reçoivent une.

identity et integrity sont toujours présentes, parce qu'elles portent sur l'exemplaire lui-même. La section identity passe à verified quand l'unité porte un identifiant de jeton sur la chaîne. La section integrity passe à verified quand l'empreinte de cette version a été ancrée et correspond toujours aux données enregistrées.

composition et substances_of_concern n'apparaissent que si les données du passeport les portent. Un bloc de matières resté vide (lignes sans nom, sans part et sans origine) ne décrit aucune matière. Dans la réponse d'exemple ci-dessus, le passeport complet décrit ses matières, absentes du bloc public, et ne déclare aucune substance préoccupante : sections compte donc trois entrées. Le nombre d'entrées va de deux à quatre selon le passeport servi.

Le bloc porte en plus legend, qui redit le sens des valeurs présentes, derived à true, et note.

Aucune autre section du passeport ne reçoit de mention. Une section que sections ne nomme pas n'est ni vérifiée ni infirmée, elle n'est pas notée. N'affichez donc une mention que pour les sections que ce champ nomme.

Le champ vaut null quand aucun passeport publié n'est servi, et null si son calcul échoue. Un client qui ne trouve pas le bloc n'affiche aucune mention.

#Erreurs

CodeConditionQue faire
404Aucun article au catalogue ne correspond à cet identifiant, dans aucune des quatre formes. Message Product not found. Un article détruit, remplacé ou archivé donne la même réponse.Vérifiez la valeur envoyée. Si l'article a été détruit, remplacé ou retiré du catalogue, ce code est définitif.
404Aucun identifiant n'a été fourni, l'appel s'arrête à /v1/resolve. Message Not Found.Ajoutez l'identifiant dans le chemin.
404L'appel arrive sur le nom de domaine vérifié d'une marque, et le produit appartient à une autre marque. detail vaut Product not found.Appelez cette adresse sur le domaine de la marque concernée, ou sur api.sealtrust.io. Le message est le même que pour un identifiant inconnu, pour ne pas confirmer qu'il existe.
405Une méthode autre que GET a été envoyée sur ce chemin. Message Method Not Allowed. La réponse porte l'en-tête Allow: GET.Ce point d'entrée ne répond qu'en GET.
429Plus de 600 appels en 60 secondes depuis la même adresse IP. Message Rate limit exceeded: 600 requests per 60s.Attendez le nombre de secondes indiqué par Retry-After. Répartissez vos appels dans le temps.
500Erreur inattendue du serveur. 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.

Une valeur qui ne ressemble à aucune des quatre formes attendues reçoit un 404.

#Voir aussi

Votre réponse ouvre un courriel pré-rempli dans votre messagerie, à destination de contact@sealtrust.io. Vous le relisez avant de l'envoyer.

Proposer une correctionSignaler un problème