Passer au contenu principal
Nous élargissons activement le support des webhooks.Nouvellement ajouté : réessais automatiques avec backoff exponentiel — les livraisons échouées sont maintenant réessayées jusqu’à 5 fois sur 30 minutes.À venir bientôt :
  • URL de webhook par défaut pour toute l’équipe
  • Signatures cryptographiques pour la vérification des charges utiles
Vous voulez un accès anticipé ? Contactez-nous à info@olostep.com ou rejoignez notre communauté Slack.

Aperçu

Les webhooks envoient des notifications HTTP POST en temps réel à votre serveur lorsque des opérations de longue durée se terminent. Au lieu de sonder pour obtenir un statut, votre application reçoit des mises à jour instantanées.

Cas d’utilisation

Traitement Asynchrone

Recevez une notification lorsque des lots ou des crawls se terminent au lieu de sonder

Déclencheurs de Pipeline

Déclenchez automatiquement le traitement en aval lorsque les données sont prêtes

Alertes

Envoyez des alertes à Slack, par email, ou à d’autres systèmes à la fin

Synchronisation des Données

Gardez votre base de données synchronisée avec les résultats d’Olostep

Événements Pris en Charge

Déclenché lorsqu’un lot termine son traitement (tous les éléments terminés ou échoués).
{
  "id": "event_a1b2c3d4e5f6g7h8",
  "object": "event.batch.completed",
  "timestamp": 1737570000000,
  "delivery_attempt": "1/5",
  "data": {
    "id": "batch_xyz123",
    "object": "batch",
    "status": "completed",
    "items_total": 100,
    "items_completed": 98,
    "items_failed": 2,
    "created_at": "2024-01-15T10:00:00Z",
    "completed_at": "2024-01-15T10:05:32Z"
  }
}
Déclenché lorsqu’un crawl se termine et que toutes les pages découvertes ont été traitées.
{
  "id": "event_x9y8z7w6v5u4t3s2",
  "object": "event.crawl.completed",
  "timestamp": 1737570000000,
  "delivery_attempt": "1/5",
  "data": {
    "id": "crawl_abc789",
    "object": "crawl",
    "status": "completed",
    "start_url": "https://example.com",
    "urls_count": 87,
    "max_pages": 100,
    "max_depth": 3,
    "actual_max_depth": 3,
    "start_epoch": 1737569500000,
    "start_date": "2024-01-15"
  }
}

Configuration des Webhooks

Passez webhook lors de la création d’une ressource. Cette URL reçoit la notification de fin.
Nom du paramètre : Le paramètre canonique est webhook. Pour la compatibilité ascendante, webhook_url est également accepté comme alias.
import requests

# Exemple de lot
response = requests.post(
    "https://api.olostep.com/v1/batches",
    headers={"Authorization": "Bearer <YOUR_API_KEY>"},
    json={
        "items": [
            {"url": "https://example.com/page1", "custom_id": "1"},
            {"url": "https://example.com/page2", "custom_id": "2"}
        ],
        "webhook": "https://your-server.com/webhooks/olostep"
    }
)

# Exemple de crawl
response = requests.post(
    "https://api.olostep.com/v1/crawls",
    headers={"Authorization": "Bearer <YOUR_API_KEY>"},
    json={
        "start_url": "https://example.com",
        "max_pages": 50,
        "webhook": "https://your-server.com/webhooks/olostep"
    }
)

Charge Utile du Webhook

Toutes les charges utiles de webhook suivent une structure d’enveloppe unifiée :
{
  "id": "event_a1b2c3d4e5f6g7h8",
  "object": "event.batch.completed",
  "timestamp": 1737570000000,
  "delivery_attempt": "1/5",
  "data": {
    "id": "batch_xyz123",
    "object": "batch",
    "status": "completed",
    "items_total": 100,
    "items_completed": 98,
    "items_failed": 2
  }
}

Champs de l’Enveloppe

ChampDescription
idID de l’événement — identique pour toutes les tentatives de réessai
objectType d’événement (par exemple, event.batch.completed)
timestampQuand cette tentative de livraison a été envoyée (epoch ms)
delivery_attemptTentative actuelle / tentatives max (par exemple, 1/5, 3/5)
dataLes données réelles de la ressource (même format que la réponse API)
Utilisez le champ id pour dédupliquer les livraisons de webhooks dans votre récepteur. Le même ID d’événement apparaît dans toutes les tentatives de réessai.

