> ## Documentation Index
> Fetch the complete documentation index at: https://docs.so-me.studio/llms.txt
> Use this file to discover all available pages before exploring further.

# Webhooks du SDK

> Créez des abonnements webhook intégrés et vérifiez les charges utiles d'événements signées

Les webhooks intégrés notifient votre serveur lorsqu'une activité survient pour n'importe quel utilisateur final de
votre projet partenaire. Chaque charge utile identifie l'utilisateur final concerné afin que vous puissiez
la router vers le bon client.

## Créer un abonnement

Les endpoints de webhook doivent utiliser HTTPS et être accessibles publiquement.

```ts theme={null}
const webhook = await soMe.webhooks.create({
  url: "https://app.example.com/webhooks/so-me",
  events: ["post.published", "post.failed"],
});

// Save this value immediately; it is returned only on creation.
await secrets.store("some-webhook-secret", webhook.secret!);
```

Omettez `events`, ou transmettez un tableau vide, pour recevoir tous les événements reconnus
survenant pour vos utilisateurs finaux intégrés.

```ts theme={null}
const subscriptions = await soMe.webhooks.list();
await soMe.webhooks.remove(webhook.id);
```

Les événements utiles pour une intégration de publication embarquée sont notamment :

| Événement | Signification |
| - | - |
| `social.account_connected` | Un compte social a été connecté |
| `social.account_disconnected` | Un compte social a été déconnecté |
| `post.scheduled` | Une publication est entrée dans la file de publication |
| `post.published` | La plateforme sociale a accepté la publication |
| `post.failed` | La publication a échoué |

## Vérifier la signature

Social media studio signe le corps brut exact de la requête HTTP avec HMAC-SHA256. Lisez le corps en
texte ou en octets et vérifiez-le avant d'analyser le JSON.

```ts theme={null}
import {
  verifyWebhookSignature,
  type EmbeddedWebhookEvent,
} from "@social-media-scheduler/sdk";

export async function POST(request: Request) {
  const rawBody = await request.text();
  const signature = request.headers.get("x-webhook-signature") ?? "";

  if (
    !verifyWebhookSignature(
      rawBody,
      signature,
      process.env.SOME_WEBHOOK_SECRET!,
    )
  ) {
    return new Response("Invalid signature", { status: 401 });
  }

  const event = JSON.parse(rawBody) as EmbeddedWebhookEvent;
  await handleEvent(event);
  return new Response(null, { status: 204 });
}
```

La signature peut être envoyée sous forme de condensé hexadécimal ou avec un préfixe `v1=` ; le
SDK accepte les deux formes.

## Structure de la charge utile

```json theme={null}
{
  "id": "delivery_uuid",
  "event": "post.published",
  "createdAt": "2026-08-20T10:00:04.000Z",
  "endUser": {
    "id": "end_user_uuid",
    "externalId": "customer_123"
  },
  "data": {
    "postId": "post_uuid",
    "platform": "THREADS"
  }
}
```

Les requêtes de livraison incluent également :

| En-tête | Description |
| - | - |
| `X-Webhook-Signature` | Signature HMAC-SHA256 du corps brut |
| `X-Webhook-Event` | Nom de l'événement |
| `X-Webhook-Delivery-Id` | Identifiant de livraison stable |

## Comportement de livraison

* Renvoyez une réponse `2xx` dès que l'événement est accepté de manière durable.
* Traitez les événements de façon asynchrone lorsque le travail peut prendre plus de quelques secondes.
* Dédoublonnez les livraisons à l'aide du `id` de la charge utile ou de
  `X-Webhook-Delivery-Id`.
* Les réponses non `2xx`, les échecs réseau et les expirations sont relancés avec un
  délai exponentiel.
* Les abonnements qui échouent de façon répétée sont désactivés automatiquement.

La livraison des webhooks est au moins une fois ; vos gestionnaires doivent donc être idempotents.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.