# GET /products/{uid}/public

Lire les informations publiques d'un produit à partir de son identifiant : nom, marque, image, jeton, transaction, état et déclaration de vol. Aucune clef d'API.

Source : https://docs.sealtrust.io/reference/get-products-uid-public/

---

Vous lisez les informations publiques d'un produit à partir de son identifiant.
En quittant cette page, vous saurez récupérer son nom, le nom et le logo de sa
marque, une image, son numéro de jeton, sa transaction d'inscription, son état,
et savoir s'il est déclaré volé.

Adresse complète :

```http
GET https://api.sealtrust.io/v1/products/{uid}/public
```

Le même point d'entrée répond aussi sans le préfixe `/v1`, à
`https://api.sealtrust.io/products/{uid}/public`. Les deux adresses appellent
le même code. Utilisez la forme `/v1` pour une nouvelle intégration.

## Autorisation

Aucune, point d'entrée public. Ce point d'entrée ne lit aucune clef d'API,
aucun jeton et aucun cookie. Le serveur ne regarde jamais l'en-tête
`Authorization` que vous envoyez ici, et il vous renvoie la même réponse avec
ou sans lui.

> [!ATTENTION] Tout ce que rend ce point d'entrée est public
> L'identifiant demandé dans le chemin circule hors de votre contrôle. Il est
> encodé dans le QR de partage d'un produit, qui ouvre la page publique
> `/verify/{uid}`, et il apparaît en clair dans l'adresse de cette page. Toute
> personne qui a reçu ce QR ou cette adresse peut donc appeler ce point
> d'entrée et lire ces champs. N'attendez de lui aucune confidentialité, et
> n'utilisez jamais la connaissance de l'identifiant comme preuve de
> possession.

## Plafond d'appels

Aucun plafond propre à ce point d'entrée. Ce chemin relève du compteur général
de l'API, compté par adresse IP appelante sur une fenêtre de 60 secondes. Ce
compteur est partagé avec tous les autres chemins de l'API qui n'ont pas de
plafond qui leur soit propre.

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 normalement trois en-têtes qui décrivent ce compteur. Ne
construisez rien qui exige leur présence : ils peuvent manquer.

| En-tête | Contenu |
| --- | --- |
| `X-RateLimit-Limit` | le plafond appliqué sur la fenêtre |
| `X-RateLimit-Remaining` | ce qu'il vous reste dans la fenêtre en cours |
| `X-RateLimit-Reset` | l'horodatage de fin de la fenêtre, en secondes |

Ce compteur est indépendant du quota quotidien d'une clef d'API. Cet appel
n'entame ni ce quota quotidien, ni le quota mensuel de produits de votre offre.

## Paramètres de chemin et de requête

| Nom | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `uid` | `string` | oui | L'identifiant public du produit : `0x` suivi de 64 caractères hexadécimaux. C'est l'empreinte de la puce du produit. |

> [!ATTENTION] Cet identifiant n'est pas le numéro de série de l'étiquette
> Le QR code imprimé sur l'article encode le numéro de série et ouvre
> `/p/{serial}`. Vous lisez ce numéro de série avec `GET /p/{serial}`.
> L'identifiant attendu ici est une autre valeur. Il apparaît dans le QR de
> partage généré depuis la page d'un produit, qui ouvre `/verify/{uid}`.
> Envoyer un numéro de série sur cette adresse vous rend un 404.

Vous pouvez envoyer cet identifiant avec ou sans le préfixe `0x`, en majuscules
ou en minuscules. Le serveur retire les espaces de début et de fin avant de
chercher, met la valeur en minuscules et ajoute le préfixe `0x` s'il manque.
Ces écritures désignent donc toutes le même produit.

Ce point d'entrée n'a aucun paramètre de requête.

### En-têtes

Aucun en-tête n'est obligatoire.

## Corps de la requête

Aucun. Cette requête n'a pas de corps.

## Requête d'exemple

Lecture du produit dont l'identifiant est
`0x1111111111111111111111111111111111111111111111111111111111111111`.

:::onglets
```bash title="curl"
curl -i "https://api.sealtrust.io/v1/products/0x1111111111111111111111111111111111111111111111111111111111111111/public"
```
```typescript
const uid =
  "0x1111111111111111111111111111111111111111111111111111111111111111";

const response = await fetch(
  `https://api.sealtrust.io/v1/products/${encodeURIComponent(uid)}/public`,
  { method: "GET" },
);

if (!response.ok) {
  throw new Error(`SealTrust a répondu ${response.status}`);
}

const produit = await response.json();

console.log(produit.product_name, produit.brand_name);
console.log(produit.is_verified, produit.declared_stolen);
```
```python
import requests
from urllib.parse import quote

uid = "0x1111111111111111111111111111111111111111111111111111111111111111"

response = requests.get(
    f"https://api.sealtrust.io/v1/products/{quote(uid, safe='')}/public",
    timeout=30,
)