Comportement de Réessai

Les livraisons de webhooks échouées sont automatiquement réessayées avec un backoff exponentiel sur une fenêtre de 30 minutes :
TentativeDélai Avant TentativeTemps Cumulé
1Immédiat0 min
2~2 min~2 min
3~4 min~6 min
4~7 min~13 min
5~15 min~28 min
Fenêtre totale de réessai : 30 minutes
Délai d’attente par requête : 30 secondes

Ce qui Compte comme un Succès

Votre point de terminaison doit renvoyer un code de statut 2xx dans les 30 secondes. Toute autre réponse déclenche un réessai.
RéponseRésultat
200 OK✅ Livré
201 Created✅ Livré
301 Redirect❌ Réessai (nous ne suivons pas les redirections)
400 Bad Request❌ Réessai
500 Server Error❌ Réessai
Timeout (>30s)❌ Réessai
Connexion refusée❌ Réessai

Bonnes Pratiques

Retournez 200 OK immédiatement et traitez le webhook de manière asynchrone. Si votre traitement prend plus de 30 secondes, nous réessayerons — causant des livraisons en double.
from queue import Queue
import threading

webhook_queue = Queue()

@app.route('/webhooks/olostep', methods=['POST'])
def handle_webhook():
    # File d'attente pour traitement asynchrone
    webhook_queue.put(request.json)
    
    # Retour immédiat
    return 'OK', 200

def process_webhooks():
    while True:
        event = webhook_queue.get()
        # Le traitement lent se fait ici
        process_event(event)

threading.Thread(target=process_webhooks, daemon=True).start()
Utilisez le champ id pour dédupliquer. Stockez les IDs d’événements traités et ignorez les doublons.
processed_events = set()  # Utilisez Redis/DB en production

def handle_event(event):
    if event['id'] in processed_events:
        return  # Déjà traité
    
    # Traitez l'événement
    process_batch_completed(event['data'])
    
    # Marquez comme traité
    processed_events.add(event['id'])
Enregistrez toutes les réceptions de webhooks pour le débogage. Incluez l’ID de l’événement, le timestamp, et le résultat du traitement.
import logging

@app.route('/webhooks/olostep', methods=['POST'])
def handle_webhook():
    event = request.json
    logging.info(f"Webhook reçu : id={event['id']} type={event['object']} tentative={event['delivery_attempt']}")
    
    try:
        process_event(event)
        logging.info(f"Webhook traité : id={event['id']}")
    except Exception as e:
        logging.error(f"Échec du webhook : id={event['id']} erreur={e}")
        raise
    
    return 'OK', 200
Utilisez toujours HTTPS pour les points de terminaison de webhooks. Les points de terminaison HTTP sont vulnérables à l’écoute clandestine et aux attaques de type man-in-the-middle.

Dépannage

  1. Vérifiez que le paramètre webhook a été inclus dans votre requête
  2. Vérifiez que votre point de terminaison est accessible publiquement (pas localhost)
  3. Vérifiez les journaux de votre serveur pour les requêtes entrantes
  4. Assurez-vous de retourner un code de statut 2xx
Cela est attendu lors des réessais. Implémentez une gestion idempotente en utilisant le champ id :
def handle_event(event):
    if already_processed(event['id']):
        return  # Ignorer le doublon
    
    process_event(event)
    mark_processed(event['id'])
Votre point de terminaison doit répondre dans les 30 secondes. Traitez les webhooks de manière asynchrone :
@app.route('/webhooks', methods=['POST'])
def webhook():
    queue.enqueue(process_webhook, request.json)
    return 'OK', 200  # Réponse immédiate

À Venir Bientôt

URL par Défaut pour l'Équipe

Configurez une URL de webhook par défaut dans les paramètres de votre compte. Toutes les requêtes utiliseront cette URL sauf si elle est remplacée.

Vérification de la Signature

Signatures cryptographiques (HMAC-SHA256) pour vérifier que les charges utiles des webhooks proviennent d’Olostep.
Vous voulez un accès anticipé à ces fonctionnalités ? Contactez-nous à info@olostep.com ou rejoignez notre communauté Slack.