# GET /partner/webhooks/{webhook_id}

Lire un abonnement aux notifications de votre marque, avec son adresse, ses types d'événements et son état de livraison. Droit webhooks:read.

Source : https://docs.sealtrust.io/reference/get-partner-webhooks-id/

---

Vous lisez un seul abonnement aux notifications, désigné par son numéro. En
quittant cette page, vous saurez récupérer son adresse de destination, la liste
des événements auxquels il est inscrit, son état allumé ou éteint, et si nos
livraisons vers lui aboutissent.

Adresse complète :

```http
GET https://api.sealtrust.io/v1/partner/webhooks/{webhook_id}
```

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

## Autorisation

Clef d'API dans l'en-tête `Authorization`, au format `Bearer`, portant le droit
`webhooks:read`. Une clef qui ne porte pas ce droit reçoit un 403 dont le
message nomme le droit manquant.

Un abonnement n'est visible que par une clef de la marque à laquelle il
appartient. Un numéro d'abonnement qui appartient à une autre marque répond 404,
comme un numéro qui n'existe pas. La réponse ne dit jamais si l'abonnement
existe ailleurs.

Cette lecture reste ouverte quelle que soit votre offre. Seules la création et
la modification d'un abonnement exigent que votre offre comprenne les
notifications.

## Plafond d'appels

Nous mesurons le débit sur une fenêtre fixe de 60 secondes. Nous appliquons la
valeur posée sur votre compte si nous en avons posé une, sinon celle de votre
offre. En l'absence des deux, la valeur de repli est de 120 appels par fenêtre.

Deux compteurs se superposent, avec le même plafond : un par clef, un pour la
somme de toutes les clefs de votre marque. Créer des clefs supplémentaires
n'augmente donc pas le débit total autorisé.

Nous authentifions d'abord votre clef. Nous vérifions ensuite le plafond, avant
le contrôle du droit `webhooks:read` et avant toute lecture de l'abonnement.

Un refus renvoie 429 avec `Retry-After`, exprimé en secondes restantes dans la
fenêtre en cours. Cette valeur n'est jamais inférieure à 1. Réglez vos réessais
sur `Retry-After`.

### En-têtes de débit

La réponse porte une série d'en-têtes `X-RateLimit-*` qui décrit le compteur le
plus contraignant des deux, celui de votre clef ou celui de votre marque.

| 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 |
| `X-RateLimit-Scope` | `key` ou `brand`, le compteur qui a servi de référence |

> [!ATTENTION] Trois de ces en-têtes vous arrivent en double
> Un second compteur, qui ne dépend pas de votre clef, ajoute à son tour
> `X-RateLimit-Limit`, `X-RateLimit-Remaining` et `X-RateLimit-Reset`, avec ses
> propres valeurs. La réponse porte donc deux fois chacun de ces trois noms.
> Seul `X-RateLimit-Scope` apparaît une seule fois, et il accompagne la série
> décrite dans le tableau ci-dessus. La plupart des bibliothèques HTTP
> réunissent les répétitions en une seule chaîne séparée par une virgule, de la
> forme `119, 599`. Ne convertissez donc pas ces en-têtes en nombre. Nous
> traitons ce point. En attendant, réglez votre cadence sur `Retry-After`.

Nous contrôlons votre clef avant de faire tourner son compteur. Une réponse
401 ne porte donc que la série du second compteur, et aucun
`X-RateLimit-Scope`.

> [!INFO] Cette lecture ne consomme aucun quota
> Cet appel n'entame ni le quota quotidien de votre clef, ni le quota mensuel
> de produits de votre offre. Seul le plafond de débit s'applique.

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

| Nom | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `webhook_id` | `integer` | oui | Le numéro de l'abonnement, tel que la création et la liste le rendent dans le champ `id`. |

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

### En-têtes

| Nom | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `Authorization` | `string` | oui | `Bearer` suivi de votre clef d'API. |

## Corps de la requête

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

## Requête d'exemple

Lecture de l'abonnement numéro 7.

:::onglets
```bash title="curl"
curl -i https://api.sealtrust.io/v1/partner/webhooks/7 \
  -H "Authorization: Bearer st_test_0000000000000000000000000000000000000000000000"
```
```typescript
import { SealTrustClient } from "@sealtrust-io/sdk";

const sealtrust = new SealTrustClient({
  apiKey: "st_test_0000000000000000000000000000000000000000000000",
});

const abonnement = await sealtrust.webhooks.get(7);

console.log(abonnement.url, abonnement.events, abonnement.health);
```
```python
import requests

response = requests.get(
    "https://api.sealtrust.io/v1/partner/webhooks/7",
    headers={
        "Authorization": "Bearer st_test_0000000000000000000000000000000000000000000000",
    },
    timeout=30,
)

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

## Réponse d'exemple

Code HTTP `200`.

```json
{
  "id": 7,
  "brand_id": 12,
  "url": "https://exemple-sas.test/sealtrust/evenements",
  "events": [
    "product.minted",
    "batch.completed"
  ],
  "is_active": true,
  "health": "healthy",
  "created_at": "2026-08-14T09:12:44.318000Z",
  "updated_at": "2026-08-20T07:03:11.902000Z"
}
```

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

| Champ | Type | Description |
| --- | --- | --- |
| `id` | `integer` | Le numéro de l'abonnement. |
| `brand_id` | `integer` | Le numéro de votre marque. |
| `url` | `string` | L'adresse qui reçoit les notifications. Elle commence toujours par `https://`. |
| `events` | `string[]` | Les types d'événements auxquels cet abonnement est inscrit. Une liste vide veut dire qu'aucun événement ne sera livré. |
| `is_active` | `boolean` | `true` quand l'abonnement est allumé. |
| `health` | `string` | `healthy` ou `degraded`. Voir ci-dessous. |
| `created_at` | `string` | Date et heure de création, en temps universel, au format ISO 8601. |
| `updated_at` | `string` | Date et heure de la dernière modification, en temps universel, au format ISO 8601. |

