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

# Passeport

> Vérifiez un passeport de n'importe quel pays.

Vérifiez le passeport d'un client, quel que soit son pays, en envoyant une photo de la page de données. Nous lisons les informations, confirmons le pays qui a délivré le passeport et comparons le visage du passeport avec un selfie.

<Note>
  Le passeport n'a qu'une face. Seul `document_front` est nécessaire.
</Note>

<Note>
  `country` est facultatif. Envoyez-le lorsque vous connaissez le pays qui a délivré le passeport. Sans lui, nous détectons le pays à partir du passeport.
</Note>

## Endpoint

```
POST /api/onboarding/document_verification/passport
```

## Requête

### En-têtes

| En-tête | Valeur | Requis |
| - | - | - |
| `x-access-token` | Votre clé secrète API | Oui |
| `Content-Type` | `multipart/form-data` | Oui |

### Paramètres de corps

| Paramètre | Type | Requis | Description |
| - | - | - | - |
| `document_front` | file | Oui | Photo ou scan de la page de données du passeport. JPG, PNG ou PDF d'une page, max 10 Mo |
| `selfie_image` | file | Oui | Un selfie à comparer avec le visage du passeport. JPG ou PNG, max 5 Mo |
| `country` | string | Non | Le pays qui a délivré le passeport, en code pays à deux lettres, par exemple `RW`. Laissez-le vide pour qu'il soit détecté |

<Tip>
  Un document numérisé peut être envoyé sous forme de PDF d'une page, par exemple `-F "document_front=@/path/to/scan.pdf"`.
</Tip>

### Exemple

<CodeGroup>
  ```bash cURL theme={null}
  curl -X POST "https://adhere-api.smartcomply.com/api/onboarding/document_verification/passport" \
    -H "x-access-token: YOUR_SECRET_KEY" \
    -F "document_front=@/path/to/passport.jpg" \
    -F "selfie_image=@/path/to/selfie.jpg" \
    -F "country=RW"
  ```

  ```javascript Node.js theme={null}
  const formData = new FormData();
  formData.append("document_front", fs.createReadStream("/path/to/passport.pdf"));
  formData.append("selfie_image", fs.createReadStream("/path/to/selfie.jpg"));
  formData.append("country", "RW"); // facultatif

  const response = await fetch(
    "https://adhere-api.smartcomply.com/api/onboarding/document_verification/passport",
    {
      method: "POST",
      headers: { "x-access-token": "YOUR_SECRET_KEY" },
      body: formData,
    }
  );
  const data = await response.json();
  ```

  ```python Python theme={null}
  import requests

  response = requests.post(
      "https://adhere-api.smartcomply.com/api/onboarding/document_verification/passport",
      headers={"x-access-token": "YOUR_SECRET_KEY"},
      data={"country": "RW"},  # facultatif
      files={
          "document_front": open("/path/to/passport.jpg", "rb"),
          "selfie_image": open("/path/to/selfie.jpg", "rb"),
      },
  )
  data = response.json()
  ```
</CodeGroup>

## Réponse

### 200 OK

| Champ | Type | Description |
| - | - | - |
| `status` | string | `"success"` si l'extraction a réussi |
| `data.full_name` | string | Nom complet extrait |
| `data.first_name` | string | Prénom extrait |
| `data.last_name` | string | Nom de famille extrait |
| `data.date_of_birth` | string | Date de naissance au format `YYYY-MM-DD` |
| `data.gender` | string | Genre extrait |
| `data.nationality` | string | Nationalité extraite |
| `data.id_number` | string | Le numéro de passeport |
| `data.document_type` | string | `"passport"` |
| `data.document_country` | string | Le pays qui a délivré le passeport, en code pays à deux lettres, par exemple `"RW"` |
| `data.expiry_date` | string | Date d'expiration du passeport |
| `data.is_expired` | boolean | Toujours `false` sur une réponse 200. Un passeport expiré fait échouer la vérification (voir Passeports expirés ci-dessous) |
| `data.photo` | string | Photo du visage extraite du passeport, encodée en Base64 |
| `data.extra_fields` | object | Autres champs lus sur la page de données, comme `place_of_birth`, `place_of_issue`, `issuing_authority`, et `mrz_line1`/`mrz_line2` lorsque la zone de lecture automatique est lisible |
| `data.face_match` | object | Résultat de la comparaison entre le visage du passeport et `selfie_image` |
| `data.face_match.attempted` | boolean | Indique si une comparaison a été effectuée |
| `data.face_match.verified` | boolean \| null | `true` ou `false` si la comparaison a eu lieu ; `null` si elle n'a pas pu avoir lieu |
| `data.face_match.decision` | string | `"MATCH"` ou `"NO_MATCH"` |
| `data.face_match.confidence_percentage` | number | Confiance de correspondance, de 0 à 100 |
| `data.face_match.compare_mode` | string | `"COMPARISON_NO_LIVENESS"` signifie que les deux photos ont été comparées sans contrôle de vivacité |
| `data.face_match.selfie_image` | string | URL du selfie envoyé |
| `message` | string | Résumé lisible du résultat |

