> For the complete documentation index, see [llms.txt](https://docs.facephi.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.facephi.com/docs.facephi-en/products/idv-suite/flujos-and-integraciones/configuracion-tecnica-del-cliente/solucion-web/no-code-landing.md).

# No-code: Landing

The Landing integration is the technical implementation associated with a No-Code integration. Once the integration is configured and published on the Facephi IDV Suite platform, Landing is the web channel through which the end user executes the verification flow.

The integration model is always **backend to backend**: the client's system generates the session from its server and delivers a single-use access URL to the end user. Facephi IDV Suite manages the experience in full from that moment on.

***

### Prerequisites

To get a Landing integration up and running, you need:

* A **published No-Code integration** on the IDV Suite platform.
* The **Workflow ID**, is obtained from the *Flows*module, by accessing the flow you want to use.
* **Integration ID,** is obtained from the *Integrations*module, by accessing the details of the corresponding integration.
* The **Tenant ID**, visible from the tenant selector at the top of the platform.
* The **API Key** associated with the integration (available in the Set up step of the configuration).
* The **base URL** of the API will be provided by the Facephi Support or Delivery team.

***

### Start a session

The client's backend makes an authenticated call to the IDV Suite API to generate a session. The response includes a single-use access URL (`accessUrl`) that is delivered to the end user so they can complete the flow.

#### Onboarding and Authentication Flow

The integration can involve two stages:

#### 1. Onboarding

A verification session is started by generating a `accessUrl`.

As a result of the process, a unique operation identifier is obtained:

```
"operationId": "<uuid>"
```

***

#### 2. Authentication (optional)

In authentication flows, it is necessary to reuse the result of a previous onboarding.

For this, the `operationId` obtained in onboarding must be sent as `authenticationId`:

```
"authenticationId": "<operationId obtained in onboarding>"
```

> ⚠️ **Important**\
> The `operationId` it should only be used as `authenticationId` if the onboarding process was successfully completed and validated.

#### API call

**Endpoint:**

```
POST https://<base-url>/workflows/{workflowId}/create
```

**Headers:**

```
X-Auth: <API_KEY>
X-Integration-Id: <tenantId>:<integrationId>
Content-Type: application/json
```

**Onboarding Body:**

```json
{
    "payload": {
        "source": "<service-id>",
        "customerId": "<string-client-id>",
        "document": { //optional
            "issuer": "<alpha3-issuer-country-code>",
            "type": "<ID_CARD|PASSPORT|DRIVERS_LICENSE|RESIDENCE_PERMIT>",
            "number": "<document-number>",
            "code": "<document-code> (optional)",
            "gender": "<persona-name> (optional)",
            "name": "<person-name> (optional)",
            "surname": "<person-surname> (optional)"
        }
    },
    "timestamp": 1761228742430,
    "signature": "<firma-HMAC-SHA256>"
}
```

<details>

<summary>Field descriptions (Onboarding)</summary>

| Field                    | Type   | Required      | Values                                                       | Description                 |
| ------------------------ | ------ | ------------- | ------------------------------------------------------------ | --------------------------- |
| payload.source           | string | ✅             | —                                                            | Source service identifier   |
| payload.customerId       | string | ✅             | —                                                            | Unique customer identifier  |
| payload.document         | object | ❌             | —                                                            | User's document information |
| payload.document.issuer  | string | Conditional\* | ISO alpha-3 (e.g., ESP, ARG)                                 | Document country code       |
| payload.document.type    | string | Conditional\* | `ID_CARD`, `PASSPORT`, `DRIVERS_LICENSE`, `RESIDENCE_PERMIT` | Document type               |
| payload.document.number  | string | Conditional\* | —                                                            | Document number             |
| payload.document.code    | string | ❌             | —                                                            | Additional document code    |
| payload.document.gender  | string | ❌             | —                                                            | User gender                 |
| payload.document.name    | string | ❌             | —                                                            | User name                   |
| payload.document.surname | string | ❌             | —                                                            | User surname                |
| timestamp                | number | ✅             | epoch (ms)                                                   | Timestamp in milliseconds   |
| signature                | string | ✅             | HMAC-SHA256                                                  | Payload signature           |

Notes

> ⚠️ **Conditional fields (`payload.document`)**\
> The object `payload.document` is optional.\
> However, if it is included in the request, the following fields become mandatory:
>
> * `issuer`
> * `type`
> * `number`

</details>

**Authentication Body:**

```json
{
    "payload": {
        "source": "<service-id>",
        "customerId": "<string-client-id>",
        "authenticationId": "<string-authentication-id>"
    },
    "timestamp": 1761228742430,
    "signature": "<firma-HMAC-SHA256>"
}
```

<details>

<summary>Field descriptions (Authentication)</summary>

| Field                    | Type   | Required | Values      | Description                                       |
| ------------------------ | ------ | -------- | ----------- | ------------------------------------------------- |
| payload.source           | string | ✅        | —           | Source service identifier                         |
| payload.customerId       | string | ✅        | —           | Unique customer identifier                        |
| payload.authenticationId | string | ✅        | UUID        | `operationId` obtained in a successful onboarding |
| timestamp                | number | ✅        | epoch (ms)  | Timestamp in milliseconds                         |
| signature                | string | ✅        | HMAC-SHA256 | Payload signature                                 |

</details>

{% hint style="info" %}
The fields within payload depend on the flow configured on the platform. Check with Facephi Support which fields are required for your specific use case. In any case, they are optional.
{% endhint %}

#### Request signature

All requests must be signed with **HMAC-SHA256** calculated over `JSON.stringify(payload)`. The result is included in the field `signature` as a hexadecimal string.

Example in TypeScript:

```typescript
import { createHmac } from 'crypto';

function getSignature(payload: object, secret: string): string {
  const hmac = createHmac('sha256', secret);
  hmac.update(JSON.stringify(payload));
  return hmac.digest('hex');
}
```

#### Successful response

```json
{
  "integrationId": "<tenantId>:<integrationId>",
  "workflowId": "<workflowId>",
  "operationId": "<operationId>",
  "accessUrl": "https://<base-url>/<tenantId>:<integrationId>?ref=<token>"
}
```

<details>

<summary>Field descriptions (Response)</summary>

<table><thead><tr><th width="171">Field</th><th>Type</th><th>Values</th><th>Description</th></tr></thead><tbody><tr><td>integrationId</td><td>string</td><td><code>&#x3C;tenantId>:&#x3C;integrationId></code></td><td>Full integration identifier</td></tr><tr><td>workflowId</td><td>string</td><td>UUID</td><td>Identifier of the executed flow</td></tr><tr><td>operationId</td><td>string</td><td>UUID</td><td>Unique operation identifier</td></tr><tr><td>accessUrl</td><td>string</td><td>URL</td><td>Single-use access URL for the user</td></tr></tbody></table>

</details>

#### Important details

The field `accessUrl` contains the single-use access URL for that user. It is the URL to which you should redirect the user or load in the iframe. Each `accessUrl` is **single use** — *the URL validity period is 15 min.*

{% hint style="info" %}
The parameter `ref` included in the `accessUrl` is a token that contains the `operationId` and the `workflowId` needed to resume the operation if the user interrupts the flow.
{% endhint %}

***

### Session behavior

<table><thead><tr><th width="205.45703125">Aspect</th><th>Behavior</th></tr></thead><tbody><tr><td><strong>Duration</strong></td><td>The session has a limited duration. If the user does not complete the flow within that time, the operation expires.</td></tr><tr><td><strong>When the flow is completed</strong></td><td>The user is redirected to the <code>outputUrl</code> configured in the integration (if one was defined).</td></tr><tr><td><strong>Single use</strong></td><td>The <code>accessUrl</code> generated with parameters is single-use. OPTIONAL</td></tr><tr><td><strong>Retry</strong></td><td>If the user needs to resume an interrupted flow, the resume endpoint allows the session to be recovered using the <code>operationId</code>.</td></tr></tbody></table>

***

### Error codes

<table><thead><tr><th width="99.09765625">Code</th><th width="339.671875">Identifier</th><th>Description</th></tr></thead><tbody><tr><td><code>400</code></td><td><code>INVALID_INTEGRATION_WORKFLOW_PARAMS</code></td><td>Invalid or incorrectly formatted parameters. The detail includes the affected field.</td></tr><tr><td><code>403</code></td><td><code>INVALID_INTEGRATION_WORKFLOW_ACCESS</code></td><td>The integration does not allow this access mode.</td></tr><tr><td><code>404</code></td><td><code>WORKFLOW_NOT_FOUND</code></td><td>Flow or integration not found. Check the Integration ID.</td></tr><tr><td><code>404</code></td><td><code>OPERATION_NOT_FOUND</code></td><td>The current operation does not exist or does not correspond to the indicated integration.</td></tr><tr><td><code>422</code></td><td><code>INVALID_INTEGRATION_WORKFLOW_CONFIG</code></td><td>The flow configuration on the platform is not valid. It requires review in the Flow Designer.</td></tr><tr><td><code>429</code></td><td><code>TOO_MANY_REQUESTS</code></td><td>Request limit exceeded.</td></tr><tr><td><code>500</code></td><td><code>UNEXPECTED_ERROR</code></td><td>Internal error. Contact Facephi Support.</td></tr><tr><td><code>500</code></td><td><code>REGION_CONFIGURATION_NOT_FOUND</code></td><td>There is no region configuration for the tenant.</td></tr><tr><td><code>500</code></td><td><code>TRACKING_PLATFORM_NOT_FOUND</code></td><td>There is no tracking platform configuration for the tenant.</td></tr><tr><td><code>500</code></td><td><code>TRACKING_PLATFORM_CONNECTION_ERROR</code></td><td>Connection error with the configured tracking platform.</td></tr></tbody></table>

***

### Do you need more control over the experience?

The Landing integration manages the flow UX entirely. If your use case requires native integration into your website or greater control over the interface, see the section [Web Solution — SDK Web Loader](/docs.facephi-en/products/idv-suite/flujos-and-integraciones/configuracion-tecnica-del-cliente/solucion-web/sdk-loader-idv.md).
