We’re actively expanding webhook support.Just landed: automatic retries with exponential backoff — failed deliveries are now retried up to 5 times over 30 minutes.Coming soon:
- Team-wide default webhook URLs
- Cryptographic signatures for payload verification
Overview
Webhooks deliver real-time HTTP POST notifications to your server when long-running operations complete. Instead of polling for status, your application receives instant updates.Use Cases
Async Processing
Get notified when batches or crawls complete instead of polling
Pipeline Triggers
Automatically trigger downstream processing when data is ready
Alerting
Send alerts to Slack, email, or other systems on completion
Data Sync
Keep your database in sync with Olostep results
Supported Events
batch.completed
batch.completed
Fired when a batch finishes processing (all items completed or failed).
crawl.completed
crawl.completed
Fired when a crawl finishes and all discovered pages have been processed.
Setting Up Webhooks
Passwebhook when creating a resource. This URL receives the completion notification.
Parameter name: The canonical parameter is
webhook. For backward compatibility, webhook_url is also accepted as an alias.Webhook Payload
All webhook payloads follow a unified envelope structure:Envelope Fields
| Field | Description |
|---|---|
id | Event ID — same across all retry attempts |
object | Event type (e.g., event.batch.completed) |
timestamp | When this delivery attempt was sent (epoch ms) |
delivery_attempt | Current attempt / max attempts (e.g., 1/5, 3/5) |
data | The actual resource data (same format as API response) |
Retry Behavior
Failed webhook deliveries are automatically retried with exponential backoff over a 30-minute window:| Attempt | Delay Before Attempt | Cumulative Time |
|---|---|---|
| 1 | Immediate | 0 min |
| 2 | ~2 min | ~2 min |
| 3 | ~4 min | ~6 min |
| 4 | ~7 min | ~13 min |
| 5 | ~15 min | ~28 min |
Per-request timeout: 30 seconds
What Counts as Success
Your endpoint must return a2xx status code within 30 seconds. Any other response triggers a retry.
| Response | Result |
|---|---|
200 OK | ✅ Delivered |
201 Created | ✅ Delivered |
301 Redirect | ❌ Retry (we don’t follow redirects) |
400 Bad Request | ❌ Retry |
500 Server Error | ❌ Retry |
| Timeout (>30s) | ❌ Retry |
| Connection refused | ❌ Retry |
Best Practices
Respond quickly, process async
Respond quickly, process async
Return
200 OK immediately and process the webhook asynchronously. If your processing takes longer than 30 seconds, we’ll retry — causing duplicate deliveries.Implement idempotent handlers
Implement idempotent handlers
Use the
id field to deduplicate. Store processed event IDs and skip duplicates.Log webhook receipts
Log webhook receipts
Log all webhook receipts for debugging. Include the event ID, timestamp, and processing result.
Use HTTPS endpoints
Use HTTPS endpoints
Always use HTTPS for webhook endpoints. HTTP endpoints are vulnerable to eavesdropping and man-in-the-middle attacks.
Troubleshooting
Not receiving webhooks
Not receiving webhooks
- Verify the
webhookparameter was included in your request - Verify your endpoint is publicly accessible (not localhost)
- Check your server logs for incoming requests
- Ensure you’re returning a
2xxstatus code
Receiving duplicate webhooks
Receiving duplicate webhooks
This is expected during retries. Implement idempotent handling using the
id field:Webhooks timing out
Webhooks timing out
Your endpoint must respond within 30 seconds. Process webhooks asynchronously:
Coming Soon
Team Default URL
Configure a default webhook URL in your account settings. All requests will use this URL unless overridden.
Signature Verification
Cryptographic signatures (HMAC-SHA256) to verify webhook payloads came from Olostep.
Want early access to these features? Contact us at [email protected] or join our Slack community.