print(response.status_code)
print(response.json())
```
:::

> [!INFO] Le SDK TypeScript ne couvre pas ce point d'entrée
> `@sealtrust-io/sdk` n'expose aucune méthode pour cette adresse. L'exemple
> ci-dessus utilise `fetch`, disponible sans dépendance.

## Réponse d'exemple

Code HTTP `200`.

```json
{
  "product_name": "Sac Modèle Exemple",
  "brand_name": "Exemple SAS",
  "brand_logo_url": "https://exemple-sas.test/logo.png",
  "image_url": "https://exemple-sas.test/media/sac-modele-exemple.jpg",
  "category_name": "Maroquinerie",
  "token_id": "11111111111111111111111111111111111111111111111111111111111111111111111111111",
  "tx_hash": "0x2222222222222222222222222222222222222222222222222222222222222222",
  "status": "written",
  "declared_stolen": false,
  "is_verified": true,
  "verified_at": "2026-03-04T10:22:31.481000+00:00",
  "contract_address": "0x3333333333333333333333333333333333333333",
  "chain": null
}
```

La réponse compte treize champs et rien d'autre.

| Champ | Type | Description |
| --- | --- | --- |
| `product_name` | `string \| null` | Le nom du produit. `null` quand aucun nom n'a été enregistré. |
| `brand_name` | `string \| null` | Le nom de la marque propriétaire du produit. `null` quand le produit n'est rattaché à aucune marque. |
| `brand_logo_url` | `string \| null` | L'adresse du logo de la marque. `null` quand la marque n'en a pas déposé. |
| `image_url` | `string \| null` | L'adresse publique de l'image de couverture. Elle est cherchée dans cet ordre : une image attachée directement à l'exemplaire, puis l'image principale de son modèle, puis les médias du modèle. `null` seulement quand aucune de ces trois pistes n'aboutit. |
| `category_name` | `string \| null` | Le nom de la catégorie du produit. `null` quand aucune catégorie n'est rattachée. |
| `token_id` | `string \| null` | Le numéro du jeton sur la chaîne, écrit en base dix, dans une chaîne de caractères. Ce nombre est trop grand pour un entier ordinaire, donc lisez-le comme du texte et jamais comme un nombre de votre langage. `null` tant que l'inscription sur la chaîne n'est pas confirmée. |
| `tx_hash` | `string \| null` | L'empreinte de la transaction qui a inscrit le produit sur la chaîne. `null` tant qu'aucune transaction n'a été enregistrée. |
| `status` | `string` | L'état technique du produit. Voir ci-dessous. |
| `declared_stolen` | `boolean` | `true` quand une déclaration de vol est ouverte sur ce produit. |
| `is_verified` | `boolean` | `true` quand `status` vaut `mined` ou `written`. `false` dans tous les autres cas. |
| `verified_at` | `string \| null` | Date et heure de création de l'enregistrement du produit, au format ISO 8601. Voir l'avertissement ci-dessous. |
| `contract_address` | `string` | L'adresse du contrat qui porte le jeton. |
| `chain` | `null` | Ce champ vaut toujours `null` aujourd'hui. Voir ci-dessous. |

### Lire l'état d'un produit

`status` porte une valeur technique. Cette page en documente deux, parce que
le reste de la réponse en dépend : `mined` et `written` sont les deux seules
valeurs pour lesquelles `is_verified` vaut `true`.

Lisez `is_verified` et `declared_stolen` plutôt que d'interpréter `status`
vous-même. `declared_stolen` existe justement pour cela : `status` porte la
valeur `stolen` au moment d'une déclaration fraîche, puis reprend la valeur
`written` dès que le dossier de vol est clos, alors que `declared_stolen` dit
dans un champ à lui si une déclaration est ouverte.

> [!ATTENTION] `verified_at` n'est pas une date de vérification
> Malgré son nom, ce champ porte la date de création de l'enregistrement du
> produit chez nous. Il ne bouge pas quand quelqu'un scanne le produit, et il
> ne dit rien de la dernière vérification. N'affichez jamais cette valeur comme
> « vérifié le ».

> [!ATTENTION] `chain` est toujours vide
> Ce champ est présent dans la réponse et vaut `null` pour tous les produits.
> Ne construisez rien dessus, et n'y cherchez pas le nom du réseau. Lisez
> `contract_address` pour connaître le contrat qui porte le jeton.

## Erreurs

Le corps d'une réponse d'erreur porte un champ `detail`.

| Code | Condition | Que faire |
| --- | --- | --- |
| 404 | Aucun produit ne porte cet identifiant. `detail` vaut `Product not found`. | Le serveur cherche d'abord votre identifiant nettoyé, passé en minuscules et préfixé de `0x`, puis votre chaîne brute telle que vous l'avez envoyée. Envoyez la forme canonique : `0x` suivi de 64 caractères hexadécimaux en minuscules. Vérifiez aussi que vous envoyez bien une empreinte de puce et non un numéro de série. |
| 429 | Trop d'appels depuis votre adresse. La réponse porte l'en-tête `Retry-After`, en secondes. | Attendez le nombre de secondes indiqué par `Retry-After`, puis réessayez. Répartissez vos appels au lieu de les envoyer en rafale. |
| 500 | Une erreur inattendue s'est produite pendant le traitement de votre appel. `detail` vaut `Internal Server Error`. La réponse porte un en-tête `X-Request-Id`. | Réessayez. Si l'erreur persiste, contactez le support en indiquant cet identifiant de requête et l'heure de l'appel. |

Ce point d'entrée est public : il ne renvoie ni 401, ni 403.

## Voir aussi

- [`GET /resolve/{identifier}`](/reference/get-resolve/),
  lire en un appel tout ce qu'une page produit affiche.
- [`GET /timeline/{identifier}`](/reference/get-timeline/),
  lire l'historique public d'un produit.
- [`GET /certificate/{identifier}`](/reference/get-certificate/),
  lire le certificat d'authenticité d'un article.
- [Notions de base](/notions/),
  distinguer modèle, lot et article avant de commander la moindre étiquette.
