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

# Embed standard SSO - Legacy v0 signing format

> Reference for the deprecated v0 embed URL signing format, in which each parameter is sent as its own URL parameter alongside a signature.

<Warning>
  The v0 format is deprecated. It will be unsupported after October 1, 2026, and removed by January 1, 2027. Use the [v1 signed payload format](/embed/setup/standard-sso/latest) for new integrations, and [migrate existing ones](/embed/setup/standard-sso/migrate-to-latest) before then.
</Warning>

Use this guide as a reference for the legacy v0 embed URL signing format. In the v0 format, each [parameter](/embed/setup/url-parameters) is sent as its own URL query parameter, and the `signature` parameter covers the parameter values concatenated into a single newline-delimited string.

## Parameter encoding

JSON-valued parameters - [`userAttributes`](/embed/setup/url-parameters/userAttributes), [`connectionRoles`](/embed/setup/url-parameters/connectionRoles), [`modelRoles`](/embed/setup/url-parameters/modelRoles), [`customTheme`](/embed/setup/url-parameters/customTheme), [`uiSettings`](/embed/setup/url-parameters/uiSettings), and [`groups`](/embed/setup/url-parameters/groups) - must be stringified and then URL encoded, like every other parameter in the URL.

For example, this JSON-valued parameter:

```json wrap theme={null}
userAttributes={"country":"Townsville"}
```

Must be stringified and then URL encoded:

```markdown wrap theme={null}
userAttributes=%7B%22country%22%3A%22Townsville%22%7D
```

## Manually generate a v0 signed URL

To generate the signature:

<Steps>
  <Step>
    Concatenate the required properties, delimited by a newline character **in the exact order enumerated below**. **Note**: The properties are in alphabetical order, with the exception of the leading login URL:

    ```text theme={null}
    login URL
    contentPath
    externalId
    name
    nonce
    ```
  </Step>

  <Step>
    Concatenate the optional properties in alphabetical order, delimited by a newline character **in the exact order enumerated below**:

    ```markdown highlight={12} theme={null}
    accessBoost
    connectionRoles
    customTheme
    customThemeId
    email
    entity
    entityAiCreditLimit
    entityFolderContentRole
    entityFolderGroupContentRole
    entityFolderLabel
    entityGroupLabel
    filterSearchParam                 // must be URI encoded
    groups
    linkAccess
    mode
    modelRoles
    prefersDark
    preserveEntityFolderContentRole
    theme
    timezone
    uiSettings
    userAttributes
    ```

    **Do not include leading or trailing spaces. Include only a single newline between each part of the signature.**

    The following example includes optional parameters for custom theme, entity, filter search param, prefers dark, link access, theme, and user attributes:

    ```text wrap theme={null}
    https://example.embed-omniapp.co/embed/login
    /dashboards/123abc
    luke@example.com
    Luke Skywalker
    hN38NgtnV2B3PMILhKQOpwLyJRP4qVv4
    {"dashboard-background":"#00FF00","dashboard-tile-title-font-size":"1.5rem"}
    Acme Corp
    f--users.country=%7B"kind"%3A"EQUALS"%2C"type"%3A"string"%2C"values"%3A%5B"USA"%5D%2C"is_negative"%3Afalse%7D&f--users.state=%7B"kind"%3A"EQUALS"%2C"type"%3A"string"%2C"values"%3A%5B%5D%2C"is_negative"%3Afalse%7D&f--inventory_items.cost=%7B"kind"%3A"GREATER_THAN"%2C"type"%3A"number"%2C"values"%3A%5B"20"%5D%2C"is_negative"%3Afalse%2C"is_inclusive"%3Afalse%7D
    true
    __omni_link_access_open
    vibes
    {"planet": "tatooine"}
    ```

    Refer to the [Embed parameters reference](/embed/setup/url-parameters) for more information about available parameters.
  </Step>

  <Step>
    Sign the string using your secret key with an HMAC sha256 digest algorithm, encoded as a base64url string:

    ```javascript wrap title="Node.js example" theme={null}
    const hmac = crypto.createHmac("sha256", secret);
    hmac.update(data);
    return hmac.digest("base64url");
    ```

    Refer to [the Base64 spec](https://datatracker.ietf.org/doc/html/rfc4648#page-7) for more information about base64url.
  </Step>

  <Step>
    URL encode each parameter as part of a URL query string and attach the generated signature. The order of parameters is irrelevant when generating the login URL.

    ```shell wrap theme={null}
    https://blobsrus.embed-omniapp.co/embed/login?contentPath=%2Fembed%2Fdashboards%2F123abc&externalId=luke%40example.com&name=Luke%20Skywalker&nonce=hN38NgtnV2B3PMILhKQOpwLyJRP4qVv4&entity=Acme+Corp&theme=vibes&userAttributes=%7B%22planet%22%3A%22tatooine%22%7D&filterSearchParam=f--order_items.status%3D%257B%22kind%22%253A%22EQUALS%22%252C%22type%22%253A%22string%22%252C%22topic%22%253A%22order_items%22%252C%22values%22%253A%255B%22Returned%22%255D%252C%22base_view%22%253A%22order_items%22%252C%22is_negative%22%253Afalse%257D&linkAccess=__omni_link_access_open&prefersDark=true&customTheme=%7B%22dashboard-background%22%3A%22%2300FF00%22%2C%22dashboard-tile-title-font-size%22%3A%221.5rem%22%7D&signature=rpf-YbMMTd2XzO_HRyP1E_RiYpQYqBkU-X9iUMplEz4
    ```
  </Step>
</Steps>

## Next steps

* [Setting up embed standard SSO with the v1 signed payload format](/embed/setup/standard-sso/latest)
* [Embed parameters reference](/embed/setup/url-parameters)
