> ## Documentation Index
> Fetch the complete documentation index at: https://docs.beyondwords.io/llms.txt
> Use this file to discover all available pages before exploring further.

# 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

<Steps>
  <Step title="Access Ghost Admin settings">
    In Ghost Admin, go to **Settings > Integrations**.
  </Step>

  <Step title="Add custom integration">
    Click **Add custom integration**. Name it **BeyondWords**, then click **Add**.
  </Step>

  <Step title="Copy API credentials">
    Copy the **Admin API Key** and **API URL**, then paste them where needed.
  </Step>

  <Step title="Access Code Injection settings">
    In Ghost Admin, go to **Settings > Code injection**.
  </Step>

  <Step title="Add the BeyondWords script">
    Click **Open**, then navigate to **Site Footer**. Paste the BeyondWords Ghost Helper script and click **Save**.
  </Step>

  <Step title="Choose the content format">
    Select the embed code that matches the audio or video format you want to embed.

    ```html theme={null}
    <script async defer src="https://proxy.beyondwords.io/npm/@beyondwords/ghost-helper@latest" 
    onload="new BeyondWords.GhostHelper({
      projectId: <ID>
    })">
    </script>
    ```

    <Note>
      Replace `<ID>` with your project ID.
    </Note>
  </Step>
</Steps>

## 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.

<Note>If you add this tag to a post that already has audio, any future changes to the post will not trigger new audio generation.</Note>

## 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.

## Custom Player Configuration via Script

The helper script added to your site can be customized. By default, the player will use the cusomization options set in your [distribution settings](/docs-and-guides/distribution/player/settings), but for finer control you can customize the embed script itself. The same configuration options apply to both the BeyondWords Player and the GhostHelper script — look at [Player settings](/docs-and-guides/distribution/player/sdk/javascript/player-settings) for a full list of configurable properties.

<Card title="Customize the BeyondWords Player" icon="play" href="/docs-and-guides/distribution/player/settings">
  Learn how to customize the appearance and behavior of the BeyondWords Player to match your website's design.
</Card>

### Basic script

```html theme={null}
<script async defer src="https://proxy.beyondwords.io/npm/@beyondwords/ghost-helper@latest" 
onload="new BeyondWords.GhostHelper({
  projectId: <ID>
})">
</script>
```

### Custom position

```html theme={null}
<script async defer src="https://proxy.beyondwords.io/npm/@beyondwords/ghost-helper@latest/dist/umd.js"
  onload="new BeyondWords.GhostHelper({
    projectId: <ID>,
    target: '.custom-target',
  })">
</script>
```

### Custom styles

```html theme={null}
<style>
    #beyondwords-player {
        margin: 16px 0;
    }
</style>
<script async defer src="https://proxy.beyondwords.io/npm/@beyondwords/ghost-helper@latest/dist/umd.js"
  onload="new BeyondWords.GhostHelper({
    projectId: <ID>
  })">
</script>
```

### Player reference

```html theme={null}
const helper = new BeyondWords.GhostHelper({
  projectId: <ID>
});
await helper.playerLoader;
helper.player.addEventListener("<any>", console.log);
```
