> 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 the end user a single-use access URL. Facephi IDV Suite fully manages the experience 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**, obtained from the *Flows*, by accessing the flow you want to use.
* **Integration ID,** obtained from the *Integrations*, 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 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`) which 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 the onboarding must be sent as `authenticationId`:

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

> ⚠️ **Important**\
> The `operationId` must only be used as `authenticationId` if the onboarding process was completed and successfully 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 | ✅             | —                                                            | Origin service identifier  |
| payload.customerId       | string | ✅             | —                                                            | Unique customer identifier |
| payload.document         | object | ❌             | —                                                            | User 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>

**Onboarding 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 | ✅        | —           | Origin 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 team which fields are needed 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.

TypeScript example:

```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>Executed flow identifier</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. This is the URL you should redirect the user to or load in the iframe. Each `accessUrl` is **single-use** — *the validity time of the URL 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 parameters or incorrect format. 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. Verify 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 the Facephi Support team.</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 fully manages the flow UX. If your use case requires native integration into your website or greater control over the interface, see the [Web Solution — SDK Web Loader](/docs.facephi-en/products/idv-suite/flujos-and-integraciones/configuracion-tecnica-del-cliente/solucion-web/sdk-loader-idv.md).
