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

# WebView customization

> Configure the experience by customizing colors, language, and legal and security validations.

This guide explains what you can customize in the **WebView** biometric experience, how to use the **`[Webview] Biometric UI Configuration`** tool, what outputs to expect when you test, and how to fill in each input parameter.

## What you can customize

You can align the experience with your brand and business rules using:

* **Colors and mode** (light or dark, with paired variables per theme).
* **Language** for UI copy, and whether the user may switch language.
* **Legal validation** (link to terms and conditions).
* **Security validation** (facematch threshold and document ghost check).

<Info>
  Face and document **capture widgets** are not customizable; see **Non-editable elements** below.
</Info>

## Configure in Brain

Set appearance and UI rules with the **`[Webview] Biometric UI Configuration`** tool.

<Steps>
  <Step title="Create a dedicated workflow">
    Create a **new workflow** in Brain for this tool. WebView UI personalization changes should only be applied **once**; you can keep this workflow as the single place where you run the configuration update.

    <Frame caption="Create the workflow">
      <img src="https://mintcdn.com/jelouai/TUSVzC78dOK3FEY7/assets/images/integraciones/identidad/personalizacion-webview/paso-1.png?fit=max&auto=format&n=TUSVzC78dOK3FEY7&q=85&s=dc0074d3467e7da490845ab089268fce" alt="Create workflow modal in Jelou Producto to name the dedicated workflow" width="1024" height="462" data-path="assets/images/integraciones/identidad/personalizacion-webview/paso-1.png" />
    </Frame>
  </Step>

  <Step title="Find the tool">
    In the **sidebar**, search by tool name. If it is not connected yet, open the **Tools** icon in the sidebar and locate **`[Webview] Biometric UI Configuration`** in the catalog.

    <Frame caption="Find the tool in Marketplace and drag it to the canvas">
      <img src="https://mintcdn.com/jelouai/TUSVzC78dOK3FEY7/assets/images/integraciones/identidad/personalizacion-webview/paso-2.png?fit=max&auto=format&n=TUSVzC78dOK3FEY7&q=85&s=056df7226c82c4be56349a5b8933646f" alt="Marketplace with [Webview] Biometric UI Configuration selected and connected to the Start node" width="1024" height="458" data-path="assets/images/integraciones/identidad/personalizacion-webview/paso-2.png" />
    </Frame>
  </Step>

  <Step title="Connect, drag, and configure">
    Connect the tool, **drag it onto the workflow canvas**, and complete the fields in the **right-hand sidebar** when the node is selected. Review the **Inputs** tab under **Configuration** below.

    <Frame caption="Step 3: tool version and input configuration">
      <img src="https://mintcdn.com/jelouai/TUSVzC78dOK3FEY7/assets/images/integraciones/identidad/personalizacion-webview/paso-3.png?fit=max&auto=format&n=TUSVzC78dOK3FEY7&q=85&s=3d56a80cc0e507173b53b5ee57cc50d0" alt="Node side panel with tool version selector and prompt to configure inputs" width="1024" height="463" data-path="assets/images/integraciones/identidad/personalizacion-webview/paso-3.png" />
    </Frame>
  </Step>

  <Step title="Wire messages for the Outputs">
    On the node's **Outputs** tab, connect each tool branch to the rest of the workflow and set the **message** (or next action) that should run in each case. The tool exposes three output variables:

    * **`success`** — maps to **UI updated**: the configuration was applied successfully to the WebView UI.
    * **`noData`** — maps to **No changes found to update** (for example, same values as already live or validation blocking save).
    * **`error`** — maps to **Service error** (the operation failed while contacting the service that persists configuration).

    <Frame caption="Connect three outputs to Text nodes with a message">
      <img src="https://mintcdn.com/jelouai/TUSVzC78dOK3FEY7/assets/images/integraciones/identidad/personalizacion-webview/paso-4.png?fit=max&auto=format&n=TUSVzC78dOK3FEY7&q=85&s=7b1d996a86f4ce730ce8e05d0b301166" alt="Canvas with UI updated, no changes, and service error branches connected to Text nodes" width="1024" height="461" data-path="assets/images/integraciones/identidad/personalizacion-webview/paso-4.png" />
    </Frame>
  </Step>

  <Step title="Test the workflow">
    Use **Test** on the workflow. It should return **success** (**UI updated**, variable `success`) when changes were applied correctly to the WebView experience.

    <Frame caption="Test the project and review the result in the panel">
      <img src="https://mintcdn.com/jelouai/TUSVzC78dOK3FEY7/assets/images/integraciones/identidad/personalizacion-webview/paso-5.png?fit=max&auto=format&n=TUSVzC78dOK3FEY7&q=85&s=aa21adf3fb40716e8bb432420c5ea79a" alt="Test project panel showing a successful run and the Text node message on the UI updated branch" width="1024" height="464" data-path="assets/images/integraciones/identidad/personalizacion-webview/paso-5.png" />
    </Frame>
  </Step>