`health` vaut `healthy` tant que nos livraisons vers cette adresse
aboutissent. Il passe à `degraded` quand la dernière tentative de renvoi
échoue à son tour, et il revient à `healthy` dès qu'une livraison réussit.
Nous n'écrivons que ces deux valeurs.

> [!ATTENTION] Le secret de signature n'est jamais rendu
> Cette réponse ne contient pas le secret que vous avez posé à la création de
> l'abonnement. Aucun point d'entrée ne le relit. Conservez-le de votre côté au
> moment où vous créez l'abonnement.

> [!INFO] La liste ne nomme pas ce champ de la même façon
> `GET /v1/partner/webhooks` rend les mêmes abonnements, et y nomme la liste
> des types d'événements `event_types`. Ce point d'entrée la nomme `events`.
> Prévoyez les deux noms si votre code lit les deux réponses.

## Erreurs

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

| Code | Condition | Que faire |
| --- | --- | --- |
| 401 | L'en-tête `Authorization` est absent. `detail` vaut `Missing Authorization header`. La réponse porte aussi `WWW-Authenticate: Bearer`. | Ajoutez l'en-tête. |
| 401 | L'en-tête `Authorization` ne commence pas par `Bearer ` suivi d'un espace. `detail` vaut `Invalid Authorization header format (expected 'Bearer <token>')`. La réponse porte aussi `WWW-Authenticate: Bearer`. | Corrigez la forme de l'en-tête. |
| 401 | Ce qui suit `Bearer ` est vide, ou fait moins de 40 caractères. `detail` vaut `Invalid API key format`. Cette réponse ne porte pas `WWW-Authenticate`. | Envoyez le secret complet, tel que la console vous l'a affiché à la création. |
| 401 | La clef envoyée est inconnue. `detail` vaut `Invalid API key`. | Vérifiez que vous envoyez le secret complet, sans espace ni retour à la ligne. |
| 403 | La clef n'est plus dans l'état actif. `detail` vaut `API key is revoked` ou `API key is expired`, selon son état. | Créez une nouvelle clef dans la console. |
| 403 | La clef a dépassé sa date d'expiration. `detail` vaut `API key has expired`. Nous basculons alors son état en `expired`. | Créez une nouvelle clef. L'ancienne ne redeviendra jamais valide. |
| 403 | La clef ne porte pas le droit `webhooks:read`. `detail` vaut `Missing required scope: webhooks:read`. | Créez une clef portant ce droit. Les droits d'une clef existante ne se modifient pas. |
| 404 | Aucun abonnement ne porte ce numéro dans votre marque. `detail` vaut `Webhook subscription not found`. | Vérifiez le numéro avec `GET /v1/partner/webhooks`. Un abonnement d'une autre marque donne la même réponse, et un numéro plus grand que tout numéro attribué aussi. |
| 422 | Le numéro envoyé dans le chemin n'est pas un entier. La réponse détaille le champ refusé. | Envoyez le champ `id` tel que la liste le rend, sans guillemets ni décimale. |
| 429 | Le plafond de débit de la clef est atteint. `detail` nomme le plafond et la fenêtre. Les en-têtes `Retry-After` et la famille `X-RateLimit-*` accompagnent la réponse, avec `X-RateLimit-Scope: key`. | Attendez le nombre de secondes indiqué par `Retry-After`, puis réessayez. |
| 429 | Le plafond de débit de la marque est atteint, toutes clefs confondues. `X-RateLimit-Scope` vaut `brand`, et `X-RateLimit-Remaining` vaut `0`. | Attendez le nombre de secondes indiqué par `Retry-After`. Créer une clef supplémentaire ne relève pas ce plafond. |
| 500 | Une panne de notre côté. Le corps porte une phrase courte, sans détail technique. Ne la comparez pas caractère par caractère. La réponse porte un en-tête `X-Request-Id`. | Réessayez. Si la panne persiste, envoyez-nous la valeur de `X-Request-Id`. |
| 503 | Le service de plafonnement des appels est momentanément indisponible. Nous refusons l'appel. `detail` vaut `Rate limiting temporarily unavailable, please retry shortly`. | Réessayez dans quelques instants. Aucune donnée n'a été lue ni modifiée. |

## Voir aussi

- [`GET /partner/webhooks`](/reference/get-partner-webhooks/),
  lister vos abonnements aux notifications, page par page.
- [`PUT /partner/webhooks/{webhook_id}`](/reference/put-partner-webhooks-id/),
  modifier l'adresse, les événements ou le secret d'un abonnement.
- [`DELETE /partner/webhooks/{webhook_id}`](/reference/delete-partner-webhooks-id/),
  supprimer un abonnement et le secret de signature qui lui est attaché.
- [Recevoir les événements par webhook](/webhooks/),
  créer un abonnement, vérifier une signature, rattraper les événements
  perdus.
