> For the complete documentation index, see [llms.txt](https://docs.ooto-ai.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.ooto-ai.com/face-api-1-n/face-enrollment.md).

# Face Enrollment

Creates a new facial biometric template that can be used later for identity verification. This operation supports optional liveness and deepfake checks during enrollment.

#### Endpoint

```bash
POST https://cloud.ooto-ai.com/api/v1.0/add
```

#### Request Format

* Method: POST
* Content-Type: multipart/form-data
* Query parameters: check\_liveness, check\_deepfake

#### Query Parameters

| Name            | Type    | Required | Description                            |
| --------------- | ------- | -------- | -------------------------------------- |
| check\_liveness | Boolean | No       | Enable liveness check (default: false) |
| check\_deepfake | Boolean | No       | Enable deepfake check (default: false) |

#### Form Data

| Field      | Type   | Required | Description                                   |
| ---------- | ------ | -------- | --------------------------------------------- |
| photo      | File   | Yes      | JPEG or PNG image containing exactly one face |
| templateId | String | No       | Optional custom ID for the face template      |

#### Authentication Headers

* APP-ID: Your application's unique identifier.
* APP-KEY: Your application's authentication key.

#### Example Request (cURL)

```bash
curl -X POST --location 'https://cloud.ooto-ai.com/api/v1.0/add?check_liveness=true&check_deepfake=true' \
--header 'APP-ID: <put_app_id_here>' \
--header 'APP-KEY: <put_app_key_here>' \
--form 'photo=@"/path/to/photo"' \
--form 'templateId=<UUID>'
```

Replace «put\_app\_id\_here», «put\_app\_key\_here» with your actual credentials and the path to your selfie image.

#### Successful Response (HTTP 200)

```json
{
  "transactionId": "379875cf-9e21-47cf-95bb-4a3d7c373638",
  "result": {
    "enroll": {
      "templateId": "16de28ea-dd15-4005-9a42-539e911db2d3"
    },
    "quality": {
      "pitch": 5.798101723194122,
      "yaw": -2.267319895327091,
      "roll": -0.3308084886521101,
      "uniformity": {
        "value": 0.7976967765996249,
        "fine": true
      },
      "exposure": {
        "value": 0.6352452907096943,
        "fine": true
      },
      "contrast": {
        "value": 0.780912373462111,
        "fine": true
      },
      "flare": {
        "score": 0.026086460798978806,
        "fine": true
      },
      "blur": {
        "score": 0.000007942797310533933,
        "fine": true
      },
      "macroblocks": {
        "score": 8.378465921055067e-9,
        "fine": true
      },
      "distortion": {
        "score": 0.907139241695404,
        "fine": false
      },
      "occlusion": {
        "score": 0.0005318471812643111,
        "fine": true
      },
      "emotion": {
        "score": 0.020526384934782982,
        "fine": true
      },
      "leftEyeClosed": {
        "score": 0.004296362400054932,
        "fine": true
      },
      "rightEyeClosed": {
        "score": 0.000009238719940185547,
        "fine": true
      },
      "crfiqa": {
        "score": 0.5999192595481873,
        "fine": true
      }
    },
    "demography": {
      "age": 59,
      "gender": "male",
      "race": "latino hispanic"
    },
    "box": {
      "x": 655,
      "y": 1083,
      "w": 937,
      "h": 1210
    },
    "landmarks": [
      [
        912,
        1580
      ],
      [
        1344,
        1583
      ],
      [
        1125,
        1835
      ],
      [
        946,
        1996
      ],
      [
        1297,
        1999
      ]
    ]
  }
}
```

#### Error response (HTTP 400)

```json
{
    "transactionId": "9191079a-4f80-4c8a-9a4b-528af2cfd3c4",
    "result": {
        "status": "error",
        "code": 5,
        "info": "can not detect face"
    }
}
```

**Engine Errors**

| Code | Info                                                           |
| ---- | -------------------------------------------------------------- |
| 1    | photo should not be empty                                      |
| 2    | wrong mime-type in input data                                  |
| 3    | photo size is 0 bytes                                          |
| 4    | can not decode image, check it is valid jpeg or png file       |
| 5    | can not detect face                                            |
| 6    | more than one face detected on photo                           |
| 9    | can not extract features from sample, probably it is too small |

#### Best Practices

* Use sharp, high-quality, frontal-face photos
* Face size ≥ 200×200 pixels in image
* Avoid masks, sunglasses, filters
* Only one face must be present in the image