```json theme={null}
{
  "status": "success",
  "data": {
    "valid": true,
    "first_name": "Nassra Nassor",
    "last_name": "Ngarango",
    "full_name": "Nassra Nassor Ngarango",
    "date_of_birth": "1990-05-20",
    "gender": "F",
    "nationality": "TANZANIAN",
    "id_number": "TAE661142",
    "document_type": "passport",
    "document_country": "TZ",
    "expiry_date": "2033-11-08",
    "is_expired": false,
    "photo": "/9j/4AAQSkZJRgABAQAAAQABAAD...",
    "extra_fields": {
      "place_of_birth": "KINONDONI",
      "place_of_issue": "PCO, DAR ES SALAAM",
      "issuing_authority": "PCO, DAR ES SALAAM",
      "mrz_line1": "P<TZANGARANGO<<NASSRA<NASSOR<<<<<<<<<<<<<<<<",
      "mrz_line2": "TAE6611429TZA9005204F3311086<<<<<<<<<<<<<<06"
    },
    "face_match": {
      "attempted": true,
      "verified": true,
      "decision": "MATCH",
      "confidence_percentage": 92.4,
      "compare_mode": "COMPARISON_NO_LIVENESS",
      "selfie_image": "https://.../selfie.jpg"
    }
  },
  "message": "Document details retrieved successfully"
}
```

<Note>
  **Comparaison faciale :** `verified: false` avec `decision: "NO_MATCH"` signifie que la comparaison a eu lieu et que les visages ne correspondent pas. `verified: null` avec un `reason` signifie que la comparaison n'a pas pu avoir lieu, par exemple parce qu'aucun visage n'a été trouvé sur le selfie. Un problème de comparaison faciale ne bloque jamais les données du passeport : le reste de `data` est tout de même renvoyé.
</Note>

### 400 Bad Request

Le passeport n'a pas été délivré par le `country` envoyé :

```json theme={null}
{
  "status": "failed",
  "data": {
    "error_code": "VERIFICATION_FAILED"
  },
  "message": "Document Verification - Passport check failed: This document wasn't issued by the country you chose. Please upload a document from that country"
}
```

Les passeports de ce pays ne peuvent pas être vérifiés :

```json theme={null}
{
  "status": "failed",
  "data": [],
  "message": "Passports from this country can't be verified."
}
```

La photo ne peut pas être lue, par exemple parce qu'une partie du passeport est coupée :

```json theme={null}
{
  "status": "failed",
  "data": {
    "error_code": "VERIFICATION_FAILED"
  },
  "message": "Document Verification - Passport check failed: Part of the document is cut off in the photo. Please retake with all edges and corners fully visible."
}
```

### Passeports expirés

Un passeport expiré fait échouer la vérification. Les informations lues sont tout de même renvoyées dans `data`, avec `is_expired: true` :

```json theme={null}
{
  "status": "failed",
  "data": {
    "first_name": "Nassra Nassor",
    "last_name": "Ngarango",
    "id_number": "TAE661142",
    "document_type": "passport",
    "document_country": "TZ",
    "expiry_date": "2021-11-08",
    "is_expired": true
  },
  "message": "Document Verification - Passport check failed: Document has expired."
}
```

### 401 Unauthorized

```json theme={null}
{
  "status": "failed",
  "message": "Authentication credentials were not provided."
}
```

<Note>
  Pour la liste complète des codes d'erreur, consultez la référence [Codes d'erreur](/error_codes).
</Note>


## OpenAPI

````yaml POST /api/onboarding/document_verification/passport
openapi: 3.0.3
info:
  title: Adhere API
  description: >-
    Identity verification, credit checks, transaction monitoring, and loan fraud
    detection across Africa.
  version: 3.0.0
