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

# NFC Verification

> Verify e-passports and eIDs via NFC chip reading. Cryptographic validation, tamper-proof checks, highest-security ID auth. Pay-per-call $0.15.

export const AgentPromptAccordion = ({prompt, title = "AI Agent Integration Prompt"}) => {
  const [copied, setCopied] = React.useState(false);
  const handleCopy = e => {
    e.stopPropagation();
    if (!prompt) return;
    navigator.clipboard.writeText(prompt.trim()).then(() => {
      setCopied(true);
      setTimeout(() => setCopied(false), 2000);
    });
  };
  const agents = ["Claude Code", "Codex", "Cursor", "Devin", "Windsurf", "GitHub Copilot"];
  return <div className="didit-agent-card">
      {}
      <div className="didit-agent-titlebar">
        <div className="didit-agent-dots" aria-hidden="true">
          <span className="didit-agent-dot didit-agent-dot-red"></span>
          <span className="didit-agent-dot didit-agent-dot-yellow"></span>
          <span className="didit-agent-dot didit-agent-dot-green"></span>
        </div>
        <span className="didit-agent-filename">{title}</span>
        <button type="button" className={`didit-agent-copy ${copied ? "didit-agent-copy-copied" : ""}`} onClick={handleCopy} title="Copy prompt to clipboard" aria-label={copied ? "Copied!" : "Copy prompt to clipboard"}>
          {copied ? <>
              <svg width="13" height="13" viewBox="0 0 16 16" fill="none">
                <path d="M3 8.5l3.5 3.5L13 4" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" />
              </svg>
              <span>Copied</span>
            </> : <>
              <svg width="13" height="13" viewBox="0 0 16 16" fill="none">
                <rect x="5" y="5" width="9" height="9" rx="1.5" stroke="currentColor" strokeWidth="1.5" />
                <path d="M11 5V3.5A1.5 1.5 0 0 0 9.5 2h-6A1.5 1.5 0 0 0 2 3.5v6A1.5 1.5 0 0 0 3.5 11H5" stroke="currentColor" strokeWidth="1.5" />
              </svg>
              <span>Copy</span>
            </>}
        </button>
      </div>

      {}
      <pre className="didit-agent-body"><code>{prompt.trim()}</code></pre>

      {}
      <div className="didit-agent-footer">
        <span className="didit-agent-footer-label">Paste into</span>
        <div className="didit-agent-chips">
          {agents.map(name => <span key={name} className="didit-agent-chip">{name}</span>)}
        </div>
      </div>
    </div>;
};

export const VideoEmbed = ({src, title = "Video", type = "iframe"}) => <div className={type === "iframe" ? "didit-video-embed" : "didit-video-embed didit-video-native"}>
    {type === "iframe" ? <iframe src={src} title={title} style={{
  width: "100%",
  height: "100%",
  border: 0,
  borderRadius: "12px"
}} allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowFullScreen /> : <video controls autoPlay muted loop playsInline src={src} title={title} style={{
  width: "100%",
  height: "auto",
  display: "block",
  borderRadius: "12px"
}} />}
  </div>;

NFC-based authentication lets you verify identity documents by reading the secure chip embedded in modern passports and IDs using a mobile phone's NFC capabilities. This provides the **highest level of security available** for ID Verification.

