POST request with a JSON payload to a URL you configure.
Use webhooks to trigger downstream workflows: notify a CMS, update a search index, fetch player data for a native app, or sync content across systems. See the Pugpig integration guide for a common app-distribution pattern.
Webhooks API
Create, update, test, and manage webhooks programmatically.
How it works
- Content is created or updated in BeyondWords—via the API, WordPress, Ghost, Magic Embed, RSS Feed Importer, or the dashboard.
- BeyondWords processes the content (audio/video generation).
- When processing completes, fails, or the content item is deleted, BeyondWords sends a webhook notification to each enabled webhook URL in your project.
- Your endpoint receives a JSON payload and responds with a
2xxstatus code.
4xx or 5xx, or the request times out, BeyondWords will retry with exponential backoff.
Event types
action_type | When it fires |
|---|---|
audio.updated | Generation or regeneration completed successfully |
audio.error | Generation failed |
audio.deleted | Content item deleted |
Set up a webhook
Enter webhook URL
Enter the HTTPS URL where BeyondWords should send event notifications. This should be an endpoint on your server that accepts
POST requests with a JSON body.Set request headers (optional)
For paywalled or protected content, you may need to provide authentication headers to grant BeyondWords servers access to your content:
- Add a Header name and Header value
- Click + to add additional headers if needed
- Click Save changes
Requests will be made with
User-Agent: BeyondWords ImporterEnable static IP (optional)
If your endpoint requires IP allowlisting, enable static IP so webhook requests originate from a fixed address.
- Switch Static IP on
- Allowlist the displayed IP addresses in your firewall, CDN, or server configuration
Webhook requests are sent from
20.234.8.180 when static IP is enabled.Test your webhook
Quick preview with Webhook.site
If you want to see what a webhook payload looks like without building an endpoint, use Webhook.site. It gives you a temporary URL that logs any requests sent to it.- Open webhook.site and copy your unique URL
- In BeyondWords, go to Settings → Webhooks and paste that URL into Webhook URL
- Click Test, or publish content and wait for a real
audio.updatedevent - Return to Webhook.site to inspect the JSON payload, headers, and timestamp
Test from the dashboard
Before going live with your own endpoint:- Configure your Webhook URL and optional headers
- Click Test
2xx response. You can also test a webhook via the API.
Payload reference
Each notification is aPOST request with Content-Type: application/json. The event type is in action_type.
Common fields
| Field | Description |
|---|---|
action_type | Event type: audio.updated, audio.error, or audio.deleted |
state | Processing state at the time of the event—processed or error |
id | Numeric content ID (legacy) |
content_id | Content UUID—use with the player API |
source_id | Your external ID for the content (e.g. CMS article ID)—same value as external_id |
external_id | Same as source_id |
project_id | Your BeyondWords project ID |
title | Content title |
published | Whether the content is published in BeyondWords |
published_at | Publish timestamp (ISO 8601) |
processing_at | Processing timestamp (ISO 8601) |
deleted | Whether the content item has been deleted |
metadata | Custom metadata object |
media | Array of generated media objects (id, content_type, url, duration) |
audio_with_intro_outro | Intro/outro media variants, when configured |
image_url | Featured image URL, if set |
is_copy | Whether this content item is a duplicate of another |
source_id or get player by content ID using content_id.
audio.updated
Triggered when generation or regeneration completes successfully.audio.updated payload
audio.error
Triggered when generation fails.audio.error payload
audio.deleted
Triggered when a content item is deleted.audio.deleted payload
Managing webhooks
You can create multiple webhooks per project—for example, one for your CMS and one for a partner integration. For each webhook you can:- Edit the URL, headers, or static IP settings
- Temporarily disable it with the Enabled toggle
- Delete it when no longer needed
- View delivery status and errors in the dashboard
Security and reliability
- Use HTTPS—webhook URLs must be served over HTTPS.
- Authenticate requests—configure request headers (such as
Authorization) in the webhook settings. Validate these on your server before processing the payload. BeyondWords does not sign payloads with a shared secret—authentication is via the headers you configure. - Allowlist static IPs—if your endpoint is behind a firewall, enable static IP and allowlist the BeyondWords egress addresses.
- Respond quickly—return a
2xxresponse promptly. Process the payload asynchronously if needed. - Handle retries—failed deliveries are retried automatically. Make your handler idempotent so duplicate notifications for the same
content_idandaction_typedo not cause problems. - Map content reliably—prefer
source_idovertitleor URLs, which can change.
FAQs
When does audio.updated fire?
When does audio.updated fire?
audio.updated fires when audio/video generation or regeneration completes successfully—when the content item reaches the processed state. It does not fire when generation starts, only when it finishes (or fails, in which case audio.error fires instead).How do I map a webhook back to my CMS article?
How do I map a webhook back to my CMS article?
Use
source_id in the payload—this is the external ID you set when creating content (your CMS article ID, WordPress post ID, RSS guid, etc.). If you did not set a source_id, use content_id and store the mapping in your system, or look up content in the BeyondWords dashboard.What should my endpoint return?
What should my endpoint return?
Return any
2xx HTTP status code to acknowledge receipt. Responses with 4xx or 5xx status codes, or timeouts, are treated as failures and will be retried.Do webhooks include video?
Do webhooks include video?
Yes. Although event names reference audio, payloads describe the whole content item. Check the
media array for generated assets. For full player configuration including video, use the player API after receiving the webhook.Can I use webhooks with Magic Embed or WordPress?
Can I use webhooks with Magic Embed or WordPress?
Yes. Any integration that creates content in BeyondWords can trigger webhooks when processing completes. Set a stable
source_id in your embed code or CMS integration so webhook payloads map cleanly to your articles. See Magic Embed and WordPress.How are webhooks different from polling the API?
How are webhooks different from polling the API?
Webhooks push notifications to your server when events occur. Polling requires your server to repeatedly call the content API or player API to check whether processing has finished. Webhooks are more efficient for workflows that need to react promptly when generation completes.