Recevoir en temps réel les créations, modifications et suppressions de médias et de Références, au lieu d'interroger l'API en boucle.
Un webhook est une URL de votre système que Grand Shooting appelle quand quelque chose change sur le compte : un média chargé, validé, retaggé, une Référence importée… Votre intégration réagit dans les secondes qui suivent, sans consommer son quota d'API à vérifier s'il y a du nouveau.
Un abonnement associe une URL à un topic :
| Topic | Déclenché quand |
|---|---|
pictures/create | un média est créé (upload, export…) |
pictures/update | un média est modifié (statut, tags, nouvelle version, Référence, Code de vue…) |
pictures/delete | un média est supprimé |
references/create | une Référence est créée |
references/update | une Référence est modifiée |
references/delete | une Référence est supprimée |
Les événements sont génériques : il n'y a pas de topic « média validé ». Pour ne traiter que les médias validés, abonnez-vous à pictures/update et filtrez sur picturestatus dans le message.
Depuis l'administration du compte, menu Équipe > API, rubrique webhooks (administrateurs du compte), ou par l'API :
curl -X POST -H "Authorization: Bearer $GS_TOKEN" -H "Content-Type: application/json" \
-d '{"address":"https://monapp.example/gs/webhook-7f3a9c","topic":"pictures/update"}' \
https://api.grand-shooting.com/v3/webhook
Un abonnement = une URL + un topic : pour suivre plusieurs topics, créez un abonnement par topic (la même URL peut servir pour tous). GET /webhook liste les abonnements du compte, PUT /webhook/{webhook_id} en modifie un, DELETE /webhook/{webhook_id} le supprime.
L'adresse est enregistrée en minuscules. Si votre URL contient un jeton ou un chemin sensible à la casse, choisissez-le en minuscules.
Un nouvel abonnement reçoit ses premiers événements dans la minute.
Grand Shooting envoie un POST en JSON. Les événements sont regroupés : un message porte jusqu'à 100 objets du même compte et du même topic, et contient directement leur état complet (la même chose que GET /picture/{id} ou GET /reference/{id}) :
{
"account_id": 10229487,
"topic": "pictures/update",
"type": "picture",
"ids": [175, 176],
"data": {
"175": { "picture_id": 175, "bench_root_id": 19, "picturestatus": 50, "ref": "SS26-ROBE-110", "…": "…" },
"176": { "picture_id": 176, "bench_root_id": 19, "picturestatus": 40, "ref": "SS26-ROBE-110", "…": "…" }
}
}
type vaut picture ou reference ; ids liste les objets concernés.data donne l'état de chaque objet au moment de l'envoi (il peut donc être plus récent que l'événement lui-même). Pour un objet supprimé ou illisible, la valeur est null.picture_id (ou reference_id), copie de ids, est déprécié et sera supprimé : utilisez ids.update peut arriver sans changement visible. Traitez chaque message comme l'état actuel de l'objet, pas comme une différence.account_id est bien un compte attendu, et pour les actions sensibles relisez l'objet par l'API authentifiée à partir de ids plutôt que de vous fier à data.GET /picture?date_mod=gte:…) comble les trous éventuels.Exemple de récepteur (Node.js / Express) :
app.post('/gs/webhook-7f3a9c', express.json({ limit: '20mb' }), (req, res) => {
const { account_id, topic, ids } = req.body;
if (!EXPECTED_ACCOUNTS.has(account_id)) return res.sendStatus(403);
res.sendStatus(200); // répondre avant de traiter
queue.push({ account_id, topic, ids });
});
Il n'y a pas d'événement de test. Pour essayer votre récepteur, modifiez un média ou une Référence du compte (un tag suffit) : le message arrive dans les secondes qui suivent.