<AgentPromptAccordion
  title="NFC Verification Integration Prompt"
  prompt={`# Goal
Integrate Didit NFC Verification — cryptographic ePassport / eID chip read — into your app.

# Delivery mode
NFC is **session-only**. There is no standalone /v3/nfc/ endpoint. The chip is read by the Didit Web/Mobile SDK during a hosted session, which uses the device's NFC radio.

# Steps
1. Create a workflow that includes the NFC feature (Business Console or POST /v3/workflows/). NFC normally runs alongside ID Verification: the user first photographs the document so the SDK derives BAC/PACE keys from the MRZ, then taps the chip.
2. Create a session — POST /v3/session/ with { workflow_id, vendor_data, callback }. See /sessions-api/create-session.
3. Open the returned session.url on a mobile device with NFC (iOS 13+/Android with NFC enabled), or mount the native SDK in your app.
4. After completion fetch the decision — GET /v3/session/{sessionId}/decision/ (or subscribe to session.status.updated).

curl (create session):
\`\`\`bash
curl -X POST 'https://verification.didit.me/v3/session/' \\
-H 'x-api-key: YOUR_API_KEY' \\
-H 'Content-Type: application/json' \\
-d '{
"workflow_id": "YOUR_WORKFLOW_ID",
"vendor_data": "user-123",
"callback": "https://yourapp.com/post-kyc"
}'
\`\`\`

# Decision shape
The NFC result is returned under the plural array \`nfc_verifications[]\` on the decision payload.

> Heads-up: the V3 schema deliberately keeps the **plural-array** name \`nfc_verifications[]\` even though early integrators occasionally hit a singular \`nfc_verification\` key. Always read from the plural array — it is the canonical, multi-instance shape and matches every other feature.

# Status enum (per nfc_verifications[].status)
"Not Started" | "In Progress" | "Approved" | "In Review" | "Declined" | "Abandoned" | "Kyc Expired"

# Warnings (LogWarningChoices.NFC)
The warnings[] array on each nfc_verification includes risk codes such as:
NFC_NOT_READ, NFC_DATA_INVALID, NFC_DATA_DOES_NOT_MATCH_OCR, NFC_BAC_FAILED, NFC_PASSIVE_AUTHENTICATION_FAILED, NFC_ACTIVE_AUTHENTICATION_FAILED, NFC_CHIP_CLONED, NFC_DOCUMENT_REVOKED.
Full catalogue: /core-technology/nfc-verification/warnings-nfc-verification.

# Failure modes to handle
- Device has no NFC chip or NFC is disabled — the SDK falls back to OCR + face match; nfc_verifications[] will be empty.
- The user fails to hold the chip long enough — status="Declined" with NFC_NOT_READ or NFC_BAC_FAILED. Allow a retry.
- nfc_verifications[].status="Declined" with NFC_DATA_DOES_NOT_MATCH_OCR — the chip and the printed data disagree (likely tampered document). Do not approve.
- Passive Authentication failed — the chip's signing certificate did not chain back to a trusted CSCA. Stop the flow.

# See also
- Canonical schema: /reference/data-models#nfc-verification
- Per-feature report: /core-technology/nfc-verification/report-nfc-verification
- Risk catalogue: /core-technology/nfc-verification/warnings-nfc-verification
- Supported documents: /core-technology/nfc-verification/supported-documents-nfc-verification
- Full integration playbook: /integration/integration-prompt`}
/>

<VideoEmbed src="https://www.youtube.com/embed/h0i9Q0-izcw?start=2281&rel=0&playsinline=1" title="NFC Verification for Passports & National IDs" />

<Frame>
  <img src="https://didit-public-assets.s3.eu-west-1.amazonaws.com/icons/docs/nfc-id.gif" alt="NFC Interaction" />
</Frame>

***

## Key Benefits

| Benefit                | Description                                                           |
| ---------------------- | --------------------------------------------------------------------- |
| **Highest Security**   | Verifies cryptographic signatures directly from government issuers    |
| **Easy to Use**        | Works automatically with any NFC-enabled phone                        |
| **Tamper-Proof**       | Detects document manipulation invisible to the human eye              |
| **Comprehensive Data** | Extracts additional data not available through OCR alone              |
| **Flexible Fallback**  | Gracefully falls back to standard verification if NFC isn't available |

***

## How to Enable NFC Verification

### Native SDK Integration (Recommended)

NFC verification is available through our **native SDKs**, which provide full access to device NFC capabilities:

| Platform    | NFC Support    | Documentation                                                     |
| ----------- | -------------- | ----------------------------------------------------------------- |
| **iOS**     | ✅ Full Support | [iOS SDK Documentation](/integration/native-sdks/ios-sdk)         |
| **Android** | ✅ Full Support | [Android SDK Documentation](/integration/native-sdks/android-sdk) |