servers:
  - url: https://adhere-api.smartcomply.com
    description: Production
security:
  - ApiKeyAuth: []
tags:
  - name: Nigeria KYC
  - name: Kenya KYC
  - name: Ghana KYC
  - name: Rwanda KYC
  - name: Uganda KYC
  - name: Document Verification
  - name: Biometrics
  - name: Individual Credit
  - name: Business Credit
  - name: Transaction Monitoring
  - name: Transaction Screening
  - name: Transaction KYC
  - name: Loan Fraud
  - name: User Journey
paths:
  /api/onboarding/document_verification/passport:
    post:
      tags:
        - Document Verification
      summary: Document Verification — Global Passport
      description: >
        Verify a passport from any country, plus a required face match against a
        selfie. Send country when you know which country issued the passport;
        leave it out and the country is detected from the passport. The issuing
        country is returned as document_country.
      operationId: documentVerificationGlobalPassport
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              type: object
              required:
                - document_front
                - selfie_image
              properties:
                document_front:
                  type: string
                  format: binary
                  description: >
                    Photo or scan of the passport data page. JPG, PNG or
                    single-page PDF, max 10MB.
                selfie_image:
                  type: string
                  format: binary
                  description: >
                    A selfie to compare against the face on the passport. JPG or
                    PNG, max 5MB.
                country:
                  type: string
                  example: RW
                  description: >
                    Optional. The country that issued the passport, as an
                    two-letter country code. Leave it out to have it detected.
      responses:
        '200':
          $ref: '#/components/responses/DocumentVerificationSuccess'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
components:
  responses:
    DocumentVerificationSuccess:
      description: Document details extracted successfully
      content:
        application/json:
          schema:
            type: object
            properties:
              status:
                type: string
                example: success
              data:
                type: object
                properties:
                  valid:
                    type: boolean
                  first_name:
                    type: string
                  last_name:
                    type: string
                  full_name:
                    type: string
                  date_of_birth:
                    type: string
                  gender:
                    type: string
                  nationality:
                    type: string
                  address:
                    type: string
                  id_number:
                    type: string
                  serial_number:
                    type: string
                  id_type:
                    type: string
                  document_type:
                    type: string
                  document_country:
                    type: string
                    description: >
                      Passports only. The country that issued the passport, as
                      an two-letter country code, for example RW.
                  expiry_date:
                    type: string
                  issue_date:
                    type: string
                  is_expired:
                    type: boolean
                    description: >
                      Always false on a 200. An expired document fails the check
                      with a 400; its details are still returned in data, with
                      is_expired true.
                  photo:
                    type: string
                    description: >-
                      Base64-encoded face photo extracted from the document.
                      Absent for document types with no face photo
                      (cac_certificate, utility_bill).
                  extra_fields:
                    type: object
                    description: >-
                      Every other field read from the document that doesn't have
                      its own dedicated field above. Varies by document_type and
                      country.
                  face_match:
                    type: object
                    description: Present only when selfie_image was supplied.
                    properties:
                      attempted:
                        type: boolean
                      verified:
                        type: boolean
                        nullable: true
                        description: >-
                          true/false if the comparison ran; null if it couldn't
                          (see reason).
                      decision:
                        type: string
                        enum:
                          - MATCH
                          - NO_MATCH
                        description: The comparison's verdict.
                      confidence_percentage:
                        type: number
                      compare_mode:
                        type: string
                        example: COMPARISON_NO_LIVENESS
                        description: >
                          COMPARISON_NO_LIVENESS: the two photos are compared;
                          no liveness check is run on the selfie.
                      selfie_image:
                        type: string
                        description: URL of the uploaded selfie.
                      reason:
                        type: string
                        description: >-
                          Present when verified is null — explains why the
                          comparison couldn't run or complete.
              message:
                type: string
                example: Document details retrieved successfully
    BadRequest:
      description: Bad Request
      content:
        application/json:
          schema:
            type: object
            properties:
              status:
                type: string
                example: failed
              data:
                type: array
                items: {}
              message:
                type: string
    Unauthorized:
      description: Unauthorized
      content:
        application/json:
          schema:
            type: object
            properties:
              status:
                type: string
                example: failed
              message:
                type: string
                example: Authentication credentials were not provided.
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-access-token
      description: Your Adhere API secret key

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.