# Les corrections dans vos outils

> Chaque demande de corrections arrive signée sur votre route, avec le commentaire du client, prête à devenir un ticket.

Canonical: https://colis-docs.vercel.app/docs/cas-d-usage/corrections-dans-vos-outils · Markdown: https://colis-docs.vercel.app/docs/cas-d-usage/corrections-dans-vos-outils.md

## Le problème

Les retours clients se perdent entre l’e-mail, la messagerie et les appels. Celui qui compte, « le
logo en SVG, et le fond plus clair », doit finir dans votre outil de suivi.

## La démarche

Pointez `DROP_WEBHOOK_URL` vers une route à vous, et vérifiez la signature avec `verifyWebhook` de
`@colis/protocol`, le même code que celui qui signe :

```ts title="app/api/colis/route.ts"
import { verifyWebhook, type ColisWebhookEvent } from '@colis/protocol'

export async function POST(request: Request) {
  const body = await request.text()
  const result = await verifyWebhook(process.env.DROP_WEBHOOK_SECRET!, request.headers, body)
  if (!result.valid) return new Response(null, { status: 401 })

  const event = JSON.parse(body) as ColisWebhookEvent

  if (event.type === 'parcel.changes_requested') {
    await createTicket({
      title: `Corrections : ${event.data.filename ?? event.data.code}`,
      body: event.data.comment ?? '',
      reference: event.data.code,
      link: event.data.url,
    })
  }

  return new Response(null, { status: 204 })
}
```

`createTicket` est votre code : l’API de votre outil de suivi. Le code du colis relie le ticket à la
livraison ; le lien ramène au fichier tant qu’il vit.

## À surveiller

- **Lisez le corps brut.** La signature porte sur les octets reçus : `request.text()` avant tout
  `JSON.parse`.
- **Cinq minutes de tolérance.** Un horodatage décalé de plus de cinq minutes est refusé, pour qu’une
  ancienne livraison ne puisse pas être rejouée.
- **Répondez vite, et une fois.** Une nouvelle tentative porte le même `webhook-id` : gardez-le pour
  ne pas créer deux tickets. Une réponse `4xx` autre que `408` et `429` n’est pas retentée.
- **Aucun secret dans l’événement.** `data` ne contient jamais le mot de passe, son empreinte, ni le
  jeton de l’expéditeur.
