# Create a Session
Source: https://documentation.idenfy.com/age-estimation/create-session
Create an age estimation session with the iDenfy Partner API: request auth, token response, and the insufficient funds error to handle.
**Requirements:**
* **API key pair** (API key + secret)
* **Age Estimation** feature enabled on your contract (contact iDenfy to activate)
* **Finances** available for Age Estimation
For how the feature works, what each outcome means, and how billing works, see the [Age Estimation Overview](/guides/dashboard/age-estimation/overview) guide. This documentation focuses on the API integration.
## Create a Session
Authenticate with your **API key pair** — API key as the username, API secret as the password, over HTTP Basic. Sessions are scoped to your partner account, so you only ever see your own.
For the full request and response schemas, every field's constraints and defaults, and an interactive playground, see the [**API Reference**](/api-reference/age-estimation/create-session) page for this endpoint.
Creating a session pre-checks your [Age Estimation finances](/guides/dashboard/age-estimation/billing); if they can't cover the session the request is rejected -- see [Errors](#errors).
### Example (Partner API)
```http theme={"system"}
POST /age-estimation/token/
Authorization: Basic {API_KEY}:{API_SECRET}
Content-Type: application/json
{
"min_age": 18,
"confidence_threshold": 85,
"buffer": 2,
"escalation": "DOC",
"save_photo": true,
"expiry_minutes": 60,
"success_redirect": "https://partner.example.com/ok",
"underage_redirect": "https://partner.example.com/denied",
"webhook_url": "https://partner.example.com/hooks/age",
"client_id": "user-42"
}
```
```json theme={"system"}
{
"token": "b7c1…",
"session_url": "https://capture.idenfy.example/?token=b7c1…",
"expires_at": "2026-07-14T12:00:00+00:00",
"min_age": 18,
"confidence_threshold": 85.0,
"buffer": 2,
"escalation": "DOC",
"retry_limit": 3,
"save_photo": true,
"expiry_minutes": 60,
"client_id": "user-42"
}
```
***
## Errors
| Status | Message | When |
| ------ | -------------------------------------------------------------- | ------------------------------------------------ |
| `402` | `"Action not allowed due to lack of funds or exceeded limit."` | Age Estimation finances cannot cover the session |
The response body identifies which finances are short:
```json theme={"system"}
{
"message": "Action not allowed due to lack of funds or exceeded limit.",
"code": "insufficient_finances",
"detail": {
"detail": "Action not allowed due to lack of funds or exceeded limit.",
"missing_limits": [],
"missing_additional_step_limits": [],
"missing_funds": null,
"missing_pool_funds": [
{ "fund_pool": "AGE_ESTIMATION", "missing": 3.0 }
],
"expired_expenses": []
}
}
```
When handling this response:
* Read `missing_pool_funds` to identify which finances are short. The response uses `fund_pool` naming for what the guides call Age Estimation finances.
* `missing_funds` stays `null` -- it covers general funds only, so **do not** read it to detect exhausted Age Estimation finances.
* `missing` is the shortfall in your account currency, and `0` when no Age Estimation finances are configured.
Insufficient funds return **`402`**, not `403`. This matches iDenfy's other token-creation endpoints -- see [ID Error Messages](/kyc/id-error-messages#post-apiv2token-errors). `403` is reserved for an account that lacks access to the endpoint or feature.
***
## What's Next
Once you have a `session_url`, send the end user to it to complete the selfie capture. When the session finishes, the result is delivered via the [result webhook](/age-estimation/webhooks) — this is the only way to receive it programmatically, so configure one. Past sessions can be listed and inspected by signing in to the dashboard; see [Session List](/guides/dashboard/age-estimation/dashboard#session-list).
# Age Estimation Webhooks
Source: https://documentation.idenfy.com/age-estimation/webhooks
Receive age estimation results via HTTP POST webhook callbacks from iDenfy with signed payloads, per-session URL overrides, and idempotent delivery.
When a session reaches a terminal state, a result notification is sent to your endpoint.
## Where It's Sent
iDenfy resolves the destination in this order:
1. The token's `webhook_url`, if set (per-session override).
2. Otherwise, the webhook URL configured on your account's **Age Estimation** notification (notification event type `AGE_ESTIMATION`) -- this is the default used when a token has no `webhook_url`.
3. If neither is configured, no notification is sent. The result is then only visible in the dashboard -- there is no Partner API endpoint for retrieving sessions, so configure a webhook if you need the result in your own systems.
If your Age Estimation notification is configured with a signing key, the webhook body is signed so you can verify authenticity. See [Callback Signing](/security/callback-signing).
## Payload
For the full payload schema and every field's type, see the [**API Reference**](/api-reference/webhooks/age-estimation-result) page for this webhook.
Only two statuses are ever delivered -- `COMPLETED` and `FAILED`. For what the accompanying `outcome` means, see [Statuses and Outcomes](/guides/dashboard/age-estimation/overview#statuses-and-outcomes).
The `estimatedAge` reported is the established age: when a document step-up produced an age, that exact document age is used; otherwise it is the AI face-estimated age. `scanRef` carries the step-up scan reference, or the token id when there is no scan ref.
The notification does not distinguish a document that was accepted cleanly from one that was accepted but flagged for possible fraud -- both report the same outcome.
## Idempotency
Delivery may be retried, so handle notifications idempotently (e.g. keyed on `scanRef` / `clientId`).
# Create AML Profile
Source: https://documentation.idenfy.com/aml/create-profile
Learn how to run a single AML check against a person or company using the iDenfy API, including request parameters and response handling.
**Requirements**
* **API** key pair
* Services **enabled** on your environment (done by iDenfy staff)
* Credits **for each** service used
## AML Check Flow
For definitions of match types, datasets, and result fields, see [AML Key Terms and Concepts](/guides/dashboard/aml/aml-key-terms-concepts).
## Create AML Check
For full request and response schemas, see the [**API Reference**](/api-reference/aml-checks/create-aml-check).
Use the AML check creation endpoint to screen a person or company. The API will return matched profiles from sanctions, PEPs, and adverse media databases based on your configured filters.
`companyName` accepts up to **200 characters**, matching the limit used for company names in [business verification](/kyb/overview). Longer values are rejected with a validation error.
# AML Dummy Results
Source: https://documentation.idenfy.com/aml/dummy-results
Test your AML screening integration with predefined dummy entities for sanctions, PEPs, and adverse media checks in the iDenfy sandbox environment.
**Requirements**
* **API** key pair
* **Development** environment
* Test **credits**
***
When integrating AML services, you can use the entities below to trigger suspected results:
| Trigger Type | Name/Value to Use |
| ------------- | ----------------- |
| Company | `GoPayments` |
| Person | `Manfred Weber` |
| Adverse Media | `Cliff Hazard` |
The **Development** environment is only meant for **integration** testing. Checking other entities **might not** return results.
# AML Migration Guide
Source: https://documentation.idenfy.com/aml/migration-guide
Migrate your AML Monitoring integration from v2 to v3, with breaking changes, endpoint mapping, and step-by-step upgrade guidance.
## Overview
iDenfy introduced AML Monitoring v3 with an upgraded screening engine. **Existing v2 integrations continue to work** — the API automatically handles backward compatibility and your webhooks will look exactly as they always have.
There is no announced shutdown date for v2 compatibility. However, the mapping layer exists for continuity, not as a permanent solution. We recommend planning migration to v3 to ensure long-term stability and access to the full capabilities of the screening engine.
This guide covers:
* What changed between v2 and v3
* Request body field changes with examples
* The complete webhook payload reference
* The recommended migration path and a complete migration checklist
***
## What Changed
| Event | Status transition |
| -------------------------- | ------------------------------- |
| Initial screening complete | `PENDING` → `ACTIVE` or `ALERT` |
| New match found | → `ALERT` |
| Match resolved | → `ACTIVE` |
### Status Field Names
v3 introduced a new `status` field with updated values. The existing `alertStatus` field continues to return v2 values for all integrations.
| v2 (`alertStatus`) | v3 (`status`) |
| ------------------ | ------------- |
| `ACCEPTED` | `ACTIVE` |
| `ALERT` | `ALERT` |
| `DECLINED` | `STOPPED` |
| `PENDING` | `PENDING` |
Both fields are present in all webhook payloads. If you are on v2, use `alertStatus` and ignore `status`.
### Request Body Fields
When migrating to v3 endpoints, the request body structure changes. v3 uses a nested structure — a top-level object wrapping an `amlCheck` object with separate `input` (who to screen) and `filter` (what to screen for) sub-objects.
**Person monitoring:**
| Area | v2 field | v3 field | Notes |
| ------------- | --------------------------- | ---------------------------- | ------------------------------------ |
| First name | `name` | — | Combined into `fullName` |
| Last name | `surname` | — | Combined into `fullName` |
| Full name | — | `amlCheck.input.fullName` | Single combined field |
| Subject type | `type: "PERSON"` | `userType: "PERSON"` | Renamed |
| Date of birth | `dateOfBirth` | `amlCheck.input.dateOfBirth` | Moved into nested input |
| Nationality | `nationality` | `amlCheck.input.nationality` | Moved into nested input |
| Gender | — | `amlCheck.input.sex` | New optional field: `M`, `F`, or `O` |
| Adverse media | `monitorAdverseMedia: true` | — | Legacy feature, not supported in v3 |
| Auto-renewal | `autoExpirationExtension` | `isSubscribed` | Renamed, same boolean behavior |
**Company monitoring:**
| Area | v2 field | v3 field | Notes |
| ------------ | ----------------- | ---------------------------- | ------------------ |
| Company name | `name` | `amlCheck.input.companyName` | Renamed and nested |
| Subject type | `type: "COMPANY"` | `userType: "COMPANY"` | Renamed |
| Country | `nationality` | `amlCheck.input.country` | Renamed and nested |
The `name` + `surname` → `fullName` change is the most common cause of silent failures. If you send `name` and `surname` separately to a v3 endpoint, the fields are ignored and the check runs with no name.
**Example v3 request body (person):**
```json theme={"system"}
{
"userType": "PERSON",
"isSubscribed": true,
"tags": [],
"amlCheck": {
"input": {
"fullName": "John Doe",
"nationality": "GBR",
"dateOfBirth": "1980-01-15",
"sex": "M"
},
"filter": {
"datasets": ["PEP", "SAN"]
}
}
}
```
### Datasets
v3 lets you control which screening databases to check via the `amlCheck.filter.datasets` array. This replaces the implicit fixed set from v2, where adverse media was a separate boolean toggle.
| Dataset | Description |
| ------------- | --------------------------------------------------------------------- |
| `PEP` | All PEP tiers — shorthand that expands to current, former, and linked |
| `PEP-CURRENT` | Active politically exposed persons |
| `PEP-FORMER` | Former PEPs |
| `PEP-LINKED` | Associates and family members of PEPs |
| `SAN` | All sanctions — shorthand for current and former |
| `SAN-CURRENT` | Active sanctions |
| `SAN-FORMER` | Expired or lifted sanctions |
`datasets` is required. Omitting it will result in a validation error. Specify at least one dataset value from the table above.
### False Positive Handling
v2 and v3 handle false positives differently — there is no direct 1:1 equivalent endpoint.
* **v2** (`POST /api/v2/add-whitelist`) marked an entire monitoring subject as whitelisted using their `monitoringId`.
* **v3** (`DELETE /aml/monitorings/{id}/profiles/{profileId}/`) removes a specific matched profile from the results, leaving the monitoring record and any other matches intact.
The v3 approach is more granular — you dismiss individual matches rather than the whole subject. The `profileId` is returned inside each match entry in the monitoring response and webhook payload. Store or pass through this ID in your integration to support false positive dismissal.
***
## Webhook Reference
Both v2 and v3 send the same webhook payload structure. v3 adds the `status` field and an optional `amlCheck` object — both can be safely ignored if you have not yet migrated.
### Headers
| Header | Value |
| ------------------- | ------------------------------------------------------------------- |
| `Idenfy-Event-Type` | `AML_MONITORING` |
| `Content-Type` | `application/json; charset=utf-8` |
| `User-Agent` | `iDenfy/1.0` |
| `Idenfy-Signature` | HMAC-SHA256 signature — only present if a signing key is configured |
### Payload Fields
If you are on v3, use the `amlCheck` object from the webhook payload for all screening results. The top-level fields below exist only for backward compatibility with v2 integrations and should not be relied on in new or migrated integrations.
**Top-level (v2 compatibility fields):**
| Field | Type | Description |
| -------------------- | -------------- | ---------------------------------------------------------- |
| `monitoringId` | string (UUID) | Unique identifier for this monitoring record |
| `name` / `surname` | string | Subject's name |
| `nationality` | string | ISO country code |
| `dob` | string \| null | Date of birth |
| `isActive` | boolean | Whether monitoring is still running |
| `expiration` | string | Monitoring expiry date |
| `alertStatus` | string | v2 status: `ACCEPTED`, `ALERT`, `DECLINED`, `PENDING` |
| `status` | string | v3 status: `ACTIVE`, `ALERT`, `STOPPED`, `PENDING` |
| `pepsStatus` | string | `NOT_CHECKED`, `FLAGS_FOUND`, `FALSE_POSITIVE`, or `CLEAR` |
| `sanctionsStatus` | string | Same values as `pepsStatus` |
| `adverseMediaStatus` | string | Same values as `pepsStatus` |
| `results[]` | array | Per-category check results (see below) |
**`amlCheck` — v3 screening results (use this on v3):**
The `amlCheck` array contains the full World-Check screening output, with one entry per matched profile and a `datasets` list on each. Every entry carries a `resourceId`, which you pass as the `profileId` path parameter to retrieve the profile or dismiss it as a false positive. Refer to the [API Reference](/api-reference/aml-checks/create-aml-check) for the complete schema.
**`results[]` — v2 compatibility, per-category check:**
| Field | Type | Description |
| ---------------------- | ------ | ---------------------------------------- |
| `serviceName` | string | Name of the check that ran |
| `serviceGroupType` | string | Category, e.g. `AML_NAMES_CHECK` |
| `status.overallStatus` | string | `SUSPECTED`, `NOT_SUSPECTED`, or `ERROR` |
| `data[]` | array | Matched profiles (see below) |
**`data[]` — matched profile:**
| Field | Type | Description |
| ------------------ | -------------- | ------------------------------------------------ |
| `listName` | string | `PEPS` or `SANCTION` |
| `name` / `surname` | string | Matched entity's name |
| `nationality` | string | Matched entity's nationality |
| `dob` | string \| null | Matched entity's date of birth |
| `score` | integer | Match confidence (0–100) |
| `pepLevel` | integer | PEP tier 1–4 (present for PEP matches only) |
| `category` | string | e.g. `Head of Government` |
| `reason` | string | Why this entity is listed |
| `whitelisted` | boolean | Whether you have marked this as a false positive |
| `isActive` | boolean | Whether the entity is still active on the list |
***
## Migrating to v3
### AML Single Check Flow
Use `POST /aml/checks/` to screen a subject once without ongoing monitoring.
Submit a person or company for screening. The response includes a check ID and any matched profiles.
`POST /aml/checks/` — Screen a subject against sanctions, PEPs, and adverse media.
Matches are returned in the `amlCheck` and `adverseMedia` arrays. Each entry contains a `resourceId` you can use in the next step.
Use the check `id` and the match's `resourceId` from the previous response to fetch the complete profile record — all sanctions entries, PEP tiers, and adverse media sources, regardless of the filters applied during the check.
`GET /aml/checks/{id}/profiles/{profileId}/` — Fetch full profile detail for a specific match.
Profile data is not filtered by the check's configured datasets. Retrieve the full profile to see all available information for a matched entity.
***
### AML Monitoring Flow
Monitoring is continuous screening — the system re-screens the entity daily and sends webhooks whenever status changes.
Register a person or company for ongoing daily screening. The response returns a `monitoringId` used in all subsequent calls.
`POST /aml/monitorings/` — Start ongoing screening with automatic status change alerts.
Use `PATCH /aml/monitorings/{id}/` to extend the monitoring period or attach organizational tags.
The system fires an `AML_MONITORING` webhook each time the screening status changes. See the [Webhook Reference](#webhook-reference) above for the full payload and delivery details.
Poll the monitoring record at any time to get the current status and latest results — useful for reconciling state if a webhook was missed.
`GET /aml/monitorings/{id}/` — Fetch a single monitoring record.
`GET /aml/monitorings/` — List all monitoring records.
Pause, resume, or remove monitoring records as your compliance requirements change.
`POST /aml/monitorings/{id}/stop/` or `/start/` — Pause or resume without deleting.
`DELETE /aml/monitorings/{id}/` — Permanently remove a monitoring record.
To dismiss a specific false positive match without stopping monitoring, use `DELETE /aml/monitorings/{id}/profiles/{profileId}/`. See [False Positive Handling](#false-positive-handling) above for details.
Export the full screening history for a monitoring record as a PDF for audit trails and compliance records.
`POST /aml/monitorings/{id}/pdf/` — Download a full-history PDF report.
***
## Complete Migration Checklist
Use this as a final review before cutting over to v3.
**API endpoints:**
| v2 endpoint | v3 endpoint |
| -------------------------------------- | ------------------------------------------------------------------------------ |
| `POST /api/v2/add-aml-user` | `POST /aml/monitorings/` |
| `POST /api/v2/get-monitoring-callback` | `GET /aml/monitorings/{id}/` |
| `POST /api/v2/get-aml-users` | `GET /aml/monitorings/` |
| `POST /api/v2/delete-monitoring-user/` | `DELETE /aml/monitorings/{id}/` |
| `POST /api/v2/generate-pdf-aml` | `POST /aml/monitorings/{id}/pdf/` |
| `POST /api/v2/add-whitelist` | No direct equivalent — see [False Positive Handling](#false-positive-handling) |
**Request body — persons:**
* Combine `name` + `surname` → `amlCheck.input.fullName`
* Rename `type: "PERSON"` → `userType: "PERSON"`
* Move `nationality` → `amlCheck.input.nationality`
* Move `dateOfBirth` → `amlCheck.input.dateOfBirth`
* Remove `monitorAdverseMedia` — adverse media is not supported in v3
* Rename `autoExpirationExtension` → `isSubscribed`
**Request body — companies:**
* Rename `name` → `amlCheck.input.companyName`
* Rename `type: "COMPANY"` → `userType: "COMPANY"`
* Rename `nationality` → `amlCheck.input.country`
**Webhook handler:**
* Read `status` instead of (or alongside) `alertStatus`
* Update status value comparisons: `ACCEPTED` → `ACTIVE`, `DECLINED` → `STOPPED`
* Store `profileId` from match entries if you support false positive dismissal
Existing monitoring records created via v2 remain accessible. v2 and v3 records coexist in the system — your historical data is not affected by migration.
# Create Monitoring
Source: https://documentation.idenfy.com/aml/monitoring-create
Set up ongoing AML monitoring for a person or company via the iDenfy API with automatic daily screening, alerts, and change notifications.
## Create Monitoring
Set up ongoing AML monitoring for a person or company. Once created, the system will automatically screen the entity on a daily basis and notify you of any changes.
For full request and response schemas, see the [**API Reference**](/api-reference/aml-monitorings/create-aml-monitoring).
***
## Update Monitoring
The PATCH method allows you to add a **monitoring extension** (yearly) and add **tags** for better sorting.
Use the update endpoint to extend monitoring periods or add organizational tags to existing monitoring entries.
For full request and response schemas for the update operation, see the [**API Reference**](/api-reference/aml-monitorings/partially-update-aml-monitoring).
# Manage Monitoring
Source: https://documentation.idenfy.com/aml/monitoring-manage
Update, pause, or deactivate AML monitoring profiles via the iDenfy API to manage ongoing customer due diligence and compliance screening.
## Delete Monitoring
Remove a monitored entity from ongoing AML screening. Once deleted, daily checks will no longer be performed for this profile.
For full request and response schemas, see the [**API Reference**](/api-reference/aml-monitorings/delete-aml-monitoring).
***
## Start and Stop Monitoring
Pause or resume ongoing monitoring for a specific entity without deleting the monitoring profile entirely.
For full request and response schemas, see the [**API Reference**](/api-reference/aml-monitorings/startstop-aml-monitoring).
# Monitoring PDF
Source: https://documentation.idenfy.com/aml/monitoring-pdf
Generate downloadable PDF reports for AML monitoring entries via the iDenfy API for compliance audits and record-keeping purposes.
## Generate Monitoring PDF Report
Generate a downloadable PDF report for an AML monitoring entry. This report includes the full history of screening results and is useful for compliance record-keeping and audit purposes.
For full request and response schemas, see the [**API Reference**](/api-reference/aml-monitorings/generate-aml-monitoring-pdf).
# Retrieve Monitoring
Source: https://documentation.idenfy.com/aml/monitoring-retrieve
Retrieve AML monitoring results, screening alerts, and compliance status for individual or all monitored entities via the iDenfy API endpoints.
## Retrieve Single User
Retrieve the monitoring status and results for a specific monitored entity.
For full request and response schemas, see the [**API Reference**](/api-reference/aml-monitorings/retrieve-aml-monitoring).
***
## Retrieve All Users
List all entities currently under AML monitoring, including their current status and latest screening results.
For full request and response schemas, see the [**API Reference**](/api-reference/aml-monitorings/list-aml-monitorings).
# AML Screening API
Source: https://documentation.idenfy.com/aml/overview
Use iDenfy's AML Screening API to run sanctions, PEP, and adverse media checks against customers with single checks and ongoing monitoring.
**AML v2 compatibility is maintained but not permanent.** v2 integrations continue to work while you plan migration. For long-term stability, we recommend moving to v3 endpoints. See the [Migration Guide](/aml/migration-guide) for what to change.
The AML Screening API lets you run sanctions, PEP, and adverse media checks against persons and companies, and set up ongoing monitoring with automated daily alerts.
## Authentication
All AML endpoints use HTTP Basic Authentication with your API key pair:
```
Authorization: Basic {base64(apiKey:apiSecret)}
```
## Available Operations
| Operation | Description |
| ---------------- | --------------------------------------------------------- |
| **Single Check** | Run a one-time AML check on a person or company. |
| **Monitoring** | Enroll a subject for ongoing daily screening with alerts. |
| **PDF Reports** | Generate compliance-ready PDF reports from check results. |
## Next Steps
Screen a person or company against sanctions, PEPs, and adverse media.
Enable ongoing screening with automatic alerts.
Get screening results and match details.
Step-by-step dashboard guide for AML.
# Retrieve AML Profile
Source: https://documentation.idenfy.com/aml/retrieve-profile
Retrieve AML screening results and matched profiles for a completed check via the iDenfy API, including sanctions and PEP hit details.
**Requirements**
* **API** key pair
* A previous [AML check](/aml/create-profile) that returned profiles
## AML Check Flow — Retrieve Profile
For definitions of match types, datasets, and result fields, see [AML Key Terms and Concepts](/guides/dashboard/aml/aml-key-terms-concepts).
Information inside profiles is not filtered by check filters. Profile information will contain all conditions and data regardless of the filters applied during the check.
## Retrieve Profile
For full request and response schemas, see the [**API Reference**](/api-reference/aml-checks/retrieve-aml-check-profile).
Use the profile retrieval endpoint to get detailed information about a matched AML profile, including all associated sanctions, PEP entries, and adverse media records.
```
GET https://ivs.idenfy.com/aml/checks/{id}/profiles/{profileId}/
Authorization: Basic {base64(apiKey:apiSecret)}
```
### Path Parameters
| Parameter | Description |
| ----------- | ---------------------------------------------------------------------------------------- |
| `id` | UUID of the AML check — the `id` returned by [`POST /aml/checks/`](/aml/create-profile). |
| `profileId` | The `resourceId` of the match you want to expand, taken from the check response. |
Every match in the check response carries its own `resourceId`:
```json theme={"system"}
{
"id": "0a1b2c3d-4e5f-6789-abcd-ef0123456789",
"userType": "PERSON",
"amlCheck": [
{
"resourceId": "1a2b3c4d5e6f7890",
"name": "Manfred Weber",
"score": 92,
"datasets": ["SAN_CURRENT", "PEP_CURRENT"]
}
]
}
```
Treat `resourceId` as an opaque string and copy it verbatim — do not parse or construct it. Matches also appear in the `adverseMedia` array, and those `resourceId` values work the same way.
### Response
The response shape depends on the `userType` of the original check: a person check returns an individual profile, a company check returns a business profile. Both share the following fields.
| Field | Description |
| ------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------- |
| `resourceId` | Identifier of this profile. Also used to [generate a profile PDF](/api-reference/aml-checks/generate-aml-check-profile-pdf). |
| `version` | Increments whenever iDenfy's research team edits the profile. |
| `isDeleted` / `deletionReason` | Whether the profile was withdrawn from the database, and why. |
| `datasets` | Datasets this profile belongs to, e.g. `SAN_CURRENT`, `PEP_FORMER`, `RRE`. |
| `sanEntries` | Sanctions, split into `current` and `former`. |
| `pepEntries` | PEP listings, split into `current` and `former`, with the overall `pepTier`. |
| `rreEntries` | Adverse media — Reputational Risk Exposure. |
| `relEntries` | Regulatory enforcement actions. |
| `poiEntries` / `insEntries` / `griEntries` | Profiles of Interest, Insolvency Register, and Gambling Risk Intelligence entries. |
| `evidences` | Source documents and articles behind the entries. |
| `individualLinks` / `businessLinks` | Related people and companies connected to this profile. |
Individual profiles add `firstName`, `lastName`, `datesOfBirth`, `nationalities`, `isDeceased`, `ddEntries` (Disqualified Directors), and `pepByAssociationEntries`. Business profiles add `name`, `businessTypes`, `activities`, and `soeEntry` (State-Owned Enterprise).
Store `version` alongside your review decision. A changed `version` means the underlying record was updated and the match may need re-review, even if nothing about your own check has changed.
## Next Steps
Generate a compliance-ready PDF for a single matched profile.
Enroll the subject for daily re-screening with alerts.
# AML Single PDF
Source: https://documentation.idenfy.com/aml/single-pdf
Generate downloadable PDF reports for single AML screening checks via the iDenfy API for compliance documentation and audit trails.
## Generate PDF Report
Generate a downloadable PDF report for a single AML check profile. This is useful for compliance record-keeping and audit purposes.
For full request and response schemas, see the [**API Reference**](/api-reference/aml-checks/generate-aml-check-pdf).
# Create session
Source: https://documentation.idenfy.com/api-reference/age-estimation/create-session
/openapi/age-estimation.yaml post /age-estimation/token/
Creates an age estimation session. Your Age Estimation finances are pre-checked; insufficient finances reject the request with `402`.
# Create AML check
Source: https://documentation.idenfy.com/api-reference/aml-checks/create-aml-check
/openapi/aml.yaml post /aml/checks/
# Generate AML check PDF
Source: https://documentation.idenfy.com/api-reference/aml-checks/generate-aml-check-pdf
/openapi/aml.yaml post /aml/checks/{id}/pdf/
# Generate AML check profile PDF
Source: https://documentation.idenfy.com/api-reference/aml-checks/generate-aml-check-profile-pdf
/openapi/aml.yaml post /aml/checks/{id}/profiles/{profileId}/pdf/
# Retrieve AML check profile
Source: https://documentation.idenfy.com/api-reference/aml-checks/retrieve-aml-check-profile
/openapi/aml.yaml get /aml/checks/{id}/profiles/{profileId}/
# Create AML monitoring
Source: https://documentation.idenfy.com/api-reference/aml-monitorings/create-aml-monitoring
/openapi/aml.yaml post /aml/monitorings/
# Delete AML check profile
Source: https://documentation.idenfy.com/api-reference/aml-monitorings/delete-aml-check-profile
/openapi/aml.yaml delete /aml/monitorings/{id}/profiles/{profileId}/
# Delete AML monitoring
Source: https://documentation.idenfy.com/api-reference/aml-monitorings/delete-aml-monitoring
/openapi/aml.yaml delete /aml/monitorings/{id}/
# Generate AML Monitoring PDF
Source: https://documentation.idenfy.com/api-reference/aml-monitorings/generate-aml-monitoring-pdf
/openapi/aml.yaml post /aml/monitorings/{id}/pdf/
# List AML monitorings
Source: https://documentation.idenfy.com/api-reference/aml-monitorings/list-aml-monitorings
/openapi/aml.yaml get /aml/monitorings/
# Partially update AML monitoring
Source: https://documentation.idenfy.com/api-reference/aml-monitorings/partially-update-aml-monitoring
/openapi/aml.yaml patch /aml/monitorings/{id}/
# Retrieve AML monitoring
Source: https://documentation.idenfy.com/api-reference/aml-monitorings/retrieve-aml-monitoring
/openapi/aml.yaml get /aml/monitorings/{id}/
# Start/Stop AML monitoring
Source: https://documentation.idenfy.com/api-reference/aml-monitorings/startstop-aml-monitoring
/openapi/aml.yaml post /aml/monitorings/{id}/{action}/
# Create session
Source: https://documentation.idenfy.com/api-reference/bank-card-verification/create-session
/openapi/bank-card.yaml post /bank-card/tokens/
Creates a standalone bank card verification session. Your finances are pre-checked; insufficient finances reject the request with `402`.
# Generate bank verification token
Source: https://documentation.idenfy.com/api-reference/bank/generate-bank-verification-token
/openapi/bank.yaml post /bank/tokens/
# List bank verification account transactions
Source: https://documentation.idenfy.com/api-reference/bank/list-bank-verification-account-transactions
/openapi/bank.yaml get /bank/verifications/{verificationId}/accounts/{accountId}/transactions/
# Add new beneficiary
Source: https://documentation.idenfy.com/api-reference/beneficiaries/add-new-beneficiary
/openapi/kyb.yaml post /kyb/forms/{companyId}/beneficiaries/
# Delete beneficiary
Source: https://documentation.idenfy.com/api-reference/beneficiaries/delete-beneficiary
/openapi/kyb.yaml delete /kyb/forms/{companyId}/beneficiaries/{id}/
# List beneficiaries
Source: https://documentation.idenfy.com/api-reference/beneficiaries/list-beneficiaries
/openapi/kyb.yaml get /kyb/forms/{companyId}/beneficiaries/
# Partially update beneficiary
Source: https://documentation.idenfy.com/api-reference/beneficiaries/partially-update-beneficiary
/openapi/kyb.yaml patch /kyb/forms/{companyId}/beneficiaries/{id}/
# Retrieve beneficiary
Source: https://documentation.idenfy.com/api-reference/beneficiaries/retrieve-beneficiary
/openapi/kyb.yaml get /kyb/forms/{companyId}/beneficiaries/{id}/
# Update beneficiary
Source: https://documentation.idenfy.com/api-reference/beneficiaries/update-beneficiary
/openapi/kyb.yaml put /kyb/forms/{companyId}/beneficiaries/{id}/
# Change company status
Source: https://documentation.idenfy.com/api-reference/companies/change-company-status
/openapi/kyb.yaml post /kyb/companies/{id}/change-status/
Note that the status cannot be changed from `PENDING` and `PROCESSING` statuses.
# Delete company
Source: https://documentation.idenfy.com/api-reference/companies/delete-company
/openapi/kyb.yaml delete /kyb/companies/{id}/
# Generate company PDF
Source: https://documentation.idenfy.com/api-reference/companies/generate-company-pdf
/openapi/kyb.yaml post /kyb/companies/{id}/pdf/
# List companies
Source: https://documentation.idenfy.com/api-reference/companies/list-companies
/openapi/kyb.yaml get /kyb/companies/
# Re-run company automation
Source: https://documentation.idenfy.com/api-reference/companies/re-run-company-automation
/openapi/kyb.yaml post /kyb/companies/{id}/automation/
# Retrieve all company info
Source: https://documentation.idenfy.com/api-reference/companies/retrieve-all-company-info
/openapi/kyb.yaml get /kyb/companies/{id}/
# List sessions
Source: https://documentation.idenfy.com/api-reference/face-auth-sessions/list-sessions
/openapi/face-authentication.yaml get /api/v2/facial-authentication-sessions/
# Retrieve session
Source: https://documentation.idenfy.com/api-reference/face-auth-sessions/retrieve-session
/openapi/face-authentication.yaml get /api/v2/facial-authentication-sessions/{tokenString}/
# List GOV ordered documents
Source: https://documentation.idenfy.com/api-reference/gov-orders/list-gov-ordered-documents
/openapi/kyb.yaml get /api/v2/gov-ordered-documents/
# Order GOV document
Source: https://documentation.idenfy.com/api-reference/gov-orders/order-gov-document
/openapi/kyb.yaml post /api/v2/gov-ordered-documents/document-order/
# Retrieve available documents to order
Source: https://documentation.idenfy.com/api-reference/gov-orders/retrieve-available-documents-to-order
/openapi/kyb.yaml get /api/v2/gov-ordered-documents/available-documents/
# Retrieve GOV ordered document
Source: https://documentation.idenfy.com/api-reference/gov-orders/retrieve-gov-ordered-document
/openapi/kyb.yaml get /api/v2/gov-ordered-documents/{id}/
# Add new beneficiary document
Source: https://documentation.idenfy.com/api-reference/kyb-documents/add-new-beneficiary-document
/openapi/kyb.yaml post /kyb/forms/{companyId}/beneficiaries/{beneficiaryId}/documents/
# Add new document
Source: https://documentation.idenfy.com/api-reference/kyb-documents/add-new-document
/openapi/kyb.yaml post /kyb/forms/{companyId}/documents/
# Delete beneficiary document
Source: https://documentation.idenfy.com/api-reference/kyb-documents/delete-beneficiary-document
/openapi/kyb.yaml delete /kyb/forms/{companyId}/beneficiaries/{beneficiaryId}/documents/{id}/
# Delete document
Source: https://documentation.idenfy.com/api-reference/kyb-documents/delete-document
/openapi/kyb.yaml delete /kyb/forms/{companyId}/documents/{id}/
# List beneficiary documents
Source: https://documentation.idenfy.com/api-reference/kyb-documents/list-beneficiary-documents
/openapi/kyb.yaml get /kyb/forms/{companyId}/beneficiaries/{beneficiaryId}/documents/
# List documents
Source: https://documentation.idenfy.com/api-reference/kyb-documents/list-documents
/openapi/kyb.yaml get /kyb/forms/{companyId}/documents/
# Partially update beneficiary document
Source: https://documentation.idenfy.com/api-reference/kyb-documents/partially-update-beneficiary-document
/openapi/kyb.yaml patch /kyb/forms/{companyId}/beneficiaries/{beneficiaryId}/documents/{id}/
# Partially update document
Source: https://documentation.idenfy.com/api-reference/kyb-documents/partially-update-document
/openapi/kyb.yaml patch /kyb/forms/{companyId}/documents/{id}/
# Retrieve beneficiary document
Source: https://documentation.idenfy.com/api-reference/kyb-documents/retrieve-beneficiary-document
/openapi/kyb.yaml get /kyb/forms/{companyId}/beneficiaries/{beneficiaryId}/documents/{id}/
# Retrieve document
Source: https://documentation.idenfy.com/api-reference/kyb-documents/retrieve-document
/openapi/kyb.yaml get /kyb/forms/{companyId}/documents/{id}/
# Update beneficiary document
Source: https://documentation.idenfy.com/api-reference/kyb-documents/update-beneficiary-document
/openapi/kyb.yaml put /kyb/forms/{companyId}/beneficiaries/{beneficiaryId}/documents/{id}/
# Update document
Source: https://documentation.idenfy.com/api-reference/kyb-documents/update-document
/openapi/kyb.yaml put /kyb/forms/{companyId}/documents/{id}/
# Create new KYB form
Source: https://documentation.idenfy.com/api-reference/kyb-forms/create-new-kyb-form
/openapi/kyb.yaml post /kyb/forms/
# List KYB forms
Source: https://documentation.idenfy.com/api-reference/kyb-forms/list-kyb-forms
/openapi/kyb.yaml get /kyb/forms/
List KYB forms associated with KYB token. There can be *one* or *zero* items in the list, indicating that the KYB form *was* or *was not* created.
# Partially update KYB form info
Source: https://documentation.idenfy.com/api-reference/kyb-forms/partially-update-kyb-form-info
/openapi/kyb.yaml patch /kyb/forms/{id}/
# Retrieve KYB form info
Source: https://documentation.idenfy.com/api-reference/kyb-forms/retrieve-kyb-form-info
/openapi/kyb.yaml get /kyb/forms/{id}/
# Submit KYB form
Source: https://documentation.idenfy.com/api-reference/kyb-forms/submit-kyb-form
/openapi/kyb.yaml post /kyb/forms/{id}/submit/
Submit a filled KYB form for review.
The form will be submitted and you will not be able to edit this KYB form any further
unless additional information will be requested during a manual review.
After submission, automatic blacklist and automation processes are executed.
Then this KYB form will be reviewed by humans.
After manual review, you may receive a webhook callback.
# Update KYB form info
Source: https://documentation.idenfy.com/api-reference/kyb-forms/update-kyb-form-info
/openapi/kyb.yaml put /kyb/forms/{id}/
# Delete questionnaire answers
Source: https://documentation.idenfy.com/api-reference/kyb-questionnaires/delete-questionnaire-answers
/openapi/kyb.yaml delete /kyb/forms/{companyId}/questionnaires/{id}/answers/
# List questionnaires
Source: https://documentation.idenfy.com/api-reference/kyb-questionnaires/list-questionnaires
/openapi/kyb.yaml get /kyb/forms/{companyId}/questionnaires/
# Retrieve all questionnaires' answers
Source: https://documentation.idenfy.com/api-reference/kyb-questionnaires/retrieve-all-questionnaires-answers
/openapi/kyb.yaml get /kyb/forms/{companyId}/questionnaires/answers/detail/
# Retrieve questionnaire
Source: https://documentation.idenfy.com/api-reference/kyb-questionnaires/retrieve-questionnaire
/openapi/kyb.yaml get /kyb/forms/{companyId}/questionnaires/{id}/
# Retrieve questionnaire answers
Source: https://documentation.idenfy.com/api-reference/kyb-questionnaires/retrieve-questionnaire-answers
/openapi/kyb.yaml get /kyb/forms/{companyId}/questionnaires/{id}/answers/
# Update questionnaire answers
Source: https://documentation.idenfy.com/api-reference/kyb-questionnaires/update-questionnaire-answers
/openapi/kyb.yaml put /kyb/forms/{companyId}/questionnaires/{id}/answers/
# Generate KYB form token
Source: https://documentation.idenfy.com/api-reference/kyb-token/generate-kyb-form-token
/openapi/kyb.yaml post /kyb/tokens/
# Partially update KYB form token
Source: https://documentation.idenfy.com/api-reference/kyb-token/partially-update-kyb-form-token
/openapi/kyb.yaml patch /kyb/tokens/{tokenString}/
# Retrieve KYB session info
Source: https://documentation.idenfy.com/api-reference/kyb-token/retrieve-kyb-session-info
/openapi/kyb.yaml get /kyb/info/
Various info for KYB session.
# Update KYB form token
Source: https://documentation.idenfy.com/api-reference/kyb-token/update-kyb-form-token
/openapi/kyb.yaml put /kyb/tokens/{tokenString}/
# Add identification to blocklist
Source: https://documentation.idenfy.com/api-reference/kyc-blocklist/add-identification-to-blocklist
/openapi/kyc.yaml post /kyc/identifications/{scanRef}/blocklists/{blocklistSource}/
# Remove identification from blocklist
Source: https://documentation.idenfy.com/api-reference/kyc-blocklist/remove-identification-from-blocklist
/openapi/kyc.yaml delete /kyc/identifications/{scanRef}/blocklists/{blocklistSource}/
# Generate KYC token
Source: https://documentation.idenfy.com/api-reference/kyc-token/generate-kyc-token
/openapi/kyc.yaml post /api/v2/token
Creates a KYC verification session token. Pass the returned `authToken` to your frontend or SDK to launch the verification flow.
# List identifications
Source: https://documentation.idenfy.com/api-reference/kyc-verifications/list-identifications
/openapi/kyc.yaml get /kyc/identifications/
# Request additional information from client
Source: https://documentation.idenfy.com/api-reference/kyc-verifications/request-additional-information-from-client
/openapi/kyc.yaml post /kyc/identifications/{scanRef}/request-information/
# API Reference
Source: https://documentation.idenfy.com/api-reference/overview
Browse interactive API documentation for all iDenfy endpoints including KYC, KYB, AML, and bank verification with a built-in playground.
## Interactive API Playground
All endpoints are documented with request/response schemas and an interactive playground. Use the **sidebar** to navigate between API sections:
* **Identity Verification** — session creation, status retrieval, webhooks
* **Business Verification** — company management, document ordering, registry checks
* **AML Screening** — single checks, monitoring, PDF reports
* **Bank Verification** — token creation, account transactions
## Authentication
All endpoints require **HTTP Basic Auth** with your API key and secret:
```bash theme={"system"}
curl -X POST https://ivs.idenfy.com/api/v2/token \
-u "API_KEY:API_SECRET" \
-H "Content-Type: application/json" \
-d '{"clientId": "user-123"}'
```
See [Authentication](/authentication) for details.
## Base URL
```
https://ivs.idenfy.com
```
Same URL for sandbox and production — your API key determines the mode. See [Environments](/environments).
## Integration Guides
For step-by-step integration instructions (not just endpoint reference), see:
| Product | Guide |
| --------------------------- | ---------------------------------------------- |
| ID Verification (KYC) | [KYC Overview →](/kyc/overview) |
| Business Verification (KYB) | [KYB Overview →](/kyb/overview) |
| AML Screening | [AML Overview →](/aml/overview) |
| Bank Verification | [Bank Overview →](/bank-verification/overview) |
# Create POA check
Source: https://documentation.idenfy.com/api-reference/poa/create-poa-check
/openapi/kyc.yaml post /api/v2/poa-checks/
# Create registry center check
Source: https://documentation.idenfy.com/api-reference/registry-center-checks/create-registry-center-check
/openapi/kyb.yaml post /api/v2/registry-center-checks/
# List registry center checks
Source: https://documentation.idenfy.com/api-reference/registry-center-checks/list-registry-center-checks
/openapi/kyb.yaml get /api/v2/registry-center-checks/
# List SOS filing documents
Source: https://documentation.idenfy.com/api-reference/sos-reports/list-sos-filing-documents
/openapi/kyb.yaml get /api/v2/sos-filing-documents/
# Order SOS filing document
Source: https://documentation.idenfy.com/api-reference/sos-reports/order-sos-filing-document
/openapi/kyb.yaml post /api/v2/sos-filing-documents/
# Retrieve SOS filing document
Source: https://documentation.idenfy.com/api-reference/sos-reports/retrieve-sos-filing-document
/openapi/kyb.yaml get /api/v2/sos-filing-documents/{id}/
# Account check
Source: https://documentation.idenfy.com/api-reference/webhooks/account-check
/openapi/bank.yaml webhook accountCheck
This notification is sent when an account social media check is completed.
# Age estimation result
Source: https://documentation.idenfy.com/api-reference/webhooks/age-estimation-result
/openapi/age-estimation.yaml webhook ageEstimationResult
This notification is sent when an age estimation session reaches a terminal state (either the estimate resolved, or a document step-up concluded).
# Aml monitoring
Source: https://documentation.idenfy.com/api-reference/webhooks/aml-monitoring
/openapi/aml.yaml webhook amlMonitoring
This notification is sent when an AML monitoring user is checked, accepted or declined.
# Aml monitoring expiration
Source: https://documentation.idenfy.com/api-reference/webhooks/aml-monitoring-expiration
/openapi/aml.yaml webhook amlMonitoringExpiration
This notification is sent when an AML monitoring user is nearing expiration or expires.
# Bank card verification completed
Source: https://documentation.idenfy.com/api-reference/webhooks/bank-card-verification-completed
/openapi/bank-card.yaml webhook bankCardVerificationCompleted
This notification is sent when a bank card verification is completed.
# Bank verification
Source: https://documentation.idenfy.com/api-reference/webhooks/bank-verification
/openapi/bank.yaml webhook bankVerification
This notification is sent when a bank verification is completed.
# Company aml review
Source: https://documentation.idenfy.com/api-reference/webhooks/company-aml-review
/openapi/kyb.yaml webhook companyAmlReview
This notification is sent when an AML review status is manually updated for a company or it's beneficiaries.
# Company delete
Source: https://documentation.idenfy.com/api-reference/webhooks/company-delete
/openapi/kyb.yaml webhook companyDelete
This notification is sent when a company is deleted.
# Company expiration
Source: https://documentation.idenfy.com/api-reference/webhooks/company-expiration
/openapi/kyb.yaml webhook companyExpiration
This notification is sent when a company verification is nearing expiration or expires.
# Company info request
Source: https://documentation.idenfy.com/api-reference/webhooks/company-info-request
/openapi/kyb.yaml webhook companyInfoRequest
This notification is sent when additional company info is requested and when the company form token expires.
# Company review
Source: https://documentation.idenfy.com/api-reference/webhooks/company-review
/openapi/kyb.yaml webhook companyReview
This notification is sent when a company verification is completed.
# Company submit
Source: https://documentation.idenfy.com/api-reference/webhooks/company-submit
/openapi/kyb.yaml webhook companySubmit
This notification is sent when company information is submitted.
# Document expiration
Source: https://documentation.idenfy.com/api-reference/webhooks/document-expiration
/openapi/kyc.yaml webhook documentExpiration
This notification is sent when a client's identity verification document is nearing expiration or expires
# Facial authentication
Source: https://documentation.idenfy.com/api-reference/webhooks/facial-authentication
/openapi/face-authentication.yaml webhook facialAuthentication
This notification is sent when client's facial authentication session ends, either by success, failure or expiration.
# Gov ordered document
Source: https://documentation.idenfy.com/api-reference/webhooks/gov-ordered-document
/openapi/kyb.yaml webhook govOrderedDocument
This notification is sent when a gov registers document, which was ordered using the API, is delivered.
# Identification
Source: https://documentation.idenfy.com/api-reference/webhooks/identification
/openapi/kyc.yaml webhook identification
This notification is sent when a client completes an identity verification. Legacy, use `ID_VERIFICATION_AUTO_FINISHED`, `ID_VERIFICATION_MANUAL_FINISHED`, `ID_VERIFICATION_EXPIRED` and `ID_VERIFICATION_CANCELLED` instead.
# Identification auto finished
Source: https://documentation.idenfy.com/api-reference/webhooks/identification-auto-finished
/openapi/kyc.yaml webhook identificationAutoFinished
This notification is sent when an identity verification is completed.
# Identification cancelled
Source: https://documentation.idenfy.com/api-reference/webhooks/identification-cancelled
/openapi/kyc.yaml webhook identificationCancelled
This notification is sent when an identity verification is cancelled by the user or the system.
# Identification expired
Source: https://documentation.idenfy.com/api-reference/webhooks/identification-expired
/openapi/kyc.yaml webhook identificationExpired
This notification is sent when an identity verification expires.
# Identification manual finished
Source: https://documentation.idenfy.com/api-reference/webhooks/identification-manual-finished
/openapi/kyc.yaml webhook identificationManualFinished
This notification is sent when an identity verification is manually approved or denied.
# Identification resubmitted
Source: https://documentation.idenfy.com/api-reference/webhooks/identification-resubmitted
/openapi/kyc.yaml webhook identificationResubmitted
This notification is sent when a client resubmits an identity verification.
# Sos report
Source: https://documentation.idenfy.com/api-reference/webhooks/sos-report
/openapi/kyb.yaml webhook sosReport
This notification is sent when a SOS filing report is delivered.
# Video call finished
Source: https://documentation.idenfy.com/api-reference/webhooks/video-call-finished
/openapi/kyc.yaml webhook videoCallFinished
This notification is sent when a video call is finished.
# Authentication
Source: https://documentation.idenfy.com/authentication
Authenticate with the iDenfy API using HTTP Basic Auth with your API key and secret. Includes code examples in cURL, Python, and Node.js.
## API Key Authentication
All server-side API calls use **HTTP Basic Auth** with your API Key and API Secret.
```bash cURL theme={"system"}
curl -X POST https://ivs.idenfy.com/api/v2/token \
-u "YOUR_API_KEY:YOUR_API_SECRET" \
-H "Content-Type: application/json" \
-d '{"clientId": "user-123"}'
```
```python Python theme={"system"}
import requests
response = requests.post(
"https://ivs.idenfy.com/api/v2/token",
auth=("YOUR_API_KEY", "YOUR_API_SECRET"),
json={"clientId": "user-123"}
)
```
```javascript Node.js theme={"system"}
const response = await fetch("https://ivs.idenfy.com/api/v2/token", {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: "Basic " + Buffer.from("YOUR_API_KEY:YOUR_API_SECRET").toString("base64"),
},
body: JSON.stringify({ clientId: "user-123" }),
});
```
```php PHP theme={"system"}
$ch = curl_init("https://ivs.idenfy.com/api/v2/token");
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_USERPWD, "YOUR_API_KEY:YOUR_API_SECRET");
curl_setopt($ch, CURLOPT_HTTPHEADER, ["Content-Type: application/json"]);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode(["clientId" => "user-123"]));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = json_decode(curl_exec($ch), true);
```
The `Authorization` header is: `Basic base64(API_KEY:API_SECRET)`
## Get Your Keys
1. Log in to [iDenfy Dashboard](https://admin.idenfy.com)
2. Go to **Settings → API Keys**
3. Select **Generate**
[Detailed guide →](/guides/dashboard/settings/api-keys)
## Two Types of Auth
| Auth type | Used for | Where |
| --------------------------------- | --------------------------- | ---------------------------- |
| **Basic Auth** (API Key + Secret) | All server-side API calls | Your backend only |
| **authToken** | Client-side verification UI | iFrame, redirect, mobile SDK |
The flow:
```
Backend (Basic Auth) → POST /api/v2/token → returns authToken
Frontend (authToken) → Verification UI → results via webhook to backend
```
The `authToken` is short-lived and scoped to one verification. It's safe to pass to the client.
**Never expose your API Secret in client-side code** — browser JavaScript, mobile apps, or public repos. Use it only on your server.
# Create a Bank Card Session
Source: https://documentation.idenfy.com/bank-card/create-session
Create a standalone bank card verification session with the iDenfy API, including expected cardholder details, session URL, mobile code, and redirects.
**Requirements:**
* **API key pair** (API key + secret)
* **Bank Card Verification** enabled on your account (contact iDenfy -- not self-service)
* The **standalone** flow enabled on your account
* **Finances** available for Bank Card Verification
For how the card check works, what each verdict means, and how the dashboard side is configured, see the [Bank Card Verification](/guides/dashboard/features/bank-card-verification) guide. This documentation focuses on the API integration.
This page covers the **standalone** flow -- a card check that runs on its own token, with no identity verification behind it. To run the same check as an extra step inside a KYC session, set `bankCardVerification` when [generating an identity verification token](/kyc/generate-token) instead.
## Create a Session
Authenticate with your **API key pair** -- API key as the username, API secret as the password, over HTTP Basic. Sessions are scoped to your partner account, so you only ever see your own.
For the full request and response schemas, every field's constraints and defaults, and an interactive playground, see the [**API Reference**](/api-reference/bank-card-verification/create-session) page for this endpoint.
`expectedName` is the only required field -- the cardholder name read from the card is compared against it. Supplying `expectedLastFour` (exactly four digits) adds a second check against the card's actual last four digits. Creating a session pre-checks your finances; if they can't cover the check the request is rejected -- see [Errors](#errors).
### Example (Partner API)
```http theme={"system"}
POST /bank-card/tokens/
Authorization: Basic {API_KEY}:{API_SECRET}
Content-Type: application/json
{
"expectedName": "Jane Doe",
"expectedLastFour": "4242",
"lifetime": 3600,
"sessionLength": 30,
"generateMobileCode": true,
"successUrl": "https://partner.example.com/ok",
"failUrl": "https://partner.example.com/denied"
}
```
```json theme={"system"}
{
"tokenString": "b7c1…",
"expiration": "2026-08-26T13:00:00Z",
"isValid": true,
"sessionUrl": "https://ui.idenfy.com/?bcvToken=b7c1…",
"mobileCode": "48120537"
}
```
***
## Sending the User to the Session
Redirect the end user to the returned `sessionUrl`, or embed it in an iFrame.
**Embedding it yourself?** Your frame must grant camera access to the card capture origin, or card capture fails while document upload keeps working. See [Required Attributes](/kyc/iframe-redirect#required-attributes) for the `allow` attribute.
* **Mobile code.** When `generateMobileCode` is set, the response also carries an eight-digit `mobileCode`. Show it to the user so they can open the session in the iDenfy mobile app instead of following the link.
* **Desktop hand-off.** Desktop users are offered a QR code and an SMS link so they can finish on a phone camera. The desktop screen advances to the result on its own once the phone is done. Nothing is required from you.
* **Redirects.** `successUrl` and `failUrl` send the user back to your page once the check resolves. An **expired** session never redirects -- handle that case on your side, off the back of the webhook.
The flow is available in all [37 supported languages](/resources/supported-languages), switchable mid-flow.
***
## Session Lifetime
Two independent clocks govern a session.
| Clock | Field | Default | Range | Starts |
| ----------------- | --------------- | ------- | ------------- | ------------------------------------------------ |
| Link lifetime | `lifetime` | 1 hour | up to 30 days | when the session is created |
| Capture countdown | `sessionLength` | -- | 1--60 minutes | at the capture step, not when the link is opened |
`lifetime` is set in **seconds**; `sessionLength` in **minutes**.
The end user gets three capture attempts by default, configurable per account. The counter is never shown to them, and a poor-quality capture does not spend an attempt on its own.
***
## Errors
| Status | Message | When |
| ------ | -------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- |
| `402` | `"Action not allowed due to lack of funds or exceeded limit."` | Your finances cannot cover a bank card verification. Contact your account manager, or support team. |
***
## What's Next
Once the user finishes, the verdict is delivered to your endpoint. There is no Partner API endpoint for retrieving a standalone session, so configure a webhook if you need the result in your own systems -- see [Bank Card Webhooks](/bank-card/webhooks).
# Bank Card Verification Webhooks
Source: https://documentation.idenfy.com/bank-card/webhooks
Receive standalone bank card verification results from iDenfy: match statuses, no-match reasons, the card data returned, and how the KYC-linked result differs.
When a bank card verification reaches a verdict, a result notification is sent to your endpoint with the event type `BANK_CARD_VERIFICATION_COMPLETED`.
There is no Partner API endpoint for retrieving a standalone session, so this is the only way to receive the result programmatically -- configure a webhook.
## Where It's Sent
The destination is the webhook URL configured on your account's **Bank Card Verification** notification. Set it up under [Settings → System Notifications](/guides/dashboard/settings/system-notifications-webhooks-emails). If the notification is configured with a signing key, the body is signed so you can verify authenticity -- see [Callback Signing](/security/callback-signing).
## Payload
For the full payload schema and every field's type, see the [**API Reference**](/api-reference/webhooks/bank-card-verification-completed) page for this webhook.
Only a **full match** counts as a success.
| `status` | Meaning |
| -------------- | -------------------------------------------------------------------- |
| `MATCH` | Every requested check passed. |
| `NO_MATCH` | At least one check failed. `noMatchReason` says which. |
| `NOT_COMPARED` | No comparison was reached -- the card data could not be established. |
When `status` is `NO_MATCH`, `noMatchReason` carries the cause:
| `noMatchReason` | Meaning |
| ------------------ | -------------------------------------------------------------------------------------------------- |
| `NAME_MISMATCH` | A cardholder name was read, but it does not match `expectedName`. |
| `NUMBER_MISMATCH` | The card's last four digits do not match the `expectedLastFour` you supplied. |
| `NAME_NOT_FOUND` | No cardholder name could be read from the card. |
| `NUMBER_NOT_FOUND` | No card number could be read from the card. |
| `LIVENESS_FAILED` | The capture was not a genuine physical card -- for example a photo of a screen, or a printed copy. |
`nameMatch` and `lastFourMatch` report the two component checks individually. `lastFourMatch` is `null` when you did not supply an `expectedLastFour`, since nothing was compared.
Only `firstSix`, `lastFour` and `expiryDate` are ever returned. The **full card number is never sent**, and the CVV is never captured at any point. Card capture and image processing run in a dedicated environment certified to PCI-DSS v4.0.1, and no card imagery is retained once processing completes.
The verdict is final. There is no manual review step for a bank card check, and a verdict that has been reached is never overwritten.
## Standalone Vs. KYC-Linked
The same card check serves two entry points, and they report differently:
* **Standalone** -- a session created through [Create a Bank Card Session](/bank-card/create-session) delivers its own `BANK_CARD_VERIFICATION_COMPLETED` notification, carrying the payload above.
* **Inside a KYC session** -- the result instead arrives as a nested `bankCardVerification` object on the [identity verification webhook](/kyc/webhooks), with the same fields. A `NO_MATCH` there marks the verification **Suspected** for review rather than denying it -- see [Suspected Status](/kyc/suspected-status).
## Idempotency
Delivery may be retried, so handle notifications idempotently, keyed on `id`.
# Bank Verification API
Source: https://documentation.idenfy.com/bank-verification/overview
Integrate iDenfy's Bank Verification API to verify customer bank accounts and financial information with session creation and webhook callbacks.
**Requirements**
* **API** key pair
* **Webhook** setup
* Bank verification **credits**
***
## Bank Verification API Integration
### Creating a Bank Verification Session
For full request and response schemas for session creation, see the **API Reference** tab.
**Creating a redirection link**
Append the generated `tokenString` to the URL `https://bank-verification.ui.idenfy.com/?token=` to provide to the end-user.
Example: `https://bank-verification.ui.idenfy.com/?token=LVS8YgSTTVuXAHiur10yCabIAWLizUlX`
### Webhook Response
Once the end-user completes bank verification, you will receive a [webhook notification](/guides/dashboard/settings/system-notifications-webhooks-emails) with the response.
For the full webhook response schema, see the **API Reference** tab.
***
## Listing Account Transactions
Retrieve transaction history for a verified bank account.
For full request and response schemas, see the **API Reference** tab.
## Next Steps
Full bank verification API endpoint reference.
Step-by-step guide for bank verification in the dashboard.
# Best Practices
Source: https://documentation.idenfy.com/best-practices
Security, UX, and compliance best practices for your iDenfy integration covering API credentials, webhook security, and session management.
## Security
### Protect Your API Credentials
* Store API Key and Secret in environment variables, never in code
* Never expose credentials in client-side JavaScript or mobile app bundles
* Rotate API keys periodically and immediately if compromised
### Secure Your Webhooks
* Implement [callback signing](/security/callback-signing) verification on every webhook
* [Whitelist iDenfy IP addresses](/security/ip-whitelisting) on your webhook endpoint
* Use HTTPS with a valid TLS certificate
* Respond to webhooks within 10 seconds
### Session Creation
* Create verification sessions server-side only
* Sessions are single-use and short-lived — create a new one for each verification
* Never reuse or cache tokens
## User Experience
### Reduce Drop-Off
* Explain what documents are accepted before starting verification
* Show progress indicators during verification
* Provide clear error messages when verification fails
* Allow re-verification with a single click
* Test on mobile — most verifications happen on phones
### Camera and Document Tips
* Advise users to ensure good lighting
* Suggest removing document from plastic sleeves
* Let users hold the device however they prefer — document capture works in both portrait and landscape, and rotating mid-flow keeps their progress
* Test iFrame camera permissions across browsers
## Compliance
### Data Handling
* Only collect data fields required by your compliance obligations
* Implement data retention policies aligned with regulatory requirements
* Provide customers access to their verification status
* Document your verification process for auditors
### Record Keeping
* Store `scanRef` for each verification in your database
* Download and archive [verification PDFs](/kyc/pdf-generation) for compliance records
* Log all webhook events with timestamps
# Environments
Source: https://documentation.idenfy.com/environments
Learn how iDenfy sandbox and production environments work with a single base URL, and how your API key pair determines the active mode.
## Single URL, Two Modes
iDenfy uses **one base URL** for both sandbox and production:
```
https://ivs.idenfy.com
```
Your **API key pair** determines which mode you're in — not the URL. Sandbox keys return test results, production keys trigger real verifications. Your code stays the same, only the keys change.
| | Sandbox | Production |
| ------------- | --------------------------------- | ------------------------------------- |
| **Base URL** | `https://ivs.idenfy.com` | `https://ivs.idenfy.com` |
| **API keys** | Sandbox key pair | Production key pair |
| **Documents** | Dummy results, no real processing | Real document verification |
| **Credits** | Not consumed | Consumed per verification |
| **Webhooks** | Delivered to your test endpoint | Delivered to your production endpoint |
Since the URL is identical, you can switch between sandbox and production by swapping API keys in your environment variables — no code changes needed.
## Sandbox
The sandbox lets you:
* Test your integration end-to-end without real documents
* Simulate different outcomes (approved, denied, suspected)
* Validate webhook handling with predictable payloads
* Test error scenarios and edge cases
See [Testing & Sandbox](/guides/testing-sandbox) for step-by-step instructions.
## Switching to Production
Set your production webhook URL in [Dashboard → Settings](/guides/dashboard/settings/system-notifications-webhooks-emails).
Implement [callback signing](/security/callback-signing) and [IP whitelisting](/security/ip-whitelisting).
Verify all verification outcomes are handled correctly. See the [go-live checklist](/guides/testing-sandbox#go-live-checklist).
Replace sandbox keys with production keys in your environment variables.
# Face Auth iFrame
Source: https://documentation.idenfy.com/face-authentication/iframe
Embed iDenfy face authentication in your web page using an iFrame for seamless returning-user biometric re-verification without redirects.
## iFrame Integration
To use face authentication with an iFrame, insert the verification platform URL directly into your iFrame tag:
```
https://face.authentication.idenfy.com/?token={{token}}
```
The `token` query string parameter is obtained after [generating a token](/face-authentication/token-generation).
After the process is finished, you may close the iFrame and display a desired page to your client.
| Query String Parameter | Example Value |
| ---------------------- | ---------------------------- |
| `token` | `3FA5TFPA2ZE3LMPGGS1EGOJNJE` |
Example redirect URL: `https://face.authentication.idenfy.com/?token=3FA5TFPA2ZE3LMPGGS1EGOJNJE`
### Code Example
```html theme={"system"}
```
***
## Webhook
You can receive information when face authentication actions are performed by [setting up](/guides/dashboard/settings/system-notifications-webhooks-emails) a `FACIAL_AUTHENTICATION` notification type webhook.
### Possible `status` Values
| Name | Description |
| ---------- | -------------------------------------------------------------------------------------------------------------------------------------- |
| `SUCCESS` | Authentication is successful. This message is also sent upon successful enrollment. |
| `FAILED` | Authentication failed due to fraudulent activity or other possible vulnerabilities. This message is also sent upon enrollment failure. |
| `EXPIRED` | Face authentication token expired before the user started the process. |
| `CANCELED` | Face authentication session was canceled by the user. |
### Possible `failReason` Values
| Value | Description |
| ----------------------------- | --------------------------------------------------------------------- |
| `FACE_MISMATCH` | The face does not match the enrolled reference photo. |
| `FAKE_FACE` | A spoofing attempt was detected (e.g., printed photo, screen replay). |
| `VIRTUAL_CAMERA` | A virtual or emulated camera was used instead of a physical device. |
| `FACE_NOT_FOUND` | No face was detected in the captured image. |
| `TOO_MANY_FACES` | More than one face was detected in the frame. |
| `FACE_ANGLE_TOO_LARGE` | The face was turned too far from a frontal position. |
| `FACE_TOO_SMALL` | The face occupies too small a portion of the frame. |
| `FACE_CLOSE_TO_BORDER` | The face is too close to the edge of the image. |
| `FACE_TOO_CLOSE` | The face is too close to the camera. |
| `FACE_CROPPED` | Part of the face is cut off or outside the frame. |
| `FACE_IS_OCCLUDED` | The face is partially covered (e.g., by a mask, hand, or object). |
| `EYES_CLOSED` | The person's eyes are closed. |
| `FAILED_TO_PREDICT_LANDMARKS` | Facial landmark detection failed. |
| `PROBABILITY_TOO_SMALL` | The face-match confidence score is below the required threshold. |
| `FAKE_CAPTURE` | The capture process was tampered with or bypassed. |
| `DUPLICATE_IMAGE` | The same image was submitted more than once. |
### Webhook Response Example (EXPIRED)
```json theme={"system"}
{
"id": "8d471b4c-3822-4547-aec5-a9d0cc0aa105",
"scanRef": "8df398bb-7340-11ee-9aec-0221b1f59063",
"clientId": "FD155HLZ5Z",
"status": "EXPIRED",
"token": "UbYZnDdrTElsSDBQFeNkd8MxI9CpSEO0qR5jtRcz",
"type": "AUTHENTICATION",
"method": "FACE_MATCHING",
"facePhoto": null,
"failReason": null,
"ipAddress": null
}
```
***
## iFrame Console Status Values
Information about the face authentication statuses is available in the browser console on the `data` object.
| Name | Description |
| ---------- | ----------------------------------------------------------- |
| `APPROVED` | The user completed face authentication and it was approved. |
| `FAILED` | The user completed face authentication but it failed. |
To assess the face authentication session, evaluate the [webhooks](#webhook) sent from the back-office. The statuses in the iFrame console are complementary.
# Face Authentication API
Source: https://documentation.idenfy.com/face-authentication/overview
Use iDenfy's Face Authentication API to re-authenticate returning users with biometric face matching for account login, high-risk actions, and periodic checks.
The Face Authentication API is a service for **re-authenticating returning users** by comparing their live face to a biometric template captured during a previous identity verification.
Unlike a full KYC verification, Face Authentication does not require document scanning. The user simply takes a selfie, which is matched against their original verification photo. This makes it ideal for:
* **Account login** -- add biometric security as a second factor
* **High-risk actions** -- confirm the user's identity before transactions, withdrawals, or profile changes
* **Periodic re-verification** -- ensure the same person is still using the account over time
## How It Works
1. **Create a Face Authentication session** using the [Create Face Auth Session](/face-authentication/token-generation) endpoint, referencing the user's original `scanRef`.
2. **Launch the authentication session** via the [iFrame / Redirect URL](/face-authentication/iframe) or a native SDK.
3. **Receive the result** through a webhook callback indicating whether the face matched.
## Prerequisites
You must have at least one successful identity verification with iDenfy. The original verification's `scanRef` is required to create the authentication session.
## Next Steps
Create a face authentication session via API.
Embed the authentication flow in your application.
# Create Face Auth Session
Source: https://documentation.idenfy.com/face-authentication/token-generation
Create a face authentication session token via the iDenfy API using a previous verification scanRef for biometric re-authentication.
**Requirements**
* **API** key pair
* A **successful** verification already completed (`scanRef`)
* Face authentication session creation via API **enabled** (done by iDenfy staff)
* Face authentication **credits**
Verify users quickly with face authentication -- compares a live face to the ID document photo using matching and passive liveness detection.
***
## Introduction
This guide covers session creation and checking whether your user can use face authentication. You need the session token for SDK initialization or iFrame integration. Check the authentication status first to verify whether your user has completed identification (verified with face and document).
***
## 1. Check Face Authentication Status
**Authorization:** `API key pair`
**Method:** `GET`
**Endpoint:** `https://ivs.idenfy.com/identification/facial-auth/{scanRef}/check-status/?method=FACE_MATCHING`
Once you call the endpoint using the `scanRef`, the response will contain one of the following authentication types:
| Name | Description |
| ---------------- | ------------------------------------------------------ |
| `AUTHENTICATION` | The user can authenticate by face |
| `ENROLLMENT` | The user must be enrolled before they can authenticate |
| `IDENTIFICATION` | The user must perform a full identification again |
`ENROLLMENT` is only excluded when you pass `method=FACE_MATCHING`, as in the endpoint above. Omit the parameter or request active liveness and the response can also be `ENROLLMENT`.
If verification with the provided `scanRef` does not exist (deleted or invalid), the endpoint returns status code **404**.
**Response example:**
```json theme={"system"}
{
"type": "AUTHENTICATION"
}
```
***
## 2. Create the Session Token
**Authorization:** `API key pair`
**Method:** `POST`
**Endpoint:** `https://ivs.idenfy.com/partner/authentication-info`
If the authentication type is `IDENTIFICATION`, use the regular identification endpoint for creating a session. See the [session creation guide](/kyc/generate-token). `IDENTIFICATION` cannot be passed as `type` on this endpoint — creation accepts only `AUTHENTICATION` or `ENROLLMENT`.
### Request Parameters
| Key | Required | Description |
| --------------------- | -------- | -------------------------------------------------------------------------------------- |
| `scanRef` | Yes | The completed verification the user authenticates against |
| `method` | Yes | `FACE_MATCHING` or `ACTIVE_LIVENESS` |
| `type` | No | `AUTHENTICATION` (default) or `ENROLLMENT` |
| `lifetime` | No | Session duration in **seconds**. Default `3600` (1 hour), minimum `0`, maximum 30 days |
| `locale` | No | Forces a specific locale |
| `generateDigitString` | No | Returns a `digitString` for the mobile app flow |
* `FACE_MATCHING` supports authentication only.
* `ACTIVE_LIVENESS` authentication fails unless the user was enrolled first with `type: ENROLLMENT`.
When `generateDigitString` is `true`, `lifetime` is additionally capped by a partner-level setting that defaults to **24 hours**. The 30-day maximum does not apply to these sessions, and a longer `lifetime` returns an error.
Creation returns **400** — not 404 — if the `scanRef` is invalid or deleted. Insufficient face authentication credits also return **400**.
`generateDigitString` is optional. If provided, it returns an 8-digit `digitString` to be used for face authentication on the iDenfy mobile app, or sent to the user as an SMS short link. The flow is as follows:
1. Your system calls the API endpoint to create a face authentication session, and a verification code is returned.
2. On your platform, you prompt the user to open the iDenfy app and enter the returned `digitString` code.
3. The user takes a selfie, closes the app, and returns to your platform.
4. Once your system receives the results via webhook, it either allows the user to proceed or prompts them to retry by generating a new code.
The code has no separate lifetime — it expires with the session.
### Request Example
```json theme={"system"}
{
"scanRef": "scanRef",
"type": "AUTHENTICATION",
"method": "FACE_MATCHING",
"generateDigitString": true
}
```
### Response Example
```json theme={"system"}
{
"token": "3FA5TFPA2ZE3LMPGGS1EGOJNJE",
"type": "AUTHENTICATION",
"maxAttemptCount": 1,
"digitString": "12345678",
"locale": "en"
}
```
| Field | Description |
| ----------------- | ------------------------------------------------------------------------ |
| `token` | Session token. Use it for SDK initialization or to build the session URL |
| `type` | `AUTHENTICATION` or `ENROLLMENT` |
| `maxAttemptCount` | Always `1` — a session allows a single attempt |
| `digitString` | 8-digit code, returned only when `generateDigitString` was `true` |
| `locale` | Session locale |
The response contains no expiry value and no session URL. Build the URL yourself from the `token` — see [Face Auth iFrame](/face-authentication/iframe).
# Address Verification
Source: https://documentation.idenfy.com/fraud-prevention/address-verification
Verify customer addresses against official records using the iDenfy address verification API endpoint with country and address parameters.
**Requirements**
* **API** key pair
* Finances to perform **address verification**
***
## Verify Address
**Authorization:** `API key pair`
**Method:** `POST`
**Endpoint:** `https://ivs.idenfy.com/api/v2/address-verification`
### Request Parameters
| Parameter | Type | Required | Explanation |
| --------- | ------ | -------- | -------------------------------------------------------------------------------------------------------------- |
| `address` | String | Yes | Address for verification. Maximum length: 255 characters — longer values are rejected with a validation error. |
| `country` | String | No | 2-digit ISO country code, e.g. "LT" |
### No Match Found
If the address cannot be matched at all, the endpoint returns **`404 Not Found`** instead of a response body with `status: UNVERIFIED`. `UNVERIFIED` is only returned when a match *is* found but its verification code indicates the match is unverified or reverted — your integration needs to handle both the 404 case and the `UNVERIFIED` status.
You are only charged when a match is found. No funds are consumed when the endpoint returns `404`.
### Response Values
| Key | Type | Explanation |
| ---------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `address` | String | Address that was used to perform address verification. |
| `country` | String | Country that was passed during the address verification process. |
| `status` | String | Status of the address. Possible values: `VERIFIED`, `PARTIALLY_VERIFIED`, `UNVERIFIED`. |
| `quality` | String | Quality score of the address. Possible values: `EXCELLENT`, `GOOD`, `AVERAGE`, `POOR`, `BAD`. |
| `accuracy` | Integer | Accuracy of the address information. Maximum value is `100`. A lower value is returned if, for example, the postcode in the request differs from the actual postcode derived from the provided address. |
`BAD` also covers the case where the provider returns no quality code at all — `quality` is never `null`. Treat `BAD` as "poor quality or quality unknown."
### Request Example
```json theme={"system"}
{
"address": "Baršausko g. 59, LT-51423 Kaunas",
"country": "LT"
}
```
### Response Example
```json theme={"system"}
{
"address": "Baršausko g. 59, LT-51423 Kaunas",
"country": "LT",
"status": "VERIFIED",
"quality": "GOOD",
"accuracy": 99
}
```
# AI Proof of Address
Source: https://documentation.idenfy.com/fraud-prevention/ai-poa
Verify utility bills and proof of address documents automatically using iDenfy AI-powered document analysis with base64 file upload.
**Requirements**
* API key pair
* Finances for PoA [COMPARE type](/kyc/additional-steps)
***
## AI POA Verification
**Authorization:** `API key pair`
**Method:** `POST`
**Endpoint:** `https://ivs.idenfy.com/api/v2/poa-checks/`
### Request Structure
| Key | Required | Type | Explanation |
| ----------------- | -------- | ------ | -------------------------------------------------------------------------------------------- |
| `file` | Yes | String | Base64 encoded document file. Supported formats: jpeg, jpg, png, gif, webp, heic, heif, pdf. |
| `providedName` | No | String | Full name of the user. Will be compared against the data retrieved from the PoA document. |
| `providedAddress` | No | String | Address for verification. Will be compared against the data retrieved from the PoA document. |
### Response Structure
| Key | Type | Explanation |
| ----------------- | ------- | ------------------------------------------------------------------------------------------------------------ |
| `id` | String | PoA check identifier. |
| `created` | String | Timestamp indicating when the PoA check was created. |
| `updated` | String | Timestamp indicating when the PoA check was last updated. |
| `issueDate` | String | Issue date retrieved from the Proof of Address document. |
| `documentType` | String | Type of document. Possible values: `UTILITY_BILL`, `BANK_STATEMENT`, `GOVERNMENT_LETTER`, `LEASE_AGREEMENT`. |
| `hasLogo` | Boolean | `true` if the document contains a company or provider logo; otherwise `false`. |
| `nameMatch` | Boolean | `true` if the provided name matches the one on the document; otherwise `false`. |
| `addressMatch` | Boolean | `true` if the provided address matches the one on the document; otherwise `false`. |
| `dateValid` | Boolean | `true` if the document is not older than 3 months; otherwise `false`. |
| `overallStatus` | String | Overall result of the comparison. Possible values: `MATCH`, `NO_MATCH`, `NOT_COMPARED`. |
| `name` | String | Full name retrieved from the PoA document. |
| `address` | String | Full address retrieved from the PoA document. |
| `partner` | Object | Object containing partner environment-related information. |
| `fileType` | String | File type of the uploaded document. Possible values: `PDF`, `JPG`, `PNG`. |
| `providedName` | String | Name value that was provided when the check was initiated. |
| `providedAddress` | String | Address value that was provided when the check was initiated. |
| `file` | String | URL to download the uploaded file. |
### Request Example
```json theme={"system"}
{
"file": "iVBORw0KGgoAAAANSUhEUgAAAxoAAAC6CAYAAAApyZWVuc2hvdO8Dvz4AAAA[...]",
"providedName": "John Smith",
"providedAddress": "4344 Poco Mas Drive, Dallas, FL, 33009"
}
```
### Response Example
```json theme={"system"}
{
"id": "aa4e1453-abc0-4649-84ab-d6a65984329b",
"created": "2024-10-21T06:10:31.559212Z",
"updated": "2024-10-21T06:10:31.559246Z",
"issueDate": "2021-11-15",
"documentType": "Electricity bill",
"hasLogo": true,
"nameMatch": false,
"addressMatch": true,
"dateValid": false,
"overallStatus": "NO_MATCH",
"name": "Leslie Holden",
"address": "4344 Poco Mas Drive Dallas, FL, 33009",
"partner": {
"id": 2253,
"created": "2023-10-11T14:09:40.458303Z",
"companyName": "iDenfy Techsupport TEST",
"environment": "TESTING",
"isActive": true
},
"fileType": "png",
"providedName": "John Smith",
"providedAddress": "4344 Poco Mas Drive, Dallas, FL, 33009",
"file": "https://s3.eu-west-1.amazonaws.com/[...]"
}
```
# Fraud Probability
Source: https://documentation.idenfy.com/fraud-prevention/fraud-probability
Calculate fraud probability scores based on multiple risk signals like email, phone, IP, and device data using the iDenfy fraud API.
**Requirements**
* **API** key pair
* Fraud probability **credits**
***
## Estimate Fraud Probability
**Authorization:** `API key pair`
**Method:** `POST`
**Endpoint:** `https://ivs.idenfy.com/fraud/estimate-fraud-probability`
Although none of the parameters below are individually required, the request must contain **at least one** of them.
### Request Parameters
| Key | Required | Type | Constraints | Explanation |
| --------------------------- | -------- | ------ | ----------------------- | ----------------------------------------------- |
| `user_agent` | No | String | Max length 512 | The HTTP `User-Agent` header of the browser |
| `accept_language` | No | String | -- | The HTTP `Accept-Language` header of the device |
| `ip_address` | No | String | `ipv4` or `ipv6` format | User's IP address |
| `first_name` | No | String | Max length 255 | User's first name |
| `last_name` | No | String | Max length 255 | User's last name |
| `email_address` | No | String | Max length 255 | User's email address |
| `email_domain` | No | String | Max length 255 | The domain of the `email_address` |
| `street_address` | No | String | Max length 255 | The first line of the user's living address |
| `city` | No | String | Max length 255 | User's city |
| `country` | No | String | Country alpha-2 code | User's country |
| `postal_code` | No | String | Max length 255 | The postal/zip code of user's living address |
| `phone_number` | No | String | Max length 255 | User's phone number without country code |
| `phone_country_code` | No | String | Max length 4 | User's phone country code (e.g. +370) |
| `credit_card_number_6` | No | String | Length 6 | The first 6 digits of the user's payment card |
| `credit_card_last_4_digits` | No | String | Length 4 | The last 4 digits of the user's payment card |
### Request Example
```json theme={"system"}
{
"user_agent": "Mozilla/5.0 (Android 7.0; Mobile; rv:54.0) Gecko/54.0 Firefox/54.0",
"accept_language": "en-US,en;q=0.8",
"ip_address": "64.236.213.12",
"first_name": "John",
"last_name": "Smith",
"email_address": "john@gmail.com",
"email_domain": "gmail.com",
"street_address": "123 Address Rd.",
"city": "Boston",
"country": "US",
"postal_code": "34455",
"phone_number": "3439007998",
"phone_country_code": "1",
"credit_card_number_6": "410608",
"credit_card_last_4_digits": "9930"
}
```
### Response Example
```json theme={"system"}
{
"fraud_level": "LOW"
}
```
### Fraud Levels
| Key | Type | Possible Values |
| ------------- | -------- | --------------------------------------------------------------- |
| `fraud_level` | `String` | `VERY_LOW`, `LOW`, `MEDIUM`, `HIGH`, `VERY_HIGH`, `NOT_CHECKED` |
# Fraud Prevention API
Source: https://documentation.idenfy.com/fraud-prevention/overview
Use iDenfy's Fraud Prevention API to detect fraud with AI risk scoring, VPN and proxy detection, phone validation, and address verification checks.
## Fraud Prevention API Overview
iDenfy's fraud prevention API tools work alongside identity verification or as standalone API checks. Use them to add extra layers of trust before onboarding a customer.
## Available Tools
AI-powered risk scoring. Combine KYC, KYB, and AML signals into a single risk score with customizable rules and weights.
Detect if a user is behind a VPN, proxy, or Tor during verification. Returns risk level and IP details.
AI-generated fraud probability score based on multiple signals from the verification session.
Validate phone number format, carrier, and line type without contacting the user.
Verify phone ownership by sending an SMS or call with a confirmation code.
Verify customer addresses against official postal and government records.
AI-powered verification of utility bills, bank statements, and other proof of address documents.
***
## When to Use What
| Use case | Tool | Integration |
| ------------------------------------ | -------------------------------------------------------------- | -------------------------------------------------------- |
| Score overall risk of a verification | [Risk Assessment](/fraud-prevention/risk-assessment) | During KYC (via token parameter `riskAssessmentProfile`) |
| Block VPN/proxy users | [Proxy Check](/fraud-prevention/proxy-check) | During KYC (via token parameter `checkIpProxy`) |
| Validate a phone number before SMS | [Phone Validation](/fraud-prevention/phone-validation) | Standalone API call |
| Confirm phone ownership | [Phone Verification](/fraud-prevention/phone-verification) | During KYC or standalone |
| Check if address is real | [Address Verification](/fraud-prevention/address-verification) | Standalone API call |
| Verify a utility bill document | [AI Proof of Address](/fraud-prevention/ai-poa) | During KYC (via `additionalSteps`) or standalone |
Most fraud prevention tools can be enabled **automatically during KYC** by setting parameters in the [session creation](/kyc/generate-token) request, or called as **standalone API endpoints** independently of verification.
## Next Steps
Configure AI-powered risk scoring.
Detect VPN, proxy, and Tor usage.
Verify phone ownership via SMS.
Verify utility bills and bank statements.
# Phone Validation
Source: https://documentation.idenfy.com/fraud-prevention/phone-validation
Validate phone number format, carrier information, and line type using the iDenfy phone validation API for fraud prevention checks.
**Requirements**
* **API** key pair
* Service **enabled** (done by iDenfy staff)
* Number validation **credits**
Phone Number Risk Scoring for Instant Validation -- receive risk scores, filter invalid numbers, and get detailed phone insights in one call.
***
## Validate Phone Number
**Authorization:** `API key pair`
**Method:** `POST`
**Endpoint:** `https://ivs.idenfy.com/fraud/validate-phone`
### Request Structure
If the provided phone number is not in [E.164](https://en.wikipedia.org/wiki/E.164) format or it is not a mobile phone number, the server may return an empty string `""`.
| Key | Required | Type | Constraints | Explanation |
| ------------------ | -------- | -------- | --------------------------------------------------- | --------------------------------------- |
| `phone_number` | Yes | `String` | [E.164](https://en.wikipedia.org/wiki/E.164) format | Phone number with country code to check |
| `current_location` | No | `String` | Country alpha-2 code | Current IP address location |
### Response Structure
| Key | Type | Constraints | Explanation |
| ---------------------- | ------ | -------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
| `risk_score` | Float | Min 0, Max 99 | Calculated score indicating how risky the phone number is. |
| `country_code` | String | Country alpha-2 code | Two character country code for the phone number. |
| `current_network` | String | -- | The full name of the carrier the phone number is associated with. |
| `current_route` | String | `mobile`, `landline`, `landline_premium`, `landline_tollfree`, `virtual`, `unknown`, `pager` | The type of network the phone number is associated with. |
| `original_network` | String | -- | The full name of the original carrier for the phone number. |
| `availability` | String | `unknown`, `reachable`, `undeliverable`, `absent`, `bad_number`, `blacklisted` | Whether the phone number can be called. Applicable to mobile numbers only. |
| `validity` | String | `unknown`, `valid`, `not_valid`, `inferred`, `inferred_not_valid` | Whether the number is valid. `inferred_not_valid` means it could not be determined and is likely invalid. Applicable to mobile numbers only. |
| `roaming` | String | `unknown`, `roaming`, `not_roaming` | Whether the phone number is outside its home carrier network. |
| `roaming_country` | String | Country alpha-2 code | If roaming, the country the phone number is roaming in. |
| `roaming_network_name` | String | -- | If roaming, the carrier network the phone number is roaming in. |
| `request_id` | String | Max length 40 | The unique identifier for your request. |
### Request Example
```json theme={"system"}
{
"phone_number": "+12025550163",
"current_location": "US"
}
```
### Response Example
```json theme={"system"}
{
"risk_score": 10.0,
"country_code": "US",
"current_network": "United States Premium",
"current_route": "unknown",
"original_network": "United States Premium",
"availability": "unknown",
"validity": "not_valid",
"roaming": "unknown",
"roaming_country": null,
"roaming_network_name": null,
"request_id": "fcecf6e6-1ad7-4d5e-98a8-cc9b2d5575eb"
}
```
# Phone Verification
Source: https://documentation.idenfy.com/fraud-prevention/phone-verification
Verify phone number ownership by sending an SMS or call verification code via the iDenfy API for customer identity and fraud checks.
**Requirements**
* **API** key pair
* Service **enabled** (done by iDenfy staff)
* Number verification **credits**
Verify identity seamlessly using phone number OTP -- fast verification for genuine users (under 30 seconds), global coverage, 2FA security, and automated onboarding.
***
## Step 1: Send SMS with Verification Code
**Authorization:** `API key pair`
**Method:** `POST`
**Endpoint:** `https://ivs.idenfy.com/fraud/send-sms`
Calling this endpoint sends an SMS message containing a verification code to your user.
### Request Structure
| Key | Required | Type | Constraints | Default | Explanation |
| -------------- | -------- | -------- | --------------------------------------------------- | -------- | ----------------------------------------------------------------------- |
| `phone_number` | Yes | `String` | [E.164](https://en.wikipedia.org/wiki/E.164) format | -- | Phone number with country code to receive the verification code via SMS |
| `sender_name` | No | `String` | Max length 11 | `iDenfy` | Name or number displayed as the sender |
### Response Structure
| Key | Type | Explanation |
| ------------ | -------- | -------------------------------------------- |
| `request_id` | `String` | You will need this for the verification step |
```json theme={"system"}
{
"phone_number": "+12025550163",
"sender_name": "The Sender"
}
```
```json theme={"system"}
{
"request_id": "3d50e1584e0946e789e0185c009aaadf"
}
```
**Example SMS message sent to your user:**
```
The Sender code: 1234. Valid for 5 minutes.
```
***
## Step 2: Verify User-Entered Code
**Authorization:** `API key pair`
**Method:** `POST`
**Endpoint:** `https://ivs.idenfy.com/fraud/verify-sms`
After you send the verification code, your user enters the code they received and you verify whether it is valid.
### Request Structure
| Key | Required | Type | Constraints | Explanation |
| --------------- | -------- | -------- | ---------------------------- | ------------------------------------------------------- |
| `request_id` | Yes | `String` | Min length 32, Max length 40 | The `request_id` returned from the SMS sending endpoint |
| `received_code` | Yes | `String` | Length 4 | Numerical verification code entered by the user |
### Response Structure
| Key | Type | Explanation |
| ------------- | ------ | -------------------------------------------------------------------------------------------------------------------------------- |
| `is_verified` | `Bool` | `true` if the code was valid. `false` if the code was invalid, already validated, or the wrong code was provided too many times. |
```json theme={"system"}
{
"request_id": "3d50e1584e0946e789e0185c009aaadf",
"received_code": "1234"
}
```
```json theme={"system"}
{
"is_verified": true
}
```
# Proxy Check
Source: https://documentation.idenfy.com/fraud-prevention/proxy-check
Detect proxy, VPN, and Tor usage during identity verification sessions using the iDenfy proxy check API with IPv4 and IPv6 support.
**Requirements**
* **API** key pair
* Service **enabled** (done by iDenfy staff)
* Finances to perform **proxy check**
***
## IP Address Proxy Check
This service checks an IP address and returns its risk level.
**Authorization:** `API key pair`
**Method:** `POST`
**Endpoint:** `https://ivs.idenfy.com/fraud/proxy-check`
### Request Parameters
| Key | Required | Type | Constraints | Explanation |
| ------------ | -------- | -------- | -------------- | ------------------- |
| `ip_address` | Yes | `String` | `ipv4`, `ipv6` | IP address to check |
**Request example:**
```json theme={"system"}
{
"ip_address": "64.236.213.12"
}
```
### Response Values
| Key | Type | Constraints |
| ------------ | -------- | --------------------------------------------------------------- |
| `risk_level` | `String` | `VERY_LOW`, `LOW`, `MEDIUM`, `HIGH`, `VERY_HIGH`, `NOT_CHECKED` |
**Response example:**
```json theme={"system"}
{
"risk_level": "LOW"
}
```
***
**Automatic proxy check on approved verifications**
You can enable this setting in the dashboard. When enabled, a proxy check is performed for each approved ID verification before sending the [result webhook](/kyc/webhooks). The result appears in the `clientIpProxyRiskLevel` field of the webhook's `data` object.
# Risk Assessment
Source: https://documentation.idenfy.com/fraud-prevention/risk-assessment
Score verification sessions for fraud risk using iDenfy AI-powered risk assessment profiles with configurable rules and thresholds.
**Requirements**
* **API** key pair
* RA **credits**
* RA **profile** created via the [dashboard](/guides/dashboard/risk/how-to-setup-and-configure-risk-assessment)
Advanced Customer Risk Assessment Service -- automate KYC, KYB, and AML risk assessments with customizable rules and weights.
***
## How It Works
1. **Create an RA profile** in the [dashboard](/guides/dashboard/risk/how-to-setup-and-configure-risk-assessment) — define sections, questions, and risk weights.
2. **Retrieve the profile** via API to get the section/question keys you need for requests.
3. **Run an RA check** by posting answers (keyed by section and question) against the profile.
4. **Receive a risk score and level** (`VERY_LOW` through `VERY_HIGH`) in the response.
Section and question keys (e.g., `bXUsmLJeMI`, `lib-YHlTleSKmo`) are dynamic — they are generated when you create your RA profile. Always retrieve the profile first to get the correct keys for your requests.
***
## RA Profiles
### Retrieve All RA Profiles
**Authorization:** `API key pair`
**Method:** `GET`
**Endpoint:** `https://ivs.idenfy.com/risk/assessment-profiles/`
**Response example:**
```json theme={"system"}
[
{
"id": "dd121b5c-e3ef-4197-b036-8b7e872f6678",
"name": "RA profile name"
}
]
```
### Retrieve Specific RA Profile
**Authorization:** `API key pair`
**Method:** `GET`
**Endpoint:** `https://ivs.idenfy.com/risk/assessment-profiles/{id}/`
#### Request Parameter
| Key | Required | Explanation | Type |
| ---- | -------- | -------------------------------------------------------- | ------- |
| `id` | Yes | A unique integer value identifying this risk assessment. | Integer |
**Response example:**
```json theme={"system"}
{
"id": "61fbe03e-961c-4c6f-a2cd-801083ddbe0d",
"name": "Name",
"description": "",
"sections": [
{
"key": "bXUsmLJeMI",
"name": "Category",
"weight": 100,
"questions": [
{
"choices": [
{ "key": "XOCgRfvUlu", "title": "Yes" },
{ "key": "QQALQApLKI", "title": "No" }
],
"key": "lib-YHlTleSKmo",
"name": "Is shareholder PEP?",
"title": "Is shareholder PEP?",
"type": "SELECT",
"riskLevels": [],
"riskLevelDefault": "LOW"
},
{
"choices": [],
"key": "lib-AEgWHKDkwF",
"name": "Shareholder residency",
"title": "Shareholder residency",
"type": "COUNTRY",
"riskLevels": [],
"riskLevelDefault": "MEDIUM"
}
]
}
]
}
```
***
## RA Check
**Authorization:** `API key pair`
**Method:** `POST`
**Endpoint:** `https://ivs.idenfy.com/risk/assessment-profiles/{id}/check/`
### Request Parameters
| Parameter | Location | Required | Type | Explanation |
| ---------- | -------- | -------- | ------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `id` | Path | Yes | String | The RA Profile ID for the assessment. Must be a legitimate ID retrieved from [RA profiles](#ra-profiles). |
| `sections` | Body | Yes | Object | Object containing section keys and their corresponding values, filled according to the specific profile. Retrieve profile structure from [RA profiles](#ra-profiles). |
| `name` | Body | Yes | String | Full name of the person that should be checked. |
```json theme={"system"}
{
"sections": {
"bXUsmLJeMI": {
"lib-YHlTleSKmo": {
"value": ["XOCgRfvUlu"]
},
"lib-AEgWHKDkwF": {
"value": ["HU"]
}
}
},
"name": "Matthew Collins"
}
```
```json theme={"system"}
{
"id": "17CRlVRrxUa91BAMvMdeYP",
"name": "Matthew Collins",
"sections": [
{
"key": "bXUsmLJeMI",
"name": "Category",
"weight": 100,
"questions": [
{
"key": "lib-YHlTleSKmo",
"name": "Is shareholder PEP?",
"type": "SELECT",
"title": "Is shareholder PEP?",
"choices": [
{ "key": "XOCgRfvUlu", "title": "Yes" },
{ "key": "QQALQApLKI", "title": "No" }
],
"riskLevels": [],
"riskLevelDefault": "LOW",
"answers": [
{
"key": "XOCgRfvUlu",
"answer": "Yes",
"riskLevel": "LOW",
"riskScore": 2
}
]
},
{
"key": "lib-AEgWHKDkwF",
"name": "Shareholder residency",
"type": "COUNTRY",
"title": "Shareholder residency",
"choices": [],
"riskLevels": [],
"riskLevelDefault": "MEDIUM",
"answers": [
{
"key": "HU",
"answer": null,
"riskLevel": "MEDIUM",
"riskScore": 3
}
]
}
],
"riskScore": 5,
"maxRiskScore": 5
}
],
"riskScore": 100,
"riskLevel": "VERY_HIGH",
"comment": null,
"createdAt": "2024-05-16T08:57:04.654818Z",
"updatedAt": "2024-05-16T08:57:04.654821Z",
"updateRequired": false,
"stateChangeEvent": "INITIAL",
"companyId": null,
"partner": {
"id": 2253,
"created": "2023-10-11T14:09:40.458303Z",
"companyName": "Name Of Environment TESTING",
"environment": "TESTING",
"isActive": true
},
"profile": {
"id": "61fbe03e-961c-4c6f-a2cd-801083ddbe0d",
"name": "Name"
},
"riskLevelChangedBy": null
}
```
***
## Retrieve RA Checks
### Retrieve All RA Checks
**Authorization:** `API key pair`
**Method:** `GET`
**Endpoint:** `https://ivs.idenfy.com/risk/assessments/`
**Response example:**
```json theme={"system"}
{
"count": 2,
"next": null,
"previous": null,
"results": [
{
"id": "17CRlVRrxUa91BAMvMdeYP",
"name": "Matthew Collins",
"riskLevel": "VERY_HIGH",
"createdAt": "2024-05-16T08:57:04.654818Z",
"updateRequired": false
},
{
"id": "F1WQIFa7EdHAvjanJ0pAKc",
"name": "Sarah Robins",
"riskLevel": "VERY_LOW",
"createdAt": "2024-05-07T12:50:03.816388Z",
"updateRequired": false
}
]
}
```
### Retrieve Specific RA Check
**Authorization:** `API key pair`
**Method:** `GET`
**Endpoint:** `https://ivs.idenfy.com/risk/assessments/{id}/`
**Response example:**
```json theme={"system"}
{
"id": "Fi6cT2FO0AoDYyPljKhM41",
"name": "Matthew Collins",
"sections": [
{
"key": "OxTPlZAfHZ",
"name": "Second category",
"weight": 100,
"questions": [
{
"key": "lib-NObsdcmGfe",
"name": "Is shareholder PEP?",
"type": "SELECT",
"title": "Is shareholder PEP?",
"choices": [
{ "key": "HAwWshlziF", "title": "Yes" },
{ "key": "WuZBsvsyWC", "title": "No" }
],
"riskLevels": [],
"riskLevelDefault": "HIGH",
"answers": []
},
{
"key": "lib-tRdubSLIVr",
"name": "Country of Incorporation",
"type": "COUNTRY",
"title": "Country of Incorporation",
"choices": [],
"riskLevels": [],
"riskLevelDefault": "LOW",
"answers": []
}
],
"riskScore": 0,
"maxRiskScore": 0
}
],
"riskScore": 0,
"riskLevel": "VERY_LOW",
"comment": null,
"createdAt": "2024-05-06 09:45:02.405602+00:00",
"updatedAt": "2024-05-06 09:45:02.405609+00:00",
"updateRequired": false,
"stateChangeEvent": "INITIAL",
"companyId": null,
"partner": {
"id": 670,
"created": "2022-08-08T06:37:32.765693Z",
"companyName": "Mantas Tech",
"environment": "DEVELOPMENT",
"isActive": true
},
"profile": {
"id": "dd121b5c-e3ef-4197-b036-8b7e872f6678",
"name": "RA profile name"
},
"riskLevelChangedBy": null
}
```
***
## Update Existing RA Check
**Authorization:** `API key pair`
**Method:** `POST`
**Endpoint:** `https://ivs.idenfy.com/risk/assessments/{assessment-id}`
### Request Parameters
| Parameter | Location | Required | Type | Explanation |
| --------------- | -------- | -------- | ------ | --------------------------------------------------------------------------------------------------------------------------------------------- |
| `assessment-id` | Path | Yes | String | The ID of the RA check. Must be a legitimate ID received from [retrieving all RA checks](#retrieve-ra-checks). |
| `sections` | Body | Yes | Object | Section keys from the questionnaire. Required if answers are being changed. Structure must follow the [RA check request](#ra-check) format. |
| `name` | Body | Yes | String | Full name of the person being checked. Required if the name is being changed. Structure must follow the [RA check request](#ra-check) format. |
The request body (containing `sections` and `name`) is only needed if modifying existing answers or details.
```json theme={"system"}
{
"sections": {
"bXUsmLJeMI": {
"lib-YHlTleSKmo": {
"value": ["QQALQApLKI"]
},
"lib-AEgWHKDkwF": {
"value": ["EE"]
}
}
},
"name": "Matthew Collins"
}
```
```json theme={"system"}
{
"id": "17CRlVRrxUa91BAMvMdeYP",
"name": "Matthew Collins",
"sections": [
{
"key": "bXUsmLJeMI",
"name": "Category",
"weight": 100,
"questions": [
{
"key": "lib-YHlTleSKmo",
"name": "Is shareholder PEP?",
"type": "SELECT",
"title": "Is shareholder PEP?",
"choices": [
{ "key": "XOCgRfvUlu", "title": "Yes" },
{ "key": "QQALQApLKI", "title": "No" }
],
"riskLevels": [],
"riskLevelDefault": "LOW",
"answers": [
{
"key": "XOCgRfvUlu",
"answer": "Yes",
"riskLevel": "LOW",
"riskScore": 2
}
]
},
{
"key": "lib-AEgWHKDkwF",
"name": "Shareholder residency",
"type": "COUNTRY",
"title": "Shareholder residency",
"choices": [],
"riskLevels": [],
"riskLevelDefault": "MEDIUM",
"answers": [
{
"key": "HU",
"answer": null,
"riskLevel": "MEDIUM",
"riskScore": 3
}
]
}
],
"riskScore": 5,
"maxRiskScore": 5
}
],
"riskScore": 100,
"riskLevel": "VERY_HIGH",
"comment": null,
"createdAt": "2024-05-16 08:57:04.654818+00:00",
"updatedAt": "2024-05-16 08:57:04.654821+00:00",
"updateRequired": false,
"stateChangeEvent": "INITIAL",
"companyId": null,
"partner": {
"id": 2253,
"created": "2023-10-11T14:09:40.458303Z",
"companyName": "Name Of Environment TESTING",
"environment": "TESTING",
"isActive": true
},
"profile": {
"id": "61fbe03e-961c-4c6f-a2cd-801083ddbe0d",
"name": "Name"
},
"riskLevelChangedBy": null
}
```
# Choosing Your Integration
Source: https://documentation.idenfy.com/guides/choosing-integration
Compare iDenfy API, SDK, iFrame, redirect, and no-code integration methods side by side to find the best approach for your use case.
## Integration Methods at a Glance
| Method | Best for | Time to integrate | UI control | Platform |
| -------------- | ----------------------- | ----------------- | ------------------------- | ------------------------ |
| **Redirect** | Fastest setup | \~1 hour | iDenfy-hosted | Web |
| **iFrame** | Embedded web experience | \~2 hours | Embedded, limited styling | Web |
| **Mobile SDK** | Native mobile apps | \~1 day | Full UI customization | iOS, Android |
| **Direct API** | Full custom flows | \~1 week | Complete control | Any |
| **No-code** | Non-technical teams | \~15 minutes | Plugin-configured | Shopify, WordPress, etc. |
***
## Decision Tree
**Yes** → Use the [Mobile SDK](/sdks/overview). It provides native performance, camera access, and liveness detection optimized for mobile.
**No** → Continue to Step 2.
**Yes** → Use the [Direct API](/kyc/direct-processing). You control every screen and interaction. Most complex, but maximum flexibility.
**No** → Continue to Step 3.
**Yes** → Use the [iFrame](/kyc/iframe-redirect). Embeds the verification flow in your page. Users never leave your domain.
**No** → Use the [Redirect](/kyc/iframe-redirect). Simplest option — redirect users to iDenfy's hosted verification page and get results via webhook.
***
## Detailed Comparison
**How it works:** Create a session → redirect user to `redirectUrl` → receive webhook.
**Pros:**
* Fastest to implement (one API call)
* iDenfy handles all UI, camera, liveness
* Always up to date — no SDK version management
* Works on any device/browser
**Cons:**
* User leaves your site during verification
* No UI customization
* Less seamless user experience
[Redirect documentation →](/kyc/iframe-redirect)
**How it works:** Create a session → embed iFrame with `redirectUrl` → receive webhook.
**Pros:**
* User stays on your site
* Simple implementation
* Auto-updated UI
**Cons:**
* Limited styling (CSS overrides only)
* Camera permissions can be tricky in iFrames
* Some browsers restrict third-party iFrame features
[iFrame documentation →](/kyc/iframe-redirect)
**How it works:** Create session → pass `authToken` to SDK → receive callback + webhook.
**Pros:**
* Native camera and NFC access
* Full UI customization (colors, fonts, screens)
* Optimized liveness detection
* Offline capability for some steps
**Cons:**
* Requires SDK version management
* Separate Android/iOS implementations
* Larger app size (\~15-30MB)
[Android SDK →](/sdks/android/quickstart) | [iOS SDK →](/sdks/ios/quickstart)
**How it works:** Your app handles document capture → send images via API → receive webhook.
**Pros:**
* Complete UI/UX control
* Works on any platform
* Can integrate into existing flows
**Cons:**
* Most development effort
* You handle camera, image quality, UX
* Must implement error handling for all edge cases
[Direct processing →](/kyc/direct-processing)
**How it works:** Install plugin → configure in admin panel → verification works.
**Pros:**
* No coding required
* Quick setup (minutes)
* Pre-built for popular platforms
**Cons:**
* Limited to supported platforms
* Less customization
* Plugin update dependency
[Integrations →](/integrations/overview)
# Data Residency
Source: https://documentation.idenfy.com/guides/compliance/data-residency
Learn where iDenfy processes and stores verification data across EU data centers and explore available data residency configuration options.
## Processing Locations
iDenfy processes verification data in **EU-based data centers**, ensuring compliance with European data protection regulations.
| Data type | Processing location | Storage location |
| ------------------------- | ------------------- | ---------------- |
| Document images | EU | EU |
| Biometric data (liveness) | EU | EU |
| Extracted personal data | EU | EU |
| AML screening data | EU | EU |
| API logs | EU | EU |
## Data Residency Options
For customers with specific data residency requirements:
| Option | Description | Availability |
| ------------------ | ------------------------------------------------------- | --------------------------------------------------------------- |
| **EU (Default)** | All data processed and stored within the European Union | All customers |
| **Custom regions** | Data processing in specific jurisdictions | Enterprise plans — [book a demo](https://idenfy.com/demo-page/) |
Data residency configurations apply to data at rest. Transient processing may involve EU-based infrastructure regardless of residency configuration. Contact your account manager for detailed data flow documentation.
## Sub-Processors
iDenfy uses a limited set of sub-processors for service delivery. A current list of sub-processors is available upon request as part of the Data Processing Agreement (DPA).
All sub-processors are:
* Contractually bound to equivalent data protection obligations
* Located within the EU/EEA, or covered by Standard Contractual Clauses
* Subject to regular security assessments
## Certifications
| Certification | Scope |
| -------------- | ------------------------------------------- |
| SOC 2 Type II | Security, availability, and confidentiality |
| ISO 27001 | Information security management |
| GDPR compliant | EU data protection regulation |
Need a Data Processing Agreement, sub-processor list, or security questionnaire response? Contact **[dpo@idenfy.com](mailto:dpo@idenfy.com)** or your account manager.
# Compliance
Source: https://documentation.idenfy.com/guides/compliance/overview
Review iDenfy certifications, security standards, and regulatory compliance including ISO 27001, SOC 2 Type II, eIDAS, and GDPR readiness.
Trust is the foundation of identity verification. iDenfy is built to meet the strictest regulatory and security standards so you can verify identities with confidence.
***
## Certifications and Standards
### ISO/IEC 27001:2022
Continuously certified since 2020. iDenfy holds an ISO/IEC 27001:2022 certificate (No. 1512120135) issued by TÜV Thüringen under DAkkS accreditation. This certificate covers the development and provision of identity and business verification, fraud prevention and Anti-Money Laundering software. Our most recent surveillance audit found zero non-conformities.
### SOC 2 Type II
Independently audited for security, availability and confidentiality. iDenfy's SOC 2 Type II report covers a full 12-month examination period, certified by House of CPA. The report confirms that our controls are properly designed and operate effectively over time. It provides customers and their auditors with documented assurance on how we handle and store data in production.
### eIDAS Conformity
Certified for remote identity proofing under EU regulation. iDenfy holds an eIDAS Declaration of Conformity (No. eIDAS250020) issued by the Electrotechnical Testing Institute (EZU) in Prague, covering remote ID proofing using video identification assessed against Regulation (EU) No. 910/2014, ETSI TS 119 461, and ISO/IEC 30107-3:2023. This makes iDenfy one of the few identity verification providers certified to the highest European standards for electronic identification and trust services.
### iBeta / ISO 30107
Liveness and presentation-attack-detection tested. iDenfy's liveness checks and anti-spoofing analysis are independently tested under iBeta and ISO/IEC 30107-3 presentation-attack-detection (PAD) methodology, covering both Level 1 (print and screen attacks) and Level 2 (mask and deepfake-grade attacks). See [SLA & Uptime](/guides/compliance/sla-uptime) for testing details.
### PCI-DSS v4.0.1
Card capture and card image processing for [Bank Card Verification](/guides/dashboard/features/bank-card-verification) run in a dedicated environment certified to PCI-DSS v4.0.1, fully separated from the rest of the platform. No card imagery is retained once processing completes.
### GDPR
Fully compliant with the EU General Data Protection Regulation (2016/679). Designated Data Protection Officer, documented Data Processing Agreement (DPA), and all personal data stored within the EU.
### Additional Regulatory Alignment
Beyond GDPR, iDenfy's compliance program aligns with CCPA, AML/KYC due diligence obligations, the 5th and 6th EU Anti-Money Laundering Directives (AMLD5/6), PSD2, and FATF recommendations. See [Mapping Features to Requirements](#mapping-features-to-requirements) below for how specific features support each framework.
### Cyber Insurance
All iDenfy products are backed by cyber insurance and Technology Errors & Omissions coverage, underwritten at Lloyd's of London.
***
## How iDenfy Handles Compliance
### Data Processing
| Area | How we handle it |
| ------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Data minimization** | Only required data fields are collected per your verification configuration. We process only what is necessary for the verification purpose. |
| **Processing locations** | All data is processed and stored on Amazon AWS Europe (Dublin, Ireland). Data is not transferred outside the EU unless Standard Contractual Clauses are in place. |
| **Data residency** | EU-based infrastructure by default. Configurable data residency options available upon request. |
| **Retention** | Configurable retention periods with automatic deletion. Default retention follows regulatory requirements (up to 10 years for AML-related records). Customer accounts are removed 60 days after closure. Bank card imagery is an exception and is never retained after processing. |
| **Sub-processors** | All sub-processors are documented, contractually bound, and subject to equivalent data protection obligations. Amazon AWS operates under a carve-out approach in our SOC 2 report. |
| **Data subject requests** | Responded to within 30 days per GDPR. Customers can export their data at any time before account closure. |
### Audit Trail
Every verification produces a complete audit trail including:
* Timestamp of each verification step
* Document images and extracted data (OCR, MRZ)
* Liveness check results with anti-spoofing analysis
* Face matching results (document photo vs. selfie)
* AML screening results (PEP, sanctions, adverse media)
* Manual review decisions by in-house KYC experts (if applicable)
* Downloadable PDF verification reports for your compliance records
All audit logs are protected with read-only access, file integrity monitoring, and retention of up to 10 years for critical records.
### Security Measures
| Measure | Detail |
| ---------------------------- | ---------------------------------------------------------------------------------------------------------------------------------- |
| **Encryption in transit** | TLS 1.2-1.3 on all connections |
| **Encryption at rest** | AES-256-GCM on all stored data (databases, object storage, volumes, backups), with additional safeguards applied to biometric data |
| **Key management** | Managed key service with automatic rotation at least every 12 months |
| **Callback signing** | [Webhook payloads signed](/security/callback-signing) to ensure integrity and authenticity |
| **API access control** | [IP whitelisting](/security/ip-whitelisting) available for API access restriction |
| **Web Application Firewall** | WAF with anti-DDoS protection |
| **Intrusion detection** | Endpoint detection and response (EDR) with cloud-native threat monitoring |
| **Network security** | Default deny-all firewall rules; only business-justified traffic permitted |
| **Vulnerability management** | Continuous automated scanning and regular penetration testing |
| **Vulnerability SLAs** | Critical: 48 hours. High: 7 days. Medium: 1 month |
### Reliability
* Role-based access control with mandatory multi-factor authentication (MFA)
* Regular penetration testing (see Vulnerability Management above)
* 24/7 infrastructure and security monitoring
* 99.9% uptime SLA — see [SLA & Uptime](/guides/compliance/sla-uptime) for full details and service credits
### Incident Response
* Dedicated Incident Response Team (CEO, Security Officer, CTO)
* Response SLAs from immediate (catastrophic) to 2-3 business days (insignificant)
* Client breach notification within 8-24 hours of occurrence
* Data Protection Authority notification within 72 hours
* Root cause analysis and post-incident review after every incident
* Incident Response Plan tested annually
* Zero security incidents in the past 12 months
### Secure Development
* Agile/Scrum methodology with security integrated into every sprint
* All code reviewed via pull requests by engineers trained in secure coding
* Reviewed against OWASP Top 10 and SANS attack patterns
* Vulnerability scanning before every production deployment
* Separate development, staging, and production environments
* Production data never used in test/dev environments
* Annual secure coding training (OWASP principles) for all engineers
***
## Data Protection Roles
iDenfy acts as a **Data Processor** when performing identity verification on behalf of clients. Your organization remains the Data Controller and determines the purposes and legal bases for processing.
iDenfy acts as a **Data Controller** only for its own website, marketing, and recruitment activities.
A standard Data Processing Agreement (DPA) is available for all customers.
***
## Mapping Features to Requirements
| Requirement | iDenfy Feature | Relevant Framework |
| ----------------------------- | ---------------------------------------------------- | ------------------------------------ |
| Customer identification | [ID Verification (KYC)](/kyc/overview) | AML 5/6AMLD, MiCA, PSD2 |
| Beneficial owner verification | [Business Verification (KYB)](/kyb/overview) | AML 5/6AMLD, Company Law |
| Sanctions & PEP screening | [AML Screening](/aml/overview) | AML 5/6AMLD, OFAC, EU Sanctions |
| Ongoing monitoring | [AML Monitoring](/aml/monitoring-create) | AML 5/6AMLD |
| Liveness / biometric check | [3D Liveness Detection](/kyc/overview) | eIDAS (Level of Assurance), PSD2 SCA |
| Proof of address | [AI PoA Verification](/fraud-prevention/ai-poa) | AML CDD, Gambling regulations |
| Data retention & deletion | [Identification Deletion](/kyc/deletion) | GDPR Art. 17 |
| Fraud risk assessment | [Risk Scoring](/fraud-prevention/risk-assessment) | PSD2, Internal risk policies |
| Re-authentication | [Face Authentication](/face-authentication/overview) | PSD2 SCA, eIDAS |
***
## Regulatory Framework Guides
Data protection for processing EU customer data. Covers data minimization, retention, right to erasure, and cross-border transfers.
Anti-Money Laundering customer due diligence requirements for financial institutions.
EU electronic identification and trust services regulation.
Sector-specific requirements: fintech (MiCA, PSD2), crypto (Travel Rule), gambling.
Need a Data Processing Agreement (DPA), SOC 2 report, or security questionnaire response? Contact **[dpo@idenfy.com](mailto:dpo@idenfy.com)** or your account manager.
# SLA and Uptime
Source: https://documentation.idenfy.com/guides/compliance/sla-uptime
Review iDenfy Service Level Agreement details including 99.9% API uptime targets, measurement methodology, and service credit policies.
## Service Availability
| Service | Target uptime | Measurement period |
| ------------------------- | ----------------------- | ------------------ |
| ID Verification API | 99.9% | Monthly |
| Business Verification API | 99.9% | Monthly |
| AML Screening API | 99.9% | Monthly |
| Dashboard | 99.5% | Monthly |
| Mobile SDKs | Dependent on API uptime | — |
Uptime is calculated as: **(Total Minutes - Downtime) / Total Minutes x 100**
Uptime is measured as the percentage of time the service responds to API requests with non-5xx status codes, excluding scheduled maintenance windows, customer-caused issues, force majeure, and third-party service outages.
***
## Service Credits
If iDenfy fails to meet the uptime commitment, you are entitled to service credits:
| Monthly Availability | Service Credit |
| ----------------------------------- | ------------------- |
| Below 99.90% and at or above 99.50% | 5% of monthly fees |
| Below 99.50% and at or above 99.00% | 10% of monthly fees |
| Below 99.00% | 20% of monthly fees |
* **Credit cap:** 20% of monthly fees for affected services
* **Claim deadline:** Written request within 30 calendar days of the incident
* Credits are non-transferable and cannot be exchanged for cash
* Full SLA terms: [idenfy.com/agreement/#conditions](https://idenfy.com/agreement/#conditions)
***
## Verification Performance
| Metric | Target |
| ------------------------- | ----------------------------- |
| Automated data processing | 0.02 seconds |
| User journey completion | \~30 seconds |
| Manual review turnaround | On average takes 3 min (24/7) |
| Auto approval rate | \~89% fully automatic |
| With manual review | Up to 99% approval |
| Implementation timeline | 1 week or less |
### Verification Accuracy
| Document type | Accuracy | False Positive Rate | False Negative Rate |
| ---------------- | ------------ | ------------------- | ------------------- |
| ID cards | 99.8% | 0.2% | 1.8% |
| Driving licenses | 99.4% | 0.6% | 5.5% |
| Face matching | Above 99.99% | FAR below 0.01% | FRR below 2% |
Face matching tested to iBeta Level 1 and Level 2 standards.
***
## Scheduled Maintenance
* Maintenance window: **01:00-07:00 (GMT+3)**
* Customers notified at least **24 hours** in advance
* Scheduled during low-traffic periods
* Zero-downtime deployments used where possible
* Emergency maintenance may occur outside scheduled windows with immediate notification
***
## Incident Response
### Priority Levels
| Priority | Description | Response time |
| ---------- | ----------------------------------------------------------------------- | ----------------------------------------------- |
| **High** | Service fully unavailable or system malfunction making tasks impossible | 30 minutes (working hours), 2 hours (off-hours) |
| **Normal** | Major feature degraded but service still usable | Standard support during working hours |
| **Low** | Minor issue with no significant service impact | Best effort |
### Security Incident Response
For security incidents, a dedicated Incident Response Team follows escalated SLAs:
| Severity | Response time |
| ---------------- | ------------- |
| **Catastrophic** | Immediate |
| **Major** | 2-4 hours |
| **Moderate** | 4-6 hours |
| **Minor** | 6-12 hours |
* Client breach notification: **Within 8-24 hours** of occurrence
* Impact assessment provided: **Within 24 hours**
* Root cause analysis conducted after every incident
* Incident Response Plan tested annually
### Recovery Objectives
| Component | RPO (Recovery Point Objective) | RTO (Recovery Time Objective) |
| ------------------------- | -------------------------------- | ----------------------------- |
| Core platform databases | 24 hours | 4 hours |
| Blob/binary storage | 0 hours (continuous replication) | 72 hours |
| Infrastructure durability | 99.999999999% (eleven 9s) | — |
All backups are encrypted to the same standard as production data (AES-256-GCM) and monitored via audit logging.
***
## Status Monitoring
Monitor iDenfy service status at **[status.idenfy.com](https://status.idenfy.com/)**.
Subscribe to status updates for real-time incident notifications via email or webhook.
***
## Monthly Reporting
All customers receive a monthly report covering:
* Verification preventions and outcomes
* Service malfunctions (date, time, duration, explanation)
* Uptime statistics for the billing period
***
## Support Channels
| Channel | Availability | Best for |
| -------------------------------------------------------------------------------------------- | ---------------------------------- | ---------------------------------------- |
| [Jira Service Desk](https://idenfy-ivs.atlassian.net/servicedesk/customer/portal/1) | 24/7 ticket submission | Technical issues, bugs, API questions |
| Account manager | Business hours (09:00-18:00 GMT+3) | Contract, features, escalation |
| Enterprise Slack channel | Business hours | Dedicated support for enterprise clients |
| [techsupport@idenfy.com](mailto:techsupport@idenfy.com) | Business hours | Technical support requests |
| [info@idenfy.com](mailto:info@idenfy.com) | Business hours | General inquiries |
| [Sign up](https://idenfy.com/pricing-plans-v4/) / [Book demo](https://idenfy.com/demo-page/) | — | New accounts, pricing |
For production-critical issues, contact your account manager directly for fastest escalation. Include your `scanRef` or API key identifier in any support request. Free business consultations are available during working hours for all customers.
***
## Data Retention by Plan
| Plan | Retention period |
| ------- | ------------------------------------------------------------ |
| Startup | 3 years |
| Silver | 5 years |
| Gold | 8 years |
| Custom | Configurable (immediate deletion, 30 days, or up to 8 years) |
# Age Estimation Billing
Source: https://documentation.idenfy.com/guides/dashboard/age-estimation/billing
How iDenfy bills age estimation: the dedicated Age Estimation finances it draws on, when each estimation fee applies, and what the document step-up costs.
Age Estimation is billed against **Age Estimation finances** -- allocated to your account separately from your general funds.
* Both the age-estimation fee and the document step-up fee draw on those finances. The step-up is charged as an **Age Estimation Document Scan**, so your general document scan credits are never used and it does not appear against your document scan usage.
* **Without available Age Estimation finances the feature is unavailable**, no matter how much general balance the account holds -- session creation is rejected.
* The age-estimation fee is charged once per terminal result, on both `COMPLETED` and `FAILED`. Sessions that merely expire are not charged.
* The Age Estimation Document Scan fee follows standard document verification billing: charged when the document check completes, and on failure only if your account is configured to charge all completed verifications.
* Age Estimation finances can carry their own expiration, independent of your other funds.
At session creation your Age Estimation finances are pre-checked for both applicable fees; if they can't cover the session the request is rejected -- see [error responses](/age-estimation/create-session#errors) for how this surfaces on the API.
# Age Estimation Dashboard
Source: https://documentation.idenfy.com/guides/dashboard/age-estimation/dashboard
Create age estimation sessions from the iDenfy dashboard and browse results with status filter groupings, session detail views, and document step-up links.
Age Estimation sessions created via the API or the dashboard can be browsed from the dashboard's Age Estimation section. Viewing session data requires the **View age estimation data** permission, which is enabled for all partners by default; creating sessions requires the `MANAGE_AGE_ESTIMATION` permission on your manager account.
For what the statuses and outcomes below mean, see the [Age Estimation Overview](/guides/dashboard/age-estimation/overview#statuses-and-outcomes).
## Creating a Session
**Create new** on the Age Estimation page opens the **New estimation** form, split across two tabs: **General settings** and **Verification redirects**. Between them you set the age requirement, when to fall back to ID verification, and how each session behaves.
### General Settings
| Setting | Description |
| ----------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Minimum age** | The age a person must reach to pass the check, for example 18. Accepts 1--120. |
| **Safety margin (years)** | How close an estimate can be to the minimum age before it counts as uncertain, rather than a clear pass or fail. A wider margin marks more results as uncertain, and what happens to them then depends on the ID verification setting below. With a minimum age of 18 and a margin of 2, estimates from 16 to 20 count as uncertain. Accepts 0--20, and cannot exceed the minimum age. |
| **ID verification for uncertain results** | When on, an uncertain result asks the person to scan an ID document, and the photo in the document is compared with their selfie to confirm their age. The check is charged as an Age Estimation Document Scan from your [Age Estimation finances](/guides/dashboard/age-estimation/billing). Turn it off to end the session as **Uncertain** instead. |
| **Retry limit** | How many times a person can retake the selfie after a technical problem, such as poor lighting, before the check fails. Accepts 1--3. |
| **Save selfie photo** | Keep the selfie so you can review it or check accuracy later. Turn it off to store no image -- and if ID verification runs, the user and document data aren't saved either. |
| **Link expiry time** | How long the estimation link stays valid after it's created, chosen from a preset list. |
### Verification Redirects
| Setting | Description |
| ----------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Success / Underage / Uncertain redirect URL** | Where to send the person after each outcome. Leave empty to show the standard result screen. |
| **Webhook URL** | Where to send the final result. Falls back to your account's Age Estimation notification URL when empty -- see [Age Estimation Webhooks](/age-estimation/webhooks). |
**Create** submits both tabs at once -- the session is created with everything entered across General settings and Verification redirects. The verification URL then appears in the bar at the bottom of the page, with a button to copy it.
## Session List
Sessions are grouped by their final status:
| Group | Meaning |
| ------------------- | ------------------------------------------------------------------------------------------ |
| **Results** | Completed sessions with outcome **Success** or **Underage**. |
| **Needs Attention** | Outcome **Uncertain** / **Face Mismatch** / **Attempts Exceeded**, or a technical failure. |
| **In Progress** | Awaiting or undergoing capture, not yet expired. |
| **Expired** | Lapsed without a result. |
Each row shows the session ID, its status and outcome, the estimated age, and the creation date. Sessions can be filtered by client ID and creation date, sorted by creation date, and searched by session ID or client reference. A session that escalated to a document check can also be found by its step-up scan reference.
## Session Detail
Opening a session shows:
* **Result** -- status, outcome, and the estimated age.
* **Settings** -- the session ID, when it was created and when it expires, plus the session's configuration: minimum age, safety margin, step-up mode, retry limit, and whether the selfie was saved.
* **Media** -- the analyzed selfie, when saving photos was enabled for that session. If **Save selfie photo** was off, **Selfie storage is off** is shown in its place.
* **ID verification** -- if the session escalated to a document check, a block showing the check method, its result, and when it ran. That verification is billed as an Age Estimation Document Scan from your [Age Estimation finances](/guides/dashboard/age-estimation/billing), so it won't appear against your document scan usage. With **Save selfie photo** on, the block links through to the underlying identity verification, so you can review the document and any fraud flags raised on it. With it off, the block shows the check details only and does not link through -- the document and personal data were used to establish the age and nothing was stored. Such verifications also stay out of the identity verification review list and are never sent to manual review.
* **Estimated age** -- not shown when the age came from a document step-up rather than the AI estimate, since the document gives an exact date of birth.
Fields that have no value yet -- on a session that is still pending, or one that expired without a result -- are shown as **—**.
A step-up document that was accepted but flagged for possible fraud still resolves the age estimation session normally (**Success** / **Underage**). The fraud flag is not shown on the age estimation session itself -- open the linked identity verification to review it.
# Age Estimation Overview
Source: https://documentation.idenfy.com/guides/dashboard/age-estimation/overview
How iDenfy's selfie-based age estimation works: the session flow, document step-up outcomes, and the statuses and outcomes a session can resolve to.
Looking for **Age Verification** instead? That's a different, simpler feature -- a min/max age restriction applied during a full KYC verification, based on the scanned document's date of birth. See [Age Verification](/guides/dashboard/kyc/age-verification).
Age Estimation checks whether an end user meets a minimum age requirement using a single selfie -- no document scan required in the common case. It's suited for age-gating use cases (e.g. alcohol, gambling, adult content) where you need a fast yes/no decision without putting every user through a full identity verification.
When the AI model isn't confident enough to decide on its own, the session can automatically step up to a document check, which reads an exact date of birth from the ID.
Sessions can be created and reviewed [from the dashboard](/guides/dashboard/age-estimation/dashboard), or created programmatically -- see [API integration](#api-integration). Charges draw on finances allocated to Age Estimation; see [Age Estimation Billing](/guides/dashboard/age-estimation/billing).
Results reach your systems through the [result webhook](/age-estimation/webhooks). To list past estimations, filter them, or inspect an individual session, sign in to the dashboard -- there is no Partner API endpoint for retrieving sessions.
## How a Session Flows
You create a session with the desired settings. You get back a verification link and an expiry time.
You send the end user to the verification link; they complete the selfie on the hosted capture page.
The AI produces an age estimate:
* Confident and above the minimum age → **Success**.
* Confident and below the minimum age → **Underage**.
* Not confident (within the safety margin) → **step-up**, if enabled:
* document step-up enabled → a document check is created and the age is read from the ID's date of birth (see [Step-Up Outcomes](#step-up-outcomes)).
* document step-up disabled → the session resolves as **Uncertain**.
When the session finishes, iDenfy sends a result notification to your webhook (if set), redirects the user to the matching redirect URL (if configured), and shows the outcome in the dashboard.
## Step-Up Outcomes
A document step-up ends in one of the following ways. Note that the document's date of birth is an **exact** age, so it is compared directly against the minimum age -- the safety margin applies only to the fuzzy AI estimate and is not used here.
| Document check result | What happens |
| ---------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Document accepted** | The date of birth is read and the ID portrait is compared against the capture selfie. On a match the session resolves as **Success** (age ≥ minimum) or **Underage**. |
| **Document accepted but flagged for possible fraud** | Treated the same as accepted: the document was read successfully, so its age is used and the session resolves as **Success** or **Underage**. The fraud flag is retained by iDenfy for review and is **not** currently reported in the result notification. |
| **Document rejected** | The age could not be established from the ID, so the session resolves as **Uncertain**. This is terminal -- the end user is not re-prompted for another ID. |
| **Face did not match** | The ID does not appear to belong to the person who took the selfie; the session resolves as **Face Mismatch**. This is terminal. |
| **Step-up abandoned or lapsed** | The end user backed out, or the document session expired before completion. The session stays live and the end user can start a step-up again, subject to the retry limit. |
**Fraud-flagged documents are accepted.** iDenfy may flag a document session for possible fraudulent activity even when the document itself was read and the face matched. Because the purpose of the step-up is to establish the age, such a session yields a normal **Success** / **Underage** result rather than **Uncertain**. If your own risk policy needs to act on the fraud signal, contact iDenfy -- surfacing it in the result notification is planned but not yet available.
## Statuses and Outcomes
A session has a lifecycle **status**, and once it finishes, an **outcome**. The values below are what the API returns; the dashboard shows the same values as labels.
**Status**
| Value | Meaning |
| ------------ | --------------------------------------------------------------------- |
| `PENDING` | Created, awaiting/undergoing capture. |
| `PROCESSING` | Reserved lifecycle state. |
| `COMPLETED` | Finished with a definitive result. |
| `FAILED` | Finished unsuccessfully (technical failure or unrecoverable outcome). |
| `EXPIRED` | Session lapsed without a terminal result. |
**Outcome**
| Value | Dashboard label | Meaning |
| ------------------- | ----------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `SUCCESS` | Success | Meets the minimum age. |
| `UNDERAGE` | Underage | Below the minimum age. |
| `UNCERTAIN` | Uncertain | Inconclusive: an uncertain estimate with the step-up disabled, a document step-up whose document was rejected, or a technical failure during the step-up. |
| `FACE_MISMATCH` | Face Mismatch | Step-up document face did not match the selfie. |
| `ATTEMPTS_EXCEEDED` | Attempts Exceeded | Retry limit reached without a decision. |
## API Integration
Create a session from your backend, with the full request schema and error responses.
Receive the outcome as soon as a session finishes.
# AML Available Sanctions Lists
Source: https://documentation.idenfy.com/guides/dashboard/aml/aml-available-sanction-lists
Browse the complete list of global sanctions, PEP, and watchlist databases screened by iDenfy AML, organized by region and country.
iDenfy screens against sanctions lists from every major regime worldwide. Below is the full list organized by region.
***
## Americas
| Country | Source | List |
| ----------------------- | ------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Argentina** | Ministry of Justice and Human Rights | Public Registry of Individuals and Entities linked to Acts of Terrorism (REPET) |
| **Canada** | Global Affairs, Government of Canada | Sanctions under UN Act, Special Economic Measures Act, Justice for Victims of Corrupt Foreign Officials Act, Freezing Assets of Corrupt Foreign Officials Act |
| **Canada** | Public Safety, Government of Canada | Canadian Government Sanctions (Listed Terrorist Entities) |
| **Panama** | Financial Analysis Unit (UAF) | UAF National Sanctions List |
| **Trinidad and Tobago** | Financial Intelligence Unit (FIU) | Notices and High Court Orders Under Anti-terrorism Act |
| **USA** | OFAC | SDN List (30+ programs), non-SDN lists (SSI, FSE, NS-PLC, CAPTA, NS-MBS, NS-CMIC) |
| **USA** | Department of State | Section 7031(c) Designations, Foreign Terrorist Organizations, CAATSA Section 231(e), Bureau of International Security Nonproliferation Sanctions |
***
## Asia-Pacific
| Country | Source | List |
| --------------- | ------------------------------------ | ------------------------------------------------------------------ |
| **Australia** | Australian National Security | Listed Terrorist Organisations |
| **Australia** | Dept of Foreign Affairs and Trade | Autonomous Sanction List, Consolidated List |
| **Bangladesh** | Central Bank | Domestic Sanctions List |
| **China** | Ministry of Foreign Affairs | Chinese Ministry of Foreign Affairs |
| **China** | Ministry of Public Security | Terrorist List |
| **China** | Taiwan Affairs Office | Anti-Secession Law |
| **India** | Ministry of Home Affairs | Banned Organisations, Designated Terrorists, Unlawful Associations |
| **Indonesia** | Financial Transaction Reports Centre | DTTOT, Proliferation WMD List |
| **Japan** | Ministry of Finance | Economic Sanctions |
| **Japan** | National Public Safety Commission | Terrorist Lists |
| **Japan** | METI | METI List, Ukraine Response List |
| **South Korea** | Financial Services Commission | KOFIU Financial Restrictions |
| **South Korea** | Ministry of Economy and Finance | Payment Guidelines for International Peace |
| **Malaysia** | Ministry of Home Affairs | Ministry of Home Affairs List |
| **New Zealand** | Police Force | Designated Terrorists |
| **New Zealand** | Ministry of Foreign Affairs | Russia Sanctions Regulations 2022 |
| **Pakistan** | NACTA | Proscribed Persons and Entities |
| **Philippines** | Anti-Money Laundering Council | Sanctions Freeze Orders, Listed Terrorist Organizations |
| **Singapore** | Ministry of Home Affairs | Ministry of Home Affairs List |
| **Singapore** | Monetary Authority | Designated Individuals and Entities |
| **Sri Lanka** | Ministry of Defence | Sanctions on Terrorism and Terrorism Financing |
| **Taiwan** | Ministry of Justice | Counter-Terrorism Financing Act Sanctions |
| **Thailand** | Anti-Money Laundering Office | Designated Lists |
| **Vietnam** | Ministry of Public Security | Terrorism-related Organisations and Individuals |
***
## Europe
| Country | Source | List |
| --------------- | ---------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- |
| **Belgium** | Federal Public Service Finance | National Financial Sanctions |
| **Bulgaria** | Council of Ministers | Financing of Terrorism Act List |
| **Czechia** | Ministry of Foreign Affairs | National Sanctions List |
| **EU** | European Union Council | 55+ programs covering Afghanistan, Belarus, China, Iran, Russia, Syria, Ukraine, terrorism, cyber, human rights, and more |
| **France** | Ministry of Economy/Finance | DG Treasury Restrictive Measures |
| **Georgia** | Government | Otkhozoria-Tatunashvili List |
| **Kazakhstan** | Financial Monitoring Committee | Terrorism and Extremism Financing List |
| **Kyrgyzstan** | State Service of Financial Intelligence | Consolidated Sanctions List |
| **Latvia** | Financial Intelligence Unit | Sanction Lists |
| **Lithuania** | Ministry of the Interior | Financial Crime Investigation Service, Migration Travel Ban |
| **Malta** | Sanctions Monitoring Board | Sanctioned Entities |
| **Monaco** | Minister of State | National Asset Freezing List |
| **Netherlands** | Dutch Government | National Terrorism Sanctions List |
| **Poland** | Ministry of Interior | Persons and Entities Subject to Sanctions |
| **Serbia** | Directorate for Prevention of Money Laundering | Domestic List of Terrorists |
| **Switzerland** | SECO | Sanctions List |
| **Tajikistan** | National Bank | Designated Terrorists |
| **Turkey** | Ministry of Interior | Most Wanted Terrorists |
| **Turkey** | MASAK | Asset Freeze Lists (A, B, C, D) |
| **Ukraine** | National Security and Defence Council | NSDC Sanctions List |
| **UK** | HMT/OFSI | 30+ programs covering Afghanistan, Belarus, Counter-Terrorism, Iran, Russia, Syria, and more |
| **UK** | Home Office | Proscribed Terrorist Groups |
| **Uzbekistan** | Department for Combating Economic Crimes | Foreign and Uzbekistani Citizens Lists |
***
## Middle East and Africa
| Country | Source | List |
| ---------------- | ------------------------------------------------------- | -------------------------------------------------------------- |
| **Bahrain** | Ministry of Foreign Affairs | Bahrain Terrorist List |
| **Egypt** | Money Laundering and Terrorist Financing Combating Unit | EMLTFCU List |
| **Iran** | Ministry of Foreign Affairs | Iran Sanctions List |
| **Israel** | Ministry of Defence | Counter Terror Financing Lists, Seizures of Terrorist Property |
| **Jordan** | Technical Committee for UNSC Resolution Implementation | National List of Terrorists |
| **Lebanon** | Internal Security Forces | National Terrorism and Financing List |
| **Nigeria** | Nigeria Sanctions Committee | Sanctions List |
| **Qatar** | National Counter Terrorism Committee | National List of Terrorists |
| **Saudi Arabia** | Presidency of State Security | Permanent Counter Terrorism Committee |
| **Tunisia** | National Anti-Terrorist Commission | NATC List |
| **UAE** | Committee for Import/Export Control | National List of Terrorist Individuals and Entities |
***
## International
| Organization | List |
| ----------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| **United Nations Security Council** | Resolution 751 (Al-Shabaab), Resolutions 1267/1989/2253 (ISIL/Al-Qaida), Resolution 1518 (Iraq/Kuwait), Resolution 1533 (DRC), Resolution 1591 (Sudan), Resolution 1636 (Lebanon), Resolution 1718 (DPRK), Resolution 1970 (Libya), Resolution 1988 (Taliban), Resolution 2048 (Guinea-Bissau), Resolution 2127 (CAR), Resolution 2140 (Yemen), Resolution 2206 (South Sudan), Resolution 2653 (Haiti) |
# AML Check
Source: https://documentation.idenfy.com/guides/dashboard/aml/aml-check
Run a single AML screening check against sanctions, PEPs, and adverse media databases from the iDenfy dashboard with step-by-step guide.
For detailed explanations of AML terms, datasets, and filters, visit [AML - Key Terms & Concepts](/guides/dashboard/aml/aml-key-terms-concepts)
## Dashboard Navigation for AML Check
1. In the dashboard, navigate to the ***AML verifications*** section
2. Select ***AML check***
3. In the top right corner, *click* ***Check AML***
***
## AML Check — Quick Guide
Use this form to create a new AML (Anti-Money Laundering) check for a person or company.
It screens your subject against selected datasets such as **Sanctions**, **PEPs**, and others.
***
### 1. Enter Subject Details
Fill in the identifying information for the person or company you want to screen.
* **Full name** — required.
* **Client ID** — optional internal reference.
* **Date of birth / Gender** — helps narrow results.
* **Address or nationality** — adds context and reduces false matches.
Make sure all required fields are completed before continuing.
***
### 2. Apply Filters
Fine-tune your search by selecting which datasets and parameters to use.
* **Datasets** — select what to check (e.g., *PEP*, *Sanction*, *Adverse Media*).
* **Matching threshold** — sets how closely the results must match.
* **PEP status** — include current, former, or linked PEPs.
* **Sanctions status** — include current or former sanctions.
* **Sanction databases** — specify or exclude certain lists if needed.
Adjust these filters depending on your screening requirements.
***
### 3. Create or Discard
Once all required information is filled in:
* Click **Create** to start the AML check.
* Click **Discard** to cancel.
If the “Create” button is disabled, review the form and complete any missing fields.
After submission, the system returns a list of potential matches. Review each one to confirm whether it refers to your subject.
***
## Check Results
### Search Parameters
Displays the details used in the check — your reference for what was searched. The top row shows the subject identity:
* **Full name** — the entered name of the person or company
* **Address or nationality** — country or region used in the search
* **Date of birth** — full or partial, if provided
Expand the row to see the full screening configuration:
| Field | Description |
| ---------------------- | -------------------------------------------- |
| **Matching threshold** | Minimum similarity score used (e.g. 95%) |
| **Birth year range** | DOB range applied to narrow results |
| **PEP tier** | Which PEP tiers were included (Tier 1, 2, 3) |
| **PEP status** | PEP CURRENT, PEP FORMER, PEP LINKED |
| **Sanctions status** | SAN CURRENT, SAN FORMER |
| **Datasets** | Screening databases included (e.g. PEP, SAN) |
| **Sanction databases** | Any sanction lists excluded from screening |
***
### Check Status
| Column | Description |
| ----------------- | ----------------------------------------------------------------------------------------------------------------------------- |
| **Check status** | Current review state: `Flags found` (unreviewed matches exist), `True positive`, `False positive`, `Under review`, or `Clear` |
| **Check ID** | Unique identifier for this check |
| **Client ID** | Your internal customer reference |
| **Status set by** | The user who last changed the status |
| **Status set at** | When the status was last changed |
| **Comment** | Optional review note |
| **Check date** | When the screening ran |
***
### Found Matches
When matches exist, each row in the table is a potential profile. Review each one — small differences such as birth year or nationality often determine whether a match is genuine or false.
| Column | Description |
| -------------------------- | ----------------------------------------------------------------------- |
| **Full name** | Matched entity's name as listed in the dataset |
| **Date of birth** | If available in the source |
| **Address or nationality** | Country or region linked to the record |
| **Datasets** | Which databases triggered the match (e.g. `PEP CURRENT`, `SAN CURRENT`) |
| **Match score** | Confidence level (0–100) showing how close the match is to your subject |
| **Select status** | Mark the match as `True positive`, `False positive`, or `Under review` |
| **Comment** | Add context or reasoning for future reference |
Click any matched row to open its full profile — see [AML Profiles](/guides/dashboard/aml/aml-profiles) for a full description of all tabs and fields.
***
## Additional Functions Inside *Check*
The toolbar at the bottom of the check provides the following actions:
* **History** — previous screening runs and rechecks for this check
* **Comments** — internal notes left by managers
* **Recheck** — runs a new screening with adjusted filters; each recheck consumes one credit
* **Add to monitoring** — enrols the subject in ongoing daily screening; opens the monitoring creation pop-up pre-filled with the subject's details
* **Save** — saves any pending status changes on matched profiles
***
## Download
Click **Download PDF** in the page header to export the check report, including search parameters, check status, and all matched profiles.
# AML Screening from Identity Verifications
Source: https://documentation.idenfy.com/guides/dashboard/aml/aml-from-verification
Run AML checks and add subjects to monitoring directly from completed KYC identity verifications in the iDenfy dashboard — manually or automatically.
AML checks and monitoring can be linked to a specific KYC identity verification, associating the screening result with the subject who completed the verification. There are three ways to do this.
***
## Automatic Checks for All Verifications
You can configure iDenfy to run an AML check automatically for every completed identity verification, without any manual action.
Enable this in [AML & Fraud Prevention settings](/guides/dashboard/settings/aml-fraud-prevention#anti-money-laundering-aml). Once active, PEP, Sanctions, and Adverse Media checks run for all identity verifications as part of the verification flow.
***
## From the Verification Page
To run a check or add a subject to monitoring from a specific verification:
1. Open the identity verification
2. Click **View AML** in the toolbar at the bottom of the page
3. Select one of the two options from the dropdown:
* **Check AML** — runs a one-time AML check using the subject's details from the verification
* **Add to monitoring** — opens the monitoring creation form pre-filled with the subject's name, nationality, and date of birth
***
## From the AML Check Window Using Scan Ref
To associate an AML check with a verification using its reference ID:
1. Copy the **scanRef** from the identity verification
2. Navigate to **AML Verifications** → **AML Check**
3. Click **Check AML** in the top right corner
4. In the pop-up, select **Verification**
5. Paste the scanRef into the **Verification scan ref** field
6. Select what to screen for: **PEPs & Sanctions**, **Adverse media**, or both
# AML Key Terms and Concepts
Source: https://documentation.idenfy.com/guides/dashboard/aml/aml-key-terms-concepts
Learn essential AML screening terminology including person and company types, datasets, matching filters, and result interpretation.
***
## Types
**Person:** full name, date (or year) of birth, nationality, and (if available) ID numbers.
**Company:** legal name, registration number, country, and known aliases.
The more accurate the data, the fewer false matches.
If two people share the same name, **date of birth + country**, usually confirms the right one.
***
## Datasets
### For Individuals
* **PEP** — all Politically Exposed Persons: current, former, and linked.
* **PEP-CURRENT** — only current public figures holding active positions.
* **PEP-FORMER** — only former public figures who previously held positions of power.
* **PEP-LINKED** — people associated with a PEP (family, close contacts).
* **SAN** — all sanctions, including current and former listings.
* **SAN-CURRENT** — only currently sanctioned individuals.
* **SAN-FORMER** — only previously sanctioned individuals.
* **RRE** — Reputational Risk Exposure: adverse media where an authority has taken action. See [RRE Dataset Overview](/guides/dashboard/aml/rre-overview).
* **REL** — Regulatory Enforcement Lists: fines, bans, warnings, or official enforcement actions.
* **POI** — Profiles of Interest: regions or entities connected to higher risk.
* **DD** — Disqualified Directors dataset.
* **INS** — Insolvency Register.
***
### For Businesses
* **PEP** — all Politically Exposed Persons: current, former, and linked.
* **PEP-LINKED** — associates or family members of a PEP.
* **SAN** — all sanctions, both current and former.
* **SAN-CURRENT** — only active sanctions.
* **SAN-FORMER** — only previously listed sanctions.
* **RRE** — Reputational Risk Exposure: adverse media where an authority has taken action. See [RRE Dataset Overview](/guides/dashboard/aml/rre-overview).
* **REL** — Regulatory Enforcement Lists.
* **POI** — Profiles of Interest.
* **INS** — Insolvency Register.
* **SOE** — all State-Owned Enterprises: current and former.
* **SOE-CURRENT** — currently state-owned entities.
* **SOE-FORMER** — entities that were formerly state-owned.
**Tip:** You don’t always need all datasets. Most teams include **Sanctions (SAN)** and **PEP**, and add **RRE** or **REL** for additional context.
**RRE and REL are both adverse media, but they behave differently.** RRE is editorially assessed, category-based, and applies financial thresholds to some crime types. REL aggregates published enforcement entries with no thresholds. Screening both is what closes the gap between them — see [RRE Dataset Overview](/guides/dashboard/aml/rre-overview).
***
## Filters — How Strict the Search Is
**Match threshold:**
Defines how closely a record must match your subject.
* Higher threshold = stricter, fewer false positives (but may miss small variations).
* Lower threshold = broader, catches more potential matches (but increases noise).
**Birth-year tolerance:**
Adds a small ± range when you’re not certain about the exact birth date.
**PEP options:**
Select whether to include current, former, or linked individuals.
**Sanctions status:**
Limit to current listings or include previously removed ones.
**Regions & sources:**
Narrow your search to specific countries or datasets when relevant to your business.
***
## Results
If the provided details match anyone in the databases, you’ll receive potential profiles to review:
* **Name and identifiers** — who the record is about.
* **Why it matched** — name, date of birth, or country similarity.
* **Source** — which list, register, or article it came from.
* **Confidence signals** — matching elements like DOB or nationality.
***
## Good Habits
* Always use the subject’s full legal name.
* Add date of birth and country whenever possible.
* Record a short reason when dismissing a false match.
* Stay consistent as a team in how you review and escalate.
* Run a new check whenever key information changes (new role, country, or large transaction).
***
## Quick Glossary
* **AML check:** screening for potential financial crime or compliance risk.
* **Profile:** a potential match that requires review.
* **PEP:** a public figure or close contact who carries higher corruption risk.
* **Adverse media / RRE:** criminal conduct reported by official sources or by media covering official action — not negative press in general.
* **Sanctions:** official “do not deal” lists from governments or international bodies.
* **False positive:** a result that looks similar but is not your subject.
* **Monitoring:** scheduled or automatic re-checks over time.
# AML Monitoring
Source: https://documentation.idenfy.com/guides/dashboard/aml/aml-monitoring
Set up and manage continuous AML monitoring with daily sanctions, PEP, and adverse media screening for individuals and companies in the iDenfy dashboard.
## Monitoring Vs. Single Check
AML Monitoring performs a **recurring daily check** on a subject — scanning them against PEP, Sanctions, and Adverse Media databases every 24 hours for as long as monitoring is active. A single AML check runs once and returns results immediately.
You can also start monitoring directly from any completed AML check result (within an ID verification or a standalone AML check) by clicking **Add Monitoring** at the bottom of the finding.
***
## Creating AML Monitoring
There are two ways to start monitoring a subject.
### From the AML Monitoring List
Navigate to **AML Verifications** → **AML Monitoring** and click **New Monitoring** in the top right corner.
A pop-up window will appear. Fill in the subject's details:
### From a Verification Window
Open any ID verification, then click **View AML** in the toolbar at the bottom of the page. A dropdown appears with two options:
* **Add to monitoring** — opens the monitoring creation pop-up pre-filled with the subject's details from the verification
* **Check AML** — runs a one-time AML check instead
Using **Add to monitoring** from a verification is the fastest way to enrol a verified subject — their name, nationality, and date of birth are carried over automatically.
### Fields
| Field | Required | Description |
| ----------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| **Type** | Yes | `Person` or `Company` |
| **Full name / Company name** | Yes | For persons, enter the full name as a single combined field. Company names accept up to 200 characters |
| **Date of birth** | No | Persons only. Improves match accuracy by narrowing results to the correct age range |
| **Nationality / Country** | No | Improves screening accuracy by filtering results to the relevant jurisdiction |
| **Gender** | No | Persons only. `Male`, `Female`, or `Other` |
| **AML Tags** | No | Up to 5 custom tags (max 100 characters each) for filtering and organizing the monitoring list. Configured in [AML Settings](/guides/dashboard/settings/anti-money-laundering-aml#aml-monitoring-tags) |
| **Auto monitoring extension** | No | Extends the 365-day monitoring period automatically each year. Enabled by default — each renewal costs one credit |
All monitoring entries use the AML matching thresholds, filters, and dataset configuration set in your [AML Settings](/guides/dashboard/settings/anti-money-laundering-aml). These cannot be adjusted per-entry at creation time.
Adverse Media monitoring cannot be enabled on its own — it requires PEP & Sanctions screening to be active on your contract.
***
## Filtering the Monitoring List
The monitoring list has two tabs — **Person** and **Company** — to switch between individual and business records. If a subject is not visible, confirm you are on the correct tab.
Use the **sort dropdown** to order results:
| Option | Description |
| ---------------------------------------- | ----------------------------------------------- |
| Check date newest / oldest | Order by when the monitoring record was created |
| AML check date newest / oldest | Order by the last PEP & Sanctions screening run |
| Adverse media check date newest / oldest | Order by the last adverse media screening run |
***
## Monitoring Results
Opening a monitoring record shows three sections: the search parameters the record was created with, the current monitoring status, and all matched profiles (findings).
### Search Parameters
Displays the subject details and screening configuration used for this monitoring record. The top row shows:
* **Full name** — the monitored subject's name
* **Address or nationality** — country code used in screening
* **Date of birth** — if provided at creation
Expand the row to see the full configuration:
| Field | Description |
| ---------------------- | ------------------------------------------------- |
| **Matching threshold** | Minimum similarity score used (e.g. 95%) |
| **Birth year range** | DOB range applied to narrow results |
| **PEP tier** | Which PEP tiers were included (Tier 1, 2, 3) |
| **PEP status** | PEP CURRENT, PEP FORMER, PEP LINKED |
| **Sanctions status** | SAN CURRENT, SAN FORMER |
| **Datasets** | Screening databases included (e.g. PEP, SAN, RRE) |
| **Sanction databases** | Any sanction lists excluded from screening |
***
### Monitoring Status
Summarises the current state of the monitoring record:
| Column | Description |
| ------------------- | ----------------------------------------------------------------------------------------------- |
| **Review status** | `Flags found` if at least one unresolved match exists; `Clear` otherwise |
| **Monitoring ID** | Unique identifier for this monitoring record |
| **Client ID** | Your internal reference, set at creation |
| **Status set by** | The user who last changed the status |
| **Status set at** | When the status was last changed |
| **Comment** | Optional review note |
| **AML tags** | Tags assigned to this record for filtering |
| **Check date** | The date of the most recent update to the finding (e.g., new evidence or changes to sanctions). |
| **Expiration date** | When monitoring expires (365 days from creation unless auto-renewed) |
***
### Found Matches
Each matched profile row shows the following columns:
| Column | Description |
| -------------------------- | -------------------------------------------------------------------------- |
| **Full name** | Matched entity's name, with alias match shown as a badge if applicable |
| **Date of birth** | Matched entity's date of birth |
| **Address or nationality** | Country associated with the matched profile |
| **Datasets** | Which screening databases flagged this profile (e.g. `SAN CURRENT`, `POI`) |
| **Match score** | Confidence score (0–100) for the name match |
| **Status** | Set to **True positive** or **False positive** to review the finding |
| **Comment** | Add an internal note to the finding |
| **Delete** | Permanently hide the profile from this monitoring record (see below) |
Each monitoring entry displays up to 30 findings.
Clicking a matched profile row opens the full profile viewer. See [AML Profiles](/guides/dashboard/aml/aml-profiles) for a description of all tabs and fields.
### Reviewing and Resolving Findings
**True positive** — confirms the finding as a genuine match. The monitoring record stays in Alert until all findings are resolved.
**False positive** — marks the finding as not relevant to the monitored subject. The finding is hidden from view. However, if the screening provider updates the underlying record (detectable by a changed update date), the profile may reappear on the next daily check — marking as False Positive is not permanent suppression.
**Delete (trash icon)** — permanently removes the profile from this monitoring record. The profile ID is added to the record's hidden list and filtered out on every subsequent daily check, even if the screening provider updates the record. Use this when the profile is definitively not the monitored subject.
If you added a subject to monitoring from an AML check, any findings you already resolved in that check are carried over automatically. Only new findings detected after monitoring started require review.
Resolving findings does **not** automatically change the monitoring status from Alert to Active. After dismissing false positives, a manager must manually click **Start** on the monitoring record to re-evaluate the remaining findings and restore Active status.
### Other Actions
**Page header:**
* **Delete results** — removes all current findings from this monitoring record (the monitoring record itself remains active and continues daily screening)
* **Download PDF** — exports the full monitoring record as a PDF for audit and compliance purposes
**Bottom toolbar:**
* **Auto renewal** — toggles automatic extension of the monitoring period each year; each renewal consumes one credit
* **Logs** — shows a full audit trail of status changes and screening events for this record
* **History** — previous screening runs and rechecks
* **Comments** — internal notes left by managers on this record
* **Recheck** — manually triggers a new screening run outside the daily cycle; consumes one credit
* **Update monitoring** — saves any pending changes to the record (active when edits are unsaved)
* **Stop monitoring** — disables further checks for this subject; can be restarted at any time
# Name Matching Logic
Source: https://documentation.idenfy.com/guides/dashboard/aml/aml-name-matching-logic
Understand how the AML engine scores names, handles cultural variations, and combines identity signals into a final match decision.
The matching engine runs two parallel tracks — fuzzy name matching and semantic matching — and combines them into a single final score.
***
## Track 1 — Fuzzy Name Matching
Before any comparison happens, names go through several preparation steps.
**Cultural Affinity Detection**
A machine learning model identifies the cultural origin of a name (Russian, Chinese, French, Arabic, etc.) and applies the appropriate matching logic. For example, "John Smith" and "Smith John" are treated as equivalent under Western naming conventions — that assumption does not apply to Chinese names.
**Normalization**
Names are stripped of special characters and converted to a standard format. "Timothée Dupont-Giguère" becomes "TIMOTHEE DUPONT GIGUERE". Legal entity suffixes such as "Ltd." or "N.P.L." are also standardized.
**Tagging and Weighting**
Each part of a name is assigned a semantic role: FIRSTNAME, LASTNAME, MIDDLENAME, ABBREVIATION, and so on. A name like "Mugabe, R G" is parsed so that "Mugabe" is tagged as LASTNAME, "R" as both FIRSTNAME and ABBREVIATION, and "G" as MIDDLENAME/ABBREVIATION. These tags determine how much weight each part carries in the final score — surnames count more than middle names.
**Candidate Selection and Scoring**
The engine searches the watchlist for potential matches, tolerating a wide range of variations:
* Inverted or doubled letters, missing letters, similar-sounding letters across languages
* Split or merged words
* Common aliases (Robert / Bob)
* Patronyms, teknonyms, and abbreviations
* Full transliterations from non-Latin scripts
Each name token is scored individually. Exact matches score 100; fuzzy matches score 75–99 depending on closeness. Missing or unexpected tokens apply downward penalties, and surname mismatches carry a heavier penalty than middle name mismatches.
***
## Track 2 — Semantic Matching
Running in parallel, this track covers everything that is not a name: date of birth (compared by year, month, and day with configurable tolerance), country, gender, and other identifiers. Each field is scored based on how reliable and relevant it is to the potential match.
***
## Final Stage — Metascore
Both tracks feed into the Metascore, which combines everything into a single number. The weights are configurable based on your data quality:
* A reliable country match can boost the score by **15–25 points**
* A DOB mismatch applies roughly a **20-point penalty**
* A weak name match (e.g. 89) can be pushed **over the threshold** if DOB and country both align
* A perfect name match (100) can be suppressed to **\~82** if other data points contradict the watchlist record
This two-directional adjustment keeps false positives low without sacrificing real hits.
***
## Match Threshold
Only matches scoring at or above the threshold are returned. There are two places it is set, with **different defaults**:
| Where it is set | Default | Range |
| -------------------------------------------------------------------------------------------------- | ------- | ------ |
| Dashboard → **Settings** → **Anti-Money Laundering (AML)** → **AML matching threshold percentage** | 95 | 75–100 |
| `filters.threshold` on a one-off AML check request | 85 | 75–100 |
The per-request `threshold` is honored for **one-off AML checks only**. [AML monitoring](/guides/dashboard/aml/aml-monitoring), AML triggered by an identity verification, and the previous AML API version all use the partner-level setting — a per-request value is ignored or unavailable there.
75 is the floor. Requesting a lower value does not widen the search; it is silently raised to 75.
***
## Birth-Year Range
By default the date of birth must match exactly. Widen it with `filters.dateOfBirthMatching` — `EXACT` (default), `SAME_YEAR`, or `WITHIN_ONE_YEAR` through `WITHIN_FIVE_YEARS`. The dashboard equivalent is **AML birth year range** in AML settings.
If you are seeing an unexpected number of false positives or missed matches, the match threshold and birth-year range are the first settings to review. See [AML Key Terms and Concepts](/guides/dashboard/aml/aml-key-terms-concepts) for a full breakdown of available filters.
# AML Profiles
Source: https://documentation.idenfy.com/guides/dashboard/aml/aml-profiles
Interpret matched AML profiles in the dashboard, including sanctions entries, PEP roles, associations, and supporting evidence sources.
A profile opens whenever you click a matched result — whether from an AML check or an AML monitoring record. The profile viewer is the same in both contexts.
Profile data is not filtered by the check or monitoring filters. All conditions and information from the screening provider are shown regardless of what datasets were selected.
***
## Profile Header
The top of the profile shows the matched entity's name, a row of dataset badge chips indicating which screening databases flagged them (for example `SAN CURRENT`, `PEP CURRENT`, `POI`), and a **Download PDF** button to export the full profile.
***
## Profile Details
The default tab. Contains three cards:
### Core Details
Main identifying information:
* **First name / Middle name / Surname** — name components as listed in the dataset
* **Gender**
* **Photo** — if available in the source
* **Aliases** — alternate spellings and translations that may appear on official lists
### Personal Details
Supporting data to confirm identity:
* **Nationality**
* **Date of birth**
* **Addresses** — known addresses with a type label (for example, `Registered`, `Business`)
### Identifiers
Official IDs and references from international sanctions or regulatory bodies. Examples include:
* UK Sanctions reference
* EU reference number
* OFAC SDN ID
* HM Treasury reference
* UN reference
Use these to trace where the record originates and verify authenticity.
***
## Sanctions
Lists all sanctions restrictions associated with this profile, split into **Current** and **Former** sub-tabs.
Each row in the table shows:
| Column | Description |
| -------------------- | -------------------------------------------------------------------------------- |
| **Sanction list** | The issuing body or list name (e.g. OFAC SDN, HM Treasury, EU Consolidated List) |
| **Sanction types** | The type of sanction (e.g. asset freeze, travel ban) |
| **Sanction measure** | The specific restriction in effect |
| **Added date** | When the entry was added to the list |
Expand any row to see the underlying evidence:
* **View source** — opens the original source document URL in a new tab.
* **View PDF** — opens an Acuris-generated PDF containing the source record. Shown only when an Acuris PDF is available; serves as a fallback when the original source URL is broken or unavailable.
* **Captured** — when iDenfy captured this data
* **Published** — the official publication date
* **Title** — the document or order title
* **Datasets** — which screening databases include this evidence
* **Summary** — a plain-text description of the sanction
* **High Credibility Score** — indicates the evidence comes from an authoritative primary source
***
## PEPs
Lists politically exposed person classifications, split into **Current**, **Former**, and **PEP by association** sub-tabs.
Each row shows:
| Column | Description |
| ---------------- | --------------------------------------------------------------------- |
| **Position** | The political role or title held |
| **Segment** | The PEP tier or category (e.g. Head of Government, Regional Official) |
| **Data capture** | When this role was recorded |
Expand any row to view evidence and source details, following the same structure as the Sanctions tab.
***
## Associations
Related individuals and entities connected to this profile, split into three sub-tabs:
* **Relatives & close associations** — family members and personal associates
* **Business associates** — professional connections
* **Associated businesses** — companies or organizations linked to this profile
Each entry shows the associated name, dataset badges indicating why they appear, and a description of the relationship.
***
## Other Datasets
Additional risk and regulatory data, split into sub-tabs:
* **Reputation Risk Exposure (RRE)** — adverse media entries tied to official action. Each entry carries a category, a snippet, a source link, and (where copyright allows) a PDF of the evidence. See [RRE Dataset Overview](/guides/dashboard/aml/rre-overview)
* **Regulatory Enforcement List (REL)** — regulatory enforcement actions
* **Profile of Interest (POI)** — persons or entities flagged for heightened scrutiny
* **Gambling Risk Intelligence** — risk data specific to gambling-related exposure
# AML Screening Overview
Source: https://documentation.idenfy.com/guides/dashboard/aml/aml-screening-sanctions-peps
How iDenfy AML screening checks persons and companies against sanctions lists, PEP registries, and adverse media, with optional ongoing monitoring alerts.
AML (Anti-Money Laundering) screening lets you check persons and companies against global sanctions lists, politically exposed persons (PEP) registries, and adverse media sources — and enroll them in ongoing monitoring with automated alerts.
## AML Features
| Feature | Description |
| ---------------------------- | ------------------------------------------------------------------- |
| **Company AML Check** | Check companies against international sanctions lists. |
| **Person AML Check** | Check individuals against international sanctions and PEPs lists. |
| **Adverse Media Check** | Scan companies and individuals for adverse media. |
| **AML Monitoring** | Monitor companies and individuals against sanctions and PEPs lists. |
| **Adverse Media Monitoring** | Monitor companies and individuals for adverse media. |
## Key Capabilities
* Screen global sanctions, PEPs, and watchlists
* Filter adverse media and reduce false positives
* Receive instant automated AML risk notifications
* Automated ongoing daily AML screening
* Ensure compliance with automated audit reports
Visit the iDenfy AML Screening product page for more information.
## Next Steps
Run a sanctions, PEP, or adverse media check from the dashboard.
Set up ongoing monitoring with alerts.
Manage and review AML subject profiles.
Understand sanctions lists, PEPs, and match logic.
# Compliance and Monitoring Tab
Source: https://documentation.idenfy.com/guides/dashboard/aml/compliance-monitoring-tab
Navigate the compliance and monitoring tab in iDenfy to review audit logs, AML statuses, blocklist matches, and monitoring subjects.
### Comments and Audit Logs
These two cards provide a chronological history of the case.
* **Comments:** An internal notebook for your team. Use this to leave notes about manual verifications or decisions.
* **Action:** Type in the text box at the bottom and click **Comment** to add a note.
* **Audit Logs:** A read-only system record that tracks every action, including automated system checks (e.g., "\[AUTOMATION] Done website audit"), user actions (e.g., "\[DemoUser] Added comment"), and client actions taken through a [request update](/guides/dashboard/kyb/request-update-kyb) link. Client actions include "Form re-submitted without changes" when the client submits the form without editing anything.
***
### Compliance Information (AML)
This section breaks down the screening results for every person and company involved (Directors, Shareholders, UBOs).
* **No flags:** The entity passed screening against sanctions and watchlists.
* **Flags found:** Potential matches were found (e.g., Adverse Media, PEPs).
* **Action:** Click **View AML** or **View Adverse media** next to a name to review and resolve the match.
***
### Automation Statuses
This card details the result of every automation rule configured for your workflow.
**Understanding Rule Statuses**
| Status | Meaning |
| ------------------- | ------------------------------------------------------------------------------------------- |
| COMPLETED | Rule ran successfully and returned a result. |
| FAILED | Rule encountered an error during execution. |
| SKIPPED | Rule didn't apply (conditions not met). |
| BLOCKED | A previous rule with a "BLOCK" action already denied the company, so this rule did not run. |
| INSUFFICIENT\_FUNDS | The partner account does not have enough credits to run this specific check. |
Understanding Rule Actions
Each rule is configured with an "Action" that dictates what happens if the rule is triggered:
| Action | Consequence |
| ----------- | --------------------------------------------------------------------------------- |
| DO\_NOTHING | Informational only. The check runs, but the company is not flagged automatically. |
| FLAG | The company is flagged for manual review. |
| BLOCK | The company is automatically denied. |
***
### Blocklist Statuses
This section shows exactly which data fields were cross-referenced against your internal blocklists.
**Check Results**
| Status | Meaning |
| ------- | ---------------------------------------------------------------------------------- |
| CHECKED | The field contained data and was successfully validated against blocklist rules. |
| SKIPPED | The field was empty or missing in the company profile, so it could not be checked. |
What gets checked?
The system attempts to screen the following data points if they are present:
* **Company Info:** Name, Registration Number, Country, City, Address, Postcode, Activity Code, Domain.
* **Applicant Info:** Name, Email, Phone, Personal Number, IP Address.
* **Persons (UBO/Rep):** Nationality, Country of Residence.
### Monitoring Subjects
Enroll specific entities into ongoing monitoring to detect future changes in their status (e.g., appearing on a sanctions list next month).
* **Add from the list:** Select entities already known in this application.
* **Create new:** Add a new entity manually.
***
### Troubleshooting and Support
Quick answers to common questions about this tab:
1. **Why are blocklist fields showing "SKIPPED"?** This means the company data is incomplete. If a field (like "Postcode") is empty in the application, the blocklist cannot check it.
2. **Why are multiple automation rules "BLOCKED"?** An earlier rule in your workflow (one with a **BLOCK** action) has already denied the company. To save resources, the system stops running subsequent rules.
3. **What does "INSUFFICIENT\_FUNDS" mean?** The automation failed because the account lacks the credits required for that specific third-party check. Credits must be topped up to run these rules.
4. **Why wasn't the company flagged even though the automation ran?** Check the rule's **Action** setting. If it is set to **DO\_NOTHING**, the rule will complete successfully without generating a flag, regardless of the finding.
# RRE Categories in Scope
Source: https://documentation.idenfy.com/guides/dashboard/aml/rre-in-scope
The six core Reputational Risk Exposure categories with their subcategories, financial thresholds, and the criteria that qualify a profile.
RRE content is organised into **six core categories** plus **one auxiliary legacy category**. Each subcategory has its own qualifying criteria, and some carry a financial threshold.
Across every category, the baseline requirement is the same: the subject must be **wanted, charged, indicted, prosecuted, convicted, or sentenced**, evidenced by an official source or by media reporting on official action.
***
## 1. Terrorism
No financial threshold. Assessed qualitatively.
| Subcategory | What qualifies |
| ---------------------------------------------------- | ---------------------------------------------------------------------------------------- |
| **1.1 Proliferation of Weapons of Mass Destruction** | Proceedings in relation to international terrorism |
| **1.2 Terrorist Financing and Support** | Proceedings in relation to international terrorism |
| **1.3 Violent Crimes with Terrorist Connection** | Proceedings for participation in violent crimes with an established terrorist connection |
**Domestic terrorism is excluded.** So are violent crimes such as mass shootings and hate crimes, unless there is evidence of a terrorist connection.
***
## 2. Organised Crime
No financial threshold. Assessed qualitatively.
| Subcategory | What qualifies |
| ------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **2.1 Traffic and Distribution of Narcotics** | Organised drug trafficking where the crime involves three or more perpetrators, or the volume of proceeds indicates criminal organisation |
| **2.2 Illicit Arms Trafficking** | Organised arms trafficking under the same criteria |
| **2.3 Smuggling or Illicit Trafficking in Goods** | Organised goods trafficking and smuggling under the same criteria |
| **2.4 OCGs and Gangs** | Proceedings relating to affiliation with a known criminal group, or criminal activity in collusion between two or more entities, or generating large proceeds |
***
## 3. Modern Slavery
No financial threshold. Assessed qualitatively.
| Subcategory | What qualifies |
| ------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| **3.1 Human Trafficking and Exploitation** | Proceedings for trafficking of humans by an organised criminal group, or by one or two perpetrators using coercion or deceit and involving movement of the victims |
| **3.2 Labour Trafficking and Exploitation** | As above, in a labour context |
| **3.3 Sex Trafficking and Exploitation** | As above, in a sexual exploitation context |
***
## 4. Financial Crime and Fraud
This is the category where thresholds bite hardest — nearly every subcategory carries one.
| Subcategory | Threshold | What qualifies |
| ------------------------------------------------------------- | ---------- | --------------------------------------------------------------------------------------------------------------------------- |
| **4.1 Financial and Non-Financial Fraud** | USD 10,000 | Criminal, corporate or commercial fraud generating over USD 10,000 in proceeds, or defrauding victims by USD 10,000 or more |
| **4.2 Money Laundering** | USD 10,000 | Laundering of criminal proceeds valued at or above USD 10,000, by individuals or companies |
| **4.3 Tax Offences** | USD 10,000 | Tax crimes with proceeds valued at or above USD 10,000 |
| **4.4 Embezzlement** | USD 10,000 | Embezzlement of assets valued at or above USD 10,000 |
| **4.5 Counterfeiting of Currency** | USD 10,000 | Counterfeiting of USD 10,000 or above |
| **4.6 High-Value Theft and Robbery** | USD 10,000 | Theft and robbery generating proceeds valued at or above USD 10,000 |
| **4.7 Insider Trading** | USD 10,000 | Insider trading and market manipulation at or above the threshold |
| **4.8 Unexplained Wealth** | GBP 50,000 | Proceedings relating to wealth that cannot be accounted for, at or above GBP 50,000 |
| **4.9 Failure to Comply with Relevant Financial Regulations** | USD 10,000 | Proceedings for non-compliance with financial regulations at or above the threshold |
Thresholds are given in USD or the equivalent in another currency. Where the reporting contains no financial figure, relevance is judged on additional factors instead — organised crime, terrorism, modern slavery, financial crime and fraud, bribery and corruption, or cybercrime indicators.
The USD 10,000 figure can look low. It is a prioritisation floor, not the only test — the qualitative criteria still apply, and a case that clears the number but fails those criteria is not captured.
***
## 5. Bribery and Corruption
No financial threshold. Assessed qualitatively.
| Subcategory | What qualifies |
| ------------------------------------------------------------------------ | ---------------------------------------------------------------------- |
| **5.1 Being Bribed** | Proceedings for accepting a bribe |
| **5.2 Bribing Another Person** | Proceedings for offering or giving a bribe |
| **5.3 Bribing a Foreign Public Official** | Proceedings for bribery of an official in another jurisdiction |
| **5.4 Failure of a Relevant Commercial Organisation to Prevent Bribery** | Proceedings against an organisation for failing to prevent bribery |
| **5.5 Corrupt Practices** | Proceedings for corrupt conduct not covered by the subcategories above |
***
## 6. Cybercrime
| Subcategory | Threshold | What qualifies |
| ----------------------------------- | ---------- | ------------------------------------------------------------------------------------------------------------ |
| **6.1 Identity Theft** | — | Proceedings or regulatory action for identity theft |
| **6.2 Scams** | USD 10,000 | Scams generating over USD 10,000 |
| **6.3 Hacking** | — | Proceedings or regulatory action for failure to prevent a data breach, or for participation in cyber-attacks |
| **6.4 Credit Card / Payment Fraud** | USD 10,000 | Involvement in credit card or payment fraud valued at or above USD 10,000 |
***
## 7. Other Alleged Offences
The auxiliary category, and the only one built on **low-credibility** evidence: content that would fit categories 1–6 but has **no evidence of official action**, plus other offence types that are not explicitly out of scope.
This category is legacy only. It holds existing profiles created under earlier methodology, and applies to currently out-of-scope crime. **New content is not created under it** — anything added after January 2020 requires evidence of official action.
***
## Not Listed Does Not Mean Not Covered
The category list describes how content is *classified*, not an exhaustive list of qualifying crimes. A crime that appears under no explicit category or subcategory is still captured if it predicates money laundering or can be classified under an existing subcategory.
**Environmental crime** is the clearest illustration. It is not a named RRE category, and wildlife crime is explicitly out of scope — yet environmental offences are routinely captured:
* **Under Terrorism** — where a terrorist organisation funds itself through activity such as illicit ivory trafficking, or commits environmental damage as part of its operations.
* **Under Organised Crime** — where organised groups profit from illegal disposal of commercial, industrial or radioactive waste and launder the proceeds.
* **Under Bribery and Corruption** — where an environmental offence generating proceeds was facilitated by bribing public officials. Both the briber and the official are profiled.
* **Under Financial Crime and Fraud — Money Laundering** — where proceeds from an environmental crime are laundered at or above the threshold. This route applies to cases that do not meet the qualitative criteria of any other subcategory; if they do, they are classified there instead.
***
## Related Pages
What RRE is, which evidence qualifies, and how it differs from REL.
Topics that are deliberately excluded, and the exceptions that pull them back in.
# RRE Out of Scope
Source: https://documentation.idenfy.com/guides/dashboard/aml/rre-out-of-scope
Topics deliberately excluded from Reputational Risk Exposure content, the reasoning behind each exclusion, and the exceptions that override them.
The exclusion list matters as much as the category list. It explains why a story you have read about a customer does not appear as an RRE profile — and it is deliberate, not a coverage gap.
The organising principle: RRE captures **criminal conduct with a money laundering nexus, evidenced by official action**. Topics that fail that test are excluded, even when they are genuinely damaging to a subject's reputation.
Exclusion is topic-level, not subject-level. An excluded topic does not shield a subject — the same person or company is still profiled if separate conduct falls inside a category.
***
## Violence Without a Terrorist Connection
| Excluded |
| ----------------------------------------------------------------------------------------- |
| Mass shootings and mass murder without a terrorist connection |
| Violent crimes — murder, grievous bodily injury, assault — without a terrorist connection |
**Why:** these are serious crimes, but they do not generate laundered proceeds. Where a terrorist connection exists, the conduct is captured under Terrorism instead.
***
## Opinion, Criticism and Speech
| Excluded |
| ----------------------------------------------------------------------------------------- |
| Hate speech, including racism and insulting religion |
| Criticism of politicians over their political views, policies or agenda |
| Criticism of public officials for alleged incompetence or failure to perform their duties |
| Criticism of countries and governments |
**Why:** criticism is not criminal conduct, and political commentary is not a risk signal. Including it would fill profiles with opinion rather than evidence.
***
## Commercial and Civil Matters
| Excluded |
| ---------------------------------------------------------------------------------------------------------- |
| Bankruptcy, except fraudulent bankruptcy |
| Distressed company news |
| Anti-trust news — abuse of a dominant market position, bid-rigging, price-fixing |
| Patent, copyright and intellectual property disputes |
| Civil court cases, except where they fall under Financial Crime and Fraud and clear the relevant threshold |
**Why:** commercial failure and civil disputes are not predicate offences. Fraudulent bankruptcy is the exception, and it is captured under Financial Crime and Fraud.
***
## Low-Severity Offences
| Excluded |
| ------------------------------------------------------------------------------------ |
| Misdemeanours, including by low-level (Tier 3) PEPs and candidates for public office |
| Petty crimes |
| Traffic offences and driving under the influence, including by PEPs |
**Why:** the proceeds, where any exist, fall far below any meaningful threshold. A PEP's parking ticket is not an AML signal.
***
## Sexual Offences and Mistreatment
| Excluded |
| ---------------------------------------------------------------------------------------------------------------------------- |
| Sexual offences, including against children, except where linked to organised crime or modern slavery |
| High-net-worth individuals mistreating household or domestic staff, except where linked to organised crime or modern slavery |
The exception carries real weight here. Where either topic involves an organised criminal group or trafficking and exploitation, it is fully in scope under **Modern Slavery** or **Organised Crime**.
***
## Other Exclusions
| Excluded |
| ------------------------------------------------------------------------- |
| Whistle-blowers and dissidents |
| Animal cruelty and wildlife crime, except where linked to organised crime |
| Generic advance-fee scam schemes |
**Why:** whistle-blowers and dissidents are subjects of allegations rather than official action, and profiling them would turn the dataset against the people reporting wrongdoing. Wildlife crime returns to scope the moment an organised group is behind it — see [Not listed does not mean not covered](/guides/dashboard/aml/rre-in-scope#not-listed-does-not-mean-not-covered).
***
## What to Do with an Excluded Topic
An excluded topic is not a dead end for your own risk assessment — it is simply not carried by this dataset. Two options remain open:
* **Check the other datasets.** Regulatory Enforcement Lists (REL) carry no financial threshold, so enforcement action that RRE filters out on value may still appear there. Profiles of Interest (POI) covers heightened-scrutiny entities.
* **Record it in your own review.** Where your policy treats an excluded topic as material, document the decision on the case rather than expecting a screening hit to raise it for you.
***
## Related Pages
What RRE is, which evidence qualifies, and how it differs from REL.
The six core categories, their subcategories, and the thresholds that apply.
# RRE Dataset Overview
Source: https://documentation.idenfy.com/guides/dashboard/aml/rre-overview
Understand what the Reputational Risk Exposure (RRE) dataset covers, which evidence qualifies, and how RRE differs from regulatory enforcement data.
**RRE** stands for **Reputational Risk Exposure**. It is the adverse media dataset used in AML screening, and it is narrower than the phrase "negative news" suggests.
An RRE profile is created for a person or company that is named as **wanted, charged, indicted, prosecuted, convicted, or sentenced** in connection with criminal activity that falls under one of the defined RRE categories. The trigger is not the existence of bad press — it is documented action by an authority.
A story that is merely unflattering, critical, or speculative does not create an RRE profile. Without evidence of official action, there is nothing to record.
***
## RRE Vs. REL
Both datasets are described as "adverse media", but they are built differently.
| | **RRE** — Reputational Risk Exposure | **REL** — Regulatory Enforcement Lists |
| -------------- | -------------------------------------------------------------------------- | --------------------------------------------------------------------------------------- |
| **Source** | Official records and mass media reporting on official action | Lists published by regulators, law enforcement, anti-corruption and disciplinary bodies |
| **Processing** | Analysed and categorised by an editorial team before and after publication | Aggregated as published, with minimal editorial intervention |
| **Content** | Categorised criminal conduct with supporting evidence | Structured enforcement entries, notes and article snippets |
| **Thresholds** | Financial thresholds apply to some categories | No financial thresholds applied |
Because thresholds apply only to RRE, the same event can appear in one dataset but not the other. A media report on money laundering below the financial threshold is not captured as RRE, but if a regulator published an entry about the same case, it is captured as REL. Screening both datasets is what closes that gap.
***
## Which Evidence Qualifies
Evidence is ranked by credibility, and the rank determines whether a profile can be created at all.
| Priority | Evidence type | How it is used |
| ------------ | ------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------- |
| **High** | Official sources — websites of government bodies, agencies and courts | Preferred basis for all new content |
| **Medium** | Mass media outlets and other reputable sources such as NGOs and think tanks, **reporting on official action** | Used only where official evidence is unavailable |
| **Low** | Reputable media reporting an offence with no evidence of or reference to official action | Treated as an allegation; maps to the legacy category only |
| **Excluded** | Social media, forums, blogs, Wikipedia-style sites, and subject self-disclosure | Not used as evidence in any form |
Medium-credibility evidence is accepted where official evidence genuinely cannot be obtained — a lack of transparency in the jurisdiction, restricted access to primary records, delayed publication of official information, or restrictive data protection legislation.
***
## Why the Scope Looks the Way It Does
The RRE categories are not an arbitrary list of bad things. They are derived from the internationally recognised categories of **predicate offences** — the crimes whose proceeds are laundered — as set out in global AML standards and in EU and UN money laundering legislation.
The practical consequence: RRE is scoped to criminal conduct with a money laundering nexus, not to reputational harm in general. That is why a violent crime with no terrorist connection sits outside the dataset while a mid-sized fraud sits inside it.
***
## Financial Thresholds
Some categories carry a financial threshold, meaning reports are prioritised where the proceeds are valued at or above that amount. Most categories carry no threshold and are assessed qualitatively instead, against criteria defined per subcategory.
Where a threshold applies but the reporting contains no financial detail, relevance is assessed against additional factors — indicators of organised crime, terrorism, modern slavery, financial crime and fraud, bribery and corruption, or cybercrime.
See [RRE Categories in Scope](/guides/dashboard/aml/rre-in-scope) for the thresholds per category.
***
## Review and Retention
Profiles are reviewed on an event-driven basis rather than a fixed calendar. Media monitoring and monitored enforcement sources are tracked against keywords derived from the RRE categories, and profiles are created or updated as relevant information becomes available.
Retention follows two rules:
* **10 years** for entities with no new relevant information during that period.
* **Longer than 10 years** for entities that also carry other risk categories, such as sanctions or PEP status.
***
## How RRE Appears on a Profile
Four elements support each RRE entry:
* **Rep.Risk category** — the RRE category applied to the profile, based on one or more articles.
* **Snippet** — a short summary of the relevant detail: the subject's involvement, the nature of the crime, and the outcome of proceedings.
* **URL** — a link to the article in its original location. Links can expire if a publisher delists the article or changes its site structure; when that happens, the snippet and category remain authoritative.
* **Document** — a PDF printout of the evidence or article. It is available only where the source's copyright policy permits redistribution. Under a restrictive policy no PDF is shown, and the snippet carries the detail instead.
***
## Related Pages
The six core categories, their subcategories, and the thresholds that apply.
Topics that are deliberately excluded, and the exceptions that pull them back in.
# Standalone Bank Card Verification
Source: https://documentation.idenfy.com/guides/dashboard/bank-card/standalone-bank-card-verification
How the standalone iDenfy bank card check works: consent and capture screens, retry attempts, session time limits, and end-user results.
This page covers the **standalone** flow — the card check running on its own token, with no identity verification behind it. For the version that runs as an extra step inside a KYC session, see [Bank Card Verification](/guides/dashboard/features/bank-card-verification).
Bank Card Verification confirms that a payment card belongs to the person presenting it. The end user photographs the card, or uploads a card-confirmation document. The cardholder name and card number read from it are compared against the name — and optionally the last four digits — supplied by the company that requested the check.
Card capture and card image processing run in a dedicated environment certified to **PCI-DSS v4.0.1**, and no card imagery is retained once processing completes.
***
## Where to Find It
The same card step serves two entry points.
* **Inside a KYC session** — a step shown after identity document capture, only when the feature is enabled for that partner. The KYC verification **cannot be submitted** until the card step has resolved.
* **As a standalone link** — bank card verification only, no identity verification required.
Both settings that govern the feature live under [Settings → Know Your Customer → AML & Fraud Prevention](/guides/dashboard/settings/aml-fraud-prevention#bank-card-verification): **Bank card verification** turns it on, and **Bank card PDF upload** controls whether the upload option appears at all. Neither is self-service — [contact iDenfy](https://idenfy-ivs.atlassian.net/servicedesk/customer/portal/1) to request access.
***
## The Standalone Flow
Four assurances, and a single **Agree & continue securely** button — there is no checkbox to tick. The screen is skipped entirely if consent was already given for this session.
Desktop users see a device screen first, offering a QR code and an SMS link. **Continue in app** appears only when the session carries a mobile code. The footer escape — *Don't have a smartphone? Continue on current device.* — lets them stay put.
Once the phone finishes, the desktop advances to the result on its own; it polls in the background, so the user doesn't need to do anything on the original screen.
| Option | Availability |
| ----------------------- | ------------------------------------------------------------------------------------------------------ |
| **Capture with camera** | Always available |
| **Upload a PDF** | Only when PDF upload is enabled for that partner. Otherwise the tile is hidden entirely, not disabled. |
If only one method exists it is preselected. **Continue** stays disabled until a method is picked.
🔒 Only your card number and name are read – CVV is never captured or stored.
**Capture your card** shows a live view with a card frame. There is **no auto-capture** — the shutter is manual. A camera-switch button appears only if a second camera exists.
**Inspect captured card** asks the three questions shown, then offers confirm or retake. There is no back button on this screen.
If details are missing, **Flip your card** appears and the other side is requested. The back side is **always camera-captured**, even when the front was uploaded.
Is the card fully in frame?
Is anything covering the card?
Is all the text legible?
Accepted formats are **PNG, JPG, HEIF and PDF**, one file at a time.
**The size hint and the real limit differ.** The control shows a 5 MB hint, but that isn't enforced in the browser — the server accepts up to **10 MB**. Files between the two still go through. Anything larger comes back rejected with a message.
PDFs get no image preview; the file name is shown instead. **Review uploaded document** then asks whether it shows the card number, whether the name is visible, and whether it's the right document, before continue or upload again.
Does it show the card number?
Is the name visible?
Is it the right document?
If several cards are found in the document, **Which card are you verifying?** offers masked options — last four digits and expiry only — as many as were detected.
***
## Quality Problems
Quality checks run **after submitting**, not live during capture. A problem opens a modal with an illustration, a single message, and one **Try again** button that re-prompts the same side.
| Message group | Covers |
| ------------- | --------------------------------------------------------------------------------------- |
| Image quality | Blurry · glare · bad lighting |
| Framing | Card not detected · move closer · card cut off · center your card |
| Content | Multiple cards found |
| Authenticity | Physical card required (a photo of a screen) · authentic card required (a printed copy) |
Quality problems **spend no attempt** on their own. But three consecutive quality failures within one attempt do consume that attempt.
***
## Attempts and Timers
Three attempts by default, configurable per partner. **The counter is never shown to the user.**
| Outcome | Spends an attempt? |
| -------------------------------------------- | ------------------------------------------------------- |
| `This document doesn't contain card details` | **Yes** — restarts from the front side |
| `We couldn't confirm your card is genuine` | **Yes** — restarts from the front side |
| Starting a fresh front capture mid-flow | **Yes** |
| A quality problem | No — unless three land consecutively within one attempt |
| `Verification temporarily unavailable` | No — retryable |
### Two Independent Clocks
| Clock | Default | Range | Starts |
| ----------------- | ------- | ------------- | ------------------------------------------------ |
| Link lifetime | 1 hour | up to 30 days | when the link is issued |
| Session countdown | — | 1–60 minutes | **at the capture step**, not when the link opens |
A **Time left** indicator appears only if enabled for the partner, and is hidden during mobile capture.
### Timeouts
Analysis waits up to **60 seconds**; camera and loading up to **15**. Failures show *Verification temporarily unavailable*, which is retryable and spends no attempt. Camera failures return the user to the method screen, so upload stays reachable.
***
## Limits and Behaviour
**Embedding in your own page?** Your frame must grant camera access to the card capture origin, or card capture fails while document capture keeps working. This asymmetry is a frequent support cause — see [Redirect & iFrame](/kyc/iframe-redirect#required-attributes) for the `allow` attribute.
**SMS limits.** One per session, one per phone number per 24 hours, and three requests per 15 minutes. Users in unsupported phone countries are told to scan the QR code instead.
**Languages.** All [37 supported languages](/resources/supported-languages), switchable mid-flow, including right-to-left rendering for Arabic and Persian (Farsi).
**What these screens don't have.** No **Cancel verification** button and no **Continue on mobile** button. There is no card-brand or country restriction, and **no manual review** — the result is final.
***
## Results
### Standalone
One screen, no buttons. Only a **full match** counts as success. If redirect URLs were configured, success and failure hop straight back to your page — the expired case **never** redirects.
### Inside a KYC Session
There is no result screen at all. The flow simply continues to the next step, and a mismatch is flagged to you rather than shown to the user. Results appear alongside the identity verification in [Verification Details](/guides/dashboard/kyc/verification-details).
***
The card check as an additional step inside the identity verification flow, and how the verdict is decided.
The Bank card verification and Bank card PDF upload settings that govern both flows.
# Bank Verification in the Dashboard
Source: https://documentation.idenfy.com/guides/dashboard/bank/bank-verification
Verify customer bank accounts using the iDenfy open banking integration with support for 2,500+ EU banks and multiple data layers.
## What Is Bank Verification?
To learn more about what bank verification is and how it’s used in the industry, see our [**blog post**](https://idenfy.com/blog/bank-account-verification-guide/?utm_content=undefined)
If you’re interested in the bank verification services we provide, [**follow the link**](https://idenfy.com/bank-verification-service/)
## Supported Countries
| Austria (AT) Belgium (BE) Bulgaria (BG) Croatia (HR) Cyprus (CY) Denmark (DK) Estonia (EE) Finland (FI) France (FR) | Italy (IT) Latvia (LV) Lithuania (LT) Luxembourg (LU) Malta (MT) Germany (DE) Greece (GR) Hungary (HU) Iceland (IS) Ireland (IE) | Netherlands (NL) Norway (NO) Poland (PL) Portugal (PT) Romania (RO) Slovakia (SK) Slovenia (SI) Spain (ES) Sweden (SE) |
| ------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- |
***
## Creating a Bank Verification Request
To create a Bank Verification request from your side, follow this flow:
***
## Review Submitted Verification
Open all **Bank Verifications**
Filter by **Country** and **Risk level**
You can filter by a **specific time** period or search across all data
Allows changing the identifier
***
## Understanding Bank Verification Data
This section explains the structure and meaning of the data retrieved during a Bank Verification. The data is presented in the **Bank Verification Window** and includes user bank data, associated accounts, transaction history, and risk scoring details.
***
### User Bank Data
This section summarizes the general information retrieved about the user (private or corporate) who completed the Bank Verification.
* **Full name**
The full name of the person who completed the verification, extracted from the bank account data.
* **Check date**
The date when the bank verification was performed.
* **Bank name**
The name of the bank selected by the user during verification.
* **Risk level**
A calculated risk score based on:
* Date of first transaction
* Number of inbound and outbound transactions
* Number of unique inbound and outbound recipients
***
### Accounts List
If a user has multiple accounts with the same bank login, all are listed in the results. Each account includes the following details:
* **IBAN**
The International Bank Account Number is used for sending and receiving payments globally.
* **Current booked balance**
The balance currently available in the account, **excluding** pending transactions.
* **Current available balance**
The total available funds **include** pending transactions that are authorized but not yet cleared.
***
### Transaction List
Displays the list of all transactions performed by the user in the **last 12 months**.
* **Transaction date**
The actual date the transaction was made (purchase, withdrawal, deposit, etc.).
* **Booking date**
The date the transaction was officially processed and recorded by the bank.
* **Details**
Additional information related to the transaction for traceability and reconciliation purposes.
* **Creditor**
The entity receiving the funds.
* **Receiver**
The individual or company to whom the payment was sent.
* **Amount**
The monetary value transferred during the transaction.
***
### Calculating Risk Level
After you verify a bank account, the system calculates a **risk level** based on your user's activity over the last 12 months. This approach ensures only recent, relevant data is considered.
### Risk Calculation Factors
* **Date of first transaction**
When the first transaction occurred within the 12-month window.
* **Number of inbound & outbound transactions**
Total transactions sent and received.
* **Number of unique inbound & outbound recipients**
Total number of different individuals or entities involved in transactions with the user.
> The risk score is derived by averaging the above values. Older, inactive accounts are excluded to reduce inconsistencies and provide more accurate results.
# Bank Verification in Identity Flow
Source: https://documentation.idenfy.com/guides/dashboard/bank/bank-verification-in-id-verification
Add open banking verification as a step within the iDenfy identity verification flow to collect customer banking data during onboarding.
We’ve introduced an option to include bank verification as part of the identity verification flow. This feature allows you, as our partner, to more easily collect banking data from registering users, based on your compliance or business requirements.
Before enabling bank verification within the identity flow, please ensure that you comply with all applicable regulations that may affect your company.
Requiring bank verification is particularly useful in the following scenarios:
* You want to prevent the onboarding of illegitimate users.
* Your internal processes require insight into the financial status of potential partners.
* You operate in a high-risk industry.
* You need to ensure the user is not involved in money laundering activities.
* You want to assess a registered user’s financial situation.
* Verifying bank details is required by local laws or regulatory jurisdictions.
* You need to perform enhanced due diligence on users.
* Or in other relevant use cases.
To have the option enabled, please [book a demo call](https://idenfy.com/demo-page/) with our team to agree on specific details
### How to Start Using the KYB Verification on IDV
Once our team enables this option, all verifications require bank verification before the user can finalize identity verification.
To initiate the identity verification, follow this flow:
### How Does It Look from the End Users' Perspective
When the user receives and opens the link, they will go through the standard identity verification process, with an additional step that may require bank verification.
You can preview how the bank verification request appears by reviewing the following flow:
# Bank Verification Workflow Step
Source: https://documentation.idenfy.com/guides/dashboard/bank/step-bank-verification
Configure the bank verification step in iDenfy workflows to collect account data, IBANs, balances, and transaction history from EU banks.
1. **Basic Account Data** – Includes the bank name, bank country, risk level, and other general details.
2. **Account IBAN Data** - Provides IBANs and account owner details, along with the information from the first layer.
3. **Account balances** – Displays the available and booked account balances if requested.
4. **Full Transaction History** – Retrieves transaction data for up to one year, including transaction date, booking date, details, recipient, amount, and more.*Requiring bank verification is a good idea if:*
* You want to avoid any potential issues with onboarding an illegitimate company.
* Your company’s processes require knowing potential partners' finances.
* You are working in a high-risk industry.
* You have a legal regulatory obligation.
* You want to ensure that the company is not participating in money laundering.
* You want to evaluate the registering company’s financial situation.
To set up the bank verification, follow this flow:
# Face Authentication in the Dashboard
Source: https://documentation.idenfy.com/guides/dashboard/face-auth/face-authentication
Set up biometric face authentication in the iDenfy dashboard for returning user re-verification using live facial feature matching technology.
## What Is Face Authentication?
Face authentication is a biometric verification method that utilizes the unique facial features of an individual to grant or deny access to systems, applications, or physical areas. It is a subset of facial recognition technology and is primarily used for verification purposes.
Once a user’s identity verification is **approved** in the iDenfy system, they are eligible to proceed with Face Authentication. During the session, the user takes a selfie, which the system compares against the selfie from the original identity verification.
## Safety Features
The selfie taken during Face Authentication is compared to the selfie taken during the identity verification check. The safety measures taken to prevent fraud:
1. **Face matching.** The process of comparing a selfie photo taken during a face authentication session with a selfie from the identity verification.
2. **Passive liveness.** The process of checking the liveness of the user’s face image (selfie). You can adjust the probability threshold in the settings to control whether the submitted image is genuine or taken from a screen. Modifying this value lets you tune the sensitivity for detecting spoofed or manipulated images. Contact iDenfy to enable this feature.
3. **Image detection.** The process of comparing images taken in the previous face authentication sessions in order to determine the uniqueness of each image. **This safety measurement is enabled by default.**
## Integration
1. **Mobile SDK.** Face authentication can be integrated with mobile SDK. [Instructions here.](/face-authentication/overview)
2. **iFrame.** For more details regarding the integration, please visit [documentation](/face-authentication/iframe).
## Notifications
The notification of a completed face authentication session can be created on iDenfy Dashboard: Settings → Notifications ([How to create notification](https://idenfy-ivs.atlassian.net/servicedesk/customer/portal/1)).
**Webhook notification example:**
\{
"id": "ebd19964-0899-4bfa-b14e-95e84214dc26",
"scanRef": "fb5885c5-10fe-4e24-ba2e-6c3847fafbdd",
"clientId": "6334bfbf-ab4c-4a6e-b887-98784bb4b2fe",
"status": "SUCCESS",
"token": "uFrYLi9HRDOyjTmivKXMRdCytnXZrUYOjozNrrWP",
"type": "AUTHENTICATION",
"method": "FACE\_MATCHING",
"facePhoto": null
}
## Dashboard Guide
Find all the necessary information on the iDenfy Dashboard below:
1. **Face authentication list page.** The page displays the whole list of proceeded face authentication sessions that are completed and pending. This page is under
**ID verifications → Face authentications.**
2. **Face authentication detailed view.** The page displayed detailed information about specific face authentication. To view the detailed list, simply click the full name or the arrow.
* There are identity verification and face authentication images that have been compared.
* The **user information** card contains identity verification information and the hyperlink to a particular person's identity verification.
* The authentication information contains information about the particular face authentication session:
* **Status** - authentication can be successful (approved) or unsuccessful (denied).
* **Finish time** - the timestamp of when the authentication has been finished.
* **Face authentication ID** - the unique number of face authentication.
* **Token** - the face authentication session token.
* **Client ID** - the client ID taken from identity verification.
* **Type** - the type of Face authentication:
* **Authentication -** general face authentication.
* **Method** - the method used to authenticate:
* Face matching - comparing the selfies.
* **Match ratio** - the score of face comparison. For a successful match, the face match ratio must exceed 50%.
* **Fail reason** - the unsuccessful authentication fail reason:
* FACE\_NOT\_FOUND
* TOO\_MANY\_FACES
* FACE\_ANGLE\_TOO\_LARGE
* PROBABILITY\_TOO\_SMALL
* FACE\_TOO\_SMALL
* FACE\_CLOSE\_TO\_BORDER
* FACE\_TOO\_CLOSE
* FACE\_CROPPED
* FACE\_IS\_OCCLUDED
* EYES\_CLOSED
* FAKE\_CAPTURE
* DUPLICATE\_IMAGE
* FAKE\_FACE
* FACE\_MISMATCH
* **Passive liveness probability** - the score of the liveness of the selfie.
4. **The identity verification and face authentication.** If the specific identity verification contains a face authentication session, that has been done. Find the information in the footer of the identity verification by clicking 3 dots and selecting Face authentication.
## White-Labeling
The face authentication uses identity verification personalization for white-labeling options. [Here is the information.](https://idenfy-ivs.atlassian.net/servicedesk/customer/portal/1)
## Testing
To test face authentication:
1. Open the Identity Verification interface and navigate to the footer.
2. Select the three-dot menu, then select **Face Authentication**.
3. In the pop-up, select **Create**.
4. Copy the generated session URL for use.
# Additional Features
Source: https://documentation.idenfy.com/guides/dashboard/features/additional-features
Optional iDenfy KYB features for business verification flows: identity and bank verification, tax and VAT checks, questionnaires, audits, and crossmatch.
Beyond the standard company, stakeholder, and document steps, a business verification flow can be extended with the features below. Each one is enabled in the dashboard and configured per workflow, so you can run a different set for different customer segments.
## Steps You Can Add to the Flow
These add something the client does or answers during verification.
Have directors, representatives, or beneficial owners complete an ID check inside the business verification instead of as a separate process.
Collect the company's banking data through open banking as part of the flow.
Present your risk rules to the client as questions and automate the risk decision.
Collect source of funds, compliance details, or UBO declarations with a custom question set.
## Checks on the Submitted Data
These run against the company data you already collected.
Address verification, GOV register and credit bureau reports, address audit, and white-labeling.
Collect and verify a tax identifier — VAT number, EIN, TIN, or Tax ID number.
Validate an EU VAT number and check the company name and address against the record.
Score a company website on domain age, blacklist status, and activity.
Compare data the client entered against data extracted from reports or documents to surface discrepancies.
Most of these are switched on per workflow in the workflow builder — see [Workflow Setup Overview](/guides/dashboard/setup/setup-workflow-overview). Single-owner businesses have their own dedicated step, the [Sole Proprietorship step](/guides/dashboard/kyb/step-sole-proprietorship). For everything available across the platform, see the [Full Feature List](/guides/dashboard/setup/full-feature-list).
# Bank Card Verification
Source: https://documentation.idenfy.com/guides/dashboard/features/bank-card-verification
Run iDenfy bank card ownership verification as a KYC flow step or a standalone check to confirm the card used at onboarding belongs to its holder.
Bank Card Verification confirms that a bank card used during onboarding actually belongs to the person completing identity verification. It can be added as an additional step inside the standard IDV flow, or run on its own as a standalone check.
Bank Card Verification also runs as a **standalone** check, on its own session token with no identity verification behind it and its own redirect handling. See [Create a Bank Card Session](/bank-card/create-session) for the API integration.
This page covers the version that runs as an additional step inside the IDV flow.
Bank Card Verification runs in a dedicated environment certified to **PCI-DSS v4.0.1**. Card capture and card image processing are fully separated from the rest of the platform, and no card imagery is retained once processing completes. The end-user experience is unchanged.
**Heads up:** Bank Card Verification requires settings to be enabled on your account before it becomes available. Under [Settings → Know Your Customer → AML & Fraud Prevention](/guides/dashboard/settings/aml-fraud-prevention#bank-card-verification), enable **Bank card verification** to turn the feature on, and **Bank card PDF upload** if you also want to allow users to submit a PDF instead of a live capture. Neither setting is self-service — [contact iDenfy](https://idenfy-ivs.atlassian.net/servicedesk/customer/portal/1) to request access.
## Enabling As an Additional Verification Step
### Through Dashboard
1. Select **ID Verifications** section
2. Select **New Verification**
3. Select tab **Advanced settings**
4. In the section **Additional verification steps**, find the option **Bank Card Verification** and enable it
* Title: **Bank Card Verification**
* Subtitle: *Enable card ownership check as part of the verification flow. You can optionally enter the last 4 digits of the card to confirm a match.*
5. Optionally, provide the expected **last 4 digits** of the card number in the field that appears — this field is not required.
***
## Standalone Bank Card Verification
Bank Card Verification can also run as its own flow, independently of an identity verification — useful when the user has already been verified, or when only card ownership needs confirming. A standalone session is initialized from its own bank card session token and applies your branding, language, privacy policy display and help channels from the bank card configuration.
See [Standalone Bank Card Verification](/guides/dashboard/bank-card/standalone-bank-card-verification) for the consent and capture screens, the attempt and timer rules, and the results the end user sees.
***
## How It Works
In both flows, the user is asked to photograph the front (and, if needed, back) of their bank card, or upload a supporting document. As an additional IDV step this happens after the main IDV steps; in the standalone flow it is the whole session.
* **Cardholder name matching** — the name read from the card is compared against the user's verified identity name. In a standalone session there is no IDV identity to compare against, so the check rests on the name and card number you supply.
* **Card number matching** — if the partner provided expected last 4 digits, they're compared against the card's actual last 4 digits.
| Name extracted? | Expected last 4 provided? | Verdict |
| ------------------------ | -------------------------- | ------------------------------------ |
| Yes, name matches | No | Match |
| Yes, name matches | Yes, last 4 matches | Match |
| Yes, name matches | Yes, last 4 does not match | No Match (card number mismatch) |
| Yes, name does not match | Either | No Match (name mismatch) |
| No (name not detected) | Either | No Match (cardholder name not found) |
If Bank Card Verification runs as part of an active IDV session and returns **No Match**, the verification is marked **Suspected** for further review rather than automatically denied. If it runs after the IDV has already been **Approved**, the IDV status is updated to **Suspected**. A Bank Card **No Match** result never automatically denies a verification.
Results appear alongside the identity verification in [Verification Details](/guides/dashboard/kyc/verification-details), and a follow-up Bank Card Verification request can be triggered from the review screen using [Request Update](/guides/dashboard/general/request-update).
# Proof of Address and Custom Steps
Source: https://documentation.idenfy.com/guides/dashboard/features/poa-custom-additional-step
Configure proof of address or custom image collection as an additional verification step in your iDenfy KYC or KYB workflow settings.
* [ Proof of Address (PoA)](#PoA/Customadditionalstep-ProofofAddress\(PoA\))
You can use an additional step that can be used specifically for **Proof of Address** or to collect **Custom images**
**Good to know**
* Only **one Utility Bill** can be collected for processing.
* **Multiple Custom steps** can be collected in a single flow.
* **Utility Bill** can be combined with **Custom steps** to collect several different documents.
* Titles and descriptions of steps **support localization**.
* Titles and descriptions of both **Utility Bill** and **Custom steps** are **fully customizable**.
* Supported file formats: - JPG - PNG - PDF
## Proof of Address (POA)
When using an **additional step** to collect a **Utility Bill** for proof of address, three different **upload handling types** are available:
***
## Upload Types
When an additional step is used to collect a **Utility bill** for proof of address, there are 3 types of handling provided: images of the document.
### Upload
* User uploads the document
* The document is attached to the identity verification
**No additional processing** or **validation** happens for these upload types
### Extract
* User uploads the document
* The document is attached to the identity verification
* The address is read (using OCR) from the uploaded document and added to the verification
If a partner provides an address during this step, it is ignored.
### Compare
* The user uploads the document.
* The document is attached to the identity verification.
* The address is read and **compared** with the address provided by a partner.
***
## POA AI Checks
Additional checks for the uploaded POA document. These **tags** will result in verification to be marked as **APPROVED (SUSPECTED).**
#### Allowed POA Documents
Restricts POA submissions to specific document types.
* If an unsupported type is uploaded, the IDV is flagged with:
`NOT SUPPORTED POA DOCUMENT TYPE`
#### Allowed POA Countries
Defines which issuing countries are accepted for POA documents.
* If the issuing country is not on the list, the IDV is flagged with:
`NOT SUPPORTED POA DOCUMENT COUNTRY`
#### POA Country Match
Checks if the issuing country of the document matches the country stated in the POA.
* If there’s a mismatch, the IDV is flagged with:
`POA COUNTRY MISMATCH`
#### Block POA Screenshots
Detects whether the submitted POA document is a screenshot.
* If enabled and a screenshot is detected, the IDV is flagged with:
`POA SCREENSHOT DETECTED`
#### POA Issuing Date Range
Defines an acceptable date range for POA issuance (e.g., last **12 months**).
* If the document was issued **before this range**, the IDV is flagged with:
`EXPIRED ADDITIONAL STEP INFORMATION`
***
## Providing an Address for the Compare Method
### Through Dashboard
1. Select ID Verifications section
2. Select ***New Verification***
3. Select tab ***Advanced settings***
4. In the section ***Additional verification steps,*** find the option ***Proof of address*** and ensure it’s **enabled**
5. There will be a field ***Address*** where you should provide the information
### Through API
You can also enable and provide an address when generating verification tokens via API. You can read more about it in our API documentation.
***
## Custom Additional Step
Custom steps allow you to collect **any additional documents or images** required by your industry.
### Examples of Supported Documents
* Second ID document
* Second utility bill
* Back side of documents
* Industry-specific documents (e.g., licenses, certificates, declarations)
### Upload Types
* **Only the Upload** type is supported.
* **No processing or OCR is applied** — these steps are meant to remain **flexible and customizable**.
# Questionnaire Template Setup
Source: https://documentation.idenfy.com/guides/dashboard/features/questionnaire-template-setup
Create and configure custom questionnaire templates for KYC and KYB verification flows in iDenfy with consent and language settings.
This section allows you to define the legal agreement presented to users during the verification process. You can configure the text, supported languages, and consent requirements.
### General Setup
**Company name:** Enter the legal name of your entity. This name will be dynamically inserted into the agreement text where applicable and ensures your user knows who is requesting their data.
### Policy Content
Use the **Rich Text Editor** to draft your privacy policy. The toolbar allows you to format the document to match your compliance standards:
* **Formatting:** Use Bold, Italic, Underline, and Strikethrough to emphasize key terms.
* **Structure:** Organize content using Headers (H1, H2), Bullet points, and Numbered lists.
* **Media & Links:** Insert hyperlinks to external documents, or embed images/videos if necessary.
***
### Multi-Language Support
You can provide translated versions of your policy to match your user base.
1. **Default Language:** The system usually defaults to English.
2. **Add Languages:** Click the **+ Add privacy policy** button to create a new tab for a different language.
3. **Manage Versions:** Use the arrow icon () to expand/collapse a language card, or the trash icon () to remove a translation.
***
### User Consent
**Request Privacy Policy confirmation**
* **Checked:** The user **must** manually tick a checkbox agreeing to the privacy policy before they can proceed with verification.
* **Unchecked:** The policy is displayed, but an explicit "I agree" checkbox is not required to continue.
# Questionnaire Workflow Step
Source: https://documentation.idenfy.com/guides/dashboard/features/step-questionnaire
Add and configure questionnaire steps in your iDenfy verification workflow to collect source of funds, compliance, or custom data.
You can enable questionnaire steps here:
* By creating a new questionnaire straight from workflow creation
* Creating a questionnaire outside the workflow.
Questionnaire creation
[**Full guide**](/guides/dashboard/kyb/setting-up-questionnaires-kyc-kyb) on how to create questionnaires
# Changing Verification Statuses
Source: https://documentation.idenfy.com/guides/dashboard/general/changing-statuses
Manually approve, deny, or update identity verification statuses in the iDenfy dashboard when automated results require a human override.
**Manually Changing Status**
There are times when the system status may not match your business needs.
* **Approve:** You can manually approve a user who was **Denied** by the system (e.g., if you verified the data yourself).
* **Deny:** You can manually deny a user who **Passed** the system checks but does not meet your specific internal criteria.
***
To locate these options:
1. Navigate to **Dashboard** → **ID Verifications** → **Verifications**.
2. Select the specific verification you wish to update by clicking on the applicant's **Name**.
3. Look for the **Approve** and **Deny** buttons in the bottom-right corner of the page.
**Note:** Upon clicking **Deny**, a confirmation window will appear. To proceed, you are **required** to select at least one rejection reason from the list.
**Limitations & Access Rights** Before attempting to change a status, please check the following requirements:
* [**Admin Role Required**](https://idenfy-ivs.atlassian.net/servicedesk/customer/portal/1)**:** Only users with the **Admin** role can manually Approve or Deny verifications.
* **"Deny" Availability:** The option to manually **Deny** is available *only* for partners on the **Charge Per Completed** pricing model (Basic, Premium, or Enterprise).
* **Missing Buttons?** If you have the correct role but still do not see the Approve/Deny options, please contact [**Support**](https://idenfy-ivs.atlassian.net/servicedesk/customer/portal/1) to update your account permissions.
# Criminal Background Check
Source: https://documentation.idenfy.com/guides/dashboard/general/database-check-criminal-check
Run criminal background checks across USA databases for arrest records, warrants, and prosecution history using the iDenfy dashboard tools.
Criminal check performs a search across the USA databases for any records of criminal activity.
* Criminal Prosecutions
* Arrest Records
* Warrant Lists
* Criminal Newsletters & Press Releases
* Most Wanted
* Sex Offenders
* Corrections/Inmate Data
* Child Support Violations
* Open Court Cases
* Early Release & Parole Lists
* Career Offenders
And more…
**Check returns:**
* Offense
* Offense class
* Offense description
* Offense level
* Sentence date
* Court name
* Court case number
* Release date
## How to Perform Check
You can adjust settings so that the AML check runs automatically during verification.
1. Go to ***Settings → Identity verifications (KYC) → AML & fraud prevention***
2. Check the **Criminal background check** to turn it ON
This will perform all checks, including **Criminal,** for all KYC verification automatically
**Automatic** check will only be performed on **USA-issued** documents
## How to Check and Perform
1. Open the **ID verification**
2. Click the **•••** (three dots) at the bottom and select **Criminal Background Check**
3. Click **Check**
# USA Driver's License Check (AAMVA)
Source: https://documentation.idenfy.com/guides/dashboard/general/database-check-usa-drivers-license-check-aamva
Verify USA driver's licenses against the AAMVA database to confirm document validity and ownership during iDenfy identity verification.
Checks if the USA driver's licenses (**DL**) are not expired and belong to the person who performed the full identity verification or document-only verification.
The option to check the **AAMVA** **database** will be performed:
* **Check** is **only** performed for **approved** verifications
* If a **USA DL** is used as a verification document
If the DL is issued by one of these states, an **AAMVA** check **will not** be performed
AK - Alaska
CA - California
DE - Delaware
DC - District of Columbia
HI - Hawaii
NV - Nevada
NH - New Hampshire
NY - New York
OK - Oklahoma
PA - Pennsylvania
UT - Utah
***
### How Are the Results Returned?
Once the verification is performed and the driver’s license checked, the user's information is cross-checked against the DMV record and each of the following fields is returned:
| Field |
| --------------- |
| Name |
| Surname |
| Date of birth |
| Date of issue |
| Date of expiry |
| Document number |
| Gender |
Each field returns one of three results:
| Result | Meaning |
| ----------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Match** | The submitted value matches the value on file at the DMV. |
| **No match** | The submitted value does not match the value on file. |
| **Not evaluated** | No result was produced for this field (for example, when a fallback match was not applicable — see [How Does the Matching Work?](#how-does-the-matching-work)). |
***
### What Is the Data Checked Against?
The check is performed **in real time, directly against the issuing state's DMV records**.
* iDenfy does **not** maintain a separate copy of DMV data, and does **not** rely on third-party aggregators or independent knowledge bases.
* Every verification request queries the latest records held by the DMV **at the time of the request**.
* Each state manages and updates its own DMV records on its own schedule. Because the check is real-time, the most current record available at the DMV is always used.
***
### How Does the Matching Work?
The **document (driver's license) number** is used to locate the corresponding record at the DMV.
Name suffixes are removed from the first and last name before the check runs. **JR**, **SR**, **II**, **III**, and **IV** are supported, in any capitalization or format (`JR`, `Jr`, `Jr.`). A suffix is only removed when it stands alone as the final element of a name, so names that merely contain those letter sequences — Sriubas, Junior — are left untouched.
The remaining fields are then compared **individually** against the values associated with that record. Each field returns *Match*, *No match*, or *Not evaluated*.
**Fuzzy matching for name fields**
Fuzzy and alternative matching is supported for the **first name, middle name, and last name** fields. An **exact match is attempted first**:
* If the exact match **succeeds**, the fuzzy/alternative match is not evaluated and returns *Not evaluated*.
* If the exact match **fails**, a fuzzy/alternative match is automatically attempted as a fallback.
Because suffixes are stripped before the request is sent, a suffix that appears on the document but not in the DMV record — or the other way around — no longer produces a name mismatch on its own.
***
### Interpreting the Results
* **Document number is the primary field.** If it does **not** match, the DMV could not locate a record for the provided license number.
* If the **document number matches** but the core identity fields (name, date of birth) do **not**, this may indicate that a valid license number was submitted with incorrect or unrelated personal information.
* **Isolated mismatches can be benign.** Address-related fields, in particular, may not match due to a recent address change, formatting differences, or delays in DMV record updates. Name suffixes are no longer a cause: they're normalized away before the check runs, so a name mismatch reflects a real difference in the name itself.
* When **most or all** core identity fields fail to match, it is a strong, high-confidence indicator of a genuine discrepancy rather than a formatting issue or missing DMV data. A fully non-matching response is uncommon.
***
### Limitations
AAMVA/DMV verification confirms that the submitted license data matches the issuing state's records. It does **not** authenticate the physical ID document, nor does it confirm that the person presenting it is the legitimate license holder.
For example, if a fraudster creates a counterfeit ID using genuine license data but replaces the photo, DMV verification may still succeed because the personal information matches the state record.
For this reason, AAMVA verification should be complemented with **document authenticity (forgery) checks** and **biometric verification (face match with liveness)** to mitigate identity fraud.
# Document Management
Source: https://documentation.idenfy.com/guides/dashboard/general/document-management-individuals-companies
Request and manage verification documents for individuals and companies in iDenfy using standard library items or custom document slots.
You can request specific documentation from your clients by selecting from our standard library or creating custom document slots. The process is the same whether you are verifying a person or a business.
## Adding Documents
### Standard Documents
Use pre-defined categories to quickly add common verification requirements.
1. Click the **+ Documents** button.
2. A popup appears with categories tailored to the entity type:
* **For Individuals:** Select from **Individual documents**, such as *Identity Document* or *Proof of Address*.
* **For Companies:** Browse categories like **Incorporation documents** (e.g., *Shareholder Registry*), **Ownership and structure**, or **Financial documents**.
3. Check the boxes for the documents you require and click **Add documents**.
### Custom Documents
If you need a document that isn't in the standard library (e.g., a Power of Attorney or a signed agreement):
1. Click **+ Documents** and scroll to the **Create custom documents** section.
2. Select the quantity of custom slots you want and click the plus (+) icon.
3. Name the document slot once it appears in your list.
***
## Configuring a Document Slot
Every document slot — whether standard or custom — has the same set of configurable options:
* **Document name** — Pre-set and locked for standard library documents. Editable for custom documents.
* **Allowed document type** — Restrict which file formats the client can upload for this slot. Select one or more from: **PNG**, **JPG**, **HEIF**, **PDF**. If left unrestricted, all formats are accepted.
* **Description** — Optional instructions shown to the client so they know exactly what to upload.
* **Required** — Toggle to make the document mandatory. Optional documents can be skipped by the client.
* **Translate** — Add translated versions of the document name and description for multilingual flows. A **Translated** badge appears on slots that already have translations.
***
**Company Documents**
**Individual Documents**
***
## Reordering Documents
Change the order documents appear to the client by clicking and holding the **drag handle** on the left side of any document row and moving it up or down.
# Favorites Section
Source: https://documentation.idenfy.com/guides/dashboard/general/favorites-section
Pin and organize frequently accessed company profiles and verification records using the favorites section in the iDenfy dashboard.
When working with Know Your Business (KYB) solutions, most companies provide a range of tools to help their partners verify all the necessary information about the businesses they are onboarding.
iDenfy is no exception. However, we go a step further by making that information easier to access and review. That’s where the “Favorites” section comes in.
### What Is the Purpose of the Favorites Section?
The Favorites section allows you to skip reviewing all other sections in the verification manually, so you can focus only on the details that matter most to you.
It’s especially useful when you’re new to iDenfy’s services and want a single screen view of all the KYB check details in one window.
### How Can I Customize My Favorites Section?
When we introduced the favorites section, we aimed to make it as user-friendly as possible. This resulted in a simplified setup.
To learn more about how to customize your favorites, please expand and follow the flow below:
# Field Management
Source: https://documentation.idenfy.com/guides/dashboard/general/field-management-individuals-companies
Configure default, standard, and custom data fields for individual and company verification forms in the iDenfy dashboard field management.
Whether you are onboarding an **Individual** or a **Company**, the system uses the same logic to collect data. What differs is the field groups available per entity type, plus two behaviors noted below.
### 1. Default Fields (Always Included)
These fields are mandatory to ensure the entity can be identified in the system.
| Entity Type | Default Fields |
| ----------- | ------------------------------------------ |
| Individual | Name, Surname |
| Company | Company Name, Registration Number, Country |
Sole proprietor flows default to **Company Name** and **Country** only — no Registration Number. See [Sole Proprietorship Workflow Step](/guides/dashboard/kyb/step-sole-proprietorship).
### 2. Adding Standard Fields
If you need more than just the basics, you can pull from our pre-defined library of data points.
1. Click the **+ Fields** button.
2. A popup will appear. Browse the groups (see the table below).
3. **Check the boxes** for the data points you require (e.g., Date of birth, VAT number, or City).
4. Click **Add Fields** to save your selection.
### 3. Creating Custom Fields
Need something hyper-specific that isn't in our list? You can build it yourself.
* **Location:** Scroll to the bottom of the **+ Fields** popup to **Create custom fields**.
* **Configuration:** Once added, you can define:
* **Label:** The name shown to the client (e.g., "Internal Reference ID"). Maximum 64 characters.
* **Key:** The identifier used in the API and exports. Maximum 32 characters.
* **Type:** Text, Integer, Date, Checkbox, Select, Multi select, Country, or Country multi select.
* **Options:** The choices offered — required for **Select** and **Multi select**.
* **Description:** Optional helper text displayed under the field.
* **Translations:** Per-language versions of the field's text, used when the client opens the form in that language.
* **Required:** Toggle whether the client *must* fill this out to proceed.
The dashboard accepts up to 50 custom fields per workflow, but the end-user form accepts a maximum of 10. Keep a workflow at 10 or fewer, or the form may fail for your clients.
**Company Fields:**
***
**Individual Fields:**
***
### Standard Fields by Entity Type
The two entity types do not share the same field groups.
| Entity Type | Field Groups | Standard Fields Available |
| ----------- | --------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Individual | Personal information, Legal details, Employment status, Tax identification | Email, Phone, Date of birth, Personal number, Document number, Country of birth, Country of residence, Nationality, Citizenship, Residential address, Address, Street, Self-declared PEP, Director positions, Tax residence, TIN |
| Company | Contact information, Address details, Business identification, Tax identification | Email, Phone, Website, Type, Operating address, Full address, Street, City, Postcode, Activity code, Brand names, TIN |
* There is no **Passport No.** field. The nearest equivalent is **Document number**.
* **Nationality**, **Citizenship**, **Residential address**, and **Self-declared PEP** exist for individuals only — they are not company fields.
* **Website** sits under **Business identification**, not contact details.
* The **TIN** field's label is configurable per workflow — VAT number, EIN, TIN, or Tax ID number. Only one can be active. See [TIN and EIN Verification](/guides/dashboard/kyb/tin-ein-verification).
* Shareholder and beneficiary field sets additionally offer **Ownership percentage**.
Two behaviors are handled for you rather than configured:
* Company flows manage a hidden **Region** field alongside **Country**. It is added and removed automatically and is required for US and Canadian companies.
* An individual's identity fields become read-only once that applicant has an identity verification token.
***
## Reordering Fields
You can change the order in which fields appear to the client by clicking and holding the **Drag Handle (::)** on the left side of any field row and moving it up or down. The order is saved with the workflow; any field without an explicit position is shown last.
# Finding Results
Source: https://documentation.idenfy.com/guides/dashboard/general/finding-results
Search, filter, and locate verification results by name, status, date, or custom criteria in the iDenfy dashboard verification list.
## Finding Verifications
To see all verifications, navigate to **ID Verifications** → **Verifications**
* You can **click** the verified **person's name** to open the details window
* **Click** the **arrow** on the left side of the record
***
## Filtering
You can filter by:
* Client data, statuses
* Time & Date
* Client identifiers
### Client Data, Statuses
In the top right corner, select **Add filter**
A sidebar will open, with all the selectable options
Verifications that are `EXPIRED` will **only appear** in the list if specifically filtered out
***
### Time and Date
You can use pre-made periods, or a specific time period, or use ***Search all records*** to filter all your database.
Additionally, you can **sort** by age
***
### Client Identifiers
**Click** **on** the **current** **identifier** and select the identifier you want to use:
* **Name** - client’s name, can be filtered either by name, surname, or both
* **Personal code**
* **scanRef** - this is an identifier generated for verification by **iDenfy**
* **Token string** - identifier used pre-verification
* **Client ID** - identifier added by partner
* **Email** - by the client's email, **only** **usable** if collecting this information during verification.
# Reports and Documents Tab
Source: https://documentation.idenfy.com/guides/dashboard/general/reports-documents-tab
View ordered reports, uploaded documents, company data comparisons, and AI assistant features in the iDenfy dashboard reports tab.
## Ordered Reports
This section lists all background checks and official reports requested for the company (e.g., Credit Bureau, Government Registers).
* **View Report:** Click **Detailed view** or the eye icon to expand the report and see specific data points like Company Name, Registration Number, Address, and Legal Form.
* **Download:** Use the download icon to save a local copy of the report.
#### How to Order a New Report
To fetch fresh data from external registers:
1. Click the **Order new report** button.
2. Select the entity type (Main company or Shareholder).
3. Fill in the **Company name** and **Registration number**.
4. Select the **Country** from the dropdown list.
5. **Select register:** Select the specific report type you need (e.g., Credit bureau, GOV registers, AI-generated report).
6. Click **Search** to initiate the request.
***
### Uploaded Documents
This card acts as a repository for all files related to the case, such as Annual Reports or Certificates of Incumbency.
* **Manage Files:** You can see who uploaded the file (e.g., Client) and the date.
* **Actions:**
* **View:** Click the eye icon to open the document in a new tab.
* **Edit:** Click the pencil icon to modify document details.
* **Add:** Click **Add new document** to upload a file manually.
* **Download:** Click **Download all** to retrieve every file in the list at once.
***
### Company Data Comparison
This feature allows you to cross-reference the data found in your "Uploaded Documents" against the "System Data" you already hold. This helps identify discrepancies automatically.
* **The Comparison Table:**
* **System data:** The information currently saved in your database.
* **File data:** Information extracted via OCR from the uploaded PDF/Image.
* **Result:** A status badge indicating if the data matches (Green **Match**) or if information is missing (Grey **No data**).
#### How to Run a New Comparison
If you have uploaded a new document and want to check its accuracy against your records:
1. Click **New comparison**.
2. A pop-up will display a list of available files (e.g., "Annual Report", "Incumbency Cert").
3. Select the specific file you wish to analyze.
4. Click **Compare data**.
The system will update the table with the new comparison results immediately.
***
## AI Assistant Features
The Reports tab includes advanced AI capabilities (powered by Google Gemini) designed to speed up your investigation process by automating research and document analysis.
### AI Company Report Generation
This feature generates a comprehensive background check by combining official data with a live AI-driven search of the open web.
* **What it includes:** The final PDF report provides a detailed breakdown of:
* **Company Identity:** Legal name, registration number, legal form, and incorporation date.
* **Ownership & Management:** Full structure including Shareholders (with %), Directors, and Ultimate Beneficial Owners (UBOs).
* **Risk Analysis:** AI-detected Politically Exposed Persons (PEPs), red flags, and risk considerations.
* **Business Details:** Industry classification, activity summary, and contact info.
* **How to order:**
1. Click **Order new report**.
2. Fill in the company details (Name, Country, Registration Number).
3. Under "Select register," select **AI generated report**.
4. Click **Search**.
***
### AI Insight in the Reports and Documents
The **AI Chat** feature transforms how you handle complex documentation. By using natural language, you can bypass manual reviews to find, compare, and extract critical data from Registry, GOV, or Credit Bureau reports or uploaded documents instantly.
#### Key Capabilities
* **Smart Comparisons:** Identify discrepancies in seconds (e.g., *"Compare the UBOs in the registry report vs. those provided by the user"*).
* **Instant Summaries:** Generate high-level overviews of ownership structures, financial health, and red flags.
* **Targeted Data Extraction:** Pull specific entity names, dates, or risk factors without scrolling through pages.
* **Multi-Document Support:** Compatible with Credit Bureau reports, Government Registers, Secretary of State filings, uploaded documents, and previous AI-generated reports.
#### Chat Management
Organize your workflow by creating separate threads for different tasks:
* **Create & Rename:** Use specific names (e.g., *"UBO Audit"* or *"Credit Risk"*) to keep investigations separate.
* **Export to PDF:** Download your chat history to save as a permanent record or to share with your team for audit purposes.
* **Clean Up:** Delete resolved chats to keep your workspace organized.
**Limitations**
For accurate comparisons, please make sure you are in the correct chat session where the relevant document is linked, as the AI cannot access information outside of the report.
# Request Update in the Dashboard
Source: https://documentation.idenfy.com/guides/dashboard/general/request-update
Send targeted update requests to clients for specific data corrections without requiring full re-submission in the iDenfy dashboard.
The Request Update feature allows you to ask clients to update or correct previously submitted information.
Key benefits:
* **Targeted Edits**: You can select specific areas for clients to edit, rather than requiring them to re-submit an entire dataset.
* **Accurate Information**: Helps ensure you have the most current and correct client data.
* **Compliance**: Supports maintaining up-to-date information, which can assist with regulatory requirements like Enhanced Due Diligence (EDD).
***
## How to Use **Request Update**
Open **completed** and **approved** verification
Select **Request update**
**Select** the information you want to update
If [Bank Card Verification](/guides/dashboard/features/bank-card-verification) is enabled on your account, it can also be selected as an option here — for example, to re-request a card check after a **No Match** result.
***
## Client Perspective
The client opens the received URL and sees the pages they should or could edit. If no page is specified, the client can edit all the information. By clicking on Edit
The client provides the details and clicks to answer questions. Once this is done and all the questions are answered, they receive a confirmation screen noting that all the information was submitted successfully.
# SMS and Phone Verification
Source: https://documentation.idenfy.com/guides/dashboard/general/sms-phone-verificaiton
Enable SMS or email verification as an extra security layer before identity verification begins to reduce fraud in the iDenfy flow.
**SMS (phone) and Email verification** are optional security features that add an extra layer of protection before the identity verification process begins.
* Users must **confirm their phone number or email** before starting verification.
* Helps reduce fraudulent attempts and ensures the identity belongs to the person initiating the process.
## SMS Verification
### SMS Verification for Individual Verifications
On the dashboard, navigate to the ***New verification*** section
Select the ***Advanced Settings*** tab
Scroll to the bottom of the settings and enable ***SMS verification***
### SMS Verification for All Verifications
Navigate to ***Configurations*** in the Settings section
Select ***Customisation*** tab
Enable the ***Verify phone*** option
### User's Perspective (SMS)
Before your user can perform verification, they must confirm their **phone number**
Enter their **phone number**
Receive a ***4-digit*** code to their phone
After entering the code, they will be allowed to complete verification
User is given **3 attempts** to resend and enter their number, after which the verification link will expire.
***
## Email Verification
Email verification can always be performed either by turning it on for all KYC verifications or only enabling this for specific verifications via the dashboard when generating a token.
### Email Verification for Individual Verifications
On the dashboard, navigate to the ***New verification*** section
Select the ***Advanced Settings*** tab
Scroll to the bottom of the settings and enable ***Email verification***
### Email Verification for All Verifications
Navigate to ***Configurations*** in the Settings section
Select ***Customisation*** tab
Enable the ***Verify email*** option
### User's Perspective
Before your user can perform verification, they must confirm their email
Enter their email
Receive a ***6-digit*** code to their email
After entering the code, they will be allowed to complete verification
***
### Contact Verification in the Verification Window
Find contact verification information in the verification window under the **Partner information** section.
***
## SMS and Email Verification in KYB
SMS and email verification can also be enabled per individual subject (director, representative, etc.) within a KYB workflow.
### Configuring Verification Settings for a KYB Subject
Navigate to **Settings** and open your **KYB Workflow configuration**
Select the relevant step — ***Director information***, ***Representative information***, or ***Ownership structure***
Click the **gear icon** next to the ID verification toggle for that step
In the ***Edit verification settings*** modal that opens, scroll to the bottom and enable **Email verification** or **SMS verification** as needed
Click **Save** to apply the changes.
# User Feedback and Messages
Source: https://documentation.idenfy.com/guides/dashboard/general/user-feedback-messages
Review the verification status screens and specific denial error messages shown to users during document and face checks in iDenfy.
This guide details the specific feedback messages your customers receive during the verification process. It covers the general status screens (Success, Failed, Suspected) and the specific error codes returned when a document or face check fails.
The English wording is shown below for reference. These messages are displayed in the language the user selected for the verification — see [Supported Languages](/resources/supported-languages).
## General Status Screens
These are the primary messages displayed to your user at the end of a verification session.
| Status | User Message (Title / Subtitle) | Meaning |
| -------------- | ---------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------ |
| **Success** | **"Verification successful"**
Your identity has been confirmed. | The user passed all checks. (This is the standard message when no issues are found). |
| **Failed** | **"Your verification was unsuccessful"**
Unfortunately, we could not confirm your identity. Something went wrong. | The verification was denied due to a critical error or policy violation. |
| **Suspected** | **"Thank you. Verification may be further investigated."**
Your information has been submitted. Some discrepancies were identified. | The system flagged potential issues. The session is likely sent for manual review. |
| **Unverified** | **"Verification time expired"**
The verification process was not performed within the allocated time. | The user abandoned the session or the time limit ran out. |
## Face Denial Reasons
These errors occur during the selfie capture or liveness check.
| Message to User / Description | Explanation |
| --------------------------------------------------------- | ------------------------------- |
| **"The face appears covered, not visible, or spoofed."** | Face covered or spoofed. |
| **"The face appears too blurry. Device may be shaking."** | Blurry face photo. |
| **"Mismatch between the selfie and the document photo."** | Face doesn't match ID photo. |
| **"Face could not be found in the selfie."** | No face detected. |
| **"More than one face was detected in the photo."** | Multiple faces detected. |
| **"Automatic verification of face was not possible."** | Unable to verify automatically. |
***
## Document Denial Reasons
These errors occur during document analysis. They are grouped by category for easier debugging.
### Visibility and Image Quality
| Message to User / Description | Explanation |
| ------------------------------------------------------------ | ---------------------------- |
| **"Cannot find the document in the photo provided."** | Document not found. |
| **"Parts of the document are hidden or cut off."** | Document not fully visible. |
| **"Document is too blurry to read (focus/lighting issue)."** | Blurry document photo. |
| **"Too much glare/reflection on the document."** | Glare on document. |
| **"Too much glare specifically on the face photo."** | Glare on face photo. |
| **"Face photo could not be located on the document."** | Photo not found on document. |
| **"Document appears physically damaged."** | Document damaged. |
### Data Mismatches and Validity
| Message to User / Description | Explanation |
| ------------------------------------------------------------------- | -------------------------- |
| **"Information from document does not match client input."** | Information doesn't match. |
| **"The document is expired and cannot be used."** | Document expired. |
| **"Potential spoof or fake detected."** | Possible spoof detected. |
| **"Issue reading document authenticity (suspected fake)."** | Suspected fake document. |
| **"Personal code found but could not be verified/invalid format."** | Invalid personal code. |
### User Selection Errors
| Message to User / Description | Explanation |
| --------------------------------------------------------------------------- | -------------------------------- |
| **"Uploaded document does not match selected type (e.g. Passport vs DL)."** | Wrong document type selected. |
| **"Issue recognizing the specific document subtype."** | Document subtype not recognized. |
| **"Provided side does not match (e.g. Front instead of Back)."** | Wrong document side uploaded. |
| **"Document country does not match selected country."** | Country doesn't match. |
| **"Document type is not supported."** | Document type not supported. |
| **"Document type is valid but not allowed by your configuration."** | Document type not allowed. |
| **"The specified country is not supported."** | Country not supported. |
### Data Extraction Failures (Specific Fields)
| Message to User / Description | Explanation |
| ------------------------------------------------------- | ----------------------------- |
| **"Name not found or differs too much from input."** | Name couldn't be verified. |
| **"Surname not found or differs too much from input."** | Surname couldn't be verified. |
| **"Unable to find expiry date."** | Expiry date not found. |
| **"Unable to find date of birth."** | Date of birth not found. |
| **"Unable to find personal code."** | Personal code not found. |
| **"Unable to find document number."** | Document number not found. |
| **"Date of issue could not be read."** | Issue date not found. |
| **"Sex/Gender could not be read."** | Sex/gender not found. |
| **"Nationality could not be read."** | Nationality not found. |
### Technical Reading Errors (MRZ, Barcode, NFC)
| Message to User / Description | Explanation |
| --------------------------------------------------------- | --------------------------- |
| **"Machine Readable Zone (MRZ) area cannot be located."** | MRZ area not found. |
| **"MRZ code appears to be invalid."** | Invalid MRZ code. |
| **"Trouble reading the MRZ text characters."** | MRZ text unreadable. |
| **"Barcode could not be located."** | Barcode not found. |
| **"Issue reading the document NFC chip."** | NFC chip read failed. |
| **"Could not initialize NFC reading."** | NFC reading couldn't start. |
| **"NFC reading timed out."** | NFC reading timed out. |
### System Errors
| Message to User / Description | Explanation |
| ----------------------------------------------------- | ------------------------ |
| **"An error occurred while analyzing the document."** | Document analysis error. |
| **"The document was not analyzed."** | Document not analyzed. |
***
# Website Audit
Source: https://documentation.idenfy.com/guides/dashboard/general/website-audit
Scan company websites for risk scores, domain age, blacklist status, and activity information using the iDenfy website audit dashboard.
The **Website Audit** scans a provided website and returns risk scores, domain age, and activity information.
You can also run this audit directly via the Partner API. See the [Website Audit](/kyb/social-screening#website-audit) reference.
## Provided Information
Analyzes the website's content, structure, pages, and social media presence to gauge how well it's built and indexed by search engines and social platforms.
**Range:** 0 to 100
Uses Google-based scanning engines to measure how popular the website is in local and international markets.
**Range:** 0 to 100
Uses Google-based scanning engines to detect mentions of the website on fraudulent or bad-reputation sites.
**Range:** -100 to 0
Uses Google-based scanning engines to detect positive mentions of the website from news agencies and reliable sources.
**Range:** 0 to 100
Combines all scores into a single, human-readable level, from **Very low** to **Very high**.
How many years ago the website's domain was registered.
The website's main activity, based on its content.
## Risk Score
Internal audit, popularity, and trust scores range from **0** (worst) to **100** (best).
Blacklist score ranges from **-100** (worst) to **0** (best).
The formula calculates the overall risk score by combining all individual scores.
## Risk Level
| Risk score | Risk level |
| ------------ | --------------------------------------------- |
| 91 and above | **Very low** |
| 80 to 90 | **Low** |
| 71 to 80 | **Medium** |
| 61 to 70 | **High** |
| 60 and below | **Very high** |
# Additional KYB Features
Source: https://documentation.idenfy.com/guides/dashboard/kyb/additional-features-kyb
Enable address verification, government registry lookups, credit bureau reports, website audits, and white-labeling for iDenfy KYB flows.
## Address Verification
The address verification feature enables automatic identification of your clients' addresses by extracting company and address details from their submitted documents. This data is then cross-checked against global databases, which review information such as country, zip code, and street address.
If the address verification is successful, no tags are assigned. However, if the address cannot be fully verified, the verification is approved but flagged with a "suspected" tag. This ensures that companies with fake or non-existent addresses do not pass the verification. You can read more about the address verification [here](https://idenfy.com/proof-of-address-verification/?utm_source=utility-bill-verification-header\&utm_term=utility-bill-verification-header\&utm_content=utility-bill-verification-header).
## GOV Register (Registry Report)
We offer two types of government registry reports: a Lite version and a Full Detailed version. Both reports evaluate a company’s legitimacy by examining historical business, financial, and ownership information from over 180 interconnected registries. This provides access to data on more than 170 million legal entities across 120 countries when you use our product.
Our product is designed to simplify ease of use, making it convenient for you to use as a partner. Simply gather the company’s information by submitting a manual or automated request for verification and collect mandatory information such as company name, registration number, country, and region (for USA, Canada).
Once submitted, you can either visit the verification page for manual review or use automated flow to check the company and decrease the decision time.
If you decide to review the generated company report manually, you can view it in three ways: PDF, developer view, or data analyst view. This lets you make the best use of the information at hand.
Example view of partial returned information:
## Credit Bureau Report
We offer two types of Credit Bureau registry reports, Lite and Full Detailed, which allow you to select the option that best suits your business needs. These reports provide up-to-date information on the business, including business status, ownership details, credit rating, financial data, additional company information, negative records, and registration activities. Both reports are readily accessible and available for download in PDF format.
To generate a report, begin by collecting the company’s information through business verification, including its name, company registration number, and country. With this data, you can either manually generate the report by visiting the client’s completed verification page or set up automation to skip the manual process.
## Address Audit
The Address Audit feature allows you to verify the business address details of the company that performed the business verification. Once the company completes the verification process on their end, you can initiate an address check by selecting the "Check" option in the address verification subsection. The reviewed information includes:
* Nearby companies
* Building address
* Country
* Google Street View of the building and surrounding area (if available)
* Coordinates (longitude and latitude) for precise location mapping
Based on this information, a risk level is assigned to the company according to its address details.
The functionality requires a full address, including the postcode, to work effectively. Incomplete address information may impact accuracy.
## Website Audit
Website Audit enables you to review the website of the registering company. To perform the audit, the person who completed the KYB verification form must have provided a website link. Without this link, the audit feature will not function. If the link is missing or incorrect, use the available options to request additional information or contact the user to update the details.
If we have the website information, the process will start manually or automatically, and the following results will be shown:
* **Internal audit score** – explains how well the audited website is built, how many pages it has, and how well it is indexed by search engines and social media.
* **Popularity score** - explains how popular the audited website is in local and international markets.
* **Blacklist score** - determines how many fraudulent and bad reputation websites are mentioned on the audited website.
* **Trust score** - shows how many news agencies and other websites are positively mentioned on the audited website.
* **Domain created** - shows the audited website's age and when the domain was registered.
* **Website Activity** - indicates the information about the main website’s activity based on the audited website.
* **Risk level** - determines the overall level by summing all above field results in a human-readable format.
Website audit returned result example:
## Company Name Audit (Social Company Profile)
The Company Name Audit feature displays information about a company’s social profile by extracting data from Google, including its Google rating, reviews, description, address, phone number, and more. Accessing this information helps verify the company’s legitimacy. Additionally, you can expand comments and reviews directly within the dashboard to view full text.
To conduct a company name audit, the company’s full address and name are required.
## KYB White-Labeling
The KYB white-labeling option enables full customization of the interface used during the Know Your Business verification process. This includes modifying UI colors, adding the company logo, and even incorporating the company’s preferred font. Once all the details are set up, the
feature allows the partners to dynamically see how their customizations will appear. You can create multiple white-labeling themes, but only one theme can be active at a time.
## Other Risk Factors
The other risk factors section allows you to perform multiple checks associated with the company in one place.
*The checks include:*
* **Company Website Domain Check** - Verifies whether the company’s website domain matches its email domain.
* **Beneficiaries’ Email Domain Check** - Confirms if the email domain of the beneficiaries matches the company’s email domain.
* **IP Country Match** - Ensures that the IP location (at the country level) aligns with both the IP used during registration and the company’s registered country.
* **Company Email Duplicates** - Identifies duplicate email addresses by comparing those of the partner’s clients (companies) with newly registered clients (companies).
* **IP Proxy Check** - Assesses the risk level of an IP address by detecting links to known fraudulent proxies.
* **Fraud Probability Estimation** - Analyzes multiple customer-related data points to determine the likelihood of fraudulent activity.
This is how the unperformed checks tab is displayed in the KYB dashboard:
# AI Reviewer for KYB
Source: https://documentation.idenfy.com/guides/dashboard/kyb/ai-reviewer-overview
Run automated AI-powered KYB reviews, interpret outcomes, and learn how the iDenfy AI reviewer evaluates companies and their associated people.
**Feature enabling**
To use this feature, you first need [**settings enabled**](https://idenfy-ivs.atlassian.net/servicedesk/customer/portal/1) and an **AI flow** configured. See [AI Reviewer Settings](/guides/dashboard/settings/ai-reviewer) for setup instructions.
## How the AI Reviewer Works
The AI reviewer runs a configured sequence of checks against a company and its associated people (directors, shareholders, UBOs, and so on). Each check produces one of three outcomes:
| Outcome | Meaning |
| -------------- | --------------------------------------------------------------------- |
| **Accepted** | The check passed all configured criteria. |
| **Unaccepted** | The check failed. One unaccepted check is enough to deny the company. |
| **Skipped** | The check could not run — usually because required data was missing. |
Once all checks complete, the reviewer sets the overall company result:
* **Approved** — every check is Accepted or Skipped.
* **Denied** — at least one check is Unaccepted.
* **Flagged** — checks passed, but unresolved AML flags exist on the case. The company stays in its previous status until the flags are resolved manually.
***
## Initiating a Review
If the automated analysis has not been triggered yet, the main window will show an **"AI review not yet initiated"** status.
There are two ways to start it:
* Click **Run AI reviewer** in the center of the screen.
* Click **Get AI reviewer insights** in the top header, next to the company status.
If the **Automated AI review** toggle is enabled in settings, the reviewer runs automatically for every new business verification — no manual trigger needed.
***
## Reading the Results
Once the review finishes, the interface updates to reflect the automated decision.
### Overall Outcome
Check the top of the company profile:
* **Company Status Badge** — shows the current status (e.g. a green **Approved** badge).
* **AI Decision Button** — a green **Accepted by AI reviewer** button confirms the automation cleared the entity.
### Task Cards
The **AI reviewer** tab breaks the review down into individual check cards, one per configured rule.
Each card shows:
* **Check name** — identifies which rule ran (e.g. AML check, Company details comparison).
* **Actual outcome** — the result of the check. Shows **NA** if the check was skipped.
* **Skipped indicator** — if the AI could not perform a check (missing data, unavailable report, API error), the card is marked **Skipped**.
* **Analyze again** icon — re-runs this specific check after you have updated data or fixed a configuration issue.
**Company name matching** treats minor spelling and formatting differences as **Full match** — including case variants, special-character equivalents (e.g. Müller = Mueller), legal-form abbreviations, punctuation, "&" vs "and", and extra whitespace. Word-order differences still produce a Partial match. The same logic applies to beneficiary name and surname fields.
***
## Concurrent Reviews
The system locks per company during a review run. If two people trigger a review at the same time, only one runs — the other is rejected. Wait for the first review to complete before retrying.
***
## Next Steps
* For skip and failure reasons on each check type, see [Checks Reference](/guides/dashboard/kyb/ai-reviwer-check-reference).
* To configure rules and automation settings, see [AI Reviewer Settings](/guides/dashboard/settings/ai-reviewer).
# Checks Reference
Source: https://documentation.idenfy.com/guides/dashboard/kyb/ai-reviwer-check-reference
Reference for the iDenfy KYB AI reviewer checks, including reasons each check may be skipped or fail and a diagnostic table for troubleshooting.
The AI reviewer runs up to 9 checks per company. This page documents when each check is skipped or marked as failed, plus a diagnostic table for common symptoms.
***
## Rules That Apply to All Checks
The following conditions block or skip **any** check, regardless of type:
* **No rule set configured for the partner** — the reviewer has no instructions to run. Nothing executes.
* **Rule set exists but contains no rules** — same result, nothing runs.
* **Rule targets a beneficiary type that is not present on the case** — the rule is silently skipped. No result is created and the frontend shows nothing for it.
* **Check ran but outcome is not in the accepted outcomes list** — the check is marked Unaccepted and the company is Denied (unless an override applies).
* **Unresolved AML flags on the case** — even if all checks pass, the reviewer overrides Approve → **Flagged** and does not complete the case. It stays in the previous status until the flags are resolved manually.
* **Concurrent review attempts** — the system locks per company. If two reviews are triggered simultaneously, only one runs; the other is rejected.
***
## Check-Specific Skip and Failure Reasons
### 1. Details Comparison (AI / Gemini)
Compares company or person data against a source document using Google Gemini.
**Skipped when:**
* No data source document type is configured (e.g. no credit bureau, no Companies House report).
* The configured document type is in settings but no document was uploaded or fetched for this company.
* The fields to compare data in [**Settings**](/guides/dashboard/settings/ai-reviewer) are not set.
* The document file is unreadable or corrupted.
* The Gemini API call fails or times out.
**Special failure — "Not Listed":**
When checking a beneficiary (e.g. a director), Gemini may report that the person's name does not appear in the document at all. Whether this counts as a failure depends on how `beneficiary_not_found_status` is configured in the rule. If not configured, it defaults to Unaccepted.
***
### 2. AML Check
Checks AML, sanctions, and PEP screening status for the company or a beneficiary.
**Skipped when:**
* No AML check record exists for the target (company or person).
**Failed when:**
* Flags were found and the rule only accepts "No Flags".
* The AML check was never performed at all (treated as Unaccepted, not Skipped).
***
### 3. Identity Verification (IDV)
Checks whether a beneficiary passed KYC.
**Skipped when:**
* The rule is configured for the main company (IDV only applies to individual people).
* The beneficiary has no linked client record.
* The beneficiary's client has no KYC or identification record.
**Failed when:**
* The IDV status is not in the accepted list (e.g. rule requires Approved but the person is Rejected or Pending).
***
### 4. Address Verification
Checks whether the company's address was verified.
**Skipped when:** No address verification record exists for the company.
**Failed when:** The status is below the accepted threshold (e.g. rule requires Verified but the result is only Partially Verified).
***
### 5. Address Audit
Checks the risk level of the company's address.
**Skipped when:** No address audit record exists.
**Failed when:** The risk level is higher than the rule accepts (e.g. rule accepts up to Medium risk but the result is High).
***
### 6. Website Audit
Checks the risk level of the company's website.
**Skipped when:** No website audit record exists.
**Failed when:** The risk level exceeds the configured threshold — same logic as Address Audit.
***
### 7. VAT Verification
Checks VAT registration validity.
**Skipped when:** No VAT verification record exists. The check defaults to a "Not Checked" outcome, which may or may not be acceptable depending on rule configuration.
***
### 8. EIN Verification (US Only)
Same as VAT verification but for US EIN numbers.
**Skipped when:** No EIN verification record exists. Defaults to "Not Checked".
***
### 9. Proof of Address (POA)
Checks proof of address status for the company or a person.
**Skipped when:** No POA check record exists for the target entity.
**Failed when:** Status is No Match or Not Compared, and the rule requires Match.
***
## Quick Diagnostic Guide
| Symptom | Most Likely Cause |
| ---------------------------------------------- | ------------------------------------------------------------------------------- |
| Check not shown at all in the UI | No result created — beneficiary type missing, or data source document absent |
| All checks skipped | Rule set is configured but contains no rules |
| Check shows "Skipped" despite correct settings | Missing upstream data: no document uploaded, no AML check run, no address audit |
| Approved, then immediately Flagged | Unresolved AML flags exist on the case |
| Beneficiary check skipped | No beneficiary of that type (Director, UBO, etc.) added to the case |
| Gemini / Details Comparison skipped | Document upload failed, file is corrupted, or Gemini API error |
For partner-specific rule set configuration, contact the integrations team. For data pipeline issues (why an audit or AML check never ran), contact engineering.
# Bank Verification in KYB Flow
Source: https://documentation.idenfy.com/guides/dashboard/kyb/bank-verification-on-kyb
Add open banking verification to your iDenfy KYB workflow to collect company banking data for compliance and business verification.
We have introduced an option to perform bank verification on the KYB flow. This will allow you, as our partner, to more easily collect the registered company’s banking data based on your compliance or business needs.
Before performing bank verification on the KYB flow, make sure you comply with regulations that could potentially impact your company.
*Requiring bank verification is a good idea if:*
* You want to avoid any potential issues with onboarding an illegitimate company.
* Your company’s processes require knowing potential partners' finances.
* You are working in a high-risk industry.
* You have a legal regulatory obligation.
* You want to ensure that the company is not participating in money laundering.
* You want to evaluate the registered company’s financial situation.
## What Bank Information Can Be Collected?
Four layers of bank verification data can be retrieved:
* **Basic Account Data** – Includes the bank name, bank country, risk level, and other general details.
* **Account IBAN Data** – Provides IBANs and account owner details, along with the information from the first layer.
* **Account balances** – Displays the available and booked account balances if requested.
* **Full Transaction History** – Retrieves transaction data for up to one year, including transaction date, booking date, details, recipient, amount, and more.
## How to Add Bank Verification to the KYB Flow
To add the bank verification to the KYB flow, please follow this flow:
Select business verifications → select settings → Custom flows → select if you wish to create a new verification or edit an existing one.
If you decide to create a new verification, please follow [this flow](/guides/dashboard/kyb/identity-verification-on-kyb-custom-flow).
If you, however, wish to edit an existing one, after selecting the three dots, select edit and follow the details below:
## How to Start Performing Verifications After the Flow Is Added
When you’ve added the bank verification request option to your flow, all you have to do is start a verification session, requesting that the company verifying to perform the verification. You can read more about this by following this flow:
## How It Looks from the Users' Side
To familiarize yourself with how the bank verification looks on the end users side, please follow this flow:
# Business Verification
Source: https://documentation.idenfy.com/guides/dashboard/kyb/business-verification
Get started with iDenfy Know Your Business (KYB) verification including company data collection, UBO checks, and registry searches.
## What Is KYB (Know Your Business)?
Check out our [**blog post**](https://idenfy.com/blog/know-your-business-kyb/?utm_content=undefined) to learn everything you need to know about starting your **business verification!** If you’re interested in the KYB services we provide, you can find more information [**here**](https://idenfy.com/know-your-business-solution/).
***
# KYB with Risk Assessment Integration
Source: https://documentation.idenfy.com/guides/dashboard/kyb/business-verification-with-risk-assessment-integration
Integrate automated risk assessment into your iDenfy business verification flow with custom rules presented as end-user questions.
Risk assessment can be integrated and fully automated with business verification functionality. All risk rules should be structured in a way that they can be presented as questions to your end user.
As you may already have, you need to create a business verification custom flow here: **Business verifications → Settings → Custom flows.**
#### Adding Risk Assessment on a Custom Flow
\*To add Risk assessment on a Custom flow you need to have created Risk assessment profile. [How to create Risk assessment profile.](https://idenfy-ivs.atlassian.net/servicedesk/customer/portal/1)
1. Open a new or existing custom flow by navigating to **Business Verifications → Settings → Custom Flows**.
2. Enable the Risk Assessment switch on the Risk Assessment card.
3. Select the Risk Assessment profile you want to add to that specific flow.
4. Once the Risk Assessment profile is selected, you will see all the rules created in the assessment. Assign these rules to the appropriate pages (e.g., "Is Director a PEP?" to the Director page, "Industry" to the Company Details page, etc.).
5. Add the field names for the rules that will be visible to your clients.
Save the custom flow. When your client submits the form, the risk assessment will be calculated automatically.
# Collecting Multiple Identity Documents
Source: https://documentation.idenfy.com/guides/dashboard/kyb/collecting-multiple-identity-documents-using-idenfy-api-and-
Collect multiple identity documents such as ID card plus residence permit in a single iDenfy verification using API and web redirect.
## Overview
This guide explains how to collect a full verification (selfie + identity document) along with an additional identity document (e.g., residence permit) using the iDenfy API and web redirect.
**Common use case:** Non-resident verification requiring both a primary ID document and a residence permit.
***
## Choosing a Method
| | Method 1: Two separate sessions | Method 2: Additional steps |
| ------------------- | ---------------------------------------------------------- | -------------------------------------------------------- |
| **Sessions** | Two sessions with the same `clientId` | Single session |
| **Data extraction** | Full automatic extraction from both documents | Additional document is stored only — no extraction |
| **Data comparison** | Compare extracted fields (name, DOB) to verify same person | Manual review required |
| **Setup** | No extra configuration needed | Requires iDenfy support to configure the additional step |
**Recommendation:** Use Method 1 if you need automatic data extraction and comparison between documents.
***
## Method 1: Two Separate Sessions
Generate two sessions with the same `clientId`, chain them using redirect URLs, and compare the webhook results.
### Step 1: Generate Both Sessions
Create the **identity verification** session first. Set its redirect URLs to point to the second session's redirect URL.
```bash theme={"system"}
POST https://ivs.idenfy.com/api/v2/token
Authorization: Basic {API_KEY:API_SECRET in base64}
```
```json theme={"system"}
{
"clientId": "USER_12345",
"firstName": "John",
"lastName": "Smith",
"dateOfBirth": "1990-05-15",
"tokenType": "IDENTIFICATION",
"successUrl": "https://ivs.idenfy.com/api/v2/redirect?authToken=DOCUMENT_TOKEN",
"errorUrl": "https://ivs.idenfy.com/api/v2/redirect?authToken=DOCUMENT_TOKEN",
"unverifiedUrl": "https://ivs.idenfy.com/api/v2/redirect?authToken=DOCUMENT_TOKEN",
"callbackUrl": "https://yoursite.com/webhook/idenfy"
}
```
Then create the **document verification** session:
```json theme={"system"}
{
"clientId": "USER_12345",
"firstName": "John",
"lastName": "Smith",
"dateOfBirth": "1990-05-15",
"tokenType": "DOCUMENT",
"successUrl": "https://yoursite.com/verification/complete",
"errorUrl": "https://yoursite.com/verification/failed",
"unverifiedUrl": "https://yoursite.com/verification/review",
"callbackUrl": "https://yoursite.com/webhook/idenfy"
}
```
Use the `authToken` from the document session response as `DOCUMENT_TOKEN` in the identity session's redirect URLs. This chains the two sessions so the user is automatically redirected after completing the first verification.
### Step 2: Send the User to Verification
```javascript theme={"system"}
const identityUrl = `https://ivs.idenfy.com/api/v2/redirect?authToken=${identityToken.authToken}`;
window.location.href = identityUrl;
```
### Step 3: Handle Webhooks and Compare Data
You will receive two separate webhooks — one for each session. Use the `clientId` to link them and compare extracted data.
```javascript theme={"system"}
const verifications = {};
app.post('/webhook/idenfy', async (req, res) => {
const payload = req.body;
const clientId = payload.clientId;
if (!verifications[clientId]) {
verifications[clientId] = {};
}
if (payload.tokenType === 'IDENTIFICATION') {
verifications[clientId].identity = payload;
} else {
verifications[clientId].document = payload;
}
// Check if both sessions are complete
if (verifications[clientId].identity && verifications[clientId].document) {
const identity = verifications[clientId].identity.data;
const document = verifications[clientId].document.data;
const isMatch =
identity.docFirstName === document.docFirstName &&
identity.docLastName === document.docLastName &&
identity.docDob === document.docDob;
if (isMatch) {
await updateUserStatus(clientId, 'VERIFIED');
} else {
await updateUserStatus(clientId, 'REQUIRES_REVIEW');
}
}
res.status(200).send('OK');
});
```
**Suggested fields to compare:** first name, last name, date of birth.
### User Journey
1. User clicks verification link
2. Opens identity verification (selfie + ID)
3. Completes identity verification
4. Automatically redirected to document verification (residence permit)
5. Uploads additional document
6. Redirected to your success URL
7. Two webhooks received — compare data to validate the same person
***
## Method 2: Additional Steps
Use this when you do not need data extraction from the additional document.
### Setup
Contact [iDenfy support](https://idenfy-ivs.atlassian.net/servicedesk/customer/portal/1) to configure an additional step in your environment (e.g., `RESIDENCE_PERMIT`).
### Generate Session
```bash theme={"system"}
POST https://ivs.idenfy.com/api/v2/token
Authorization: Basic {API_KEY:API_SECRET in base64}
```
```json theme={"system"}
{
"clientId": "USER_12345",
"firstName": "John",
"lastName": "Smith",
"tokenType": "IDENTIFICATION"
}
```
The additional step is included automatically from your environment configuration.
### Webhook Result
```json theme={"system"}
{
"final": true,
"status": {
"overall": "APPROVED"
},
"data": {
"docFirstName": "JOHN",
"docLastName": "SMITH",
"docDob": "1990-05-15"
},
"fileUrls": {
"FACE": "https://...",
"FRONT": "https://...",
"RESIDENCE_PERMIT": "https://..."
},
"additionalSteps": {
"RESIDENCE_PERMIT": "UPLOAD"
}
}
```
The additional document is stored only — no automatic data extraction. You will need to manually review or process the document image from `fileUrls`.
## Related Pages
* [Token generation](/kyc/generate-token)
* [Additional steps](/kyc/additional-steps)
* [Webhooks](/kyc/webhooks)
# Company Details Tab
Source: https://documentation.idenfy.com/guides/dashboard/kyb/company-details-tab
View and manage company legal identity, related subjects, documents, ownership structure, and questionnaire answers in the dashboard.
**Fields**
**Fields** and **documents** in this page will depend on your [**Workflows**](/guides/dashboard/setup/setup-workflow-overview)
***
### Internal and Submitted Information
These cards manage the core legal identity of the business.
* **Internal Company Information:** Tracks technical metadata like **Workflow** type, **Client ID**, and the environment (**Production/Demo**).
* **Submitted Company Information:** **Manual Edits:** Use **Edit** to fix data typos or **Block** to manually restrict the entity.
* **Entity Screening:** View results for **Sanctions** and **Adverse Media** specifically for the legal entity.
* **Check:** Run an initial screening if not yet performed.
* **View:** Open the full detailed report.
* **Recheck:** Click the **Refresh icon** to pull the most recent data from global databases.
***
### Related Subjects (UBOs, Directors, Reps)
This section manages screening and identity verification for every individual or holding company linked to the business.
* **Subject Navigation:** Use the numbered buttons (**1, 2, 3...**) to switch between profiles (e.g., switching from the CEO to a Major Shareholder).
* **Compliance Checks (PEPs, Sanctions, Adverse Media):**
* **Check:** Manually trigger a search for a specific person.
* **View Results:** Investigate matches if **"Flags Found"** appears.
* **Recheck:** Refresh the screening status to ensure compliance with the latest global lists.
* **Identity Verification (KYC):**
* **View Verification:** Click to see the results and photos of a subject's completed identity session.
* **Create KYC Token:** If a subject hasn't been verified, generate a unique link to send to them for identification.
* **Add/Change Scan Ref:** If the subject has already completed identity verification elsewhere — including as a Director, Representative, or Beneficial Owner of a different company — enter their existing **Scan Ref** here to link that verification instead of requesting a new one. There's no limit on how many companies can reuse the same Scan Ref.
* **Management:** You can **Delete** a subject or **Add Beneficiary** manually if they were missing from the initial submission.
### Document Management
Manage all supporting evidence submitted by the client or requested by your team.
* **Access:** Click **"Uploaded documents"** to open the management portal.
* **Upload:** Add new files manually by selecting a **Document Type** and using the **Drag and Drop** zone.
* **Actions:** You can **view** files in the browser, **edit** document metadata, or **Download All** for your internal records.
***
### Ownership Structure
Visualizes how the company is controlled and owned across multiple layers.
* **Quick View:** Displays the first level of shareholders and their stakes.
* **Full Structure:** Click **"See full structure"** to open a comprehensive modal showing the entire chain from the applicant company down to the **Ultimate Beneficial Owners (UBOs)**.
* **Risk at a Glance:** The full structure table highlights screening hits (PEPs/Sanctions) for every entity in the chain simultaneously.
***
### Questionnaire Answers
Displays the client's direct self-reported responses.
* **Declarations:** View specific answers regarding **PEP status**, **Company Revenue**, or other custom legal/financial questions.
* **Verification:** Use this data to cross-reference against the automated audit results and submitted documents.
***
### Ordered Reports
Official registry and bureau reports ordered for this company are available in the **Reports & Documents** tab. Supported sources include Government Registers, Credit Bureau, Secretary of State, Companies House (UK), and AI-generated reports.
[View available report types →](/guides/dashboard/kyb/ordered-reports)
# Company Expiration
Source: https://documentation.idenfy.com/guides/dashboard/kyb/company-expiration-and-update
Set a per-company KYB re-verification deadline at approval, override the global default, and trigger automated expiration reminder emails.
When a company is approved, you can assign an expiration period — a number of months after which the company's KYB is considered stale and re-verification is required. Automated reminder emails are sent to the company **one month before** and **on the expiration date**.
***
## Approving a Company
To approve a company and set its expiration:
1. Go to **Business Verifications** → **Verifications**.
2. Open the company you want to review.
3. Click the **Approve** button in the bottom right corner.
***
## Approve Company Modal
Clicking **Approve** opens a confirmation modal with two optional sections.
### Send Confirmation Email
When enabled, an email is sent to the client informing them that their company has been reviewed. Toggling this on expands the email form:
| Field | Notes |
| ------------------------- | ------------------------------------------- |
| **Email address** | Required if the toggle is on |
| **Select email template** | Optional pre-made text |
| **Email subject** | Required if no template is selected |
| **Add recipients to CC** | Optional |
| **Message to client** | Required — enter clear, informative content |
### Company Expiration Check
When enabled, sets a re-verification deadline for this specific company. Expanding the toggle shows a single field:
| Field | Notes |
| ------------------------------- | ---------------------------------------------------------------------------------------------------------------------- |
| **Expiration period in months** | Accepts values from **2 to 60**. Leave the toggle off or leave the field empty to disable expiration for this company. |
If the global default is configured in **Settings → Configuration (KYB)**, it is pre-filled here automatically. You can override it, or disable expiration entirely for this company by turning the toggle off.
Disabling the toggle in this modal only affects this company — it does not change the global default.
***
## How the Expiration Value Is Determined
The expiration period comes from one of two sources; the per-company locked value always takes precedence.
| Source | Description |
| ------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| **Partner default** | Set in [Settings → Configuration (KYB)](/guides/dashboard/settings/configuration-kyb). A nullable value (2–60 months or empty = disabled). Used as a fallback when no per-company value has been locked yet. |
| **Company locked value** | Set at approval time and never overwritten by future changes to the partner default. `NULL` = no expiration for this company. |
**At approval time, the value is locked as follows:**
* If the company was approved before (a locked value already exists) → the existing value is kept, regardless of what is entered in the modal.
* If no locked value exists and no override is provided in the modal → the partner default is copied.
* If no locked value exists and an override is provided → the override is used. This requires the caller to have `UPDATE_PARTNER_CUSTOMISATION_CONFIG` permission and the partner to have `check_company_expiration_edit = True`.
Once locked, the expiration period is fixed to the company. Changes to the global default in Settings do not affect already-approved companies.
**Validation:** Both the partner default and the per-company override accept **2–60 months** or **NULL** (disabled).
# Company Page
Source: https://documentation.idenfy.com/guides/dashboard/kyb/company-page
Navigate the company page in iDenfy business verification to review profile overview, details, compliance information, and risk signals.
The **Company Page** brings together all key information and risk signals related to a business, structured across seven tabs: **Favorites**, **Overview**, **Company Details**, **Fraud Prevention**, **Reports & Documents**, **Compliance & Monitoring**, and **AI reviewer** (beta).
## Header and Status
The top bar identifies the record and shows its current state:
* **Company Name**, **Company ID**, **Security Progress**, and **Process Status**.
* **Verification Result** — **Approved** or **Denied**; blank until a result is set. A **deny-reason badge** appears next to a Denied result.
* **AI reviewer button** — shows **Get AI reviewer insights** if a review hasn't run yet, or the outcome once it has: **Accepted by AI reviewer**, **Flagged for investigation**, or **Denied by AI reviewer**.
* **Extend expired session** — shown on sessions that passed their validity window without completion.
* **More actions menu** — **PDF**, **Assign/Reassign Manager**, **Change manager level**, **View JSON**, **Send callback**, **Delete**.
**Process status** is one of **Under submission**, **Processing**, **Need to process**, **Need to review**, **Completed**, or **Expired**. Almost every check and edit button is disabled while a case is **Under submission** or **Processing**. **Change result** only appears on **Completed** cases, and only for users with reviewer rights.
## Favorites Tab
A configurable pinned-card view. Click **Configure favorite cards** to choose which sections appear here, or use the star icon on any card throughout the profile to pin/unpin it.
More details: [Favorites Section](/guides/dashboard/general/favorites-section)
## Overview Tab
Four cards summarizing the case at a glance:
* **Main company information** — legal name, registration number, country, with Edit/Block actions.
* **Other compliance information** — status of external reports (GOV Registry, Credit Bureau, etc.).
* **Main related subjects** — summary of key personnel (directors/beneficiaries).
* **Sanctions, PEPs & Adverse media overview** — entity-level screening status, with AML Single Check and monitoring enrollment actions.
More details: [Company Profile Overview](/guides/dashboard/kyb/company-profile-overview)
## Company Details Tab
Legal identity and subject-level information:
* **Internal company information** — workflow metadata (Workflow type, Client ID, environment).
* **Submitted company information** — manually editable legal data (Edit/Block).
* **Questionnaire answers** — the client's self-reported responses.
* **Related subjects (UBOs, directors, representatives)** — screening (PEPs, sanctions, adverse media) and KYC flows (view verifications, create KYC tokens, add/change Scan Ref, manage subjects).
* **Ownership structure** — shows only first-level shareholders by default; click **See full structure** to open the full chain down to UBOs. Availability of full-structure mode depends on the configured KYB flow.
Uploaded documents live in the **Reports & Documents** tab, not here. Entity-level sanctions/adverse-media screening is surfaced on **Overview** and **Compliance & Monitoring**, not here.
More details: [Company Details Tab](/guides/dashboard/kyb/company-details-tab)
## Fraud Prevention Tab
Technical and OSINT-based fraud checks:
* **Website audit** — trust, popularity, internal audit, and blocklist scores, with recheck/caching logic and edge-case handling.
* **Social company profile** — address, phone, industry, Google reviews, social links, with refresh actions.
* **Bank verification details** and **VAT validation** — two separate cards. Bank verification is limited to 3 attempts per case.
* **Address audit** — geospatial data, accuracy/quality scoring, and visual confirmation (street view/maps/photos).
* **Other risk factors** — company website domain check, beneficiaries email domain check, IP country match, company email duplicates, IP proxy check, and fraud probability estimation.
Rechecks across this tab are gated by user permissions, available funds/limits, and data preconditions. For example, VAT validation only works for supported countries, EIN checks only for US companies, website audit needs a website on file, address audit needs an address on file, and domain/duplicate checks need emails on file. Buttons show explanatory tooltips when a recheck is blocked.
More details: [Fraud Prevention Tab](/guides/dashboard/risk/fraud-prevention-tab)
## Reports & Documents Tab
AI-assisted investigation and document handling:
* **AI company report generation** combining registry data and open-web research into a structured PDF (identity, ownership, risk, business details).
* **AI chat for document analysis** to summarize and query complex reports (credit bureau, government registers, AI reports, etc.).
* List of all **ordered reports** with viewing and download options.
* Central **uploaded documents** repository with full management actions.
* **Company data comparison** — an AI comparison of submitted data against an ordered report or an uploaded file, showing results per field (System data vs. File data) plus a list of people found in the report but missing from the case.
More details: [Reports & Documents Tab](/guides/dashboard/general/reports-documents-tab)
## Compliance & Monitoring Tab
* **Comments** and **audit logs** — internal notes and a read-only history of automated and user actions.
* **AML screening results** for every linked person and company, with actions to view and resolve flags.
* **Automation statuses** — result of every automation rule configured for your workflow.
* **Blocklist statuses** — which data fields were checked against internal blocklists.
* **Monitoring subjects** — enroll entities into continuous monitoring.
* **Linked companies** by registration number.
More details: [Compliance and Monitoring Tab](/guides/dashboard/aml/compliance-monitoring-tab)
## AI Reviewer Tab (Beta)
Runs a configured sequence of checks against the company and its associated people, then sets an overall result (Approved, Denied, or Flagged) based on the outcomes.
More details: [AI Reviewer for KYB](/guides/dashboard/kyb/ai-reviewer-overview)
## Workflow Toolbar
The fixed toolbar at the bottom of the screen allows you to take immediate action:
* **Request Update** — send a request to the client to update specific information or documents.
* **Comments** — log internal notes or view the audit history of team discussions.
* **Change Result** — manually override the verification outcome (only available on Completed cases, for users with reviewer rights).
* **Navigation** — cycle through the previous or next records in your filtered list.
# Company Profile Overview
Source: https://documentation.idenfy.com/guides/dashboard/kyb/company-profile-overview
Navigate the company profile header, overview, compliance status, and workflow toolbar in the iDenfy business verification dashboard.
## Header Information and Status
The top bar displays critical identification and state data for the record:
* **Company Name** — The legal name of the entity as submitted or retrieved.
* **Company ID** — A unique internal identifier (e.g., `7bPN6YMQ9F7...`). This ID is the primary way to reference specific companies when contacting iDenfy support.
* **Verification Result** — Displays the final outcome:
* **Approved** — The company has passed all checks.
* **Denied** — The verification failed. A reason badge (e.g., `ID_COUNTRY`) indicates why.
* **Security Progress** — Percentage indicating how many available security features are active for this record.
* **Process Status:**
| Status | Meaning |
| -------------------- | ------------------------------------------------------------------------------------------- |
| **Processing** | Business verification is submitted and being auto-processed |
| **Under submission** | [Request Update](/guides/dashboard/kyb/request-update-kyb) feature used, waiting for update |
| **Need to process** | Submission awaiting initial automated or manual handling |
| **Need to review** | Records flagged for manual oversight by a manager |
| **Completed** | Finalized verifications (Approved or Denied) |
| **Expired** | Sessions that passed their validity timeframe without completion |
***
## Favorites Tab
Your personalized dashboard where you can pin the most relevant data cards for your workflow.
* **Setup** — Click **"Configure favorite cards"** to select which sections (like Risk Factors or Documents) appear here.
* **Customize** — Use the **Star icon** on any individual card throughout the profile to add or remove it from this view.
***
## Overview Tab
The Overview tab centralizes summary data for quick manual review.
### Main Company Information
* **Core Data** — View the legal name, registration number, and country.
* **Quick Actions** — Use the **Edit** button to correct details or **Block** to restrict the record.
### Compliance and Risk Overview
* **Other Compliance Info** — View the status of external reports like GOV Registry or Credit Bureau checks.
* **Other Risk Factors** — Real-time indicators for technical risks, including IP Proxy use, email duplicates, and fraud probability.
* **AML & Monitoring** — Manage screening results for the company and its directors. Trigger AML Single Checks or enroll subjects into continuous AML Monitoring.
### Related Subjects and Ownership
* **Main Related Subjects** — Summary of key personnel (directors/beneficiaries).
* **Ownership Structure** — Visual or tabular breakdown of the company's legal structure (where data is available).
***
## Workflow Toolbar
The fixed toolbar at the bottom of the screen allows you to take immediate action:
* **Request Update** — Send a request to the client to update specific information or documents.
* **Comments** — Log internal notes or view the audit history of team discussions.
* **Change Result** — Manually override the verification outcome (e.g., approving a record after manual document review).
* **Navigation** — Cycle through the previous or next records in your filtered list.
# Create New Company
Source: https://documentation.idenfy.com/guides/dashboard/kyb/create-new-company
Create a new company verification record manually in the iDenfy dashboard with company details, documents, and key people information.
Use the **Create new company** page when you need to input business details on behalf of the client, rather than sending them a blank form. This is useful for pre-filling known data before asking the client to verify or complete the rest using the [**Request Update**](/guides/dashboard/kyb/request-update-kyb) feature.
### 1. Configuration
Set the fundamental rules for this verification profile.
* **Client ID:** Enter your internal unique identifier for this case.
* **Tags:** Add custom tags (max 32 characters each) to categorize this company. You can add up to 5 tags.
* **Business Verification workflow:** Select the specific compliance template from the dropdown list.
**Important**
The fields and information required in the steps below will change **dynamically** based on the [**Workflow**](/guides/dashboard/setup/setup-workflow-overview) you select here.
***
### 2. Company Details
You can fill in company information automatically via search or manually.
**Option A: Company Search (Recommended)** **Use this to auto-fill data directly from official registries.**
1. **Search in country:** Select the jurisdiction.
2. **Search method:** Select to search by **Name** or **Registration number**.
3. **Select:** Select the correct company from the results to populate the form.
**Option B: Manual Entry** If the company cannot be found or if you are entering data offline, fill in the available fields manually. Common fields include:
* **Company name & Registration number**
* **Type of entity** (e.g., LTD, LLC)
* **Contact info:** Phone number, Website, Email address.
* **Address details:** Operating address, Postcode, Street, City.
* **Financials:** TIN (Tax Identification Number), Activity code.
***
### 3. Documents
**Upload** any existing documents you have on file (e.g., Certificate of Incorporation, Articles of Association).
* **Supported formats:** PNG, JPG, HEIF, GIF, PDF.
* **Size limit:** Max 14MB per file.
### 4. Key People (Beneficiaries)
Add the individuals associated with the company structure. Click the **Add \[Role]** button for the relevant category to open the detailed input form for that person.
* **Directors/CEO:** The individuals managing the company.
* **Representatives:** Persons authorized to act on behalf of the company.
* **Shareholders:** Individuals or entities owning equity in the company.
If a Director, Representative, or Beneficial Owner has already completed identity verification — for this company or a different one — enter their existing **Scan Ref** instead of sending a new verification link. The same Scan Ref can be linked to any number of companies, so an already-verified person never has to repeat IDV.
# Creating a KYB Session
Source: https://documentation.idenfy.com/guides/dashboard/kyb/creating-session
Generate a new business verification session link in the iDenfy dashboard with workflow, communication, and advanced configuration options.
The **Create session** page allows you to manually generate a new verification link. The configuration is divided into three tabs: **General**, **Advanced**, and **Referencing**.
### 1. General Settings
Use this tab to define the core verification flow and communication method.
* **Workflow:** Select the specific verification template for this session (e.g., Standard KYB, Sole Proprietorship).**Note:** To create or edit these templates, navigate to [**Business verification** → **Settings** → **Workflows**](/guides/dashboard/setup/setup-workflow-overview).
* **Send verification email:** **Toggle ON** to have the system email the link directly to the client.
* **Email details:** Enter the client's email address and subject line.
* **Template:** Select a pre-written email template or write a custom message.
* **Insert Link:** When writing a custom message, use the **Insert** button to place the unique link placeholder.
### 2. Advanced Settings
Use this tab to configure technical constraints and user interface preferences.
* **Client ID:** Enter a unique number or string to identify this specific verification in your internal records.
* **Session validity:** Select how long the verification link remains active (e.g., 12 hours). Once expired, the link will no longer work.
* **Remember session settings for next time:** Enable this checkbox to save the selected session validity and automatically apply it the next time you create a KYB session, so you don't need to re-select it manually each time.
* **Language:** Pre-select the language for the verification interface (e.g., Lithuanian). The user can still adjust this during the process.
* **Custom theme:**
* **Toggle ON** to apply specific branding.
* Select the desired theme from the dropdown menu to match your brand identity.
### 3. Referencing Options
Use this tab to add internal tags and identifiers for tracking and sorting verifications later.
* **External reference:** Input a custom value to link this session to your own database or CRM system.
* **Scan Ref list:** Enter the Scan Ref code(s) to link this session to existing identity verification(s). The same Scan Ref can be reused across multiple companies — for example, when the same person is a Director, Representative, or Beneficial Owner in several company structures — so they don't need to repeat identity verification each time.
* **Tags:** Add keywords to categorize the session.
* **Limits:** Maximum 32 characters per tag. You can add up to **5 tags** per session.
***
### Finalizing the Session
Once settings across all tabs are configured:
1. **Review:** Ensure the workflow and validity settings are correct.
2. **Generate:** Click the **Create** button at the bottom of the page.
* If **Send verification email** was enabled, the email is sent immediately.
* Otherwise, copy the **Verification URL** generated in the bottom toolbar and share it manually.
# Dynamic Workflows
Source: https://documentation.idenfy.com/guides/dashboard/kyb/dynamic-workflows
Configure KYB dynamic workflows to automatically route companies to the right verification flow based on answers to a short screening questionnaire.
## What Are Dynamic Workflows?
KYB Dynamic Workflow is a feature that eliminates the need to manually select a KYB verification workflow for each client. Instead of deciding which process to assign, you create a Dynamic Workflow — a short questionnaire that your clients answer before starting verification. Based on their responses, the system automatically routes them to the correct KYB workflow.
### The Problem It Solves
If your business serves different types of clients — varying company structures, risk profiles, jurisdictions, or licensing requirements — you likely maintain multiple KYB workflows. Until now, someone on your team had to review each case and manually select the right one. This is:
* **Time-consuming** — each session requires a manual decision
* **Error-prone** — selecting the wrong workflow leads to incomplete verifications or unnecessary steps
* **Hard to scale** — as client diversity grows, manual selection becomes unsustainable
### The Value
With KYB Dynamic Workflow, you define the rules once. The system handles routing for every session going forward. Your team saves time, clients get the right verification process from the start, and compliance stays consistent.
***
## How It Works
| Step | Who | What happens |
| ----------------- | --------- | ------------------------------------------------------------------------------------------------- |
| 1. Setup | Admin | Create separate KYB flows for different client types, industries, or risk levels |
| 2. Configure | Admin | Build a Dynamic Workflow — add questions and assign workflows to specific answers or score ranges |
| 3. Client Answers | Client | Client opens the verification link and answers the questionnaire step by step |
| 4. System Routes | Automated | System calculates the score and auto-opens the right workflow for the client |
| 5. Review Results | Admin | See which workflow was assigned and why — full score breakdown included |
**Example:** You have 2 workflows — one for US clients, another for European clients. In your Dynamic Workflow, you add a country question. If the client selects USA, they get Workflow 1. If they select a European country, they get Workflow 2.
### Two Routing Methods
* **Score-based routing** — each answer carries a weight. The system sums all weights and matches the total to a workflow trigger range you defined.
* **Instant routing** — for critical answers (e.g., a specific high-risk country), you can create instant triggers that override scoring and route the client directly to a designated workflow.
***
## Where to Find It
Go to **Business Verifications** → **Configuration** → **Workflows** → click **Build dynamic flow**.
At least one workflow must exist before you can create a dynamic flow.
***
## Setting Up a Dynamic Workflow
### Step 1 — General Information
Enter a Dynamic Workflow name (required). This name is visible to your team when selecting the workflow during session creation.
### Step 2 — Add Questions
Add as many questions as needed. For each question, provide:
* **Question text** (required)
* **Question type** — select from:
* **Select** — single choice from a dropdown
* **Select multi** — multiple choices from a dropdown
* **Country select** — single country picker
* **Country select multi** — multiple country picker
* **Checkbox** — multiple choice with checkboxes
* **Radio button** — single choice with radio buttons
* **Input placeholder** (optional) — hint text shown in the input field
* **Description** (optional) — additional context displayed below the question
For **Select**, **Select multi**, **Checkbox**, and **Radio button** question types, add answer options. Every answer requires:
* **Answer text** — what the client sees
* **Answer weight** — a numeric score (0 or higher) used for routing calculation
For **Country select** and **Country select multi** question types, weights are configured via **Country weights** groups rather than per individual answer:
* **Default group** — a single weight applied to all countries not assigned to a custom group (covers all 243 ungrouped countries by default)
* **Custom groups** — bundle specific countries together and assign a shared weight to the group. Click **Add weight group** to add more groups.
This grouping approach lets you assign the same weight to a whole region (e.g., all EU countries) without configuring each country individually.
You can reorder questions using drag & drop, and collapse/expand each question card for easier navigation.
### Step 3 — Configure Score Calculation
The Score Calculation section appears automatically based on your questions and answer weights.
Score range is calculated in real time:
* **Minimum** = sum of the lowest weight from each question
* **Maximum** = for single-select types (select, country select, radio): the highest weight; for multi-select types (select multi, country select multi, checkbox): sum of all weights
**Country select** and **Country select multi** question types fully support weighted scoring and can be used in score-based routing — not only as instant triggers. Each country option carries a configurable weight that contributes to the total score calculation.
Rules:
* You must have at least one workflow trigger
* Triggers must cover the entire score range without gaps
* Score ranges update automatically in a cascading manner — changing one range adjusts adjacent ranges
### Step 4 — Configure Instant Triggers (Optional)
Instant triggers override score calculation entirely. When a client selects a specific answer, they are immediately routed to the designated workflow regardless of their total score.
**Example:** If a client selects "Germany" in a country question, an instant trigger can route them directly to a "Simple" workflow.
Each instant trigger requires:
* **Question** — which question to watch
* **Answer** — which specific answer activates the trigger
* **Action type** — which workflow to assign, or **Decline** to automatically decline the session when the answer is selected
You can also create instant triggers directly from the questionnaire form using the bolt icon next to any answer. Clicking it auto-creates an instant trigger and scrolls to the Instant Triggers section.
If multiple instant triggers match, the one with the highest priority (lowest order) takes precedence.
### Step 5 — Translations (Optional)
Click **Translate** in the Questions section header to add multi-language support. You can:
* Select a language and manually translate all question texts and answer options
* Use **AI Translate** to auto-generate translations, then review and adjust
Translations ensure that clients see the questionnaire in the language configured for their session.
### Step 6 — Save
Click **Create** (or **Save** when editing). The system validates that:
* All required fields are filled
* Score ranges fully cover the possible range
* Referenced questions and answers in instant triggers exist
***
## Creating a Session with Dynamic Workflow
Go to **KYB** → **Create session**
In the **General settings** tab, a **Setup workflow** section appears above the standard workflow list. This section is only visible if you have at least one active Dynamic Workflow.
Each Dynamic Workflow is shown as a card displaying:
* Name
* Number of questions (e.g., "5 questions")
* Number of score thresholds (e.g., "3 thresholds")
* Number of instant triggers (e.g., "2 instant triggers")
Selection rules:
* Selecting a Dynamic Workflow is optional
* You can select either a Dynamic Workflow or a standard workflow — not both
* All Advanced Settings (Client ID, Session validity, Language, etc.) apply regardless of which option you select
***
## End-User Experience
When a client opens a verification link that uses a Dynamic Workflow, they see a step-by-step questionnaire before the standard KYB form.
What the client sees:
1. **Progress bar** at the top, showing how many steps remain
2. **One question at a time**, displayed in the language configured for the session
3. **"Next" button** — only enabled after the client selects an answer (all questions are mandatory)
4. **"Back" button** — returns to the previous question with the previous answer preserved
5. On the **last question**, the button changes to "Start verification"
6. After clicking "Start verification", the system processes the answers and **immediately redirects** the client to the assigned KYB workflow
The client never sees scores, routing logic, or which workflow was selected. The transition is seamless — the questionnaire simply leads into the verification form.
***
## Reviewing Results
After a client completes verification, your compliance team can see exactly how the Dynamic Workflow routed them — including the full score breakdown and which trigger was applied.
***
## Permissions
| Permission | What it allows |
| ---------------------------- | ------------------------------------------------------------------------------ |
| Manage KYB Dynamic Workflows | Create, edit, and view dynamic workflows |
| Generate KYB Token | View and assign dynamic workflows when creating sessions, but cannot edit them |
# Getting Started with KYB
Source: https://documentation.idenfy.com/guides/dashboard/kyb/getting-started
Get started with iDenfy business verification by setting up workflows, onboarding clients, reviewing data, and generating PDF reports.
## Workflow
Before companies, you will need to understand workflows, as they enable you to request specific information about companies and stakeholders.
You can find a full procedure on how you can create your personalized flow [here](/guides/dashboard/setup/setup-workflow-overview).
***
## Onboard Your Client
### Client-Side of the Business Client Onboarding Flow
First, you can manually onboard a client using the dashboard. You can find out how you can manually create a session for your client here:
There is also a way to use the API. You can create a KYB session through the API by following this documentation:
[/kyb/generate-token](/kyb/generate-token)
### Your Side of the Business Client Onboarding Flow
First and foremost, it's important to note that the business flow can be tailored to fit your specific needs. Below is an example of how the custom flow might appear from the client's perspective.
## Review Onboarded Client Information
Once the company has submitted its information, you can view it on the iDenfy dashboard under Business Verifications → Verifications. In the company profile, all provided information is accessible, and you can conduct additional security checks and order Gov registers and Credit Bureau reports.
***
## Download PDF
We provide an option to download all the business verification information or only just enough to fulfill your business needs.
To download a PDF, please visit business verifications, click more actions, then select PDF.
You will then be able to generate a PDF with the selected fields.
**Important:** We still provide the option to download all data fields, even if no data was generated. In such cases, the fields will be returned empty.
# Identity Verification in KYB Flow
Source: https://documentation.idenfy.com/guides/dashboard/kyb/identity-verification-on-kyb-custom-flow
Add identity verification steps to your iDenfy KYB custom flow so users complete ID checks during the business verification process.
Identity verification can be performed as part of the Know Your Business (KYB) flow. This lets your users complete ID verification during business verification without a separate process.
This feature may not be included in your plan. Contact [tech support](https://idenfy-ivs.atlassian.net/servicedesk/customer/portal/1) to check availability or enable it.
## How to Add Identity Verification to the KYB Flow
1. Go to **Dashboard → Settings → Business Verifications (KYB)**
2. Open the custom flow you want to edit (or create a new one)
3. Look for the **Identity Verification** step option
4. Enable it and configure which participants (e.g., directors, shareholders, UBOs) must complete identity verification
5. Save the flow
Once enabled, the identity verification step appears automatically when users go through the KYB flow.
## How Verifications Work After Setup
1. A user starts the KYB flow (via iFrame, redirect, or SDK)
2. They fill in business details and add beneficiaries as usual
3. When they reach the identity verification step, the iDenfy verification UI is presented inline
4. The user completes selfie + document capture
5. Results are included in the KYB [webhook response](/kyb/webhooks) alongside the business verification data
## User Experience
The flow is the same as standard KYB, with an added identity verification step:
1. **Business information** — Company details, registration number, address
2. **Beneficiaries** — Add directors, shareholders, or UBOs
3. **Identity verification** — Selfie + ID document capture (inline within the KYB flow)
4. **Document upload** — Any required supporting documents
5. **Submission** — Review and submit
The identity verification results are linked to the specific beneficiary and included in the overall KYB verification response.
## Related Pages
* [KYB overview](/kyb/overview)
* [KYB webhooks](/kyb/webhooks)
* [KYC integration in KYB](/kyb/kyc-integration)
# KYB VAT Validation
Source: https://documentation.idenfy.com/guides/dashboard/kyb/kyb-vat-validation
Validate EU company VAT numbers across 27 member states using the iDenfy business verification VAT validation service integration.
iDenfy has introduced an option to perform VAT number validation for the EU market. This allows EU-market partners to verify whether a company has a valid VAT number. It also checks if the company’s name and address match the records associated with that VAT number.
**Currently, the service works with these countries:**
Austria, Belgium, Bulgaria, Croatia, Cyprus, Czech Republic, Denmark, Estonia, Finland, France, Germany, Greece, Hungary, Ireland, Italy, Latvia, Lithuania, Luxembourg, Malta, Netherlands, Poland, Portugal, Romania, Slovakia, Slovenia, Spain, Sweden.
To have this service enabled, please [book a demo call](https://idenfy.com/demo-page/) with our team.
### How to Add VAT Number to KYB Custom Flow
When editing a workflow, the **VAT Number** field is located under the **Tax Identification** section — a dedicated section in the workflow builder, separate from Business Information. Only one tax identifier field can be selected per workflow.
### KYB VAT Check from the User Side
Every flow set up by the company is different. In this case, we want to show how an input field in the simplified flow would look.
### How to Check a VAT Number on the Partners' Side
Currently, there are 2 ways to check a VAT number. Regardless of the option chosen, you will have to review the retrieved result in the verification page:
**1.** The first option is to set up a VAT check automation and require your user to fill in the VAT field during the know your business verification:
**2.** The second option is to fill in the VAT details yourself and manually check the details via the dashboard, in the verification page:
### What Happens If an Incorrect VAT Number Is Entered During the Validation Check?
The invalid status will be returned, and you will be able to perform a re-check:
# Ordered Reports
Source: https://documentation.idenfy.com/guides/dashboard/kyb/ordered-reports
Order KYB reports from the iDenfy dashboard to pull real-time data from official government registries, credit bureaus, and corporate databases.
Ordered reports let you pull structured data directly from official external sources — government registries, credit bureaus, and corporate databases — without leaving the KYB dashboard.
Reports can be triggered **manually** from the company page or automatically via [automation rules](/guides/dashboard/settings/ai-reviewer). Once ordered, they appear in the **Reports & Documents** tab under **Ordered Reports**.
For ordering instructions, see [How to order a new report](/guides/dashboard/general/reports-documents-tab#ordered-reports).
Country and region coverage varies by report type and is subject to change. Contact support to confirm availability for a specific country before relying on it in your workflow.
***
## Available Report Types
### Government Registers
Retrieves official incorporation and registration data from national government registries.
**Coverage:** EU member states and a broad range of international jurisdictions.
**Data returned:**
* Company name, registration number, external registry ID
* Registration date, registration authority
* Legal form and legal status (Active / Inactive / Dissolved)
* Industry and activity codes with descriptions
* Contact information: email, phone, fax, website
* Address history, including changes over time
* VAT number and fiscal code
* Associated persons: directors, officers, owners
* Company aliases and alternate names
***
### Credit Bureau
Returns financial and credit data on the company from a bureau provider.
**Coverage:** Primarily European markets, with select additional international coverage.
**Data returned:**
* Company name, registration number, VAT number, entity type
* Company status (Active / Non-active / Pending / Not Found)
* Main and previous addresses, phone, email
* Industry classification code
* Credit rating: letter grade, numeric value, and credit limit
* Financial data: turnover, shareholders' equity, profit/loss, balance sheet figures
* Current and previous directors, including their positions at other companies
* Shareholders and ownership structure
* Parent and subsidiary relationships
* Previous company names
A **lite** (search-only) version returns identification and status only. Financial data, ownership structure, and director details are available in the **full report** only.
***
### Secretary of State (SOS)
Pulls corporate filing data from US state-level Secretary of State databases.
**Coverage:** US states. Availability varies by state.
**Data returned:**
* Company name, external SOS ID, entity type (LLC, Corporation, Partnership, Non-Profit, Trust, Sole Proprietorship)
* Formation date and state of formation
* Registered address: street, city, state, postal code
* Watchlist hit count (number of sanctions or watchlist matches)
* Check status: Processing / Finished / Failed / Expired
* Full report stored as both JSON and PDF on completion
***
### Companies House (UK)
Returns official incorporation and filing data for UK-registered companies, sourced directly from the UK Companies House public API.
**Coverage:** UK only — England, Scotland, Wales, and Northern Ireland.
**Data returned:**
* Company name, registration number, company type
* Company status (Active / Dissolved / Removed, etc.)
* Jurisdiction
* Incorporation date; cessation date if the company has been dissolved
* Registered office address
* SIC codes (industry classification — multiple may apply)
* Full company profile from the Companies House API
This report is available directly through iDenfy at no additional intermediary cost. It can be triggered manually or via automation rules and appears under **Ordered Reports** in the KYB dashboard.
***
### AI-Generated Report
Combines official registry data with a live AI-driven open-web search to produce a comprehensive background check in PDF format.
Covers company identity, ownership structure, risk analysis (PEPs, red flags), business details, and industry classification.
For details, see [AI Company Report Generation](/guides/dashboard/general/reports-documents-tab#ai-assistant-features).
# Request Update (KYB)
Source: https://documentation.idenfy.com/guides/dashboard/kyb/request-update-kyb
Send data correction requests to clients during business verification using the iDenfy KYB request update feature with webhook alerts.
The **Request Update** solution simplifies the process of correcting client data, ensuring your records are current and compliant.
***
## Request Update
To send a request for additional information to a client:
1. Go to the ***Dashboard*** → ***Business Verifications*** → ***Verifications***.
2. Select the company name you wish to update → ***Request Information***.
3. Select the fields you want the client to revise. You must add the recipient's email address and include a Revision Request reason.
4. Click **Request Update**.
If you do not wish to update all editable fields, you still need to open the relevant sections individually.
***
## Configuring the Update Request
You can select to allow editing for the entire verification form, or select specific categories:
| Editable Category | Selection Options | Additional Information |
| --------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Allow to edit all** | A single switch that grants the client access to all business verification fields. | Use if the verification is largely outdated. |
| **Request company information modifications** | Select specific Fields and Documents to be updated (e.g., Company name, Registration number, Certificate of Incorporation). You can designate each item as Optional or Required. | Include a Relevant to client request notes explaining why the changes are needed (e.g., "Please edit your company name and upload the updated Certificate."). |
| **Allow to edit Director information** | Allow editing of the whole Director page. You cannot select individual fields, as there may be multiple Directors. | Include specific instructions in the Relevant to director information request notes (e.g., "Please update John's email address."). |
| **Allow to edit Representative information** | Allow editing of the whole Representative page. | Include specific notes explaining the required changes. |
| **Allow to edit Shareholders' information** | Allow editing of the whole Shareholder page. | Include specific notes explaining the required changes. |
| **Add additional questionnaire or questions** | Select one of three ways: 1. Request the client to update an existing questionnaire. 2. Ask them to answer a new single question. 3. Add a completely new questionnaire for them to complete. | Include Relevant notes to guide the client on the new questions/forms. |
| **Request validity duration (days)** | Sets how long the unique link will remain active. | Recommended: Adjust the session validation period (optional). |
| **Follow-up reminder** | Automates reminder emails if the client hasn't submitted the form. | Remind client after (days): Select when to send the reminder. |
| **Email Address** | The recipient's email. | Ensure the proper client's email is prefilled. |
| **Select email template** | Select a pre-made email text. | Optional. |
| **Email subject** | Write a clear subject line. | Mandatory if no template is selected. |
| **Add recipients to CC** | Add colleagues or other relevant parties to the notification email. | Optional. |
| **Message to client** | The main body of the email. | Enter clear and informative content. |
| **Add revision request link** | **CRUCIAL STEP:** Inserts the required link tag. | Click the button to add \{\{session\_url}}. Without this link, the client cannot submit the details. |
***
## Status
The company application has been submitted and is awaiting further action or review.
The application is in “Under Submission” status while waiting for the client to complete the requested changes
If the client opens the link and submits the form without changing anything, the submission is still recorded: a **Form re-submitted without changes** entry is written to the [audit log](/guides/dashboard/aml/compliance-monitoring-tab), so a review-and-resubmit is traceable rather than leaving no trace at all.
The company review has been completed.
***
## Webhooks for Request Update
For automated notifications regarding status changes and client submissions, you can configure KYB webhooks. This allows your system to listen for update events in real-time.
[/KYB/kybWebhook#webhook-events-for-companies](/KYB/kybWebhook#webhook-events-for-companies)
# Setting Up Questionnaires for KYC and KYB
Source: https://documentation.idenfy.com/guides/dashboard/kyb/setting-up-questionnaires-kyc-kyb
Configure custom questionnaires for source of funds, compliance details, or UBO declarations in iDenfy KYC and KYB verification flows.
The Questionnaire feature allows you to collect specific information—such as source of funds, compliance details, or UBO declarations—as part of the verification flow.
* **Identity Verification (KYC):** Usually appears *before* the verification starts.
* **Business Verification (KYB):** Usually appears at the *end* of the verification form.
## Accessing the Questionnaire Builder
While the builder tool is the same, the access location depends on which service you are configuring:
* For **Identity** Go to **ID Verifications** → **Configurations** → **Questionnaire Templates**.
* For **Business:** Go to **Business Verifications** → **Configurations** → **Questionnaire Templates**.
From here, click **Create New** or **Import Questionnaire**.
Limitations for **Identity** Verification **(KYC)**
* Questionnaires do not forcefully expire sessions
* Questionnaires do not block verifications
* Questionnaires are always done **before** **identity** verifications, currently no option to do it **after.**
Limitations for **Business** Verifications **(KYB)**
* Questionnaires are always done **after** **business** verifications, currently no option to do it **before.**
***
## Creating a New Questionnaire
When creating a new template, you will define the basic settings and then build the structure using **Sections** and **Questions**.
### 1. Basic Setup
After clicking **Create New**, fill in the required details:
* **Name:** An internal identifier for the template (must be unique).
* **Title:** The header text the user will see.
* **Description:** Optional text to explain the form's purpose to the user.
***
### 2. Structuring with Sections
Questionnaires are organized into **Sections**. Even if you only need a few questions, they must be contained within a section.
* **Title:** The section heading displayed to the user.
* **Condition:** Optional rule to hide/show the entire section (see *Conditional Logic* below).
***
### 3. Adding Questions
Inside a section, click **Add Question**. You will need to configure:
* **Title:** The actual question text.
* **Type:** The format of the answer (text, date, file upload, etc.).
* **Required:** Mark if the user must answer this to proceed.
* **Choices:** (For dropdowns/radio buttons) Define the available answers and their specific keys.
| Question Type | Description |
| ------------- | ------------------------------------------------------------------------------------------------------------------------------- |
| Checkbox | A small box the user can click to tick as an option. |
| Color | Allows the verifier to select a color in RGB format. |
| Country | Allows the verifier to select a country from a dropdown list. |
| Country Multi | Allows the verifier to select multiple countries from a dropdown list. |
| Date | Enables the verifier to select a date. |
| DateTime | Allows the verifier to select both date and time. |
| Email | Requires the user to enter an email in a valid format, such as [email@google.com](mailto:email@google.com). |
| File | Allows the verifier to upload one file of up to 10MB in one of the formats: PNG, JPG, HEIF, GIF, PDF. |
| Float | Allows the user to input a number with decimal values, such as 5.95 or 9532.122. |
| List | Lets the user create a list by typing a value, pressing Enter, and then adding additional values in the same way. |
| Integer | Allows the verifier to input a whole number without decimals, which can include negative values, e.g., -3512, -60, 0, 50, 4102. |
| Password | Enables the user to enter a password. |
| Radio | A multiple-choice option where the user can select one response by ticking a circular button. |
| Select | A dropdown menu where the user can choose one option from multiple values. |
| Select Multi | A dropdown menu where the user can select one or more values from multiple options. |
| Tel | Prompts the verifier to enter a phone number in the correct format, e.g., +37061111111. |
| Text | Allows the user to enter a short text, up to 100 characters. |
| Textarea | Allows the user to enter text of up to 1,000 characters. |
| Time | Allows the user to enter a valid time. |
| URL | Requires the user to enter a website link, starting with http\:// or https\://. |
***
### 4. Conditional Logic
Conditional logic allows you to show specific follow-up questions based on the user's answer to a previous question.
**Example:** You ask *"Do you have a different correspondence address?"*.
* If they answer **Yes** → Show address fields (Street, City, Zip).
* If they answer **No** → Go straight to the next topic.
### How to Configure Logic
Logic is managed directly inside the **Answer** settings of a "Select" or "Radio" question.
1. **Create all questions first:** Ensure the questions you want to show/hide (e.g., "Street Name") exist in the template.
2. **Open the "Trigger" question:** Edit the question that decides the flow (e.g., "Do you have a different address?").
3. **Configure the "Lead to" path:**
* Find the specific answer (e.g., "YES").
* In the **When selected lead to** dropdown, select all the questions that should appear when this answer is chosen.
* Repeat for other answers (e.g., for "NO", select only the next relevant question or leave it blank to skip).
Adding multiple questions to **“When selected lead to”**
* **Section Skipping:** If your logic hides every question in a specific section, that entire section is skipped during the user's flow.
* **Question Filtering:** If multiple questions exist in one section, only the ones explicitly triggered by the user's "Lead to" selection will appear. All others remain hidden.
***
## Managing Questionnaires
Once you have created templates, you can manage them from the **Questionnaire Templates** list. Click the **(...)** menu on any template to access these actions:
* **Edit:** Modify the existing questions, logic, or settings. *Note: Changes apply to new verification sessions immediately.*
* **Create a copy:** Duplicates the entire template structure. This is useful for creating "Version 2.0" of a form for testing without affecting the live version.
* **Set as default:** Marks this questionnaire as the standard form. It will automatically appear for all new verifications unless a different one is manually specified via API.
* **Export questionnaire:** Downloads the template structure as a JSON file. Use this for backups or to migrate templates between different accounts/environments.
* **Delete:** Permanently removes the template. *Note: You cannot delete a template that is currently set as the Default.*
**Identity** vs **Business** verifications
In Business verification, there is no option to set a default. All questionnaires are set via [**workflows**](/guides/dashboard/setup/setup-workflow-overview)
***
## Translations
You can localize your questionnaire into multiple languages without recreating the structure or logic.
1. In the **Questionnaire Templates** list, click **(...)** → **Translate**.
2. Click **Additional language** at the bottom of the modal to select your target language (e.g., Lithuanian, Spanish).
3. **Enter Translations:** The screen displays your original text on the left (disabled) and input fields on the right.
* **Manual:** Type the translation into the corresponding fields.
* **Automatic:** Click the **Auto-translate** icon next to the language name to generate translations for all fields instantly.
4. Click **Save**.
# Stakeholder Roles in KYB Workflows
Source: https://documentation.idenfy.com/guides/dashboard/kyb/stakeholder-roles
Reference for the five KYB stakeholder roles in iDenfy (CEO, Representative, Shareholder, UBO, ABO) and how to map partnerships and holding chains.
A KYB workflow collects two kinds of information: facts about the **legal entity**, and facts about the **people and entities behind it**. This page covers the second kind.
Internally the platform calls every person or company attached to a case a **beneficiary**. Each beneficiary carries a **role** that tells the system what that stakeholder is, which workflow step collects them, and which checks and automations apply to them.
CEO, Representative, Shareholder, UBO, and ABO. Every stakeholder on a case is one of these.
All five roles support the same AML screening and identity verification. Role does not mean tier.
Ownership resolves down a shareholding chain to natural persons. Structures that don't fit are modelled with ABO.
***
## The Five Roles
| Role | Who it covers | Collected in |
| -------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------- |
| **Director / CEO** | Individuals who manage and legally represent the entity. Companies can also act as directors if **Directorship addition** is enabled. | [Director Information step](/guides/dashboard/kyb/step-director-information) |
| **Representative** | A person authorized to act on behalf of the company — often the person filling in the form, a company secretary, or an appointed adviser. Carries no ownership meaning. | [Representative Information step](/guides/dashboard/kyb/step-representative-information) |
| **Shareholder** | An individual **or a legal entity** holding equity in the company. A company shareholder opens a new layer in the ownership chain. | [Ownership Structure step](/guides/dashboard/kyb/step-ownership-structure) |
| **UBO** (Ultimate Beneficial Owner) | The natural person who ultimately owns or controls the entity, at the end of the ownership chain. | [Ownership Structure step](/guides/dashboard/kyb/step-ownership-structure) |
| **ABO** (Alternative Beneficial Owner) | A beneficial owner who must be captured and screened but does **not** hold a conventional percentage stake — partners, founders, board members of a memberless entity, senior managing officials. | [Ownership Structure step](/guides/dashboard/kyb/step-ownership-structure) |
**Shareholder**, **UBO**, and **ABO** each have to be switched on individually under **Individual shareholder types** in the Ownership Structure step. A role that isn't enabled cannot be added by the client, and rules that target it will never fire.
Roles are not a hierarchy. An ABO is on equal footing with a Shareholder or UBO: the same field and document requirements, the same AML and PEP screening, and the same identity verification options are available for each. The [Ownership Structure step](/guides/dashboard/kyb/step-ownership-structure) lets you either apply one shared configuration to Shareholders, UBOs, and ABOs, or configure each role on its own tab.
***
## How the Ownership Model Resolves
The Ownership Structure step is built around a **corporate ownership model**. It expects the ownership of the applicant company to resolve, layer by layer, until it reaches natural persons (or a government entity).
Five settings control how far that goes:
| Setting | Effect |
| --------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Shareholder Check Level — First level ownership** | The client lists only direct shareholders. The chain is not traced further. |
| **Shareholder Check Level — Full ownership list** | The client must trace ownership all the way back to natural persons or government entities. |
| **Companies without further shareholders** | Only available with **Full ownership list**, and off by default. Lets the client declare that a company shareholder has no shareholders of its own, and confirm it. The declared company terminates the chain there. |
| **Shareholder threshold** | Shareholders below this percentage don't have to be declared (e.g. `25%` means only holders of 25% or more). |
| **Ask shareholder's to disclose %** | Whether the exact stake is **Off**, **Optional**, or **Require**. Percentage is a nullable value — a stakeholder can exist with no percentage attached. |
When **Full ownership list** is active, the form is validated on submission against two conditions:
1. The case contains **at least one beneficiary** of any kind.
2. Every **company** beneficiary of type Shareholder, UBO, or ABO has **at least one individual beneficiary** behind it — unless the client has declared that it has no shareholders of its own, which requires **Companies without further shareholders** to be enabled on the workflow.
Failing either condition is what produces an **incomplete ownership structure** error on submit.
The key detail: the requirement only applies to **company** stakeholders. An **individual** Shareholder, UBO, or ABO terminates the chain — the system does not expect a further layer of ownership behind a natural person. A company the client has declared as having no shareholders of its own terminates the chain in the same way. Adding individuals in the correct role is therefore the fix for most of these errors, not adding more layers.
***
## What ABO Is For
The corporate model works cleanly for companies whose ownership is a chain of percentage stakes. It does not describe every legal entity. Common examples: general partnerships, foundations and associations with no members, co-operatives, and companies so widely held that nobody crosses the ownership threshold.
**ABO exists for exactly these cases.** It captures a person who is genuinely a beneficial owner in substance, without asserting a shareholding percentage that doesn't exist. Because an individual ABO satisfies the beneficiary requirement on its own, it also resolves the structure without forcing you to invent an ownership layer.
The API also exposes a free-text `positions` list on each beneficiary (up to three entries, 50 characters each). Use it to record the real-world title — `Partner`, `Trustee`, `Founder`, `Managing Member` — next to the platform role, so a reviewer can see what the person actually is. See [Collect Information](/kyb/collect-information#beneficiaries).
***
## Mapping Real Structures Onto the Roles
| Real-world structure | How to model it |
| ----------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------ |
| Private limited company, individuals own the shares | Directors as **CEO**, owners as **Shareholder** (and **UBO** where they meet the definition) |
| Company owned through a holding company | Holding company as a **company Shareholder**, its owners as **individual UBOs** behind it |
| General partnership / LLP with no percentage split | Every partner as an **individual ABO** |
| Sole trader / sole proprietorship | Not the Ownership Structure step — use the [Sole Proprietorship step](/guides/dashboard/kyb/step-sole-proprietorship) |
| Foundation, association, or memberless entity | Founders, trustees, or board members as **individual ABOs** |
| State- or government-owned entity | **Full ownership list** already accepts a government shareholder as the end of the chain, so no natural person is required beyond it |
| Company that genuinely has no shareholders of its own | The client declares it as such and confirms — needs **Companies without further shareholders** enabled on the workflow |
| Widely held company where nobody meets the threshold | Senior managing official as an **individual ABO** |
### Worked Examples
**Structure:** Registered LTD. Two directors, who are also the only two shareholders, holding 60% and 40%.
**How to model it:**
* Both individuals added twice — once as **CEO** in the Director Information step, once as **Shareholder** in the Ownership Structure step. The same person legitimately holds more than one role.
* Ownership percentages recorded as 60% and 40%.
* If your threshold is 25%, both must be declared.
* Because both shareholders are natural persons, the chain terminates and the structure validates.
**Tip:** if a person already completed identity verification — on this case or any other company — link their existing **Scan Ref** instead of sending a new verification request. See [Company Details Tab](/guides/dashboard/kyb/company-details-tab).
**Structure:** Applicant is an operating company, 100% owned by a holding company, which is in turn owned by two individuals at 50% each.
**How to model it:**
* The holding company added as a **company Shareholder** of the applicant, at 100%.
* The two individuals added as **individual UBOs** behind the holding company, at 50% each.
* With **Full ownership list** enabled, the holding company must have at least one individual beneficiary attached to it, unless the client declares that it has no shareholders of its own. Adding only the holding company and stopping there triggers the incomplete ownership structure error.
If you only need visibility of the first layer, set **Shareholder Check Level** to **First level ownership** — the client then declares the holding company and nothing further is required.
**Structure:** A foreign law firm registered in Hong Kong. Legally a **general partnership** with several partners, but Hong Kong's foreign law firm registration rules require a single named individual on the certificate, so the Business Registration Certificate names one partner and shows legal status as "Individual". There is no shareholding and no percentage split between the partners.
This is the case the platform's corporate model handles least naturally, and the one most likely to be mis-routed. Two things frequently go wrong: it gets treated as a sole proprietorship because of the certificate, or it gets forced into shareholder fields and fails validation.
**How to model it:**
1. **Run it as a KYB case, not an individual KYC.** The certificate showing "Individual" reflects a registration rule, not the entity's actual legal form. A multi-partner firm is a business entity.
2. **Do not use the Sole Proprietorship step.** That step hides the director and shareholder sections and is built for a genuine single owner — it would misrepresent the firm and lose the other partners entirely.
3. **Add every partner as an individual ABO**, including the one named on the certificate. Partners are beneficial owners in substance without holding percentage stakes, which is precisely what ABO is for. Set **Disclose Percentage** to **Off** or **Optional** so no stake has to be asserted.
4. **Record the real title** using the `positions` field (`Partner`) so reviewers see the actual relationship.
5. **Handle the certificate mismatch as documentation, not structure.** Capture the named individual exactly as they appear on the Business Registration Certificate. Evidence the remaining partners with a supporting document — a partnership agreement or a signed declaration of the partners — via [Document Management](/guides/dashboard/general/document-management-individuals-companies). The platform record then stays consistent with the certificate while still reflecting the true multi-partner reality.
**Why this avoids the validation error:** individual ABOs satisfy the beneficiary requirement and terminate the chain, so the system does not expect a further ownership layer behind them. Leaving the structure to resolve through a single named shareholder is what re-triggers the error.
Every ABO still runs the full AML and identity checks you have configured, so you get complete coverage of all partners without pushing them into shareholder fields that don't apply.
**Structure:** A foundation or association. No shares, no members, controlled by a board.
**How to model it:**
* Board members added as **individual ABOs**.
* Directors or officers added as **CEO** where the entity has them.
* **Disclose Percentage** set to **Off** or **Optional**.
* Governing documents — statutes, articles, board resolutions — uploaded as supporting documents to evidence who controls the entity.
The same pattern applies to co-operatives and other entities where control does not come from equity.
**Structure:** Ownership is dispersed and no single holder reaches your **Shareholder Threshold**.
**How to model it:**
* Declare any shareholders that do cross the threshold as normal.
* Add the **senior managing official** as an **individual ABO** so the case still has a screened natural person attached, rather than resolving to nobody.
* Note the reason in the case — a [questionnaire](/guides/dashboard/features/step-questionnaire) answer or an uploaded declaration — so the absence of a UBO is an evidenced decision rather than a gap.
***
## Keeping Automations Aligned with the Roles You Use
Roles are not just labels — automations target them. If you model a structure with an unusual role, check that your checks follow.
| Automation | Behaviour to watch |
| --------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [AI reviewer rules](/guides/dashboard/kyb/ai-reviwer-check-reference) | A rule targeting a beneficiary type that isn't present on the case is **silently skipped** — no result appears in the UI. A rule written against Shareholder will not run on a case built from ABOs. |
| [KYC token automation](/guides/dashboard/risk/custom-rules) | Can be configured for **UBO, ABO, Shareholder, and Representative**. Enable it for the roles you actually use, or verification links won't be sent. |
| [Shareholders check automation](/guides/dashboard/risk/custom-rules) | Extracts shareholders from credit bureau reports. Partnerships and foundations generally have no such registry data, so stakeholders must be added manually. |
| Identity verification | Configured per step and per role. Enabling it for Shareholders does not enable it for ABOs unless you use the unified configuration option. |
***
## Troubleshooting
| Symptom | Cause | Fix |
| --------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- |
| Incomplete ownership structure on submit | The case has no beneficiaries at all, or a company Shareholder / UBO / ABO with no individual behind it | Add the missing individuals in the appropriate role, or switch to **First level ownership** if you don't need the full chain |
| Client can't complete a chain at a company that has no further owners | **Companies without further shareholders** is off on the workflow — it defaults to off | Enable it on the workflow's [Ownership Structure step](/guides/dashboard/kyb/step-ownership-structure), then the client can declare and confirm it |
| Client cannot add a partner or founder | **ABO** is not enabled under **Individual shareholder types** | Enable ABO in the [Ownership Structure step](/guides/dashboard/kyb/step-ownership-structure) |
| Client is blocked because they cannot state a percentage | **Ask shareholder's to disclose %** is set to **Require** | Set it to **Optional** or **Off** for workflows that handle non-equity structures |
| A beneficiary check never appears in the results | No beneficiary of the targeted type exists on the case | Align the rule's target role with the roles the workflow actually collects |
| Sole proprietor fields shown for a multi-partner firm | The Sole Proprietorship step is active, which hides the director and shareholder sections | Route the case to a workflow without that step, and model the partners as ABOs |
**Known limitation.** There is no dedicated entity type for general partnerships, memberless foundations, or other structures that do not resolve into a percentage-shareholding chain. ABO is the current recommended way to represent them rather than a purpose-built solution. It gives full check coverage of every stakeholder and satisfies structure validation, but the case will not display a native partnership structure. This gap is logged internally. If you routinely onboard these entity types, consider a dedicated workflow for them and route to it with [Dynamic Workflows](/guides/dashboard/kyb/dynamic-workflows).
# KYB Verification Statistics
Source: https://documentation.idenfy.com/guides/dashboard/kyb/statistics-business-verification
Analyze business verification performance metrics, company totals, and country-level statistics in the iDenfy dashboard with filters.
### Global Filters
Before analyzing the data, set your scope using the controls at the top:
* **Time Range:** Filter all charts by **Year**, or a custom **Date Range**.
* **Country Select:** Narrow down the statistics to a specific jurisdiction.
***
### Performance Metrics
#### Company Totals
A high-level view of your verification pipeline volume.
* **Approved:** Successful business verifications.
* **Denied:** Rejected submissions.
* **Pending:** Records currently in progress or awaiting review.
#### Callbacks
Tracks the reliability of your automated data transfers (Webhooks).
* **Successful:** Data successfully sent to your system.
* **Failed:** Delivery attempts that returned an error. Use this to identify integration downtime.
#### Country Totals
A breakdown of activity by jurisdiction, showing **Total**, **Approved**, **Denied**, and **Pending** counts per country.
***
### Compliance and Screening
These sections detail the results of automated background checks on entities and persons.
#### Adverse Media and Sanctions
Both sections follow the same reporting logic to categorize screening results:
* **Checks:** Total number of screening sessions performed.
* **Flags Found:** The system identified a potential match in a database.
* **No Flags:** No matches found; the entity is clear based on available data.
* **True Positive:** A manager confirmed the flag is a real match.
* **False Positive:** A manager dismissed the flag as a "near-match" but not the same person/entity.
* **Pending:** Flags found but not yet reviewed or categorized by a manager.
***
### Additional Insights (Where Enabled)
* **Denied Reasons:** A breakdown of why companies fail verification (e.g., invalid documents, high risk).
* **AML Checks:** Specific volume of Anti-Money Laundering screening activity.
* **Form Totals:** A trend chart comparing the current week's submission volume against the previous week.
# Company Information Workflow Step
Source: https://documentation.idenfy.com/guides/dashboard/kyb/step-company-information
Configure required company data fields, search settings, email verification, and document requirements in the iDenfy KYB workflow.
This section allows you to configure exactly what data and documents are required from the company during the verification process. You can select from standard presets, create custom requirements, and organize the order in which they appear to the client.
### General Settings
At the top of the page, you can enable specific verification tools:
* **Company search field:** When enabled, clients can search for their company by name or registration number. If found, the system will auto-fill available details into the KYB form.
* **Email verification:** If enabled, the system will send a verification code to the user's email, which they must enter to proceed.
***
## Customization
Here you have options to add and customize:
1. [**Company fields**](/guides/dashboard/general/field-management-individuals-companies)
2. [**Company documents**](/guides/dashboard/general/document-management-individuals-companies)
# Director Information Workflow Step
Source: https://documentation.idenfy.com/guides/dashboard/kyb/step-director-information
Configure director identity verification, corporate director settings, and biometric KYC requirements in the iDenfy KYB workflow step.
## Director Identity Verification
You can enforce a strict KYC process for directors.
* **Enable Director ID verification** — Toggle **On** to require directors to complete a biometric identity check (selfie + ID document scan).
* **Configuration** — Click the ID Card Icon next to the toggle to customize the verification session settings, risk assessment, and specific checks.
### Customizable Fields
1. [Individual fields](/guides/dashboard/general/field-management-individuals-companies)
2. [Individual documents](/guides/dashboard/general/document-management-individuals-companies)
***
## Corporate Directors
Some corporate structures include other companies acting as directors.
**Directorship addition** — Toggle **On** to allow the client to list legal entities (companies) as directors in the governance structure. If disabled, the form will only accept individual persons as directors.
### If Enabled, Customizable Fields
1. [Company fields](/guides/dashboard/general/field-management-individuals-companies)
2. [Company documents](/guides/dashboard/general/document-management-individuals-companies)
# Ownership Structure Workflow Step
Source: https://documentation.idenfy.com/guides/dashboard/kyb/step-ownership-structure
Configure shareholder declaration, ownership thresholds, check levels, and UBO verification requirements in the iDenfy KYB workflow.
### General Configuration
The settings appear in this order in the workflow editor.
* **Ownership structure:** Toggle this **On** to require the client to declare shareholders. The rest of the step only appears once it is on.
* **Select shareholder check level:**
* **First level ownership** — companies can only enter direct shareholders. The chain is not traced any further.
* **Full ownership list** — full ownership to an individual or government shareholder is required.
* **Companies without further shareholders:** A toggle that appears once **Full ownership list** is selected, **Off** by default. Turn it on and clients can declare that a company shareholder has no shareholders of its own — they must confirm that declaration before continuing. The declared company then completes that branch of the structure, so the form can be submitted without tracing further down to individuals.
* **Shareholder threshold:** Set the percentage in **Shareholders who own** — clients then list only shareholders at or above it. Entering **25%** means only holders of 25% or more must be declared.
* **Ask shareholder's to disclose %:** Whether the exact stake has to be given — **Off**, **Optional**, or **Require**.
***
### Individual Shareholder Types
Select which types of owners the system should accept. For example, if you only want to collect Ultimate Beneficial Owners, select only "UBO".
* **Shareholder**
* **UBO** (Ultimate Beneficial Owner)
* **ABO** (Alternative Beneficial Owner)
A role that is not enabled here cannot be added by the client. **ABO** is the role for stakeholders who are beneficial owners without a percentage stake — partners, founders, board members of a memberless entity. See [Stakeholder Roles in KYB Workflows](/guides/dashboard/kyb/stakeholder-roles) for what each role means and how to map partnerships, foundations, and holding chains onto them.
Below the types, **Request the same fields and documents for Shareholders, UBOs, ABOs** decides whether all owner types are treated equally or each requires its own verification steps.
**Yes — unified requirements.** A single configuration applies to everyone listed in the ownership structure.
**No — custom requirements.** A tabbed interface appears. Toggle between the **Shareholder**, **UBO**, and **ABO** tabs to set unique data and document requirements for each specific type.
***
### Identity Verification and Requirements
For each enabled shareholder type (or the unified group), you can configure the specific data to collect.
* **Enable Shareholder ID verification:** Toggle this **On** to require the individual to complete a biometric identity check.
* **Configuration:** Click the gear icon beside the toggle to customize the verification session (see the **Configuring Identity Verification** guide).
**Individual** requirements\*\*:\*\*
* [**Individual Fields**](/guides/dashboard/general/field-management-individuals-companies) — **Name** and **Surname** are included by default. Use **Fields** to add more.
* [**Individual Documents**](/guides/dashboard/general/document-management-individuals-companies) — requested documents are required or optional in your KYB form. Use **Documents** to add them.
**Company** Stakeholder customizable requirements:
* [**Company fields**](/guides/dashboard/general/field-management-individuals-companies)
* [**Company Documents**](/guides/dashboard/general/document-management-individuals-companies)
# Representative Information Step
Source: https://documentation.idenfy.com/guides/dashboard/kyb/step-representative-information
Configure whether representatives are required, enable ID verification, and set custom fields and documents for the representative step in a KYB workflow.
**Location:** **Business Verifications** → **Configuration** → **Workflows** → edit a workflow → **Representative information**
***
## Toggles
### Representative Information
Enables the representative step in the KYB flow. When off, the step is hidden entirely and clients are not asked for representative details.
### Require Representative Information
When on, clients must add at least one representative before they can submit the KYB form. When off, the step is shown but clients can proceed without adding a representative.
This toggle is only available when **Representative information** is enabled.
### Enable Representative ID Verification
When on, each representative must complete identity verification (selfie + ID document scan) as part of the KYB flow. A settings icon next to the toggle opens the IDV configuration for this step.
***
## Representative Fields
Select which data fields to collect from each representative. Click **Fields** to add predefined or custom fields.
**Default fields (always included):**
* **Name**
* **Surname**
**Optional predefined field:**
* **Email** — can be added and optionally marked as **Required**
**Custom fields** can be created with a custom name and a field type (text, number, select, country, etc.). Each custom field can be marked as required and translated into the languages configured for your KYB flow.
Fields can be reordered by dragging.
***
## Representative Documents
Configure which documents representatives must upload. Click **Documents** to add document slots. Each document slot can be set as required or optional.
# Sole Proprietorship Workflow Step
Source: https://documentation.idenfy.com/guides/dashboard/kyb/step-sole-proprietorship
Configure the sole proprietorship step in iDenfy KYB workflows with custom fields for business details, documents, and owner data.
The **Sole Proprietorship** step lets you tailor the KYB flow for individual business owners. When enabled, it hides the director and shareholder sections and replaces them with dedicated fields for the sole proprietor.
## Enabling Sole Proprietorship
Toggle **Sole proprietorship** to activate the step. Once enabled, the director and shareholder sections are automatically hidden — only the fields and questionnaires relevant to a sole proprietor are shown to the applicant.
## Identity Verification for the Owner
When the main toggle is on, an additional option becomes available:
**Enable Sole proprietorship ID verification** — when toggled on, the sole proprietor is required to complete a [personal identity verification (IDV)](/guides/dashboard/kyc/identity-verification-in-workflow) check as part of the KYB onboarding process.
## Configurable Sections
Each section can be customized with additional fields or document requirements.
### Sole Proprietor Business Details
Configure the business information collected from the sole proprietor. Default fields:
* **Company name** (Default)
* **Country** (Default)
Use the **Fields** button to add or reorder fields. See [Field Management](/guides/dashboard/general/field-management-individuals-companies) for details.
### Sole Proprietor Business Documents
Define which business documents the sole proprietor must upload. Use the **Documents** button to configure accepted document types and requirements. See [Document Management](/guides/dashboard/general/document-management-individuals-companies).
### Sole Proprietor Individual Details
Configure the personal information collected from the owner. Default fields:
* **Name** (Default)
* **Surname** (Default)
Use the **Fields** button to add or reorder fields.
### Sole Proprietor Individual Documents
Define which personal identity documents the sole proprietor must provide. Use the **Documents** button to configure accepted types and requirements.
***
## Testing Your Configuration
To verify the flow works correctly, create a test session manually:
1. Go to **Business Verifications → Create session**, select the flow you configured, and submit.
2. Open the generated link and begin onboarding as a client would.
3. On the **Company details** page, confirm the **Sole proprietorship** option is visible and selectable. Once chosen, the director and shareholder sections should disappear and the sole proprietor fields should appear.
# TIN and EIN Verification
Source: https://documentation.idenfy.com/guides/dashboard/kyb/tin-ein-verification
Verify business tax identifiers worldwide — VAT for EU and EIN for US companies — using dedicated tax identification fields in iDenfy KYB workflows.
## How the System Handles Tax Identifiers
When building a KYB workflow, you configure which tax identifier your clients must provide by selecting a field from the **Tax Identification** section — a dedicated section in the workflow builder, separate from Business Information. You can choose exactly one field per workflow:
| Field | Typical market | Validation performed |
| ----------------------------------- | -------------- | -------------------------------------- |
| **VAT Number** | EU | VAT validation for 27 EU member states |
| **EIN** | United States | EIN verification |
| **TIN (Tax Identification Number)** | Global | No automated validation |
| **Tax ID Number** | Global | No automated validation |
The end user sees the label of the field you selected. The [AI Reviewer](/guides/dashboard/settings/ai-reviewer) supports all four field types for automated data comparison steps.
### EU Countries (VAT Validation)
VAT validation applies to the 27 EU member states:
`AT` `BE` `BG` `HR` `CY` `CZ` `DK` `EE` `FI` `FR` `DE` `GR` `HU` `IE` `IT` `LV` `LT` `LU` `MT` `NL` `PL` `PT` `RO` `SK` `SI` `ES` `SE`
**Notable exclusions — no VAT validation runs for these:**
* **EEA non-EU countries:** Norway, Iceland, Liechtenstein
* **Non-EU Balkans:** Serbia, Albania, North Macedonia, Bosnia, Montenegro, Kosovo
EU Balkan members **are** included: Bulgaria (`BG`), Croatia (`HR`), Romania (`RO`), and Slovenia (`SI`) all receive VAT validation.
### Troubleshooting: VAT Validation Unexpectedly Skipping
If VAT validation is not running for an EU company, check:
1. Is the **country field** set correctly to one of the 27 EU member state codes?
2. Is the **TIN field populated** and at least 2 characters long?
***
## Using a Company's EIN (Tax ID)
EIN verification is only available for businesses registered in the **United States**. If a non-US company is submitted, the system will return: *"EIN verification is available for US companies only."*
### Add a Tax Identifier to Your KYB Workflow
When creating a custom KYB [**workflow**](/guides/dashboard/setup/setup-workflow-overview), go to the **Tax Identification** section and select the field that matches your market (VAT Number, EIN, TIN, or Tax ID Number). Only one field can be active per workflow.
Once configured, this field will be **mandatory** for the companies in that workflow. After setup, you can create a verification session:
* **Via the dashboard**
* **Through an API call**
### Verify TIN with iDenfy KYB
**Direct Input by the Client -** During the KYB verification process, clients can add their **EIN** directly in the highlighted field.
**Manual Input by You -** If a company provides additional information separately, you can manually upload their EIN (with consent).
1. Edit **TIN** for Individuals in the Ownership Structure
2. Edit TIN for individuals
3. Select the individual for whom to add TIN
**Limitation**
EIN / TIN **does not work** as a standalone feature, and **can not** be used outside the KYB verification
***
***
## Understanding TIN and EIN
## What Is a TIN?
A **Tax Identification Number (TIN)** is a unique number used by [**tax authorities**](https://www.irs.gov/businesses/employer-identification-number) to identify individuals and entities for tax purposes. In the **United States**, there are different types of TINs based on who is paying taxes:
* **SSN (Social Security Number)** – For U.S. citizens and residents who pay taxes as individuals.
* **ITIN (Individual Taxpayer Identification Number)** – For non-U.S. residents who are not eligible for an SSN but still need to pay U.S. taxes.
* **EIN (Employer Identification Number)** – For companies, organizations, and other entities that need to pay taxes or hire employees.
***
## What Is an EIN?
An **Employer Identification Number (EIN)** is a federal tax identification number assigned by the **IRS** to businesses operating in the United States. It is closely tied to the **TIN** and is essential for tax reporting, banking, and business operations.
**Key Facts:**
* Required for most businesses, especially those with employees.
* Used by corporations, partnerships, LLCs, nonprofits, trusts, estates, and other legal entities.
* Sole proprietors without employees may not need an EIN but are strongly encouraged to get one.
***
## Entities That Require an EIN
* All **corporations** and **partnerships**
* **LLCs** with employees or multiple members
* **Sole proprietors** with employees
* **Nonprofits, trusts, and estates**
* Certain other registered entities
### Entities That May Not Require an EIN
* Sole proprietors with no employees and not taxed as a corporation
* LLCs without employees and not taxed as a corporation
***
## Why EIN Verification Matters
An EIN is essential for businesses in the U.S. that are legally required to pay taxes. Even in cases where a **Social Security Number (SSN)** could be used, obtaining an EIN is highly recommended because:
* **Banking**: Most U.S. banks require an EIN to open a business account.
* **Hiring**: Mandatory for hiring employees.
* **Tax Filing**: Required for filing business taxes.
* **Security**: Separates personal and business finances for sole proprietors.
* **Growth**: Simplifies future scaling and compliance.
Without an EIN, businesses may face **unnecessary complications** when expanding or managing operations.
# Verification Sandbox and Testing
Source: https://documentation.idenfy.com/guides/dashboard/kyb/verification-sandbox-and-testing
Create sample KYC verification results from the iDenfy dashboard to test integrations, webhook handling, and decision logic without real users.
**Create test verification results directly from the Dashboard**
The **Sample verification** feature allows you to generate test identity verifications with predefined outcomes. It is designed to help you validate integrations, webhook handling, and decision logic **without real users or documents**.
**Key characteristics**
* Appears in the **Verification list**
* It is specially marked in the **verification list**
* Triggers **real webhook callbacks**
* Follows the same lifecycle as production verifications
***
## When to Use Sample Verifications
Use sample verifications to:
* Test webhook delivery and payload parsing
* Validate approval and denial flows
* Simulate automated vs. manual reviews
* Verify redirect logic and status handling
* Run QA without consuming production resources
- No real documents are requested
- The result is generated based on the selected scenario
- Available to all environment types
***
## How to Create a Sample Verification
### Open Verification Creation
* Navigate to **Verifications → New verification**
* Select the **Sample verification** tab
### Select Verification Scenario
Select the predefined outcome for the verification:
#### Available Scenarios
* Approved
* Approved – suspected
* Denied (expired document)
* Denied (fake document)
* Denied (face mismatch)
#### Select Review Type
* Auto only review
* Manual review
***
### Generate Verification
The system will:
* Create a verification session
* Apply the selected result and review the path
* Send webhook callbacks to your endpoint
* Display the verification in the main list with the identifier
***
## Webhook Behavior
Sample verifications trigger **the same** webhook events and behavior as production verifications.
* Learn how to set up [**System notifications (Webhooks, emails)**](/guides/dashboard/settings/system-notifications-webhooks-emails)
* Find detailed information about webhook behavior in [**the documentation**](/callbacks/ResultCallback)
# Age Verification
Source: https://documentation.idenfy.com/guides/dashboard/kyc/age-verification
Set up minimum and maximum age limits for identity verification in iDenfy with automatic UNDER_AGE and OVER_AGE compliance tagging.
Looking for **Age Estimation** instead? That's a different, standalone feature -- a selfie-first AI age check with its own session, billing, and webhook, independent of a full KYC verification. See [Age Estimation Overview](/guides/dashboard/age-estimation/overview).
Age verification works as a restriction. Users who are outside the accepted range will be marked with **tags:**
* **UNDER\_AGE** - user is younger than the required age
* **OVER\_AGE** - user is older than the required age
You can set this range as a global requirement via the **Dashboard**, under **Settings** → **Know Your Customer (KYC)** → **[Document & Identity Verification](/guides/dashboard/settings/document-identity-verification)**.
# Crossmatch Functionality
Source: https://documentation.idenfy.com/guides/dashboard/kyc/crossmatch-functionality
Cross-check user-provided personal data against document-extracted data to detect discrepancies and mismatches in iDenfy verification.
Data crossmatch is a method of comparing data from different datasets to find similarities, discrepancies, or correlations between them. The process generally ensures data consistency, accuracy, and information validity across various sources.
## Why Is Crossmatching Companies Important?
Crossmatching lets you perform additional checks between companies that use KYB verification and databases such as the Credit bureau, government registers, and government register filings (company mortgages). This adds an extra layer of security and helps you screen companies more efficiently.
## How Does iDenfy Help You Use Data Crossmatching for KYB Solutions?
iDenfy's solution enables your compliance officer, or the person responsible for compliance, to cross-check data across various databases efficiently. This significantly reduces the time required to verify a client's compliance and lowers operational costs.
Once everything’s set up, our user-friendly, no-code, AI-powered tool swiftly processes the selected databases to generate results. To learn how the functionality can be enabled and set up, please proceed to section 5.
## With What GOV Check Report Types Can We Compare Data?
You have the option to generate one of five report types:
* Credit bureau
* GOV register report
* GOV register lite
* Credit bureau lite
* Register reports
Due to the amount of data required to find the best match, the crossmatch functionality works well with Credit bureaus, Gov register reports, and register reports. *The cross-match functionality is incompatible with GOV register lite and Credit bureau lite reports.*
## How Can I Start Using the Crossmatch Functionality?
To start using the crossmatch functionality, you must first enable it. If you are already using our products, contact your account manager. You will then agree on details and the amount of credits needed, and they will also set up the required permissions.
When you have the credits and the service enabled, you need to generate the reports you’ll compare. Otherwise, the crossmatch will not work. First, click
next to Gov checks in the business verification to see which report type compares the data you need. Then, click “Add check” in the GOV Checks section:
You will then be brought to the Registers selection:
To start the process, you must generate one of the three possible reports:
* Government records,
* Credit bureau
* Government register fillings (company mortgages)
Once you have one or more reports generated, click the "Company Data Comparison" field, select one of the available reports from the list, and then click "Compare Data" to initiate the comparison:
Based on the reports you generated in the gov checks list, you will be able to select the reports with which you can compare data. In this case, we had 2 reports generated previously, so both of them can be used for comparison:
After choosing which report to compare, click “Compare data“. When you click the “Compare data” button, the process is initiated, and the crossmatching starts. Once the crossmatching results are returned, you can see them in the “Company data comparison field”:
To get a more detailed view, click “Detailed view” and check different provided fields.
To better understand the Overall result, there are four different match levels:
1. Match
2. Partial match
3. No Match
4. Not provided in the system
Depending on the results, one of these levels is returned.
## How Does the Full Flow Look?
# Disposed Verifications
Source: https://documentation.idenfy.com/guides/dashboard/kyc/disposed-verifications
View the audit trail of deleted verification records in the iDenfy dashboard including deletion timestamps, reasons, and responsible users.
The **Disposed Verifications** page serves as an audit trail for verification records that have been deleted from the active system. This log ensures transparency regarding when, why, and by whom a record was removed.
## Search and Audit Tools
Use these tools to track down specific deleted records:
Locate a record using the specific **Company ID**.
Toggle between **Deletion Date** (when it was removed) and **Submitted Date** (when the verification originally started).
Narrow results by **Reason**, **Status**, or **Result** — the audit metadata recorded at disposal.
## Disposal Reasons
Records are typically moved to this list for one of the following reasons:
A manager manually deleted the record from the platform.
The record was removed based on your company's automated data retention or cleanup settings.
Deletion was triggered via an API request or a direct partner instruction.
## Viewing Disposed Data
The main table provides a high-level overview of the audit trail. To view the full context of a deletion, click the **Company ID** link or the **Arrow Icon** to open the **Disposed Verification Info** card.
### Information Available in the Details View
| Field | Description |
| --------------- | ------------------------------------------------------------------------------------------- |
| Deletion Time | The exact timestamp the record was moved to the disposed list. |
| Manager | The specific team member responsible for the deletion (if performed manually). |
| Submission Time | The original date the verification session was created. |
| Final State | The **Status** (e.g., Completed) and **Result** (e.g., Approved) at the moment of disposal. |
Disposed records are kept for compliance and auditing purposes. Depending on your data retention policy, these logs may be permanently removed after a set period.
# Duplicate Check
Source: https://documentation.idenfy.com/guides/dashboard/kyc/duplicate-check
Detect and manage duplicate identity verifications using biometric face matching and document comparison tools in the iDenfy dashboard.
## What Does the Duplicate Feature Do?
The **Duplicate Check** helps prevent fraud by detecting if the **same person tries to register multiple times**.
It compares a new customer’s **face** against your existing database of completed verifications.
***
## Why It Matters
The feature instantly helps you:
* **Stop Bonus Abuse** – blocks the same person from repeatedly claiming “new user” promotions.
* **Identify Fraud Rings** – detects individuals using many different stolen or fake IDs.
* **Block Banned Users** – prevents fraudsters who were rejected from re-registering.
***
## How It Works
* **Separate checks** – Face and Document Face are checked independently. You can run duplicates on the **selfie**, **document photo**, or **both**.
* **Automatic check** – Every time you perform a verification, the system runs a duplicate check.
* **1:N matching** – Unlike the standard document-to-selfie comparison, this is a one-to-many search against biometric templates stored for your account. Enabling the duplicate check is therefore what causes those templates to be retained — see [Face Matching and Biometric Data](/guides/dashboard/kyc/face-matching).
**Good to know**
* If you use the same **clientId** for the same user, the **Duplicate** feature will not add a tag - we assume you’re making a **re-verification**
### Possible Outcomes
1. **No match found** → Verification is approved as usual.
2. **Match found** → The user is marked as **Approved (Suspected)**.
* The verification is still **valid** since all submitted data is correct.
* You decide whether to **onboard** or **deny** the customer.
3. **Verification denied for other reasons** → Duplicate check is **not performed**.
# Face Matching and Biometric Data
Source: https://documentation.idenfy.com/guides/dashboard/kyc/face-matching
How iDenfy performs 1:1 and 1:N biometric face matching, why liveness detection is a separate check, and when biometric data is stored.
Every verification with a face step runs more than one biometric analysis, and they are easy to confuse. Face matching **compares** faces. Liveness detection **does not compare anything** — it decides whether the captured subject is a genuine, physically present human.
This page explains each check, which result field reports it, and what biometric data iDenfy stores as a consequence.
***
## The Three Checks at a Glance
| Check | Question it answers | Compares against | When it runs |
| ---------------------- | ---------------------------------------------------------------- | ------------------------------------------------------ | --------------------------------------------------- |
| **1:1 face matching** | Is the person in front of the camera the owner of this document? | The face on the document submitted in the same session | On every verification with a document and face step |
| **1:N face matching** | Have we seen this face before? | Biometric templates already stored for your account | Only when Duplicate Check or Blocklist is enabled |
| **Liveness detection** | Is this a real, live human — or a spoof? | Nothing. It analyzes the capture itself | When enabled in **Biometric & Liveness** settings |
***
## 1:1 Face Matching
The face is extracted from the portrait on the submitted identity document and compared against the face captured during the verification session. Only these two images are involved, and both come from the same session — hence *one-to-one*.
The outcome is reported on `autoFace` (and on `manualFace` if the verification goes to human review):
* `FACE_MATCH` — the person and the document owner are the same.
* `FACE_MISMATCH` — the faces could not be matched.
* Quality codes such as `NO_FACE_FOUND`, `TOO_MANY_FACES`, or `FACE_TOO_BLURRY` mean the comparison could not be completed reliably.
For every possible value and its plain-English meaning, see [Verification Statuses → Face Status Values](/guides/dashboard/kyc/verification-statuses#face-status-values).
### Second-Opinion Check on a Mismatch
Two matching algorithms are available, and one of them runs first. When it returns `FACE_MISMATCH` or `NO_FACE_FOUND`, the other one runs automatically and the better of the two verdicts is the one reported.
This means a selfie and a document photo of the same person are far less likely to be reported as a mismatch just because one algorithm struggled with that particular pair. The fallback runs in whichever direction is needed, depending on which algorithm went first, and it is active for all accounts — there is nothing to enable.
Match thresholds can also be tuned for specific countries and document types where the general threshold produces too many false mismatches. Contact iDenfy if mismatches on a particular country or document type are sending more verifications to review than you would expect. Thresholds used for [duplicate face detection](/guides/dashboard/kyc/duplicate-check) are separate and unaffected.
***
## 1:N Face Matching
The session's face data — the selfie, the face on the document, or both — is compared against biometric templates already stored for your account. This is *one-to-many*: one new face against many stored records.
Its purpose is to recognize a returning person, not to validate the current document. Two features rely on it:
| Feature | API flags | Tags returned on a hit |
| -------------------------------------------------------- | ----------------------------------------------- | ------------------------------------------ |
| [Duplicate Check](/guides/dashboard/kyc/duplicate-check) | `checkDuplicateFaces`, `checkDuplicateDocFaces` | `DUPLICATE_FACE`, `DUPLICATE_DOC_FACE` |
| [Blocklist](/guides/dashboard/risk/blocklist-setup) | `checkFaceBlacklist`, `checkDocFaceBlacklist` | `FACE_BLACKLISTED`, `DOC_FACE_BLACKLISTED` |
A hit does not deny the verification — the submitted data is still valid, so the result becomes **Approved (Suspected)** with the tag attached, and you decide whether to onboard the user. See [Suspected Status](/kyc/suspected-status).
1:N matching only works if there is something to match against, so enabling either feature is what causes biometric templates to be retained for your account. See [What Biometric Data Is Stored](#what-biometric-data-is-stored).
***
## Liveness Detection Is Not Face Matching
Liveness detection is **not** a face comparison — neither 1:1 nor 1:N. It is a distinct analysis of a single capture, designed to determine whether the subject is a genuine, live human or a spoof attempt.
Because the two checks answer unrelated questions, they can disagree — and each can fail while the other passes:
| Scenario | Face matching | Liveness | `autoFace` |
| ----------------------------------------------------------- | ------------- | ------------ | ---------------- |
| The document owner completes the verification in person | Passes | Passes | `FACE_MATCH` |
| Someone else presents the document | Fails | Passes | `FACE_MISMATCH` |
| A printed photo or screen replay of the real document owner | Would pass | Fails | `FAKE_FACE` |
| Poor lighting, obstruction, or a beauty filter | Not reported | Inconclusive | `FACE_UNCERTAIN` |
A perfect face match therefore proves nothing about presence, which is why liveness is configured and evaluated separately. For the detection methods, spoofing categories, and configuration options, see [Liveness Checks](/guides/dashboard/kyc/liveness-checks).
***
## What Biometric Data Is Stored
The only biometric artifact iDenfy can retain is a **facemap** — a mathematical template derived from a face image, not the image itself.
A facemap is stored only when your account uses a feature that needs a reference set to match against:
* **Duplicate Check** — selfie, document face, or both
* **Face Blocklist** — selfie, document face, or both
* **[Face Authentication](/face-authentication/overview)** — re-authenticates a returning user against the template from their original verification
If you do not use any of these features, **no biometric markers are saved.** The faces are compared during the session to produce the 1:1 result, and no biometric template is derived or retained afterwards.
Biometric template retention is a separate question from document and image retention. Captured images and extracted data follow the data retention period configured for your account, regardless of whether any facemap is stored. For legal bases, special-category obligations, and retention configuration, see [GDPR Compliance](/guides/compliance/gdpr).
***
## Next Steps
Detection methods, spoofing types, and configuration.
Detect the same person registering more than once.
Block known fraudsters by face, document, or personal data.
Legal bases and retention for biometric processing.
# ID Verification
Source: https://documentation.idenfy.com/guides/dashboard/kyc/id-verification
Overview of iDenfy identity verification covering document capture, liveness detection, AI analysis, and human review for KYC compliance.
## What Is KYC (Know Your Customer)?
Check out our [**blog post**](https://idenfy.com/blog/what-is-kyc/) to learn everything you need about KYC process!
If you’re interested in the KYC services we provide, you can find more information [**here**](https://idenfy.com/identity-verification-service/).
# Identity Verification in Workflows
Source: https://documentation.idenfy.com/guides/dashboard/kyc/identity-verification-in-workflow
Enable and configure identity verification for directors, shareholders, and representatives within iDenfy KYB workflow step settings.
In the workflow settings for **Directors**, **Shareholders**, and **Representatives**, you will see an option to **Enable ID verification**.
While the toggle turns the requirement on or off, clicking the **ID Card Icon** button next to it opens the **Edit verification settings** modal. This allows you to customize the specific KYC (Know Your Customer) flow for that individual.
***
### External Reference
Enter a unique identifier to associate with this verification. This allows you to track and filter records based on your internal system's data.
***
### Session Settings
Control the timing and validity of the verification link sent to the individual.
* **Session type:** Define the specific verification flow type.
* **Link expiry time:** How long the verification link remains valid before it expires (e.g., 24 hours).
* **Session time:** How much time the user has to complete the process once they open the link (e.g., 30 min).
***
### IDV Completion Reminder
Send an automatic reminder to users who selected "Verify Later" and have not completed identity verification before their session expires. When enabled, select one or more intervals from the **Remind client after (hours)** dropdown — a reminder email is sent at each chosen time only if the user has not yet completed verification.
***
### Custom Theme
When enabled, select a theme from the dropdown to apply custom branding to this specific KYC UI session, overriding the default account theme for this individual's verification.
***
### Supervision and Guidance
* **Manual review:** Toggle this **On** if you want a human agent to manually review the verification results before approval.
* **Instructions:** Toggle **On** to display helper text and instructions to the user during the verification process.
***
### Data Collection and Risk
* **Questionnaire:** Enable this to require the user to answer a specific set of questions. You can select a pre-made template from the dropdown menu.
* **Risk assessment:** Enable automated risk scoring for the individual. You must select a specific risk assessment template from the dropdown.
* **Additional step (POA):** Enable this to require a **Proof of Address** document upload (or other required files) as part of the flow.
***
### Bank Verification
* **Bank verification:** Toggle this to require your client (specifically for EU countries) to verify their personal bank details.
* **Bank name and country** are retrieved by default.
* **Additional Data:** If enabled, you can request:
* **Account IBANs data:** IBANs and owner name.
* **Account Balances:** Current balance details.
* **Transactions List:** History of transactions (usually 1 year) including amounts, creditors, and receivers.
***
### Contact Verification
Ensure the individual's contact details are valid by requiring a code confirmation.
* **Email verification:** Requires the user to verify their email address.
* **SMS verification:** Requires the user to verify their mobile phone number via SMS code.
# Liveness Checks
Source: https://documentation.idenfy.com/guides/dashboard/kyc/liveness-checks
Configure passive and active liveness detection in iDenfy to catch printed photos, screen replays, masks, and injected deepfakes during verification.
## What Is Liveness Detection?
**Liveness detection** checks whether the face (or document) in front of the camera belongs to a real person physically present at capture time, rather than a photo, a screen, or a mask.
Liveness detection is **not** a face matching comparison — neither 1:1 nor 1:N. It makes no comparison at all. It is a distinct analysis of the capture itself. A face can match the document perfectly and still fail liveness. See [Face Matching and Biometric Data](/guides/dashboard/kyc/face-matching) for how the two checks differ and how their results combine.
### How It Works
Liveness detection uses trained neural networks that analyse the captured image or video stream itself — its optics, texture and digital characteristics — rather than comparing facial features between two images.
Signals the models are trained on include:
* **Depth and perspective cues** — how facial features fall off with distance and lighting, which differ between a real face and a flat surface such as a phone screen or a printout.
* **Skin texture and reflection** — real skin scatters light differently from paper, glass, and mask materials.
* **Digital artefacts** — compression noise, moiré patterns from photographing a screen, resampling from digital enlargement, and unnatural edges.
The models return a **single liveness probability** per capture, not a per-signal breakdown. iDenfy compares that probability against your configured threshold to produce a pass or fail. The dashboard and webhooks report the score and, where the provider supplies one, a specific failure reason — but not individual "depth" or "texture" sub-scores.
***
## Types of Spoofing Attacks
Fraudsters use presentation attacks to trick biometric systems. Broadly:
### 2D Spoofing (Flat Fakes)
The most common and easiest type of attack, using flat surfaces that lack the depth of a real face.
* **Printed photos** — high-resolution photographs held in front of the camera.
* **Screen replays** — a photo or pre-recorded video shown on a phone, tablet, or monitor.
* **Paper masks** — printed faces with eyes and mouth cut out, worn by the attacker.
* **Deepfakes shown to the camera** — AI-generated video played back on a screen.
### 3D Spoofing (Physical Fakes)
More sophisticated attacks using physical objects that mimic human depth and volume: silicone or latex masks, resin busts printed from a 3D scan, and realistic mannequin heads. These are rarer and harder to detect; detection rates are meaningfully lower than for 2D attacks, and active liveness performs better against them than passive.
### Injection Attacks
Rather than showing something to the camera, the attacker bypasses the camera entirely — feeding a synthetic or replayed stream through a virtual camera driver or an emulator. This class is covered by a **separate, optional check** rather than by liveness scoring itself. See [Injection and virtual camera detection](#injection-and-virtual-camera-detection).
***
## Face Capture Guidance
Before the liveness check runs, users go through a **face capture step**. The web flow gives real-time feedback while the camera is live — telling the user to fit their face in the frame, move closer, or move further away — so fewer captures are rejected for poor positioning.
This on-screen guidance is presentation only. It runs in the user's browser to help them frame the shot; it performs no liveness or anti-spoofing analysis, and it never decides the outcome of a check.
### Automatic Capture
Where automatic capture is active, the photo is taken once the face has been held in position for a moment, without a manual tap. Breaking the framing resets the progress. If the user cannot complete an automatic capture, a manual capture button appears after a short delay as a fallback.
Removing the manual tap shortens the step and reduces motion blur in the captured image.
Automatic capture is being rolled out as an A/B test across the web flow, so only a share of your users see it — the rest keep the existing manual capture button. It doesn't apply to sessions where users can upload an image at the capture step, and mobile SDK sessions are not included.
***
## Liveness Detection Methods
Liveness runs independently on the **Face** step and the **Document** step. Each can be enabled separately, each has its own pass threshold, and each reports its own result.
### Passive Face Liveness
**Best for: maximum conversion and a seamless user experience.**
Passive liveness runs on the selfie the user already takes. It requires **no additional action** — no blinking, smiling, or head movement.
* **How it works** — a single captured image is analysed and scored between 0 and 1.
* **Threshold** — configurable per token; the default is **0.5**. Captures scoring below it are rejected.
* **What it catches** — printed photos, screen replays, and masks or heavy face coverings.
* **User experience** — invisible to the user; no instructions, no extra step.
### Passive Document Liveness
The same approach applied to the document image, to confirm the user is holding the physical document rather than a copy. Two spoof detection pipelines are available, plus an optional portrait check:
* **Screen replay** — the document was photographed from a screen. Reported as the suspicion reason `DOC_MOBILE_PHOTO`.
* **Printed copy** — the document is a printout or photocopy. Reported as `DOC_PRINT_SPOOFED`.
* **Portrait substitution** *(optional)* — the portrait area has been replaced or overlaid. Reported as the fraud tag `PORTRAIT_SUBSTITUTION`.
Each pipeline has its own strictness setting (**soft**, **regular**, or **hard**), letting you trade false rejections against detection rate per document type.
Printed copy detection is automatically skipped for document types that are legitimately paper-based, since a genuine paper document would otherwise be flagged. Screen replay detection is likewise skipped for a small set of document types where it is unreliable.
### Active Liveness (3D)
**Best for: higher-risk flows where an extra user interaction is acceptable.**
Active liveness replaces the standard static selfie with a short guided capture, producing a 3D face map rather than a single flat image.
* **How it works** — the user frames their face in an on-screen oval, confirms they are ready, and **moves closer to the camera** while the SDK captures. On-screen feedback guides framing, distance, head angle, lighting and steadiness throughout.
* **Requirements shown to the user** — look straight ahead, neutral expression with no smiling, no dark glasses, adequate lighting.
* **Security** — the depth information from the movement is what raises the bar against screen replays, deepfake playback and masks, relative to a single still image.
* **User experience** — adds roughly one extra step, with an instructional screen beforehand.
Active liveness is a **guided distance-and-framing capture**, not a randomised challenge-response. Users are not asked to blink, smile, turn their head to a randomised sequence, or read out digits.
Active 3D liveness and passive face liveness are mutually exclusive. Enabling active liveness replaces the standard face capture step; passive face liveness is not additionally applied to that session.
***
## Injection and Virtual Camera Detection
An optional check, enabled separately and requiring passive face liveness to be on, targeting attacks that bypass the physical camera: virtual camera drivers, injected streams, and deepfakes fed directly into the capture pipeline.
Alongside it, iDenfy applies its own heuristics:
* **Camera device screening** — known virtual camera and screen-capture software is detected from the reported camera device, with a whitelist for legitimate virtualisation environments.
* **Frame border analysis** — letterboxing and uniform borders characteristic of a re-broadcast stream.
* **Duplicate capture detection** *(face authentication)* — a selfie that is near-identical to one submitted previously in the same account is rejected as a replay.
Detections surface as the fraud tag `VIRTUAL_CAMERA`.
Where the environment looks untrusted but face liveness itself passes, the session is **tagged rather than rejected** — it receives the `UNTRUSTED_ENVIRONMENT` risk tag for your review, and the verification continues.
***
## Results and Rejection Reasons
Face liveness failures are returned with a specific reason where the model can supply one, and the end user sees matching guidance on how to retry:
| Reason | Meaning |
| --------------------------------------- | -------------------------------------- |
| `FACE_NOT_FOUND` | No face detected in the capture |
| `TOO_MANY_FACES` | More than one face in frame |
| `FACE_ANGLE_TOO_LARGE` | Head turned too far from the camera |
| `FACE_TOO_SMALL` / `FACE_TOO_CLOSE` | Face outside the usable distance range |
| `FACE_CLOSE_TO_BORDER` / `FACE_CROPPED` | Face partly outside the frame |
| `FACE_IS_OCCLUDED` | Face covered — mask, sunglasses, hand |
| `EYES_CLOSED` | Eyes closed at capture |
| `PROBABILITY_TOO_SMALL` | Scored below your configured threshold |
| `FAKE_CAPTURE` | Injected or virtual-camera capture |
| `DUPLICATE_IMAGE` | Re-submission of a previous capture |
Document liveness failures return the poor-quality reasons (document not found, cropped, multiple documents, over-compressed image, poor exposure) alongside the spoof reasons listed above.
**Where results appear:**
* **Dashboard** — passive face liveness, passive document liveness and 3D liveness appear as separate checks, each with a pass/fail and a score out of 100.
* **Webhooks** — `suspicionReasons`, `fraudTags`, `documentValidity` / `manualDocument` (`DOC_SPOOF_DETECTED`), and `faceMatchResult` (`FACE_UNCERTAIN`, `FAKE_FACE`). Face authentication sessions additionally return `fail_reason` and `risk_tags`.
Blur and glare are handled by a **separate image quality check**, not by liveness. A capture can be rejected for quality without ever reaching the liveness models.
***
## Why Verification Might Be Rejected
Liveness detection is probabilistic. Genuine users are occasionally rejected, and the following factors make that more likely.
**Environmental factors:**
* **Lighting** — strong backlighting (silhouette effect) or heavy shadows obscure the facial detail the models rely on.
* **Image quality** — blur, poor focus, or camera movement.
* **Positioning** — extreme angles, or holding the device far enough away that the face occupies too few pixels.
**Device and camera settings:**
* **Beauty mode and skin-smoothing filters** — enabled by default on many phones. They strip natural skin texture, which pushes a genuine face toward a spoof score. Advise users to disable them.
* **Camera quality** — older, low-resolution cameras may not capture enough detail.
* **Virtualised or screen-sharing environments** — capture through remote desktop, screen sharing, or a virtual camera driver is flagged as untrusted and may be tagged or rejected regardless of image quality.
**Tuning:** if false rejections are too frequent for your user base, lower the liveness threshold or relax the document pipeline strictness before disabling the check outright.
# New Verification via Dashboard
Source: https://documentation.idenfy.com/guides/dashboard/kyc/new-verification-via-dashboard
Create a new identity verification session directly from the iDenfy dashboard without an integrated solution using step-by-step guide.
## How to Create a New Identity Verification Session
Verifying your potential clients is easy even if you do not have an integrated solution. To create a new identity verification session, you must have access to the dashboard and follow the flow below.
Once you are logged in, follow the steps below to create a successful user token:
Once you create the verification session, you receive a message indicating its validity and the session time.
After your user clicks the link, they are taken to the identity verification page and follow the flow:
## Link Expiry and Session Validity Time
**Link expiry time:** Once you create the verification session, the link is valid for the duration you configure.
This can be anywhere from **1 hour to 30 days**.
The generated session message includes the expiration time for the identity verification link.
**Session time:** The **countdown starts** when your user opens the link and lasts until they complete the verification. The countdown itself only becomes visible to the user once the session is close to expiring — see [Session Timer](/guides/dashboard/settings/user-interface-sdk#session-timer).
Session time can range **from 5 to 60 minutes** to ensure optimal security.
Once the session expires, the token also becomes **invalid**.
If the user closes and reopens the link before the session time ends, they can restart and complete the ID verification until finished or until the session expires.
## Send a Verification Link Using an Email
The identity verification link can be sent directly from our system via email. To do so, you must search for an email section and click the button on the right:
Once the option is enabled, additional fields appear. Fill in the recipient’s email, add an email subject, and CC up to 8 recipients. Select an existing email template or write custom email text. Be sure to include `{{session_url}}` by clicking **Add verification link**. Without the session URL, the recipient will not receive a link.
Once all the information you need is selected and the email is filled, click **Create**.
As soon as you create the request, the recipient receives an email asking them to verify their identity.
# Proof of Address Verification
Source: https://documentation.idenfy.com/guides/dashboard/kyc/proof-of-address-poa-verification
Configure proof of address verification for utility bills, bank statements, and other supporting documents with data extraction in iDenfy.
The Proof of Address Verification (also known as Utility Bill Verification) feature extracts data from the uploaded document. It then compares it with the address and full name provided by the partner, if applicable.
Proof of address documents are processed automatically in every upload scenario and never enter manual review. If the document cannot be read, the system retries and then raises a mismatch tag on the verification instead of creating a review task.
### How to Verify Proof of Address?
1. Go to **POA Verifications** menu item.
2. Click **Verify POA** on the top right of the page.
3. Provide the address and full name of the proof of address owner if you want the system to compare (optional).
4. Upload proof of address document.
### What Information Does the System Extract from the Uploaded Document?
1. Full name of the POA owner.
2. Full address that belongs to POA owner.
3. Issue date of the POA.
4. Type of POA (e.g. Bank statement, electricity bill, etc).
5. Provides information on whether the POA has a logo.
### What Information Does the System Compare and Provide?
1. If the full name was provided on the request, the system compares it against the name from the document.
2. If the address was provided in the request, the system compares it against the address from the document.
3. The system provides if the POA date is valid or not. The valid POA must be issued no later than 3 months.
# Resolving False Positives and Mismatch Tags
Source: https://documentation.idenfy.com/guides/dashboard/kyc/resolving-false-positives-removing-mismatch-tags
Manually resolve false positive verification alerts by removing specific mismatch tags that triggered suspected or denied status in iDenfy.
Sometimes, the system may flag a verification as **Suspected** or **Denied** due to specific data tags. These tags appear when the information extracted from the document does not strictly match the data provided by your system (via API/Token) or your configuration rules.
You can manually resolve these issues instantly by removing the specific **Mismatch Tag** that triggered the alert.
For examples of which tags produce a Suspected result, see [Suspected Status](/kyc/suspected-status). For why iDenfy leaves the decision to you, see [Status Handling](/guides/dashboard/kyc/status-handling#idenfy-does-not-evaluate-suspected).
## The Solution: Removing Tags
If you review a verification and determine that the discrepancy is acceptable, you can remove the mismatch tag to validate the session.
### How to Remove a Mismatch Tag
1. **Open Verification:** Navigate to the specific verification profile in your dashboard.
2. **Locate Tags:** Look for the **Mismatch tags** section (located in the "Partner information" under "User data" card).
3. **Click 'X':** Find the specific tag you wish to clear (e.g., NAME or OVER\_AGE ) and click the **'X'** icon next to it.
4. **Confirm Action:** A pop-up window will appear asking: *"Are you sure you want to remove \[TAG\_NAME] mismatch tag?"* Click **Confirm** to proceed.
5. **(Optional) Send Webhook Notification:** If you have a webhook integration set up, you can manually trigger a status notification after removing the tag. Click the **More** button in the top right corner of the verification profile, then select **Send Notifications**.
**Important:** Removing a tag is a **permanent action** for the current session. Once removed, the tag **will not reappear** or be re-triggered automatically, even if you refresh the page.
| | |
| --------------------------------------- | --------------------------------------- |
|
|
|
> **Automatic Status Update:** Once you remove the tag, the system automatically re-evaluates the verification status.
>
> * If the tag was the only reason for rejection, the status will automatically change from **Suspected/Denied** to **Approved**.
> * You **do not** need to click the "Approve" button manually after removing the tag.
***
## False Positive Vs. Policy Override
It is important to distinguish between fixing a system error and making a conscious exception. Removing a tag works for both scenarios.
### 1. False Positive (System Error)
* **Scenario:** The user is named "John", but the automated system read "Jon" and applied a `NAME` mismatch tag.
* **Action:** You remove the tag to **correct the mistake**.
### 2. Policy Override (Exception)
* **Scenario:** You have set a minimum age of 18 in your configuration. A 17-year-old user applies, and the system correctly flags them with an `UNDER_AGE` tag.
* **Action:** If you decide to make a business exception for this specific user, you can remove the `UNDER_AGE` tag to **bypass the rule**.
* *Result:* The system will treat the user as compliant and change the status to **Approved**, effectively overriding your age policy for this one session.
***
For a complete list of **all mismatch & fraud tags** and their detailed definitions, please refer to [**Verification Statuses**](/guides/dashboard/kyc/verification-statuses)
# Soft ID Verification
Source: https://documentation.idenfy.com/guides/dashboard/kyc/soft-id-verification
Use Soft ID Verification (eIDV) in iDenfy to cross-check customer data against official databases in the USA and UK without documents.
**Soft ID Verification (a.k.a. Soft KYC, eIDV, 2x2 verification)** is a feature that enables cross-checking data against official sources. The feature functionality is simple and straightforward: all you need to do is provide the individual’s details and retrieve the results to see if they match.
Soft ID Verification is currently available exclusively in the USA & UK only.
## Match Rates
The retrieved results are based on each value, and there are no overall results (e.g., name, surname, DOB - match, address, middle name partial match, not matches, etc.). Here are the possible results:
* **Match -** More than 85% Match.
* **Partial Match -** Less than 85% but greater than 50%.
* **No Match -** Less than 50%.
* **Invalid -** invalid format information provided
* **No Input -** The requested input is blank data
* **No Data -** No Match data was obtained from the source.
## Supported Data Sources
We currently support 2 major databases in the USA & the UK. The database has mandatory and optional fields listed below.
You cannot perform a Soft ID Verification if the mandatory fields are not filled. Furthermore, the accuracy increases with the number of fields filled.
### Credit and US Identity Graph
## Results
# Status Handling
Source: https://documentation.idenfy.com/guides/dashboard/kyc/status-handling
What each iDenfy verification status means and what to do about it, whether you check it via webhook/API or review it in the dashboard.
Every verification resolves to an overall status. If you have an integration, it's delivered via [webhook](/kyc/webhooks) or fetched via [Data Retrieval](/kyc/data-retrieval); if you work from the dashboard only, it's the status shown on the verification profile. This page is about what to do once you have that status. For what each status and tag value means, see [Verification Statuses](/guides/dashboard/kyc/verification-statuses).
## Wait for a Final Result
A status can be preliminary before it settles. Only act on it once it's final:
Open the verification profile and check **Final result** under the Partner Information card. While a human reviewer is still working the case, it shows as **Reviewing** — wait until it changes.
* From the API, check the top-level `final` boolean.
* From a webhook, `final: true` means no further review will follow; `final: false` means an `IDENTIFICATION_MANUAL_FINISHED` webhook is still coming.
See [Webhook Events and Timing](/kyc/webhooks#webhook-events-and-timing) for exactly which events carry which `final` value and when they fire.
## What to Do with Each Status
| Status | Your action |
| ------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Approved** | Onboard the user. |
| **Denied** | Reject, or have the user start a new verification session to retry. A tag-driven denial may be clearable from the dashboard instead — see [Resolving a Suspected or Denied Result](#resolving-a-suspected-or-denied-result) below. [Request Update](/kyc/request-update) does not apply to Denied — see that section for why. |
| **Suspected** | Not a failure — see [Suspected Status](/kyc/suspected-status) for why this happens, and [Handling Suspected](#handling-suspected) below for how to evaluate it. |
| **Reviewing** | Wait. A human reviewer is still working the case; no action needed until a final status arrives. |
| **Expired** / **Active** | The verification was never completed. Generate a new session if the user still needs to verify. |
| **Deleted** / **Expired-Deleted** / **Archived** | Verification data is no longer available — treat as out of scope for further checks. |
## Handling Suspected
**Suspected** means the checks may have already passed, but the system found something worth a second look. Before treating it as a rejection, check whether the document and face themselves came back clean — if so, only the tags below are actually in question.
Open the verification profile and check **Final result details** under the Partner Information card. If the document and face results both come back clean, the underlying checks succeeded and only the tags below caused the flag.
Check `manualDocument` and `manualFace` — if they read `DOC_VALIDATED` and `FACE_MATCH`, the underlying document and face checks succeeded and only the flags below are in question.
Inspect these to understand why:
| What | Why it's there |
| --------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Fraud tags | Fraud indicators detected — e.g. an AML/watchlist hit or a duplicate face. Shown as **Fraud tags** in the dashboard, or the `fraudTags` field via the API. |
| Mismatch tags | Data submitted at session creation that doesn't match the document — e.g. name or date of birth. Shown as **Mismatch tags** in the dashboard, or the `mismatchTags` field via the API. |
| Document result | The automated, and (if reviewed) manual, document validation result. Part of **Final result details** in the dashboard, or the `autoDocument` / `manualDocument` fields via the API. |
| Face result | The automated, and (if reviewed) manual, face-match result. Part of **Final result details** in the dashboard, or the `autoFace` / `manualFace` fields via the API. |
For the full list of every possible value, see [Verification Statuses](/guides/dashboard/kyc/verification-statuses) — Face Status, Document Status, Fraud Tag, and Mismatch Tag values.
iDenfy surfaces these tags but does not decide whether they're disqualifying — that's your call. See [Suspected Status](/kyc/suspected-status) for worked examples of how tags produce a Suspected result.
## Resolving a Suspected or Denied Result
* **From the dashboard** — a reviewer can clear the specific tag that caused the flag. See [Resolving False Positives and Mismatch Tags](/guides/dashboard/kyc/resolving-false-positives-removing-mismatch-tags). Removing the tag automatically re-evaluates the status; if it was the only reason for the flag, the status updates to Approved without any further action. This works for both Suspected and Denied.
* **From your integration** — [Request Update](/kyc/request-update) reactivates the token, but only for three specific cases: uploading a POA document, completing a Risk Assessment, or answering a Questionnaire. None of those three can produce a Denied result, so Request Update only ever applies to a Suspected case caused by one of them — never to Denied, and never to resubmitting the primary ID document or selfie. For anything outside that scope, resolve it from the dashboard, or have the user start an entirely new verification session.
## iDenfy Does Not Evaluate Suspected
For Approved and Denied, iDenfy's automated and manual review pipeline commits to a decision on your behalf. Suspected is different by design: iDenfy detects and reports the signal — the specific tag — but does not judge whether that signal disqualifies the user. Whether a name mismatch, an age flag, an AML hit, or a duplicate face should block someone depends on your risk appetite, your jurisdiction, and your product. Those are business decisions only you can make, so iDenfy leaves the result open rather than guessing on your behalf.
## Build Your Own Evaluation Procedure
Because iDenfy won't resolve Suspected for you, treat evaluating it as a required part of your process, not an edge case you'll handle manually the first time it comes up:
1. **Read every tag your configuration can produce** — [Fraud Tags](/guides/dashboard/kyc/verification-statuses#fraud-tags) and [Mismatch Tags](/guides/dashboard/kyc/verification-statuses#mismatch-tags) — and decide, per tag, whether it should auto-approve, auto-deny, or route to manual review.
2. **Write that decision down as an internal procedure** that your team (support, compliance, risk) actually follows, rather than leaving it to ad hoc judgment calls each time a case comes up.
3. **Decide who is authorized to override a Suspected result, and how** — see [Resolving a Suspected or Denied Result](#resolving-a-suspected-or-denied-result) above for the available mechanisms.
4. **Log the decision against the verification's Scan ref** for audit purposes, especially whenever a fraud tag is overridden.
You can work through step 1 before writing any of it into your own code. The playground below lets you map every fraud and mismatch tag to approve, retry, manual review, or block — and then shows the wording each of those choices puts in front of the user.
Configure a verification, then watch the statuses and tags it produces, the webhook your server receives, and what each tag costs the user. A presentation, not a live account — nothing here calls iDenfy. Opens in a new tab.
Treating every Suspected result as an automatic denial rejects legitimate users over cosmetic or explainable mismatches. Treating every Suspected result as an automatic approval defeats the purpose of the checks. Build the procedure — don't skip it.
# Verification Details
Source: https://documentation.idenfy.com/guides/dashboard/kyc/verification-details
View and interpret identity verification results including document data, provided data, photos, and compliance details in the dashboard.
***
### End-User Data
* **Document data** - information read from the document
* **Provided data** - information you provided for cross-matching
* **Original** - information provided in the native language, additional fields read from the document
***
### Actions for Verification
| | Add user to the blocklist |
| - | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| | Copy verification identifier - scanRef and client ID |
| | Resends notification (Webhook, email) |
| | Generates a verification PDF file |
| | Contact support if you have questions about verification status or results |
| | More action - Duplicates will show associated verifications if duplicates are found. |
| | More actions - allows to delete verifications, depending on features, may have more options. Verification deletion is permanent and irreversible. Only members with the Admin role can delete verifications |
***
### Document Information
Here you can find data read from the document.
Depending on your needs, these fields can be adjusted.
***
### Partner Information
#### Status
* **Final result** - final status of verification
* **Final result details** - results of document and face reading
* **State** - if notification is sent
For all **statuses** and **tags,** see page [**KYC verification statuses**](/guides/dashboard/kyc/verification-statuses)
#### Other Verification-Related Information
* **Token type** - identifies if verification was document & face, or document only
* **Review type** - auto or manual
* **Partner** - environment, in which verification was performed
* **Scan ref** - identifier generated by iDenfy
* **Client ID** - identifier generated by Partner
* **Company ID** - identifier for the company, if verification is part of KYB
* **Platform** - device, on which verification was performed
* **Client IP** - IP from which the client performed verification
* **Client location** - approximate city and country from which the client performed verification
* **Risk level** - status based on risk assessment feature
* **Start time** - time when the review process started
* **Finish time** - time when the review processing finished
* **Additional step (POA) reupload date** - date when the additional step was reuploaded. Refreshes after each re-upload
* **Attempt Count** - how many attempts the user took to upload all the correct documents
* **Email address** - shows the user’s email, if email verification is used
* **Phone number** - shows the user’s phone, if phone verification is used
***
### Photos
Uploaded image section
In case of re-uploads, all previously uploaded (low quality, blurry, expired) documents will be shown on the right side, numbered by attempts.
***
### Bank Card Verification
If the user completed both IDV and [Bank Card Verification](/guides/dashboard/features/bank-card-verification), a **Bank Card Verification** panel is shown with:
* **Status** - Match or No Match
* **Submitted** - date and time the bank card verification was submitted
* **Check ID** - link to the Bank Card Verification detail page
* **Cardholder** - name read from the card
* **Card Number** - first 6 and last 4 digits of the card
* **Expected Card Number** - last 4 digits provided by the partner, if any were provided. This field is not shown if no expected card number was set.
A further Bank Card Verification can be requested from this panel using [Request Update](/guides/dashboard/general/request-update).
***
**Checks performed**
The section indicates what checks have been performed during verification.
Some checks **will not be performed** if verification has failed:
* AML check
* Criminal background
* Registry centers
* Lid
* USA driver's license
# Verification Statuses
Source: https://documentation.idenfy.com/guides/dashboard/kyc/verification-statuses
Understand iDenfy verification statuses including approved, denied, suspected, reviewing, and expired and how each affects your workflow.
This page defines every value a verification can return. If you'd rather see where a value comes from than read it in a table, the playground below puts each one back in context — configure a verification and watch which status, document and face results, and tags it returns.
Configure a verification, then watch the statuses and tags it produces, the webhook your server receives, and what each tag costs the user. A presentation, not a live account — nothing here calls iDenfy. Opens in a new tab.
## Overall Status
| Status | Meaning |
| ------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **APPROVED** | Automated and manual checks were successful. Check `autoFace`, `manualFace`, `autoDocument`, `manualDocument` for details. Typical success: `FACE_MATCH` + `DOC_VALIDATED`. |
| **DENIED** | Verification failed. Check detailed statuses for the reason (e.g., `FACE_MISMATCH`, `DOC_NOT_FOUND`). |
| **SUSPECTED** | Checks may have passed, but discrepancies were found — flagged with `fraudTags` or `mismatchTags`. You decide whether to approve or deny. |
| **REVIEWING** | A human reviewer is currently checking the verification. Contact support to toggle this feature. |
| **EXPIRED** | The verification token was never used and has expired. |
| **ACTIVE** | The token has been created but not yet used. |
| **EXPIRED-DELETED** | Token expired and data was deleted. |
| **DELETED** | Verification data has been deleted. |
| **ARCHIVED** | Verification data was archived. |
`APPROVED` and `DENIED` are explained by the detailed statuses on the `autoFace`, `manualFace`, `autoDocument`, and `manualDocument` fields below, and `SUSPECTED` by the `fraudTags`/`mismatchTags` below. For what to do with each status in your integration, see [Status Handling](/guides/dashboard/kyc/status-handling).
***
## Common Values
| Value | Description |
| ---------- | ------------------------------------------------------------ |
| `clientId` | A unique string identifying a client on your side. |
| `scanRef` | A unique string identifying a verification on iDenfy's side. |
***
## Face Status Values
| Status | Description |
| ------------------- | -------------------------------------------------------------------------------------------- |
| `FACE_MATCH` | Selfie face matches the document photo. Person and document owner are the same. |
| `FACE_MISMATCH` | Face could not be matched — features not fully visible, low quality, blur, shadow, or glare. |
| `NO_FACE_FOUND` | Face cannot be accurately determined in the selfie. |
| `TOO_MANY_FACES` | More than one face visible in the selfie. |
| `FACE_TOO_BLURRY` | Selfie too blurry for face matching. |
| `FACE_ERROR` | Unclassified error during face matching. |
| `FACE_NOT_ANALYSED` | Verification denied for another reason — face analysis skipped. |
| `FACE_NOT_CHECKED` | Selfie was not compared to the document face. |
| `FAKE_FACE` | Photo not taken in real time, virtual camera detected, or face is fake. |
| `FACE_GLARED` | Glare detected in selfie photo. |
| `FACE_UNCERTAIN` | Face liveness cannot be determined — poor lighting, potential fake, or obstructions. |
`FACE_MISMATCH` and `NO_FACE_FOUND` are only reported after a second matching algorithm has been tried — see [Second-Opinion Check on a Mismatch](/guides/dashboard/kyc/face-matching#second-opinion-check-on-a-mismatch).
***
## Document Status Values
| Status | Description |
| --------------------------- | ----------------------------------------------------------------------------- |
| `DOC_VALIDATED` | Document is valid — all data visible, readable, and genuine. |
| `DOC_NOT_FOUND` | No document found in the photo. |
| `DOC_NOT_FULLY_VISIBLE` | Document or data not fully visible — blur, shadow, glare, fingers, or damage. |
| `DOC_NOT_SUPPORTED` | Document type not supported for selected country or session. |
| `DOC_FACE_NOT_FOUND` | Face could not be located on the document. |
| `DOC_NAME_ERROR` | Name field could not be found or parsed. |
| `DOC_SURNAME_ERROR` | Surname field could not be found or parsed. |
| `DOC_EXPIRY_ERROR` | Expiry date field could not be found or parsed. |
| `DOC_DOB_ERROR` | Date of birth field could not be found or parsed. |
| `DOC_PERSONAL_NUMBER_ERROR` | Personal code could not be found or parsed. |
| `DOC_NUMBER_ERROR` | Document number could not be found or parsed. |
| `DOC_DATE_OF_ISSUE_ERROR` | Date of issue field could not be found or parsed. |
| `DOC_SEX_ERROR` | Sex field could not be found or parsed. |
| `DOC_NATIONALITY_ERROR` | Nationality field could not be found or parsed. |
| `DOC_GLARED` | Document glared — data parsing cannot be performed. |
| `DOC_FACE_GLARED` | Document face area is glared. |
| `DOC_TOO_BLURRY` | Document too blurry for parsing. |
| `DOC_NOT_ALLOWED` | Document readable but type not allowed in your settings. |
| `DOC_EXPIRED` | Document has expired. |
| `DOC_ERROR` | Unclassified error during document analysis. |
| `DOC_NOT_ANALYSED` | Verification denied for another reason — document analysis skipped. |
| `DOC_DAMAGED` | Document is physically damaged (cracked, broken). |
| `DOC_FAKE` | Document detected as not genuine (virtual camera, photo of screen). |
| `DOC_SPOOF_DETECTED` | Document detected as not real. |
| `DOC_SIDE_MISMATCH` | Document side different than expected. |
| `DOC_TYPE_MISMATCH` | Selected document type doesn't match the shown document. |
| `DOC_PERSONAL_CODE_INVALID` | Personal code could not be verified. |
| `DOC_INFO_MISMATCH` | Information provided doesn't match the document. |
| `AUTO_UNVERIFIABLE` | Cannot be automatically verified — needs human review. |
| `COUNTRY_NOT_SUPPORTED` | Document country not supported. |
| `COUNTRY_MISMATCH` | Selected country and document issuing country don't match. |
| `NFC_FAILED` | NFC read/authentication failed. |
| `NFC_TIMEOUT` | Client didn't finish NFC read in time. |
| `EID_FAILED` | E-ID (electronic ID) capture was not taken successfully. |
***
## MRZ and Barcode Statuses
| Status | Description |
| ----------------------- | ------------------------------------------------------------ |
| `MRZ_NOT_FOUND` | Machine Readable Zone could not be located. |
| `MRZ_OCR_READING_ERROR` | Failed to read/parse MRZ — possible check-digit discrepancy. |
| `MRZ_INVALID` | MRZ is invalid and cannot be verified. |
| `BARCODE_NOT_FOUND` | Document barcode could not be located. |
***
## Fraud Tags
| Tag | Description |
| ------------------------------ | --------------------------------------------------------------------------------- |
| `AML_SUSPECTION` | Client found in PEPs or Sanctions list (AML enabled). |
| `AML_FAILED` | AML check failed (AML enabled). |
| `LID_SUSPECTION` | Document found in lost/stolen documents database (LID enabled). |
| `LID_FAILED` | LID check failed. |
| `CRIMINAL_SUSPECTED` | Criminal check found a hit that needs to be reviewed. |
| `CRIMINAL_CHECK_FAILED` | Criminal check was not initiated successfully and needs to be initiated manually. |
| `DL_FAILED` | The DMV database is currently unavailable, try again later. |
| `RC_FAILED` | Failed to check registry center (RC) data. |
| `FAKE_PHOTO` | General identifier for a fake photo. |
| `VIRTUAL_CAMERA` | Virtual camera likely detected. |
| `DEV_TOOLS_OPENED` | Client opened browser dev-tools during verification. |
| `DUPLICATE_FACE` | Selfie matched with a previous verification. |
| `DUPLICATE_DOC_FACE` | Document face matched with a previous verification. |
| `DUPLICATE_PERSONAL_DATA` | Document data matched with a previous verification. |
| `FACE_IN_BLACKLIST` | Face photo added to blacklist. |
| `DOC_FACE_IN_BLACKLIST` | Document face added to blacklist. |
| `DOC_FACE_BLACKLISTED` | Document face matched an existing blacklist entry. |
| `FACE_SUSPECTED` | Automatic algorithms suspect the selfie is not genuine. |
| `FACE_BLACKLISTED` | Selfie matched an existing blacklist entry. |
| `DATA_BLACKLISTED` | Data matched against an existing blacklist entry. |
| `DATA_IN_BLACKLIST` | Verification data used to create a blacklist entry. |
| `PORTRAIT_SUBSTITUTION` | Document photo may have been replaced/substituted. |
| `DOCUMENT_TOO_CLOSE_TO_BORDER` | Document image too close to frame border for liveness validation. |
| `DOC_MOBILE_PHOTO` | Document shown from a mobile screen. |
| `DOC_PRINT_SPOOFED` | Document appears to be printed on paper. |
***
## Mismatch Tags
These appear when data provided during session creation doesn't match document data:
| Tag | Description |
| ------------------------------- | --------------------------------------------------------- |
| `NAME` | Client name doesn't match document. |
| `SURNAME` | Client surname doesn't match document. |
| `FULL_NAME` | Full name doesn't match document. |
| `DOCUMENT_NUMBER` | Document number doesn't match. |
| `PERSONAL_CODE` | Personal code doesn't match. |
| `EXPIRY_DATE` | Expiry date doesn't match. |
| `DATE_OF_BIRTH` | Date of birth doesn't match. |
| `DATE_OF_ISSUE` | Date of issue doesn't match. |
| `NATIONALITY` | Nationality provided doesn't match document. |
| `SEX` | Sex provided doesn't match document. |
| `DOC_INFO_MISMATCH` | Information provided doesn't match the document. |
| `UNDER_AGE` | Client age below the configured minimum age limit. |
| `OVER_AGE` | Client age above the configured maximum age limit. |
| `UNKNOWN_AGE` | Age could not be read and an age limit is configured. |
| `UTILITY_ADDRESS` | Address on utility bill doesn't match provided address. |
| `UTILITY_NAME` | Name on utility bill doesn't match provided name. |
| `EXPIRED_UTILITY_BILL` | Utility bill has expired. |
| `REGISTRY_CENTER_INFO_MISMATCH` | Registry center data doesn't match provided information. |
| `DRIVER_LICENSE_INFO_MISMATCH` | Driver's license data doesn't match provided information. |
Don't see a `fraudTags` or `mismatchTags` value explaining a `SUSPECTED` result? [Contact support via our ticketing portal](https://idenfy-ivs.atlassian.net/servicedesk/customer/portal/1).
***
## Additional Step Statuses
| Status | Description |
| -------------------------------------- | ---------------------------------------------------------------- |
| `INVALID_ADDITIONAL_STEP` | Additional step document was invalid. |
| `ADDITIONAL_STEP_NOT_FOUND` | Additional step was not found. |
| `ADDITIONAL_STEP_INFORMATION_MISMATCH` | Additional step data doesn't match the document. |
| `EXPIRED_ADDITIONAL_STEP_INFORMATION` | The provided additional document has expired. |
| `ADDRESS_UNVERIFIED` | Address verification not performed or address not matched/found. |
| `NOT_SUPPORTED_POA_DOCUMENT_TYPE` | Proof of address document type not supported. |
| `NOT_SUPPORTED_POA_DOCUMENT_COUNTRY` | Proof of address document country not supported. |
| `POA_COUNTRIES_MISMATCH` | Proof of address country doesn't match the expected country. |
| `POA_SCREENSHOT_DETECTED` | Proof of address document appears to be a screenshot. |
# Verification via Magic Link
Source: https://documentation.idenfy.com/guides/dashboard/kyc/verification-via-magic-link
Create and share single-use or multi-use identity verification links via email or SMS to onboard users in iDenfy without integration.
## What Is a Magic Link?
A Magic Link is a URL that allows users to start identity verification immediately — no login or account required. Share the link via email, SMS, or embed it on your site.
***
## Key Features
| Feature | Description |
| -------------- | ------------------------------------------------------------------------------- |
| **Single-use** | Link becomes invalid after one verification. Ideal for individual invites. |
| **Multi-use** | Link stays active for a set number of uses (e.g., 100). Best for campaigns. |
| **Unlimited** | Link stays active until manually deactivated or it reaches its expiration date. |
| **Expiration** | Optional — automatically disables the link after a specific date and time. |
**Usage logic:**
* Every click reduces the link's limit, even if the user quits early. You are only billed for completed verifications.
* Links cannot be extended or refreshed. Once expired or at limit, create a new one.
***
## Sharing and Use Cases
Once generated, the Magic Link URL is ready for distribution:
* **Direct messaging** — Send via email or SMS for personal invites.
* **Website integration** — Embed behind a "Verify Now" button on your site.
* **QR codes** — Convert the URL to a QR code for in-person verification.
***
## The User Experience
When a user clicks the Magic Link:
1. **Validation** — System checks the link is active, not expired, and your account has credits.
2. **Redirection** — The system creates a new verification session and your user enters the verification flow.
3. **Completion** — User uploads documents and selfie without needing passwords or accounts.
***
## How to Create a Magic Link
Log in to your dashboard. From the left menu, go to **ID Verification → Settings → Magic Link**.
Click **Create New Magic Link** to start configuration.
* **Name** — Internal identifier for this link.
* **Verification Flow** — Select steps (document verification, selfie, or both).
* **Usage Limit** — Single-use, multi-use, or unlimited.
* **Expiration** — (Optional) Set a date/time for the link to stop working.
* **Language** — Pre-select the interface language.
* **Custom theme** — (Optional) Enable the toggle and select a branding theme to apply to sessions started from this link. If not set, the Default theme is used. See [Branding (KYC)](/guides/dashboard/settings/kyc-branding).
Click **Save** to create the link. Copy and share it.
***
## Automation and Results
### Viewing Results
Outcomes are updated in real-time. View the status and details of every session in your iDenfy Dashboard.
### Webhooks
For automated workflows, Magic Links can be paired with webhooks. When a user completes verification via a link, results are automatically pushed to your backend.
To enable this:
1. [Create your API key](/guides/dashboard/settings/api-keys)
2. [Set up webhooks](/guides/dashboard/settings/system-notifications-webhooks-emails)
***
# Video Sequencing
Source: https://documentation.idenfy.com/guides/dashboard/kyc/video-sequencing
Capture short video sequences at 6 frames per second during iDenfy verification for additional document and face analysis insights.
Video sequencing captures a short clip at 6 frames per second during the face capture step, providing additional insight beyond a single static image — useful for liveness analysis and fraud review.
Video sequencing is only available when **passive liveness** is enabled. [Active 3D liveness](/guides/dashboard/kyc/liveness-checks) uses a guided move-closer capture and does not produce a video sequence.
## Accessing the Video
**Dashboard** — The video sequence is available directly on the [Verification Details](/guides/dashboard/kyc/verification-details) page for each completed verification.
**API** — Video sequence retrieval via API is supported. Contact [support](mailto:support@idenfy.com) to enable API access to video sequences.
# Blocklist Setup
Source: https://documentation.idenfy.com/guides/dashboard/risk/blocklist-setup
Set up face, document, and personal data blocklists in iDenfy to automatically flag or block known fraudsters during verification.
## Blocklist Overview
The **Blocklist** helps prevent known fraudulent or repeat individuals from completing identity verification. The check runs automatically once a verification is **approved**, comparing new data (face, document, or personal info) against existing blocklist entries. If a match is found, the verification is marked **“suspected”** and flagged with one of the following tags:
* `Face_Blacklisted` — selfie image matched
* `Doc_Face_Blacklisted` — face from document matched
* `Data_Blacklisted` — personal details matched
The face blocklist runs as a 1:N comparison against biometric templates stored for your account. Enabling it is one of the cases where those templates are retained — see [Face Matching and Biometric Data](/guides/dashboard/kyc/face-matching).
***
## Interface Notes
* Access via sidebar: **Menu → Blocklist**
* Tabs:
* *Selfie*
* 🪪 *Face in Document*
* *Document Data*
* Use the search bar to find existing records by **ScanRef** or enable **Search all records**.
* Use the **Create new** button to open the blocklist creation form.
* Required fields are marked — incomplete entries cannot be submitted.
**Operational tips**
* Use **ScanRef** when you already have a completed verification — this ensures accurate data/face extraction and saves time.
* For **Document data**, adding a **Personal number** and **Nationality** significantly improves matching accuracy.
* Keep **Reason** short but specific (e.g., “Chargeback fraud, 2025-10-21; internal case #1234”).
***
## Face Blocklist (Selfie / Face in Document)
Use when you want to block by **image**.
#### Fields in “Create New → Face”
| Field | Values / Format | Required | Notes |
| ---------------- | --------------------------- | --------------------- | -------------------------------------------------------------------------------------------- |
| **Ban by** | `Photo` or `ScanRef` | | Select **Photo** to upload; select **ScanRef** to pull images from an existing verification. |
| **Ban type** | `Selfie` or `Document Face` | | Select which face source to block. |
| **Upload photo** | PNG, JPG, HEIF | if **Ban by = Photo** | Drag & drop or click to upload. |
| **Reason** | Free text | Optional | Internal note/context. |
#### How It Works
* If **Ban by = Photo** → you must upload a file.
* If **Ban by = ScanRef** → the system uses the face(s) from that verification.
* On future approved verifications, the system compares faces and flags with `Face_Blacklisted` or `Doc_Face_Blacklisted`.
***
## Document Data Blocklist (Personal Information)
Use when you want to block by **identity details** (no image required).
#### Fields in “Create New → Document Data”
| Field | Values / Format | Required | Notes |
| ------------------- | --------------------------------------------------- | -------- | -------------------------------------------------------- |
| **Ban by** | `Data` *(or* `ScanRef`*, if enabled in your setup)* | | With `ScanRef`, fields auto-fill from that verification. |
| **Full name** | Text | | Person’s full legal name. |
| **Date of birth** | Date | | Date picker; must be a valid date. |
| **Personal number** | Text | Optional | National ID / personal code (improves match accuracy). |
| **Nationality** | Country select | Optional | ISO country selection (improves match accuracy). |
| **Document number** | Text | Optional | Adds another strong identifier. |
| **Reason** | Free text | Optional | Internal note / context. |
#### How It Works
* If details match on a future approved verification, it’s flagged with `Data_Blacklisted`.
* If created via **ScanRef**, the system pre-fills name, DOB, personal number, and nationality (when available).
***
## Validation and Behavior
* **Required fields** are enforced (you’ll see “Please fill in all required fields.” if missing).
* **Files**: Accepts **PNG / JPG / HEIF**.
* **Dates**: Must be valid (DOB uses a date picker).
* **Submission**: **Create** is disabled until the required fields are completed.
***
## Directly from a Verification
On any verification results page, click [**Add verification to a blocklist**](/guides/dashboard/kyc/verification-details) (top-right corner).
This opens a quick-action modal allowing you to add that verification immediately.
#### Fields
| Field | Description / Options |
| ---------------- | -------------------------------------------------------------------------------------------- |
| **Block reason** | Select the reason: |
| **Block by** | Select which data to block — *Face, Document, Personal data*, depending on verification type |
#### Block Reason Options
* Fake document
* Same person, multiple identities
* Deepfake / AI-generated face
* Fraudulent behavior during onboarding
* Blocklist by internal risk rules
* Confirmed criminal activity
* Other
Once submitted, the system stores that verification’s data (face/document/personal info) in the internal blocklist for future matching.
# Custom Rule Blocklist
Source: https://documentation.idenfy.com/guides/dashboard/risk/custom-rule-blocklist
Create blocklist rules to automatically flag or deny specific companies and applicants during iDenfy KYB automated verification flows.
The **Blocklist** feature allows you to automatically mark or deny specific companies or applicants during KYB automation flows.
Each entry defines *what to match* and *what to do when a match occurs.*
***
## Step 1: Navigate to Blocklist
1. Go to **Custom Rules → Blocklist** tab. You’ll find it next to the *Automations* tab under **Configuration → Custom Rules.**
2. Here you can:
* View existing blocklist entries.
* Import or export lists for backup or migration.
* Click **“Create Blocklist”** to add a new rule.
***
## Step 2: Create a New Blocklist Entry
Each blocklist entry consists of:
* A **title** (for identification),
* One or more **data fields** used for matching,
* And an **action** to perform when a match is found.
### Title
Give your blocklist entry a **unique, descriptive name** — for example:
> `Suspicious Lithuanian Companies` or `Fraudulent Payment Domains`.
This title will help differentiate your blocklist rules later.
***
## Step 3: Define Matching Fields
In the **Blocklist Values** section, you can specify details across several categories:
**Company**, **Applicant**, **UBO**, **Representative**, and **Timezone**.
Each field is optional, but at least one must be filled.
***
### Company Information
| Field | Description | Example |
| ----------------------- | ----------------------------------------------------------------------------- | ---------------- |
| **Name** | Company name (exact match required). Case-insensitive and accent-insensitive. | `ABC Ltd` |
| **Registration Number** | Official registration number. Commonly used for precise matching. | `123456789` |
| **Country** | Country of registration. | `Lithuania` |
| **City** | City name. | `Vilnius` |
| **Street** | Street address or partial address. | `Gedimino pr. 1` |
| **Postcode** | Postal code. | `01103` |
| **Type** | Company type, e.g. `UAB`, `LLC`, `LTD`. | `UAB` |
| **Activity Code** | Company activity (NACE or other codes). | `6201` |
| **Status** | Company’s current legal or operational status. | `Active` |
| **Domain** | Website or email domain. | `example.com` |
***
### Applicant Information
Applies to the person submitting or representing the company.
| Field | Description | Example |
| ----------------- | ------------------------------------- | ------------------ |
| **Name** | Full name of the applicant. | `John Doe` |
| **IP Address** | Originating IP address. | `192.168.0.1` |
| **Email Address** | Email address used in the submission. | `john@example.com` |
| **Phone Number** | Contact number. | `+37060000000` |
***
### UBO (Ultimate Beneficial Owner) Information
| Field | Description | Example |
| ------------------------ | -------------------- | ------------ |
| **Country of Residence** | Where the UBO lives. | `Lithuania` |
| **Nationality** | UBO’s nationality. | `Lithuanian` |
***
### Representative Information
| Field | Description | Example |
| ------------------------ | ----------------------------------------- | --------- |
| **Country of Residence** | Country where the representative resides. | `Germany` |
| **Nationality** | Representative’s nationality. | `German` |
***
### Timezone
| Field | Description | Example |
| ------------ | ------------------------------------------------ | ---------------- |
| **Timezone** | Timezone from which the verification originated. | `Europe/Vilnius` |
***
## Step 4: Matching Logic
Matching is **strict and rule-based** to ensure accuracy.
1. **Perfect match only:**
No fuzzy or similarity scoring.
“ABCLTD” will not match “ABC LTD” unless identical after normalization.
2. **Case-insensitive and accent-insensitive:**
`A` = `a`, `ą`, `Â`, etc. (handled via database collation).
3. **Empty fields count as a match:**
If both sides (company and blocklist) leave a field blank → it counts as matching.
4. **At least one field must match** between the blocklist and the company data.
5. **Multiple blocklists:**
If a company matches one rule, later blocklists or automations won’t proceed when the action is **Block**.
#### Example
| Field | Company Value | Blocklist Value | Result |
| ------------------- | ------------- | --------------- | ------ |
| Name | `ABC` | `null` | – |
| Registration Number | `123` | `123` | Match |
| Postcode | `null` | `123` | – |
A match is triggered because *one field (registration number)* matches exactly.
Unless overridden, the action set in the blocklist will execute immediately.
***
## Step 5: Select Action
Select what happens when a match is detected:
| Action | Description |
| -------------- | ---------------------------------------------------------------------------------------------- |
| **Do Nothing** | Logs the event but takes no further action. Useful for observation or passive monitoring. |
| **Flag** | Highlights the company in the system (under *Tags*). The verification continues normally. |
| **Block** | Automatically denies the company and stops all subsequent blocklist and automation processing. |
***
## Step 6: Save and Activate
Click **Save** to finalize the rule.
The entry becomes **active immediately** — no further activation steps required.
***
## Notes and Best Practices
* Use **registration number** whenever possible for precision.
* Combine **email domain** and **country** for effective applicant-level blocking.
* Regularly review flagged entries to refine your lists.
* Use **Import/Export** for bulk updates or cross-environment synchronization.
# Custom Rules for KYB Risk Automation
Source: https://documentation.idenfy.com/guides/dashboard/risk/custom-rules
Create custom risk rules for automated verification decisions in iDenfy KYB to flag or block companies and beneficiaries by conditions.
Custom Rules are a set of automated or blocklist-based rules designed for specific companies to meet a partner’s needs. Use these rules to **flag or block** companies or their beneficiaries if defined conditions are met. After creating the rules, add them to the **Flow Templates** to take effect.
Rules can also be prioritized and optionally linked to the **"Need To Review"** or **"Need To Process"** queues, allowing for smoother case management.
***
## Custom Rule Types
Custom rules are divided into two main types:
* **Automation Rules** – Automatically perform actions (flag/block/do nothing) based on selected conditions.
* **Blocklist Rules** – Trigger actions when incoming company data matches specific predefined entries.
For a worked example that combines an automation rule with the AI reviewer, see [Custom Rules for PoA Matching](/guides/dashboard/risk/custom-rules-poa-matching).
***
## Automation Rule Setup
To create an **automation rule**, follow these steps:
1. **Navigate to Custom Rules**
Open the Custom Rules page in the dashboard.
2. **Create a Rule**
Click **"Create Rule"**, provide a **unique name** and optional **description**.
3. **Select Rule Type**
Select the automation type from the dropdown (e.g., AML Check, Adverse Media, etc.). Each type supports different criteria, which can be viewed by clicking the **“?”** icon or at the bottom of this document.
4. **Set Conditions**
Define logic for the rule based on available values per automation type (e.g., “Not Checked”, “Flags Found”, “High Risk”).
5. **Select Action**
* **Do nothing** – Use as a passive check.
* **Flag** – The company will be highlighted and tagged.
* **Block** – The system denies the company and skips all following automations.
6. **Deny Reasons (Optional)**
If the action is **Block**, you may select deny reasons from the dropdown.
7. **Select Recheck Option**
Decide when the rule should re-apply:
* **Always proceed**
* **Proceed if changed**
* **Proceed once**
8. **Save & Link to Flow**
Save the rule and add it to the desired flow template for activation.
***
You must create a **separate** rule **for each** company entry.
Blocklist matches take priority over automation. If a company matches a blocklist entry, automations will not be triggered.
***
## Automation Recheck Options
| Automation Type | Check Once | If Changed | Every Time |
| ------------------------- | ----------------- | ------------------ | ---------- |
| AML Check | | (name/country) | |
| AML Check Beneficiary | | (name/surname/DOB) | |
| Adverse Media | | (name) | |
| Adverse Media Beneficiary | | (name/surname) | |
| Shareholders Check | | (new report) | |
| Credit Bureau Report | | (name/reg no.) | |
| Credit Bureau Search | | (name/reg no.) | |
| GOV Register Search | | (name/reg no.) | |
| GOV Register Report | | (name/reg no.) | |
| IP Country Match | – | – | |
| Duplicate Email | – | – | |
| Manager Rotation | | – | |
| Proxy Check | | – | |
| Website Audit | | (change) | |
| Address Audit | | (address) | |
| Address Verification | | (address/country) | |
| Company Name Audit | | (address/name) | |
| Fraud Estimation | | – | |
| KYC Status | – | – | |
| KYC Token | (new beneficiary) | – | – |
| Domain Match | – | – | |
| Blocklist Check | | – | |
***
## Supported Automation Types (with Descriptions)
| Subject | Description | Required |
| ------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
| AML company check | This service checks company registration against the datasets such as Sanctions, PEPs, Adverse media, Profile of Interest, etc. The automation is automatically started upon company submission. | company name
country |
| AML beneficiary check | This service checks the beneficiaries (directors, representatives, and all types of shareholders) against the datasets such as Sanctions, PEPs, Adverse media, Profile of Interest, etc. The automation is automatically started upon company submission. | company name
country
beneficiaries name
(optional) surname
(optional) nationality
(optional) date of birth |
| Credit bureau lite report | This automation checks the company status in the credit bureau report (but doesn’t order it) and flags or blocks the company based on the status provided in the report. The search results are displayed in the dashboard. It works the same as the Credit Bureau Report automation, but it doesn’t add the report to the company’s profile. | company name
company registration number
country |
| Credit Bureau lite shareholder report | This automation checks the company shareholder status in the credit bureau report (but doesn’t order it) and flags or blocks the company based on the status provided in the report. The search results are displayed in the dashboard. It works the same as the Credit Bureau Report automation, but it doesn’t add the report to the company’s profile. | company name
company registration number
country |
| Credit bureau report | This automation obtains a credit bureau report for a specific company. The report indicates four possible statuses for the company: Active, Non-Active, Pending, or Other. | company name
company registration number
country |
| Credit Bureau shareholder report | This automation obtains a credit bureau report for a company type shareholder. The report indicates four possible statuses for the company: Active, Non-Active, Pending, or Other. | company name
company registration number
country |
| GOV registers lite report | This rule checks whether the GOV register information is available. This rule doesn’t automatically order the report. However, its purpose is to check if the data is available, and if not, you can choose to block or flag certain companies. The search results are displayed in the dashboard. | company name
company registration number
country
(for USA/Canada, region improves accuracy) |
| GOV registers lite shareholder report | This service is used to order GOV register reports of the company type shareholder (if available) so you can block or flag companies that have GOV register reports available. Furthermore, if the report is available, it will be shown in the company profile in PDF and JSON format. | company name
company registration number
country
(for USA/Canada, region improves accuracy) |
| GOV register report | This service is used to order GOV register reports (if available) so you can block or flag companies that have GOV register reports available. Furthermore, if the report is available, it will be shown in the company profile in PDF and JSON format. | company name
company registration number
country
(for USA/Canada, region improves accuracy) |
| GOV registers shareholder report | This service is used to order GOV register reports of the company type shareholder (if available) so you can block or flag companies that have GOV register reports available. Furthermore, if the report is available, it will be shown in the company profile in PDF and JSON format. | company name
company registration number
country
(for USA/Canada, region improves accuracy) |
| Shareholders check | This service automatically extracts a list of shareholders from the credit bureau reports and performs AML checks on them. | credit bureau report |
| Sole proprietorship report | This automation retrieves a sole proprietorship report for a specified company. The report contains key information about the sole trader and their business activities. Note: This automation works only with sole proprietorship step enabled on the workflow. | company name
country
tax identification number (director) |
| SOS filings report | This report provides official information filed with the Secretary of State (SOS) in various jurisdictions. It includes details such as a company’s registration status, legal name, address, registered agent information, and any public filings like liens or annual reports, offering insights into a company’s legal standing and compliance. | company name
state
city
street
postal code |
| AI generated report | This automation obtains an AI generated report for a specific company. The report may include details such as company information, registered addresses, directors, shareholders, and potential red flags. | company name
company registration number
country |
| AI generated shareholder report | This automation obtains an AI generated report for a shareholder who is a company. The report may include details such as company information, registered addresses, directors, shareholders, and potential red flags. | company name
company registration number
country |
| Proxy check | Performs a client IP check for the user that is filling the form and scores from Very Low to Very High. | client’s IP address |
| Fraud estimation | This service estimates the applicant’s fraud probability by analyzing various data points: The address is obtained from the credit bureau information (if the credit bureau report is not found, the rule will automatically fall back to GOV registers). Phone number (if none then fallbacks to GOV registers), email, and country details are extracted from the company information section. The IP address is taken from the applicant’s device that was used to submit the company. The solution responds to fraud values that can be from Very High to Very Low. With the Fraud Estimation automation rule, you can block or flag certain companies based on the analysis results. | |
| Address audit | This rule automatically conducts an address audit. | full address |
| Website audit | This rule is used to conduct a website audit and flag or block companies based on their website risk score, which can be Very Low, Low, Medium, High, or Very high. | website |
| Company name audit | This rule automatically conducts a social profile audit for the company. | full address
company name |
| EIN verification | This service verifies the TIN/EIN number of a U.S. company. Upon completion, it confirms whether the provided EIN exists and matches the specified company. | TIN/EIN number |
| Address verification | This rule is used to conduct an address verification check automatically. | full address
(optional) company country |
| VAT validation | This service verifies company VAT numbers and currently supports those registered in the EU. It returns the VAT number’s validity status, along with the associated company name and address. | VAT number |
| PoA verification beneficiary | This service extracts data from the Proof of Address (POA) document uploaded by the client. It verifies whether the full name and address match the details provided by the beneficiary and checks that the document is not older than three months. Required document: Proof of Address; Optional fields: Name, Surname, Address. | Proof of Address
(optional) name
(optional) surname
(optional) address |
| PoA verification | This service extracts data from the Proof of Address (POA) document uploaded by the client. It verifies whether the company name and address match the details provided by the client and checks that the document is not older than three months. | Proof of Address
(optional) name
(optional) surname
(optional) address |
| KYC status | You can manually link users to a specific company using the scan ref (scan refs are located in the Related Person section). This process automatically checks the KYC status of certain companies. | scan ref |
| KYC token | You can set automation to send the identity verification token to the beneficiaries automatically. The automation can be set up for UBO, ABO, shareholders, and/or representatives. When this automation is applied, and the client provides the email of a specific beneficiary, the identity verification link is sent to the provided email address. | email of the beneficiary |
| Blocklist check | This rule automatically rechecks the blocklist. Using this automation, the blocklist can be checked multiple times. | |
| Domain match | To proceed with the Domain Match automation, two possible conditions must be met: Company website: with this condition, the system checks if the company website domain matches the company email. Under this automation, you can block or flag companies with mismatches. Applicant email: with this condition, the system checks if the applicant’s (beneficiaries/users) email domain matches the company email domain. | company website
applicant email |
| IP country match | This rule checks whether the IP location (country level) matches both the IP provided while filling out the registration form and the company country. | client’s IP
company country |
| Duplicate email | This rule compares the email addresses of the partner’s clients (companies) with the newly registered clients (companies). According to automation, companies with duplicated emails can be flagged or blocked. | company email address |
| Manager rotation | This automation automatically assigns a manager account to a company if it hasn’t been already assigned and sends an assignment notification email to that manager account. The rule uses two separate company reviewer lists (main reviewers and AML reviewers). If both lists contain managers to select from, then the AML reviewers list will be used if a company, the company’s beneficiaries, or shareholders (from shareholders check) have any AML flags found. Otherwise, the main reviewer’s list is used. If either one doesn’t contain any managers, then the one which has reviewers is used. | |
***
## Final Notes
* You must link all created rules (automation and blocklist) to a **flow template** for them to be active.
* **Blocklist rules override** automation if matched.
* Use the **“?”** icon next to each automation for quick access to descriptions in the platform UI.
# Custom Rules for PoA Matching
Source: https://documentation.idenfy.com/guides/dashboard/risk/custom-rules-poa-matching
Configure PoA custom rules in iDenfy KYB to check proof of address name, address, and recency per stakeholder, then automate with the AI reviewer.
Proof of address (PoA) matching turns an uploaded utility bill or bank statement into a **decision input**. The platform extracts the name, address, issue date, and document type from the file, compares them against the data already held on the case, and exposes every mismatch as a condition you can build a rule on.
Two layers do the work, and they are configured separately:
Runs the extraction and comparison for a chosen stakeholder, then **flags or blocks** the company when the conditions you selected are met.
Reads the PoA outcome alongside every other check on the case and issues the **final decision** — approve, flag for investigation, or deny.
Use the custom rule alone if you only need a tag on the company. Use both when the PoA result should influence whether the case is approved or denied automatically.
***
## What PoA Matching Compares
The PoA automation extracts five data points from the submitted document:
| Extracted | Used for |
| -------------------------------- | ------------------------------------------------------------------- |
| Full name of the document holder | Name match against the stakeholder's declared name |
| Full address | Address match against the declared address |
| Issue date | Recency check — the document must be no older than **three months** |
| Document type | Checked against the allowed PoA document types |
| Presence of an issuer logo | Authenticity signal (missing logo is a common forgery indicator) |
Name and address are **optional inputs**. If a stakeholder record has no address on it, there is nothing to compare against and the address portion of the check cannot produce a mismatch — so the matching quality depends directly on how complete the workflow step that collects the stakeholder is.
PoA documents are always processed automatically and never enter manual review. If a file cannot be read, the system retries and then raises a mismatch rather than creating a review task.
***
## Choosing the Rule Type
Two automation types cover PoA, and they differ only in **whose** data the document is matched against:
| Automation type | Matches the document against | Typical use |
| -------------------------------- | ------------------------------------------------------ | --------------------------------------------------------------------------------------- |
| **PoA verification** | The company's name and registered or operating address | Confirming the business trades from the address it declared |
| **PoA verification beneficiary** | A stakeholder's name, surname, and residential address | Confirming a Director, Representative, UBO, or shareholder lives where they say they do |
The rest of this page uses **PoA verification beneficiary**, which is the more common of the two. The configuration screen is identical for both apart from the **Apply for** selector.
***
## Step 1 — Create the Custom Rule
Go to **Business verifications → Configuration → Custom rules**, stay on the **Automations** tab, and click **Create automation**.
Give the automation a **Title** that states the stakeholder and the intent — for example `PoA – Director address mismatch (flag)` — and optionally a description. The title is how you identify the rule when adding it to a workflow, so avoid a bare `PoA` if you plan to run more than one.
### Type
Select **PoA verification beneficiary** from the **Select type** dropdown.
### Apply For
Select which stakeholder roles the rule targets. Each selected role is evaluated independently — a rule applied to both Director and Representative fires if **either** person's document fails.
Available roles depend on what your workflow collects. See [Stakeholder Roles in KYB Workflows](/guides/dashboard/kyb/stakeholder-roles) for the full list.
A rule that targets a role your workflow does not collect never fires. If you enable UBO PoA matching but the Ownership Structure step has UBO switched off, the check is silently skipped.
### Recheck Automation Setting
Controls what happens when the KYB form is resubmitted — after a **Request more information** cycle, or when a reviewer rechecks the company manually from the company profile.
| Option | Behaviour |
| ---------------------- | ----------------------------------------------------------------------------------------------------------------------- |
| **Proceed once** | The document is checked on first submission only. Later uploads are not re-evaluated. |
| **Always proceed** | Every resubmission re-runs the check on the current document. |
| **Proceed if changed** | Not available for PoA rules — a replaced document is always a new document, so there is no "unchanged" state to detect. |
Select **Always proceed** whenever you ask clients to re-upload a rejected PoA. With **Proceed once**, the corrected document is accepted without being checked.
### Automation Action
| Action | Effect |
| -------------- | --------------------------------------------------------------------------------------------------------------------------- |
| **Do nothing** | The check runs and the result is recorded, but nothing happens to the case. Use this to observe hit rates before enforcing. |
| **Flag** | The company is tagged and highlighted. The workflow continues and later automations still run. |
| **Block** | The company is denied immediately and **all subsequent automations are skipped**. Optional deny reasons can be attached. |
When you plan to let the AI reviewer make the final call, set the action to **Flag**. **Block** ends the case before the reviewer sees it, which removes the reviewer's ability to weigh the PoA result against the other checks.
### Conditions
The **If the condition is** selector defines which failure modes trigger the action. Select as many as apply — the rule fires if **any** selected condition is met.
| Condition | Meaning |
| ------------------------ | ------------------------------------------------------------------------------------------ |
| **Name Mismatch** | The name on the document does not match the stakeholder's declared name. |
| **Address Mismatch** | The address on the document does not match the declared address. |
| **Expired** | The document is older than the accepted recency window. |
| **Unsupported Document** | The document type is not in the allowed PoA document list. |
| **Unsupported Country** | The issuing country is not in the allowed PoA country list. |
| **Screenshot Detected** | The upload is a screenshot rather than an original file or a photo of a physical document. |
| **Missing Logo** | No issuer logo was detected on the document. |
Allowed document types, allowed countries, and the recency window are not set on the rule — they come from your [Proof of Address settings](/guides/dashboard/settings/proof-of-address). The rule only decides what to *do* when one of those constraints is breached.
Splitting conditions across several rules gives you finer control than one rule with everything selected. A rule containing only **Screenshot Detected** and **Missing Logo** can block outright, while a separate rule for **Name Mismatch** and **Address Mismatch** only flags — the two failure classes rarely deserve the same treatment.
Save the rule when the configuration is complete, and confirm the enable toggle in the top right of the configuration card is on.
***
## Step 2 — Add the Rule to the Workflow
A saved rule does nothing until it is attached to a flow template.
1. Open the workflow and go to the [Custom Rules step](/guides/dashboard/risk/step-custom-rules).
2. Drag your PoA rule from **Available rules** into **Selected rules**.
3. Position it in the sequence. Rules run top to bottom, so place PoA rules **after** the automations that could block the case for a cheaper reason, and **before** any rule whose outcome should depend on the PoA result.
***
## Step 3 — Let the AI Reviewer Decide
The custom rule produces an outcome. The AI reviewer decides what that outcome means for the company as a whole.
### Open the Configuration
Go to **Settings → Business verifications (KYB) → AI reviewer** and click **Set up** next to **AI reviewer configuration**.
The **Automated AI review** toggle stays inactive until a configuration exists. Build the flow first, then come back and switch the toggle on — otherwise the reviewer never runs.
### Add the Proof of Address Task
In the **Choose a task** menu, pick **Proof of address** from the **Fraud prevention** category, then set its parameters.
**Entities to analyze** — Company, Director, Representative, UBO, Individual shareholder, or Company shareholder. Match this to the roles the custom rule targets; a reviewer task pointed at a role the rule never evaluated has nothing to read. The panel restates the same constraint: *"Rule triggers only if Directors are identified. If no entities are present, the task will be skipped."*
**Accepted outcome** — **Match**. Anything else (No match, Not compared) counts as unaccepted.
**If the required information is empty or marked as "None"** — decides how a missing result is treated:
* **Skipped** — the task is disregarded and does not affect the final action. Use this when a stakeholder may legitimately have no PoA on file.
* Treating it as unaccepted instead makes a *missing* document as serious as a *failed* one. That is a deliberate choice, not a default — pick it only when a PoA is mandatory for every targeted stakeholder.
Click **Next** to add the task to the Rules Flow.
### Configure the Final Action
**Final action** is always the last step in the flow.
* **When all tasks have accepted outcome** — the decision applied when every check on the case passes.
* **When any task has unaccepted outcome** — the decision applied when at least one check fails, including the PoA task.
Both dropdowns offer **Approve company**, **Flag for investigation**, and **Deny company**.
Click **Create** to save the flow (or **Update** when editing an existing one), then return to the AI reviewer tab and enable **Automated AI review**.
Final action is evaluated across **all** tasks in the flow, not just the PoA task. Setting "any unaccepted → Deny company" means a failed website audit denies the company just as a mismatched PoA does. If PoA is the only check you want to be strict about, keep it as the only task in the flow, or accept that the strictness applies to everything.
***
## Decision Patterns
Three configurations that cover most requirements:
**Custom rule:** action **Flag**, conditions **Name Mismatch**, **Address Mismatch**, **Expired**, **Unsupported Document**.
**AI reviewer:** Proof of address task, entities Director + Representative, accepted outcome Match. Final action — all accepted → **Approve company**; any unaccepted → **Deny company**.
Suitable where an unverifiable address is disqualifying on its own, such as regulated financial onboarding. Expect a higher false-rejection rate from clients whose bills are in a spouse's or landlord's name.
**Rule A:** conditions **Screenshot Detected**, **Missing Logo**, **Unsupported Document** → action **Block**.
**Rule B:** conditions **Name Mismatch**, **Address Mismatch**, **Expired** → action **Flag**.
**AI reviewer:** Final action — any unaccepted → **Flag for investigation**.
Documents that look manipulated never reach a human. Genuine documents that simply don't line up go to review, where the analyst can request a replacement. This is the pattern most partners settle on.
**Custom rule:** action **Do nothing**, all conditions selected.
**AI reviewer:** no Proof of address task yet.
The check runs and results appear on the company profile, but nothing is flagged, blocked, or denied. Run this for a few weeks to see how often each condition actually fires against your real client base, then promote the conditions that carry signal into an enforcing rule.
***
## When the Check Does Not Run
A PoA rule produces no result — rather than a failure — in these cases:
| Situation | Result |
| ------------------------------------------------------------- | ------------------------------------------------------ |
| No PoA document was requested or uploaded for the stakeholder | Check skipped, no record created |
| The targeted role is not present on the case | Rule silently skipped |
| The stakeholder has no declared name or address to compare | The corresponding comparison cannot produce a mismatch |
| A blocklist entry already matched and blocked the company | Automations do not run at all |
For the AI reviewer, a skipped PoA check is not the same as a passed one. If the targeted role is absent from the case, the task is skipped outright. If the role exists but has no usable PoA result, the **empty or "None"** outcome dropdown on the task decides whether that counts as skipped or unaccepted. See the [Checks Reference](/guides/dashboard/kyb/ai-reviwer-check-reference) for the full skip and failure matrix.
Blocklist matches take priority over automations. If a company matches a blocklist entry with the **Block** action, no PoA rule is evaluated.
***
## Related Pages
The full automation type catalogue and rule creation flow.
Building the rules flow and configuring final actions.
Allowed document types, countries, and the issuing date range.
Why a check was skipped or marked unaccepted.
# Fraud Prevention Tab
Source: https://documentation.idenfy.com/guides/dashboard/risk/fraud-prevention-tab
Review website audit results, social profiles, bank and VAT verification, and address audit data in the iDenfy fraud prevention tab.
### Website Audit
This section analyzes the digital footprint of the company's domain to assess its legitimacy. It aggregates data from multiple sources to calculate a "Trust Score" and assign an overall risk level to the business's online presence.
#### Understanding the Scores
The audit evaluates several distinct factors to generate the final result. Refer to this table to understand what each score represents:
| Metric | Description |
| -------------------- | ----------------------------------------------------------------------------------------------- |
| Risk Level | The overall assessment summary (Very Low, Low, Medium, High, or Very High). |
| Trust Score | A score from 0-100 indicating how reputable the domain is based on its digital history. |
| Popularity Score | Measures traffic and authority by checking how many other websites link to this domain (0-100). |
| Internal Audit Score | Evaluates the volume and structure of content on the website (0-100). |
| Blocklist Score | Checks if the site appears on known spam or malicious lists (ranges from -100 to 100). |
#### How to Interpret Results
Use these guidelines to make decisions based on the data:
* **Risk Level Guide:**
* **Very Low / Low:** The website is well-established and generally trustworthy.
* **Medium:** Some indicators warrant attention; a manual review of the site is recommended.
* **High / Very High:** Multiple warning signs are present. This suggests significant concerns about the website's legitimacy.
* **Domain Age:** Older domains generally carry lower risk. A domain registered very recently (e.g., yesterday) is inherently more suspicious than one established in 2015.
* **Blocklist:** A negative score here is a critical warning sign that the site may be flagged as spam or malicious by external watchdogs.
#### System Behavior and Limitations
* **Rechecks & Caching:** By default, audit results are cached to save time. If you suspect the content has changed recently, use the **Recheck website audit** button to force a fresh data fetch.
* **Missing URL:** If the company profile does not include a website URL, the audit will simply return no result—it will not artificially lower the risk score.
* **Unavailable Data:** If external data sources are down or unreachable during the check, the system defaults the result to **High Risk** as a safety precaution.
* **Public Access Only:** The tool can only analyze publicly accessible websites; password-protected or intranet sites cannot be audited.
***
### Social Company Profile
This card cross-references the company's details with public social registries and search engines.
* **Business Details:** Validates the Company address, Phone number, and Industry classification.
* **Reputation:** Displays the **Google rating** (0-5 stars) and the total number of reviews.
* **Social Presence:** Direct links to the company's **Instagram**, **X (Twitter)**, and **Facebook** profiles.
* **Action:** Click **View reviews** to read specific customer feedback or **Recheck social profile** to fetch the latest public data.
***
### Bank and VAT Verification
These sections manage financial and tax compliance checks.
* **Bank Verification:** Indicates if a bank account has been linked and verified.
* **VAT Validation:** Confirms if the company has a valid VAT number.
* **Action:** If the status shows "No verification performed," click **New verification** or **Validate** to initiate the request.
***
## Address Audit
This card validates the physical existence of the company's location by cross-referencing geospatial data with official records.
#### Address Verification Status
Check the status badge to understand how accurately the address matches the reference database:
* **Verified:** A complete match was found between the provided address and a single official record.
* **Partially verified:** A partial match was found. The system identified a single record, but some details required correction or were incomplete.
* **Unverified:** Unable to verify. The system could not match the input data to any valid record.
#### Quality Score (AQI)
The Quality grade (A-E) indicates the precision of the verification and how much the address had to be modified to find a match:
| Grade | Meaning |
| ----- | ---------------------------------------------------------------------------------------------------- |
| A | High Precision. Verifiable to the exact Premise level (specific building/house) without changes. |
| B | Good Precision. Verifiable to the Thoroughfare level (street) with only minor changes. |
| C | Moderate Precision. Verifiable to the Locality level (city/district) with moderate changes. |
| D | Low Precision. Only verifiable to the Locality level, requiring significant changes to find a match. |
| E | Parsing Failed. The address format was unreadable or could not be parsed. |
#### Visual Evidence
To further confirm legitimacy, the dashboard loads:
* **Street view:** Interactive 360° view of the location.
* **Map view:** Overhead satellite or map perspective.
* **Additional photos:** Still images of the building entrance or surroundings.
**Action:** Use the **Recheck address verification** button if the initial check returned "Unverified" or if you have manually updated the company address.
***
### Other Risk Factors
This card performs technical checks on network and domain consistency to detect potential fraud signals.
* **Domain Matching:** Checks if the company website and beneficiary email domains match the entity details.
* **IP Checks:**
* **IP country match:** Confirms the user's IP location matches the company country.
* **IP proxy check:** Detects if a VPN or proxy is being used to mask location.
* **Duplicates:** Scans for **Company email duplicates** across your database.
* **Fraud Probability:** An AI-driven estimation of overall fraud risk.
* **Action:** Use the **Recheck** button next to any specific factor to update its status.
# Get Risk Assessment Results
Source: https://documentation.idenfy.com/guides/dashboard/risk/get-risk-assessment-results
Calculate and retrieve company risk assessment results manually from the iDenfy dashboard or automatically during business onboarding.
There are three options to calculate and get the result of a company's risk:
#### Manually on the Dashboard
You can simply select your created Risk assessment and provide the answers. The system will automatically calculate the risk based on your answers and select Risk assessment.
To calculate Risk assessment manually, you have to go: Risk assessment → Risk checks → Manual Check. Here is the instructions:
#### Manually Onboarding New Company
If the Risk Assessment is added to the custom flow and you want to onboard your clients yourself, go to **Business Verifications → Create New Company**. Select the custom flow and provide all the details about your client. When you submit the form, the risk score will be automatically calculated.
#### Automatically Onboarding New Company
If you’re using the iDenfy form/application to collect and onboard clients, the process remains the same. Just add Risk Assessment to the custom flow, then go to **Business Verifications → Create Session** and apply the custom flow when generating the token. Your client will be required to answer all necessary questions, and the risk score will be calculated once they submit the form.
#### Retrieving the Result via API
The calculated score, risk level, and any reviewer comment are also returned in the company verification API response, so partners running the KYB process on their own side don't need to open the dashboard. See [Risk Assessment Results](/kyb/managing-company#risk-assessment-results).
# Configure Risk Assessment Profiles
Source: https://documentation.idenfy.com/guides/dashboard/risk/how-to-setup-and-configure-risk-assessment
Set up risk assessment categories, rules, and scoring thresholds in the iDenfy dashboard for compliant business verification workflows.
The proper Risk assessment setup is key to staying compliant and most importantly to follow your internal company risk assessment rules.
Follow the step-by-step guide below to configure your risk assessment profile.
#### To Create a Risk Assessment Profile, Go to **Risk Assessment → Risk Assessment Profiles → Create New**
#### Name and Describe Risk Assessment Profile
#### Determine and Create Client Risk Categories
The first step in creating a new risk assessment profile is establishing categories (channels). The most common categories used by regulated institutions are:
1. **Geographical channel.**
2. **Customer channel.**
3. **Products & services channel.**
4. **Delivery channel.**
\*Note that you can leave the risk assessment with only one category if you have just a simple list of rules.
#### Creating Rules for Categories
When the categories are completed, you can create risk rules and link them with certain risk levels. Here's how to create the first rule:
1. Select the category for which you want to create a risk rule.
2. Select between a risk rule from the library or a custom one:
* **Library**: iDenfy has created a list of rules that you can select from. Select the rule and assign the risk levels.
* **Custom rules**: If you don't find a rule that fits your needs, create your own by providing possible values and assigning risks.
3. When all the rules are created for specific categories, click **Next** to create rules for new categories.
#### Finalizing Risk Assessment Profile
Once all the risk rules for categories are created, go to the **Risk Assessment review and category weights** page and configure the weights for each category.
#### Adjust/Configure Risk Levels
The final step before using Risk Assessment is to adjust the overall risk levels. The default risk levels are:
* Very Low: 0-20
* Low: 21-40
* Medium: 41-60
* High: 61-80
* Very High: 81-100
You can adjust these risk levels by navigating to **Risk Assessment → Settings**.
# IP Check
Source: https://documentation.idenfy.com/guides/dashboard/risk/ip-check
Understand IP proxy risk levels in iDenfy identity and business verification, including the Not checked state and where the check runs.
## What Affects the IP Risk Level?
iDenfy sends the client's IP address — and nothing else — to a third-party risk provider, which returns a single risk level. Use of **VPNs, proxies, or anonymizing networks** is the strongest driver, alongside the provider's own reputation data for the address.
That reputation data can raise an address's level when the provider has previously seen patterns such as:
* Many different **emails** used from the same IP
* Many different **billing addresses** used from the same IP
* Many different **payment cards** used from the same IP
* A **high-risk device** previously seen using this IP
* A **high-risk email** previously associated with this IP
* Unusual or suspicious **network activity** across the provider's network
These patterns often point to shared devices, automated traffic, or earlier fraudulent activity.
These signals are evaluated on the provider's side, from data it has gathered across its own network. iDenfy sends only the IP address and receives only the risk level — no email, address, payment card, or device data from your verification is sent to the provider, and no per-signal breakdown or separate VPN, proxy, or Tor flag is returned.
***
## What the Risk Levels Mean
There are five levels, plus a **Not checked** state. Each level is distinct and is shown as returned — the dashboard does not group them.
| **Risk Level** | **What It Means** |
| --------------- | ----------------------------------------------------------------------------- |
| **Very Low** | No risk signals associated with the IP. |
| **Low** | Only minor signals; the IP looks normal. |
| **Medium** | Some unusual patterns were found; activity could be legitimate or suspicious. |
| **High** | Strong signals of risky or abnormal activity associated with the IP. |
| **Very High** | The IP is strongly associated with anonymized or fraudulent traffic. |
| **Not checked** | No level was produced. See below. |
### When You See "Not Checked"
**Not checked** means no risk level was produced. It appears when:
* The provider call failed or timed out.
* The returned score fell outside the scored range.
* No client IP was captured for the session.
* The check is not enabled for your account.
**Not checked** is missing data, not a low-risk verdict. Do not treat it as a pass.
***
## Where the Check Runs
* **Identity verification** — runs once per verification, and only after a successful result. The level appears in the dashboard and in the `clientIpProxyRiskLevel` field of the [result webhook](/kyc/webhooks). You can also check any IP on demand with the [Proxy Check API](/fraud-prevention/proxy-check).
* **Business verification** — appears among the company's risk factors. It is skipped when no client IP was captured, which returns **Not checked**.
**IP country match** is a different check. It compares the client's IP country against the company country and is configured as its own [custom rule](/guides/dashboard/risk/custom-rules) — a mismatch there says nothing about the IP proxy risk level.
# KYC Risk Assessment
Source: https://documentation.idenfy.com/guides/dashboard/risk/kyc-risk-assessment
Configure client risk scoring for KYC identity verification using default and custom rules in the iDenfy dashboard without coding.
## About Risk Assessment Functionality
Client risk scoring is an essential process for businesses to evaluate potential risks, prevent fraud, and ensure regulatory compliance. Our risk assessment solution provides an additional layer of user risk verification to help you manage risks more effectively.
To accurately assess the risk of potential users, you can either use the default rules provided and/or create custom rules tailored to your specific needs - all without coding.
## How to Create a KYC Risk Assessment
You can find a complete guide on how to create a KYC risk assessment by following this link:
The rules used for risk assessment come from the applicant's identity verification unless you create custom rules.
## How KYC Risk Scoring Is Calculated
The overall risk score is weight-based. Each category you create can have one or more rules. By default, there are 5 risk levels the rule can have:
* Very low - 1
* Low - 2
* Medium - 3
* High - 4
* Very high - 5
You can assign the risk score weight yourself if you create multiple categories. Let us provide you with examples of how it works:
1. The general rule is that the system calculates each category risk by its weight and sums up everything ((1 Category risk \* 1 Category weight) + (2 Category risk \* 2 Category weight) + (2 Category risk \* 2 Category weight)...)
2. For example, suppose nationality data and income data are each weighted at 50%. A person from a very high-risk country may still receive a high-risk status, even if their income is classified as medium.
## How to Use KYC Risk Assessment with Identity Verification
## What the User Sees Once They Start the Session with Risk Assessment
Once you have finished creating the session for the new user and they have received the link, they will be able to complete their identity verification as usual. The only difference is that they will also encounter the custom additional risk assessment fields you created, displayed as a questionnaire.
An example of the custom field we previously created is shown below:
Based on the criteria we created in previous steps if we select:
* Up to \$1000, the risk will be High,
* Up to \$2000, the risk will be Medium
* More than \$2000, the risk will be low
## Where to Check Risk Assessment Results After Identity Verification
If the user successfully verified their identity, you can find the risk assessment results in the dashboard under the identity verifications, verifications section.
Select the verification you wish to check once you are in the identity verification section. Then click … and select “Risk assessment”:
# Reviewing Risk Assessment Results
Source: https://documentation.idenfy.com/guides/dashboard/risk/reviewing-the-risk-assessment-results
Review company risk assessment scores, detailed rule results, scoring history, and comments in the iDenfy dashboard risk assessment page.
The calculated risk review can be done on the Risk Assessment page or the company profile (if it was calculated automatically with an onboarded company). The review page (pop-up) is the same whether you’re reviewing it on the Risk Assessment page or the company profile.
The page information for calculating company risk includes:
* **Checked Data**: The company name and the date of the check.
* **Risk Assessment Status**:
* **Risk Level**: The calculated risk level (very low, low, medium, high, or very high).
* **Risk Score**: The risk percentage out of 100%.
* **Status Changed By**: The person who initiated the risk assessment calculation.
* **Status Changed At**: If a manager forcibly changed the risk level, this field will show when it was done and by whom.
* **Comment**: If a manager changes the status, they are required to write a comment explaining why the level was changed manually.
* **Detailed risk results:**
* Each category and how many risk points the client has in each category.
* Each rule risk score, rule name, input, comment.
* **History**: Shows all previous checks for that company with detailed results.
* **Comments**: Read or leave comments about a particular risk.
* **Download PDF**: Export the full risk assessment result — including metadata, risk status, category breakdown, rule scores, and the most recent comment — as a PDF file.
* **Recheck**: Click this button to recheck the risk, change answers, etc.
* **Change Status**: A manager can manually change the applicant's risk level, with a requirement to leave a comment explaining the decision.
# Risk Assessment in the Dashboard
Source: https://documentation.idenfy.com/guides/dashboard/risk/risk-assessment
Configure risk assessment profiles with custom rules and scoring in iDenfy to evaluate client risk for fraud prevention and compliance.
Client risk scoring evaluates the risks involved with a new or existing client. It's key to preventing fraud, ensuring compliance, and managing financial exposure.
### In This Section
* [How to Set Up and Configure Risk Assessment](/guides/dashboard/risk/how-to-setup-and-configure-risk-assessment)
* [Business Verification with Risk Assessment Integration](/guides/dashboard/kyb/business-verification-with-risk-assessment-integration)
* [Get Risk Assessment Results](/guides/dashboard/risk/get-risk-assessment-results)
* [Reviewing the Risk Assessment Results](/guides/dashboard/risk/reviewing-the-risk-assessment-results)
## How the Risk Is Calculated
The overall risk is weight-based:
1. Each category has a specific number of risk rules.
2. The system takes the maximum possible result of each rule and sums it up. Risk scores:
* **Very low** — 1
* **Low** — 2
* **Medium** — 3
* **High** — 4
* **Very high** — 5
3. The system calculates each category risk: `Category risk / Category risk total * 100`
4. The system calculates each category risk by its weight and sums everything: `(Category 1 risk * Category 1 weight) + (Category 2 risk * Category 2 weight) + ...`
**Example video:**
[Watch on Loom](https://www.loom.com/share/401faac44d9d4f61960e5f5f8a745ac4?sid=c0b81eaf-c400-45fd-94e1-86200815e64e)
# Custom Rules Workflow Step
Source: https://documentation.idenfy.com/guides/dashboard/risk/step-custom-rules
Attach custom risk and blocklist rules to an iDenfy KYB workflow step, and understand the execution order and limits that apply when they run.
The interface is divided into two columns to help you organize your automation logic.
* **Available rules (Left):** Rules you have already created under [Custom Rules](/guides/dashboard/risk/custom-rules) that are not yet attached to this workflow. This is not a catalogue of built-in check types, so on a new account the column stays empty until you create your first rule.
* **Selected rules (Right):** The rules that will actually run for this specific workflow.
#### How to Configure
1. **Add a Rule:** Drag and drop a rule from the **Available** column to the **Selected** column. You can also use the **Move all to the right** button to select everything at once.
2. **Remove a Rule:** Drag a rule back to the left column or use the **Move all to the left** button.
A rule's position in the **Selected rules** column does not change the execution order. Blocklist checks always run first, followed by the automation rules in the order they were created.
***
### Rule Behavior and Limits
* What a rule does is set when you create it, not in this step: the action (**Do nothing**, **Flag**, or **Block**), the deny reasons attached to **Block**, the recheck condition (**Proceed once**, **Proceed if changed**, or **Always proceed** — availability depends on the check type), and the stakeholder roles it applies to (Director, Representative, Shareholder, UBO, ABO). See [Custom Rules](/guides/dashboard/risk/custom-rules).
* Once a **Block** rule fires, every remaining rule in the step is skipped entirely — not evaluated and not billed.
* The same check can be attached to a workflow only once.
* Your contract caps the total number of rules on your account. Once that cap is reached, creating a new rule fails.
***
### Creating New Rules
If the specific automation logic you need is not listed (e.g., a specific risk threshold or conditional check), click the **+** [**New rule**](/guides/dashboard/risk/custom-rules) button in the top right corner to create a custom configuration.
# Risk Assessment Workflow Step
Source: https://documentation.idenfy.com/guides/dashboard/risk/step-risk-assessment
Add a risk assessment step to your iDenfy KYB workflow using a pre-configured risk profile created outside the workflow builder tool.
The first step is risk assessment. The flow uses a risk assessment that you create outside the KYB workflow. Quick guide on how to [**set up Risk assessment**](/guides/dashboard/risk/how-to-setup-and-configure-risk-assessment).
# AI Reviewer
Source: https://documentation.idenfy.com/guides/dashboard/settings/ai-reviewer
Configure the AI reviewer automation settings and rule configurations for automated identity verification analysis in the iDenfy dashboard.
The **AI Reviewer** settings are found under **Business Verifications (KYB) → AI reviewer** tab. Use this page to control when automation runs and to manage your rule configuration.
***
## Settings Card
### Automated AI Review
This toggle controls the global automation behavior for your account.
* **Enabled (On):** The system automatically runs the configured AI workflow for every new business verification.
* **Disabled (Off):** The AI workflow will not run automatically. Verifications may need manual initiation.
This toggle only works if you have completed the setup in the **AI reviewer configuration** section below.
### AI Reviewer Configuration
This is the access point for your validation logic.
* Click **Edit** (pencil icon) to open the configuration modal.
* Use this to define your comparison rules, data sources, and final decision criteria (e.g. *Approve* vs. *Flag for investigation*).
> You must configure these rules at least once before you can enable the **Automated AI review** toggle.
***
## Configuring the AI Reviewer Workflow
### Step 1 — Choose a Task
Open the AI reviewer modal. The starting point is the **Choose a task** menu, divided into two categories.
#### Data Comparison
Instructs the AI to cross-reference user-submitted data against trusted external sources. Available entities:
* Company details
* Director details
* Representative details
* UBO (Ultimate Beneficial Owner) details
* Individual shareholder details
* Company shareholder details
#### Fraud Prevention
Instructs the AI to run security and compliance checks. Available tasks:
* AML (Anti-Money Laundering)
* Identity verification
* Address verification & Address audit
* Website audit
* VAT verification & EIN verification
* Proof of address
***
### Step 2 — Build the Rules Flow
Once you select a task, the modal splits into two panels:
**Left sidebar — Rules Flow:** A numbered sequence of your configured checks (Step 1, Step 2, Step 3…).
* Click **+** to add a new step.
* The flow always ends with a **Final action** step.
**Right panel — Configuration:** Defines the parameters for the currently selected step.
Click **Update** when you are finished to save your configuration.
***
### Step 3 — Configure a Data Comparison Task
When you select a Data Comparison task (e.g. "Company details comparison"), define three parameters:
**Data to Compare**
* Registration number
* Country
* Region
* Type (Company legal form)
* Phone
* Website
* Email
* Brand names
* Activity code
* TIN (Tax Identification Number)
* Operating address
* Postal address
* Postcode
* Street
* City
* All fields (compares every available data point)
Multiple fields can be selected.
**Data Source**
* Credit bureau report
* GOV registers report
* SOS filings report (Secretary of State)
* AI generated report
* GOV registers filings report
* Uploaded document
**Accepted Outcome**
* **Require full match** — data must be exactly identical.
* **Partial match** — slight variations are accepted (e.g. "Inc." vs "Incorporated").
***
### Step 4 — Configure a Fraud Prevention Task
The configuration fields depend on the task selected:
**AML (Anti-Money Laundering)**
* Entities to analyze: Company, Director, Representative, UBO, Individual shareholder, Company shareholder.
* Accepted outcome: **No flags** (completely clear) or **False positive** (known false positive allowed).
**Identity Verification**
* Entities to analyze: Director, Representative, UBO, Individual shareholder (physical individuals only).
**Proof of Address**
* Entities to analyze: Company, Director, Representative, UBO, Individual shareholder, Company shareholder.
* Accepted outcome: **Match**.
**Address Verification**
* Accepted outcome: Verified, Partially verified.
**Address Audit & Website Audit**
* Accepted outcome (risk tolerance): Very low, Low, Medium, High, Very high.
**VAT & EIN Verification**
* Accepted outcome: Verified, Not checked.
***
### Step 5 — Configure Final Actions
The last step in every flow is **Final action**. It defines how the system reacts once all checks have run.
* **When all tasks have accepted outcome** — set the action if every rule passes (e.g. **Approve company**).
* **When any task has unaccepted outcome** — set the action if even one rule fails (e.g. **Flag for investigation**).
Click **Update** to save.
***
## Handling Missing Data in Comparison Steps
Data comparison steps (such as individual shareholder details, director details, etc.) have two built-in behaviors for when data isn't available:
**When no entities are present**
If the entity type itself doesn't exist on the case — for example, no individual shareholders have been identified — the rule is skipped automatically. This is indicated by an info note on the step card:
> *"Rule triggers only if Individual shareholders are identified. If no entities are present, the task will be skipped."*
**When an entity exists but isn't found in the data source**
If a shareholder (or other entity) is identified on the case but cannot be matched in the selected data source, you can now configure how that should be treated. Each data comparison step includes an **Outcome** dropdown:
> *"If Individual shareholder is not found in data source, consider task outcome as: \[Outcome]"*
Available options include **Skip** — meaning the check is disregarded rather than counted as a failure. This prevents cases from being flagged or denied solely because a data source doesn't have a record for that entity, rather than because anything is genuinely wrong.
***
## Navigation and Validation
* **Disabled buttons** — the **Next** or **Update** buttons stay disabled until all required fields in the current card are filled correctly.
* **Error states** — leaving a required dropdown blank or entering invalid data highlights the field in red with a warning icon.
* **Adding to the flow** — once a card is valid, clicking **Next** adds it to the Rules Flow on the left so you can configure the next step.
# AML and Fraud Prevention
Source: https://documentation.idenfy.com/guides/dashboard/settings/aml-fraud-prevention
Configure automated AML screening and fraud prevention checks for identity verification events in the iDenfy dashboard settings page.
**Location:** **Settings** → **Know Your Customer (KYC)** → **AML & Fraud Prevention**
***
## When Each Check Runs
The checks on this tab do not all fire at the same point, which matters if you act on webhooks:
| Timing | Checks |
| ----------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| During the flow, before a result | AML check, LID check, criminal background check, driver's license check, both blocklist face checks, personal data blocklist check, verify email, verify phone, verify bank |
| Immediately after the flow, either result | Document face duplicate check, selfie face duplicate detection |
| Only after a final **approved** result | Personal data duplicates detection, IP proxy risk check, registry center checks |
| Daily, after approval | Auto AML monitoring |
Auto adverse media monitoring only works together with **Auto AML monitoring**.
The **AML check** screens against whichever datasets you have configured under [AML settings](/guides/dashboard/settings/anti-money-laundering-aml) — it does not carry its own dataset selection. See [AML from Verification](/guides/dashboard/aml/aml-from-verification#automatic-checks-for-all-verifications) for how a hit surfaces on the verification.
***
## Dependencies Worth Knowing
* **Verify bank** is the master toggle for the three bank checks beneath it. Turning on accounts, balances or transactions without it has no effect. See [Bank Verification](/guides/dashboard/bank/bank-verification-in-id-verification).
* **Criminal background check** is available for US citizens only, and **LID check** only for Lithuanian-issued documents. Both appear greyed out until enabled for your account.
* **Driver's license check** runs the AAMVA match — see [USA Driver's License Check (AAMVA)](/guides/dashboard/general/database-check-usa-drivers-license-check-aamva) for what counts as a match.
***
## Bank Card Verification
The two bank card settings moved here from KYC → Configuration; existing values carried over and need no reconfiguring.
Neither is self-service — you'll see a **Request** button instead of a toggle. [Contact iDenfy](https://idenfy-ivs.atlassian.net/servicedesk/customer/portal/1) to request access.
**Bank card PDF upload** does double duty: inside the identity verification flow it lets the user submit a PDF instead of a live capture, and in the [standalone flow](/guides/dashboard/bank-card/standalone-bank-card-verification) it also decides whether the method selection screen offers document upload at all. See [Bank Card Verification](/guides/dashboard/features/bank-card-verification) for setup and how the verdict is decided.
***
## Duplicates Vs. Blocklists
Both compare a face or a set of personal details against records you already hold, but they answer different questions and produce different tags.
| | Duplicate checks | Blocklist checks |
| ---------------- | --------------------------------------- | --------------------------------------------------------- |
| Compares against | Every past verification on your account | Only entries you added to a blocklist |
| Outcome | A duplicate tag for review | Session blocked or flagged |
| Configured in | This tab | [Blocklist Setup](/guides/dashboard/risk/blocklist-setup) |
The two country blocklists work on different signals: **by IP country** acts on where the user appears to be connecting from and ends the session outright, while **by declared country** acts on the document or country they select and stops them proceeding. Neither consults the other. See [Duplicate Check](/guides/dashboard/kyc/duplicate-check) for how a duplicate is scored.
# Anti-Money Laundering (AML)
Source: https://documentation.idenfy.com/guides/dashboard/settings/anti-money-laundering-aml
Adjust AML matching thresholds, screening options, and monitoring settings in the iDenfy dashboard Anti-Money Laundering configuration.
**Location:** **Settings** → **Anti-Money Laundering (AML)**
Monitoring created via the dashboard will use these settings that are set on the environment.
## AML Matching Threshold Percentage
Sets the minimum similarity score (75–100) to flag a potential match during AML checks and monitoring. Lower values increase sensitivity; higher values reduce false positives.
Our recommended value is 95% as it leaves some room for error and provides a more detailed list.
***
## AML Birth Year Range
Specify the search range for the Date of Birth. You can select an **exact** date, a range **within a single year**, or a **span of up to 5 years**, depending on how accurate or wide results you wish to see.
***
## AML PEP Status Filter
Filters results by the individual's PEP classification, whether they **currently** hold or **formerly** held a public role, or are **connected** to a PEP.
***
## AML PEP Tier Filter
Filters results by the risk classification level of the politically exposed person (PEP).
**Tier 1** indicates the highest influence or exposure;**Tier 3** indicates the lowest.
| **Tier** | **Description** |
| -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 1 | International and National level. Requires the most stringent monitoring because they have the highest authority and access to state funds, making them more susceptible to large-scale bribery, corruption, or embezzlement. |
| 2 | Regional or provincial officials, ambassadors, and senior management of slightly smaller bodies. |
| 3 | Local officials, mayors of smaller cities, and board members of smaller state enterprises. |
***
## AML Sanctions Status Filter
Filters results by whether the individual or entity is **currently** under sanctions or was **formerly** sanctioned.
***
## AML Datasets
Defines the categories of risk data included in checks, such as sanctions, politically exposed persons (PEPs), regulatory actions, reputational risk, and other relevant profiles.
[Here you can find datasets descriptions ↗](/guides/dashboard/aml/aml-key-terms-concepts#datasets)
***
## Adverse Media Search Day Limit
Limits the search for adverse media to a specified number of days, excluding any older findings.
Our recommendation is 7 days, as lowering it might increase the findings for common names and surnames.
***
## AML Monitoring Tags
Enables the creation and assignment of custom tags to monitoring users, allowing you to filter the monitoring user list for easier management of AML monitors.
***
## AML Sanction Databases
Defines which sanctions lists are used during screening. By default, all available databases are included, but you can narrow the scope by selecting or excluding specific lists.
# API Keys
Source: https://documentation.idenfy.com/guides/dashboard/settings/api-keys
Generate, view, and manage your iDenfy API key and secret in the dashboard settings for secure API authentication and integration.
## API Key Settings
Log in to the [dashboard](https://admin.idenfy.com/settings/api-keys), go to **Settings** and select **API keys**.
***
## Creating Keys
Click **Create** to generate API keys.
The API **secret** will **only be shown once** after creation.
You can create only **2 keys** at the same time. If you already have 2 keys, the dashboard disables the Create option.
There is no limitation on how many keys can be generated over time.
***
## Deleting API Key
You can delete API keys by clicking the trash bin icon.
Deletion is **permanent** and **irreversible**.
# Biometric and Liveness
Source: https://documentation.idenfy.com/guides/dashboard/settings/biometric-liveness
Configure biometric liveness detection and document authenticity settings to prevent spoofing during iDenfy identity verification.
**Location:** **Settings** → **Know Your Customer (KYC)** → **Biometric & Liveness**
***
## What Depends on What
The two strictness selects do nothing on their own. **Document liveness check** is the master toggle for both — with it off, a printed copy or a document held up on a monitor passes through unexamined no matter what the strictness is set to.
Between the two face checks, **Active 3D face liveness check** takes precedence: enabling it replaces the static face capture step entirely and supersedes the passive **Face liveness check**. Turn on one or the other, not both, unless you specifically want the 3D flow.
***
## Choosing a Strictness Level
Both selects offer **Soft**, **Regular** and **Hard**, and the choice is a fraud-versus-friction trade rather than a quality setting.
| Level | Catches | Cost |
| ----------- | --------------------------------- | ------------------------------------------------------------------------------- |
| **Soft** | Obvious copies and screen replays | Fewest false denials |
| **Regular** | Most spoofing attempts | Balanced |
| **Hard** | Marginal cases too | Legitimate users with poor lighting or low-quality cameras start getting denied |
A denial from either check is automatic and happens before manual review. If you raise strictness, watch your denial rate before and after — the users you lose are disproportionately the ones on older phones.
***
## NFC Reading
Reading the document's chip extracts issuer-signed data directly, which is the strongest document authentication available — nothing about it can be forged by re-photographing a document.
The two NFC settings differ only in what happens when the scan fails:
* **Optional NFC reading** — users who cannot complete the scan carry on through standard verification.
* **Required NFC reading** — a failed scan denies the verification.
Required NFC only applies to documents that actually support a chip, so enabling it does not block users whose document has none. See [Liveness Checks](/guides/dashboard/kyc/liveness-checks) for how these results are reported, and [Verification Statuses](/guides/dashboard/kyc/verification-statuses#face-status-values) for the values you'll see on the result.
# Configuration
Source: https://documentation.idenfy.com/guides/dashboard/settings/configuration
Customize KYC verification behavior including device restrictions, redirection logic, and result handling in the iDenfy dashboard settings.
**Location:** **Settings** → **Know Your Customer (KYC)** → **Configuration**
***
## Choosing Verification Methods
**Allowed verification methods** governs both where a session can start and where it can be continued. Removing **Desktop** forces every session onto a phone; removing the two mobile entries leaves a user who starts on a desktop with no way to hand off to a camera-equipped device.
When a user does switch devices, the language they picked beforehand carries over, so they are not asked to choose again. See [Localization](/guides/dashboard/settings/user-interface-sdk#localization).
***
## Redirect Behaviour
Three of the toggles above decide what the user sees once they finish, and they are easy to confuse:
| Toggle | When the user is redirected | Where to |
| ---------------------------------- | ------------------------------------------------------------- | ---------------------- |
| **Redirect based on final result** | As soon as the automated review finishes | Approved or Denied URL |
| **Redirect after submission** | Immediately after the last step, without waiting for a result | Unverified URL |
| **Display results within iFrame** | Never — the result renders in place | Stays in the iFrame |
**Redirect based on final result** does not skip manual review. The review still runs and its notification is still sent — the user just isn't kept waiting for it.
If a toggle is on but its URL field is empty, the user falls through to iDenfy's own result page. **Display results within iFrame** only does anything when the flow is actually loaded in an iFrame; outside one, the default flow applies.
**Redirect URL for KYC verification** replaces the address of the verification page itself, not the destination afterwards. It must contain the `{{token_string}}` placeholder — iDenfy substitutes the real verification token there, and without it the link cannot resolve to a session.
***
## Manual Review Combinations
Enabling either review toggle adds roughly **3 minutes** to the final result time.
| Goal | Configuration |
| ------------- | ------------------------------------------------------ |
| Always review | Enable both |
| Never review | Disable both |
| Only denied | Enable **Manually review denied verifications** only |
| Only approved | Enable **Manually review approved verifications** only |
***
## Uploading Vs. Capturing Images
**Enable image upload** lets users pick a photo from device storage instead of capturing one with the camera. It is not on this tab — the setting is deliberately not exposed in the dashboard.
This setting is **disabled by default in Production** and cannot be enabled from the dashboard. To turn it on, a team member with the highest role must [contact Support](https://idenfy-ivs.atlassian.net/servicedesk/customer/portal/1) to request a manual override.
Enable only if you have a specific use case that requires it — uploaded images carry significant risk:
* **Fraud risk:** Uploaded files can be edited, spoofed, or reused from previous sessions, making fraudulent identity claims much easier to execute.
* **Liveness failure rate:** Uploaded images frequently fail liveness and authenticity checks due to cropping, compression, or quality issues.
# Configuration (KYB)
Source: https://documentation.idenfy.com/guides/dashboard/settings/configuration-kyb
Configure core KYB flow behavior including company expiration, document validation, redirect URL, and submission status in the iDenfy dashboard.
**Location:** **Settings** → **Business Verifications (KYB)** → **Configuration**
***
### Company Expiration Check
When enabled, approved companies expire after a set number of months and must re-verify. Set the expiration period between **2 and 60 months**.
Automated reminders are sent to the company **one month before** and **on the expiration date**.
The period can be overridden per company in the **Approve company** modal — the global value is pre-filled but can be adjusted per case. Disabling the toggle in that modal only affects the individual company; the global setting is not changed.
Leaving this field empty or keeping the toggle off disables expiration entirely — companies will not expire and no reminder emails are sent. See [Company Expiration](/guides/dashboard/kyb/company-expiration-and-update) for how the per-company value is set and locked at approval time.
Partners who previously had this setting enabled with a fixed 12-month period were automatically migrated.
***
### Company Tags
Custom labels you can create and attach to companies for filtering and organization in the dashboard.
* Up to **100 tags**, each up to **64 characters**
* Tags can also be passed via API when generating a KYB session
***
### AI Validation for KYB Documents
AI automatically checks whether documents uploaded during KYB match the required document type for each step. For example, it flags a selfie uploaded where a company registration document was expected.
***
### Redirect URL for KYB Verification
The URL sent to businesses to access the KYB verification form, replacing the default iDenfy-hosted page.
* When **not set**, a URL is auto-generated per session
* When **set**, include `{{token_string}}` in the URL — this placeholder is replaced with the actual verification token at runtime
**Example:** `https://example.com/verify?token={{token_string}}`
The value must be a valid URL.
***
### Status on Submit
The status automatically assigned to a company immediately after the KYB form is submitted.
| Value | Behaviour |
| -------- | ------------------------------------------ |
| Not set | Company lands in the default review queue |
| Approved | Company bypasses the review queue entirely |
# Create Dashboard Account
Source: https://documentation.idenfy.com/guides/dashboard/settings/create-dashboard-account
Sign up for an iDenfy dashboard account for identity verification or business verification, or request an additional testing environment.
## New Customers
Sign up for an iDenfy account:
* **ID verification** — [Sign up here](https://idenfy.com/pricing-plans-v4/)
* **Business verification, AML, or fraud prevention** — [Book a demo](https://idenfy.com/demo-page/)
When signing up for ID verification (Pay-As-You-Go), you can register with your email and password or use **Continue with Google** / **Continue with Microsoft Entra ID**. After social authentication, you will be prompted to enter your company details to complete setup. Your username is generated automatically from your email address.
After signing up, you will receive dashboard access and API credentials to start integrating.
## Existing Customers
If you already have an environment and need an additional one, provide the following information to your assigned **account manager** or [open a support ticket](https://idenfy-ivs.atlassian.net/servicedesk/customer/portal/1):
* Company name
* Contact email
* List of emails to register as dashboard admins
***
Explore all available services and features at [idenfy.com](https://idenfy.com/).
# Document and Identity Verification Settings
Source: https://documentation.idenfy.com/guides/dashboard/settings/document-identity-verification
Configure accepted identity documents, capture settings, and age validation rules for identity verification in the iDenfy dashboard.
**Location:** **Settings** → **Know Your Customer (KYC)** → **Document & Identity Verification**
***
## How the Document Lists Interact
**Allowed documents** sets the global default — the list every user sees unless a country rule overrides it. A custom country rule replaces that default for that country only, so you can accept driver's licences everywhere but restrict one high-risk market to passports.
To add one, select the country under **Add custom documents for selected country**, choose the document types allowed there, then add the rule.
Emptying **Default documents** entirely leaves only your custom country rules in play, so users from any country without a rule have nothing to select.
Digital IDs are configured separately from physical documents and sit alongside them in the flow rather than replacing them, so enabling one does not remove a document option. For which schemes a country has, see [Supported Documents](/resources/supported-documents#countries-and-supported-documents).
***
## Backside Capture and Age Limits
**Driver's license backside capture** is ignored for USA and China licences — both sides are always required there regardless of the toggle.
The two age limits flag rather than block. A user outside the range still completes the flow; the verification is marked **Suspected** and picks up a mismatch tag for a reviewer to resolve. See [Age Verification](/guides/dashboard/kyc/age-verification) for the tags, and [Resolving False Positives](/guides/dashboard/kyc/resolving-false-positives-removing-mismatch-tags) for clearing one.
***
## Which Documents Are Supported
The lists in this tab are drawn from what iDenfy supports for each country — over 200 countries and territories, and 22 digital ID schemes. Rather than repeat that here, look it up:
Every document type with its API value, and a searchable country table showing the physical documents accepted, which sides are captured, and the digital IDs available.
Test documents and the results they produce in the sandbox.
Two things there affect what you can select on this tab: a document type absent for a country cannot be enabled for it, and some digital IDs need activating by support before they appear in **Allowed digital IDs** at all.
# White Labeling and Branding Guide
Source: https://documentation.idenfy.com/guides/dashboard/settings/idv-flow-and-branding-guide
White label the iDenfy identity and business verification flow with your own logo, colors, fonts, and domain. Full white label options available on request.
iDenfy is fully white-labelable. Your users can go through the entire verification experience — KYC and KYB — without seeing the iDenfy brand. This guide covers what you can customize, what's included by default, and how to unlock the full white label package.
Create and manage multiple branding themes for the identity verification flow — logo, colors, font, watermark, and support email. Assign a theme per flow configuration or pass one at token generation.
Create and manage multiple branding themes for the business verification form — logo, colors, and fonts. Themes are assigned per KYB session or flow.
***
## What You Can White Label
### Included for All Plans
Every iDenfy account can customize the verification UI out of the box:
* **Logo** — Your company logo in the header of the verification flow (SVG or PNG, minimum 200 × 200 px)
* **Colors** — Full color palette: primary/secondary brand colors, backgrounds, typography, borders, and all status states (success, error, warning, info)
* **Fonts** — Upload your brand font (`.otf`, `.ttf`) to replace the default typeface across the entire interface
* **Company name** — Displayed to users throughout the flow
* **Support email** — Shown to users if they need help during verification
* **Session timer** — Show or hide the verification countdown timer, which appears once the session is close to expiring (see [Session Timer](/guides/dashboard/settings/user-interface-sdk#session-timer))
### Full White Label Package
For a fully unbranded experience, the following options are available on request:
By default, iDenfy applies a watermark to verification PDFs. Full white label removes it entirely.
Remove the iDenfy logo and "Powered by" attribution from the web flow and iFrame.
Serve the verification flow from your own domain rather than iDenfy's.
Send verification emails from your own domain and with your own copy.
Interested in the full white label package? Contact your account manager or reach out to [sales@idenfy.com](mailto:sales@idenfy.com).
***
## Configuring the Verification Flow
Beyond branding, the settings below control which steps users go through and how strictly documents are checked. Use these to shape the experience alongside the visual customization.
| What you want to configure | Settings tab |
| --------------------------------------------------- | ------------------------------------------------------------------------------------------------- |
| Allowed devices, redirects, manual review rules | [**Configuration**](/guides/dashboard/settings/configuration) |
| Accepted document types and countries | [**Document & Identity Verification**](/guides/dashboard/settings/document-identity-verification) |
| Face liveness, NFC, anti-spoofing strength | [**Biometric & Liveness**](/guides/dashboard/settings/biometric-liveness) |
| AML screening, duplicate detection, blocklists | [**AML & Fraud Prevention**](/guides/dashboard/settings/aml-fraud-prevention) |
| Proof of address step | [**Proof of Address**](/guides/dashboard/settings/proof-of-address) |
| Web/iFrame screens, photo AI insights, SDK behavior | [**User Interface & SDK**](/guides/dashboard/settings/user-interface-sdk) |
| Consent text and privacy terms shown to users | [**Privacy Policy**](/guides/dashboard/settings/privacy-policy) |
# Integration Methods
Source: https://documentation.idenfy.com/guides/dashboard/settings/integration-methods
Compare iDenfy integration options including API, mobile SDK, iFrame, redirect, and no-code methods with setup time and feature notes.
## Available Integration Options
We support multiple integration methods to fit different business and technical needs:
| Method | Description | Time to integrate |
| --------------- | -------------------------------------------------------------- | ----------------------- |
| **API** | Full flexibility for custom workflows | Varies by customization |
| **Mobile SDKs** | Available for iOS, Android, Flutter, Cordova, and React Native | Varies by customization |
| **iFrame** | Quick and simple setup, embedded into your existing website | 1-2 days |
| **Redirect** | Send users to a hosted verification page with minimal setup | 1 day |
For detailed comparison and code examples, see the [Choosing Your Integration](/guides/choosing-integration) guide.
***
## Use Without Integration
Not ready to integrate? You can use the solution **directly from the dashboard** by sending verification links to your customers.
This is ideal for testing, pilots, or businesses that prefer a no-code setup.
See [Magic Link](/integrations/magic-link) and [New Verification via Dashboard](/guides/dashboard/kyc/new-verification-via-dashboard).
***
## Technical Support
* [Dedicated support team](https://idenfy-ivs.atlassian.net/servicedesk/customer/portal/1) to assist with setup, integration, and troubleshooting.
* Guidance available for developers, compliance teams, and business users.
* Ongoing assistance after launch.
# Branding (KYB)
Source: https://documentation.idenfy.com/guides/dashboard/settings/kyb-branding
Create and manage KYB branding themes in the iDenfy dashboard to white-label the business verification form with your logo, fonts, and colors.
**Location:** **Settings** → **Business Verifications (KYB)** → **Configurations** → **Branding**
KYC (identity verification) branding is managed separately under **Settings** → **Know Your Customer (KYC)** → **Branding**. Both products share the same multi-theme management interface. See [Branding (KYC)](/guides/dashboard/settings/kyc-branding).
The Branding section lets you create and manage multiple personalization themes for the KYB verification form. Each theme defines the visual identity shown to clients during business verification — logo, colors, font, company name, and support email. You can assign a different theme to each KYB session or flow.
***
## Managing Themes
The **Personalization themes** overview lists all configured themes:
| Column | Description |
| --------------- | --------------------------------------- |
| **Theme ID** | Unique identifier for the theme |
| **Theme name** | Internal label shown in the themes list |
| **Description** | Optional notes for team context |
Click **Create theme** to add a new theme. Use the action menu on any existing theme row to edit or delete it.
***
## Creating or Editing a Theme
### Configuration
| Field | Description |
| --------------------- | --------------------------------------------------------------------------- |
| **Theme name** | Internal label displayed in the themes list (required) |
| **Theme description** | Optional notes for team context |
| **Company name** | Public-facing company name shown to clients during the verification process |
| **Support email** | Contact email shown to clients during the verification flow |
### UI Files
| Asset | Format | Max size | Description |
| ------------------------------ | ---------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Customize interface colors** | — | — | Open the color picker to configure your brand palette across two tabs |
| **Logo** | SVG, PNG | 5 MB | Allows the upload and display of your company logo in the verification form. SVG recommended for sharpest results. PNG accepted at 200 × 200 px minimum. |
| **Font** | `.otf` or `.ttf` | 5 MB | Custom brand font applied across the interface |
### Interface Colors
Click **Select colors** to open the color picker. Colors are split across two tabs:
**Main UI colors**
| Color | Purpose |
| -------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
| Primary brand color | Core brand color for links, selections, step indicators, and highlights. Also used for primary buttons unless **Primary button color** is set |
| Primary background color | Main canvas background |
| Secondary brand color | Secondary accent color |
| Secondary background color | Card and panel backgrounds |
| Typography color | Default body text color |
| Disabled typography color | Color for inactive or disabled text |
| Success state color / background | Approved steps and completed actions |
| Error state color / background | Failed checks and validation errors |
| Warning state color / background | Quality alerts |
| Info state color / background | Neutral informational messages |
**Other UI colors** — Additional interface color overrides.
| Color | Purpose |
| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| Primary button color | Optional. Sets the color of primary action buttons (Continue, Save) on their own, without affecting other clickable elements. Leave it unset and primary buttons keep using the **Primary brand color**, as before |
Click **Save** when done.
### Preview
Click **Preview KYB UI** in the bottom toolbar to see a mock-up of the verification form with your theme applied before saving.
***
## Permissions
| Permission | What it allows |
| ---------------------------- | ------------------------------------------------------------------------------ |
| Manage KYB Dynamic Workflows | Create, edit, and view dynamic workflows |
| Generate KYB Token | View and assign dynamic workflows when creating sessions, but cannot edit them |
# KYB Data Retrieval
Source: https://documentation.idenfy.com/guides/dashboard/settings/kyb-data-retrieval
Retrieve KYB company verification data, documents, and PDF reports via the iDenfy API or dashboard for compliance and record-keeping.
You have **full access** to your company verification data through both the dashboard and the API, including submitted documents, ordered reports, and full company profiles.
***
## Data Retrieval via API
The recommended approach for bulk or automated retrieval is a two-step process using the API.
### Step 1 — List All Companies
Use the [**List companies**](/api-reference/companies/list-companies) endpoint to retrieve a paginated list of all companies in your account.
This returns each company's ID, status, and basic metadata — use the IDs from this response in the next step.
### Step 2 — Retrieve Company Data
You have two options depending on the format you need:
**Option A — Generate a PDF report**
Use the [**Generate company PDF**](/api-reference/companies/generate-company-pdf) endpoint with each company ID to produce a structured PDF report. This is the simplest way to archive a complete verification record.
**Option B — Retrieve full company JSON**
Use the [**Retrieve all company info**](/api-reference/companies/retrieve-all-company-info) endpoint to get the full company profile as structured JSON. Use this when you want to ingest data into your own system or database in a format you control.
***
## Downloading a Single Company Report via Dashboard
To download an individual company's verification record as a PDF directly from the dashboard:
1. Go to **Business verification** → **Verifications**
2. Find the company whose data you want to download
3. In the top-right corner, click **More actions**
4. Select **PDF**
From the pop-up window, select which information to include in the report. You can also set a password on the PDF file.
This method is intended for downloading a **single** company record. For bulk export, use the API approach above.
# Branding (KYC)
Source: https://documentation.idenfy.com/guides/dashboard/settings/kyc-branding
Create and manage multiple KYC verification branding themes in the iDenfy dashboard — logo, colors, fonts, watermark, and support email.
**Location:** **Settings** → **Know Your Customer (KYC)** → **Branding**
The Branding section lets you create and manage multiple personalization themes for the KYC verification flow. Each theme defines the visual identity shown to end users during verification — logo, colors, font, watermark, and support email. You can apply a different theme per magic link or flow configuration, making it straightforward to serve multiple brands from a single account.
Your existing KYC branding settings have been automatically migrated to a **Default** theme. No reconfiguration is required.
***
## Managing Themes
The **Personalization themes** overview lists all configured themes:
| Column | Description |
| --------------- | --------------------------------------- |
| **Theme ID** | Unique identifier for the theme |
| **Theme name** | Internal label shown in the themes list |
| **Description** | Optional notes for team context |
Click **Create theme** to add a new theme. Use the action menu on any existing theme row to edit or delete it.
***
## Creating or Editing a Theme
### Configuration
| Field | Description |
| --------------------- | --------------------------------------------------------- |
| **Theme name** | Internal label displayed in the themes list (required) |
| **Theme description** | Optional notes for team context |
| **Support email** | Contact email shown to users during the verification flow |
### UI Files
| Asset | Format | Max size | Description |
| ------------------------------ | ---------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Customize interface colors** | — | — | Open the color picker to configure your brand palette across two tabs |
| **Logo** | SVG, PNG | 5 MB | Allows the upload and display of your company logo in the verification flow. SVG recommended for sharpest results. PNG accepted at 200 × 200 px minimum. |
| **Font** | `.otf` or `.ttf` | 5 MB | Custom brand font applied across the interface |
| **Watermark logo** | PNG | 5 MB | Logo applied as a watermark on document and selfie photos in the generated verification PDF. For best results upload a black logo — opacity is applied automatically |
### Interface Colors
Click **Select colors** to open the color picker. Colors are split across two tabs:
**Main UI colors**
| Color | Purpose |
| -------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
| Primary brand color | Core brand color for links, selections, step indicators, and highlights. Also used for primary buttons unless **Primary button color** is set |
| Primary background color | Main canvas background |
| Secondary brand color | Secondary accent color |
| Secondary background color | Card and panel backgrounds |
| Typography color | Default body text color |
| Disabled typography color | Color for inactive or disabled text |
| Success state color / background | Approved steps and completed actions |
| Error state color / background | Failed checks and validation errors |
| Warning state color / background | Quality alerts (e.g. blurry image) |
| Info state color / background | Neutral informational messages |
**Other UI colors** — Additional interface color overrides.
| Color | Purpose |
| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| Primary button color | Optional. Sets the color of primary action buttons (Continue, Save) on their own, without affecting other clickable elements. Leave it unset and primary buttons keep using the **Primary brand color**, as before |
Click **Save** when done.
***
## Assigning a Theme
A theme can be applied in two ways:
* **Per magic link** — When creating or editing a magic link, enable the **Custom theme** toggle in the Configuration section and select a theme from the dropdown. See [Verification via Magic Link](/guides/dashboard/kyc/verification-via-magic-link).
* **Per flow configuration** — Select a theme in the KYC flow settings so every session created with that flow uses the assigned branding automatically.
If no theme is assigned, the **Default** theme is used automatically.
***
**Branding and user flow limitations**
During verification, all texts are predefined and are not editable. These include localization, titles, descriptions, and all status messages.
**Need adjustments?** If your localization needs adjustments, [contact us](https://idenfy-ivs.atlassian.net/servicedesk/customer/portal/1).
# KYC Data Retrieval
Source: https://documentation.idenfy.com/guides/dashboard/settings/kyc-data-retrieval
Retrieve KYC identity verification data, documents, and reports via the iDenfy API or dashboard case management for compliance needs.
You have **full access** to your customer data and retrieval methods within the dashboard and case management system, including KYC/KYB documents.
***
## Data Retrieval via API
You can automate data retrieval and saving by using the API:
* Using [**response webhooks**](/callbacks/ResultCallback)
* Using the [**Verification report + API strategy**](/KYC/VerificationReport)
***
## Retrieving Data via the Dashboard
## Downloading Verification Record As PDF
When you perform an ID verification, the system retrieves the individual verification data, which you can then download as a PDF.
Reports include identification details, statuses, pictures, questionnaire answers, location data, AML findings, and proof of address if applicable.
This method is meant only to download **a single** verification.
You can extract a PDF report directly from our dashboard interface by following these steps:
1. Navigate to the selected **ID verification** in the **dashboard**.
2. Click the document icon (located in the toolbar or under the "More Actions" dropdown).
3. Select the report language and set a password for the PDF (if needed).
4. Click **Generate**. The PDF will automatically download to your browser's default download folder, typically the **Downloads** folder.
***
## Generating Report
Limitations:
* Generating reports requires the [**Admin role**](/guides/dashboard/settings/team-member-management)
* Data downloaded is in **CSV** format
* Images (face, document, PoA) **can not** be downloaded
“**Verification report**” button will be under ***ID verifications*** if you can download the reports.
#### Possible Fields to Retrieve
**Identity information**
* Name
* Surname
* Birth name
* Date of birth
* Personal code
* Sex
* Nationality
* Birth place
* Mother's maiden name
**Document details**
* Document type
* Document number
* Date of issue
* Expiry date
* Issuing country
* Authority
* Driver's license category
**Address information**
* Address
* Temporary address
**Location and IP information**
* Client ID
* Client location
* Client IP
* IP country
**Verification data**
* Attempt count
* Start time
* Finish time
* Last AML check result
* Last AML check date
* Additional data
* Platform
* Email verification
* Phone verification
#### Filters
* Reviewers
* Document type
* Country
* Token type
* Review type
* Final result
* AI face check
* AI document check
* Face review
* Document review
* Fraud tags
* Document expiry status
**Beware**
Filtering uses **AND** logic. That means, when you use multiple filters, the system looks for verifications that match **ALL** filters.
The time it takes to generate will depend on:
* Selected time frame
* How many verifications are there in the selected time frame
Once the report is generated, you **will receive an email notification**, and you will be able to download the report by going back to the verification report window and clicking ***Generated reports***
Generating a report takes time and **will not** be instant.
# Monitoring (KYB)
Source: https://documentation.idenfy.com/guides/dashboard/settings/monitoring
Configure automatic AML monitoring for approved companies, beneficial owners, brand names, and adverse media in the iDenfy business verification dashboard.
**Location:** **Settings** → **Business Verifications (KYB)** → **Monitoring**
These toggles automatically enroll entities into ongoing AML monitoring when a company is approved — no manual action required. All four are off by default.
***
* **Auto company monitoring** — Automatically adds the approved company itself to AML monitoring.
* **Auto beneficiary monitoring** — Automatically adds all beneficial owners (UBOs) of an approved company to AML monitoring.
* **Auto brand monitoring** — Automatically adds all brand names the company operates under to AML monitoring.
* **Auto KYB adverse media monitoring** — Adds adverse media screening on top of standard company monitoring. Requires **Auto company monitoring** to also be enabled — enabling this setting alone has no effect.
# Notifications
Source: https://documentation.idenfy.com/guides/dashboard/settings/notifications
Enable and configure email and in-app notification preferences for verification events and status changes in the iDenfy dashboard.
## How to Enable or Disable Notifications
Open **Settings** in the dashboard.
1. Navigate to **Notifications** under **Personal settings**.
2. Use the toggle switch next to each item to turn notifications on or off.
3. Changes are saved instantly—no additional confirmation required.
***
## 1. General Notifications
### Daily Report
Receive a daily summary of the previous day’s financial usage.
The system sends an email to the address you provided.
***
## 2. Identity Verification Notifications
### Identity Verification Auto Completion
Receive an email when a verification is completed automatically.
The notification includes the verification status and key information such as the scan reference.
### Identity Verification Manual Completion
Receive an email when a verification is completed manually by an operator.
The notification includes the verification status and the scan reference.
### Expired Identity Verification
Receive an email when a user does not complete the verification within the specified timeframe and the status changes to *expired*.
### Canceled Identity Verification
Receive an email when a verification is canceled either by the user or automatically by the system.
### Resubmitted Identity Verification
Receive an email when a user resubmits their verification (for example, after being asked to complete an updated questionnaire).
### ID Document Expiration Notices
Receive alerts when a client’s ID document is approaching expiration.
Notifications are sent at the following intervals:
* 30 days before expiration
* 7 days before expiration
* 24 hours before expiration
* Once the document has expired
***
## 3. AML Notifications
### AML Monitoring Changes
Receive an email when new AML findings are detected for an individual or company, or when the monitoring status changes (for example, to *accepted* or *declined*).
### AML Monitoring Expiration
Receive an email when AML monitoring for an individual or company is nearing its expiration date or has already expired.
***
## 4. Business Verification Notifications
### Company Expiration
Receive an email when a company’s verification has expired or is about to expire.
A reminder is also sent 11 months after submission (one month before expiration).
### Company Submission
Receive an email when a new company has been successfully submitted for verification.
***
# Operational Settings (KYB)
Source: https://documentation.idenfy.com/guides/dashboard/settings/operational-settings
Manage internal review workflows, manager assignment, deny reasons, and company detail view visibility in the iDenfy KYB operational settings.
**Location:** **Settings** → **Business Verifications (KYB)** → **Operational settings**
Internal workflow configuration for your review team.
***
## Review Levels
* **Review levels** — Custom labels (e.g. "High Risk", "VIP") your team can create and assign to companies for filtering. Define the list here; individual companies are assigned a level from the company detail page or at the time of approval. Used to filter the full company list.
* **Default review level** — The review level automatically assigned to every new company entry. Must be one of the values defined in **Review levels**.
***
## Manager Rotation
Automate reviewer assignment for incoming companies.
* **Manager rotation** — A list of managers the system cycles through in round-robin order to automatically assign a reviewer to each new incoming company. When empty, no automatic assignment occurs.
* **Manager AML rotation** — A separate manager pool specifically for companies that have AML or adverse media flags. Those companies are routed to this pool instead of the standard rotation.
***
## Deny Reasons
* **Deny reasons** — Custom reasons a reviewer can select when manually denying a company. These can also be referenced by automation rules to differentiate denial types. If not configured, the system falls back to a global default list.
The selected reason is printed on the company's [PDF report](/kyb/pdf-generation#deny-reason) whenever the verification result is **Denied**.
***
## Displayed Cards
Controls which information sections are visible in the company detail view. Toggle off cards that are not relevant to your workflow to keep the interface focused.
Available cards:
* Main Company Information
* Sanctions & PEPs Overview
* Other compliance information
* Main related subjects
* Internal Company Information
* Submitted Company Information
* Questionnaire Answers
* Main Related Subjects Information
* Ownership Structure
* Social Company Profile
* Address Audit
* Website Audit
* Bank verification
* Other risk factors
* GOV Checks
* Company Data Comparison
* Uploaded Documents
* Audit Logs
* Tags
* Comments
* Compliance Information
* Monitoring Subjects
* Automation Statuses
* Blocklist Statuses
* Linked companies by registration number
* VAT verification
# Personal Details
Source: https://documentation.idenfy.com/guides/dashboard/settings/personal-details
View and update your iDenfy dashboard account profile information, enable two-factor authentication, and change your login password.
Access and manage your account essentials. Use this section to verify your profile information, secure your login with 2FA, or change your password.
To access this page, navigate to **Dashboard** → **Settings** → **Personal details**.
## Personal Information
* **Personal Information:** Click the **Edit** button to update your Name, Surname, or Email.
* **Security:** You can **set up** Two-factor authentication to add an extra layer of security. If it is already enabled, click **Delete** to remove your configuration.
***
## Change Password
This tab allows you to securely update your login credentials. You will be required to enter your **Current password** for verification before setting and confirming a **New password**.
Changing your password ends every active session on your account. The same applies when you sign out: all access and refresh tokens are terminated, so you'll need to sign in again on every device and browser tab.
# Privacy Policy
Source: https://documentation.idenfy.com/guides/dashboard/settings/privacy-policy
Configure privacy policy text, supported languages, and user consent requirements for iDenfy verification flows in dashboard settings.
**Location:** **Settings** → **Know Your Customer (KYC)** → **Privacy Policy**
***
## The Privacy Policy Landing Page
Users see a dedicated privacy policy page at the appropriate point in the flow, before document or face capture. This replaces any inline or modal presentation of the policy.
**Company name** is inserted into the agreement text wherever the template refers to the requesting entity, so the user can see who is asking for their data. Use the legal name of your entity, not a trading name.
***
## Drafting the Policy
**Privacy policy text** is a rich text editor rather than a plain field, and there is one per language you add. It can carry the structure a compliance team expects:
* **Formatting** — bold, italic, underline and strikethrough for key terms
* **Structure** — headings, bullet points and numbered lists
* **Media and links** — hyperlinks to external documents, and embedded images or video
***
## Multiple Languages
Each language is a separate card. **Add privacy policy** creates a card for a new language, English being the usual default. Expand or collapse a card with its chevron, and remove a translation with its trash icon.
A user is shown the policy matching the language they are verifying in. Provide one for every locale you have enabled, or users in a locale you have not translated fall back to your default. See [Supported Languages](/resources/supported-languages#identity-verification-kyc-languages) for the locales available, and [Localization](/guides/dashboard/settings/user-interface-sdk#localization) for how the language is chosen.
***
## Requiring Consent
**Request Privacy Policy confirmation** decides whether acceptance is explicit:
| State | What the user must do |
| ------- | ------------------------------------------------------------------------ |
| **On** | Tick a checkbox agreeing to the policy before verification can continue |
| **Off** | Nothing — the policy is displayed, but no explicit agreement is captured |
Leave it on where you need a record that consent was given. Which of the two satisfies your obligation is a question for your compliance team, not a technical one — see [GDPR](/guides/compliance/gdpr) for the wider data-protection picture.
# Proof of Address
Source: https://documentation.idenfy.com/guides/dashboard/settings/proof-of-address
Configure proof of address document requirements, accepted types, recency rules, and geographical settings in the iDenfy dashboard.
**Location:** **Settings** → **Know Your Customer (KYC)** → **Proof of Address**
***
## What Gates What
**POA verification** is the master toggle. With it off, everything else on this tab is inert — no proof of address step is added to the flow and no document is collected to apply the rules to.
**Address verification** is a second, separate step: it validates the address data extracted from the document rather than just accepting the document as present. It only runs on flows that already include a proof of address step.
Leaving **Allowed POA countries** empty accepts documents from anywhere. That is the default, and it is not the same as blocking everything — an empty inclusion list is treated as no restriction.
***
## Accepted Document Types
**Allowed POA documents** offers twenty types. The full set, in dashboard order:
Bank statement · Credit card bill or statement · Water bill · Electricity bill · Gas bill · Telephone bill · Internet bill · Bank reference letter · Mortgage statement or contract · Letter issued by a public authority · Company payslip · Car or home insurance policy · Car registration · Authorized change of address form · Letter of employment · Official letter from an educational institution · Municipality bill or government tax letter · Residence permit · Lease agreement for your residence · Other
**Other** is a catch-all that accepts documents outside the list, so it widens acceptance considerably. Leave it off if you need a defensible, enumerated set of accepted evidence.
***
## Recency and Anti-Fraud Rules
**POA issuing date range** offers **1 month**, **3 months**, **6 months**, **1 year** and **2 years**. A document dated outside the window is rejected regardless of type — utility bills are the usual casualty, since users often have only an older one to hand.
**Block POA screenshots** forces an original digital file or a photo of a physical document. Screenshots are the easiest artefact to edit convincingly, which is why blocking them tends to matter more than tightening the date range.
**POA country match** enforces one jurisdiction across both documents. Enable it where your obligation is to prove residence in the same country as the identity document; leave it off if you legitimately onboard people whose address and nationality differ.
See [Proof of Address Verification](/guides/dashboard/kyc/proof-of-address-poa-verification) for the reviewer's view, and [Custom Rules for POA Matching](/guides/dashboard/risk/custom-rules-poa-matching) for acting on a mismatch automatically.
# Custom Email Sender
Source: https://documentation.idenfy.com/guides/dashboard/settings/smtp-configuration
Send iDenfy emails from your own domain using a custom SMTP server. Learn what credentials to prepare and how to request setup from iDenfy support.
By default, all emails sent by iDenfy go out from iDenfy's own mail server. Custom SMTP lets you route a subset of those emails through your own mail server so they arrive from your domain.
Custom SMTP cannot be enabled from the dashboard. Contact iDenfy support and provide the credentials listed below.
***
## What Uses Your Custom SMTP
Not all email types are routed through partner custom SMTP. The split is as follows.
**Sent via your custom SMTP when configured:**
* Verification link emails sent to clients during KYC and KYB flows
* Verification URL dispatch
* KYB "request more info" emails and expiration extension reminders
* Custom ad-hoc emails sent via the notification/admin APIs
**Always sent via iDenfy's mail server, regardless of your SMTP config:**
* Verification result notifications (approved, declined, expired, resubmitted)
* AML monitoring alerts
* Document and company expiration reminders
* Webhook failure alerts
* Finance reports and internal admin notifications
***
## What to Provide to Support
All four fields are required. Providing only some of them will not activate custom SMTP — the system falls back to iDenfy's mail server silently.
| Field | Details |
| ------------- | ------------------------------------------------------------------- |
| **SMTP host** | Your mail server address (e.g. `smtp.yourdomain.com`) |
| **Port** | Port number, 0–65535. Standard TLS ports: **25**, **587**, **2587** |
| **Username** | SMTP authentication username |
| **Password** | SMTP authentication password |
TLS is enabled by default. If you use a non-standard port, the connection will still be attempted but may produce a warning.
***
## Prerequisites
Before reaching out to support, make sure the following are in place.
**Sender email address**
Your account must have a sender email address configured — this becomes the **From** address on outgoing emails. Without it, custom SMTP will not activate even if credentials are correct. Provide this address to iDenfy support when requesting setup.
**All four SMTP credentials**
There is no partial configuration. If any single field (host, port, username, or password) is missing, the system falls back to iDenfy's global SMTP automatically.
***
## Fallback Behavior
If your SMTP server fails to deliver an email, iDenfy automatically retries using its own mail server. This is transparent — no action is needed on your part. The email will be delivered, but it will come from iDenfy's address for that attempt.
***
## Checklist Before Contacting Support
1. SMTP host, port, username, and password are all confirmed and ready to share
2. TLS is supported on the port you plan to use (standard ports: 25, 587, 2587)
3. You have a sender email address ready to provide — this will be used as the From address
4. All four credential fields are available — partial credentials will not activate custom SMTP
# System Notifications for Webhooks and Emails
Source: https://documentation.idenfy.com/guides/dashboard/settings/system-notifications-webhooks-emails
Configure webhook endpoints and email notification rules for identity and business verification events in the iDenfy dashboard settings.
This guide will show you how you can create/remove/edit the notifications. For more information on how webhooks work in iDenfy, please visit [this page.](/callbacks/ResultCallback)
## Notification Settings
In the left sidebar, click **Settings**
Find **System notifications**
***
## Creating a Notification
To start creating, simply select ***Create new***
***
## General Overview
Each webhook configuration consists of:
* **Name** – internal name for your webhook
* **Receiver (URL)** – the endpoint where iDenfy will send the notification
* **Event Type** – defines which event will trigger this webhook (e.g., *ID VERIFICATION MANUAL FINISHED*)
* **Status** – shows whether your webhook is currently active
> *Only active webhooks will receive notifications.*
### Notification Details
**Name:** give your webhook an easy-to-recognize label.
**Receiver:** enter your endpoint URL (e.g. `https://your-endpoint.com`).
**Notification Type:** this field is fixed as **Webhook**.
***
### Event Type
Select the event that will trigger the webhook.
Click **“View JSON schema”** to see the payload structure for the selected event.
Notes
* **Use specific events** (e.g., `AUTO FINISHED`, `MANUAL FINISHED`) instead of the generic `ID VERIFICATION`.
* Each webhook type can be assigned its own URL, headers, or authentication secret.
* **Expiration events** are sent before or upon expiry — implement retry logic to ensure delivery.
#### Identity Verification
| ID VERIFICATION (Legacy) | Sent when a client completes an identity verification. Deprecated – use one of the specific events below instead. |
| ------------------------------- | ----------------------------------------------------------------------------------------------------------------- |
| ID VERIFICATION AUTO FINISHED | Sent when an identity verification completes automatically. |
| ID VERIFICATION MANUAL FINISHED | Sent when an identity verification is manually approved or denied. |
| ID VERIFICATION EXPIRED | Sent when an identity verification expires. |
| ID VERIFICATION CANCELED | Sent when a verification is canceled by the user or system. |
| ID VERIFICATION RESUBMITTED | Sent when a client resubmits their identity verification. |
| DOCUMENT EXPIRATION | Sent when a client’s identity document is nearing expiration or has expired. |
| FACIAL AUTHENTICATION | Sent when a facial authentication session ends (success, failure, or expiration). |
#### AML / Monitoring
| AML MONITORING | Sent when an AML monitoring user is checked, accepted, or declined. |
| ------------------------- | ---------------------------------------------------------------------- |
| AML MONITORING EXPIRATION | Sent when an AML monitoring user is nearing expiration or has expired. |
#### Company (KYB)
| COMPANY REVIEW | Sent when a company verification is completed. |
| -------------------- | ------------------------------------------------------------------------------------------- |
| COMPANY DELETE | Sent when a company is deleted. |
| COMPANY AML REVIEW | Sent when AML review status is manually updated for a company or its beneficiaries. |
| COMPANY INFO REQUEST | Sent when additional company information is requested or when a company form token expires. |
| COMPANY EXPIRATION | Sent when a company verification is nearing expiration or has expired. |
| COMPANY SUBMIT | Sent when company information is submitted. |
#### Other Services
| ACCOUNT CHECK | Sent when a social-media account check is completed. |
| -------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| GOV ORDERED DOCUMENT | Sent when a government registry document ordered via API is delivered. |
| SOS\_REPORT | Sent when a SOS filing report is delivered. |
| BANK\_VERIFICATION | Sent when a bank verification is completed. |
| AGE\_ESTIMATION | Sent when an age estimation session reaches a terminal state. Used as the default destination for sessions created without their own webhook URL — see [Age Estimation Webhooks](/age-estimation/webhooks). |
***
### Headers
Add custom HTTP headers for your webhook requests.
Each header consists of:
* **Key** – name of the header (e.g. `Authorization`)
* **Value** – value for that header (e.g. `Bearer abcd...`)
> Click **“Add new”** to include multiple headers.
***
### Signing Key
Add a custom **signing key** to verify the authenticity of incoming webhook requests.
This helps ensure the payload wasn’t modified in transit.
***
### Webhook Fail Email
If the webhook cannot be delivered, iDenfy can send a failure notification to your chosen email address.
* **Failed webhook email:** enter your address
* Optional: enable **“Send webhook body to email”** to include the failed request details
***
### Enable OAuth (Optional)
You can authorize your webhook delivery using OAuth.
* **Endpoint:** OAuth authentication endpoint
* **Token:** your access token
* **Request:** additional OAuth request body, if needed
> This ensures webhook messages are securely delivered to your protected endpoints.
***
### Resend Failed Webhook
If a webhook fails, you can automatically retry sending it.
* **Retry count:** number of resend attempts
* **Interval in seconds:** time between each retry
> Useful for temporary downtime or network interruptions.
***
### Testing
Use the **Test** button to send a test request and confirm your configuration works correctly.
***
### Saving and Managing
When done:
* **Save** to store your settings
* **Delete** to remove the webhook configuration
***
## Debugging Notifications
In **System notifications →** select ***Recently Sent*** (top-right corner) to review sent notifications. You can:
* **Search by scanRef** to find specific notifications.
* **View response codes** from your server:
* `0` – No Response: Server unreachable.
* `2xx` – Success: Request delivered successfully.
* `3xx` – Redirection: Further action needed.
* `4xx` – Client Error: Your server couldn’t handle the request.
* `5xx` – Server Error: Request valid, but the server failed.
* **See the date and time** each notification was sent.
* **Attempt to resend** the webhook.
* **View full payloads in JSON** format for debugging.
* We store Notification information for **30 days** before it's deleted
* We **do not** log information from callback responses.
# Team Member Management
Source: https://documentation.idenfy.com/guides/dashboard/settings/team-member-management
Add, remove, and manage team member roles, permissions, and activity tracking in the iDenfy dashboard for secure admin and review access.
Quick guide on how to manage a team member
Some actions here require an ***Admin*** role, and without it, some options will not be visible to you
If you have an ***Admin*** role but still can’t perform some of these actions, contact [**techsupport**](https://idenfy-ivs.atlassian.net/servicedesk/customer/portal/1), as your environment permissions might need to be adjusted.
***
## Roles
* Each **team member** needs to have an assigned role
* **Roles** are meant to ensure that users have access only to what is necessary for tasks
| Role Name | Extended by | Permissions |
| --------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| Viewer | - | View & list KYC verifications View & list KYB forms View All sessions & Disposed verifications page View & list single AML & AML monitoring subjects View & get AML monitoring comments and logs View & list face authentication verifications View & list other available environment services, such as: PoA, Blocklist, etc. |
| Member | Viewer | Create new KYC & KYB token(s)/session(s) Perform single AML & AML Monitoring checks Download KYC PDF reports Manage KYC & KYB questionnaires |
| Moderator | Member | View KYC & KYB statistics View environment settings, managers, API keys, and privacy policy View & Perform Soft KYC service Evaluate AML Monitoring subjects/findings Search/order GOV & Registry reports Generate KYC verification reports Manage environment notifications |
| Admin | Moderator | Change environment settings Manage API keys & privacy policy Manage the roles of Team members View finances |
***
## Team Member Setting
In the [**dashboard**](https://admin.idenfy.com), navigate to **Settings**
Select **Team members**.
***
## Inviting New Members
In the top right corner, click **Add member**
In the pop-up window:
Select a **role** from the **dropdown** options
**Enter** the new member's **email**
***
### Changing the Role of the Current Member
In the ***Team members*** page:
1. Click the current **role** of the member
2. In the pop-up window, select a new role
**Good to know**
* Role change requires the ***Admin*** role
* Members with the ***Admin*** role can promote other members to ***Admin***
***
## Removing / Deactivating Members
**Identify the member** you want to **remove** from the environment
On the far right side, in line with the account member, click **the 3 dots**
Select ***Deactivate*** if removing access **temporarily**
Select the ***Delete manager*** if you want to remove the member **permanently**
***
## Resetting **OTP / Password**
**Identify the member** whose credentials you need to **reset**
On the far right side, in line with the account member, click **the 3 dots**
Select what you would like to **reset**
Resetting a member's password ends all of their active sessions, so they'll have to sign in again on every device.
***
## Member Activity
You can review each member's activity and what endpoints (*webpages*) they visited.
**Identify the member** whose activity log you want to see
On the far right side, in line with the account member, click **the 3 dots**
Select **Review activity**
***
# User Interface (KYB)
Source: https://documentation.idenfy.com/guides/dashboard/settings/user-interface
Customize the KYB form language options, post-submission redirect, and legal link URLs in the iDenfy dashboard user interface settings.
**Location:** **Settings** → **Business Verifications (KYB)** → **User interface**
Controls what the applicant sees and where they are directed during and after the KYB flow.
***
* **KYB locales** — The languages available on the KYB form. Applicants can choose their preferred language from this list. At least one locale must always be set. See [Business Verification (KYB) Languages](/resources/supported-languages#business-verification-kyb-languages) for supported locale codes.
* **Redirect URL** — Where the applicant is sent after completing and submitting the KYB form. When not set, the default iDenfy post-submission screen is shown.
* **Terms and conditions URL** — A link to the partner's Terms and Conditions page. When set, applicants must accept these terms during the KYB flow before proceeding.
* **Privacy policy URL** — A link to the privacy policy shown to applicants during the flow.
* **Pricing URL** — A link to a pricing page, shown during the flow if set.
# User Interface and SDK
Source: https://documentation.idenfy.com/guides/dashboard/settings/user-interface-sdk
Configure the verification flow visual appearance and mobile SDK behavior settings in the iDenfy dashboard for web and native apps.
**Location:** **Settings** → **Know Your Customer (KYC)** → **User Interface & SDK**
***
## Session Timer
The timer stays hidden until the session is close to expiring, so users are not watching a countdown from the moment they start. When it appears depends on the total session length — whether that comes from this dashboard or from `sessionLength` at [token generation](/kyc/generate-token):
| Session length | Timer appears with |
| ------------------- | ------------------------ |
| Under 10 minutes | 1 minute 15 seconds left |
| 10–20 minutes | 2 minutes left |
| 20–30 minutes | 3 minutes left |
| 30 minutes and over | 5 minutes left |
If the threshold would fall in the first half of a very short session, the timer appears at the halfway point instead. In the last 30 seconds it switches to a critical state to make the remaining time unmistakable.
Turning **Show session timer** off still hides it everywhere. The screens it appears on are unchanged: document selection, onboarding, instructions, device selection, and the capture step on desktop and light mobile. It is not shown on email or phone verification, questionnaires, bank verification, the full-screen mobile camera, liveness, eID, photo retake, or the completion screen.
This later-appearing timer is rolling out as an A/B test across the web flow, so only a share of your users see it — the rest keep the timer that counts down from the start of the flow.
***
## Document Selection and Back Navigation
While **Show document selection** is on, users can return to that screen with the **Back** button at any point they are allowed to go back — including after a document photo has already been taken, so a wrong document type no longer forces them to finish the wrong verification or abandon the session. Picking a different type overwrites the photos captured earlier in that session.
With the setting off there is no selection screen to return to, and the document type is inferred from the photo instead.
***
## Automatic Country and Document Detection
With this on, the user is not shown a manual country or document selection screen at all. It is the better choice when your users may verify with a document issued somewhere other than where they are — a foreign national onboarding for a job abroad, for instance.
1. **Direct to camera** — the user goes straight to the document capture screen.
2. **Auto-detection** — the user's location is detected via IP, and accepted documents for that country are applied.
3. **Scan and recognize** — the document is identified from the capture.
4. **Manual fallback** — if recognition fails through poor lighting or an unreadable image, the user is asked to select country and document type after all.
***
## Localization
* **Default:** Localization is enabled automatically.
* **Detection:** The system detects the language from the user's IP address.
* **Limitation:** Browser language settings are ignored.
* **Persistence:** If the user changes the language mid-verification, that choice is kept for the rest of the session — including when they continue on another device after scanning the QR code or opening an SMS link. This applies regardless of the `locale` passed when the session was created.
[All available locales](/resources/supported-languages#identity-verification-kyc-languages)
# Feature Setup
Source: https://documentation.idenfy.com/guides/dashboard/setup/feature-setup
Follow step-by-step guides for setting up identity verification features like questionnaires and custom steps in the iDenfy dashboard.
Customize and configure your dashboard for your specific ID verification needs.
### Setup Guides
* [Questionnaire Setup](/guides/dashboard/kyb/setting-up-questionnaires-kyc-kyb) — Set up questionnaires for identity verification.
* [Privacy Policy Setup](/guides/dashboard/features/questionnaire-template-setup) — Configure privacy policies users must agree to before verification.
* [Blocklist Setup](/guides/dashboard/risk/blocklist-setup) — Block individuals from future verifications by scan reference, selfie, document, or personal data.
* [Bank Verification on IDV Flow](/guides/dashboard/bank/bank-verification-in-id-verification) — Add bank verification as a step in identity verification.
* [Proof of Address / Additional Steps](/guides/dashboard/features/poa-custom-additional-step) — Configure PoA and custom document upload steps.
* [Face Authentication](/guides/dashboard/face-auth/face-authentication) — Set up biometric re-authentication.
# Full Feature List
Source: https://documentation.idenfy.com/guides/dashboard/setup/full-feature-list
Browse the complete list of iDenfy features available across Identity Verification, AML, Business Verification, and Fraud Prevention.
The **Features and Products** page in the dashboard provides a visual overview of all available features grouped by product area. You can see which are active or inactive, configure them, and learn more — all from one place. Use the **Active products** shortcut in the left sidebar to jump directly to this page.
* [Identity Verification](#identity-verification)
* [Core Identity Verification Features](#identity-verification--core-identity-verification-features)
* [Other Identity Verification Features](#identity-verification--other-identity-verification-features)
* [AML](#aml)
* [Core AML Features](#aml--core-aml-features)
* [Business Verification](#business-verification)
* [Core Business Verification Features](#business-verification--core-business-verification-features)
* [Other Business Verification Features](#business-verification--other-business-verification-features)
* [Fraud Prevention](#fraud-prevention)
* [Core Fraud Prevention Features](#fraud-prevention--core-fraud-prevention-features)
***
## Identity Verification
### Core Identity Verification Features
| Feature | Description |
| ------------------------------------------------ | -------------------------------------------------------------------------------------- |
| **ID Verification** | Verify 3000+ types of documents and onboard users from 200+ countries and territories. |
| **Digital IDs** | Authenticates users via digital IDs instead of physical documents. |
| **Proof of Address** | Add a step to ID verification, requesting proof of address upload. |
| **Passive Face Liveness** | Detect spoofing via facial analysis without user action. |
| **Passive Document Liveness** | Confirm document authenticity without user interaction. |
| **Sanctions and PEPs Check** | Scan AML databases for PEPs and sanctions listings after each approved IDV. |
| **Face Authentication** | Provide 3D liveness to verify identity via face matching. |
| **KYC Risk Assessment** | Evaluate risks with customizable, no-code client scoring. |
| **AML Monitoring** | Monitor approved ID verification users daily for PEPs and sanctions lists. |
| **Document Face Duplicates Detection** | Scan document face photos to prevent multiple onboardings. |
| **Face Duplicates Detection** | Scan selfie photos to prevent multiple onboardings. |
| **Age Verification** | Check and flag users not in the specified age limits. |
| **Address Verification** | Verify the address from the proof of address document. |
| **Driver License Check** | Perform USA driver's license check. |
| **24/7 Done-For-You Verification Manual Review** | Expert manual review for accuracy on complex verifications. |
| **Verification Charged on Approved-Only Result** | Pay per approved verification only; no charge for denied users. |
### Other Identity Verification Features
| Feature | Description |
| -------------------------------- | -------------------------------------------------------------------------------------------------- |
| **3D Face Liveness Detection** | Verify real identity through facial movements, confirming liveness. |
| **Bank Card Verification** | Confirm the bank card used during onboarding belongs to the verified user. |
| **Document Verification** | Verify document authenticity without requiring a selfie. |
| **Adverse Media Check** | Scan adverse media after each approved ID verification. |
| **Email Verification** | Verify customer's email address by sending a verification code. |
| **SMS Verification** | Verify customer's phone number by sending a verification code via SMS. |
| **KYC Questionnaire** | Allow creation of personalized questionnaires for user verifications. |
| **Age Estimation** | Estimate a user's age from a selfie, with an optional document check when the result is uncertain. |
| **Document Face Blocklist** | Cross-check ID document face images against a blocklist, flagging matches. |
| **Face Blocklist** | Cross-check verification face images against a blocklist, flagging matches. |
| **Document Data Blocklist** | Cross-check verification data against a blocklist, flagging matches. |
| **Video Sequencing** | Capture and save video sequences during image capture. |
| **Branding** | Allow logo, color, and font customization. |
| **IP Proxy Risk Check** | Detect proxy or VPN usage during ID Verification process. |
| **Mobile SDK** | Allow integration of the ID verification process using the mobile SDK. |
| **NFC** | Read NFC chips in ID documents for verification. |
| **Registry Center Check (eIDV)** | Check registry data in LT, HU, and US. |
| **LID (LT Only)** | Check if identity document is reported lost or stolen (LT only). |
| **Criminal Background Check** | Screens for potential criminal history. |
***
## AML
### Core AML Features
| Feature | Description |
| ---------------------------- | ---------------------------------------------------------------------------------------------------------------- |
| **AML Check** | Scan AML databases, including sanctions and PEP lists, for individuals and companies to prevent financial crime. |
| **Adverse Media Check** | Scan companies and individuals for adverse media. |
| **AML Monitoring** | Monitor companies and individuals against sanctions and PEPs lists. |
| **Adverse Media Monitoring** | Monitor companies and individuals for adverse media. |
***
## Business Verification
### Core Business Verification Features
| Feature | Description |
| ----------------------------------- | ------------------------------------------------------------------------ |
| **Company AML Check** | Check companies against sanctions lists. |
| **Audit Logs** | Keep all records and track changes on the dashboard. |
| **KYB AI Data Comparison** | Cross-check company information against databases to find discrepancies. |
| **Questionnaire** | Send customized questions to collect extra company data. |
| **KYB Risk Assessment** | Assess potential risks with customizable, no-code customer scoring. |
| **Credit Bureau Registries Report** | Download international credit bureau reports. |
| **Request to Update Information** | Ask for updated details to ensure ongoing due diligence. |
| **GOV Registries Report** | Download official government company reports. |
| **Companies House Report** | Download official UK Companies House reports. |
| **SOS Filings** | Order official SOS filing reports. |
| **AI Report** | Order company AI report. |
| **Company AML Monitoring** | Monitor the company against sanctions lists in real-time. |
| **Blocklist** | Restrict the company from performing verification. |
| **Address Audit** | Review the company's address to determine its legitimacy. |
| **Branding** | Change fonts, colors, or logos to match your personal brand. |
### Other Business Verification Features
| Feature | Description |
| ---------------------------------------- | --------------------------------------------------------------- |
| **Company Name Audit** | Assess the company's social profile and receive a risk level. |
| **Address Verification** | Verify if the address exists and evaluate its quality. |
| **Website Audit** | Assess the company's website address and receive a risk level. |
| **Company Beneficiaries AML Monitoring** | Monitor company beneficiaries against PEPs and sanctions lists. |
| **Company Brand AML Monitoring** | Monitor the company's brand name against sanctions lists. |
| **AI-Powered Proof of Address** | Verify a company's proof of address document. |
***
## Fraud Prevention
### Core Fraud Prevention Features
| Feature | Description |
| ------------------------------- | ----------------------------------------------------------------------- |
| **Phone Verification (SMS)** | Verify the customer's phone number by sending a code. |
| **Proxy** | Check customer's IP address and get its risk level. |
| **Fraud Estimation (Scoring)** | Estimate customer's fraud probability by analyzing various information. |
| **Phone Validation (Score)** | Calculate customer's phone number's risk score. |
| **KYC Risk Assessment** | Evaluate risks with customizable, no-code client scoring. |
| **KYB Risk Assessment** | Evaluate risks with customizable, no-code client scoring. |
| **Bank Verification (EU Only)** | Verify customer's IBAN and transactions. |
| **AI-Powered Proof of Address** | Verify customer's proof of address document. |
| **Address Verification** | Verify if the address exists and evaluate its quality. |
# Email Template Setup
Source: https://documentation.idenfy.com/guides/dashboard/setup/setup-email-templates
Create and configure email templates for new verification requests, data update requests, and completed companies in iDenfy KYB flows.
**Location:** **Business Verifications** → **Configurations** → **Email template**
There are three types of email templates: for new verification requests, for requests to update information, and for completed companies. The Business Verification (KYB) form link is sent by including it inside the template — either by pasting the raw session URL or the ready-made HTML.
Click **Create new**, then enter a unique name for the template. This name is only used to identify the template in later steps — it is not shown to recipients.
Choose which process the template applies to:
* **Send with a new verification request** — sends the new business verification session URL to your client.
* **Send with a request to update information** — sends the renewed business verification session URL to request an information update.
* **Send email for completed company** — sends the verification result to a company whose verification has completed.
Type the subject line that will appear in the recipient's inbox.
Type the body of the email, then click **Add verification link** to insert the placeholder for the verification session URL.
Without the verification link placeholder, the recipient has no way to reach the verification session — always include it before saving.
Click **Save** to make the template available for selection when sending verification or update requests.
# Additional Setup Options
Source: https://documentation.idenfy.com/guides/dashboard/setup/setup-others
Find additional setup guides for iDenfy business verification including bank verification, questionnaires, and custom flow options.
*The Business Verification Setup Guide* provides step-by-step instructions for configuring your dashboard to match your Business Verification needs. Follow the instructions on each page to customize your setup and access the insights you need.
### Business Verification Setup Guide Navigation
* [Bank verification on KYB](/guides/dashboard/kyb/bank-verification-on-kyb)
* [Identity Verification on KYB custom flow](/guides/dashboard/kyb/identity-verification-on-kyb-custom-flow)
**The Custom Rules** Setup page provides tools to help you automate your business processes. It also includes guidance on setting up a blocklist, allowing you to choose whether to take no action, flag or even block specific companies.
**The Questionnaire Template Setup** page allows you to create custom questionnaires with all the necessary questions needed to meet regulatory requirements or support your internal verification processes.
**Email Template Setup** page enables you to create custom email templates to simplify your business flow.
**The Configurations Setup** page provides guidance on setting up additional settings and selecting which options you want displayed.
**The Know Your Business** Custom Flow page outlines the steps to create a tailored business flow for performing Business Verifications.
# Workflow Setup Overview
Source: https://documentation.idenfy.com/guides/dashboard/setup/setup-workflow-overview
A step-by-step guide to every configurable step in a KYB verification workflow — what each one does, where to find it, and how to configure it.
A **workflow** is the verification sequence your clients move through. You pick which steps are active, configure each one, and the result is a tailored flow — from a quick 2-step check to a full KYB with UBO verification, bank data, and identity checks.
Risk, company info, directors, owners, representatives, bank, questionnaire, custom rules, identity verification, and sole proprietorship.
Toggle any step on or off. Disabled steps are skipped in the client-facing flow.
Create different workflows for different company types and route companies automatically with Dynamic Workflows.
***
## Getting to Workflows
Navigate to **Business Verifications → Configuration → Workflows**.
From this screen you can:
| Action | How |
| ----------------------------- | ---------------------------------------------------------------- |
| Create a new workflow | **Create New** button (top right) |
| Import a workflow file | **Import** button |
| Edit an existing workflow | Click **⋮** → **Edit** |
| Duplicate as a template | Click **⋮** → **Create a copy** |
| Set as default workflow | Click **⋮** → **Set as default** |
| Export for backup or transfer | Click **⋮** → **Export workflow** |
| Delete | Click **⋮** → **Delete** (blocked if verifications are attached) |
***
## Before You Start
Four of the steps below — Sole Proprietorship, Director Information, Representative Information, and Ownership Structure — collect the **people and entities behind the company**. Which roles you enable determines what clients can declare and which checks and automations fire.
[Stakeholder roles reference →](/guides/dashboard/kyb/stakeholder-roles)
***
## Configuring Steps
Inside the workflow editor, each step has a toggle in the top-right corner of its panel. Enable the steps you need — the rest are skipped.
The steps below follow the order they appear in the workflow editor.
***
Attach a pre-configured risk profile to automatically score the company.
Scores are calculated based on the rules and weights you defined in the risk profile. The profile must be created outside the workflow builder before adding this step.
**Prerequisite:** [How to set up Risk Assessment →](/guides/dashboard/risk/how-to-setup-and-configure-risk-assessment)
[Configure Risk Assessment step →](/guides/dashboard/risk/step-risk-assessment)
Define required company data fields, documents, and auto-fill settings.
Enable company search auto-fill via name or registration number, configure email verification, and set which fields and documents the company must provide.
* [Configure required fields →](/guides/dashboard/general/field-management-individuals-companies)
* [Configure required documents →](/guides/dashboard/general/document-management-individuals-companies)
[Configure Company Information step →](/guides/dashboard/kyb/step-company-information)
Collect IBAN details, account balances, and transaction history via open banking.
Covers 2,500+ European banks. Clients connect their bank account directly during the verification flow — no manual uploads required.
[Configure Bank Verification step →](/guides/dashboard/bank/step-bank-verification)
Collect owner-specific fields and documents for sole traders.
Tailor the verification form for sole proprietors with fields and documents that differ from standard company verification.
[Configure Sole Proprietorship step →](/guides/dashboard/kyb/step-sole-proprietorship)
Collect and verify details for company directors.
Configure whether identity verification is required for directors, handle corporate directors (companies acting as directors), and set custom fields and documents.
[Configure Director Information step →](/guides/dashboard/kyb/step-director-information)
Configure data and verification requirements for the company representative.
Set whether a representative is required, what data and documents they must provide, and whether identity verification applies to them.
[Configure Representative Information step →](/guides/dashboard/kyb/step-representative-information)
Declare shareholders and configure UBO verification thresholds.
Set ownership thresholds that trigger UBO checks and configure the depth of verification required for Ultimate Beneficial Owners.
[Configure Ownership Structure step →](/guides/dashboard/kyb/step-ownership-structure)
Collect source of funds, compliance answers, or custom data via a structured form.
Add one or more questionnaire sections to gather business-specific information from the company or its representatives during verification.
[Configure Questionnaire step →](/guides/dashboard/features/step-questionnaire)
Run automated risk and blocklist checks against the company.
Select and order the rules to apply. Rules run sequentially and flag or block companies based on the conditions you define.
**Prerequisite:** Rules must be created in [Custom Rules setup →](/guides/dashboard/risk/custom-rules) before they can be added here.
[Configure Custom Rules step →](/guides/dashboard/risk/step-custom-rules)
Embed KYC identity checks for directors, shareholders, and representatives.
Enable document scan and selfie/liveness verification for people within the KYB flow — no separate KYC session required.
[Configure Identity Verification step →](/guides/dashboard/kyc/identity-verification-in-workflow)
***
## Dynamic Workflows
Route companies to different workflows automatically based on their answers to a short screening questionnaire — for example, directing sole traders to a lighter flow and LTDs to a full KYB.
[Configure Dynamic Workflows →](/guides/dashboard/kyb/dynamic-workflows)
# Error Handling
Source: https://documentation.idenfy.com/guides/error-handling
Handle iDenfy API errors, webhook failures, and edge cases with HTTP status codes, common error fixes, and retry best practices guide.
## HTTP Status Codes
| Code | Meaning | Action |
| ----- | ------------ | ----------------------------------------------------------------------- |
| `200` | Success | Process the response |
| `400` | Bad request | Check request body — missing or invalid parameters |
| `401` | Unauthorized | Check your API Key and Secret |
| `403` | Forbidden | Your account lacks access to this endpoint or feature |
| `404` | Not found | Invalid endpoint URL or resource doesn't exist |
| `409` | Conflict | Duplicate `clientId` — this customer already has an active session |
| `429` | Rate limited | Slow down — wait and retry with exponential backoff |
| `500` | Server error | iDenfy issue — retry after a short delay, contact support if persistent |
## Common Errors and Fixes
**Cause:** Wrong API Key or Secret, or using sandbox keys against production (or vice versa).
**Fix:**
1. Verify your API Key and Secret in [Dashboard → Settings → API Keys](/guides/dashboard/settings/api-keys)
2. Ensure you're using the correct environment keys
3. Check that the `Authorization` header is correctly Base64-encoded as `key:secret`
**Cause:** You're generating a token for a `clientId` that already has an active verification session.
**Fix:**
* Use a unique `clientId` per verification attempt
* If your user needs to re-verify, either use a different `clientId` or wait for the previous session to expire
**Cause:** A required field is missing or a field value is invalid.
**Fix:**
* Check the [session parameters](/kyc/generate-token) for required fields and valid values
* Ensure `clientId` is a non-empty string
* Ensure country codes use ISO 3166-1 alpha-2 format
**Possible causes:**
1. Webhook URL not configured — check [Dashboard → Settings → Webhooks](/guides/dashboard/settings/system-notifications-webhooks-emails)
2. Your endpoint returned a non-2xx status — check server logs
3. Firewall blocking iDenfy IPs — whitelist our [IP ranges](/security/ip-whitelisting)
4. HTTPS certificate issue — ensure your cert is valid and not self-signed
5. Webhook still processing — manual reviews can take several minutes
**Cause:** Browser security policies restrict camera access in third-party iFrames.
**Fix:**
* Add `allow="camera; microphone"` to the iFrame tag
* Ensure your page is served over HTTPS
* Check that no `Permissions-Policy` header blocks camera access
* Some browsers (Safari) have stricter iFrame policies — test across browsers
## Retry Strategy
For transient errors (429, 500, network timeouts), implement exponential backoff:
```python theme={"system"}
import time
import requests
def call_with_retry(url, payload, auth, max_retries=3):
for attempt in range(max_retries):
response = requests.post(url, json=payload, auth=auth)
if response.status_code == 200:
return response.json()
elif response.status_code in (429, 500, 502, 503):
wait = 2 ** attempt # 1s, 2s, 4s
time.sleep(wait)
else:
response.raise_for_status()
raise Exception(f"Failed after {max_retries} retries")
```
## Full Error Reference
See [ID Error Messages](/kyc/id-error-messages) for the complete list of error codes and their descriptions.
# Sample Documents
Source: https://documentation.idenfy.com/guides/sample-documents
Download iDenfy sample ID documents and test images to simulate approved, denied, and suspected verification outcomes in your sandbox integration.
iDenfy provides dummy documents for easier testing and integration.
Some security features are disabled for the documents listed below. Use them only in [testing and development environments](/environments).
If a verification is denied or suspected due to *Doc spoof detected*, passive liveness should be turned off to receive successful results.
## Download All Samples
Contains all sample passport and face images for every test scenario below.
***
## Flow with `APPROVED` Auto Results
Use these resources to complete a normal verification flow that results in a successful automatic verification.
Use this JSON body in your [session creation](/kyc/generate-token) request:
**Token generation request body:**
```json theme={"system"}
{
"clientId": "00000000",
"firstName": "John",
"lastName": "Sample Butch"
}
```
**Expected response:**
```json theme={"system"}
{
"overall": "APPROVED",
"suspicionReasons": [],
"mismatchTags": [],
"fraudTags": [],
"autoDocument": "DOC_VALIDATED",
"autoFace": "FACE_MATCH"
}
```
***
## Flow with `DENIED` — `FACE_MISMATCH` Results
**Expected response:**
```json theme={"system"}
{
"overall": "DENIED",
"suspicionReasons": [],
"mismatchTags": [],
"fraudTags": [],
"autoDocument": "DOC_VALIDATED",
"autoFace": "FACE_MISMATCH"
}
```
***
## Flow with `DENIED` — `DOC_EXPIRED` Results
**Expected response:**
```json theme={"system"}
{
"overall": "DENIED",
"suspicionReasons": [],
"mismatchTags": [],
"fraudTags": [],
"autoDocument": "DOC_EXPIRED",
"autoFace": "FACE_MATCH"
}
```
***
## Flow with `DENIED` — `DOC_FAKE` Results
**Expected response:**
```json theme={"system"}
{
"overall": "DENIED",
"suspicionReasons": [],
"mismatchTags": [],
"fraudTags": [],
"autoDocument": "DOC_FAKE",
"autoFace": "FACE_MATCH"
}
```
***
## Flow with AML `SUSPECTED` Results
If the AML setting for returning same-nationality results is enabled, this document will not be suspected. Contact support via the [dashboard](https://admin.idenfy.com/auth/login) to check or change this setting.
Use this JSON body in your [session creation](/kyc/generate-token) request:
**Token generation request body:**
```json theme={"system"}
{
"clientId": "00000000",
"firstName": "Manfred",
"lastName": "Weber"
}
```
**Expected response:**
The document and face are valid, but the person matches an AML database entry, so the overall status is `SUSPECTED`.
```json theme={"system"}
{
"overall": "SUSPECTED",
"suspicionReasons": ["AML_SUSPECTION"],
"mismatchTags": [],
"fraudTags": ["AML_SUSPECTION"],
"autoDocument": "DOC_VALIDATED",
"autoFace": "FACE_MATCH"
}
```
***
Test these documents only in development or testing environments. Images should be uploaded using the [Direct API processing](/kyc/direct-processing) endpoint or during a verification session in the iDenfy UI. Image upload permissions are required — contact tech support via the [dashboard](https://admin.idenfy.com/auth/login) to enable upload functionality for your testing environment.
# Testing and Sandbox
Source: https://documentation.idenfy.com/guides/testing-sandbox
Test your iDenfy integration with dummy verification results in the sandbox environment before going live with real users and documents.
## How to Test
iDenfy uses the same API URL for sandbox and production. Your API key determines which mode you're in.
Your sandbox keys are in [Dashboard → Settings → API Keys](/guides/dashboard/settings/api-keys).
Use one of these to inspect incoming webhooks:
```bash theme={"system"}
# Option 1: webhook.site (no setup)
# Go to https://webhook.site — you get a unique URL immediately
# Option 2: ngrok (tunnels to localhost)
ngrok http 3000
# Use the https URL it gives you
```
Paste the URL in [Dashboard → Settings → Webhooks](/guides/dashboard/settings/system-notifications-webhooks-emails).
```bash theme={"system"}
curl -X POST https://ivs.idenfy.com/api/v2/token \
-u "SANDBOX_API_KEY:SANDBOX_API_SECRET" \
-H "Content-Type: application/json" \
-d '{"clientId": "test-001"}'
```
Use the [Sample Verification](/guides/dashboard/kyb/verification-sandbox-and-testing) feature in your Dashboard to generate mock results with predefined outcomes — no real documents needed.
***
## Simulating Different Outcomes
Use [Dummy Results](/kyc/dummy-results) to trigger specific verification statuses:
| Outcome | What to test in your app |
| ------------- | --------------------------------------------------- |
| **APPROVED** | Happy path — user gets access |
| **DENIED** | Show rejection message, offer retry |
| **SUSPECTED** | Check `fraudTags` / `mismatchTags`, make a decision |
| **EXPIRED** | Token timed out — prompt re-verification |
For AML screening, use [AML Dummy Results](/aml/dummy-results) to trigger sanctions/PEP matches.
***
## Go-Live Checklist
Before switching to production keys:
* [ ] **Webhooks** — all statuses handled (`APPROVED`, `DENIED`, `SUSPECTED`, `EXPIRED`)
* [ ] **Error handling** — graceful responses for 400, 401, 403, 429, 500
* [ ] **Token expiry** — tested what happens when user returns after session expires
* [ ] **Callback signing** — [HMAC verification](/security/callback-signing) implemented
* [ ] **IP whitelisting** — [iDenfy IPs whitelisted](/security/ip-whitelisting) on your webhook endpoint
* [ ] **Data storage** — `scanRef` stored in your database for each verification
* [ ] **Production webhook URL** — configured in Dashboard
* [ ] **Production API keys** — generated and stored securely (env vars, not code)
The most common go-live issue: **webhook endpoint returns non-2xx**. iDenfy retries, and in the meantime the user sees a "failed" redirect even though verification may have succeeded. Test your webhook endpoint thoroughly.
# Webhooks Overview
Source: https://documentation.idenfy.com/guides/webhooks-overview
Understand how iDenfy webhooks deliver verification results via HTTP POST, including setup, payload structure, and retry handling.
## How Webhooks Work
When a verification completes (or changes status), iDenfy sends an HTTP POST request to your configured webhook URL with the verification result.
```
Customer completes verification
↓
iDenfy processes (AI + human review)
↓
POST webhook to your endpoint
↓
Your server processes the result
```
## Setting Up Webhooks
1. Go to [Dashboard → Settings → Webhooks](/guides/dashboard/settings/system-notifications-webhooks-emails)
2. Enter your webhook URL (must be HTTPS)
3. Select which events to receive
Your webhook endpoint must respond with a **2xx status code** within **10 seconds**. If it doesn't, iDenfy will retry the delivery.
## Webhook Types
| Service | Webhook docs | Key statuses |
| ------------- | -------------------------------------------- | -------------------------------------------- |
| **KYC** | [KYC Webhooks →](/kyc/webhooks) | APPROVED, DENIED, SUSPECTED, EXPIRED |
| **KYB** | [KYB Webhooks →](/kyb/webhooks) | Company verification results |
| **AML** | [AML Monitoring →](/aml/monitoring-retrieve) | Hit/no-hit on sanctions, PEPs, adverse media |
| **Bank Card** | [Bank Card Webhooks →](/bank-card/webhooks) | MATCH, NO\_MATCH, NOT\_COMPARED |
## Webhook Timing
iDenfy sends webhooks at different stages:
| Timing | When | Contains |
| ----------- | ---------------------------------- | ----------------------------- |
| **Instant** | Customer completes verification UI | Auto-check results (AI) |
| **Prompt** | Within minutes | Manual review results (human) |
| **Delayed** | Monitoring triggers | Ongoing AML monitoring hits |
The `final` field in the webhook payload indicates whether this is the definitive result. When `final: true`, iDenfy will not send any further webhooks for this verification.
## Security
Always verify webhook authenticity:
1. **[Callback signing](/security/callback-signing)** — verify the HMAC signature on every webhook
2. **[IP whitelisting](/security/ip-whitelisting)** — only accept requests from iDenfy's IP ranges
## Best Practices
* **Process asynchronously** — acknowledge the webhook immediately (return 200), then process in the background
* **Handle duplicates** — use `scanRef` as an idempotency key
* **Log everything** — store the full webhook payload for debugging and compliance
* **Handle retries** — if your endpoint is temporarily down, iDenfy will retry
* **Verify signatures** — never trust an unsigned webhook in production
# Adobe Commerce
Source: https://documentation.idenfy.com/integrations/adobe-commerce
Install, configure, and manage the iDenfy identity verification plugin for Adobe Commerce with step-by-step setup and upgrade guides.
This guide explains how to connect and set up iDenfy with Adobe Commerce solutions. Below you will find step-by-step instructions on how to install, upgrade, and uninstall the iDenfy plugin.
Before installing the extension, please make sure to **back up your website and database**. We also recommend testing the extension before installing it in your production environment.
## Installation
There are two main ways to install the module:
1. Go to the [Adobe Commerce Marketplace](https://commercemarketplace.adobe.com) and order the free iDenfy extension. You need to be logged into your Marketplace account to complete the order.
2. Open the terminal and in your project's directory run the following commands:
```bash theme={"system"}
$ php bin/magento maintenance:enable
> composer require idenfy/module-customer-verification
```
You may be prompted to enter your username and password. If so, provide your [Adobe Commerce authentication keys](https://experienceleague.adobe.com/en/docs/commerce-operations/installation-guide/prerequisites/authentication-keys).
3. Next, run these commands:
```bash theme={"system"}
$ php bin/magento setup:upgrade
> php bin/magento setup:di:compile
> php bin/magento setup:static-content:deploy -f
> php bin/magento cache:clean
> php bin/magento maintenance:disable
```
Visit the [GitHub repository](https://github.com/idenfy/idenfy-magento) for additional information.
1. Add the repository to your composer file and require the package:
```bash theme={"system"}
$ composer config repositories.idenfy git https://github.com/Skullsneeze/idenfy-magento2.git
> composer require idenfy/module-customer-verification
```
2. Enable the extension:
```bash theme={"system"}
$ php bin/magento module:enable Idenfy_CustomerVerification
> php bin/magento setup:upgrade
> php bin/magento setup:di:compile
> php bin/magento setup:static-content:deploy -f
```
You may be prompted to enter your username and password. If so, provide your [Adobe Commerce authentication keys](https://experienceleague.adobe.com/en/docs/commerce-operations/installation-guide/prerequisites/authentication-keys).
## Configuration
**Requirements:**
* Live **production environment** (available via the [Pricing page](https://idenfy.com/pricing-plans-v2/))
* **API key** and **API secret** -- generated via the [dashboard](/guides/dashboard/settings/api-keys)
* **Webhook** setup on the iDenfy admin [dashboard](https://admin.idenfy.com/settings/v2/system-notifications)
### Configure API Credentials
Go to the configuration section (**Stores > Configuration > IDENFY > API configuration**) and enter your [API credentials](/guides/dashboard/settings/api-keys) and save them.
### Configure Webhook Notifications
Go to the iDenfy admin dashboard (**Settings > System notifications**) and set up the callback URL for your store.
* **Notification type:** `Webhook`
* **Receiver:** `https:///rest/default/V1/idenfy/process-verification`
* **Type:** `ID_VERIFICATION_AUTO_FINISHED`
If you want to set up manual verification, create the same notification with the `ID_VERIFICATION_MANUAL_FINISHED` type.
### Verify the Integration
After successfully setting up webhook notifications and saving the API credentials, your customers should see the verification button and be able to perform identity verification before paying for the order.
All customer verifications will be visible in **IDENFY > Idenfy Customer Verification**.
# Magic Link
Source: https://documentation.idenfy.com/integrations/magic-link
Send verification links to customers via email or SMS using iDenfy Magic Link for identity verification without any code integration.
## Overview
Magic Link lets you send a verification URL directly to your user via email or SMS. The user clicks the link, completes verification on iDenfy's hosted page, and you receive results via webhook. No coding required.
***
## Reusable Magic Links (Dashboard)
Reusable Magic Links are specialized URLs that allow users to start identity verification immediately without needing to log in or create an account. They act as shareable "entry passes" that redirect the user directly into your defined verification flow.
| Feature | Description |
| -------------- | ----------------------------------------------------------------------------------------------------- |
| **Single-use** | The link becomes invalid after one successful verification. Ideal for individual user invites. |
| **Multi-use** | The link remains active for a specific number of times (e.g., 100 uses). Best for limited campaigns. |
| **Unlimited** | The link remains active indefinitely until it is manually deactivated or reaches its expiration date. |
| **Expiration** | An optional setting to automatically disable the link after a specific date and time. |
**Usage Logic & Limitations**
* **Clicks count as usage**: Every click reduces the link's limit, even if the user quits early. You are only billed for *completed* verifications.
* **No renewals**: Links cannot be extended or refreshed. Once a link expires or hits its limit, you must create a new one.
When a user clicks the Magic Link, the system performs a background check to ensure the link is active and your account has sufficient credits.
1. **Validation**: If valid, a new verification session is created automatically.
2. **Redirection**: The user is taken directly to the verification flow.
3. **Completion**: The user uploads documents/selfies without entering passwords.
### How to Create a Reusable Magic Link
Log in to your dashboard. From the left-hand menu, go to **ID Verification** → **Configuration** → **Magic Link**.
Click **Create New Magic Link**.
* **Name**: Internal identifier to help you recognize this link.
* **Verification Flow**: Select which steps the user must complete (e.g., Document Verification, Selfie, or both).
* **Usage Limit**: Choose between Single-use, Multi-use, or Unlimited.
* **Expiration**: (Optional) Set a date and time for the link to stop working.
* **Language**: Pre-select the interface language for the user.
Click **Save** to create the link. Copy the URL and share it via email, SMS, or embed it on your website.
***
## Receiving Results
Results can be viewed in real-time in the **iDenfy Dashboard**. Alternatively, you can receive updates via [webhook](/kyc/webhooks).
***
## When to Use Magic Link
| Use Case | Recommended Type | Why |
| ----------------------- | -------------------------- | ------------------------------------------- |
| **Bulk Campaigns** | Reusable (Unlimited/Multi) | One link for all users, easy to manage. |
| **Personal Invites** | Reusable (Single-use) | Security for one-on-one onboarding. |
| **App Integration** | Dynamic (API) | Programmatically generate unique sessions. |
| **Manual Verification** | Dynamic (Dashboard) | Quick one-off link for a specific customer. |
| **Physical Marketing** | Reusable (Unlimited) | Perfect for QR codes on flyers or posters. |
# No-Code Integrations
Source: https://documentation.idenfy.com/integrations/overview
Add iDenfy identity verification to Shopify, WordPress, WooCommerce, Adobe Commerce, or Zapier with ready-made no-code plugin setups.
iDenfy offers ready-made plugins for popular e-commerce and automation platforms. These integrations let you add identity verification to your workflow without writing any code.
Send a verification link via email or SMS. No coding needed.
Add age and identity verification to your Shopify store.
Verify users on your WordPress site with a simple plugin.
Require identity verification at checkout or registration.
Integrate iDenfy into your Adobe Commerce (Magento) store.
Connect iDenfy to thousands of apps through Zapier automations.
# Shopify
Source: https://documentation.idenfy.com/integrations/shopify
Add identity verification to your Shopify store. Choose when to verify, who to verify, and what happens after — all from the Shopify Admin, no code required.
## Overview
The iDenfy Shopify app embeds identity verification directly into your store. Decide **when** customers verify (4 flows), **who** is asked (conditional triggers), and **what happens after** (order holds, auto-refunds, emails) — all from the Shopify Admin.
One-click install with automatic permission setup.
Account, cart, checkout, or post-purchase.
Cart value, region, risk score, products, collections.
Hold, release, and refund orders based on KYC.
***
## How It Works
The Shopify app combines a Shopify Admin app (built on Remix + Polaris), a Theme App Extension (Liquid), and a Checkout/Customer Account UI extension (React). When a verification trigger fires, the storefront fetches a one-time `authToken` from iDenfy, opens iDenfy's hosted UI, and writes the result back onto the Shopify customer and order via metafields, tags, and notes.
**You don't need to manage any of the moving parts** — the app handles tokens, webhooks, geolocation, holds, and refunds. This section is here so you know what to look for when something doesn't behave as expected.
***
## Quick Start
**Requirements**
* Active iDenfy **production environment** ([see pricing](https://idenfy.com/pricing-plans-v2/))
* iDenfy **API key** and **secret** ([Dashboard → Settings → API Keys](/guides/dashboard/settings/api-keys))
* A Shopify store on any plan that supports apps and theme editing
Install from the [Shopify App Store](https://apps.shopify.com/idenfy-id-verification) and approve the requested permissions (customers, orders, products, collections, fulfillment).
On first install the app pulls your existing **collections, products, and customers** into its database so they can be used in trigger rules.
Open the **iDenfy Admin** page inside Shopify and connect using one of two methods:
Sign in with your iDenfy credentials — the API key is fetched automatically and rotated by iDenfy.
Paste the **API Key** and **API Secret** from [Dashboard → Settings → API Keys](/guides/dashboard/settings/api-keys).
The API secret is encrypted in storage and **cannot be read back** after saving. Save a copy somewhere safe before pasting.
Pick exactly **one** flow — see [Verification Flows](#verification-flows) below for the trade-offs. Your choice is also written to a shop metafield so theme extensions can read it at runtime.
On the [iDenfy Dashboard → Webhooks](https://admin.idenfy.com/settings/v2/system-notifications), add an **ID verification auto finish** webhook.
* **Receiver:** `https://shopify.idenfy.com/api/sdk/verification/webhook`
* **Signing key:** the same API key you connected with above
The Shopify app verifies every incoming webhook signature against this key.
Without the correct signing key, webhooks are rejected and verification results will not appear in your store.
Open **Online Store → Themes → Customize** and enable the extension that matches your chosen flow. See [Theme & UI Setup](#theme-&-ui-setup).
***
## Verification Flows
You pick **one** flow per store. Each flow controls *where* the verify button appears and *when* the customer is asked.
| Flow | Where the button appears | Best for |
| ------------------- | ------------------------------------ | ----------------------------------------------------- |
| **Account page** | Customer account page (Legacy & new) | Pre-qualify customers before they can check out |
| **Before checkout** | Cart page or cart drawer | Block checkout until verified |
| **During checkout** | The checkout page itself | Verify mid-checkout without leaving Shopify |
| **After checkout** | Thank-you & Order-status pages | Let purchase complete, then verify (with hold/refund) |
The verification button is shown on the customer account page. The checkout button is hidden site-wide until the customer is verified. If they are already verified, a success badge is shown.
The verification button replaces the cart and checkout buttons whenever the cart matches a trigger rule. The check re-runs whenever the cart contents change.
The verification button appears on the checkout page itself via a Checkout UI extension. Checkout progress is blocked until verification succeeds.
The order completes normally; the customer is prompted to verify on the **Thank-you** and **Order status** pages. Combined with [Order State Management](#order-state-management), this enables hold-and-refund behavior.
**Flow-restricted features.** A few features are *only* available in the After-checkout flow because they need the order or shipping address to exist first:
* Risk-factor triggering
* Regional minimum age limits
* Order State Management (hold + auto-refund)
* The "Shipping address" geolocation method
***
## Theme and UI Setup
Once a flow is picked, enable its matching extension in **Online Store → Themes → Customize**.
The Liquid **iDenfy ID button** app-embed block is injected at the body level.
**Block settings:**
| Setting | Purpose |
| ---------------------------------------------- | -------------------------------------------------------------------------------------------------------------- |
| **CTA text** | Label on the verify button. |
| **Geolocation permission notice / retry text** | Shown when the browser blocks geolocation. |
| **Checkout button selector** | CSS selector for the theme's checkout button, so the app can hide it. Comma-separated for multi-theme support. |
| **Cart alter buttons selector** | CSS selector for cart add/remove buttons, so KYC is re-evaluated when the cart changes. |
| **Account (Legacy) button selector** | CSS selector used to anchor the verify button on the legacy account page. |
The block exposes CSS variables you can override in your theme stylesheet to match your brand.
```css theme={"system"}
:root {
--idenfy-modal-desktop-width: 60vw;
--idenfy-modal-desktop-height: 90vh;
--idenfy-modal-mobile-width: 100vw;
--idenfy-modal-mobile-height: 90vh;
--idenfy-modal-backdrop: rgba(0, 0, 0, 0.5);
--idenfy-btn-min-width: 160px;
--idenfy-btn-font-size: 16px;
--idenfy-btn-line-height: 1.5;
--idenfy-btn-padding: 10px 24px;
--idenfy-btn-border-radius: 5px;
--idenfy-btn-bg-color: #28a745;
--idenfy-btn-text-color: white;
--idenfy-btn-bg-color-hover: #218838;
--idenfy-btn-text-color-hover: white;
--idenfy-error-text-color: #c70a24;
--idenfy-message-font-size: 14px;
--idenfy-message-padding: 4px 16px;
--idenfy-message-margin: 16px 0;
--idenfy-message-border-radius: 5px;
--idenfy-message-success-bg-color: #28a745;
--idenfy-message-info-bg-color: #ffb800;
--idenfy-message-info-text: black;
--idenfy-message-success-text: white;
}
```
A React extension that targets four storefront surfaces.
| Surface | Where it renders |
| -------------------------------------------- | ------------------------------- |
| `purchase.checkout.block.render` | Checkout page |
| `purchase.thank-you.block.render` | Thank-you page |
| `customer-account.order-status.block.render` | Order status page |
| `customer-account.profile.block.render` | Customer profile (new accounts) |
**Setup:**
In the theme editor, change the dropdown to **Checkout and customer accounts**.
Add it to the **Thank you**, **Profile**, and **Order status** pages.
Click each extension instance to pick exactly where on the page it should appear.
You can also set a "**Paragraph above button**" message shown directly above the Verify Identity button.
Styling is limited here — Checkout/Account UI extensions render in a sandboxed React environment that does not support arbitrary CSS overrides.
***
## Triggering Rules
In the **ID Verification flow** card you can layer multiple conditional triggers. The customer is asked to verify only when at least one rule matches.
| Rule | Description | Flow restriction |
| --------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------- |
| **Daily money limit** | Customer's total ordered amount today reaches the limit. | All flows |
| **Monthly money limit** | Same, month-to-date. | All flows |
| **Daily order count** | Trigger after N orders today. | All flows |
| **Monthly order count** | Same, month-to-date. | All flows |
| **By region** | Trigger for customers in specific countries or US states. Detected via **browser geolocation** or **shipping address**. | Shipping-address detection is *after-checkout only* |
| **By risk factor** | Trigger when the order's Shopify risk score reaches `low` / `medium` / `high`. Optional "trigger when no risk factor yet" checkbox. | *After-checkout only* |
| **By product / collection** | Narrow *all the above* triggers to carts containing specific products or collection items. | All flows |
* The storefront requests the browser's coordinates via the [Geolocation API](https://developer.mozilla.org/en-US/docs/Web/API/Geolocation_API).
* Coordinates are POSTed to `/apps/sdk/geolocation` and stored as customer metafields (`idenfy.geolocation_latitude`, `idenfy.geolocation_longitude`, `idenfy.geolocation_date`).
* Coordinates older than \~5 min on the cart page are refreshed automatically. Coordinates older than 1 hour are flagged in logs but still used.
* The server uses PostGIS geometry to check whether the coordinates fall inside any of the configured countries or US states.
### Identity Constraints
Separate from triggers, the following identity constraints apply to *every* verification:
| Constraint | Description | Flow restriction |
| ------------------------------------- | ----------------------------------------------------------------------------------------- | ------------------- |
| **Name must match identity document** | iDenfy fails the verification if the Shopify-provided name does not match the document. | All flows |
| **Global minimum age** | Minimum age applied to every verification. | All flows |
| **Regional minimum age** | Per-country and per-state minimum age. Age is computed from the document's date of birth. | After-checkout only |
***
## Order State Management
Available **only** in the After-checkout flow.
When **Automatically manage Shopify's order state** is enabled:
If any KYC rule matches the order, the app puts the order's fulfillment **on hold** immediately.
The customer sees the verify button on the Thank-you and Order-status pages. Optionally, an email is sent.
If KYC returns `APPROVED`, the hold is released and the order proceeds to fulfillment automatically.
If verification is not completed within the configured **Order refund timeframe** (1 hour – 4 weeks), a cron job cancels the order and refunds the customer.
Two optional transactional emails are configurable here:
* **Ask Complete KYC** — sent while the order is on hold.
* **Order Cancelled** — sent when the order is auto-cancelled.
***
## Email Notifications
The app can send up to four transactional emails:
| Email | Sent when | Available in |
| ------------------------------- | -------------------------------------------------- | --------------------------------------- |
| **Ask Complete KYC** | Order placed and held for verification | After-checkout (Order State Management) |
| **Order Cancelled** | Order auto-cancelled after timeframe expires | After-checkout (Order State Management) |
| **Successful KYC verification** | Webhook returns `APPROVED` | All flows |
| **Failed KYC verification** | Webhook returns `DENIED` / `SUSPECTED` / `EXPIRED` | All flows |
### Custom Sender Identity
By default, emails are sent from iDenfy's shared address. You can configure a custom domain via [Resend](https://resend.com/):
Open **Configure custom email sender identity**. Enter a username (e.g. `noreply`), domain, and AWS region (`us-east-1`, `eu-west-1`, `sa-east-1`, or `ap-northeast-1`).
Open **Verify custom email sender identity**. Add the DNS records shown to your domain registrar. Resend verifies the records on its side.
Once verified, an **Edit email template** button appears for each email type. You can customize both the text and HTML bodies.
Variable availability depends on the email type:
| Variable | Available in |
| --------------------------- | ----------------------------------------------------------- |
| `{firstName}`, `{lastName}` | All emails |
| `{orderNumber}` | All order-bound emails |
| `{orderStatusPageUrl}` | Ask Complete KYC |
| `{timeframe}` | Ask Complete KYC |
| `{reason}` | Failed KYC |
| `{manageOrderState}` | Successful KYC (inserted when Order State Management is on) |
Custom templates can only be **saved** while a verified custom identity exists, but they are **kept in the database** if you later reset the identity — so re-verifying won't lose your work.
***
## Customer and Order Records
After every verification, the app writes the result onto Shopify.
### Customer Record
| Field | Type | Meaning |
| ---------------------------- | --------------------------- | ----------------------------------------------------------------------------------------------------------- |
| `idenfy.is_verified` | metafield (boolean) | `true` if `APPROVED`. The source of truth across the app. |
| `idenfy.verification_status` | metafield (text) | `APPROVED` / `DENIED` / `SUSPECTED` / `EXPIRED` |
| `idenfy.scan_ref` | metafield (text) | iDenfy verification reference |
| `idenfy.fraud_tags` | metafield (text) | Comma-separated fraud flags from iDenfy |
| `idenfy.mismatch_tags` | metafield (text) | Comma-separated mismatch flags |
| `idenfy.geolocation_*` | metafield (number/datetime) | Last submitted geolocation (when geolocation triggering is on) |
| Tag | string | Exactly one of `idv-approved`, `idv-denied`, `idv-suspected`, `idv-failed`, `idv-expired`, `idv-unverified` |
Captured email or phone from the verification is also saved into the customer record when available.
### Order Record
When verification is tied to an order (Before checkout with a logged-in customer, During checkout, or After checkout):
* **Order Notes** — the app appends a line summarizing status, scan reference, and any fraud / mismatch tags.
* **Order Tags** — the same `idv-` tag is added.
* **Fulfillment hold / release** — automatic, under Order State Management.
* **Order cancellation & refund** — automatic, if the order remains unverified past the configured timeframe.
If the customer was **not logged in** during verification (guest checkout in the Before-checkout flow), only the order is updated. The app has no Shopify customer record to write to.
***
## Additional Settings
* **Automatically delete customer scan references** — when a customer is deleted in Shopify, their iDenfy scan reference is also deleted via the iDenfy API.
* **Customer scan-ref removal table** — a searchable, paginated list of customers with an `idenfy.scan_ref` metafield. You can manually delete a scan reference; the metafield is then replaced with `"Deleted on iDenfy Dashboard"` so the action is visible in the customer record.
***
## Reference
### Verification Statuses
| iDenfy status | Customer/order tag | Meaning |
| ------------- | ------------------ | ----------------------------------------------- |
| `APPROVED` | `idv-approved` | Verified successfully |
| `DENIED` | `idv-denied` | Failed verification |
| `SUSPECTED` | `idv-suspected` | Verified but flagged for manual review |
| `EXPIRED` | `idv-expired` | Verification session expired without completion |
| `FAILED` | `idv-failed` | Internal/system failure |
| *(none yet)* | `idv-unverified` | Session started, no result yet |
A `SUSPECTED` result returned during checkout triggers a banner asking the customer to retry.
### Troubleshooting
The signing key on the iDenfy Dashboard webhook **must be identical** to the API key the Shopify app is connected with. Mismatch causes every webhook to be rejected and no verifications will appear in the store. Re-paste the key on the iDenfy Dashboard if results stop appearing.
Verification triggered by **By region** with browser geolocation requires the customer to grant location permission. The block has configurable "geolocation permission notice" and "retry" copy — make sure those are translated and visible. If the customer denies permission, no coordinates are submitted and the region rule cannot fire.
On the Thank-you page the app may briefly show an "order not ready" message while Shopify finishes writing the order. The page polls automatically; no action is required.
`SUSPECTED` means iDenfy verified the identity but flagged the result for human review. By default these customers are *not* treated as verified — they appear with the `idv-suspected` tag and Order State Management keeps the order on hold until the status is changed on the iDenfy Dashboard.
If your theme uses non-standard CSS classes for the checkout or cart buttons, the default selectors will miss them. Update the **Checkout button selector** and **Cart alter buttons selector** in the app-embed block settings (comma-separated CSS selectors are supported).
***
## What's Next?
Tune document types, liveness, languages, and branding for everything triggered from Shopify.
Full payload spec for the verification results the app receives.
Simulate APPROVED / DENIED / SUSPECTED results before going live.
WooCommerce, Adobe Commerce, WordPress, Zapier.
# WooCommerce
Source: https://documentation.idenfy.com/integrations/woocommerce
Install and configure the iDenfy identity verification plugin for WooCommerce with step-by-step setup, configuration, and usage guides.
This guide explains how to connect and set up iDenfy with WooCommerce. Below you will find step-by-step instructions on how to use the iDenfy plugin.
Before using the iDenfy plugin, you must first [install WooCommerce](https://woocommerce.com/document/installing-uninstalling-woocommerce/), as it is a required component.
## iDenfy Plugin
### Download the Plugin
Download the plugin from the provided .zip file or find the plugin in the official WordPress and WooCommerce stores and install it from there.
[Download the plugin zip file](https://drive.google.com/file/d/1MeFQLlWwxhu-niLPwG919fEtCgRwwgUM/view).
You will be navigated to Google Drive where you can click the **Download** button at the top right corner to start downloading. Once the download is finished, you will need the file for plugin installation during the next steps.
### Install the Plugin
**Install the plugin:** Locate the file that was downloaded and upload it via **Plugins > Add New > Upload Plugin** in your WordPress admin panel.
**Activate the plugin:** After installation, activate the plugin.
**Manage settings:** Navigate to **WooCommerce > Settings > Idenfy**.
### Configure Main Settings
#### API Settings
Provide your [iDenfy API credentials](/guides/dashboard/settings/api-keys) to enable the plugin.
#### Configuration Settings
Select the flow that best suits your business logic:
| Flow | Description |
| ---------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Before checkout | The plugin shows the verification modal to the user before they enter the checkout page and process the order. |
| After registration | The plugin shows the verification modal to the user after they register on the /my-account page. |
| After registration in landing page | Works the same as Before checkout flow, but only follows the rules set by an admin. Verification can be forced if a custom cart threshold is met or the customer has specific products/categories/tags that require verification. |
#### General Settings
| Setting | Description |
| --------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Match name on identity document | Adds a constraint for matching the customer's name and surname provided in your store to the verification service. Adds an extra layer of security. |
| Accept SUSPECTED verifications | Some verifications can be marked as SUSPECTED. Enabled by default to allow SUSPECTED customers to shop, however the order status will be marked as Suspected by iDenfy. |
| Custom URL on failed verification | Provide a custom URL to redirect customers that fail verification. Can be used to provide instructions or contact information. |
**Match name on identity document** should be **turned off** if the verification button display is set to "After registration", since there is no user data available to perform cross-matching.
### Manage Users in WordPress Panel
You can check and manage all users and their statuses by navigating to **Users > All Users**. You will find an **iDenfy Verification** column with the status of each user.
You can also manually set the verification status for each customer by selecting and editing a specific user.
# WordPress
Source: https://documentation.idenfy.com/integrations/wordpress
Add iDenfy identity verification to your WordPress site with the official plugin including step-by-step installation and configuration.
This guide explains how to connect and set up iDenfy with WordPress. Below you will find step-by-step instructions on how to use the iDenfy plugin.
## iDenfy Plugin
### Install and Activate the iDenfy Plugin
Log in to your WordPress panel, navigate to **Plugins** and search for the iDenfy plugin. Click **Install Now** and once it is downloaded click **Activate**.
### Authorize Connection
Once the plugin is activated, navigate to **iDenfy > Settings**.
To successfully connect and grant access to iDenfy, you need to complete authorization. You can manage your environment API key(s) and secret(s) on iDenfy's side by navigating to [Settings > API keys](/guides/dashboard/settings/api-keys).
### Implement the Verification Button
When the authorization step is finished, you can copy the shortcode.
Navigate to the page that should have the verification button, select **Add block > Shortcode** and paste the iDenfy code.
Upon reviewing the page, you should find that the button is available and functioning properly.
### Redirect User After Verification
When verification is finished, you can redirect users to your site based on verification results (instantly after automatic check or later, after manual review). More information on [how redirect works](/kyc/generate-token#session-parameters). You can configure the success and/or failed URL by navigating to **Settings > Configuration > General** in the dashboard.
You can handle/manage users in WordPress by navigating to **All users > Idenfy verifications**.
## Editing Button Appearance
You can edit the appearance of the button by visiting the `style.css` of the plugin in the **Plugin File Editor**:
1. Log in to your WordPress admin dashboard.
2. Navigate to **Plugins** in the left-hand menu.
3. Click **Plugin File Editor** (or **Editor**).
4. Select the plugin from the dropdown menu in the upper right.
5. The plugin's files will be displayed in the editor.
## Detailed Video Guide
# Zapier Integration
Source: https://documentation.idenfy.com/integrations/zapier
Set up the iDenfy Zapier integration to automate identity verification workflows with step-by-step connection and Shopify example.
This guide explains how to connect and set up Zapier with iDenfy. Below you will find step-by-step instructions on how to create a Zapier connection with iDenfy, including an example of a Shopify-iDenfy integration (though you can connect any Zapier-supported application with iDenfy).
## Zapier Connection
### Register and Log in to Zapier
Complete the registration in the [Zapier](https://zapier.com/) platform and start a new project. Related topics you might want to explore:
* [Automations/zaps basics](https://zapier.com/resources/guides/quick-start/automation-basics)
* [Create your first Zap](https://zapier.com/resources/guides/quick-start/create-zap)
### Create a New Automation/Zap
Once logged in, navigate to the top-left and click **+ Create**, then **Zaps**.
Alternatively, you can explore and use the pre-made [Zapier templates](https://zapier.com/apps/idenfy/integrations), such as iDenfy-Shopify.
### Authorize the Connection to iDenfy
When a new iDenfy step is created, after completing the **App & event** section, proceed to the **Account** tab and click **Log in**.
The action number and event selected on the App & event tab do not matter for this step -- it is intended to explain how to authorize Zapier to connect to iDenfy.
To complete authorization successfully, provide:
* **API key** as **Username**
* **API secret** as **Password**
You can manage your environment API key(s) and secret(s) on iDenfy's side by navigating to [Settings > API keys](/guides/dashboard/settings/api-keys).
If you receive an authorization error, contact technical support via the [dashboard](https://admin.idenfy.com/auth/login) using your account, or check whether a standard KYC session can be created successfully -- either via the [dashboard](/kyc/generate-token) or [API](/guides/dashboard/kyc/id-verification). This is required for successful authorization.
### Complete the Test
Complete tests for each individual action, add/set other actions if needed, and publish the connection/zap.
## Identity Verification in Shopify with Zapier
Integration examples with pre-made zaps/connections are provided in the [Zapier templates](https://zapier.com/apps/idenfy/integrations).
Read more about [how to integrate identity verification into your Shopify store](https://idenfy.com/blog/identity-verification-in-shopify-with-zapier/) on our blog.
# Zapier Webhooks
Source: https://documentation.idenfy.com/integrations/zapier-webhooks
Connect iDenfy verification webhooks to Zapier to automate KYC, AML, and KYB workflows across 5,000+ apps with minimal code needed.
## Purpose
Webhooks by Zapier enables seamless access to iDenfy API endpoints, requiring minimal programming knowledge. This integration supports services such as:
* **KYC (Know Your Customer)**
* **AML (Anti-Money Laundering)**
* **Potentially KYB (Know Your Business)**
## Key Concepts
Initiating KYC Verification and Receiving Results are two distinct steps. Each step involves specific API interactions outlined below.
### 1. Creating a Verification Session
To initiate verification, you need to create a verification session using the designated [API endpoint](/kyc/generate-token).
1. **Set up the initial trigger** in Zapier.
2. **Add a new action step** for Webhooks by Zapier.
* **App:** Search for "Webhooks by Zapier."
* **Action Event:** Select "Custom Request."
3. **Configure the Request:**
* **Method:** As described in the iDenfy documentation.
* **URL:** Enter the endpoint URL from the iDenfy documentation.
* **Data:** Input required parameters. You can map data from earlier steps in the Zap.
* **Basic Authentication:** Use your iDenfy API credentials in the format: `API Key|API Secret` (e.g., `key123|secret@#$123`).
4. When configured **successfully**, this step generates a verification token.
### 2. Generating a Verification Link
To create a unique verification link for a client:
1. Generated Auth Token: `qvTJBSd2SAKKILKdMCVRxptzaRJEzkRMvoUBFSQs`
2. Append the generated Auth Token to the base URL: `https://ivs.idenfy.com/api/v2/redirect?authToken=`
3. Example: `https://ivs.idenfy.com/api/v2/redirect?authToken=qvTJBSd2SAKKILKdMCVRxptzaRJEzkRMvoUBFSQs`
Once you create this link, you can include it in automated emails, notifications, or other integrations depending on your setup.
### 3. Receiving Verification Results
You can configure Webhooks by Zapier to receive results as notifications.
1. **Create a New Zap** and select the trigger event **Catch Hook**.
2. In **Configure**, leave the *Pick off a Child Key* field empty.
3. Copy the URL from the **Your webhook URL** section.
4. [Set up the notification](/guides/dashboard/settings/system-notifications-webhooks-emails) in the iDenfy dashboard.
5. You will receive information in parsed fields, which you can use according to your needs.
### 4. Using AML Services
For AML, follow the same steps as "Creating a Verification Session."
* Use the API endpoint provided in the documentation, specifically in the section about [AML](/aml/retrieve-profile).
* Using the Data section from the examples in the documentation, configure the AML search to match your needs.
The results will be returned in the same request.
**Request example:**
**Response in the same step:**
## Best Practices
* Always refer to the latest iDenfy API documentation.
* Securely [manage API credentials](/guides/dashboard/settings/api-keys).
* Test webhook configurations thoroughly.
* Implement robust error handling.
# Collect Information
Source: https://documentation.idenfy.com/kyb/collect-information
Gather company details and beneficial owner data using the iDenfy KYB API after creating a business verification session token string.
**Requirements**
* **API** key pair
* [Successfully created **`tokenString`**](/kyb/generate-token#step-1-create-business-verification-form-session) - used as **Authorization**
## Authorization
Both credentials are accepted, but not by every endpoint. Calling a token-only endpoint with the API key pair returns **401**.
| Endpoints | `tokenString` | API key pair |
| ----------------------------------------------------------------------- | ------------- | ------------ |
| Token Retrieve (`kybInfoRetrieve`), form list, form create, form submit | Yes | **No** |
| Form retrieve, update, partial update | Yes | Yes |
| Documents, beneficiaries, questionnaires | Yes | Yes |
## Business Verification Schema
See the recommended integration and use schema below.
## Check Flow
To determine what data the form requires, call the Business verification Token Retrieve endpoint.
For the **Business verification Token Retrieve** endpoint (retrieves flow information related to the specific token, detailing the data required for form submission), see the **API Reference** tab for `kybInfoRetrieve`.
You can skip this step if you use the same flow, since the data fields are similar.
***
## Form Creation
Create a Business verification Form by sending a request to the form creation endpoint.
If the token has a **flow router** attached, the router questions must be answered before a form can be created. Until they are, form creation returns **403**.
For the **Create Business verification form** endpoint (creates a new form linked to the generated token for capturing and submitting necessary compliance information), see the **API Reference** tab for `kybFormsCreate`.
After the form is created, the following operations are available:
* **Info Retrieve** - Retrieves detailed information about an active Business verification session, including various aspects of the company's compliance and verification process. See `kybFormsRetrieve` in the API Reference.
* **Form Update** - Updates information on an existing Business verification form. See `kybFormsUpdate` in the API Reference.
* **Form Partial Update** - Partially updates specific sections of an existing Business verification form. See `kybFormsPartialUpdate` in the API Reference.
You can retrieve a list of Business verification forms associated with a particular token. The list contains one item if a form was created, or zero items if it was not.
* **List Business verification forms** - Lists all forms associated with a particular token. See `kybFormsList` in the API Reference.
- Form endpoints accept an `Idempotency-Key` header for safe retries.
- Company prefill and AI document analysis are each limited to **10 calls per token**.
- The company search endpoint is `/kyb/company-search` — with no trailing slash, unlike every other KYB path.
***
## Documents
You can manage documents within the Business verification form/company. The following operations are available:
| Operation | Description | API Reference |
| --------------------- | ------------------------------------------------------------------------------ | -------------------------------- |
| **List documents** | Lists all documents associated with the Business verification form/company | `kybFormsDocumentsList` |
| **Add document** | Uploads a new document to the Business verification form/company | `kybFormsDocumentsCreate` |
| **Retrieve document** | Retrieves a specific document linked to the Business verification form/company | `kybFormsDocumentsRetrieve` |
| **Update document** | Updates an existing document within the Business verification form/company | `kybFormsDocumentsUpdate` |
| **Partial update** | Partially updates a document in the Business verification form/company | `kybFormsDocumentsPartialUpdate` |
| **Delete document** | Deletes a document associated with the Business verification form/company | `kybFormsDocumentsDestroy` |
### Upload Constraints
* Files are uploaded **base64-encoded**, up to **20 MiB** per file.
* Only **JPEG**, **PNG**, and **PDF** are accepted. Password-protected PDFs are rejected.
* Which document types you may upload is fixed by the workflow attached to the token.
* There is no limit on the number of documents.
***
## Beneficiaries
You can manage beneficiaries within the Business verification form/company. The following operations are available:
| Operation | Description | API Reference |
| ------------------------ | ------------------------------------------------------------------------ | ------------------------------------ |
| **List beneficiaries** | Lists all beneficiaries linked to the Business verification form/company | `kybFormsBeneficiariesList` |
| **Add beneficiary** | Adds a new beneficiary to the Business verification form/company | `kybFormsBeneficiariesCreate` |
| **Retrieve beneficiary** | Retrieves information on a specific beneficiary | `kybFormsBeneficiariesRetrieve` |
| **Update beneficiary** | Updates details of an existing beneficiary | `kybFormsBeneficiariesUpdate` |
| **Partial update** | Partially updates information of a specific beneficiary | `kybFormsBeneficiariesPartialUpdate` |
| **Delete beneficiary** | Removes a beneficiary from the Business verification form/company | `kybFormsBeneficiariesDestroy` |
Set `scanRef` on a beneficiary create or update request to link an already-completed identity verification instead of requiring a new one. The same `scanRef` can be linked to a beneficiary role on multiple companies — see [KYC Integration](/kyb/kyc-integration#reusing-an-identity-verification-across-companies).
`scanRef` is **silently ignored** when the request is authenticated with the session `tokenString` — you get **201** and no link. Use the API key pair for these requests.
Further `scanRef` constraints:
* Individual beneficiaries only. It cannot be set on a company-type beneficiary.
* The verification must belong to your partner account.
* The verification does not need to be approved.
A beneficiary's **type** cannot be changed after creation. Delete the beneficiary and add a new one instead.
***
## Beneficiaries' Documents
You can manage beneficiaries' documents using the following operations:
| Operation | Description | API Reference |
| --------------------- | ----------------------------------------------------------- | --------------------------------------------- |
| **List documents** | Lists all documents related to a specific beneficiary | `kybFormsBeneficiariesDocumentsList` |
| **Add document** | Uploads a new document for a beneficiary | `kybFormsBeneficiariesDocumentsCreate` |
| **Retrieve document** | Retrieves a specific document associated with a beneficiary | `kybFormsBeneficiariesDocumentsRetrieve` |
| **Update document** | Updates an existing document for a beneficiary | `kybFormsBeneficiariesDocumentsUpdate` |
| **Partial update** | Partially updates a beneficiary's document | `kybFormsBeneficiariesDocumentsPartialUpdate` |
| **Delete document** | Deletes a document linked to a beneficiary | `kybFormsBeneficiariesDocumentsDestroy` |
***
## Questionnaires
A questionnaire can be added to the flow. To check whether the form requires a questionnaire to be filled out, use the following endpoints:
* **Questionnaire list** - Lists all available questionnaires associated with the Business verification form flow. See `kybFormsQuestionnairesList` in the API Reference.
* **Retrieve specific questionnaire** - Retrieves a particular questionnaire within the Business verification process. See `kybFormsQuestionnairesRetrieve` in the API Reference.
If there is a need to fill it out, the following endpoints can be used:
| Operation | Description | API Reference |
| -------------------- | -------------------------------------------------------- | ----------------------------------------- |
| **Update answers** | Updates the answers to a questionnaire | `kybFormsQuestionnairesAnswersUpdate` |
| **Retrieve answers** | Retrieves the answers provided in a questionnaire | `kybFormsQuestionnairesAnswersRetrieve` |
| **List all answers** | Retrieves all completed questionnaire answers for a form | `kybFormsQuestionnairesAnswersDetailList` |
| **Delete answers** | Deletes answers provided in a questionnaire | `kybFormsQuestionnairesAnswersDestroy` |
Answers are written with **PUT** only — `PATCH` returns **405**. Retrieving answers returns **204** when the questionnaire has no sections.
***
## Form Submit
When the form is filled, it can be submitted. See `kybFormsSubmitCreate` in the API Reference.
Once you submit the form, iDenfy sends a [**webhook**](/kyb/webhooks) notification to your endpoint.
### Why a Submit Returns 400
Submission validates the whole form. It fails when:
* A required company field or required document is missing.
* A required beneficiary type is missing, or a beneficiary is missing a required field or document.
* The ownership structure is incomplete.
* A questionnaire is unanswered.
* A beneficiary has not completed their identity verification.
* A sole proprietor form has more than one beneficiary.
### After Submit
The session `tokenString` is deactivated on submit and the form becomes read-only. It reopens only if a reviewer requests more information.
On a re-submission, previously uploaded documents are not returned by the API and required documents must be uploaded again.
# Credit Bureau Reports
Source: https://documentation.idenfy.com/kyb/credit-bureau
Retrieve credit bureau reports and financial data for companies via the iDenfy KYB API for business verification and due diligence.
**Requirements**
* **API** key pair
* Reports functionality **enabled** (done by iDenfy's staff)
**Sample reports:** [Download here](https://github.com/idenfy/report-samples/archive/refs/tags/1.0.0.zip)
***
The Credit Bureau API lets you search for companies and order detailed credit reports. Use it to assess a company's financial health, creditworthiness, and current status before entering a business relationship.
## Credit Bureau
### Search
**Authorization:** `API key pair`
**Method:** `GET`
**Endpoint:** `https://ivs.idenfy.com/api/v2/credit-bureau-documents/search/`
**Request structure**
| Parameter (query) | Type | Required | Sample/available values |
| ----------------- | ------ | -------- | ----------------------------------- |
| `companyName` | String | No | "Mycompany" |
| `countries` | String | Yes | 2-digit ISO country code, e.g. "DE" |
| `registryNumber` | String | No | "12511182" |
`registry_number` for US companies could differ depending on the regulations by the secretary of state (SOS) in which the company is operating. In some cases it could be the SOS Charter number, Tax ID, MC number, USDOT number, or other.
**Response example**
```json theme={"system"}
{
"id": "string",
"country": "string",
"safeNo": "string",
"idType": "string",
"name": "string",
"type": "string",
"officeType": "string",
"status": "string",
"regNo": "string",
"vatNo": {
"additionalProp1": "string",
"additionalProp2": "string",
"additionalProp3": "string"
},
"address": {
"type": "string",
"simpleValue": "string",
"street": "string",
"houseNumber": "string",
"city": "string",
"postalCode": "string",
"province": "string",
"telephone": "string",
"directMarketingOptOut": true,
"directMarketingOptIn": true,
"country": "string"
},
"activity": {
"code": "string",
"industrySector": "string",
"description": "string",
"classification": "string"
},
"legalForm": "string",
"additionalData": {
"additionalProp1": "string",
"additionalProp2": "string",
"additionalProp3": "string"
},
"dateOfLatestAccounts": "string",
"dateOfLatestChange": "string"
}
```
***
## Order Credit Bureau Company Report
**Authorization:** `API key pair`
**Method:** `POST`
**Endpoint:** `https://ivs.idenfy.com/api/v2/credit-bureau-documents/report/`
**Request structure**
| Parameter | Type | Required | Sample/available values |
| ---------------- | ------ | -------- | ------------------------------------------------- |
| `countries` | Array | Yes | Array of 2-digit ISO country codes, e.g. `["DE"]` |
| `companyName` | String | Yes | "Company Name" |
| `registryNumber` | String | Yes | "12511182" |
```json theme={"system"}
{
"countries": ["DE"],
"companyName": "Beispiel GmbH",
"registryNumber": "HRB 12345"
}
```
```json theme={"system"}
{
"dataFile": "JSON file URL",
"reportFile": "PDF file URL",
"id": "string"
}
```
***
## Retrieve Specific Credit Bureau Document
**Authorization:** `API key pair`
**Method:** `GET`
**Endpoint:** `https://ivs.idenfy.com/api/v2/credit-bureau-documents/{id}/`
**:** `Report's unique number`
**Response sample**
```json theme={"system"}
{
"id": "string",
"externalCompanyId": "string",
"checkedAt": "2022-06-30T08:55:45.810Z",
"status": "ACTIVE",
"dataFile": "JSON",
"reportFile": "PDF"
}
```
***
## Retrieve All Credit Bureau Documents
**Authorization:** `API key pair`
**Method:** `GET`
**Endpoint:** `https://ivs.idenfy.com/api/v2/credit-bureau-documents/`
If you do not have an ID of a report or you need to retrieve all available reports, use this endpoint.
Use the `checked_at` query parameter if a date range is needed. The type for the parameter is `array[string]`.
**Response example**
```json theme={"system"}
[
{
"id": "string",
"externalCompanyId": "string",
"checkedAt": "2022-06-30T10:15:47.692Z",
"status": "ACTIVE",
"dataFile": "JSON",
"reportFile": "PDF"
}
]
```
# Create KYB Session
Source: https://documentation.idenfy.com/kyb/generate-token
Create a KYB session by generating a business verification token via the iDenfy API with custom flow, settings, and finance options.
**Requirements**
* **API** key pair
* [**Custom flow**](/guides/dashboard/kyb/identity-verification-on-kyb-custom-flow) created via dashboard
* Session creation via API **enabled** (done by iDenfy's staff)
* **Finances**
***
## Step 1: Create Business Verification Form Session
For full request and response details, see the **API Reference** tab for the `kybTokensCreate` endpoint.
Pass one or more existing identity verification `scanRef`s in the `scanRefs` field to link already-verified individuals (Directors, Representatives, Beneficial Owners) to this company without requiring them to re-verify. The same `scanRef` can be reused across any number of companies — see [KYC Integration](/kyb/kyc-integration#reusing-an-identity-verification-across-companies).
***
## Step 2: Create Company
Once the token is generated you can either:
* [Create a company via **API**](/kyb/collect-information)
* [Create a **redirection** link to the Web UI](#create-redirection-link-to-web-ui)
### Create Redirection Link to Web UI
To redirect the user to the iDenfy Business verification UI, construct the redirect **URL** as follows:
1. Start with the base URL
2. Obtain the `tokenString` value from the **new Business verification token response**
3. Append this `tokenString` value directly to the end of the base URL: `https://kyb.ui.idenfy.com/welcome?authToken=`
**Example:**
If the `tokenString` received from the API is `9TIMoX4oSVmWDJ8qS7zeFUMTh5hi1EcqqLTrPR9r`, the complete redirect URL will be:
```
https://kyb.ui.idenfy.com/welcome?authToken=9TIMoX4oSVmWDJ8qS7zeFUMTh5hi1EcqqLTrPR9r
```
# Government Registry
Source: https://documentation.idenfy.com/kyb/gov-registry
Access government registry data for company verification and compliance checks using the iDenfy KYB government registers search API.
**Requirements**
* **API** key pair
* Reports functionality **enabled** (done by iDenfy's staff)
***
The Government Registry API lets you search for companies across 100+ countries and order detailed company reports sourced directly from official government registries. Use it to verify company existence, retrieve registration details, and download structured reports.
## GOV Registry
### Search
**Authorization:** `API key pair`
**Method:** `GET`
**Endpoint:** `https://ivs.idenfy.com/api/v2/gov-registers-documents/search/`
If `company_name` is not provided, all countries `country_code` are available, except: BD, BR, FI, ID, MA, NI, OM, PH, TT and US-IL, US-NY, US-SC.
| Parameter (query) | Type | Required | Sample/available values |
| ----------------- | ------ | --------------- | ------------------------------------------ |
| `company_name` | String | No | "Mycompany", check note above |
| `country_code` | String | Yes | 2-digit ISO country code, check note above |
| `registry_number` | String | No | "12511182" |
| `region` | String | For US & Canada | 2-digit ISO state code |
**Response example**
```json theme={"system"}
{
"addressesField": [
{
"countryField": "LT",
"typeField": "registered",
"typeCodeField": "REG",
"addressInOneLineField": "Vilniaus g. 31, LT-01402 Vilnius",
"addressLine1Field": "Vilniaus g. 31",
"addressLine2Field": "",
"addressLine3Field": "",
"addressLine4Field": "",
"addressLine5Field": "",
"postcodeField": "LT-01402",
"cityTownField": "Vilnius",
"regionStateField": "Vilniaus m. sav.",
"websiteUrlField": "https://example.lt",
"emailField": "info@example.lt",
"faxNumberField": "",
"telephoneNumberField": "+37052000000",
"PropertyChanged": ""
}
],
"aliasesField": {},
"codeField": "305216619",
"companyIDField": "305216619",
"dateField": "2020-03-15",
"legalFormField": "UAB",
"legalStatusField": "Active",
"nameField": "UAB Pavyzdinė Įmonė",
"officialField": true,
"registrationAuthorityField": "Juridinių asmenų registras",
"registrationAuthorityCodeField": "LTRC",
"sourceField": "Registrų centras",
"virtualIDField": "LT-305216619",
"moreKeyField": "",
"functionField": "",
"PropertyChanged": ""
}
```
***
### Order GOV Registers Company Report
**Authorization:** `API key pair`
**Method:** `POST`
**Endpoint:** `https://ivs.idenfy.com/api/v2/gov-registers-documents/report/`
If the request is for USA or Canada, add an additional parameter `region` with a state in alpha-2 format, e.g. `"region": "CA"`.
```json theme={"system"}
{
"countryCode": "AF",
"companyName": "string",
"registryNumber": "string"
}
```
```json theme={"system"}
{
"dataFile": "JSON file URL",
"reportFile": "PDF file URL",
"id": "string"
}
```
***
### Retrieve Specific GOV Registry Document
**Authorization:** `API key pair`
**Method:** `GET`
**Endpoint:** `https://ivs.idenfy.com/api/v2/gov-registers-documents/{id}/`
**:** `Report's unique number`
**Response sample**
```json theme={"system"}
{
"id": "string",
"externalCompanyId": "string",
"checkedAt": "2022-06-30T10:08:00.701Z",
"dataFile": "JSON",
"reportFile": "PDF",
"companyName": "string",
"postcode": "string",
"city": "string",
"activityCode": "string",
"activity": {
"additionalProp1": "string",
"additionalProp2": "string",
"additionalProp3": "string"
},
"addresses": {
"additionalProp1": "string",
"additionalProp2": "string",
"additionalProp3": "string"
},
"aliases": {
"additionalProp1": "string",
"additionalProp2": "string",
"additionalProp3": "string"
},
"email": "string",
"faxNumber": "string",
"telephoneNumber": "string",
"fiscalCode": "string",
"websiteUrl": "string",
"foundationDate": "string",
"legalForm": "string",
"legalStatus": "string",
"registrationAuthority": "string",
"registrationAuthorityCode": "string",
"registrationDate": "string",
"registrationNumber": "string",
"vatNumber": "string",
"stateOfIncorporation": "string",
"associatedPersons": {
"additionalProp1": "string",
"additionalProp2": "string",
"additionalProp3": "string"
}
}
```
***
### Retrieve All GOV Register Documents
**Authorization:** `API key pair`
**Method:** `GET`
**Endpoint:** `https://ivs.idenfy.com/api/v2/gov-registers-documents/`
Use the `checked_at` query parameter if a date range is needed. The type for the parameter is `array[string]`.
**Response sample**
```json theme={"system"}
[
{
"id": "string",
"externalCompanyId": "string",
"checkedAt": "2022-06-30T10:23:49.511Z",
"dataFile": "json",
"reportFile": "pdf",
"companyName": "string",
"postcode": "string",
"city": "string",
"activityCode": "string",
"activity": {
"additionalProp1": "string",
"additionalProp2": "string",
"additionalProp3": "string"
},
"addresses": {
"additionalProp1": "string",
"additionalProp2": "string",
"additionalProp3": "string"
},
"aliases": {
"additionalProp1": "string",
"additionalProp2": "string",
"additionalProp3": "string"
},
"email": "string",
"faxNumber": "string",
"telephoneNumber": "string",
"fiscalCode": "string",
"websiteUrl": "string",
"foundationDate": "string",
"legalForm": "string",
"legalStatus": "string",
"registrationAuthority": "string",
"registrationAuthorityCode": "string",
"registrationDate": "string",
"registrationNumber": "string",
"vatNumber": "string",
"stateOfIncorporation": "string",
"associatedPersons": {
"additionalProp1": "string",
"additionalProp2": "string",
"additionalProp3": "string"
}
}
]
```
# KYB iFrame
Source: https://documentation.idenfy.com/kyb/iframe
Embed the iDenfy business verification UI in your web page using an iFrame with success and failure status handling via postMessage.
To use the Business verification UI in an iFrame, add the generated [**Business verification link**](/kyb/generate-token#create-redirection-link-to-web-ui) to an HTML `iframe` element. If you want additional handling, the iFrame also posts statuses of `success` or `failed`.
```html theme={"system"}
```
# KYC Integration
Source: https://documentation.idenfy.com/kyb/kyc-integration
Integrate KYC identity verification for beneficial owners within iDenfy KYB business verification using combined all-in-one API flows.
You can combine Business verification and Identity verification services in an all-in-one solution. Depending on the specific integration and required use cases, the following approaches are available.
## Business Verification First Approach
[Create a company](/kyb/collect-information) and afterward:
* Create and send a new Identity verification token via the [**dashboard**](/guides/dashboard/kyb/company-page).
* Set up [**custom rule automation for the Identity verification Token**](/guides/dashboard/risk/custom-rules), which will automatically send a new link to the related subjects of the Business verification form.
* Create verification via [**API**](/kyc/generate-token) or [**dashboard**](/guides/dashboard/kyc/new-verification-via-dashboard) and once verification is done, add a new [**beneficiary via API**](/kyb/collect-information#beneficiaries) using the `scanRef` of completed Identity verification.
***
## Identity Verification First Approach
Alternatively, you can onboard and perform Identity verifications first and then manage the Business verification form. In this case, make sure that the Identity verifications are completed:
* Gather verification `scanRef` numbers and include them when creating a [**new Business verification session**](/kyb/generate-token#step-1-create-business-verification-form-session).
* Add a new beneficiary **via API** (see [**beneficiaries**](/kyb/collect-information#beneficiaries)) using the existing Identity verification `scanRef`.
The iDenfy recommended approach is to use [**Identity verification Token**](/guides/dashboard/risk/custom-rules) automation or create a new beneficiary [**via API**](/kyb/collect-information#beneficiaries).
It is also possible to use **both services separately** and add a new beneficiary via API or dashboard depending on integration requirements.
***
## Reusing an Identity Verification Across Companies
The same `scanRef` can be linked to a person's role (Director, Representative, or Beneficial Owner) on more than one company. There's no limit on how many companies can reference the same `scanRef`, so someone who sits on several company structures only needs to complete identity verification once. This works identically via API and via the [dashboard](/guides/dashboard/kyb/company-details-tab).
A `scanRef` can be supplied when creating a company, when creating a token (see [`scanRefs`](/kyb/generate-token#step-1-create-business-verification-form-session)), or added later to an existing Director, Beneficiary, or Representative from the [Company Details](/guides/dashboard/kyb/company-details-tab) page.
# Managing Company
Source: https://documentation.idenfy.com/kyb/managing-company
Update, view, and manage company verification records through the iDenfy dashboard or API for ongoing business verification management.
You can manage companies either through the [iDenfy dashboard](/guides/dashboard/kyb/company-page) or via the API.
## Viewing Companies
To view all submitted companies (or forms), use the dashboard or the API.
For the **List Companies** endpoint (shows a list of all company reviews, including their status and details), see the **API Reference** tab for `kybCompaniesList`.
***
## Reviewing a Company
To mark a company review as complete, change its status to `COMPLETED` using the API.
For the **Change Status** endpoint (marks a company review as completed), see the **API Reference** tab for `kybCompaniesChangeStatusCreate`.
You can also receive a webhook notification when a company is reviewed by enabling the `COMPANY_REVIEW` notification in your [Notification Settings](/guides/dashboard/settings/system-notifications-webhooks-emails).
***
## Re-Run KYB Automation
You can programmatically trigger a KYB automation re-run for a specific company without opening the dashboard.
For the **Re-run Automation** endpoint (`POST /kyb/companies/{id}/automation/`), see the **API Reference** tab for `kybCompaniesAutomationCreate`.
A finance check is performed before the automation task is queued. On success, the endpoint returns a **202** status code confirming the automation task has been scheduled. If the automation cannot be started, an error response is returned with a reason.
***
## Retrieve All Company Information
For the **Retrieve complete information about company** endpoint, see the **API Reference** tab for `kybCompaniesRetrieve`.
### Risk Assessment Results
The response includes a `riskAssessment` object, so you can retrieve a company's risk scoring programmatically instead of opening the dashboard:
| Field | Type | Description |
| ----------- | ----------------- | ------------------------------------------------------------------- |
| `id` | `string` | Identifier of the risk assessment result. |
| `riskScore` | `integer \| null` | Overall risk score, `0`--`100`. |
| `riskLevel` | `enum \| null` | `VERY_LOW`, `LOW`, `MEDIUM`, `HIGH`, `VERY_HIGH`, or `NOT_CHECKED`. |
| `comment` | `string \| null` | Reviewer comment left on the assessment, if any. |
The object is `null` when no risk assessment has been run for the company. See [Get Risk Assessment Results](/guides/dashboard/risk/get-risk-assessment-results) for how the score is calculated.
***
## Deleting a Company
Companies can be removed from the dashboard or via the API.
For the **Delete Company** endpoint (removes a company and its session from the system), see the **API Reference** tab for `kybCompaniesDestroy`.
***
## Request Update
You can ask your client to update submitted data using the **Request More Information (RI)** functionality.
### Step 1: Request More Information
[Initiate RI via dashboard](/guides/dashboard/general/request-update). To track and handle these updates, set up the [**COMPANY INFO REQUEST** webhook event](/kyb/webhooks).
### Step 2: Checking the Flow
The data requested during RI may differ from the original form. To determine what fields are needed, retrieve the flow information.
For the **Retrieve Flow** endpoint (shows the fields currently required during RI), see the **API Reference** tab for `kybInfoRetrieve`.
### Step 3: Update
Any updates can be made using the same endpoints used in the initial Business verification flow, described in:
* [Documents](/kyb/collect-information#documents)
* [Beneficiaries](/kyb/collect-information#beneficiaries)
* [Beneficiaries' Documents](/kyb/collect-information#beneficiaries-documents)
* [Questionnaires](/kyb/collect-information#questionnaires)
To check if a questionnaire is required, use the list endpoint and fill in the **first item**, especially if multiple are listed. See `kybFormsQuestionnairesList` in the API Reference.
# KYB API – Business Verification
Source: https://documentation.idenfy.com/kyb/overview
Integrate iDenfy's KYB API to verify companies via registry data retrieval, beneficial owner screening, AML checks, and dashboard-based compliance reviews.
## KYB API Integration
This section provides comprehensive information on integrating iDenfy's Know Your Business (**KYB**) API. You can leverage Business verification functionality either through the iDenfy dashboard interface or directly via our API.
Both the API and the iDenfy dashboard support the creation and management of Business verification company profiles. For detailed instructions on using the dashboard for company management, refer to the [help center guide](/guides/dashboard/kyb/getting-started). This documentation primarily focuses on the implementation and usage of the Business verification API.
## Next Steps
Create a business verification session via API.
Gather company and beneficial owner data.
Receive business verification results.
Step-by-step dashboard guide for KYB.
# KYB PDF Generation
Source: https://documentation.idenfy.com/kyb/pdf-generation
Generate downloadable PDF reports for completed business verification companies via the iDenfy KYB PDF generation API endpoint call.
## Generate PDF
Generate a downloadable PDF report for a completed Business Verification (KYB) company, combining its checks and data into a single structured file. Use the `content` parameter to select which sections to include, or omit it to get the full default set.
For full request and response schemas, see the [**Generate company PDF**](/api-reference/companies/generate-company-pdf) endpoint in the API Reference.
### Deny Reason
When the company's verification result is **Denied**, the report prints the deny reason, so there is no need to read through the full report to find out why the company was declined.
The reason shown is one of the custom [deny reasons](/guides/dashboard/settings/operational-settings#deny-reasons) configured for your account, or iDenfy's default reason when no custom reasons are set. It is printed on denied reports regardless of which sections you select with `content`.
# Registry Reports
Source: https://documentation.idenfy.com/kyb/registry-reports
Retrieve company registry reports and available documents for business verification and compliance due diligence via the iDenfy API.
**Requirements**
* **API** key pair
* Reports functionality **enabled** (done by iDenfy's staff)
**Sample reports:** [Download here](https://github.com/idenfy/report-samples/archive/refs/tags/1.0.0.zip)
***
## Registry Reports
### Available Registry Report Documents
**Authorization:** `API key pair`
**Method:** `GET`
**Endpoint:** `https://ivs.idenfy.com/api/v2/gov-ordered-documents/available-documents/`
| Parameter (query) | Type | Required | Sample/available values |
| -------------------- | ------ | -------- | ------------------------ |
| `countryCode` | String | Yes | 2-digit ISO country code |
| `registrationNumber` | String | Yes | "12511182" |
**Response example**
```json theme={"system"}
{
"products": [
{
"id": "EBROFF_MzA0NjE3NjIxO0xUVV9CUzs0OzQ7RlMwMTI5_TFRVX0JT_QmFsYW5jZSBzaGVldA==_MzA0NjE3NjIx",
"priceTag": "LTU_BS",
"price": "0",
"vatCharge": "0",
"currency": "\u20ac",
"productCode": "304617621;LTU_BS;4;4;FS0129",
"companyCode": "304617621",
"productDetails": [
{
"keyField": "EFFECTIVE_DATE",
"valueField": "2020-12-31",
"documentCountField": 0
}
],
"productFormat": "HTML",
"productTitle": "Balance sheet",
"displayDate": "2020-12-31",
"type": "BALANCE_SHEET",
"deliveryTimeMinutes": 5,
"tierCode": "A",
"tierValue": "1.00",
"status": "NOT_ORDERED",
"canOrder": true
},
{
"id": "304617621;LTU_BS;4;7;FS0229",
"productCode": "304617621;LTU_BS;4;7;FS0229",
"price": 1,
"productFormat": null,
"productTitle": "Balance sheet",
"deliveryTimeMinutes": 5,
"type": "BALANCE_SHEET",
"displayDate": "2023-12-31",
"priceTag": "LTU_BS",
"vatCharge": "0",
"currency": "\u20ac",
"companyCode": "304617621",
"productDetails": [
{
"keyField": "EFFECTIVE_DATE",
"valueField": "2020-12-31",
"documentCountField": 0
}
],
"productFormat": "HTML",
"productTitle": "Profit and loss account",
"displayDate": "2020-12-31",
"type": "PROFIT_AND_LOSS_ACCOUNT",
"deliveryTimeMinutes": 5,
"tierCode": "A",
"tierValue": "1.00",
"status": "NOT_ORDERED",
"canOrder": true
}
]
}
```
***
### Order Registry Report Document
**Authorization:** `API key pair`
**Method:** `POST`
**Endpoint:** `https://ivs.idenfy.com/api/v2/gov-ordered-documents/document-order/`
| Parameter | Type | Required | Sample/available values |
| -------------------- | ------ | -------- | --------------------------------------------------------------------------------------------------------- |
| `countryCode` | String | Yes | 2-digit ISO country code |
| `registrationNumber` | String | Yes | "12511182" |
| `companyName` | String | Yes | "Company Name" |
| `productKey` | String | Yes | `id` of the document from the [available Registry Reports response](#available-registry-report-documents) |
```json theme={"system"}
{
"countryCode": "LT",
"registrationNumber": "304617621",
"companyName": "IDENFY",
"productKey": "EBRON_RUJSX0NvbXBhbnlQcm9maWxlXzE=_MzA0NjE3NjIx__"
}
```
Successful request / 200 OK with empty body.
***
### List Ordered Registry Report Documents
**Authorization:** `API key pair`
**Method:** `GET`
**Endpoint:** `https://ivs.idenfy.com/api/v2/gov-ordered-documents/`
**Response example**
```json theme={"system"}
[
{
"id": "39e40532-8838-402b-a72e-ab39d1c43b16",
"title": "Company Officials",
"documentFormat": "PDF",
"productKey": "EBRON_RUJSX0NvbXBhbnlPZmZpY2lhbHNfMQ==_MzA0NjE3NjIx__",
"expectedDeliveryTime": "2024-01-02T09:51:53.643567Z",
"price": 1.0,
"deliveredAt": "2024-01-02T09:52:55.543725Z",
"status": "FINISHED",
"file": "https://s3.eu-west-1.amazonaws.com/..."
},
{
"id": "f0733089-c27e-47cb-b49d-e9950097aed2",
"title": "Beneficial Ownership Report",
"documentFormat": "PDF",
"productKey": "ROWOFF_Q1pfVUJP_QmVuZWZpY2lhbCBPd25lcnNoaXAgUmVwb3J0_...",
"expectedDeliveryTime": "2023-12-14T08:24:18.959072Z",
"price": 5.0,
"deliveredAt": "2023-12-14T09:21:58.768875Z",
"status": "FINISHED",
"file": "https://s3.eu-west-1.amazonaws.com/..."
}
]
```
### Retrieve Specific Registry Report Document
**Authorization:** `API key pair`
**Method:** `GET`
**Endpoint:** `https://ivs.idenfy.com/api/v2/gov-ordered-documents/{id}/`
**:** `Report's unique number`
**Response example**
```json theme={"system"}
{
"id": "39e40532-8838-402b-a72e-ab39d1c43b16",
"title": "Company Officials",
"documentFormat": "PDF",
"productKey": "EBRON_RUJSX0NvbXBhbnlPZmZpY2lhbHNfMQ==_MzA0NjE3NjIx__",
"expectedDeliveryTime": "2023-12-14T08:36:26.033428Z",
"price": 1.0,
"deliveredAt": "2024-01-02T09:52:55.543725Z",
"status": "FINISHED",
"file": "https://s3.eu-west-1.amazonaws.com/..."
}
```
# Social Screening
Source: https://documentation.idenfy.com/kyb/social-screening
Screen companies across social media, web sources, and address audits using the iDenfy KYB social screening and audit API endpoints.
## Address, Website Audit Reports and Social Profile of Companies
**Requirements**
* API key pair
* Credits **for each** desired service
***
### Address Audit
**Authorization:** `API key pair`
**Method:** `POST`
**Endpoint:** `https://ivs.idenfy.com/api/v2/audits/address-audit/`
**Request structure**
| Parameter | Type | Required | Explanation |
| --------- | ------ | -------- | ----------------- |
| `address` | String | Yes | Address for audit |
**Samples**
```json theme={"system"}
{
"address": "string"
}
```
```json theme={"system"}
{
"id": "f84211c0-5ffc-4955-8b6c-d2ac3c8dd768",
"created": "2025-03-18T13:18:38.417600Z",
"googleMapsUrl": "https://www.google.com/maps/search/...",
"dataId": "0x46e7186363af0e71:0x76491c4f48ca5923",
"type": ["Building"],
"address": "Gri\u010diupio g. 7 Gri\u010diupio g. 7, Kaunas, 51372 Kauno m. sav., Lithuania",
"associatedBodies": ["Gri\u010diupio g. 7-m"],
"latitude": 54.9050526,
"longitude": 23.963629899999997,
"riskLevel": "VERY_LOW",
"addressAuditImages": [
{
"image": "IMAGE_FILE_RETURNED_HERE",
"type": "STREET_VIEW"
}
]
}
```
***
### Website Audit
**Authorization:** `API key pair`
**Method:** `POST`
**Endpoint:** `https://ivs.idenfy.com/api/v2/audits/website-audit/`
**Request structure**
| Parameter | Type | Required | Explanation |
| --------- | ------ | -------- | -------------------------------- |
| `url` | String | Yes | Valid URL address of the website |
**Samples**
```json theme={"system"}
{
"url": "https://idenfy.com/"
}
```
```json theme={"system"}
{
"id": "723ef8ad-c1ec-4d80-8632-5550ce67d3d1",
"created": "2025-03-18T13:21:52.690606Z",
"url": "https://idenfy.com/",
"riskLevel": "VERY_LOW",
"trustScore": 100,
"blacklistScore": 0,
"internalAuditScore": 100,
"popularityScore": 100,
"domainCreatedAt": "2017-09-08T12:19:34Z",
"image": null,
"websiteTitle": "Identity Verification Service | ID Verification - iDenfy",
"websiteDescription": "Identity verification service for user onboarding. Mitigate fraud with instant ID verification. Meet Know Your Customer, AML regulations."
}
```
***
### Company Social Audit
**Authorization:** `API key pair`
**Method:** `POST`
**Endpoint:** `https://ivs.idenfy.com/api/v2/audits/company-name-audit/`
**Request structure**
| Parameter | Type | Required | Explanation |
| ------------- | ------ | -------- | ----------------------------------- |
| `address` | String | Yes | Registration address of the company |
| `companyName` | String | Yes | Name of the company |
**Samples**
```json theme={"system"}
{
"address": "string",
"companyName": "string"
}
```
```json theme={"system"}
{
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"descriptionByCompany": "string",
"address": "string",
"phoneNumber": "string",
"industry": "string",
"rating": 0,
"socialMediaProfiles": {
"property1": null,
"property2": null
},
"companyName": "string",
"reviews": [{}]
}
```
# SOS Reports
Source: https://documentation.idenfy.com/kyb/sos-reports
Order and retrieve Secretary of State filing reports for US company verification and compliance checks using the iDenfy KYB API tools.
**Requirements**
* **API** key pair
* Reports functionality **enabled** (done by iDenfy's staff)
***
## Ordering SOS Document
**Authorization:** `API key pair`
**Method:** `POST`
**Endpoint:** `https://ivs.idenfy.com/api/v2/sos-filing-documents/`
**Request structure**
| Parameter | Type | Required |
| ------------- | ------ | -------- |
| `companyName` | String | Yes |
| `state` | String | Yes |
| `city` | String | Yes |
| `street` | String | Yes |
| `postalCode` | String | Yes |
The ordered report takes time to generate and will initially have status `IN_PROGRESS`.
**Request example**
```json theme={"system"}
{
"companyName": "City and Borough of Juneau",
"state": "AK",
"city": "Juneau",
"street": "155 S Seward St",
"postalCode": "99801"
}
```
***
## List Documents
**Authorization:** `API key pair`
**Method:** `GET`
**Endpoint:** `https://ivs.idenfy.com/api/v2/sos-filing-documents/`
**Request structure**
| Query Parameter | Type | Explanation |
| --------------- | ------------------------------ | --------------------------------------------------------------------- |
| `checkedAt` | Array of strings `` | Date-time filter for checked documents |
| `status` | String | Enum: `FAILED`, `FINISHED`, `IN_PROGRESS`, `NOT_ORDERED`, `TIMED_OUT` |
# KYB Webhooks
Source: https://documentation.idenfy.com/kyb/webhooks
Receive business verification results and status changes via webhook callbacks for company submit, review, AML, and expiration events.
**Requirements**
* Setting up **webhooks** requires **Admin** role
* Set up [webhooks](/guides/dashboard/settings/system-notifications-webhooks-emails)
* Your endpoint must have a valid **SSL** certificate for TLS webhooks to prevent delivery failures
## Setting Up Notifications
To set up notifications, log in to your dashboard and navigate to [Settings > Notifications](/guides/dashboard/settings/system-notifications-webhooks-emails).
***
## Webhook Events for Companies
The following webhook events are available for company-related notifications. For full payload details on each event, see the **API Reference** tab.
| Event | API Reference | Description |
| ------------------------ | -------------------- | -------------------------------------------------- |
| **COMPANY SUBMIT** | `companySubmit` | Triggered when a company form is submitted |
| **COMPANY REVIEW** | `companyReview` | Triggered when a company review is completed |
| **COMPANY AML REVIEW** | `companyAmlReview` | Triggered when a company AML review is completed |
| **COMPANY EXPIRATION** | `companyExpiration` | Triggered when a company verification expires |
| **COMPANY INFO REQUEST** | `companyInfoRequest` | Triggered when additional information is requested |
| **COMPANY DELETE** | `companyDelete` | Triggered when a company is deleted |
***
## Webhook Events for Reports
| Event | API Reference | Description |
| ------------------------ | -------------------- | ----------------------------------------------------------- |
| **GOV ORDERED DOCUMENT** | `govOrderedDocument` | Triggered when a government ordered document status changes |
***
## Webhook Troubleshooting
### Ensure That
* You have provided a valid callback endpoint (it does not contain typos and is a fully specified URL with HTTP schema, port, and domain name).
* The provided endpoint can be reached from the internet.
* Your SSL is set up correctly. The system can only send webhooks to URLs with valid SSL certificates.
* You are truly not receiving a callback and your framework is not accidentally returning some other HTTP response (e.g. 422 or 500).
### Review Webhooks Sent via iDenfy Dashboard
By going to **Settings** > **Notifications** > selecting **Recently sent** in the top right corner, you can search for specific notifications and see what was sent and what status was received from your server.
1. **Search field** - Use scanRef to search for specific notifications for verification.
2. **Response status** - The response received from your server:
* **`0`** - No Response: No communication; server unreachable.
* **`2xx`** - Success: Request successful, information returned.
* **`3xx`** - Redirection: Further action needed, request redirected.
* **`4xx`** - Client Errors: Your server could not handle the response.
* **`5xx`** - Server Errors: Request valid, there is a problem with the server.
3. **Date and time** when the notification was sent.
4. **Resend** - Attempt to resend the webhook.
5. **Details** - Shows full information of what was sent in JSON format.
# Additional Steps
Source: https://documentation.idenfy.com/kyc/additional-steps
Request additional documents like utility bills or bank statements as part of the iDenfy verification flow using the additional steps API.
**Requirements:**
* API key pair
* Additional step credits
* Additional step session creation via API enabled (configured by iDenfy staff)
* Additional step type set in your environment (configured by iDenfy staff)
**Limitations:**
* The Utility Bill document selection step does not validate the user's choice against the upload -- it only guides them on expected document types.
* The Utility Bill document selection step is shown only when the step name is `UTILITY_BILL`. To skip it, use any different step name.
* Contact iDenfy to change custom additional step texts (`name` and `description`).
***
## Generating Token with Additional Step
### UPLOAD Processing Type
Use this when you simply want to store the document file as part of the verification without extracting or validating its contents.
**When to use:**
* You only need to attach the document to the verification record.
* No analysis, extraction, or validation is required.
**What happens:**
* The system saves the document with the verification.
* No automated checks or manual review are triggered.
* No data is extracted or returned.
### COMPARE Processing Type
Use this when you need to both extract data and compare it against values you provide.
**When to use:**
* You want to verify if the data in the document matches what you supplied during [token creation](/kyc/generate-token).
* Example: Match the address on the document with `additionalData` sent during verification start.
**What happens:**
* The system extracts data from the document.
* That data is compared with the values you provided via the `additionalData` key.
* The API returns the comparison result.
**Possible comparison results** (in `additionalData.status`):
* `MATCH`
* `NOT_MATCH`
* `NOT_FOUND`
* `NO_DATA`
These are also included in the [webhook callback](/kyc/webhooks).
### EXTRACT Processing Type
Use this when you need to extract address or data from the document but do not want to compare it to anything.
**When to use:**
* You want to read and extract data (e.g., address) from the document.
* You do not need to validate it against pre-supplied data.
**What happens:**
* The system (AI or manual team) reads and extracts data from the document.
* The extracted data is available in the verification UI and the [webhook callback](/kyc/webhooks).
Do **not** rely on the `additionalData.status` field for the EXTRACT type. Since no matching is performed, the `status` field is not applicable. Focus only on the raw extracted data.
***
## Session Creation Request
To [create a session](/kyc/generate-token) with a utility bill step, you do not need to pass anything extra. The custom additional step is included by default if configured in your environment settings.
### Minimal Request
```json theme={"system"}
{
"clientId": "123"
}
```
### Response Example
```json theme={"system"}
{
"message": "Token created successfully",
"authToken": "cBqwefLQK6jEA20CJnq12r01cge00mlvPrjTGM4",
"scanRef": "6a31253e-e10a-11eb-cc95-02cb49d118ed",
"clientId": "2",
"personScanRef": "2",
"firstName": null,
"lastName": null,
"successUrl": null,
"errorUrl": null,
"unverifiedUrl": null,
"callbackUrl": null,
"locale": null,
"country": null,
"expiryTime": 3600,
"sessionLength": 600,
"documents": ["ID_CARD", "PASSPORT", "DRIVER_LICENSE", "RESIDENCE_PERMIT"],
"dateOfBirth": null,
"dateOfExpiry": null,
"dateOfIssue": null,
"nationality": null,
"personalNumber": null,
"documentNumber": null,
"sex": null,
"address": null,
"showInstructions": true,
"tokenType": "IDENTIFICATION",
"utilityBill": true,
"additionalSteps": {
"ALL": {
"ALL": {
"UTILITY_BILL": {
"type": "UPLOAD",
"texts": {
"en": {
"name": "Please upload a proof of address document",
"description": "Please make sure that the proof of address document is fully visible and is not older than 3 months. All information must be clearly visible including your full name, address, date of the document, and the document must be a legitimate utility bill or a bank statement, as handwritten papers are not accepted. Also, the utility bill must be in Latin alphabet. ID documents are not accepted as valid proof of address."
},
"de": {
"name": "Bitte laden Sie einen Adressnachweis hoch",
"description": "Bitte achten Sie darauf, dass der Adressnachweis vollständig sichtbar und nicht älter als 3 Monate ist. Alle Informationen müssen deutlich sichtbar sein, einschließlich Ihres vollständigen Namens, Ihrer Adresse und des Datums des Dokuments, und das Dokument muss eine gültige Stromrechnung sein, ein Kontoauszug, da handschriftliche Papiere nicht akzeptiert werden. Außerdem muss die Stromrechnung im lateinischen Alphabet sein. Ausweisdokumente werden nicht als gültiger Adressnachweis akzeptiert."
},
"es": {
"name": "Cargue un comprobante de domicilio",
"description": "Asegúrese de que el comprobante de domicilio esté completamente visible y no tenga más de 3 meses. Toda la información debe ser claramente visible, incluido su nombre completo, dirección, fecha del documento, y el documento debe ser una factura de servicios públicos legítima, un extracto bancario, no se aceptan documentos escritos a mano. También, la factura de servicios públicos debe estar en alfabeto latino. Los documentos de identidad no se aceptan como prueba válida de domicilio."
}
},
"fields": [],
"settings": {
"canUpload": true,
"canCapture": true,
"canUploadPDF": true
}
}
}
}
},
"externalRef": null,
"digitString": null
}
```
***
## Request with Address Data
You can optionally include the expected user address details within the `additionalData` object when generating an identification token.
**How provided data affects verification:**
* **COMPARE steps:** If you provide the address in `additionalData`, it will be automatically cross-referenced against the submitted document. Without it, this comparison is skipped.
* **EXTRACT steps:** No comparison is performed, so the provided address is stored as reference information alongside the extracted data. Proof of address documents are processed automatically and are not routed to manual review.
**Document requirements for address proof:**
When users submit proof of address documents (like utility bills), they must adhere to these standards:
* **Age:** No older than 3 months.
* **Clarity:** All text clear and unobstructed.
* **Format:** Official documents only (no handwritten notes), using Latin characters.
### Request Example
```json theme={"system"}
{
"clientId": "123",
"additionalData": {
"UTILITY_BILL": {
"address": "1234, Drive/Street, City/State, postcode, etc."
}
}
}
```
The step name `UTILITY_BILL` in `additionalData` must match the step name configured in your environment's Custom Additional Step settings.
### Response
The response structure is identical to the [minimal request response](#response-example) above, with these key differences:
* `"type"` is set to `"EXTRACT"` (or whichever processing type you configured) instead of `"UPLOAD"`
* `"fields"` contains the fields you requested (e.g., `["address"]`)
* An `"additionalData"` object is included, echoing the address data you provided
***
## Upload or Re-Upload for Existing Verification
```
POST https://ivs.idenfy.com/api/v2/upload-additional-step
Authorization: Basic {API_KEY}:{API_SECRET}
Content-Type: application/json
```
You can allow users to update or re-submit documents for custom additional steps after their initial verification attempt. This addresses scenarios such as:
* Correcting a previously uploaded document that was deemed invalid (e.g., a utility bill older than three months).
* Providing a required additional document after the main identity verification flow has been completed.
When a new document is submitted this way, it overrides any data previously uploaded for that specific additional step during the earlier verification attempt.
### Request Example
```json theme={"system"}
{
"scanRef": "3f2d0e6a-0a37-11ec-a45b-025ad99a18e7",
"image": "{{Base64 image}}",
"step": "UTILITY_BILL",
"additionalData": {}
}
```
***
## Additional Configurations
### Verification Without Custom Additional Step
If a custom additional step is pre-configured on iDenfy's side but you need to create some tokens without it, pass an empty object for the step:
```json theme={"system"}
{
"additionalSteps": {
"ALL": {
"ALL": {}
}
}
}
```
### Multiple Custom Additional Steps
If multiple custom additional steps are configured at the environment level, token creation includes all of them by default. To use only a specific step, specify it explicitly.
For example, if `UTILITY_BILL` and `ADDITIONAL_DOCUMENT` are configured and you want only the latter:
```json theme={"system"}
{
"additionalSteps": {
"ALL": {
"ALL": ["ADDITIONAL_DOCUMENT"]
}
}
}
```
### Customization Options
The default `UTILITY_BILL` step always includes a selection step from the user's perspective. This step is configurable on the partner environment level (if permissions are granted). Find it at **Settings > Configuration > Customisation > Allowed POA Documents** or contact iDenfy's tech support team to edit it.
* Bank Statement
* Electricity Bill
* Water Bill
* Credit Card Bill or Statement
* Gas Bill
* Telephone Bill
* Bank Reference Letter
* Internet Bill
* Mortgage Statement or Contract
* Company Payslip
* Car or Home Insurance Policy
* Municipality Bill or Government Tax Letter
* Driver's License
* Residence Permit
* Official Letter from an Educational Institution
* Lease Agreement for Your Residence
* Letter of Employment
* Authorized Change of Address Form
* Car Registration
* Other
* Letter Issued by a Public Authority
***
## Managing Custom Additional Steps Per Request
**Recommended approach: Server-side configuration.** Controlling custom additional steps by sending specific instructions with each API request is not the standard method and should only be used as a fallback. We strongly recommend configuring your custom additional steps within your iDenfy account settings whenever possible.
If necessary, you can define or override the behavior of custom additional steps for individual verification requests. This is done by including a specifically structured `additionalSteps` object when [creating the verification session](/kyc/generate-token).
If you use different types of additional steps, you must have sufficient credits for each type.
### Request Example
```json theme={"system"}
{
"clientId": "1",
"additionalSteps": {
"ALL": {
"ALL": {
"UTILITY_BILL": {
"type": "COMPARE",
"texts": {
"en": {
"name": "YOUR_PROVIDED_NAME_FOR_SECTION",
"description": "YOUR_EXPLANATION_OF_THE_SECTION"
}
},
"fields": ["address"],
"settings": {
"canUpload": false,
"canCapture": true,
"canUploadPDF": false
}
}
}
}
}
}
```
# Data Retrieval
Source: https://documentation.idenfy.com/kyc/data-retrieval
Retrieve identity verification status, extracted document data, and uploaded files via the iDenfy API as a fallback to webhook delivery.
**Webhooks are the recommended method for receiving verification results.** They deliver data efficiently as events happen.
Use these endpoints **only** as a fallback:
* If you suspect a [webhook](/kyc/webhooks) notification failed or missed data
* To fetch details for a verification after it has already finished
**Do not poll `/api/v2/status`** as part of your main integration flow. iDenfy does not support regular polling and may restrict your access.
Some data fields may be `null` if the information was not present on the document or unreadable due to image quality.
***
## Verification Status
```
POST https://ivs.idenfy.com/api/v2/status
Authorization: Basic {API_KEY}:{API_SECRET}
Content-Type: application/json
```
### Request
```json theme={"system"}
{
"scanRef": "328c6766-934e-11ed-bb9b-025ad99a18e7"
}
```
### Response
```json theme={"system"}
{
"fraudTags": [],
"mismatchTags": [],
"autoDocument": "DOC_VALIDATED",
"autoFace": "FACE_MATCH",
"manualDocument": "DOC_VALIDATED",
"manualFace": "FACE_MATCH",
"scanRef": "328c6766-934e-11ed-bb9b-025ad99a18e7",
"clientId": "W2GL2K333Y",
"status": "APPROVED"
}
```
### Response Fields
| Field | Description |
| ---------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `status` | Overall verification status: `APPROVED`, `DENIED`, `SUSPECTED`, `REVIEWING`, `ACTIVE`, `EXPIRED`. See [Status Handling](/guides/dashboard/kyc/status-handling) for what to do with each. |
| `autoDocument` | Automated document check result (e.g., `DOC_VALIDATED`, `DOC_NOT_FOUND`). |
| `autoFace` | Automated face check result (e.g., `FACE_MATCH`, `FACE_MISMATCH`). |
| `manualDocument` | Manual review document result. Empty if not reviewed yet. |
| `manualFace` | Manual review face result. Empty if not reviewed yet. |
| `fraudTags` | Array of fraud indicators that can produce a `SUSPECTED` status. See [Suspected Status](/kyc/suspected-status) for examples. |
| `mismatchTags` | Array of data mismatches between token data and document data. See [Suspected Status](/kyc/suspected-status) for examples. |
| `scanRef` | Unique verification identifier. |
| `clientId` | Your client identifier. |
***
## Verification Data
```
POST https://ivs.idenfy.com/api/v2/data
Authorization: Basic {API_KEY}:{API_SECRET}
Content-Type: application/json
```
### Request
```json theme={"system"}
{
"scanRef": "328c6766-934e-11ed-bb9b-025ad99a18e7"
}
```
### Response
```json theme={"system"}
{
"docFirstName": "JOHN",
"docLastName": "SAMPLE BUTCH",
"docNumber": "DE4878783",
"docPersonalCode": null,
"docExpiry": "2024-03-09",
"docDob": "1965-03-10",
"docDateOfIssue": "2014-03-09",
"docType": "PASSPORT",
"docSex": "MALE",
"docNationality": "NL",
"docIssuingCountry": "NL",
"docTemporaryAddress": null,
"docBirthName": null,
"birthPlace": "LONDON",
"authority": "BURG",
"address": null,
"mothersMaidenName": null,
"driverLicenseCategory": null,
"manuallyDataChanged": false,
"fullName": "JOHN SAMPLE BUTCH",
"orgFirstName": "JOHN",
"orgLastName": "SAMPLE BUTCH",
"orgNationality": "NEDERLANDSE",
"orgBirthPlace": "LONDON",
"orgAuthority": "BURG",
"orgAddress": null,
"selectedCountry": "NL",
"ageEstimate": null,
"clientIpProxyRiskLevel": null,
"duplicateFaces": null,
"duplicateDocFaces": null,
"addressVerification": null,
"additionalData": {},
"scanRef": "328c6766-934e-11ed-bb9b-025ad99a18e7",
"clientId": "W2GL2K333Y"
}
```
### Key Data Fields
| Field | Description |
| ----------------------------------------- | ---------------------------------------------------------------------------- |
| `docFirstName` / `docLastName` | Parsed name from document (standardized). |
| `orgFirstName` / `orgLastName` | Original name as it appears on the document (may include native characters). |
| `docNumber` | Document number. |
| `docPersonalCode` | Personal/national code from document. |
| `docExpiry` / `docDob` / `docDateOfIssue` | Document dates (format: `YYYY-MM-DD`). |
| `docType` | Document type (`PASSPORT`, `ID_CARD`, `DRIVER_LICENSE`, etc.). |
| `docSex` | Gender from document (`MALE`, `FEMALE`). |
| `docNationality` / `docIssuingCountry` | ISO country codes. |
| `selectedCountry` | Country the user selected during verification. |
| `manuallyDataChanged` | `true` if a human reviewer corrected any OCR data. |
| `fullName` | Combined full name. |
| `ageEstimate` | Estimated age (if available). |
| `clientIpProxyRiskLevel` | Proxy risk level (if proxy check enabled). |
| `duplicateFaces` / `duplicateDocFaces` | Duplicate detection results (if enabled). |
| `addressVerification` | Address verification result (if enabled). |
| `additionalData` | Data from additional steps. |
Any field can be `null`. Some fields in the original language may contain UTF-16 encoded characters.
***
## Verification Files
```
POST https://ivs.idenfy.com/api/v2/files
Authorization: Basic {API_KEY}:{API_SECRET}
Content-Type: application/json
```
### Request
```json theme={"system"}
{
"scanRef": "328c6766-934e-11ed-bb9b-025ad99a18e7"
}
```
### Response
```json theme={"system"}
{
"FACE": "https://...",
"FRONT": "https://...",
"fileUrls": {
"FACE": "https://...",
"FRONT": "https://..."
},
"videoUrls": {},
"additionalStepPdfUrls": {}
}
```
Always use URLs from `fileUrls` and `videoUrls`. Top-level file URLs outside these objects may be removed in the future.
# Identification Deletion
Source: https://documentation.idenfy.com/kyc/deletion
Delete identity verification data and associated files via the iDenfy API for GDPR compliance using the scanRef identifier endpoint.
**Requirements:**
* API key pair
* `scanRef` of the verification to delete
***
## Deleting Verification Data
```
POST https://ivs.idenfy.com/api/v2/delete
Authorization: Basic {API_KEY}:{API_SECRET}
Content-Type: application/json
```
This endpoint removes data from iDenfy's system including client photos of their document and face, parsed document information, names, surnames, and other personal data.
The only required parameter is `scanRef` of the verification.
### Request Example
```json theme={"system"}
{
"scanRef": "350e2420-8850-11e9-baa5-309c231b1bac"
}
```
### Response -- Success
For successful API calls that correctly delete all data, there will be no message body -- just a response with a **200** status code.
### Response -- Failed
Failed API calls return a message identifying the problem.
```json theme={"system"}
{
"message": "Token has not expired yet.",
"identifier": "PARTNER_ERROR",
"documentation": "",
"severity": "NOT_SEVERE"
}
```
In case of a malformed JSON body or API key/secret mismatch, you will receive a standard iDenfy API error response. For more details, see [error messages](/kyc/id-error-messages).
# Direct Processing
Source: https://documentation.idenfy.com/kyc/direct-processing
Submit identity document images via a single API call for asynchronous server-side KYC verification — no SDK or user-facing session required.
**Requirements:**
* API key pair
* **Direct Processing** feature enabled on your contract (contact iDenfy to activate)
**Limitations:**
* Does not support **3D liveness detection** or **short photo sequences**. Use a different integration type if these are required.
* Maximum request size: **20 MB** (total across all images).
* Cannot be used to update an existing verification. Use the [Request Update feature](/kyc/request-update) or re-verify using the same `clientId` via [session creation](/kyc/generate-token).
* Digital ID types are not supported and will be rejected.
***
## How It Works
Direct processing lets you submit document images in a single POST request. The API responds immediately — the actual OCR, face matching, fraud checks, and AML screening all run asynchronously after the response. Results are delivered via webhook.
***
## Endpoint
```
POST https://ivs.idenfy.com/api/v2/process
Authorization: Basic {API_KEY}:{API_SECRET}
Content-Type: application/json
```
***
## Request Parameters
### Required
The verification session token generated beforehand via [session creation](/kyc/generate-token).
* Must be valid, unused, and belong to the authorized partner.
* Deactivated immediately after the request — cannot be reused.
* Must not have questionnaire answers (`kyc_answers`) attached.
* NFC must not be required for the session.
ISO 3166-1 alpha-2 country code (e.g. `LT`, `US`, `DE`). Converted to uppercase automatically. Must be a valid recognized country code.
A dictionary of Base64-encoded images, keyed by side:
| Key | Description | Required |
| --------------------- | ------------------------- | ---------------------------------------------------------------- |
| `FRONT` | Document front | Always |
| `BACK` | Document back | When the document type has a back side |
| `FACE` | Selfie | Required for identification sessions; optional for document-only |
| `UTILITY_BILL` | Utility bill image or PDF | When configured as a required step on the token |
| `SECOND_UTILITY_BILL` | Second utility bill | When configured |
**Supported formats:** PNG, JPG, JPEG, PDF. Encrypted or password-protected PDFs are rejected.
### Optional
Specifies the document being submitted. Valid values: `ID_CARD`, `PASSPORT`, `DRIVER_LICENSE`, `RESIDENCE_PERMIT`.
If omitted, the system automatically detects the document type from the `FRONT` image. If auto-detection fails, the request is rejected with an error.
When `documentType` is provided, `BACK` becomes required if that document type has a back side.
Set to `true` to skip photo quality checks (blur, glare, document detection). Useful when a valid photo fails standard detection.
Does **not** skip data extraction or fraud checks — only the photo validation step.
***
## Verification Types
The session `tokenType` set during [session creation](/kyc/generate-token) determines what images are expected:
* **IDENTIFICATION (Default):** Requires a `FACE` image. Face matching runs against the document photo.
* **DOCUMENT:** Document-only. Face step is removed automatically — no `FACE` image or liveness check required. Result is marked `FACE_NOT_CHECKED`.
***
## Additional Steps
Some verification flows require extra document checks beyond the main identity document — for example, a utility bill for address verification. These are configured as additional steps on the token at [session creation](/kyc/generate-token), not in the `/v2/process` call itself.
**How it works:**
1. **Token creation** — the partner sets up the token with `UTILITY_BILL` as a required additional step, and optionally passes a reference address to compare against via `additionalData`:
```json theme={"system"}
{
"additionalData": {
"UTILITY_BILL": {
"address": "123 Main St, City"
}
}
}
```
2. **Direct processing call** — the partner includes the utility bill image inside the `images` object alongside the main document images. No extra fields are needed in the `/v2/process` request body.
3. **Processing** — depending on the step configuration, the system will:
| Mode | Behaviour |
| --------- | -------------------------------------------------------------------------------------- |
| `UPLOAD` | Stores the image; no analysis |
| `EXTRACT` | Extracts the address from the bill; no comparison |
| `COMPARE` | Extracts the address and checks it against the reference address from `additionalData` |
***
## Conditions and Rules
| Condition | Rule |
| ------------------------ | ----------------------------------------------------------------------------------------------- |
| Partner access | Partner must have direct processing enabled in their contract — if not, the request is rejected |
| Token with questionnaire | Not allowed. Token must have no `kyc_answers` attached |
| NFC required token | Not allowed with direct processing |
| `documentType` omitted | Only `FRONT` is mandatory; document type is auto-detected from the image |
| `documentType` provided | `BACK` becomes required if that document type has a back side |
| `FACE` image | Required when the session type includes face matching |
| PDF submitted | Must not be password-protected |
| Token reuse | Token is deactivated after one direct processing call |
***
## Request Examples
**With explicit document type:**
```json theme={"system"}
{
"authToken": "3FA5TFPA2ZE3LMPGGS1EGOJNJE",
"country": "LT",
"documentType": "ID_CARD",
"images": {
"FRONT": "/9j/4AAQSkZJRgABAQAAAQABAAD/4...",
"BACK": "/9j/4AAQSkZJRgABAQAAAQABAAD/4...",
"FACE": "/9j/4AAQSkZJRgABAQAAAQABAAD/4..."
}
}
```
**With auto document type detection (documentType omitted):**
```json theme={"system"}
{
"authToken": "3FA5TFPA2ZE3LMPGGS1EGOJNJE",
"country": "LT",
"images": {
"FRONT": "/9j/4AAQSkZJRgABAQAAAQABAAD/4...",
"FACE": "/9j/4AAQSkZJRgABAQAAAQABAAD/4..."
}
}
```
***
## Response
A successful request returns HTTP **200** with no response body. Processing continues asynchronously.
### Error Response
Failed requests return a JSON body identifying the problem:
```json theme={"system"}
{
"message": "No image provided for step 'BACK'",
"identifier": "MISSING_VALUE",
"documentation": "",
"severity": "NOT_SEVERE"
}
```
A `200 OK` with an error message body may indicate the document was not detected in the photo. If this happens:
* Add `"skipAnalysis": true` to the request, or
* Use a clearer photo with a fully visible document.
See the full list of [error messages](/kyc/id-error-messages).
***
## What Happens After
Once the request is accepted, processing runs asynchronously:
1. **OCR** extracts document fields — name, date of birth, expiry, document number, nationality, and more.
2. **Face matching** runs if a `FACE` image was provided.
3. **Fraud checks** and **AML/sanctions screening** run automatically.
4. **Results are delivered via webhook** to your configured endpoint.
See [Webhooks](/guides/webhooks-overview) for payload details.
# Dual Verification Flow
Source: https://documentation.idenfy.com/kyc/dual-verification
Run a silent second identity check on documents your user uploads during their first verification — no second UI session required.
**Requirements:**
* API key pair
* **Direct Processing** enabled on your contract (contact iDenfy)
* **Custom Additional Steps** enabled on your account (contact iDenfy)
* Additional step credits
***
## Overview
This pattern lets you verify two different identity documents from the same user while only showing them one verification UI. The user completes the standard flow and uploads the second document as a custom additional step. Your backend then silently runs a second verification on those files via direct processing — no second session for the user.
Both verifications are linked by the same `clientId` and each produces its own webhook result.
```mermaid theme={"system"}
%%{init: {'theme': 'base', 'themeVariables': {'fontFamily': 'Inter, sans-serif', 'fontSize': '11px', 'primaryColor': '#734BFB', 'primaryTextColor': '#ffffff', 'primaryBorderColor': '#5A2FE0', 'lineColor': '#9B7BFC', 'edgeLabelBackground': '#5A2FE0', 'edgeTextColor': '#ffffff'}}}%%
flowchart TB
subgraph r1[" "]
direction LR
A("`Create Token 1`") --> B("`Send verification link`") --> C("`User completes verification
& uploads extra document`") --> D("`Webhook received`")
end
subgraph r2[" "]
direction LR
E{{"`Verification **APPROVED** and additional steps completed?`"}} -->|Yes| F("`Download files
1-hour window`") --> G("`Create Token 2
same **clientId**`") --> H("`**POST /api/v2/process**
auto-detects doc type`") --> I("`Second webhook
verification complete`")
end
D --> E
E -->|No| Z("`Stop`")
classDef step fill:#734BFB,stroke:#5A2FE0,color:#ffffff
classDef user fill:#9B7BFC,stroke:#734BFB,color:#ffffff
classDef decision fill:#5A2FE0,stroke:#4c1d95,color:#ffffff
classDef stop fill:#ef4444,stroke:#dc2626,color:#ffffff
classDef done fill:#22c55e,stroke:#16a34a,color:#ffffff
class A,B,D,F,G,H step
class C user
class E decision
class Z stop
class I done
style r1 fill:none,stroke:none
style r2 fill:none,stroke:none
```
***
## Step 1 — Create Token 1 (User-Facing)
Token 1 needs a custom additional step that prompts the user to upload the extra document(s). The simplest setup is to have iDenfy support configure this as a **default on your account** — it then applies automatically to every session without any extra parameters in the token request.
If you need per-request control instead (for example, to apply the step only on certain sessions), you can pass the `additionalSteps` object yourself when creating the token. See [Additional Steps](/kyc/additional-steps#managing-custom-additional-steps-per-request) for the full structure and options.
Save the `scanRef` from the response — you'll use it to match the incoming webhook. For all token parameters, see [Create Verification Session](/kyc/generate-token).
***
## Step 2 — Send the User to Verification
Redirect the user using the `authToken` from the Token 1 response. They complete the standard flow and then see the additional upload step(s) at the end.
See [iFrame / Redirect](/kyc/iframe-redirect) for integration options.
***
## Step 3 — Receive Webhook and Download Files
When the user finishes, your configured `callbackUrl` receives a webhook. Before proceeding, confirm two things:
1. **The main verification was approved** — check `status.overall`. Do not trigger the second verification if the primary identity check failed.
2. **The additional step was completed successfully** — check `status.additionalSteps`. This is independent of the main result: a user can pass the identity check but still fail or skip the extra upload. Only proceed if both statuses are positive.
Then download the files:
| Field | What it contains |
| ------------------------ | ------------------------------------------------------------------------------------------------- |
| `additionalSteps` | Map of step name → processing type, confirms which steps were completed |
| `status.additionalSteps` | `"Additional step is valid"` / `"Additional step is invalid"` / `"Additional step was not found"` |
| `fileUrls` | Pre-signed download URLs for image files, keyed by step name |
| `additionalStepPdfUrls` | Pre-signed download URLs for PDF files, keyed by step name |
For the full webhook payload structure and all status fields, see [KYC Webhooks](/kyc/webhooks).
***
## Step 4 — Create Token 2 (Silent)
Create a second token using the **same `clientId`** to link it to the same person. This token is never shown to the user — it exists only to authorize the direct processing call.
If your account has custom additional steps configured as a default, **disable them explicitly** on Token 2 by passing an empty `additionalSteps` object. The recommended approach here is to have iDenfy support configure the step as your account default and suppress it only for Token 2 this way:
```json theme={"system"}
{
"clientId": "user-123",
"tokenType": "DOCUMENT",
"additionalSteps": {
"ALL": {
"ALL": {}
}
}
}
```
See [Additional Steps → Verification Without Custom Additional Step](/kyc/additional-steps#verification-without-custom-additional-step) for details on the suppression syntax.
Additional points:
* **No `successUrl` / `errorUrl`** — no one is watching this flow.
* **No questionnaire** — direct processing is incompatible with KYC questionnaires. If your account attaches them by default, set `"questionnaire": null`.
Save the `authToken` and `scanRef` from the response.
***
## Step 5 — Submit via Direct Processing
Convert the files you downloaded in Step 3 to base64 and submit them to the direct processing endpoint using Token 2's `authToken`. Omit `documentType` — the system automatically detects the document type from the `FRONT` image. This means you can fully automate the second verification without knowing in advance what document the user uploaded.
```json theme={"system"}
{
"token": "",
"country": "LT",
"images": {
"FRONT": "",
"BACK": ""
}
}
```
A `200 OK` with no body means the request was accepted. Processing runs asynchronously and the result is delivered via a second webhook to your `callbackUrl`. Use the `scanRef` from Token 2 to identify which webhook belongs to which verification.
For the full endpoint reference, parameters, and error handling, see [Direct Processing](/kyc/direct-processing).
***
## Tips
**Check both statuses before proceeding**
Only trigger the direct processing step after confirming both `status.overall` (main verification approved) and `status.additionalSteps` (document uploaded successfully). A passing identity check does not guarantee the additional step was completed.
**File URLs are valid for 1 hour**
The URLs in `fileUrls` and `additionalStepPdfUrls` are pre-signed and expire after one hour. Download the files as soon as the webhook arrives — do not store the URL and fetch it later.
**Token 2 must not have a questionnaire**
Direct processing rejects tokens with questionnaire answers attached. See the [Direct Processing conditions table](/kyc/direct-processing#conditions--rules) for the full list of token requirements.
**Token 1 cannot be reused**
The first token is deactivated the moment the user completes the flow. Create a fresh token (Token 2) for the direct processing call.
# Dummy Results
Source: https://documentation.idenfy.com/kyc/dummy-results
Test identity verification outcomes with predefined dummy data and auto-results in the iDenfy development environment sandbox testing.
**Requirements:**
* API key pair
* **DEV** environment
* Finances added to your environment
Dummy results only work in the **DEV** environment. Calling either endpoint from any other environment returns an error:
| Environment | Error message |
| ----------- | ------------------------------------------------------------------- |
| DEMO | `"This endpoint is not available for DEMO partners."` |
| TEST / PROD | `"This endpoint is not available for TESTING/PRODUCTION partners."` |
**Why is DEMO excluded?** The DEMO environment is intended for showing the real verification flow to prospective clients. Dummy shortcuts would let partners simulate completed verifications without going through the actual process, which could give clients a misleading picture of what the product does. The restriction is intentional.
***
## Dummy Auto Results
```
POST https://ivs.idenfy.com/api/v2/token
Authorization: Basic {API_KEY}:{API_SECRET}
Content-Type: application/json
```
You can create a session with a dummy auto status for verification in the development environment.
The request must contain the same parameters as [session creation](/kyc/generate-token) plus `dummyStatus`, which defines the dummy session's auto result.
| JSON key | Type | Description |
| ------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `dummyStatus` | `String` | Auto status of the verification. Possible values: `APPROVED`, `DENIED`, `SUSPECTED`, `EXPIRED`. See [Verification Statuses](/guides/dashboard/kyc/verification-statuses#overall-status) for details. |
### Request Example
```json theme={"system"}
{
"dummyStatus": "APPROVED",
"clientId": "100000",
"firstName": "John Tom",
"lastName": "Smith",
"successUrl": "https://www.my-company.com/idenfy/success",
"errorUrl": "https://www.my-company.com/idenfy/fail",
"locale": "en",
"showInstructions": true,
"expiryTime": 600,
"sessionLength": 600,
"country": "lt",
"documents": ["PASSPORT", "ID_CARD"],
"dateOfBirth": "1990-12-20",
"dateOfExpiry": "1990-12-20",
"dateOfIssue": "1990-12-20",
"nationality": "lt",
"personalNumber": "123456789",
"documentNumber": "123456",
"sex": "M",
"address": "Address",
"tokenType": "IDENTIFICATION",
"externalRef": "reference"
}
```
### Response Example
A successful API call returns a JSON response with a `scanRef` that can be used to add a dummy manual status.
```json theme={"system"}
{
"message": "Dummy token and verification created successfully",
"authToken": "pgYQX0z2T8mtcpNj9I20uWVCLKNuG0vgr12f0wAC",
"scanRef": "ec6a7108-8c26-11e9-9758-309c231b1bac",
"clientId": "100000",
"firstName": "JOHN TOM",
"lastName": "SMITH",
"successUrl": "https://www.my-company.com/idenfy/success",
"errorUrl": "https://www.my-company.com/idenfy/fail",
"locale": "en",
"showInstructions": true,
"country": "lt",
"expiryTime": 600,
"sessionLength": 600,
"documents": ["PASSPORT"],
"dateOfBirth": "1990-12-20",
"dateOfExpiry": "1990-12-20",
"dateOfIssue": "1990-12-20",
"nationality": "lt",
"personalNumber": "123456789",
"documentNumber": "123456",
"sex": "M",
"digitString": "4823657",
"address": "Address",
"tokenType": "IDENTIFICATION",
"externalRef": "reference"
}
```
***
## Dummy Manual Result
```
POST https://ivs.idenfy.com/api/v2/add-dummy-status
Authorization: Basic {API_KEY}:{API_SECRET}
Content-Type: application/json
```
You can add a dummy manual status for a verification in the development environment and receive the same webhook as after a real manual review.
* The client's verification must already be created. If not, generate a new token with `dummyStatus` first.
* For an approved verification, you need to provide both `FACE_MATCH` and `DOC_VALIDATED` statuses.
### Request Parameters
| Key | Type | Description |
| ------------------------ | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `scanRef` | `String` | A unique string identifying a client verification. |
| `manualFaceMatchResult` | `String` | Dummy manual face status. Possible values: `FACE_MATCH`, `FACE_MISMATCH`, `NO_FACE_FOUND`, `TOO_MANY_FACES`, `FACE_TOO_BLURRY`, `FACE_UNCERTAIN`, `FACE_NOT_ANALYSED`, `FACE_NOT_CHECKED`, `FACE_ERROR`, `AUTO_UNVERIFIABLE`, `FAKE_FACE`. See [Verification Statuses → Face Status Values](/guides/dashboard/kyc/verification-statuses#face-status-values) for details. |
| `manualDocumentValidity` | `String` | Dummy manual document status. Possible values: `DOC_VALIDATED`, `DOC_INFO_MISMATCH`, `DOC_NOT_FOUND`, `DOC_NOT_FULLY_VISIBLE`, `DOC_NOT_SUPPORTED`, `DOC_FACE_NOT_FOUND`, `DOC_TOO_BLURRY`, `DOC_FACE_GLARED`, `MRZ_NOT_FOUND`, `MRZ_OCR_READING_ERROR`, `BARCODE_NOT_FOUND`, `DOC_EXPIRED`, `COUNTRY_MISMATCH`, `DOC_TYPE_MISMATCH`, `DOC_DAMAGED`, `DOC_FAKE`, `DOC_ERROR`, `AUTO_UNVERIFIABLE`, `DOC_NOT_ANALYSED`, `DOC_NAME_ERROR`, `DOC_SURNAME_ERROR`, `DOC_EXPIRY_ERROR`, `DOC_DOB_ERROR`, `DOC_PERSONAL_NUMBER_ERROR`, `DOC_NUMBER_ERROR`, `DOC_DATE_OF_ISSUE_ERROR`, `DOC_SEX_ERROR`, `DOC_NATIONALITY_ERROR`. See [Verification Statuses → Document Status Values](/guides/dashboard/kyc/verification-statuses#document-status-values) for details. |
### Request Example
```json theme={"system"}
{
"scanRef": "unique_scan_ref",
"manualDocumentValidity": "DOC_ERROR",
"manualFaceMatchResult": "FACE_MATCH"
}
```
A successful API call returns a response with a **200** status code.
# Create Verification Session
Source: https://documentation.idenfy.com/kyc/generate-token
Create an identity verification session by generating an authentication token via the iDenfy API with minimal or advanced parameters.
```
POST https://ivs.idenfy.com/api/v2/token
Authorization: Basic {API_KEY}:{API_SECRET}
Content-Type: application/json
```
***
## Common Examples
Start with these, then customize using the [full parameter reference](#all-parameters) below.
The only required field is `clientId`:
```json theme={"system"}
{
"clientId": "user-123"
}
```
Everything else uses your Dashboard defaults.
Provide user data to cross-check against the document. Mismatches trigger `SUSPECTED` status:
```json theme={"system"}
{
"clientId": "user-123",
"firstName": "John",
"lastName": "Doe",
"dateOfBirth": "1990-05-15"
}
```
Lock verification to specific countries and document types:
```json theme={"system"}
{
"clientId": "user-123",
"firstName": "John",
"lastName": "Doe",
"country": ["US", "GB", "DE"],
"documents": ["PASSPORT", "ID_CARD"]
}
```
All commonly used fields:
```json theme={"system"}
{
"clientId": "user-123",
"firstName": "John",
"lastName": "Doe",
"dateOfBirth": "1990-05-15",
"country": "US",
"documents": ["PASSPORT", "ID_CARD"],
"locale": "en",
"expiryTime": 3600,
"sessionLength": 600,
"successUrl": "https://yourapp.com/verified",
"errorUrl": "https://yourapp.com/failed",
"callbackUrl": "https://yourapp.com/webhook"
}
```
### Code Examples
```bash cURL theme={"system"}
curl -X POST https://ivs.idenfy.com/api/v2/token \
-u "YOUR_API_KEY:YOUR_API_SECRET" \
-H "Content-Type: application/json" \
-d '{"clientId": "user-123", "firstName": "John", "lastName": "Doe"}'
```
```python Python theme={"system"}
import requests
response = requests.post(
"https://ivs.idenfy.com/api/v2/token",
auth=("YOUR_API_KEY", "YOUR_API_SECRET"),
json={"clientId": "user-123", "firstName": "John", "lastName": "Doe"}
)
token = response.json()
# token["authToken"] → pass to frontend
# token["redirectUrl"] → or redirect user here
```
```javascript Node.js theme={"system"}
const response = await fetch("https://ivs.idenfy.com/api/v2/token", {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: "Basic " + btoa("YOUR_API_KEY:YOUR_API_SECRET"),
},
body: JSON.stringify({ clientId: "user-123", firstName: "John", lastName: "Doe" }),
});
const token = await response.json();
// token.authToken → pass to frontend
// token.redirectUrl → or redirect user here
```
```php PHP theme={"system"}
$ch = curl_init("https://ivs.idenfy.com/api/v2/token");
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_USERPWD, "YOUR_API_KEY:YOUR_API_SECRET");
curl_setopt($ch, CURLOPT_HTTPHEADER, ["Content-Type: application/json"]);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
"clientId" => "user-123", "firstName" => "John", "lastName" => "Doe"
]));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$token = json_decode(curl_exec($ch), true);
```
```ruby Ruby theme={"system"}
require "net/http"
require "json"
uri = URI("https://ivs.idenfy.com/api/v2/token")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
request = Net::HTTP::Post.new(uri)
request.basic_auth("YOUR_API_KEY", "YOUR_API_SECRET")
request.content_type = "application/json"
request.body = { clientId: "user-123", firstName: "John", lastName: "Doe" }.to_json
token = JSON.parse(http.request(request).body)
```
***
## Response
```json theme={"system"}
{
"message": "Token created successfully",
"authToken": "pgYQX0z2T8mtcpNj9I20uWVCLKNuG0vgr12f0wAC",
"scanRef": "ec6a7108-8c26-11e9-9758-309c231b1bac",
"clientId": "user-123",
"firstName": "JOHN",
"lastName": "DOE",
"redirectUrl": "https://ivs.idenfy.com/api/v2/redirect?authToken=pgYQX0z2T8...",
"digitString": null,
"expiryTime": 3600,
"sessionLength": 600
}
```
**Key response fields:**
| Field | Use it for |
| ------------- | ----------------------------------------------------------------- |
| `authToken` | Pass to iFrame, SDK, or redirect URL |
| `redirectUrl` | Redirect user here for hosted verification |
| `scanRef` | Unique verification ID — store this in your database |
| `digitString` | 8-digit code for mobile app (only if `generateDigitString: true`) |
***
## What to Do Next
After generating the token, send your user to verification:
| Method | Code | When to use |
| --------------- | ------------------------------------------------------------------------------------------ | -------------------------------------------------------------------- |
| **Redirect** | `window.location.href = token.redirectUrl` | Simplest. User leaves your site. |
| **iFrame** | `