The iOS SDK handles all NFC configuration automatically, including:

* ISO7816 application identifiers for ePassports
* Entitlements and capabilities setup
* Real-time chip reading with visual feedback

### Web Integration

> ⚠️ **Browser Limitations**
>
> NFC verification is **not available in web browsers** due to platform restrictions:
>
> | Browser              | NFC Support                                                        |
> | -------------------- | ------------------------------------------------------------------ |
> | **Chrome (Android)** | Experimental Web NFC API - unstable, requires explicit permissions |
> | **Safari (iOS)**     | No Web NFC API support                                             |
> | **Other Browsers**   | No support                                                         |
>
> For web integrations, NFC verification is automatically skipped and users proceed with standard document + selfie verification.

***

## How It Works

<Steps>
  <Step title="Session Initiation" icon="play">
    The user starts the verification process through your app or platform:

    * **Native SDK**: Launch the verification flow directly in your app
    * **Web/Mobile Web**: User is guided to use the Didit App for NFC-enabled verification, or continues with standard verification
  </Step>

  <Step title="Document Photo Capture" icon="camera">
    The user photographs their ID document, capturing:

    * **MRZ** (Machine Readable Zone) — used to derive chip access keys
    * **Document front and back images** — visual data and security features
    * **Visual security features** — holograms, watermarks, microprint
  </Step>

  <Step title="NFC Support Detection" icon="signal">
    The system automatically checks device and document compatibility:

    | Check                 | Description                                |
    | --------------------- | ------------------------------------------ |
    | **Document type**     | Is it an ePassport/eID with an NFC chip?   |
    | **Device capability** | Does the phone support NFC reading?        |
    | **Permissions**       | Are the necessary NFC permissions granted? |

    <Note>
      If NFC is unavailable, verification continues seamlessly with standard document + biometric verification.
    </Note>
  </Step>

  <Step title="NFC Chip Reading" icon="nfc-symbol">
    For compatible devices and documents:

    1. User is guided to position their document near the phone's NFC reader
    2. Visual feedback shows real-time reading progress
    3. Secure communication is established with the chip using PACE/BAC protocols
  </Step>

  <Step title="Data Extraction" icon="database">
    The system extracts comprehensive data from the chip following **ICAO 9303** standards:

    | Data Group  | Contents                 | Description                                      |
    | ----------- | ------------------------ | ------------------------------------------------ |
    | **SOD**     | Document Security Object | Digital signatures for all data groups           |
    | **DG1**     | Personal Data            | Name, ID number, birth date, expiry date         |
    | **DG2**     | Facial Image             | High-resolution digital photo of the holder      |
    | **DG7**     | Signature                | Digital representation of the holder's signature |
    | **DG11-14** | Additional Data          | May include fingerprints, iris scans (if stored) |
  </Step>

  <Step title="Cryptographic Verification" icon="shield-check">
    The extracted data undergoes rigorous cryptographic verification:

    <AccordionGroup>
      <Accordion title="Digital Signature Verification" icon="signature">
        Each data group's hash is verified against the signatures stored in the SOD, ensuring data integrity.
      </Accordion>

      <Accordion title="Certificate Chain Validation" icon="link">
        The chain of trust is validated: **Document Certificate → Country Signing CA → ICAO PKD Root**, checking against CSCA master lists and the ICAO Public Key Directory.
      </Accordion>

      <Accordion title="Certificate Revocation Check" icon="ban">
        Certificates are verified against Certificate Revocation Lists (CRLs) to ensure they haven't been revoked and the document hasn't been reported stolen/compromised.
      </Accordion>

      <Accordion title="Cross-Validation" icon="code-compare">
        NFC-extracted data is cross-validated against OCR data from document photos, facial biometric comparison, and MRZ checksum verification.
      </Accordion>
    </AccordionGroup>
  </Step>

  <Step title="Result & Confidence Score" icon="chart-simple">
    The final verification result includes:

    | Output                      | Description                                                 |
    | --------------------------- | ----------------------------------------------------------- |
    | **NFC verification status** | Success, failed, or skipped                                 |
    | **Data consistency score**  | How well NFC data matches visual data                       |
    | **Certificate validation**  | Full chain verification status                              |
    | **Confidence boost**        | NFC adds significant confidence to the overall verification |
  </Step>
