> ## Documentation Index
> Fetch the complete documentation index at: https://eurusys-6c0957fa.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Validation methods

> The validation request types — segregated by document and capture mode — with the fields, prerequisites, and code to implement each.

The SDK exposes a single `validate(request)` call. The **request type** you construct selects the document and how it's captured. There are two documents — **Emirates ID** and **Passport** — and for Emirates ID, three capture modes, each of which can optionally attach a fingerprint for [biometric matching](/concepts/biometrics).

<Warning>
  Each method must be **enabled on your API key** ([Methods](/dashboard/methods)). Calling a method your key isn't scoped for fails with **`METHOD_NOT_ALLOWED` (1011)** — see [error codes](/reference/error-codes).
</Warning>

The examples below use the desktop/Swift class-based shape; the type names are the same across Kotlin, C#, and C (see [Naming across platforms](#naming-across-platforms)), and each [SDK guide](/sdks/swift) shows the exact syntax for that language.

## Emirates ID

### Manual entry

Type the Emirates ID details — **no hardware required**. Good for quick, lower-assurance checks.

| Field                                      | Required | Notes                                                        |
| ------------------------------------------ | -------- | ------------------------------------------------------------ |
| `idNumber`                                 | yes      | e.g. `784-XXXX-XXXXXXX-X`                                    |
| `documentNumber`                           | yes      | The card/document number                                     |
| `nationality`                              | yes      | ISO-3 country code, e.g. `ARE`                               |
| `dateOfBirth` / `issueDate` / `expiryDate` | no       | As required by the method                                    |
| `clientReferenceId`                        | no       | Optional **UUID** to correlate with your records (see below) |

```swift theme={null}
let req = EmiratesIdManual(
    idNumber: "784-XXXX-XXXXXXX-X",
    documentNumber: "...",
    nationality: "ARE")
```

### Card read

Reads the chip from a physical card on a smart card reader — proves the genuine card is present.

<Info>**Prerequisites:** a smart card reader, plus the `mbkyc-pcsc-service` [desktop service](/distribution/services-overview) on desktop. Get `readerId` from `listSmartcardReaders()`.</Info>

| Field               | Required | Notes                                       |
| ------------------- | -------- | ------------------------------------------- |
| `readerId`          | yes      | From `listSmartcardReaders()`               |
| `cardDipTimeoutMs`  | no       | How long to wait for a card to be presented |
| `clientReferenceId` | no       | Optional UUID (see below)                   |

```swift theme={null}
let req = EmiratesIdCard(readerId: reader.id)
```

### Card read + fingerprint

Reads the chip **and** captures a live fingerprint, matching it against the card — the highest assurance (proves the cardholder is present).

<Info>**Prerequisites:** a smart card reader **and** a fingerprint sensor, plus their [desktop services](/distribution/services-overview) (`mbkyc-pcsc-service` + your fingerprint vendor's service). See [Biometrics](/concepts/biometrics) for the finger-recommendation flow.</Info>

```swift theme={null}
let fingerprint = Fingerprint(
    readerId: scanner.id,
    recommendationDelegate: MyFingerDelegate())

let req = EmiratesIdCard(readerId: reader.id, fingerprint: fingerprint)
```

<Tip>You can also attach a `fingerprint` to **Manual entry** (`EmiratesIdManual(..., fingerprint:)`) to add a biometric match without a card read.</Tip>

### NFC (Android only)

On Android, the Emirates ID chip can be read over the device's built-in NFC instead of a USB reader — no smart card hardware needed. See the [Android guide](/sdks/android). Not available on desktop.

## Passport

### Manual entry

Type the passport details — **no hardware required**. **No biometric variant.**

| Field                                      | Required | Notes                     |
| ------------------------------------------ | -------- | ------------------------- |
| `passportNumber`                           | yes      |                           |
| `passportType`                             | yes      | e.g. `P`                  |
| `nationality`                              | yes      | ISO-3 country code        |
| `dateOfBirth` / `issueDate` / `expiryDate` | no       | As required               |
| `clientReferenceId`                        | no       | Optional UUID (see below) |

```swift theme={null}
let req = PassportManual(
    passportNumber: "...",
    passportType: "P",
    nationality: "IND")
```

## Choosing a method

```mermaid theme={null}
flowchart TD
    D{Which document?}
    D -->|Emirates ID| H{How to capture?}
    D -->|Passport| P["PassportManual"]
    H -->|Smart card reader| C["EmiratesIdCard"]
    H -->|NFC (Android)| N["Android NFC read"]
    H -->|No hardware| M["EmiratesIdManual"]
    C --> F{Match a fingerprint?}
    M --> F
    F -->|Yes| FP["attach Fingerprint"]
    F -->|No| OK["done"]
```

## The result

Every method resolves to a `VerificationResult`:

| Field               | Notes                                                                  |
| ------------------- | ---------------------------------------------------------------------- |
| `success`           | Whether the identity was verified                                      |
| `message`           | Human-readable status                                                  |
| `dataJson`          | JSON string with the verified resident/identity data (when successful) |
| `clientReferenceId` | Echoes your request value (or a generated UUID)                        |

The data payload holds the resident's verified details — **[Verification response](/reference/verification-response)** documents every field it can contain.

### Client reference ID

`clientReferenceId` ties a verification back to your own records — it's echoed on the result and shown on the [transaction](/dashboard/journeys).

<Warning>
  It must be a **UUID**. If you omit it, the Validation Gateway generates one. If you supply a value that isn't a valid UUID, it is **silently ignored** and replaced — so you'd lose your correlation with no error. Generate a UUID per verification (e.g. `3fa85f64-5717-4562-b3fc-2c963f66afa6`).
</Warning>

## Naming across platforms

The request type is named idiomatically per language but maps to the same method:

| Concept             | Swift / Kotlin / C#                | TypeScript `kind`   | C `request_type`         |
| ------------------- | ---------------------------------- | ------------------- | ------------------------ |
| EID — manual        | `EmiratesIdManual`                 | `emiratesIdManual`  | `..._EMIRATES_ID_MANUAL` |
| EID — card read     | `EmiratesIdCard`                   | `emiratesIdCard`    | `..._EMIRATES_ID_CARD`   |
| EID — + fingerprint | attach `fingerprint:` to the above | `fingerprint` field | `..._BIOMETRIC` variant  |
| EID — NFC           | `EmiratesIdNfc` *(Android)*        | `emiratesIdNfc`     | *(Android only)*         |
| Passport — manual   | `PassportManual`                   | `passportManual`    | `..._PASSPORT_MANUAL`    |
