# GET /partner-portal/interventions

Lister les interventions que votre compte partenaire a enregistrées, de la plus récente à la plus ancienne. Session de compte partenaire.

Source : https://docs.sealtrust.io/reference/get-partner-portal-interventions/

---

Vous recevez l'historique des événements de cycle de vie dont votre compte
est l'auteur : la réparation, la maintenance, le reconditionnement, le service
après-vente, le recyclage, la fin de vie, la destruction et le retour. En
pratique, ce sont les interventions que vous avez enregistrées depuis le
portail partenaire. Chaque entrée porte le produit concerné, le niveau de
preuve retenu au moment de l'enregistrement et la date. La liste est paginée
et triée de la plus récente à la plus ancienne.

Adresse complète :

```http
GET https://api.sealtrust.io/v1/partner-portal/interventions
```

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

## Autorisation

Session d'un compte partenaire, de type réparateur ou recycleur. Vous
présentez le jeton de session obtenu à la connexion (`POST /auth/login`) de
deux façons au choix :

- l'en-tête `Authorization: Bearer <jeton de session>`, pour un appel depuis
  votre propre code ;
- le cookie de session `access_token`, qu'un navigateur envoie tout seul quand
  vous appelez depuis le portail partenaire.

La clef d'API partenaire n'ouvre pas ce point d'entrée. Elle sert à la surface
machine à machine `/v1/partner/*`, qui est une surface distincte.

Un compte dont le rôle n'est ni réparateur ni recycleur reçoit un 403.

> [!INFO] Vos accréditations ne sont pas relues ici
> La liste retient les événements dont votre compte est l'auteur. Elle ne
> contient jamais ceux d'un autre partenaire. Si une marque retire votre
> accréditation, vous continuez à lire l'historique du travail que vous avez
> déjà enregistré chez elle. Ce sont la recherche d'un produit et
> l'enregistrement d'une nouvelle intervention qui exigent une accréditation
> active.

## Plafond d'appels

Un plafond d'appels s'applique à ce point d'entrée. Il est réglé pour l'usage
normal du portail, où vous cherchez un produit puis enregistrez une
intervention.

Au-delà, l'API répond 429. Le refus porte un en-tête `Retry-After` qui donne le
nombre de secondes à attendre. Attendez ce délai, puis rappelez.

Le plafond couvre l'ensemble du portail partenaire. Alterner entre les points
d'entrée ne vous redonne donc pas de marge. Espacez vos appels au lieu de les
envoyer en rafale.

La valeur du plafond n'est pas un engagement et peut changer sans préavis.
N'inscrivez aucun seuil en dur dans votre code, appuyez-vous sur `Retry-After`.

Ce point d'entrée ne consomme aucun quota de produits ni aucun quota
quotidien.

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

Ce point d'entrée n'a pas de paramètre de chemin.

| Nom | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `skip` | `integer` | non | Le nombre d'interventions à sauter avant de commencer la page. Vaut 0 par défaut. Envoyez une valeur négative et le service répond 422. |
| `limit` | `integer` | non | Le nombre d'interventions à rendre au maximum. Vaut 20 par défaut. Le minimum est 1, le maximum est 100. Sortez de ces bornes et le service répond 422, sans troncature silencieuse. |

Il n'existe aucun autre paramètre. La liste ne se filtre ni par produit, ni par
marque, ni par type d'intervention, ni par date. Faites ce tri dans votre code
à partir des champs rendus.

### En-têtes

| Nom | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `Authorization` | `string` | non | `Bearer` suivi de votre jeton de session. Obligatoire si vous n'envoyez pas le cookie de session. |
| `Cookie` | `string` | non | Le cookie `access_token`, posé par la connexion et envoyé automatiquement par un navigateur. Obligatoire si vous n'envoyez pas l'en-tête `Authorization`. |

Un appel serveur à serveur qui porte l'en-tête `Authorization` est accepté sans
en-tête `Origin` ni `Referer`. Un appel de navigateur qui porte le cookie de
session doit venir d'un domaine SealTrust autorisé, sinon la réponse est 403.

