Overview
The webhook integration allows you to send article data to any custom HTTP endpoint. This is perfect for custom CMS integrations, automation workflows, or connecting to platforms not natively supported.
Use Cases
- Custom CMS platforms
- Headless CMS integrations
- Automation workflows (Make, n8n, etc.)
- Content syndication
- Custom content pipelines
- Internal content management systems
Setup Instructions
- Go to Integrations in Sight AI
- Click Webhook
- Enter your webhook endpoint URL
- Select the HTTP method (POST is default)
- Add any custom headers if needed
- Click “Save”
Step 2: Test the Connection
- Click “Send Test”
- Verify your endpoint receives the test payload
- Check the response status
The test payload uses event type article.ready with "test": true and contains example article data. It may or may not include a signature depending on whether you’ve saved a webhook secret (see Security Options).
Step 3: Add Categories (Optional)
Categories let you organize articles into groups that map to your CMS or content structure. When an article is published, its assigned category is included in the webhook payload.
- In the webhook settings, click the “Categories” tab
- Click “Add Category”
- Fill in the category details:
| Field | Required | Description |
|---|
| Name | Yes | Display name (max 100 characters) |
| Slug | Yes | URL-friendly identifier, lowercase with hyphens only (max 100 characters) |
| Description | No | Optional description (max 500 characters) |
| External ID | No | Your external system’s category ID for mapping |
- Click “Save”
Slugs must be unique within a single webhook integration. You can add up to 100 categories per integration.
Categories are optional. Your webhook integration works without any categories configured. Add them when you need to route or organize articles in your receiving system.
Once categories are created, they appear as options when generating or editing articles — just like categories in WordPress, Webflow, or other CMS integrations.
When an article is synced, Sight AI sends a JSON payload to your endpoint:
{
"event_id": "evt_abc123",
"event": "article.ready",
"timestamp": "2024-01-15T10:30:00Z",
"article": {
"id": "article_abc123",
"slug": "article-title",
"title": "Article Title",
"content": "<p>Full HTML content...</p>",
"summary": "Article summary...",
"seo_title": "SEO Title",
"seo_meta_description": "Meta description for search engines",
"target_keyword": "target keyword",
"main_image_url": "https://...",
"thumbnail_image_url": "https://...",
"article_type": "explainer",
"category": "blog",
"author_name": "Author Name",
"read_time_minutes": 5,
"is_featured": false,
"published_at": "2024-01-15T10:30:00Z",
"created_at": "2024-01-15T10:30:00Z",
"updated_at": "2024-01-15T10:30:00Z"
},
"site": {
"id": "site_xyz789",
"name": "Your Site Name",
"host": "yoursite.com",
"canonical_host": "www.yoursite.com"
}
}
The category field contains the name of the category assigned to the article (not an ID). If no category was assigned, this field is null. To map categories to your CMS, set an External ID on each category in the webhook settings (see Step 3) — your endpoint can then look up the external ID by matching on the category name. The event_id serves as an idempotency key to prevent duplicate processing.
The site.host field contains the base domain (without www.), while site.canonical_host contains the domain exactly as you entered it in your site settings (preserving www. if set). Use canonical_host when constructing URLs that should match your site’s preferred domain format.
Configuration Options
HTTP Method
Choose the HTTP method for your webhook:
- POST — Most common, sends data in request body
- PUT — For update-style operations
Add custom headers for authentication or identification:
- Authorization — API key or bearer token
- X-API-Key — Custom API key header
- Content-Type — Defaults to
application/json
Send Mode
Control when webhooks are sent from the Settings tab:
- Manual (default) — Webhooks are only sent when you click “Sync to Webhook” on an article. This gives you full control over when data is sent.
- Automatic — Webhooks are sent automatically when article generation completes. Use this for fully automated workflows.
Automatic mode pairs well with Autopilot for a fully hands-off content pipeline: Autopilot generates articles, and the webhook delivers them to your system automatically.
Delivery Settings
Customize retry behavior and timeouts from the Settings tab:
| Setting | Default | Description |
|---|
| Max Retries | 3 | Number of retry attempts for failed deliveries (1-10) |
| Timeout | 30 seconds | How long to wait for your endpoint to respond before timing out |
Failed deliveries are retried with exponential backoff.
Managing Categories
After adding categories, you can manage them from the Categories tab:
- Edit — Update the name, slug, description, or external ID of any category
- Delete — Remove a category (articles previously assigned to it keep their category value)
Only team owners and admins can create, edit, or delete categories. All team members can view categories and assign them to articles.
Security Options
Configure security settings during webhook setup:
Verify SSL — Enabled by default. When on, Sight AI verifies the SSL certificate of your endpoint. Disable only for development/testing with self-signed certificates.
Sign Requests — Enabled by default. When on, Sight AI signs webhook requests with an HMAC-SHA256 signature using your webhook secret. The signature is included in the X-Sight-Signature header.
Test payloads may not be signed. When you click “Send Test”, the request is only signed if a webhook secret has already been saved and signing is enabled. If you’re testing before saving your integration, or if signing is disabled, the test payload will be sent unsigned. Your endpoint should allow unsigned requests for article.ready events where "test": true, while still requiring valid signatures for all other article.ready and article.updated events.
Webhook Secret
When request signing is enabled, Sight AI includes a signature header with every delivery:
X-Sight-Signature: sha256=abc123...
You can use a managed secret (auto-generated by Sight AI) or provide your own custom secret. To verify a webhook:
- Extract the raw JSON request body
- Compute the HMAC-SHA256 hash using your webhook secret
- Compare it to the signature in the
X-Sight-Signature header using a timing-safe comparison
If your endpoint doesn’t verify signatures on production events (article.ready, article.updated), attackers could send fake webhook requests to your server. Always verify signatures on non-test events.
Event Types
| Event | Description |
|---|
article.ready | Article was synced/published (test events include "test": true in the payload) |
article.updated | Article was updated and re-synced |
Test Payload
When you click “Send Test”, Sight AI sends an article.ready event with example data:
{
"event_id": "test_abc123...",
"event": "article.ready",
"timestamp": "2025-01-15T10:30:00Z",
"article": {
"id": "example_article_id",
"title": "Example Article: How to Build Better Content",
"slug": "example-article-how-to-build-better-content",
"content": "<h1>Example Article</h1><p>This is example content...</p>",
"summary": "Learn how to build better content...",
"seo_title": "Example Article: How to Build Better Content",
"seo_meta_description": "Learn how to build better content...",
"target_keyword": "build better content",
"main_image_url": "https://example.com/images/example.jpg",
"thumbnail_image_url": "https://example.com/images/example-thumb.jpg",
"article_type": "explainer",
"category": "Content Marketing",
"author_name": "Sight AI",
"read_time_minutes": 5,
"is_featured": false,
"published_at": null,
"created_at": "2025-01-15T10:30:00Z",
"updated_at": "2025-01-15T10:30:00Z"
},
"site": {
"id": "example_site_id",
"name": "Example Site",
"host": "https://example.com"
},
"test": true,
"message": "This is a test webhook from Sight AI with example payload structure"
}
Your endpoint should return a 2xx response for the test to pass. You can identify test events by checking for "test": true in the payload.
Response Handling
Your endpoint should respond with:
- 2xx — Success, delivery confirmed
- 4xx — Client error, will not retry
- 5xx — Server error, Sight AI will retry
Respond within 30 seconds to avoid timeout.
Retry Policy
Failed webhooks (5xx responses or timeouts) are retried with exponential backoff:
- First retry: 1 minute after failure
- Second retry: 5 minutes after first retry
- Third retry: 15 minutes after second retry
By default, Sight AI retries up to 3 times. You can adjust the max retries (1-10) and timeout in Settings > Delivery Settings.
If your endpoint fails 10 consecutive times across multiple deliveries, the integration is automatically paused to protect your server. Fix the issue and save your configuration to reactivate.
Delivery Logs
View webhook delivery history:
- Go to Integrations > Webhook
- Click “View Logs”
- See recent deliveries with status and response
Example Integrations
Zapier (via Webhooks by Zapier)
- Create a new Zap with “Webhooks by Zapier” trigger
- Select “Catch Hook”
- Copy the webhook URL
- Paste into Sight AI webhook configuration
- Set up your Zap actions
- Create a new scenario with Webhook module
- Select “Custom webhook”
- Copy the webhook URL
- Configure in Sight AI
- Add your Make actions
Troubleshooting
Webhook Not Received
- Verify the endpoint URL is correct and accessible
- Check for firewall or IP restrictions
- Ensure your server is running and responding
- Review delivery logs for error details
Authentication Failed
- Verify custom headers are configured correctly
- Check API key or token validity
- Ensure header names match what your endpoint expects
Active CMS
Sight AI supports only one active CMS integration per site at a time. When you set Webhook as your active CMS, articles are synced to your webhook endpoint instead of any previously active CMS (e.g., WordPress or Webflow).
To set Webhook as your active CMS, click “Set as Active CMS” on the webhook setup page. You can switch to a different CMS at any time from the Integrations hub — your webhook configuration is preserved.
Disconnecting
To disable the webhook:
- Go to Integrations > Webhook
- Click “Disable” or delete the webhook URL
- Save changes
Next Steps