</Steps>

***

## Supported Documents

NFC verification works with **ePassports** and **eIDs** that contain an NFC chip, typically indicated by this symbol on the document:

<Frame>
  <img src="https://mintcdn.com/didit-0f962782/z6T2GHM4Zh-iSj-K/images/epassport-logo.png?fit=max&auto=format&n=z6T2GHM4Zh-iSj-K&q=85&s=89cd90281e6ff1cd96f5a3d6a2200cad" alt="ePassport Logo" width="80" data-path="images/epassport-logo.png" />
</Frame>

Most passports issued after 2006 contain NFC chips. Coverage varies by country for national ID cards. Check all the [supported documents](/core-technology/nfc-verification/supported-documents-nfc-verification).

***

## Integration Examples

### iOS SDK (Available Now)

```swift theme={null}
import DiditSdk

// NFC is automatically enabled when the document supports it
let config = DiditSdk.Configuration(
    // NFC configuration is handled automatically
    // Just ensure your app has the required entitlements
)

let result = try await DiditSdk.shared.startVerification(
    with: sessionId,
    configuration: config
)
```

**[Complete iOS SDK Documentation →](/integration/native-sdks/ios-sdk)**

### Android SDK (Coming Soon)

```kotlin theme={null}
// Coming soon - use WebView integration in the meantime
// See Android SDK documentation for WebView setup
```

**[Android SDK Documentation →](/integration/native-sdks/android-sdk)**

***

## Security Architecture

```
┌─────────────────────────────────────────────────────────────┐
│                    NFC Verification Flow                     │
├─────────────────────────────────────────────────────────────┤
│                                                              │
│  ┌──────────┐    ┌──────────┐    ┌──────────────────────┐  │
│  │ Document │───▶│  Phone   │───▶│   Didit Backend      │  │
│  │ NFC Chip │    │ NFC Read │    │                      │  │
│  └──────────┘    └──────────┘    │  ┌────────────────┐  │  │
│                                   │  │ ICAO PKD       │  │  │
│                                   │  │ Validation     │  │  │
│                                   │  └────────────────┘  │  │
│                                   │  ┌────────────────┐  │  │
│                                   │  │ CSCA Master    │  │  │
│                                   │  │ List Check     │  │  │
│                                   │  └────────────────┘  │  │
│                                   │  ┌────────────────┐  │  │
│                                   │  │ CRL Revocation │  │  │
│                                   │  │ Check          │  │  │
│                                   │  └────────────────┘  │  │
│                                   └──────────────────────┘  │
│                                              │               │
│                                              ▼               │
│                                   ┌──────────────────────┐  │
│                                   │  Verification Result │  │
│                                   │  + Confidence Score  │  │
│                                   └──────────────────────┘  │
└─────────────────────────────────────────────────────────────┘
```

***

## FAQ

<details>
  <summary><strong>What if the user's phone doesn't support NFC?</strong></summary>

  The verification flow automatically detects NFC capability. If unavailable, users proceed with standard document + selfie verification. The verification is still secure, just without the additional NFC confidence boost.
</details>

<details>
  <summary><strong>What if the document doesn't have an NFC chip?</strong></summary>

  Many documents (especially older passports and some national IDs) don't have NFC chips. The system detects this and seamlessly continues with standard verification.
</details>

<details>
  <summary><strong>How much does NFC verification improve accuracy?</strong></summary>

  NFC verification provides cryptographic proof of document authenticity directly from the issuing government. This significantly increases confidence in the verification result and catches sophisticated forgeries that might pass visual inspection.
</details>

<details>
  <summary><strong>Is NFC verification required?</strong></summary>

  No. NFC is an enhancement, not a requirement. Your verification workflow can be configured to require NFC, prefer it when available, or skip it entirely based on your risk tolerance.
</details>

***
