WebsiteCategorizationAPI
Home
Demo Tools - Categorization
Website Categorization Text Classification URL Database Taxonomy Mapper
Demo Tools - Website Intel
Technology Detector Quality Score Competitor Finder
Demo Tools - Brand Safety
Brand Safety Checker Brand Suitability Quality Checker
Demo Tools - Content
Sentiment Analyzer Context Aware Ads
MCP Servers
MCP Real-Time API MCP Database Lookup
Agentic Workflows
AI Agent Database 100 Use Cases Hedge Fund Workflows Banking Workflows Healthcare Workflows E-Commerce Workflows SaaS Workflows View All 47 Industries →
Domains By
Domains for your ICP Domains by Vertical Domains by Country Domains by Technologies
Resources
API Documentation Pricing Login
Try Categorization

Webhooks Guide

Receive real-time notifications for batch processing completion and asynchronous operations via webhooks.

Understanding Webhooks

Webhooks provide a way for our API to notify your application when certain events occur, such as completion of batch processing jobs. Instead of polling the API repeatedly to check job status, you can register a webhook URL and receive a POST request when the operation completes. This enables efficient asynchronous workflows for large-scale data processing.

Setting Up Webhooks

Configure your webhook endpoint in your dashboard or include it in API requests that support webhook callbacks:

// Include webhook URL in batch request
POST /v1/batch/categorize
{
  "domains": ["example1.com", "example2.com", "..."],
  "webhook_url": "https://your-app.com/webhooks/categorization",
  "webhook_secret": "your_webhook_secret"
}

Webhook Events

We send webhooks for the following event types:

batch.completed

Triggered when a batch categorization job finishes processing all domains. Includes results summary and download link for full results.

batch.failed

Triggered if a batch job fails due to errors. Includes error details and partial results if available.

quota.warning

Triggered when your API usage reaches 80% of your monthly quota. Helps you anticipate and manage usage limits.

quota.exceeded

Triggered when your monthly quota is exhausted. Prompts you to upgrade your plan to continue service.

Webhook Payload Structure

Webhook payloads follow a consistent structure with event metadata and event-specific data:

{
  "event": "batch.completed",
  "timestamp": "2024-01-15T10:30:00Z",
  "webhook_id": "wh_abc123xyz",
  "data": {
    "batch_id": "batch_def456",
    "total_domains": 1000,
    "successful": 985,
    "failed": 15,
    "processing_time_seconds": 45,
    "results_url": "https://api.websitecategorizationapi.com/v1/batch/batch_def456/results"
  }
}

Verifying Webhook Signatures

All webhooks include a signature header for verification. Always verify signatures to ensure webhooks originated from our servers:

// Webhook headers
X-Webhook-Signature: sha256=abcd1234...
X-Webhook-Timestamp: 1705315800

// Verification in Node.js
const crypto = require('crypto');

function verifyWebhook(payload, signature, secret) {
  const timestamp = req.headers['x-webhook-timestamp'];
  const signedPayload = `${timestamp}.${JSON.stringify(payload)}`;
  const expectedSignature = crypto
    .createHmac('sha256', secret)
    .update(signedPayload)
    .digest('hex');
  return `sha256=${expectedSignature}` === signature;
}

Security Best Practice

Always verify webhook signatures before processing. Reject webhooks with invalid signatures to prevent spoofed requests. Store your webhook secret securely using the same practices as your API key.

Handling Webhook Delivery

Your webhook endpoint should respond quickly with a 2xx status code to acknowledge receipt. We retry failed deliveries with exponential backoff:

  • Initial delivery attempt immediately after event
  • First retry after 30 seconds
  • Second retry after 2 minutes
  • Third retry after 10 minutes
  • Final retry after 1 hour
// Example webhook handler (Express.js)
app.post('/webhooks/categorization', (req, res) => {
  // Verify signature first
  if (!verifyWebhook(req.body, req.headers['x-webhook-signature'], WEBHOOK_SECRET)) {
    return res.status(401).send('Invalid signature');
  }

  // Acknowledge receipt immediately
  res.status(200).send('OK');

  // Process webhook asynchronously
  processWebhookAsync(req.body);
});

Ready to Implement Webhooks?

Start building efficient asynchronous workflows with webhook notifications.

View Full Documentation