</Steps>

## Configuration

<Tabs>
  <Tab title="Inputs">
    <AccordionGroup>
      <Accordion title="UI colors" icon="palette">
        <ParamField body="UI colors" type="enum">
          **Variable name:** UI colors

          **Variable:** `colors`

          **Description:** Enables the **custom palette** (`true` / `false`). When `true`, you must set **`Modo`** and the HEX colors for the selected theme. With the palette on, validate **contrast and readability** between background, text, and buttons (especially if the device theme can change).

          **Available values:** `true`, `false`
        </ParamField>
      </Accordion>

      <Accordion title="Modo" icon="moon">
        <ParamField body="Modo" type="enum">
          **Variable name:** Modo

          **Variable:** `Modo`

          **Description:** Base theme **Claro** (light) or **Oscuro** (dark); determines which color set applies.

          **Available values:** `Claro`, `Oscuro`

          **Required when:** `colors` = `true`

          In **light mode**, use `primaryColor`, `secondaryColor`, `tertiaryColor`, `backgroundColor`, and `fontColor`.

          In **dark mode**, use `primaryDarkColor`, `secondaryDarkColor`, `tertiaryDarkColor`, `backgroundDarkColor`, and `fontDarkColor` (same five visual roles, dark variant).
        </ParamField>
      </Accordion>

      <Accordion title="Primary color (light mode)" icon="droplet">
        <ParamField body="Primary color (light mode)" type="string">
          **Variable name:** Primary color (light mode)

          **Variable:** `primaryColor`

          **Description:** HEX color (for example `#ffffff`). Drives **progress** and **active states** (completed and current steps, terms checkbox border and state, document validation spinner).

          **Required when:** `Modo` = `Claro`
        </ParamField>
      </Accordion>

      <Accordion title="Primary color (dark mode)" icon="droplet">
        <ParamField body="Primary color (dark mode)" type="string">
          **Variable name:** Primary color (dark mode)

          **Variable:** `primaryDarkColor`

          **Description:** HEX color (for example `#ffffff`). Same visual role as `primaryColor` in dark theme.

          **Required when:** `Modo` = `Oscuro`
        </ParamField>
      </Accordion>

      <Accordion title="Secondary color (light mode)" icon="droplet">
        <ParamField body="Secondary color (light mode)" type="string">
          **Variable name:** Secondary color (light mode)

          **Variable:** `secondaryColor`

          **Description:** HEX color (for example `#ffffff`). **Primary** actions: main buttons (Continue, Retry, etc.), loading spinners, success, terms links, **pending** progress steps.

          **Required when:** `Modo` = `Claro`
        </ParamField>
      </Accordion>

      <Accordion title="Secondary color (dark mode)" icon="droplet">
        <ParamField body="Secondary color (dark mode)" type="string">
          **Variable name:** Secondary color (dark mode)

          **Variable:** `secondaryDarkColor`

          **Description:** HEX color (for example `#ffffff`). Same role as `secondaryColor` in dark theme.

          **Required when:** `Modo` = `Oscuro`
        </ParamField>
      </Accordion>

      <Accordion title="Tertiary color (light mode)" icon="droplet">
        <ParamField body="Tertiary color (light mode)" type="string">
          **Variable name:** Tertiary color (light mode)

          **Variable:** `tertiaryColor`

          **Description:** HEX color (for example `#ffffff`). **In-progress** states: spinners during validations and step indicators while running.

          **Required when:** `Modo` = `Claro`
        </ParamField>
      </Accordion>

      <Accordion title="Tertiary color (dark mode)" icon="droplet">
        <ParamField body="Tertiary color (dark mode)" type="string">
          Variable: `tertiaryDarkColor`. HEX: (example: `#ffffff`). Same role as `tertiaryColor` in dark theme.

          **Required when:** `Modo` = `Oscuro`
        </ParamField>
      </Accordion>

      <Accordion title="Screen background (light mode)" icon="image">
        <ParamField body="Screen background (light mode)" type="string">
          **Variable name:** Screen background (light mode)

          **Variable:** `backgroundColor`

          **Description:** HEX color (for example `#ffffff`). Overall background for flow screens.

          **Required when:** `Modo` = `Claro`
        </ParamField>
      </Accordion>

      <Accordion title="Screen background (dark mode)" icon="image">
        <ParamField body="Screen background (dark mode)" type="string">
          **Variable name:** Screen background (dark mode)

          **Variable:** `backgroundDarkColor`

          **Description:** HEX color (for example `#ffffff`). Background in dark theme.

          **Required when:** `Modo` = `Oscuro`
        </ParamField>
      </Accordion>

      <Accordion title="Font color (light mode)" icon="font">
        <ParamField body="Font color (light mode)" type="string">
          **Variable name:** Font color (light mode)

          **Variable:** `fontColor`

          **Description:** HEX color (for example `#ffffff`). Text: titles, instructions, messages, and states.

          **Required when:** `Modo` = `Claro`
        </ParamField>
      </Accordion>

      <Accordion title="Font color (dark mode)" icon="font">
        <ParamField body="Font color (dark mode)" type="string">
          **Variable name:** Font color (dark mode)

          **Variable:** `fontDarkColor`

          **Description:** HEX color (for example `#ffffff`). Text in dark theme.

          **Required when:** `Modo` = `Oscuro`
        </ParamField>
      </Accordion>

      <Accordion title="Terms and conditions link" icon="link">
        <ParamField body="Terms and conditions link" type="string">
          **Variable name:** Terms and conditions link

          **Variable:** `termsLink`

          **Description:** **Public URL** of the legal document. **Required** for a biometric process; without it you do not meet minimum implementation requirements. The document must clearly state **use**, **storage**, and **processing** of personal and biometric data, and be shown **before** verification starts.
        </ParamField>
      </Accordion>

      <Accordion title="Facematch: approval threshold" icon="percent">
        <ParamField body="Facematch: approval threshold" type="enum">
          **Variable name:** Facematch: approval threshold

          **Variable:** `facematchThreshold`

          **Description:** Strictness of **face comparison** (match percentage).

          **Available values:** `65`, `70`, `75`, `80`, `85`, `90`
        </ParamField>
      </Accordion>

      <Accordion title="Document: validate ghost image" icon="shield">
        <ParamField body="Document: validate ghost image" type="enum">
          **Variable name:** Document: validate ghost image

          **Variable:** `validateGhostPortrait`

          **Description:** Checks **consistency between the main document photo and the thumbnail (ghost)**.

          **Available values:** `true`, `false`

          <Tip>
            Use `false` if users often send **low-quality** photos; with `true`, rejection rates may increase.
          </Tip>
        </ParamField>
      </Accordion>

      <Accordion title="Edit language" icon="language">
        <ParamField body="Edit language" type="enum">
          **Variable name:** Edit language

          **Variable:** `editLanguage`

          **Description:** Enables the language block (`defaultLanguage`, `canChangeLanguage`).

          **Available values:** `true`, `false`
        </ParamField>
      </Accordion>

      <Accordion title="Default language" icon="globe">
        <ParamField body="Default language" type="enum">
          **Variable name:** Default language

          **Variable:** `defaultLanguage`

          **Description:** Initial language for WebView copy.

          **Available values:** `es`, `en`

          **Required when:** `editLanguage` = `true`
        </ParamField>
      </Accordion>

      <Accordion title="Allow user to change language" icon="user">
        <ParamField body="Allow user to change language" type="enum">
          **Variable name:** Allow user to change language

          **Variable:** `canChangeLanguage`

          **Description:** When `true`, the user may **change the interface language at any time** during the flow.

          **Available values:** `true`, `false`

          **Required when:** `editLanguage` = `true`
        </ParamField>
      </Accordion>
    </AccordionGroup>
  </Tab>

  <Tab title="Outputs">
    ### Success

    <AccordionGroup>
      <Accordion title="UI updated" icon="circle-check">
        The submitted configuration was applied successfully to the WebView UI.

        **Variable:** `success`

        **Description:** UI updated
      </Accordion>
    </AccordionGroup>

    ### Errors

    <AccordionGroup>
      <Accordion title="No changes" icon="ban">
        The run did not produce an effective UI update (for example, same values as already live, or validation blocking save).

        **Variable:** `noData`

        **Description:** No changes found to update
      </Accordion>

      <Accordion title="Service error" icon="triangle-exclamation">
        The operation failed while contacting the service that persists configuration.

        **Variable:** `error`

        **Description:** Service error
      </Accordion>
    </AccordionGroup>
  </Tab>
</Tabs>

## Biometric WebView scope

The biometric WebView includes **12 screens** that guide the user through **photo-based WebView verification**: liveness, document (front and back), and a final outcome. The exact names and order of screens may vary with the product version and agent settings (for example, intro video or language).

## Non-editable elements

To keep verification quality, these are not customizable:

* Face capture widgets.
* Document capture widgets.

## Pre-publish review

Recommended checklist:

* Dedicated workflow for the tool with a successful test run (**UI updated**, `success`).
* **`colors`**, **`Modo`**, and consistent color pairs (light and/or dark as applicable).
* Public, working **`termsLink`**.
* **`facematchThreshold`** aligned with your risk policy.
* **`validateGhostPortrait`** suited to typical document photo quality.
* **`editLanguage`**, **`defaultLanguage`**, and **`canChangeLanguage`** reviewed.
* Capture widgets visible and not altered in unsupported ways.
* End-to-end tests completed on WhatsApp.