## Corps de la requête

Ce point d'entrée n'a pas de corps de requête. Toute l'information que vous
envoyez tient dans les deux paramètres de requête ci-dessus.

## Requête d'exemple

La première page, vingt interventions au maximum.

> [!INFO] L'onglet TypeScript appelle l'API avec `fetch`
> Le SDK TypeScript ne couvre pas le portail partenaire. Il s'authentifie par
> clef d'API et expose la vérification, les produits et les abonnements aux
> notifications. Lisez l'onglet TypeScript ci-dessous avant de le copier : il
> utilise `fetch`.

:::onglets
```bash title="curl"
curl -i -X GET "https://api.sealtrust.io/v1/partner-portal/interventions?skip=0&limit=20" \
  -H "Authorization: Bearer JETON-DE-SESSION-DE-DEMONSTRATION"
```
```typescript
const reponse = await fetch(
  "https://api.sealtrust.io/v1/partner-portal/interventions?skip=0&limit=20",
  {
    method: "GET",
    headers: {
      Authorization: "Bearer JETON-DE-SESSION-DE-DEMONSTRATION",
    },
  },
);

const page = await reponse.json();

console.log(reponse.status, page.total);
for (const intervention of page.items) {
  console.log(
    intervention.id,
    intervention.event_type,
    intervention.proof_level,
    intervention.product_name,
    intervention.occurred_at,
  );
}
```
```python
import requests

response = requests.get(
    "https://api.sealtrust.io/v1/partner-portal/interventions",
    headers={
        "Authorization": "Bearer JETON-DE-SESSION-DE-DEMONSTRATION",
    },
    params={"skip": 0, "limit": 20},
    timeout=30,
)

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

Pour lire la page suivante, augmentez `skip` de la valeur de `limit` : `skip=20`
avec `limit=20`, puis `skip=40`, et ainsi de suite. Le champ `total` vous donne
le nombre d'interventions à parcourir.

## Réponse d'exemple

Code HTTP `200`.

```json
{
  "total": 2,
  "count": 2,
  "skip": 0,
  "limit": 20,
  "items": [
    {
      "id": 812,
      "product_id": 4471,
      "brand_id": 12,
      "event_type": "repair",
      "proof_level": "customer_code",
      "title": "Remplacement du joint d'étanchéité",
      "description": "Joint remplacé, étanchéité contrôlée à 5 ATM.",
      "event_metadata": {
        "partner_type": "repairer",
        "replaced_parts": "joint torique",
        "cost_eur": 48,
        "notes": "Pièce d'origine"
      },
      "performed_by": "Atelier Exemple (réparateur accrédité)",
      "product_name": "Lampe d'atelier Exemple",
      "occurred_at": "2026-08-19T14:32:07.481920Z",
      "created_at": "2026-08-19T14:32:07.481920Z"
    },
    {
      "id": 796,
      "product_id": 4318,
      "brand_id": 12,
      "event_type": "maintenance",
      "proof_level": "declared",
      "title": "Révision annuelle",
      "description": null,
      "event_metadata": {
        "partner_type": "repairer"
      },
      "performed_by": "Atelier Exemple (réparateur accrédité)",
      "product_name": "Lampe d'atelier Exemple",
      "occurred_at": "2026-08-11T09:05:44.220118Z",
      "created_at": "2026-08-11T09:05:44.220118Z"
    }
  ]
}
```

La réponse compte cinq champs.

| Champ | Type | Description |
| --- | --- | --- |
| `total` | `integer` | Le nombre total d'interventions enregistrées sous votre compte, toutes pages confondues. |
| `count` | `integer` | Le nombre d'interventions réellement rendues dans cette page. |
| `skip` | `integer` | La valeur de `skip` appliquée, telle que vous l'avez envoyée. |
| `limit` | `integer` | La valeur de `limit` appliquée, telle que vous l'avez envoyée. |
| `items` | `array` | Les interventions de la page, de la plus récente à la plus ancienne. |

Chaque entrée de `items` compte douze champs.

| Champ | Type | Description |
| --- | --- | --- |
| `id` | `integer` | L'identifiant de l'intervention. |
| `product_id` | `integer` | Le produit qui porte cette intervention. |
| `brand_id` | `integer` | La marque à laquelle appartient ce produit. |
| `event_type` | `string` | Le type d'intervention. Voir la liste ci-dessous. |
| `proof_level` | `string` ou `null` | Ce que l'auteur a prouvé au moment de l'enregistrement. Voir la liste ci-dessous. |
| `title` | `string` | L'intitulé saisi à l'enregistrement. |
| `description` | `string` ou `null` | Le détail libre que vous avez saisi, ou `null`. |
| `event_metadata` | `object` ou `null` | Les informations complémentaires enregistrées avec l'intervention. Voir ci-dessous. |
| `performed_by` | `string` ou `null` | Le nom affiché de l'auteur, suivi de sa qualité entre parenthèses. |
| `product_name` | `string` ou `null` | Le nom du produit au moment de la lecture. Vaut `null` si le produit ne porte pas de nom, ou si la ligne produit n'est plus jointe. Ne vous en servez pas pour décider qu'un produit a disparu. |
| `occurred_at` | `string` | La date de l'intervention, au format ISO 8601 avec fuseau. |
| `created_at` | `string` | La date d'écriture de l'enregistrement, au format ISO 8601 avec fuseau. |

> [!ATTENTION] Le champ s'appelle `metadata` quand vous écrivez et `event_metadata` quand vous lisez
> `POST /v1/partner-portal/interventions` attend vos informations
> complémentaires sous le nom `metadata`. Cette liste vous les rend sous le nom
> `event_metadata`. Le contenu est le même. Prévoyez les deux noms si vous
> écrivez et relisez dans le même code.

`event_type` prend l'une des huit valeurs qu'un compte partenaire peut
enregistrer. Quatre relèvent de la réparation : `repair`, `maintenance`,
`reconditioning`, `after_sale_service`. Quatre relèvent de la fin de vie :
`recycling`, `end_of_life`, `destruction`, `return`. Une même entrée ne porte
qu'une seule de ces valeurs.

`proof_level` prend l'une de ces valeurs.

| Valeur | Ce qu'elle veut dire |
| --- | --- |
| `declared` | Vous avez saisi un identifiant de produit et rien d'autre. |
| `customer_code` | Le client a généré un code à usage unique et vous l'a communiqué. |
| `work_order` | La marque a émis un ordre de travail nommant ce produit et votre compte. |
| `null` | Nous n'avons pas posé la question à cet enregistrement. Il date d'avant l'existence des niveaux de preuve, ou il vient d'un autre chemin que le portail partenaire. |

Le service écrit `proof_level` à la création et ne le modifie plus jamais.

`event_metadata` porte la clef `partner_type`, qui vaut `repairer` ou
`recycler`, sur les interventions enregistrées depuis le portail partenaire.
Le champ peut valoir `null`, et une entrée plus ancienne peut ne pas porter
cette clef. Testez sa présence avant de la lire.

Les autres clefs sont celles que vous avez envoyées. Le portail partenaire y
écrit `replaced_parts` et `cost_eur` pour une réparation,
`recovered_materials` et `method` pour un traitement de fin de vie, et `notes`
dans les deux cas.

> [!INFO] Le filtre porte sur l'auteur de l'événement
> Un événement écrit par la marque depuis sa console, ou par un autre
> partenaire, ne fait pas partie de cette liste. En revanche, si votre compte a
> demandé une réparation sur un produit qu'il possède en tant que client, cet
> événement figure aussi dans la liste, avec `proof_level` à `null` et sans
> clef `partner_type`. Une marque sans intervention de votre part vous renvoie
> un 200 avec `items` vide et `total` à 0.

## Erreurs

Le corps d'une réponse d'erreur porte un champ `detail`. Selon le cas, ce champ
contient une phrase ou une liste.

| Code | Condition | Que faire |
| --- | --- | --- |
| 401 | Aucun jeton de session n'accompagne l'appel, ni en en-tête `Authorization`, ni en cookie. La réponse porte aussi `WWW-Authenticate: Bearer`. | Connectez-vous, puis envoyez le jeton obtenu. |
| 401 | Une déconnexion ou un changement de mot de passe a révoqué le jeton. | Reconnectez-vous pour obtenir un nouveau jeton. |
| 401 | Le jeton présenté n'est pas un jeton de session. Un jeton en attente de vérification à deux facteurs donne le message `MFA verification required`. | Terminez la connexion, y compris la vérification à deux facteurs, puis utilisez le jeton de session. |
| 401 | Le jeton ne porte aucune adresse e-mail. | Reconnectez-vous. |
| 401 | Le service n'a pas pu lire le jeton du tout. Le message est `Invalid JWT token`. | Reconnectez-vous. Si l'erreur revient, contactez le support. |
| 401 | Le compte n'est plus actif. | Contactez la marque qui vous a accrédité, ou le support. |
| 403 | Le jeton est expiré, mal formé, ou sa signature ne correspond pas. Le message est `Token invalide`. | Reconnectez-vous. Traitez ce 403 comme une session à renouveler. |
| 403 | Le compte n'est ni un compte réparateur ni un compte recycleur. | Utilisez le compte partenaire que la marque a accrédité. Un compte administrateur de marque n'ouvre pas cette surface. |
| 403 | L'appel vient d'un navigateur, porte le cookie de session et n'annonce ni `Origin` ni `Referer`. | Appelez depuis le portail partenaire, ou passez à l'en-tête `Authorization` pour un appel serveur à serveur. |
| 403 | L'appel vient d'un domaine qui n'est pas autorisé. Le message est `Forbidden origin`. | Appelez depuis un domaine SealTrust, ou passez à l'en-tête `Authorization`. |
| 404 | Le compte désigné par le jeton n'existe plus. | Reconnectez-vous. Si le compte a été supprimé, demandez une nouvelle accréditation à la marque. |
| 422 | `skip` est négatif, `limit` est inférieur à 1 ou supérieur à 100, ou l'une des deux valeurs n'est pas un entier. `detail` est une liste qui nomme le paramètre fautif. | Corrigez la valeur. La borne haute de `limit` est 100. |
| 422 | Une valeur de pagination envoyée est hors des bornes que le service accepte. Le message est générique et ne nomme pas le paramètre. La réponse porte un en-tête `X-Request-Id`. | Réduisez `skip`. Une pagination normale reste très en dessous de cette borne. |
| 429 | Vous avez dépassé le plafond d'appels. La réponse porte un en-tête `Retry-After`. | Attendez le nombre de secondes indiqué par `Retry-After`, puis réessayez. Le plafond couvre tout le portail partenaire, espacez donc l'ensemble de vos appels. |
| 500 | Une erreur inattendue s'est produite pendant le traitement de votre appel. Le corps vaut `{"detail": "Internal Server Error"}` et la réponse porte un en-tête `X-Request-Id`. | Réessayez. Si l'erreur persiste, contactez le support en indiquant la valeur de `X-Request-Id`. |

Ce point d'entrée ne renvoie jamais 404 pour un historique vide. Un compte
partenaire qui n'a encore rien enregistré reçoit un 200 avec `items` vide et
`total` à 0.

## Voir aussi

- [`POST /partner-portal/interventions`](/reference/post-partner-portal-interventions/),
  enregistrer une intervention sur un produit.
- [`GET /partner-portal/products/{identifier}`](/reference/get-partner-portal-products/),
  retrouver un produit d'une marque qui vous a accrédité.
- [`GET /partner-portal/me`](/reference/get-partner-portal-me/),
  lire votre profil de partenaire et les marques qui vous ont accrédité.
