Passer au contenu principal
Nous étendons activement la prise en charge 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 :
  • URLs de webhook par défaut pour toute l’équipe
  • Signatures cryptographiques pour la vérification des charges utiles
Vous souhaitez 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 connaître le 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 de 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 des webhooks 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 ex., event.batch.completed)
timestampQuand cette tentative de livraison a été envoyée (epoch ms)
delivery_attemptTentative actuelle / tentatives max (par ex., 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 la 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 d’état 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éessayer (nous ne suivons pas les redirections)
400 Bad Request❌ Réessayer
500 Server Error❌ Réessayer
Timeout (>30s)❌ Réessayer
Connexion refusée❌ Réessayer

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 — ce qui entraînera 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)
    
    # Retourner immédiatement
    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, l’horodatage 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 des 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 publiquement accessible (pas localhost)
  3. Consultez les journaux de votre serveur pour les requêtes entrantes
  4. Assurez-vous de renvoyer un code d’état 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épondre immédiatement

À Venir

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 Signature

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