Les webhooks d’OpenAI vous informent en temps réel des événements de l’API, par exemple lorsqu’un traitement par lots se termine, qu’une réponse est générée en arrière-plan ou qu’une tâche de fine-tuning s’achève. OpenAI envoie les webhooks à un point de terminaison HTTP que vous contrôlez, conformément à la spécification Standard Webhooks. Vous trouverez la liste complète des événements de webhook dans la référence de l’API.
Pour recevoir les notifications liées à la surveillance des défauts d’alignement pour un projet API, consultez la section Recevoir les alertes de sécurité d’un projet.
Pour recevoir, à l’échelle de votre organisation, les avertissements et les avis de désactivation concernant les identifiants de sécurité, consultez le guide Notifications relatives à l’application des règles de sécurité.
Pour les sessions de l’API Agents, consultez le guide Webhooks de session, qui décrit les événements de session et les stratégies de reprise. Pour configurer le serveur qui reçoit les webhooks, suivez les instructions de cette page sur la configuration du point de terminaison, la vérification des signatures et la livraison des événements.
Consultez la liste complète des événements de webhook.
Les exemples suivants montrent comment un serveur peut recevoir les webhooks d’OpenAI pour l’événement response.completed.
Pour exécuter les exemples Ruby, installez les dépendances requises avec
gem install openai webrick, puis définissez les variables OPENAI_API_KEY et
OPENAI_WEBHOOK_SECRET.
import os
from openai import OpenAI, InvalidWebhookSignatureError
from flask import Flask, request, Response
app = Flask(__name__)
client = OpenAI(webhook_secret=os.environ["OPENAI_WEBHOOK_SECRET"])
@app.route("/webhook", methods=["POST"])
def webhook():
try:
# with webhook_secret set above, unwrap will raise an error if the signature is invalid
event = client.webhooks.unwrap(request.data, request.headers)
if event.type == "response.completed":
response_id = event.data.id
response = client.responses.retrieve(response_id)
print("Response output:", response.output_text)
return Response(status=200)
except InvalidWebhookSignatureError as e:
print("Invalid signature", e)
return Response("Invalid signature", status=400)
if __name__ == "__main__":
app.run(port=8000)Pour voir ce webhook en action, configurez un point de terminaison de webhook dans le tableau de bord OpenAI et abonnez-le à response.completed. Envoyez ensuite une requête à l’API pour générer une réponse en arrière-plan.
Vous pouvez aussi déclencher des événements de test avec des données d’exemple depuis la page des paramètres des webhooks.
from openai import OpenAI
client = OpenAI()
resp = client.responses.create(
model="gpt-6-astra",
input="Write a very long novel about otters in space.",
background=True,
)
print(resp.status)Ce guide explique comment créer des points de terminaison de webhook dans le tableau de bord, mettre en place le code qui traite les requêtes côté serveur et vérifier que les requêtes entrantes proviennent bien d’OpenAI.
Création de points de terminaison de webhook
Pour recevoir les requêtes de webhook d’un projet sur votre serveur, connectez-vous au tableau de bord et ouvrez la page des paramètres des webhooks. La configuration décrite ici concerne les points de terminaison d’un projet. Pour les événements de sécurité à l’échelle de l’organisation, consultez le guide Notifications relatives à l’application des règles de sécurité.
Cliquez sur le bouton « Créer » pour créer un point de terminaison de webhook. Renseignez les trois éléments suivants :
- Un nom qui vous permettra de reconnaître le point de terminaison.
- L’URL publique d’un serveur que vous contrôlez.
- Un ou plusieurs types d’événements auxquels vous souhaitez vous abonner. Chaque fois qu’un de ces événements se produit, OpenAI envoie une requête HTTP POST à l’URL indiquée.
Après avoir créé un webhook, vous recevrez un secret de signature qui vous permettra de vérifier les requêtes de webhook entrantes côté serveur. Enregistrez ce secret pour pouvoir l’utiliser ultérieurement, car vous ne pourrez plus l’afficher.
Une fois le point de terminaison de webhook créé dans le tableau de bord, configurez le point de terminaison côté serveur qui traitera les données des événements reçus.
Traitement des requêtes de webhook sur un serveur
Lorsqu’un événement auquel vous avez souscrit se produit, OpenAI envoie à l’URL de votre webhook une requête HTTP POST comme celle-ci :
POST https://yourserver.com/webhook
user-agent: OpenAI/1.0 (+https://platform.openai.com/docs/webhooks)
content-type: application/json
webhook-id: wh_685342e6c53c8190a1be43f081506c52
webhook-timestamp: 1750287078
webhook-signature: v1,K5oZfzN95Z9UVu1EsfQmfVNQhnkZ2pj9o9NDN/H/pI4=
{
"object": "event",
"id": "evt_685343a1381c819085d44c354e1b330e",
"type": "response.completed",
"created_at": 1750287018,
"data": { "id": "resp_abc123" }
}
Votre point de terminaison doit répondre rapidement à ces requêtes HTTP en renvoyant un code de succès (2xx) pour en confirmer la réception. Pour éviter les dépassements de délai, nous vous recommandons de confier tout traitement conséquent à un processus en arrière-plan afin que le point de terminaison puisse répondre immédiatement.
Si le point de terminaison ne renvoie pas de code de succès (2xx) ou ne répond pas en quelques secondes, OpenAI renvoie la requête de webhook. OpenAI réessaie pendant 72 heures au maximum, en augmentant de façon exponentielle le délai entre les tentatives. OpenAI considère les redirections 3xx comme des échecs et ne les suit pas. En cas de redirection, mettez à jour votre point de terminaison pour utiliser l’URL de destination finale.
Dans de rares cas, un problème interne peut amener OpenAI à envoyer plusieurs fois le même événement de webhook. Utilisez l’en-tête webhook-id comme clé d’idempotence pour éliminer les doublons.
Test des webhooks en local
Pour tester les webhooks, vous avez besoin d’une URL accessible publiquement sur Internet. Cela peut compliquer le développement, car votre environnement local n’est probablement pas accessible depuis Internet. Voici quelques solutions :
- ngrok permet de rendre votre serveur localhost accessible via une URL publique.
- Les environnements de développement dans le cloud, comme Replit, GitHub Codespaces, Cloudflare Workers ou v0 de Vercel.
Vérification des signatures de webhook
Vous pouvez recevoir les événements de webhook d’OpenAI et en traiter les résultats sans vérifier leur origine. Il est toutefois recommandé de vérifier que les requêtes entrantes proviennent bien d’OpenAI, en particulier si votre webhook déclenche une action côté serveur. Les en-têtes des requêtes de webhook contiennent des informations qui, associées à la clé secrète du webhook, permettent d’en vérifier l’origine.
Lorsque vous créez un point de terminaison de webhook dans le tableau de bord OpenAI, vous recevez un secret de signature. Rendez-le accessible sur votre serveur via une variable d’environnement :
export OPENAI_WEBHOOK_SECRET="<your secret here>"
La façon la plus simple de vérifier les signatures de webhook consiste à utiliser la méthode unwrap() fournie par les utilitaires des SDK officiels d’OpenAI :
import os
from flask import request
from openai import OpenAI
client = OpenAI()
webhook_secret = os.environ["OPENAI_WEBHOOK_SECRET"]
# will raise if the signature is invalid
event = client.webhooks.unwrap(
request.data,
request.headers,
secret=webhook_secret,
)Vous pouvez aussi vérifier les signatures avec les bibliothèques Standard Webhooks :
$webhook_secret = getenv("OPENAI_WEBHOOK_SECRET");
$wh = new \StandardWebhooks\Webhook($webhook_secret);
$wh->verify($webhook_payload, $webhook_headers);Si nécessaire, vous pouvez implémenter votre propre mécanisme de vérification des signatures en suivant la procédure décrite dans la spécification Standard Webhooks.
Si vous perdez votre secret de signature ou le divulguez par inadvertance, vous pouvez en générer un nouveau en renouvelant le secret de signature.