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

# Custom domain

> Connect your own domain to Recording Links so console logs and network requests get captured from every customer recording.

A custom recording domain connects your website or web app to Jam so Recording Links capture console logs, network requests, and user interactions alongside screen recordings. Without a custom domain, screen recordings still work, but developer logs are not included.

Connecting a custom domain allows Jam to:

* Serve recording links from your domain
* Capture console logs and network requests
* Attach developer logs directly to Jams
* Support Intercom-requested Jams

You need write access to your website to complete the three steps below.

## Setup

<Steps>
  <Step title="Install the Recorder and Capture scripts">
    Jam's Recorder and Capture scripts must be served from the **same origin** as your site so that recordings and logs are correctly associated.

    First, find your **Team ID** in Jam. Go to [**Settings → SDK**](https://jam.dev/s/settings/sdk), where your correct Team ID is pre-filled.

    Paste the following snippet into the `<head>` tag of your site. For best results, add it to all pages, or at minimum on the URL that will host your recording route.

    ```html theme={"theme":"css-variables"}
    <html>
      <head>
        <!-- Lets users record their screen from your site -->
        <meta name="jam:team" content="my-team-id-from-dashboard" />
        <script type="module" src="https://js.jam.dev/recorder.js"></script>

        <!-- Captures user events and developer logs -->
        <script type="module" src="https://js.jam.dev/capture.js"></script>
      </head>
    </html>
    ```

    **What each script does:**

    * **`recorder.js`** displays the recording interface when a Recording Link is opened, and lets users record directly from your site.
    * **`capture.js`** captures console logs, network requests, and click and key interactions while a recording is in progress.

    <Warning>
      Wait for both scripts to load successfully on your target URL before verifying your domain. Check that your Content Security Policy isn't blocking them.
    </Warning>

    **Performance note:** Jam caches assets aggressively to reduce load. Place the `<script>` tags as early as possible in `<head>`. Using `async`, `defer`, or lazy `import()` can skip early logs and requests.
  </Step>

  <Step title="Update your Content Security Policy (if applicable)">
    If your site does not define any Content Security Policy directives, skip this step.

    If your site sets a CSP with `frame-src` or `script-src`, add `*.jam.dev` to both. Otherwise, the Jam scripts will be blocked.

    ```html theme={"theme":"css-variables"}
    <meta
      http-equiv="Content-Security-Policy"
      content="frame-src 'self' *.jam.dev; script-src 'self' *.jam.dev;"
    />
    ```
  </Step>

  <Step title="Verify your domain">
    After installing the scripts, verify your domain in Jam before connecting it. Verification checks that the scripts load and work correctly.

    1. Go to [**Settings → SDK**](https://jam.dev/s/settings/sdk).
    2. Click **Verify**.
    3. Paste the URL where the Jam scripts are installed (for example, `example.com` or `example.com/recorder`).
    4. Click **Check setup**.

    Jam verifies that:

    * The page is publicly accessible
    * The URL does not redirect
    * Query parameters are preserved
    * Both the Recorder and Capture scripts are installed

    If verification succeeds, your domain is connected and Recording Links will capture console logs and network requests.

    <Warning>
      If your app redirects users from the recording URL (for example, sending unauthenticated users to a login page) keep all `jam-` query parameters through the redirect. The most important is `jam-recording=...`. Open your recording URL in an incognito window before verifying to check for unexpected redirects or parameter stripping.
    </Warning>
  </Step>
</Steps>

## Domain and subdomain behavior

In most cases, a recorder installed on the root domain (`example.com`) can capture events from subdomains (`sub.example.com`), and vice versa.

**Safari limitation:** In Safari, logs are only captured when the recorder and capture scripts run on the exact same subdomain. If Safari support is important for your team, install the recorder on the same subdomain where your users are active.

## Current limitations

| Limitation                | Details                                                                                                                                                             |
| ------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Browser support**       | Fully supported in Chrome (including Incognito) and Firefox (including Private Windows). Supported in most Safari windows. Not supported in Safari Private Windows. |
| **Iframes**               | If the Capture script is installed inside an iframe, top-level page logs will not be captured.                                                                      |
| **Script loading**        | Scripts loaded with `async`, `defer`, or lazy `import()` may miss early console logs and network requests.                                                          |
| **Verification required** | Installing scripts alone is not sufficient. You must verify your domain in [**Settings → SDK**](https://jam.dev/s/settings/sdk).                                    |

## FAQ

<AccordionGroup>
  <Accordion title="Can I put the Recorder and Capture scripts on different pages?">
    Yes. The `<meta name="jam:team" />` tag must be present on any page where `recorder.js` is installed. It is optional on pages that only include `capture.js`. Logs are only captured from pages where the Capture script is running.
  </Accordion>

  <Accordion title="Can I programmatically create Recording Links?">
    Not yet. Jam plans to expose an API for creating Recording Links programmatically (for example, from Slack, Zendesk, or directly within your app).
  </Accordion>

  <Accordion title="Can I customize the recorder UI?">
    Not currently. Contact Jam if you have specific customization requirements. This is an area under active evaluation.
  </Accordion>

  <Accordion title="Can I mix Jam recordings with my own recording infrastructure?">
    No. Jam's Recorder and Capture scripts must be used together. Due to browser storage and cross-origin restrictions, partial integrations or mixing with external recording systems are not supported.
  </Accordion>
</AccordionGroup>

## If verification fails

Common causes of verification failure:

* Team ID mismatch
* Scripts not installed on the target URL
* Scripts blocked by your CSP
* URL requires authentication
* URL redirects before scripts load
* Query parameters are stripped during redirect
* Recorder and Capture scripts are on different domains

Fix the issue and retry verification.
