# Create ad
Source: https://docs.beyondwords.io/api-reference/ads/create
post /projects/{project_id}/ads
Creates an ad in a project
# Delete ad
Source: https://docs.beyondwords.io/api-reference/ads/delete
delete /projects/{project_id}/ads/{id}
Deletes an ad from a project
# List ads
Source: https://docs.beyondwords.io/api-reference/ads/list
get /projects/{project_id}/ads
Lists ads within a project
# Get ad
Source: https://docs.beyondwords.io/api-reference/ads/show
get /projects/{project_id}/ads/{id}
Gets an ad from a project
# Update ad
Source: https://docs.beyondwords.io/api-reference/ads/update
put /projects/{project_id}/ads/{id}
Updates an ad in a project
# Get ad analytics
Source: https://docs.beyondwords.io/api-reference/analytics/ad-analytics
get /projects/{project_id}/ads/{id}/analytics
Retrieve analytics for a single ad in a project.
# List ads analytics
Source: https://docs.beyondwords.io/api-reference/analytics/ads-analytics
get /projects/{project_id}/ads/analytics
Retrieve analytics overview for all ads in a project.
# Get content analytics
Source: https://docs.beyondwords.io/api-reference/analytics/content-analytics
get /projects/{project_id}/content/{id}/analytics
Retrieve analytics for some specific content.
# List content analytics
Source: https://docs.beyondwords.io/api-reference/analytics/contents-analytics
get /projects/{project_id}/content/analytics
Retrieves an analytics overview for all content items in a project
# Get organization analytics
Source: https://docs.beyondwords.io/api-reference/analytics/organization-analytics
get /organization/analytics
Retrieves analytics for all projects within an organization
# Get project analytics
Source: https://docs.beyondwords.io/api-reference/analytics/project-analytics
get /projects/{id}/analytics
Retrieves analytics for a project
# List projects analytics
Source: https://docs.beyondwords.io/api-reference/analytics/projects-analytics
get /projects/analytics
Retrieves an analytics overview for all projects within an organization
# Create content
Source: https://docs.beyondwords.io/api-reference/content/create
post /projects/{project_id}/content
Creates a content item in your project
# Delete content
Source: https://docs.beyondwords.io/api-reference/content/delete
delete /projects/{project_id}/content/{id}
Delete a content item from your project
# List content
Source: https://docs.beyondwords.io/api-reference/content/list
get /projects/{project_id}/content
Lists content within a project
# Content overview
Source: https://docs.beyondwords.io/api-reference/content/overview
Overview of the content object and its properties
This object represents an item of content that belongs to a project.
| Property | Type | Description |
| ------------------------------ | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `id` | string | Unique UUID for the object. |
| `status` | string | The current status of the content processing operation. This value will change as the content is processed. Possible values are `draft`, `queued`, `processing`, `processed`, `skipped`, `error` |
| `type` | string | The type. Possible values are `auto_segmet`, `manual_segment` or `audio_upload` |
| `title` | string | The content title. |
| `summary` | string | The content summary. |
| `body` | string | The content body. |
| `source_id` | string | The externally-provided source identifier of the content. For example, this could be the id of the content in your CMS. |
| `source_url` | string | The URL that contains the source content. For example, this could be the public URL of the content. |
| `author` | string | The author of the content. |
| `image_url` | string | The feature image URL of the content. |
| `metadata` | object | The arbitrary metadata associated with content. For example, this could be `{"category": "sport"}` |
| `audio` | array | The array of generated audio files for the entire content. |
| `audio.id` | integer | Unique identifier for the audio object. |
| `audio.content_type` | string | The MIME type of the audio file according to the IANA specification. |
| `audio.url` | string | The URL of the generated audio file. |
| `audio.duration` | integer | The duration of the generated audio file in milliseconds. |
| `video` | array | The array of generated video files for the entire content. |
| `segments` | array | The array of segments in the content |
| `segments.id` | integer | Unique identifier for the segment object |
| `segments.marker` | string | The marker associated with the segment. To support playback from segments (i.e. paragraphs), you need to use the [BeyondWords Player](https://github.com/beyondwords-io/player) and [add markers to the elements](https://github.com/beyondwords-io/player/blob/main/doc/segments-playback.md). |
| `segments.section` | string | The section type of the segment. Possible values are `title`, `summary`, or `body` |
| `segments.content_type` | string | The content type of the segment. Possible values are `text`, `audio`, or `image`. Text and audio will be included in generated audios. Text, audio, and images will be included in generated videos (coming soon). |
| `segments.text` | string | The plain text for this segment if `segment.content_type` is `text` |
| `segments.audio_url` | string | The URL of the uploaded audio file for this segment if the `segment.content_type` is `audio` |
| `segments.image_url` | string | The URL of the uploaded image file for this segment if the `segment.content_type` is `image` |
| `segments.language` | object | The language object associated with this segment if the `segment.content_type` is `text` |
| `segments.language.code` | string | The language code of the segment if the `segment.content_type` is `text` |
| `segments.language.name` | string | The language name of the segment if the `segment.content_type` is `text` |
| `segments.voice` | object | The voice object associated with this segment if the `segment.content_type` is `text` |
| `segments.voice.id` | integer | The id of the voice used to generate the audio of the segment if the `segment.content_type` is text |
| `segments.voice.name` | string | The name of voice used to generate the audio of the segment if the `segment.content_type` is `text` |
| `segments.start_time` | integer | The start time of this segment in milliseconds. This may not exactly match the summed durations because of audio alignment gaps. |
| `segments.duration` | integer | The duration of this segment in milliseconds. |
| `segments.created` | string | Time at which the segment object was created (ISO 8601). |
| `segments.updated` | string | Time at which the segment object was updated (ISO 8601). |
| `published` | boolean | Whether the content will appear in the BeyondWords Players |
| `publish_date` | string | Time at which the content was published or is scheduled to be published (ISO 8601). |
| `ads_enabled` | boolean | Whether adverts will play for this content in the BeyondWords Players. If you don't have any ads then no ads will play. |
| `auto_segment_updates_enabled` | boolean | Whether the media files will be regenerated when the `title`, `summary` or `body` content is updated with `auto_segment` |
| `created` | string | Time at which the object was created (ISO 8601). |
| `updated` | string | Time at which the object was updated (ISO 8601). |
# Regenerate content
Source: https://docs.beyondwords.io/api-reference/content/regenerate
post /projects/{project_id}/content/{id}/regenerate
Reprocess content in a project.
# Introduction to segments
Source: https://docs.beyondwords.io/api-reference/content/segments
## Segments
Each content item can have multiple segments. For instance, an article typically includes a title, a summary and a body. The body itself typically contains multiple paragraphs, which may include multimedia elements such as images, audio clips, and videos. These individual components are referred to as segments. Segmenting content enables flexibility, allowing for a range of features when combined with the [BeyondWords Player](https://github.com/beyondwords-io/player). These include skipping between segments, initiating playback from specific segments (e.g., clicking play on a paragraph), and highlighting segments during playback (e.g., paragraph highlighting as it plays).
You have three options when it comes to generating audio: `auto_segment`, `manual_segment`, or `audio_upload`.
### auto\_segment
We recommend the `auto_segment` option for publishers seeking a simple way to generate audio versions of their articles.
To use this option set `type` property to `auto_segment` whenever you create or update a content item.
Using this option, you are required to submit data for the `body` property, with the `title` and `summary` properties being optional additions.
Once submitted, BeyondWords will automatically segment the `body` data into `segments`. In the initial response, the `segments` will be an empty array, as automatic segmenting is an asynchronous operation. However, once the audio has been generated and you retrieve a content item using the `?segments=full` query parameter, you will be able to view the individual segments.
**Example request and responses:**
Your content body text Your content body text Your content body textYour content title text
",
"summary": "Your content summary text
",
"body": "Your content title text
",
"summary": "Your content summary text
",
"body": "Your content title text
",
"summary": "Your content summary text
",
"body": "
A new article is still created in the new project, but it references the existing audio file.
## Identifying duplicates via the API
You can distinguish between original and reused audio articles via the `is_copy` property that is returned in the response or the [`audio.updated`](/docs-and-guides/integrations/webhooks#audio-updated-payload) payload:
`is_copy`: false → The original (parent) article that generated the audio.
`is_copy`: true → A duplicated (child) article that reuses the audio.
## Inherited fields
When creating a new audio article using an existing `source_id`, certain fields are automatically inherited from the original (parent) article. These fields cannot be overwritten in the new (child) article:
* `status`
* `title`
* `type`
* `summary`
* `body`
* `audio`
* `video`
* `summarization`
* `segments`
Other fields, such as `source_url` can be modified as needed in the `POST` request.
This ensures that core audio content remains consistent across projects.
# Update content
Source: https://docs.beyondwords.io/api-reference/content/update
put /projects/{project_id}/content/{id}
Update a content item from your project
# Overview
Source: https://docs.beyondwords.io/api-reference/overview
Learn about the BeyondWords API
# BeyondWords API overview
The BeyondWords API is a RESTful API that provides headless access to the entire platform, allowing you to programmatically create, manage, and deliver audio content.
## API basics
* **Base URL**: `https://api.beyondwords.io/`
* **Format**: The API accepts form-encoded request bodies and returns JSON-encoded responses
* **Design**: Uses predictable resource-oriented URLs and standard HTTP methods
* **Status Codes**: Uses standard HTTP response codes to indicate success or failure
## Authentication
All API requests require authentication using your Project ID and API Key.
### Obtaining credentials
1. [Create a BeyondWords account](https://dash.beyondwords.io/auth/signup)
2. Create a project in the dashboard
3. Navigate to **Settings > Integrations > API** to find your Project ID and API Key
### Security best practices
* Your API key carries many privileges, so be sure to safeguard it
* Never share your API key in publicly accessible places such as client-side code or GitHub
* Consider using environment variables to store your API credentials
### Authentication methods
Most endpoints require the `X-Api-Key` header for authentication:
```bash
# API request example
curl -X GET "https://api.beyondwords.io/v1/endpoint" \
-H "X-Api-Key: YOUR_API_KEY"
```
Most endpoints also require your Project ID, which is typically included as a path parameter. Each endpoint in this documentation will clearly indicate whether a Project ID is required.
## Request guidelines
* All API requests must use HTTPS; requests over plain HTTP will fail
* Requests without proper authentication will be rejected with a 401 Unauthorized response
* Include a content-type header of `application/json` for requests with JSON bodies
## Versioning
The API uses versioned endpoints to ensure compatibility:
* Current stable version: `v1`
* Include the version in the URL path: `https://api.beyondwords.io/v1/endpoint`
## Error handling
The API uses conventional HTTP response codes:
* `2xx` - Success
* `4xx` - Client errors (invalid request)
* `5xx` - Server errors
Error responses include a JSON body with details:
```json
{
"error": {
"code": "invalid_request",
"message": "A detailed error message",
"details": { /* Additional context */ }
}
}
```
## Getting help
If you encounter issues or have questions:
* Contact [support@beyondwords.io](mailto:support@beyondwords.io)
# Get player by content ID
Source: https://docs.beyondwords.io/api-reference/player/show
get /projects/{project_id}/player/by_content_id/{id}
Gets player data related to a content item
# Get player by playlist ID
Source: https://docs.beyondwords.io/api-reference/player/show-1
get /projects/{project_id}/player/by_playlist_id/{id}
Gets player data related to a playlist
# Get player by source ID
Source: https://docs.beyondwords.io/api-reference/player/show-2
get /projects/{project_id}/player/by_source_id/{id}
Gets player data related to a content item
# Get player by source URL
Source: https://docs.beyondwords.io/api-reference/player/show-3
get /projects/{project_id}/player/by_source_url/{url}
Gets player data related to a content item
# Get player by multiple identifiers
Source: https://docs.beyondwords.io/api-reference/player/show-4
get /projects/{project_id}/player/by_identifiers/{array}
Gets player data related to a content item
# Create playlist
Source: https://docs.beyondwords.io/api-reference/playlists/create
post /projects/{project_id}/playlists
Creates a playlist in a project
# Delete playlist
Source: https://docs.beyondwords.io/api-reference/playlists/delete
delete /projects/{project_id}/playlists/{id}
Deletes a custom playlist from a project
# List playlists
Source: https://docs.beyondwords.io/api-reference/playlists/list
get /projects/{project_id}/playlists
Lists playlists within a project
# Get playlist
Source: https://docs.beyondwords.io/api-reference/playlists/show
get /projects/{project_id}/playlists/{id}
Gets a playlist from a project
# Get playlist settings
Source: https://docs.beyondwords.io/api-reference/playlists/show-1
get /projects/{project_id}/playlists/{playlist_id}/settings
Gets the feed settings for a playlist
# Update playlist
Source: https://docs.beyondwords.io/api-reference/playlists/update
put /projects/{project_id}/playlists/{id}
Updates a playlist in a project
# Update playlist settings
Source: https://docs.beyondwords.io/api-reference/playlists/update-1
put /projects/{project_id}/playlists/{playlist_id}/settings
Updates the feed settings for a playlist
# Create project
Source: https://docs.beyondwords.io/api-reference/projects/create
post /projects
Creates a project in your organization
# Delete project
Source: https://docs.beyondwords.io/api-reference/projects/delete
delete /projects/{id}
Deletes a project
# List projects
Source: https://docs.beyondwords.io/api-reference/projects/list
get /projects
Lists all projects in your organization
# Get project
Source: https://docs.beyondwords.io/api-reference/projects/show
get /projects/{id}
Gets a project from your organization
# Update project
Source: https://docs.beyondwords.io/api-reference/projects/update
put /projects/{id}
Updates a project in your organization
# Get project voices
Source: https://docs.beyondwords.io/api-reference/projects/voices
get /projects/{id}/voices
Gets a project voices
# Create pronunciation rule
Source: https://docs.beyondwords.io/api-reference/rules/create
post /rules
Creates a rule in a organization
# Delete pronunciation rule
Source: https://docs.beyondwords.io/api-reference/rules/delete
delete /rules/{id}
Deletes a rule from your organization
# List pronunciation rules
Source: https://docs.beyondwords.io/api-reference/rules/list
get /rules
Lists rules in a organization
# Get pronunciation rule
Source: https://docs.beyondwords.io/api-reference/rules/show
get /rules/{id}
Gets a rule from your organization
# Update pronunciation rule
Source: https://docs.beyondwords.io/api-reference/rules/update
put /rules/{id}
Updates rule in a organizaiton
# Get project summarization settings
Source: https://docs.beyondwords.io/api-reference/summarization-settings/show
get /projects/{project_id}/summarization_settings
Get the summarization settings for your project
# Update project summarization settings
Source: https://docs.beyondwords.io/api-reference/summarization-settings/update
put /projects/{project_id}/summarization_settings
Update the summarization settings for your project
# Get video settings
Source: https://docs.beyondwords.io/api-reference/video-settings/show
get /projects/{project_id}/video_settings
Get the video settings for your project
# Update video settings
Source: https://docs.beyondwords.io/api-reference/video-settings/update
put /projects/{project_id}/video_settings
Update the video settings for your project
# Members and Roles
Source: https://docs.beyondwords.io/docs-and-guides/administration/members-and-roles
Learn how to manage team members and their roles in BeyondWords
## Overview
In BeyondWords, you can manage team members and their roles in the **Members** section. Click on the top left menu and go to **Organization > Members**.
The Members page, which can be found by going to Organization > Members, shows a list of current members. Here, you can see each member that belong to your organization, their role, their status, and their join date.
## Invite a member to your organization
To invite a member to your organization:
1. Go to **Organization > Members > All members**.
2. Click the **Invite** button.
3. Enter the email address of the person you want to invite.
4. Enter the first name and last name of the person you want to invite.
5. Select the role for the person you want to invite.
6. Add a profile picture (optional).
7. You can select the project(s) you want your invitee to automatically join.
8. Click **Send invite**. New members will receive an invite link via email along with steps to join the project.
This paragraph will be voiced by Joe.
This paragraph will be voiced by Eddie.
This one, too.
This paragraph will be read out in British English.
Ce paragraphe sera lu en français.
``` **Feature image** The feature image attribute can be added to an image on your web page to make it the primary image for your article: ```html`, ``, `
`, etc. This is useful for consistently including or excluding specific structural elements across your content. #### Element class Create an **Element class** filter to include or exclude HTML elements based on their class attribute. > Filter content by CSS class names such as `.header`, `.footer`, `.aside`, etc. This filter will be applied to any element that contains the specified class, allowing you to target styled components. #### Element ID Create an **Element ID** filter to include or exclude HTML elements based on their ID attribute. > Filter content by element IDs such as `#advert`, `#related`, `#navigation`, etc. This is useful for targeting unique elements on a page that you consistently want to include or exclude. #### Element data Create an **Element data** filter to include or exclude HTML elements based on their data attributes. > Filter content by data attributes such as `data-include`, `data-exclude`, etc. This allows you to add custom data attributes to your HTML specifically for controlling audio generation. #### Element XPath Create an **Element XPath** filter to include or exclude HTML elements based on an XPath expression. > Filter content using XPath expressions such as `//*[@role='dialog']`. This provides advanced targeting capabilities for complex document structures where other filter types may not be sufficient. #### Value Create a **Value** filter to include or exclude HTML elements based on the text they contain. > Filter content by searching for specific text such as "Sponsored". This filter will be applied to any element that contains the specified text value, allowing you to target elements based on their content rather than structure. # Pronunciations Source: https://docs.beyondwords.io/docs-and-guides/content/preferences/pronunciations Learn how to customize the pronunciation of words in your articles with BeyondWords ## Overview You can customize how words are pronounced in your audio articles by adding **Pronunciations**. These rules ensure names, acronyms, and industry-specific terms sound just right.  ## Create a pronunciation rule To get started, you can either create pronunciations from the Pronunciations section of your project or through the Editor. 1. **Pronunciations tab** - Go to **Project > Content > Preferences** and click **+ Pronunciation**. 2. **Editor** - Highlight the word or phrase you want to add a pronunciation for and click **+ Pronunciation**.
Select the type of pronunciation rule you want to create: * **Substitute** – Replace a word with an alternative word or phrase. * **Say as Word** – Force an acronym to be pronounced as a word. * **Say as Letter Sequence** – Force an acronym to be pronounced as a sequence of letters. * **Language** – Force a word to be pronounced in a target language. * **Phonetic Spelling** – Customize the pronunciation of a word using a phonetic notation: * **IPA (International Phonetic Alphabet)** * **Jyutping (Cantonese Romanization)** * **Pinyin (Mandarin Romanization)** Specify the exact text the rule should apply to. Depending on the pronunciation type, enter the substitute word, language, or phonetic spelling. Choose which language the pronunciation rule should apply to. Use a premade voice to preview the pronunciation. At the moment, you cannot preview rules with custom voices. Set where this pronunciation rule should apply: * **All projects**: Use this pronunciation in all your projects. * **This project only**: Use this pronunciation in this project only. * **This article only**: Use this pronunciation in this article only. Update past articles to apply the new pronunciation. Otherwise, the pronunciation will only apply to new articles. You cannot add pronunciation rules for numbers on their own unless their scope is for a single article. ### Pronunciation types #### Substitute Create a **Substitute** pronunciation to replace a word with an alternative word. > Expand an acronym into words e.g. "CO2" as "carbon dioxide", or get your preferred pronunciation with a re-write e.g. read "scone" as "scon". Correct a heteronym e.g. choose "reed" for "read" not "red". #### Say as word Create a **Say as word** pronunciation to force an acronym to be said as a word. > Make sure a word is read as a word e.g. UNESCO as "Unesco" not "U N E S C O". #### Say as letter sequence Create a **Say as letter sequence** pronunciation to force an acronym to be pronounced as a sequence of letters. > Read a word out letter by letter e.g. " IT" as "I T" not "it". #### Language Create a **Language** pronunciation to force a word to be pronounced in a target language. > For multilingual voices, switch to a second language for greater pronunciation accuracy e.g. tag "Frittura di paranza" to be read in Italian.Not all voices support the Language rule type yet. This pronunciation type is only available for multilingual voices. #### Phonetic spelling Create a **Phonetic spelling** pronunciation to define the pronunciation of a word using a notation type. > Use the international phonetic alphabet to provide an exact pronunciation e.g. ˈniːs for Nice. #### IPA Select the IPA (international phonetic alphabet) notation type to force a word to be pronounced according to your preferences. > Use IPA to provide an exact pronunciation e.g. ˈniːs for Nice. To make it easier to create IPA pronunciations, you can use the Magic IPA tool by clicking the "Generate spelling" button. #### Jyutping (Cantonese) Select the Jyutping notation type to force a word to be pronounced according to your preferences. #### Pinyin (Mandarin) Select the Pinyin notation type to force a word to be pronounced according to your preferences. ## AI preprocessing (beta) AI preprocessing automatically improves pronunciation by understanding the context of your article. It better handles tricky content like dates, sports scores, and abbreviations. It will also atuomatically detects foreign words and apply the correct language for accurate pronunciation.Language detection is currently limited to German, with more languages planned in future updates. #### Enabling preprocessing **Project level**\ Go to **Project > Content > Preferences** and toggle **AI Preprocessing** on. **Article level**\ Open the article in the **Editor** and toggle **AI Preprocessing** on in the **Pronunciations** tab in the sidebar. # Summarization Source: https://docs.beyondwords.io/docs-and-guides/content/preferences/summarization Learn how to create audio summaries of your articles with BeyondWords ## Overview You can set it to generate summaries automatically when an audio article is created or manually for each article.  ## Create summaries for all articlesGo to the **Summarization** tab in the **Content** section and enable summarization. Modify the system prompt to fine-tune how the AI generates the summary. Click **Save** to apply your changes. Moving forward, summaries will be generated automatically for all new audio articles. To generate summaries for existing articles, manually update them in the **Editor** or by clicking **Regenerate**. Otherwise, summaries will only be created for new articles. ## Create a summary for an articleGo to the **Articles** section and locate the article you want to summarize. Click the **summary** button next to the article. This will open the **Editor**. In the **Editor**, turn on AI summarization for the article. Modify the system prompt to fine-tune how the AI generates the summary. Click **Update** to save changes and generate the audio summary. Turn on video generation to generate videos of article summaries. ## Playing the Summary Once the summary has been generated for your article, it can be loaded in the player by adding `summary: true` to the embed code:```javascript ``` # Video Source: https://docs.beyondwords.io/docs-and-guides/content/preferences/video Learn how to create videos of your articles with BeyondWords ## Overview You can set it to generate video articles automatically when an audio article is created or manually for each article.  ## Create videos for all articlesGo to the **Video** tab in the **Content** section and enable video generation. Customize the video settings to align the video with your brand. Click **Save** to apply your changes. Moving forward, videos will be generated automatically for all new audio articles. To generate videos for existing articles, manually update them in the **Editor** or by clicking **Regenerate**. Otherwise, videos will only be created for new articles. ## Create a video for an articleGo to the **Articles** section and locate the article you want to create a video for. Click the **video** button next to the article. This will open the **Editor**. Customize the video settings to align the video with your brand. Click **Update** to save changes and generate the video. Turn on summarization to generate video of article summaries. ## Video settings Customize how BeyondWords generates videos from your audio articles by adjusting these settings. ### Media * **Include feature image** – Use the article feature image as the default video background when no other images are available. * **Video background color** – Set a background color for when no image is displayed. * **Include article images** – Bring your videos to life with images from the article, dynamically changing as the video plays. * **Pan and zoom enabled** – Add subtle pan and zoom effects to bring images to life. * **Playback mode** - Choose how images will appear in your video. * **Cycle continuously** - Images will loop through continuously, repeating the sequence when reaching the end. * **Space images evenly** - Images will be distributed evenly across the video duration, showing each image for an equal amount of time. * **Follow article** - Images will change based on the article content, syncing with the corresponding text segments as they are narrated. ### Captions * **Text captions** – Show captions with real-time word highlighting. * **Caption lines per scene** - Set the number of caption lines displayed on screen and choose their alignment within the video. * **Caption text background color** – Set a background color to enhance caption readability. * **Caption text color** – Set the color of the caption text. * **Caption text highlight color** – Set the color that highlights words as they are spoken. ### Branding * **Upload a logo** – Upload a logo to add a branded watermark to your videos. * **Choose the logo position** – Select whether the logo appears in the **top-right** or **top-left** of the video. * **Audio and waveform** – Show a dynamic waveform to visualize the audio in your videos. When disabled, the video will not include audio. * **Waveform color** – Set the color of the waveform bars in your videos. After configuring these settings, click **Save Changes** to apply them. Changes will apply to new videos, existing videos will need to be regenerated. ## Embedding the Video Player Once the video has been generated for your article, you'll need to update the player embed script to display the video. You can do this in a few different ways. ### Copy the Video Embed Code You can click the video icon next to your article to access the pre-generated video embed script, then copy it and include it in your site’s code at the location where you’d like the video to appear.  ### Modify the Embed Script You can manually update an existing or new script by adding the `video: true` parameter to the player embed code.```javascript ``` ### Update WordPress Plugin Settings If you're using the WordPress plugin, you can change the player style either in the [plugin settings](/docs-and-guides/integrations/wordpress/overview#player-style) or in the post edit screen in the [BeyondWords Sidebar](/docs-and-guides/integrations/wordpress/overview#player-style-2). # Voices Source: https://docs.beyondwords.io/docs-and-guides/content/preferences/voices Configure voice preferences ## Overview Go to the **Voices** tab in the **Content** section to configure your voice preferences. Here you will be able to access and preview all the voices, including **Premade** and **Custom** voices available for your project.  ## Choose language and accent Select the default language and accent for your project based on the language of your content. ## Choose voice Find your preferred voice and click "Use voice" to set it as the default. This will be used for all articles unless otherwise specified. ### Choose a voice for article titles If you want to use a different voice for the titles of your articles, you can click on the dropdown button next to each voice and select "Use as title voice". This will be used for all new article titles unless otherwise specified. ### Choose a voice for article content If you want to use a different voice for the body text of your articles, you can click on the dropdown button next to each voice and select "Use as body voice". This will be used for all new article body text unless otherwise specified. ### Choose a voice for article summaries If you want to use a different voice for the summaries of your articles, you can click on the dropdown button next to each voice and select "Use as summary voice". This will be used for all new article summaries unless otherwise specified. ### Speaking rate You can also adjust the default speed of a voice by clicking on the **⋯** button next to each voice and selecting "Adjust speaking rate". This will allow you to increase or decrease the speaking rate of the voice. This will be applied to all new segments that use that voice. ### Voice ID You can copy the voice ID of a voice by clicking on the **⋯** button next to each voice and selecting "Copy voice ID". This is useful when using the API or Magic Embed to generate audio. # Overview Source: https://docs.beyondwords.io/docs-and-guides/distribution/player/overview Get started with the BeyondWords player ## Overview BeyondWords Player is the easiest way to add BeyondWords audios into your website or app. It is a fully-featured audio player for content generated and hosted on BeyondWords. It is fully integrated with analytics and monetization features on BeyondWords without the need for any extra configuration. Please note that the BeyondWords player is automatically installed if you are using any of the following integrations: * Magic Embed * WordPress * Ghost ## Installation Choose one of the following methods to install the BeyondWords player: ### Install via embed script Add the script in your web app: ```javascript ```You'll need to replace ` ` with your actual project ID and content ID. See the [Identifiers](#identifiers) section below for details on all available identifier options. For production environments, consider specifying a fixed version instead of using `@latest` to ensure stability. ### Install via NPM```javascript npm add @beyondwords/player ``` ```javascript ``` ```javascript import BeyondWords from '@beyondwords/player'; new BeyondWords.Player({ target: '#beyondwords-player', projectID: , contentId: ' ' }); ``` You'll need to replace ` ## Identifiers You will need to replace project `ID` and content `ID` with your `projectId` and `contentId`. You can use any of the following properties in conjunction with the `projectId` to initialize the player: | **Property** | **Description** | | ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `contentId` | Unique UUID string for the audio content.` with your actual project ID and content ID. See the [Identifiers](#identifiers) section below for details on all available identifier options.
You can also pass the previous integer audio ID as a string for users migrating from the legacy API. | | `sourceId` | The externally provided source identifier for a content item.
This could be the ID from your CMS, the `` from an RSS ` - `, or the post ID if generated using the WordPress Plugin. | | `sourceUrl` | The URL containing the source content.
This could be the public URL submitted via the API, the `` from an RSS `- `, or the post URL from the WordPress Plugin. | | `playlistId` | The unique ID for a playlist created in the dashboard or through the API. | ## Advanced customization For developers looking to build custom interfaces or use the player in headless mode, additional documentation is available on GitHub. This includes guides on: * Building your own UI on top of the BeyondWords player * Using the player SDK programmatically * Implementing custom analytics For complete documentation on advanced customization options, visit the [BeyondWords Player GitHub repository](https://github.com/beyondwords-io/player?tab=readme-ov-file). ## Next steps After installing the player, you'll likely want to customize its appearance and behavior to match your brand and user experience requirements.
# Android Source: https://docs.beyondwords.io/docs-and-guides/distribution/player/sdk/android Integrate the BeyondWords player in Android Configure your player's appearance, branding, and interactive features Integrate the player in web applications Integrate the player in iOS applications Add the player to Android applications View the Android SDK documentation in our GitHub repository # iOS Source: https://docs.beyondwords.io/docs-and-guides/distribution/player/sdk/ios Integrate the BeyondWords player in iOSView the iOS SDK documentation in our GitHub repository # JavaScript Source: https://docs.beyondwords.io/docs-and-guides/distribution/player/sdk/javascript Integrate the BeyondWords player using JavaScriptView the JavaScript SDK documentation in our GitHub # Settings Source: https://docs.beyondwords.io/docs-and-guides/distribution/player/settings Configure the BeyondWords player settings # Player settings Once you've installed the BeyondWords player, you can customize its appearance and behavior through various settings. This guide walks you through all available configuration options. ## General settings ### Player size Control the overall size of the player interface: * **Small**: Compact version for limited space * **Standard** (default): Balanced size suitable for most websites * **Large**: Expanded size with enhanced visibility ### Player widget Enable or disable the floating mini-player widget that appears when scrolling away from the main player. ### Widget size When the player widget is enabled, you can set its size: * **Small**: Minimal floating player * **Standard** (default): Medium-sized floating player * **Large**: Prominent floating player ### Widget position Choose where the floating widget appears on the screen: * **Left**: Aligned to the left side of the viewport * **Center**: Centered horizontally in the viewport * **Right**: Aligned to the right side of the viewport ## Branding ### Logo Upload a custom logo to display in the player. * Limited to the Large player size * Use PNG, JPG, or WebP format (max 10MB) * Recommended dimensions: at least 300px × 300px ### Color theme Choose the color scheme for your player: * **System**: Adapts to the user's device settings (light/dark mode) * **Light mode** (default): Always use light theme * **Dark mode**: Always use dark theme ### Light mode colors Customize colors for the light theme: * **Background color**: The main player background (#F5F5F5 by default) * **Icon color**: Color for player controls and icons (#000 by default) * **Text color**: Color for text elements (#111 by default) ### Dark mode colors Customize colors for the dark theme: * **Background color**: The main player background (#000 by default) * **Icon color**: Color for player controls and icons (#FFF by default) * **Text color**: Color for text elements (#FFF by default) ### Call-to-action Customize the text for the main player button (default: "Listen to this article") ### Include article title Toggle whether to display the article title in the player. * Limited to Large player size ### Intro Add a custom audio clip to play at the beginning of your content: * Upload MP3 or WAV format (max 50MB) * Useful for branded intros or sponsorship messages ### Outro Add a custom audio clip to play at the end of your content: * Upload MP3 or WAV format (max 50MB) * Perfect for calls-to-action or acknowledgments ## Controls ### Skipping Choose how users can navigate through the audio: * **Skip by paragraph**: Move forward or backward by logical segments of content * **Skip by seconds**: Set a specific time jump (e.g., 15 seconds) for skipping ## Interactions ### Highlight paragraphs Enable this feature to highlight the paragraph that's currently being read aloud, keeping users engaged with the content. ### Highlight colors * **Light mode highlight**: Color used for highlighting in light mode (#A4FF00 by default) * **Dark mode highlight**: Color used for highlighting in dark mode (#A4FF00 by default) ### Playback from paragraphs Allow users to click or tap on any paragraph to begin playback from that point, boosting engagement with your content. ### Allow downloads Enable listeners to download the audio from the player for offline listening. ## Saving your settings After configuring your player settings, click the "Save changes" button to apply them. Your settings will be applied to all instances of the player using your project ID.All these settings can also be configured programmatically when initializing the player. See the JavaScript SDK documentation for details. # Dynamic Source: https://docs.beyondwords.io/docs-and-guides/distribution/playlists/dynamic Guide on creating dynamic playlists export const DynamicPlaylistDemo = () => { const ITEMS_KEY = "bw-playlist-items"; const PROJECT_ID_KEY = "bw-project-id"; const PROJECT_ID_DEFAULT = 9504; const ITEMS_DEFAULT = [{ sourceId: "67ff73cc9476c4d9da026690" }, { contentId: "2eeb65e2-3304-4c5c-bf06-183863509313" }, { contentId: "15d3bc78-e6fb-4c88-8039-69f0ecf19337" }]; const saveToStorage = (key, value) => { localStorage.setItem(key, JSON.stringify(value)); return value; }; const getFromStorage = key => { if (!key) return undefined; const items = localStorage.getItem(key); if (items) return JSON.parse(items); return undefined; }; const [isReady, setIsReady] = useState(false); const [enteredId, setEnteredId] = useState(""); const [loadedItems, setLoadedItems] = useState([]); const [inputType, setInputType] = useState("contentId"); const [items, setItems] = useState(getFromStorage(ITEMS_KEY) || ITEMS_DEFAULT); const [projectId, setProjectId] = useState(getFromStorage(PROJECT_ID_KEY) || PROJECT_ID_DEFAULT); useEffect(() => { const handleReady = () => setIsReady(true); if (window.BeyondWords) handleReady(); else window.addEventListener("BeyondWordsReady", handleReady); return () => window.removeEventListener("BeyondWordsReady", handleReady); }, []); useEffect(() => { let player; if (!isReady) return; window.BeyondWords.Player.destroyAll(); if (items.length) { player = new window.BeyondWords.Player({ playlist: items, widgetStyle: "none", projectId: projectId, target: "#bw-playlist", analyticsConsent: "none" }); player.addEventListener("ContentAvailable", () => { setLoadedItems(window.BeyondWords.Player.instances()[0].properties().content); }); } return () => player?.destroy(); }, [items, projectId, isReady]); if (!isReady) { returnLoading...; } return; }; ## Overview The playlists experience can be elevated and personalized by allowing your audience to create their own playlists from a collection of articles on your website. This can be achieved by using our [Player JavaScript SDK](/docs-and-guides/distribution/player/sdk/javascript).Project ID: { const value = e.target.value; if (!(/^\d*$/).test(value) || value.length > 8) return; if (value !== getFromStorage(PROJECT_ID_KEY)) setItems(saveToStorage(ITEMS_KEY, [])); setProjectId(saveToStorage(PROJECT_ID_KEY, value)); }} className="px-2 py-1 text-xs border-2 rounded-md focus:outline-none focus:border-purple-600 max-sm:w-28" />setEnteredId(e.target.value)} className="w-full px-2 py-1 border-2 rounded-md focus:outline-none focus:border-purple-600" placeholder={`Enter ${inputType === "contentId" ? "content ID" : inputType === "sourceId" ? "source ID" : "source URL"}`} />{items.length > 0 && <>Added identifiers
Identifiers in red had some error while loading.
{items.map((item, index) => { const isError = loadedItems.length === 0 || !loadedItems.some(i => i.id === item.contentId || i.sourceId === item.sourceId || i.sourceUrl === item.sourceUrl); return; })}
{item.contentId || item.sourceId || item.sourceUrl}
{item.contentId && (as content ID)} {item.sourceId && (as source ID)} {item.sourceUrl && (as source URL)}>} {items.length === 0 &&No audios to show. Please add some or hit reset.}This guide requires you to be comfortable with programming in JavaScript. ## Demo Here is an interactive demo of a user-generated dynamic playlist that begins with a default set of articles which is totally optional. You can add or remove articles from this playlist — simulating the user action of bookmarking — and it will be reflected live. Changes to this demo playlist are stored in your browser for future visits. For real applications, user data should be saved in a database. You can use your [BeyondWords project](/docs-and-guides/getting-started/concepts#projects) ID to load your articles.## Create a dynamic playlist The BeyondWords player is quite flexible allowing you to dynamically load multiple articles and create a playlist from them. The only required fields are the BeyondWords project ID and a list of article indentifiers which could be any of `contentId`, `sourceId`, `sourceUrl` or even another playlist's `playlistId`. To create a dynamic playlist: Create a [project](/docs-and-guides/administration/projects) in BeyondWords. Generate some audio articles using the [Editor](/docs-and-guides/content/editor) or any of the [Integrations](/docs-and-guides/getting-started/overview#integrations). Install the [player script](https://github.com/beyondwords-io/player/blob/main/doc/getting-started.md) or the [npm package](https://github.com/beyondwords-io/player/blob/main/doc/npm-package.md) on your website. This logic resides on your backend. You will need to store the user saved identifiers of the articles and their type so they can later be retrieved. On the frontend, the player accepts a `playlist` param as an array of objects which should include one type of identifier each: ```js import BeyondWords from '@beyondwords/player'; new BeyondWords.Player({ target: '#beyondwords-player', projectID: , // required playlist: [ { // use only one of the following sourceId: " ", contentId: " ", sourceUrl: " ", playlistId: , }, // ... more items ], }); ``` It then fetches the requested content from your BeyondWords project and loads them as a playlist. Various other settings are also fetched from your project's [player settings](/docs-and-guides/distribution/player/settings) but they can be overriden through the [settings object](https://github.com/beyondwords-io/player/blob/main/doc/player-settings.md) passed to the player. You can load articles and playlist only from one project at a time. # Smart Source: https://docs.beyondwords.io/docs-and-guides/distribution/playlists/smart Create and manage smart playlists ## Overview Use Smart playlists to automatically curate a list of audio articles or summaries based on your criteria.  ## Create a Smart playlist To create a Smart playlist: 1. Go to **Project > Distribution > Playlists**. 2. Click **+ Playlist**. 3. Enter a name for your playlist. 4. Upload a cover image for your playlist. 5. Select **Smart**. 6. Click **Continue**. Your playlist will be created and you'll be redirected to the playlist editor.Whenever you create a playlist, a podcast feed will be created automatically. ## Curate a Smart playlist To curate a Smart playlist:By default, your Smart playlist will include all articles in your project. 1. Click **Set rules**. 2. Click **+ Rule**. 3. Select the field you want to filter by. This will be based on your arricle metadata. By default it will include author, title, and published date. 4. Choose the operator you want to use: `is`, `is not`, `contains`, `wildcard`. 5. Enter the value you want to filter by. 6. Click **Apply**. 7. You can add multiple rules and combine them using the `AND` operator. 8. Review the results and click **Save changes**. ## Publish your playlist To publish your playlist: 1. Click on the **Embed code** button. 2. Select the content type: **Articles** or **Summaries**. 3. Copy the embed code. 4. Paste the embed code into your website.You can select **Summaries** only if your articles have summaries. ## Share your playlist To share your playlist: 1. Click on the **Share** button. 2. Select the content type: **Articles** or **Summaries**. 3. Click **Copy link**. 4. Share the link.You playlist will not be visible unless you have set the visibility to **Public**. ## Copy your playlist ID To copy your playlist ID: 1. Click on the **⋯** button. 2. Click **Copy playlist ID**. ## Want to let your audience create their own playlists? To let your audience create their own playlists, you can use the [Player JavaScript SDK](/docs-and-guides/distribution/player/sdk/javascript). # Standard Source: https://docs.beyondwords.io/docs-and-guides/distribution/playlists/standard Create and manage standard playlists ## Overview Use Standard playlists to handpick and publish a curated list of audio articles or summaries.  ## Create a Standard playlist To create a Standard playlist: 1. Go to **Project > Distribution > Playlists**. 2. Click **+ Playlist**. 3. Enter a name for your playlist. 4. Upload a cover image for your playlist. 5. Select **Standard**. 6. Click **Continue**. Your playlist will be created and you'll be redirected to the playlist editor.Whenever you create a playlist, a podcast feed will be created automatically. ## Curate a Standard playlist To curate a Standard playlist: 1. Click **Select articles**. 2. Select the articles you want to include in your playlist. 3. Click **Save changes**. ## Publish your playlist To publish your playlist: 1. Click on the **Embed code** button. 2. Select the content type: **Articles** or **Summaries**. 3. Copy the embed code. 4. Paste the embed code into your website.You can select **Summaries** only if your articles have summaries. ## Share your playlist To share your playlist: 1. Click on the **Share** button. 2. Select the content type: **Articles** or **Summaries**. 3. Click **Copy link**. 4. Share the link.You playlist will not be visible unless you have set the visibility to **Public**. ## Copy your playlist ID To copy your playlist ID: 1. Click on the **⋯** button. 2. Click **Copy playlist ID**. ## Want to let your audience create their own playlists? To let your audience create their own playlists, you can use the [Player JavaScript SDK](/docs-and-guides/distribution/player/sdk/javascript). # Smart Source: https://docs.beyondwords.io/docs-and-guides/distribution/podcast-feeds/smart Create and manage smart podcast feeds ## Overview Use Smart podcast feeds to automatically curate a list of audio articles or summaries based on your criteria.  ## Create a Smart podcast feed To create a Smart podcast feed: 1. Go to **Project > Distribution > Podcast Feeds**. 2. Click **+ Podcast Feed**. 3. Enter a title for your podcast. 4. Enter a description for your podcast. 5. Upload a cover image for your podcast. 6. Enter a URL for your podcast. 7. Select **Smart**. 8. Add Categories and Tags to your podcast. 9. Add Author and Owner details. 10. Select the language of your podcast. 11. Check whether your podcast contains explicit content. 12. Click **Continue**. Your podcast feed will be created and you'll be redirected to the podcast feed editor.Whenever you create a podcast feed, a playlist will be created automatically. ## Curate a Smart podcast feed To curate a Smart podcast feed:By default, your Smart podcast feed will include all articles in your project. 1. Click **Set rules**. 2. Click **+ Rule**. 3. Select the field you want to filter by. This will be based on your arricle metadata. By default it will include author, title, and published date. 4. Choose the operator you want to use: `is`, `is not`, `contains`, `wildcard`. 5. Enter the value you want to filter by. 6. Click **Apply**. 7. You can add multiple rules and combine them using the `AND` operator. 8. Review the results and click **Save changes**. ## Share your podcast feed To share your podcast feed: 1. Click on the **Share** button. 2. Select the content type: **Articles** or **Summaries**. 3. Click **Copy RSS Feed URL**. 4. Publish the RSS Feed URL to your website or preferred podcast platforms.You podcast feed will not be accessible unless you have set the visibility to **Public**. # Standard Source: https://docs.beyondwords.io/docs-and-guides/distribution/podcast-feeds/standard Create and manage standard podcast feeds ## Overview Use standard podcast feeds to manually curate a list of audio articles or summaries.  ## Create a standard podcast feed To create a standard podcast feed: 1. Go to **Project > Distribution > Podcast Feeds**. 2. Click **+ Podcast Feed**. 3. Enter a title for your podcast. 4. Enter a description for your podcast. 5. Upload a cover image for your podcast. 6. Enter a URL for your podcast. 7. Select **Standard**. 8. Add Categories and Tags to your podcast. 9. Add Author and Owner details. 10. Select the language of your podcast. 11. Check whether your podcast contains explicit content. 12. Click **Continue**. Your podcast feed will be created and you'll be redirected to the podcast feed editor.Whenever you create a podcast feed, a playlist will be created automatically. ## Curate a standard podcast feed To curate a standard podcast feed: 1. Click **Select articles**. 2. Select the articles you want to include in your podcast feed. 3. Click **Save changes**. ## Share your podcast feed To share your podcast feed: 1. Click on the **Share** button. 2. Select the content type: **Articles** or **Summaries**. 3. Click **Copy RSS Feed URL**. 4. Publish the RSS Feed URL to your website or preferred podcast platforms.You podcast feed will not be accessible unless you have set the visibility to **Public**. # Concepts Source: https://docs.beyondwords.io/docs-and-guides/getting-started/concepts Understanding how BeyondWords is structured will help you get the most out of it. ## Basic concepts ### Organizations An Organization is the highest-level entity in BeyondWords. Your account belongs to an Organization, and within it, you can create and manage multiple Projects. Organizations are typically set up at the company level, allowing teams to collaborate and manage audio content across different publications or categories. ### Projects A Project is your AI audio CMS. Within a Project, you can manage CMS integrations, voice settings, audio articles, player settings, playlists, and podcast feeds. You can also track engagement with analytics, set up native ads, or connect to an ad server. This structure makes it easy to manage audio across different brands, topics, or content streams. Each Project is organized into the following sections: * **Content** - Create, edit, and manage your audio articles. * **Distribution** - Publish your audio articles through players, playlists, and podcast feeds. * **Analytics** - Track your audio performance and engagement metrics. * **Monetization** - Create and manage direct ads or connect to your ad server. * **Settings** - Connect your CMS and manage your project members. #### Articles An Article is a single item of AI-generated audio content, typically mapped 1:1 with your written articles. Within each Project, you can create audio articles using the Editor, Magic Embed, API, or a CMS integration. Audio articles will be generated using the project's default voice, unless a different one is specified. Articles are structured into segments, which correspond to paragraphs and other elements. Each segment can have its own language and voice settings, allowing for greater control over narration. ### Voices We offer Premade and Custom voices. * **Premade voices** are a selection of high-quality AI voices available for immediate use. * **Custom voices** are voice clones based on your own Speakers. There are two types: * **Instant voice cloning** creates a voice clone from as little as 10 seconds of audio. * **Professional voice cloning** trains a hyper-realistic voice clone from as few as five article narrations. By default, both Premade and Custom voices are available across all Projects. However, with Custom voices, you can control which Projects have access to them (coming soon). ### Members Each Organization can have multiple Members. You can invite team members and control which Projects they can access. Roles and permissions are managed at the Organization level, ensuring structured access control across Projects. # Overview Source: https://docs.beyondwords.io/docs-and-guides/getting-started/overview BeyondWords connects publishers and their audiences through the possibilities of AI voice. ## Get started## Voices Understanding how BeyondWords is structured will help you get the most out of it. Get started with BeyondWords in minutes. ## Content Explore our library of high-quality premade voices for your content. Create a custom AI voice in minutes with our instant voice cloning technology. Get a studio-quality custom voice created by our professional team. ## Distribution Learn how to generate audio articles using the Editor. Learn how to manage your audio articles. Learn how to create and use voices. Learn how to customize the pronunciation of words in your audio articles. Learn how to create audio summaries of your audio articles. Learn how to create videos of your audio articles. Learn how to add background music to your audio articles. Learn how to filter what should be included or excluded in your audio articles. ## Analytics Learn how to use the BeyondWords player. Create and manage playlists. Create and manage podcast feeds. ## Monetization Track and analyze audio engagement. ## Integrations Launch direct ads with BeyondWords. Launch programmatic ads with BeyondWords. ## Administration Integrate BeyondWords with WordPress. Integrate BeyondWords with Ghost. Integrate with the BeyondWords API. Configure and manage webhooks. Import content from RSS feeds. Use Magic Embed for seamless integration. # Quickstart Source: https://docs.beyondwords.io/docs-and-guides/getting-started/quickstart Learn how to make your first audio article with BeyondWords. Manage your team and their access to BeyondWords. Assign team roles and craft custom ones tailored to your workflow. ### Next Steps Create an account on [BeyondWords](https://dash.beyondwords.io/auth/signup). Create a [project](/docs-and-guides/administration/projects) in BeyondWords. [Choose a voice](/docs-and-guides/content/preferences/voices) or [clone a voice](/docs-and-guides/voices/voice-cloning/instant-voice-cloning) from our collection of voices. Use the [Editor](/docs-and-guides/content/editor) to generate audio from your text. # API Source: https://docs.beyondwords.io/docs-and-guides/integrations/api Learn how to use the BeyondWords API # Overview The BeyondWords API is a RESTful API that provides headless access to the entire platform. It has predictable resource-oriented URLs, accepts form-encoded request bodies, returns JSON-encoded responses, and uses standard HTTP response codes, authentication, and verbs. ## Base URL The base URL for the API is: `https://api.beyondwords.io/v1/` ## Authentication To access the API endpoints, you will need a Project ID and API Key. To obtain these, you will need to [create a project](/docs-and-guides/administration/projects#create-a-project) and go to **Project > Settings > Integrations > API**. ## Core Resources The API provides access to several resources. The primary ones include: ### Projects This object represents your project and its settings. You can list, create, retrieve, update and delete projects. [Learn more about Projects](/api-reference/projects) ### Content This object represents your generated content and its associated metadata. You can list, create, retrieve, update and delete content. [Learn more about Content](/api-reference/content) ### Player You can use the API to retrieve audio and player configurations. The Player endpoints allow you to fetch player data using different identifiers such as: * Content ID * Source ID * Source URL * Playlist ID * Multiple identifiers [Learn more about Player](/api-reference/player) ### Analytics You can use the API to retrieve analytics for an organization, project, content item, or ad. You can retrieve data for a specific time period and aggregate by year, month, week, day, or hour. You can also filter the data based on specific metrics. [Learn more about Analytics](/api-reference/analytics) ## Additional Resources For complete API documentation, please refer to our [API Reference](/api-reference/overview). # Ghost Source: https://docs.beyondwords.io/docs-and-guides/integrations/ghost Integrate BeyondWords with Ghost ## Overview The Ghost integration allows you to make your Ghost posts available in audio or video with BeyondWords. Once integrated, BeyondWords will automatically: 1. Create audio versions of your posts. 2. Embed the **BeyondWords Player** directly into your content. ## Set up Distribute your audio articles to your audience. Integrate BeyondWords with your existing tools and platforms. Use the BeyondWords API to create and manage your audio articles. ## Skipping audio for specific posts If there’s a post you don’t want BeyondWords to convert into audio, you can use a tag to exclude it from audio generation. To do this: 1. In the Ghost post editor, open the Post settings side panel. 2. Scroll to the Tags field. 3. Add the tag `#beyondwords-skip`. When this tag is present, BeyondWords will not generate audio for that post, and no player will be embedded. In Ghost Admin, go to **Settings > Integrations**. Click **Add custom integration**. Name it **BeyondWords**, then click **Add**. Copy the **Admin API Key** and **API URL**, then paste them where needed. In Ghost Admin, go to **Settings > Code injection**. Click **Open**, then navigate to **Site Footer**. Paste the BeyondWords Ghost Helper script and click **Save**. Select the embed code that matches the audio or video format you want to embed. ```html ``` Replace ` ` with your project ID. If you add this tag to a post that already has audio, any future changes to the post will not trigger new audio generation. ## Completion You're all set! BeyondWords is now fully integrated with your Ghost site. Next time you publish a post, an audio version will be created automatically. Once generated (this should take just a few minutes), it will be embedded in your post using the BeyondWords Player.Learn how to customize the appearance and behavior of the BeyondWords Player to match your website's design. # Overview Source: https://docs.beyondwords.io/docs-and-guides/integrations/magic-embed/overview Easily embed BeyondWords on any web page. Magic Embed is a **lightweight, client-side solution** that lets you automatically generate and embed audio into your articles. It will: 1. Extract the article content from your web page. 2. Generate the audio. 3. Load the **BeyondWords Player** on your web page. Many of our customers choose Magic Embed because it is easy to set up. Once Magic Embed has been added to your web page, the integration can be managed through the BeyondWords dashboard. ## How it works Magic Embed is built into the standard BeyondWords Player. It can be enabled by setting a flag when initializing the player. When enabled, the player will load as normal but it will send a signal to our servers containing the URL of the page on which it was loaded. Initially, no audio will be available and the player is hidden. However, in the background our servers will fetch the HTML of your web page. Content will be extracted using open-source tools and proprietary algorithms to determine which article content is relevant. Audio will begin generating in the background. Once it is ready, the player will show for new visitors to the web page. BeyondWords will continue to receive signals from the player and automatically update the audio if your article has changed. ## SetupCopy the **Magic Embed script** and add it to your web page. ```html ``` * Replace ` ` with your project ID. * Add other settings, such as [video](/docs-and-guides/content/preferences/video) or [summary](/docs-and-guides/content/preferences/summarization) to embed the audio summary, video summary, or video article instead of the default full audio article. We recommend that you associate the audio with your own ID, e.g. the article ID from your CMS. * Add the `sourceId: ` [identifier](/docs-and-guides/distribution/player/overview#identifiers) to the embed code. By setting a sourceId, the audio will only be generated once even if the same content appears at multiple URLs. Go to **Project > Settings > Integrations > Magic Embed**. Add the domains where you want Magic Embed to work. This ensures BeyondWords only processes content from your authorized domains, not from any random domain where someone might embed your player. * Enter your domain (e.g., `yourwebsite.com`) and click **Add**. * Magic Embed will only function on pages under these domains. * Subdomains will need to be added separately: * e.g. `www.yourwebsite.com` * e.g. `app.yourwebsite.com` For **paywalled or protected content**, you may need to provide authentication headers to grant our servers access to your content. * Add a **Header Name** and **Header Value**. * Click **+** to add multiple headers if needed. * Ensure the headers grant full access to your content. Requests will be made with `User-Agent: BeyondWords Importer` If your website requires **IP allowlisting**, you may need to enable this option to grant our servers access to your content. * Enable **Static IP**. * Ensure your server allows full access to your content. Requests will be sent from `20.234.8.180` or `176.34.249.78` After configuring all settings: 1. Turn on the **Magic Embed** switch. 2. Click **Save changes**. For more control over content extraction and generation, you can use [data attributes](/docs-and-guides/content/data-attributes) to dynamically change the voice on a per-article basis, control publish dates, feature images, and other metadata. # Support Source: https://docs.beyondwords.io/docs-and-guides/integrations/magic-embed/support Frequently asked questions about setting up Magic Embed ### How can I test Magic Embed on localhost? To test locally, your development environment must be accessible from the public internet - this allows our servers to fetch and process your page. Use a tool like [ngrok](https://ngrok.com/) or set up a [Cloudflare Tunnel](https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/) to expose localhost via a secure, public URL. ### Why is no content being extracted from my website? Make sure you've followed all of the [setup steps](/docs-and-guides/integrations/magic-embed/overview). Common reasons include: * Your domain (e.g. [www.yourwebsite.com](http://www.yourwebsite.com)) hasn’t been added under Magic Embed settings * Your server is blocking our request - this can happen with paywalls or bot protection * Your account has run out of credits, in which case Magic Embed will stop importing articles If you’ve followed all setup steps and the issue persists, please contact [support@beyondwords.io](mailto:support@beyondwords.io). ### How can I exclude content that I *don't* want? You can create [filters](/docs-and-guides/content/preferences/filters) to exclude content that should not be extracted from your web page. An exclude filter will exclude certain elements, whereas an include filter will exclude everything except the specified elements. ### How can I include content that I *do* want? It's more difficult to force our content extractor to include specific content once it has determined that it probably isn't part of the article. However, it sometimes helps to exclude all other content using filters (see above). Otherwise, please contact [support@beyondwords.io](mailto:support@beyondwords.io) and we will do our best to help. If you need precise, fine-grained control then it might be worth considering other options such as the [RSS](/docs-and-guides/integrations/rss-feed-importer) or [API](/docs-and-guides/integrations/api) integrations. ### How does image extraction work? Images are considered part of your article's content and will also be extracted. Images will show in the Editor relative to the text content of your article and will be included in generated videos. You can use [data attributes](/docs-and-guides/content/data-attributes) to explicitly set the feature image. ### Why can I see content in the dashboard but not in the player? We automatically extract the publish date from your content by checking various metadata tags on your HTML page. If the publish date is in the future, then audio won't be made available until that time in the player. You can add [data attributes](/docs-and-guides/content/data-attributes) to your HTML to control publish date more precisely and set various other attributes such as the feature image. ### Why do I see a 404 error when loading the player? This is normal. It means that no audio is available yet and the player has been hidden. If Magic Embed is enabled then audio generation will be triggered and load into the player once it's ready. ### How long does it take for audio to load in the player? Usually five minutes after the first visitor. The content extraction and audio generation happen more quickly but the player endpoint is cached for five minutes. We support cache invalidation on our Enterprise plans. ### Does audio update if I change the article text? Yes, Magic Embed will periodically extract content from your page and check if it has changed. This only happens in response to the player being loaded on the page and is subject to rate limits to avoid lots of requests. ### How do I avoid generating audio for old articles? The simplest approach is to only embed the player on articles published after a certain date. You can check the publish date of your article and conditionally include the player embed code only for newer content. Alternatively, you can set `clientSideEnabled: false` when initializing the player if the publish date of your article is before some cut-off date. ### Does Magic Embed work with single-page websites (JavaScript)? Yes, our content extractor renders your page with full JavaScript support. It waits a short amount of time for your page to settle and checks that the network is no longer active before processing the HTML further. This means that it will work with most single-page applications (SPAs) such as client-side React apps, Vue.js and Angular. If you load content dynamically from an API then the content should be extracted. ### I'm still stuck. What can I do? Contact [support@beyondwords.io](mailto:support@beyondwords.io) and we can check our extraction logs and try to help you diagnose issues with Magic Embed. # RSS Feed Importer Source: https://docs.beyondwords.io/docs-and-guides/integrations/rss-feed-importer Turn articles from your RSS feeds into audio.You will need to install the BeyondWords Player separately. ## Overview The RSS Feed Importer allows you to automatically convert articles from your RSS feeds into audio. Once enabled, BeyondWords will regularly check your feeds for new content and generate audio for each new article. ## Add a new feed To get started go to **Project > Settings > Integrations > RSS Feed Importer**.## Map the feed After adding your feed, you'll need to map the RSS feed fields to BeyondWords article properties. This ensures the correct information - such as titles, descriptions, and content - is used to generate audio. Click the **+ Feed** button. Select the type of feed you want to add. You can choose between **XML** and **JSON**. Enter the URL of your RSS feed. For **paywalled or protected content**, you may need to provide authentication headers. * Add a **Header Name** and **Header Value** to authenticate requests. * Click **+** to add multiple headers if needed. If your website requires **IP allowlisting**, enable this option to use a **static IP** for content extraction. If your RSS feed only contains article links and not the full text, BeyondWords can fetch the content from article URLs. * **Page extractor headers (optional):** Use request headers or a static IP to allow BeyondWords to extract content from protected or paywalled articles. If your site requires authentication, add a request header with the required key and value. ## Managing your feed Once your feed is set up: * BeyondWords will automatically check your feed every 10 minutes for new or updated articles * You can manually trigger an import by clicking the **⋯** button next to your feed and selecting **Run** * New articles will be processed and converted to audio automatically * Updated articles (detected by changes in the publish date) will have their audio updated ## Embed the Player You can embed the audio on your website using either the Source ID or Source URL you mapped during setup. Map these required fields from your feed: * **Title**: Select the field containing the article title * **Body**: Select the field containing the article content * **Source ID**: Select the field containing a unique identifier for each article (usually corresponds to your article ID in your CMS). This ID can be used to easily embed the audio on your articles using the BeyondWords Player. * **Source URL**: Select the field containing the URL for each article. This URL can also be used to easily embed the audio on your articles using the BeyondWords Player. You can also map these optional fields: * **Summary**: Select the field containing a summary of the article. You can leave this empty if you use BeyondWords summarization. * **Author**: Select the field containing the article author's name * **Image URL**: Select the field containing the URL of the article's featured image * **Metadata**: Select the field containing additional metadata about the article * **Publish date**: Select the field containing when the article was published The publish date is used to check for updates to articles. When BeyondWords detects a change in the publish date, it will update the audio for that article. Click **Save changes** to complete the setup. Your feed will automatically be enabled and BeyondWords will begin checking for articles. Once your content is imported and converted to audio, learn how to embed the BeyondWords Player on your website to deliver a seamless audio experience to your audience. # Webhooks Source: https://docs.beyondwords.io/docs-and-guides/integrations/webhooks Configure and manage webhooks ## Overview Webhooks let you receive HTTP requests when an article's audio is created, updated, or deleted. Use them to automate workflows and keep your systems in sync with your BeyondWords content.  ## Setting up a webhook To get started go to **Project > Settings > Integrations > Webhooks**.## Webhook events Once configured, your webhook will receive notifications for the following events: * **Audio updated**: Triggered when newly generated audio or updated audio has finished processing. * **Audio deleted**: When audio is removed from the system * **Audio error**: If an error has occured during audio generation ## Webhook payloads Each webhook notification includes a JSON payload with details about the event and the affected content. You can use this information to trigger appropriate actions in your systems. ### audio.updated ```javascript audio.updated payload expandable { "id": Click the **+ Webhook** button to create your first webhook. In the "Webhook URL" field, enter the URL where BeyondWords should send event notifications. This should be an endpoint on your server that's configured to receive and process webhook events. If your webhook requires authentication or custom headers: * Enter a **Header name** (e.g., "Authorization") * Enter a **Header value** (e.g., "Bearer your-token-here") * Click the **+** button to add additional headers if needed Toggle the **Enabled** switch to activate the webhook. You can disable it at any time without deleting the configuration. Click the **Save changes** button to complete the setup. , "title": " ", "project_id": " ", "external_id": " ", "state": "processed", "metadata": {}, "media": [ { "id": " ", "content_type": "mp3", "url": " ", "duration": 281 }, { "id": " ", "content_type": "m3u8", "url": " ", "duration": 281 } ], "image_url": null, "deleted": false, "access_key": null, "processing_at": "2025-07-02T13:19:39.054Z", "published": true, "published_at": "2025-07-02T13:19:38.699Z", "content_id": " ", "source_id": " ", "is_copy": false, "action_type": "audio.updated" } ``` ### audio.deleted ```javascript audio.delete payload expandable { "id": , "title": null, "project_id": " ", "external_id": " ", "state": "processed", "metadata": {}, "media": [], "image_url": null, "deleted": true, "access_key": null, "processing_at": "2025-07-02T13:19:39.054Z", "published": true, "published_at": "2025-07-02T13:19:38.699Z", "content_id": " ", "source_id": " ", "is_copy": false, "action_type": "audio.deleted" } ``` ### audio.error ```javascript audio.error payload expandable { "id": , "title": " ", "project_id": " ", "external_id": " ", "state": "processed", "metadata": {}, "media": [ { "id": " ", "content_type": "mp3", "url": " ", "duration": 281 }, { "id": " ", "content_type": "m3u8", "url": " ", "duration": 281 } ], "image_url": null, "deleted": false, "access_key": null, "processing_at": "2025-07-02T13:19:39.054Z", "published": false, "published_at": "2025-07-02T13:19:38.699Z", "content_id": " ", "source_id": " ", "is_copy": false, "action_type": "audio.error" } ``` ## Managing webhooks You can create multiple webhooks to integrate with different systems. For each webhook, you can: * Edit the configuration * Temporarily disable it * Delete it when no longer needed ## Security considerations For enhanced security: * Use HTTPS URLs for your webhook endpoints * Implement authentication using request headers * Validate incoming webhook requests on your server # Filters Source: https://docs.beyondwords.io/docs-and-guides/integrations/wordpress/filters We provide WordPress filters which allow you to modify the default data we use during the execution of our plugin. ## beyondwords\_content\_params Filters the body params we send to the BeyondWords API when processing audio. **Parameters**
`$params` *array*
The params we send to the BeyondWords API.
`$post_id` *int*
The WordPress Post ID ### Example 1 Prepend the author name and the published date to the audio body ```php function my_beyondwords_content_params( $params, $post_id ) { $name = get_the_author_meta( 'display_name', $post_id ); $date = get_the_date( '', $post_id ); $prepend = ''; if ( $name ) { $prepend .= 'By ' . esc_html( $name ) . '
'; } if ( $date ) { $prepend .= '' . esc_html( $date ) . '
'; } $params['body'] = $prepend . $params['body']; return $params; } add_filter( 'beyondwords_content_params', 'my_beyondwords_content_params', 10, 2 ); ``` ### Example 2 Send the value of a custom field called "my\_custom\_field" to the BeyondWords API as a metadata field named "my\_custom\_key". ```php function my_beyondwords_content_params( $params, $post_id ) { if ( is_object( $params['metadata'] ) ) { $params['metadata']->my_custom_key = get_post_meta( $post_id, 'my_custom_field', true ); } return $params; } add_filter( 'beyondwords_content_params', 'my_beyondwords_content_params', 10, 2 ); ``` ### Example 3 Forward the value of a custom field to the BeyondWords API. ```php function my_beyondwords_content_params( $params, $post_id ) { // Use a custom field "my_ads_enabled" for the "ads_enabled" param for API requests $params[ 'ads_enabled' ] = (bool) get_post_meta( $post_id, 'my_ads_enabled', true ); return $params; } add_filter( 'beyondwords_content_params', 'my_beyondwords_content_params', 10, 2 ); ``` ## BeyondWords\_player\_html Filters the HTML of the BeyondWords Player. **Parameters**
`$html` *string*
The HTML for the audio player. The audio player JavaScript may fail to locate the target element if you remove or replace the default contents of this parameter. `$post_id` *int*
The WordPress Post ID `$project_id` *string*
BeyondWords project ID. `$content_id` *string*
BeyondWords content ID. ### Example 1 Wrap the player in a container div. ```php function my_beyondwords_player_html( $html, $post_id, $project_id, $content_id ) { return '' . $html . '' } add_filter( 'beyondwords_player_html', 'my_beyondwords_player_html', 10, 4 ); ``` ### Example 2 Hiding the BeyondWords player for non-signed in users. ```php function my_beyondwords_player_html( $html, $post_id, $project_id, $content_id ) { $current_user = wp_get_current_user(); if ( $current_user->exists() ) { return $html; } return ''; } add_filter( 'beyondwords_player_html', 'my_beyondwords_player_html', 10, 4 ); ``` ## beyondwords\_player\_script\_onload Filters the onload attribute of the BeyondWords Player script.The strings should be in double quotes, because the output of this is run through esc\_js() before it is output into the DOM. **Parameters**
`$onload` *string*
The string value of the onload script. `$params` *array*
The SDK params for the current post, including `projectId` and `contentId`. ### Example 1 Append a custom command to the default onload script. ```php function my_beyondwords_player_script_onload( $onload, $params ) { return $onload . 'initializeCustomUserInterface();'; } add_filter( 'beyondwords_player_script_onload', 'my_beyondwords_player_script_onload', 10, 2 ); ``` ### Example 2 Log the player params to the browser console before the player initializes. ```php function my_beyondwords_player_script_onload( $onload, $params ) { // Console log the params we pass to the SDK $my_command = 'console.log("🔊", ' . wp_json_encode( $params, JSON_FORCE_OBJECT | JSON_UNESCAPED_SLASHES ) . ');'; // Prepend the command to the default onload script return $my_command . $onload; } add_filter( 'beyondwords_player_script_onload', 'my_beyondwords_player_script_onload', 10, 2 ); ``` ## beyondwords\_player\_sdk\_params Filters the BeyondWords Player SDK parameters. Refer to the [Player Settings](https://github.com/beyondwords-io/player/blob/main/doc/player-settings.md) for a the list of available parameters. **Parameters**
`$params` *array*
The SDK parameters `$post_id` *int*
The post ID ### Example 1 Use a custom colour for the text in all players. ```php function my_beyondwords_player_sdk_params( $params, $post_id ) { $params[ 'textColor' ] = 'rgba(255, 0, 0, 0.8)'; return $params; } add_filter( 'beyondwords_player_sdk_params', 'my_beyondwords_player_sdk_params', 10, 2 ); ``` ### Example 2 Set the Advert consent parameter for all users. ```php function my_beyondwords_player_sdk_params( $params, $post_id ) { $params[ 'advertConsent' ] = 'non-personalized'; return $params; } add_filter( 'beyondwords_player_sdk_params', 'my_beyondwords_player_sdk_params', 10, 2 ); ``` ### Example 3 Use a blue icon colour for players in posts tagged with "News". ```php function my_beyondwords_player_sdk_params( $params, $post_id ) { $tags = get_the_tags( $post_id ); foreach ( $tags as $tag ) { if ( isset( $tag->name ) && $tag->name === "News" ) { $params[ 'iconColor' ] = '#000080'; // Navy blue } } return $params; } add_filter( 'beyondwords_player_sdk_params', 'my_beyondwords_player_sdk_params', 10, 2 ); ``` ### Example 4 Skip ads for signed-in users. ```php function my_beyondwords_player_sdk_params( $params, $post_id ) { $current_user = wp_get_current_user(); if ( $current_user->exists() ) { // This will override the project defaults $params['adverts'] = []; } return $params; } add_filter( 'beyondwords_player_sdk_params', 'my_beyondwords_player_sdk_params', 10, 2 ); ``` ## beyondwords\_settings\_player\_styles Filters the player styles – the "Player style" `