VerifEye Face API

Overview

The VerifEye Face API is the single entry point for face onboarding, identification and analysis. One call takes an image, works out who is on it against your own face collection, and — when you ask for it — returns the age, gender, emotions and attention of every face it answers about.

The VerifEye Face API enables you to:

  • Onboard faces into a collection — every face is looked up and added when it is not already there
  • Identify faces against a collection — every face is looked up and nothing is ever added
  • Compare the faces on an image against one face you name — a 1:1 check that answers "is this person here?"
  • Enrich each face with optional attributes: age, gender, emotions and attention
  • Answer about several faces on one image in a single call
  • Manage collections (create, retrieve, update, reset, delete)
  • Associate your own external keys (for example a customer or user identifier) with faces and look faces up by them

Base URLs

Region Base URL
EU https://verifeye-face-api-eu.realeyes.ai/v1/
US https://verifeye-face-api-us.realeyes.ai/v1/

Choosing the right call

Three calls do the face work. They take the same image, the same optional attributes and the same maxFaces; what separates them is what each face on the image is matched against.

  Onboard Identify Compare
Question it answers "Register this person — or tell me they are already registered" "Who is this?" "Is this particular person here?"
Matching mode register + deduplicate 1:N identification 1:1 verification
Matched against the whole collection the whole collection the one face you name by faceId
How the collection is used searched, and written to when nothing matches searched only one face read by its id — never searched
You supply collectionId collectionId collectionId and faceId
Each face comes back with faceId + faceStatus (New or Existing) faceId + faceStatus (Existing or NotExisting) similarity + isMatch
Use it when signing somebody up, enrolling, detecting duplicates, building the population you will recognise later you do not know who the person is and want the collection to tell you you already know who they claim to be and only need that claim checked

Rule of thumb: Onboard to put a person on file. Then Identify when you do not know who they are, or Compare when you do and only need it confirmed.

The order of calls

A collection starts empty, so Onboard always comes first — there is nothing for Identify or Compare to match against until a face is on file. Onboard is normally a one-off per person; Identify and Compare are the calls you make repeatedly afterwards.

sequenceDiagram
    participant A as Your application
    participant F as VerifEye Face API
    Note over A,F: Once per person
    A->>F: POST /v1/face/onboard (image, collectionId)
    F-->>A: faceId + faceStatus (New or Existing)
    Note over A: Store the faceId against your own user record
    Note over A,F: Every time afterwards
    alt You do not know who this is — 1:N
        A->>F: POST /v1/face/identify (image, collectionId)
        F-->>A: faceId of the match, or faceStatus NotExisting
    else You know who they claim to be — 1:1
        A->>F: POST /v1/face/compare (image, collectionId, faceId)
        F-->>A: similarity + isMatch per face
    end

Requests and responses

Images

Supply the image as a base64-encoded JPEG/PNG (image.bytes), as a URL (image.url), or by the id of an image already stored with the API (image.id, see Stored Images). When more than one is set, bytes wins over id, and id over url. Only http and https URLs are accepted, and the host must resolve to a public address — private, loopback and link-local addresses are rejected with 400.

See Image Requirements for resolution, file size and face-position guidance.

Optional attributes

Every attribute is off by default. Enable only what you need through the include object in the request body. The API returns the requested attributes for every face it answers about.

Option Adds to each face
include.age age — the estimated age and its uncertainty
include.gender gender — Male or Female
include.emotions emotions — confusion, contempt, disgust, happiness, empathy, surprise
include.attention attention — presence, eyes on screen, attention

Face detection restrictions

Faces that the API cannot process with sufficient confidence are omitted from the response — they do not appear in faces. This is more common when the image contains multiple faces.

So faces can hold fewer entries than the image holds faces. Those omitted faces are not counted in unprocessedFaceCount; that field counts the faces the call never looked at — the ones maxFaces left out, plus any beyond the detector’s own limit. Do not rely on the position of a face in faces to match the position of a face on the image; match on faces[].face.boundingBox instead.

Multiple faces

maxFaces (default 1, maximum 4) decides how many faces one call answers about. Faces are processed in order of dominance, and every face the limit left out is counted in unprocessedFaceCount.

Idempotent retries

When a call to Onboard times out or the connection drops, you cannot tell whether the face was added. Send an Idempotency-Key header and you can repeat the call safely: a retry with the same key returns the original response, including the original faceId, instead of onboarding again.

   
Header Idempotency-Key
Applies to Onboard only. Identify and Compare ignore it
Required No. Without it Onboard behaves exactly as before
Format 1 to 512 printable ASCII characters (0x21-0x7E, no spaces), sent once. A random UUID is a good choice
Kept for 24 hours from the first successful response

A retry returns the stored response only when it is the same request: the same key, sent by the same account, with the same request body. The body is compared as the API reads it, so the order of the fields, the whitespace and a default written out as its value do not matter, but every other value does: the image as you sent it (image.bytes, image.url or image.id), the collectionId and every other parameter. Change a value and the call is a new request, and Onboard runs again. For image.url it is the URL text that is compared, not the image behind it: a new capture uploaded to the same URL and sent with the same key is a retry, and gets the stored response. With image.bytes or image.id, a new capture is a new request on its own.

  • Retrying after a timeout or a lost response. Resend exactly the same request with the same key. Every retry within 24 hours gets the same response and the same faceId, is marked Idempotent-Replayed: true, and is not billed. Once your account has reached its face check limit, a retry can be answered 403 like any other call instead.
  • Retrying while the first call is still running, or within a minute of a 504 or a 5xx other than 503. The retry is answered 409 Conflict with a Retry-After header. Wait that long and send it again, and again for as long as the answer is 409: once the first call has succeeded, the retry gets its response; if the first call failed, the retry runs the request again.
  • Retrying after a 503. Onboard answers 503 with a Retry-After header when the faces cannot be onboarded right now. Wait that many seconds and send the same request again: the key is free again at once, so the retry runs rather than being answered 409.
  • A new onboard attempt. Send a different image, a different collectionId or a new key. The call runs normally and returns a new result.
  • Only successful responses are kept. A call that failed stores nothing, so a retry with the same key runs it again: at once after a 4xx or a 503, and after the 409 wait above following a 504 or another 5xx.

The stored response is replayed as it was. It still says faceStatus: New when the first call added the face, and it does not check that the face or the collection still exists. A key is matched only against requests from your own account, and only on the regional host it was sent to.


API Endpoints

Onboard

Onboards the faces on the image into the collection: every face is looked up and, when it is not already there, added.

Endpoint: POST /v1/face/onboard

Authentication: API Key or Bearer Token

Request Headers:

Header Required Description
Idempotency-Key No Makes the call safe to retry: a retry with the same key, from the same account, with the same request body returns the original response, including the original faceId. See Idempotent retries

Request Body:

{
  "image": {
    "bytes": "base64-encoded-image-string",
    "url": null
  },
  "collectionId": "my-collection",
  "faceMatchThreshold": 80,
  "maxFaces": 1,
  "include": {
    "age": true,
    "gender": true,
    "emotions": false,
    "attention": false
  }
}

Request Parameters:

Parameter Type Required Description
image object Yes The image to onboard
image.url string (nullable) No URL of a jpeg or png image. http/https only, and the host must resolve to a public address
image.bytes string (nullable) No Base 64 string encoded binary jpeg or png image. Takes precedence over image.url
image.id string (nullable) No The id of an image stored with the API, as returned by Upload Image or by a verification session's result. Takes precedence over image.url
collectionId string Yes The id of the collection to onboard into. Max length 512. May only contain letters, numbers, dashes (-), underscores (_) and dots (.)
faceMatchThreshold integer No Minimum confidence in the face match to accept. Default value: 80. Valid range: 0-100.

Threshold reference (computed using extensive in-the-wild datasets):
• 95 corresponds to FPR 1e-06
• 90 corresponds to FPR 1e-05
• 80 corresponds to FPR 1e-4
• 70 corresponds to FPR 1e-3
maxFaces integer No The maximum number of faces to answer about. Default value: 1. Valid range: 1-4. Faces beyond this limit are counted in unprocessedFaceCount
include object No Which optional attributes are returned for every face. All options default to false. Enable only the ones you read — see Optional attributes for the cost
include.age boolean No Return the estimated age
include.gender boolean No Return the detected gender
include.emotions boolean No Return the detected emotions. Adds a surcharge per face
include.attention boolean No Return the detected presence and attention. Adds a surcharge per face

Response Example:

{
  "faces": [
    {
      "face": {
        "confidence": 0.9987,
        "boundingBox": {
          "x": 120,
          "y": 80,
          "width": 200,
          "height": 250
        }
      },
      "faceId": "face_abc123xyz789",
      "externalKey": "user-123",
      "age": {
        "prediction": 31.4,
        "uncertainty": 0.42
      },
      "gender": "Female",
      "emotions": null,
      "attention": null,
      "faceStatus": "Existing"
    }
  ],
  "unprocessedFaceCount": 0
}

Response Fields:

Field Path Type Description
faces array One entry per face this call answered about. Empty when no face was detected on the image, or when none of the detected faces could be answered for. A face the API cannot answer for with confidence has no entry — see Face detection restrictions
faces[].face object Detected face information, always in the coordinates of the image you supplied
faces[].face.confidence number Face detection score with value range [0.0, 1.0] (higher is better)
faces[].face.boundingBox object Model for the bounding box of a detected face
faces[].face.boundingBox.x integer Horizontal position of the detected face bounding box
faces[].face.boundingBox.y integer Vertical position of the detected face bounding box
faces[].face.boundingBox.width integer Width of the detected face bounding box
faces[].face.boundingBox.height integer Height of the detected face bounding box
faces[].faceId string (nullable) The id of the face. Always present on onboard — a face that was not found is added, so it always has one
faces[].externalKey string (nullable) The external key associated with the face, when one has been set via the External Key endpoints. null otherwise. A newly added face never has one
faces[].age object (nullable) Returned only when include.age is true
faces[].age.prediction number (nullable) Estimated age
faces[].age.uncertainty number (nullable) Uncertainty score with value range [0.0, infinity]. We recommend rejecting everything higher than 1.0 — values above it can indicate a problem with the image quality
faces[].gender string (nullable) Male or Female. Returned only when include.gender is true
faces[].emotions object (nullable) Returned only when include.emotions is true. A null property means that state could not be determined reliably
faces[].emotions.confusion boolean (nullable) Whether the person shows confusion
faces[].emotions.contempt boolean (nullable) Whether the person shows contempt
faces[].emotions.disgust boolean (nullable) Whether the person shows disgust
faces[].emotions.happy boolean (nullable) Whether the person shows happiness
faces[].emotions.empathy boolean (nullable) Whether the person shows empathy
faces[].emotions.surprise boolean (nullable) Whether the person shows surprise
faces[].attention object (nullable) Returned only when include.attention is true. A null property means that state could not be determined reliably
faces[].attention.presence boolean (nullable) Whether a person is present in the image
faces[].attention.eyesOnScreen boolean (nullable) Whether the person's eyes are on the screen
faces[].attention.attention boolean (nullable) Whether the person is attentive
faces[].faceStatus string Existing (matched a face already in the collection) or New (added by this call). Onboard never returns NotExisting — see Face status
unprocessedFaceCount integer Faces detected on the image but not answered about, because maxFaces limited how many are processed

Example Request:

curl -X POST "https://verifeye-face-api-eu.realeyes.ai/v1/face/onboard" \
  -H "Authorization: ApiKey API-KEY-FROM-DEV-CONSOLE" \
  -H "Idempotency-Key: 4f8d2c1e-9b7a-4e6d-8a53-0c2b6e1f7d90" \
  -H "Content-Type: application/json" \
  -d '{
    "image": {
      "bytes": "/9j/4AAQSkZJRgABAQEAYABgAAD..."
    },
    "collectionId": "my-collection",
    "include": {
      "age": true,
      "gender": true
    }
  }'

Response Headers:

Header Description
Idempotent-Replayed true when the response is the stored result of an earlier request with the same Idempotency-Key. Absent otherwise
Retry-After On a 409 or a 503: the seconds to wait before sending the same request again

Response Codes:

  • 200 - The faces were onboarded
  • 400 - Validation failure, including an Idempotency-Key that is empty, sent more than once or outside its format
  • 401 - Authentication failure
  • 403 - The account has reached its face check limit
  • 404 - Collection not found
  • 409 - An identical request with the same Idempotency-Key is still being processed, or ended in a 504 or a 5xx other than 503 within the last minute; retry after the Retry-After header
  • 503 - The faces cannot be onboarded right now; retry after the Retry-After header
  • 504 - The request did not complete within the time budget

Identify

Identifies the faces on the image against the collection: every face is looked up and never added.

Endpoint: POST /v1/face/identify

Authentication: API Key or Bearer Token

The request and the response are identical to Onboard, with one difference: a face the collection does not hold comes back with faceStatus: NotExisting and no faceId, and nothing is stored. Every attribute that was asked for is still returned for it — only the identity is missing.

Request Body:

{
  "image": {
    "bytes": "base64-encoded-image-string",
    "url": null
  },
  "collectionId": "my-collection",
  "faceMatchThreshold": 80,
  "maxFaces": 2,
  "include": {
    "age": false,
    "gender": false,
    "emotions": true,
    "attention": true
  }
}

Response Example:

{
  "faces": [
    {
      "face": {
        "confidence": 0.9987,
        "boundingBox": {
          "x": 120,
          "y": 80,
          "width": 200,
          "height": 250
        }
      },
      "faceId": "face_abc123xyz789",
      "externalKey": "user-123",
      "age": null,
      "gender": null,
      "emotions": {
        "confusion": false,
        "contempt": null,
        "disgust": false,
        "happy": true,
        "empathy": null,
        "surprise": false
      },
      "attention": {
        "presence": true,
        "eyesOnScreen": true,
        "attention": true
      },
      "faceStatus": "Existing"
    },
    {
      "face": {
        "confidence": 0.9721,
        "boundingBox": {
          "x": 430,
          "y": 96,
          "width": 180,
          "height": 224
        }
      },
      "faceId": null,
      "externalKey": null,
      "age": null,
      "gender": null,
      "emotions": {
        "confusion": null,
        "contempt": null,
        "disgust": null,
        "happy": false,
        "empathy": null,
        "surprise": false
      },
      "attention": {
        "presence": true,
        "eyesOnScreen": false,
        "attention": false
      },
      "faceStatus": "NotExisting"
    }
  ],
  "unprocessedFaceCount": 1
}

Example Request:

curl -X POST "https://verifeye-face-api-eu.realeyes.ai/v1/face/identify" \
  -H "Authorization: ApiKey API-KEY-FROM-DEV-CONSOLE" \
  -H "Content-Type: application/json" \
  -d '{
    "image": {
      "url": "https://example.com/photo.jpg"
    },
    "collectionId": "my-collection",
    "maxFaces": 2,
    "include": {
      "emotions": true,
      "attention": true
    }
  }'

Response Codes:

  • 200 - The faces were searched for; each one either matched or did not
  • 400 - Validation failure
  • 401 - Authentication failure
  • 403 - The account has reached its face check limit
  • 404 - Collection not found
  • 504 - The request did not complete within the time budget

Face status

Every face carries a faceStatus saying what the collection had to say about it.

Value Meaning Returned by
Existing The face matched one already in the collection, and that faceId was returned Onboard, Identify
New The face was not in the collection and has now been added to it Onboard
NotExisting The collection held no face matching this one Identify

Onboard only ever returns Existing or New: a face it does not find is added, so it always comes back with a faceId. NotExisting is Identify's alone.

NotExisting means one thing: no match. The collection held nobody who looks like this person. Every requested attribute is still returned — only the identity is missing. This is the ordinary end of an identify.


Compare

Compares the faces on the image against one face already in the collection, and answers how similar each of them is to it. This is the 1:1 check: the collection is never searched and never written to — the face you name by faceId is read directly, and every face on the image is scored against it.

Use it when you already know who the person claims to be. When you do not, use Identify instead.

Endpoint: POST /v1/face/compare

Authentication: API Key or Bearer Token

Request Body:

{
  "image": {
    "bytes": "base64-encoded-image-string",
    "url": null
  },
  "collectionId": "my-collection",
  "faceId": "face_abc123xyz789",
  "faceMatchThreshold": 80,
  "maxFaces": 1,
  "include": {
    "age": false,
    "gender": false,
    "emotions": false,
    "attention": false
  }
}

Request Parameters:

The parameters are the same as Onboard's, with one addition — faceId.

Parameter Type Required Description
image object Yes The image whose faces are compared
image.url string (nullable) No URL of a jpeg or png image. http/https only, and the host must resolve to a public address
image.bytes string (nullable) No Base 64 string encoded binary jpeg or png image. Takes precedence over image.url
image.id string (nullable) No The id of an image stored with the API, as returned by Upload Image or by a verification session's result. Takes precedence over image.url
collectionId string Yes The id of the collection the face belongs to. Max length 512. May only contain letters, numbers, dashes (-), underscores (_) and dots (.)
faceId string Yes The id of the face in the collection to compare against, as returned by Onboard. Max 64 characters
faceMatchThreshold integer No The similarity at or above which a face counts as a match. Default value: 80. Valid range: 0-100. It decides isMatch only — similarity is reported either way.

Threshold reference (computed using extensive in-the-wild datasets):
• 95 corresponds to FPR 1e-06
• 90 corresponds to FPR 1e-05
• 80 corresponds to FPR 1e-4
• 70 corresponds to FPR 1e-3
maxFaces integer No The maximum number of faces on the image to compare. Default value: 1. Valid range: 1-4. Faces beyond this limit are counted in unprocessedFaceCount
include object No Which optional attributes are returned for every face. All options default to false. Enable only the ones you read — see Optional attributes for the cost
include.age boolean No Return the estimated age
include.gender boolean No Return the detected gender
include.emotions boolean No Return the detected emotions. Adds a surcharge per face
include.attention boolean No Return the detected presence and attention. Adds a surcharge per face

Response Example:

{
  "faces": [
    {
      "face": {
        "confidence": 0.9987,
        "boundingBox": {
          "x": 120,
          "y": 80,
          "width": 200,
          "height": 250
        }
      },
      "similarity": 96,
      "isMatch": true,
      "age": null,
      "gender": null,
      "emotions": null,
      "attention": null
    }
  ],
  "unprocessedFaceCount": 0
}

Response Fields:

Field Path Type Description
faces array One entry per face this call compared, ordered by dominance. Empty when no face was detected on the image, or when none of the detected faces could be answered for. A face the API cannot answer for with confidence has no entry — see Face detection restrictions
faces[].face object Detected face information, always in the coordinates of the image you supplied
faces[].face.confidence number Face detection score with value range [0.0, 1.0] (higher is better)
faces[].face.boundingBox object Model for the bounding box of a detected face
faces[].face.boundingBox.x integer Horizontal position of the detected face bounding box
faces[].face.boundingBox.y integer Vertical position of the detected face bounding box
faces[].face.boundingBox.width integer Width of the detected face bounding box
faces[].face.boundingBox.height integer Height of the detected face bounding box
faces[].similarity integer How similar this face is to the one named by faceId, with value range [0, 100] (higher is better). Reported whether or not it reached the threshold, so a near miss can be told from a face that looks nothing like them
faces[].isMatch boolean Whether similarity reached faceMatchThreshold
faces[].age object (nullable) Returned only when include.age is true. Same shape as on Onboard
faces[].gender string (nullable) Male or Female. Returned only when include.gender is true
faces[].emotions object (nullable) Returned only when include.emotions is true. Same shape as on Onboard
faces[].attention object (nullable) Returned only when include.attention is true. Same shape as on Onboard
unprocessedFaceCount integer Faces detected on the image but not compared, because maxFaces limited how many are processed

There is no faceId and no faceStatus on a compare result: you supplied the identity, so the only thing left to answer is how well each face matches it. Whether the person is on the image at all is true for any faces[].isMatch — with maxFaces: 1 that is simply faces[0].isMatch.

Example Request:

curl -X POST "https://verifeye-face-api-eu.realeyes.ai/v1/face/compare" \
  -H "Authorization: ApiKey API-KEY-FROM-DEV-CONSOLE" \
  -H "Content-Type: application/json" \
  -d '{
    "image": {
      "bytes": "/9j/4AAQSkZJRgABAQEAYABgAAD..."
    },
    "collectionId": "my-collection",
    "faceId": "face_abc123xyz789"
  }'

Response Codes:

  • 200 - The faces were compared; each one either matched or did not
  • 400 - Validation failure
  • 401 - Authentication failure
  • 403 - The account has reached its face check limit
  • 404 - Collection not found, or the collection holds no face with that faceId
  • 504 - The request did not complete within the time budget

Delete Face

Deletes a single face from the collection. Deleting a face also removes any external key association it had.

Endpoint: DELETE /v1/face/delete

Authentication: API Key or Bearer Token

Query Parameters:

Parameter Type Required Description
collectionId string Yes The id of the collection the face belongs to
faceId string Yes The id of the face to be deleted. Max 64 characters

Response Example:

{}

Example Request:

curl -X DELETE "https://verifeye-face-api-eu.realeyes.ai/v1/face/delete?collectionId=my-collection&faceId=face_abc123xyz789" \
  -H "Authorization: ApiKey API-KEY-FROM-DEV-CONSOLE"

Response Codes:

  • 200 - The face was deleted (idempotent)
  • 400 - Validation failure
  • 401 - Authentication failure
  • 404 - Collection not found

Stored Images

An image can be stored with the API and referred to by its id afterwards, as image.id on Onboard, Identify and Compare. An id is valid on the Face API of the region that issued it, until its retention passes. Images captured by a VerifEye verification session are stored the same way; reading an image back needs image access enabled on the account — contact support.

Upload Image

Stores an image and returns its id.

Endpoint: POST /v1/image/upload

Authentication: API Key or Bearer Token

Request Body:

{
  "image": {
    "url": "https://example.com/image.jpg"
  },
  "retentionDays": 7
}

Request Parameters:

Parameter Type Required Description
image object Yes The image to store, as image.url or image.bytes, within the same bounds as the face operations
retentionDays integer No How many days the id stays usable. Default value: 7. Valid range: 1-30

Response Example:

{
  "imageId": "eu_0123456789abcdef0123456789abcdef",
  "expiresAt": "2026-10-05T12:00:00Z"
}

Example Request:

curl -X POST "https://verifeye-face-api-eu.realeyes.ai/v1/image/upload" \
  -H "Authorization: ApiKey API-KEY-FROM-DEV-CONSOLE" \
  -H "Content-Type: application/json" \
  -d '{"image": {"url": "https://example.com/image.jpg"}, "retentionDays": 7}'

Response Codes:

  • 200 - The image was stored
  • 400 - Validation failure
  • 401 - Authentication failure
  • 403 - The account has opted out of storing images

Get Image

Returns a stored image, Base64 encoded. Available to accounts with image access enabled — contact support.

Endpoint: GET /v1/image/get

Authentication: API Key or Bearer Token

Query Parameters:

Parameter Type Required Description
imageId string Yes The image id

Response Example:

{
  "imageId": "eu_0123456789abcdef0123456789abcdef",
  "contentType": "image/jpeg",
  "bytes": "/9j/4AAQSkZJRg...",
  "createdAt": "2026-09-28T12:00:00Z",
  "expiresAt": "2026-10-05T12:00:00Z"
}

Example Request:

curl -X GET "https://verifeye-face-api-eu.realeyes.ai/v1/image/get?imageId=eu_0123456789abcdef0123456789abcdef" \
  -H "Authorization: ApiKey API-KEY-FROM-DEV-CONSOLE"

Response Codes:

  • 200 - The image
  • 400 - Not an image id this API issued, or one issued by the other region
  • 401 - Authentication failure
  • 403 - Image access is not enabled for the account
  • 404 - No image with that id belongs to the account, or its retention has passed

Delete Image

Deletes a stored image. The id stops working at once.

Endpoint: DELETE /v1/image/delete

Authentication: API Key or Bearer Token

Query Parameters:

Parameter Type Required Description
imageId string Yes The image id

Response Example:

{}

Example Request:

curl -X DELETE "https://verifeye-face-api-eu.realeyes.ai/v1/image/delete?imageId=eu_0123456789abcdef0123456789abcdef" \
  -H "Authorization: ApiKey API-KEY-FROM-DEV-CONSOLE"

Response Codes:

  • 200 - The image was deleted, or there was nothing to delete (idempotent)
  • 400 - Not an image id this API issued, or one issued by the other region
  • 401 - Authentication failure

Collection Management

A collection is the store of faces that onboard, identify and compare work against. For a conceptual overview of what a face collection is and how it relates to a Verification, see Face collection.

Get Collection

Retrieves a single collection by its identifier.

Endpoint: GET /v1/collection/get

Authentication: API Key or Bearer Token

Query Parameters:

Parameter Type Required Description
collectionId string Yes The collection identifier

Response Example:

{
  "collection": {
    "collectionId": "my-collection",
    "description": "Collection for employee verification",
    "createdAt": "2026-01-15T10:30:00Z",
    "updatedAt": "2026-02-10T14:20:00Z"
  }
}

Response Fields:

Field Path Type Description
collection object The collection details
collection.collectionId string Identifier of the collection
collection.description string Optional textual description
collection.createdAt string UTC timestamp when the collection was created
collection.updatedAt string UTC timestamp when the collection was last updated

Example Request:

curl -X GET "https://verifeye-face-api-eu.realeyes.ai/v1/collection/get?collectionId=my-collection" \
  -H "Authorization: ApiKey API-KEY-FROM-DEV-CONSOLE"

Response Codes:

  • 200 - Collection found
  • 400 - Validation failure
  • 401 - Authentication failure
  • 404 - Collection not found

Get All Collections

Lists all collections belonging to the authenticated account.

Endpoint: GET /v1/collection/get-all

Authentication: API Key or Bearer Token

Response Example:

{
  "collections": [
    {
      "collectionId": "my-collection",
      "description": "Collection for employee verification",
      "createdAt": "2026-01-15T10:30:00Z",
      "updatedAt": "2026-02-10T14:20:00Z"
    },
    {
      "collectionId": "employee-faces",
      "description": "",
      "createdAt": "2026-01-20T08:15:00Z",
      "updatedAt": "2026-01-20T08:15:00Z"
    }
  ]
}

Response Fields:

Field Path Type Description
collections array Collections returned for the account (may be empty)
collections[].collectionId string Identifier of the collection
collections[].description string Optional textual description of the collection
collections[].createdAt string UTC timestamp when the collection was created
collections[].updatedAt string UTC timestamp when the collection was last updated

Example Request:

curl -X GET "https://verifeye-face-api-eu.realeyes.ai/v1/collection/get-all" \
  -H "Authorization: ApiKey API-KEY-FROM-DEV-CONSOLE"

Response Codes:

  • 200 - Collections returned
  • 400 - Validation failure
  • 401 - Authentication failure

Create Collection

Creates a new collection.

Endpoint: POST /v1/collection/create

Authentication: API Key or Bearer Token

Request Body:

{
  "collectionId": "new-collection",
  "description": "Collection for customer verification"
}

Request Parameters:

Parameter Type Required Description
collectionId string Yes Unique identifier for the collection (max length 512). May only contain letters, numbers, dashes (-), underscores (_) and dots (.). Other characters are rejected with 400
description string No Optional description (max length 1024)

Response Example:

{
  "collectionId": "new-collection"
}

Response Fields:

Name Type Description
collectionId string Identifier of the created collection

Example Request:

curl -X POST "https://verifeye-face-api-eu.realeyes.ai/v1/collection/create" \
  -H "Authorization: ApiKey API-KEY-FROM-DEV-CONSOLE" \
  -H "Content-Type: application/json" \
  -d '{
    "collectionId": "new-collection",
    "description": "Collection for customer verification"
  }'

Response Codes:

  • 200 - Collection created successfully
  • 400 - Validation failure
  • 401 - Authentication failure
  • 409 - Collection already exists

Update Collection

Updates an existing collection (only description is mutable).

Endpoint: PUT /v1/collection/update

Authentication: API Key or Bearer Token

Request Body:

{
  "collectionId": "my-collection",
  "description": "Updated description for my collection"
}

Request Parameters:

Parameter Type Required Description
collectionId string Yes Identifier of the collection to update
description string No New description (max length 1024)

Response Example:

{
  "collectionId": "my-collection"
}

Response Fields:

Name Type Description
collectionId string Identifier of the updated collection

Example Request:

curl -X PUT "https://verifeye-face-api-eu.realeyes.ai/v1/collection/update" \
  -H "Authorization: ApiKey API-KEY-FROM-DEV-CONSOLE" \
  -H "Content-Type: application/json" \
  -d '{
    "collectionId": "my-collection",
    "description": "Updated description for my collection"
  }'

Response Codes:

  • 200 - Collection updated
  • 400 - Validation failure
  • 401 - Authentication failure
  • 404 - Collection not found

Reset Collection

Removes all faces from a collection without deleting the collection itself. The collection (and its description) is preserved and remains usable; only the faces it contains — and any external key associations they had — are removed. This operation is irreversible.

Endpoint: DELETE /v1/collection/reset

Authentication: API Key or Bearer Token

Query Parameters:

Parameter Type Required Description
collectionId string Yes The collection identifier

Response Example:

{
  "collectionId": "my-collection"
}

Response Fields:

Name Type Description
collectionId string (nullable) Identifier of the collection that was reset

Example Request:

curl -X DELETE "https://verifeye-face-api-eu.realeyes.ai/v1/collection/reset?collectionId=my-collection" \
  -H "Authorization: ApiKey API-KEY-FROM-DEV-CONSOLE"

Response Codes:

  • 200 - Collection reset (all faces removed)
  • 400 - Validation failure
  • 401 - Authentication failure
  • 404 - Collection not found

Delete Collection

Deletes a collection by its identifier.

Endpoint: DELETE /v1/collection/delete

Authentication: API Key or Bearer Token

Query Parameters:

Parameter Type Required Description
collectionId string Yes The collection identifier

Response Example:

{}

Example Request:

curl -X DELETE "https://verifeye-face-api-eu.realeyes.ai/v1/collection/delete?collectionId=my-collection" \
  -H "Authorization: ApiKey API-KEY-FROM-DEV-CONSOLE"

Response Codes:

  • 200 - Collection deleted (idempotent)
  • 400 - Validation failure
  • 401 - Authentication failure
  • 404 - Collection not found

External Key Management

External keys let you attach your own identifier (for example a customer id, user id or reference number) to a face. The relation is one-to-one: a face has at most one external key, and an external key maps to exactly one face.

External keys are managed independently of onboarding: Onboard never sets one. After onboarding a face, call set to associate a key with it. Once associated, the key comes back on every onboard and identify result that matches the face.

Set External Key

Associates an external key with a face. Creates a new association or updates the existing one (a face's key is replaced when set again with a different key). Setting a key that is already associated with a different face is rejected with 400; remove the existing association with Delete External Key Association first.

Endpoint: PUT /v1/external-key/set

Authentication: API Key or Bearer Token

Request Body:

{
  "collectionId": "my-collection",
  "faceId": "face_abc123xyz789",
  "externalKey": "user-123"
}

Request Parameters:

Parameter Type Required Description
collectionId string Yes The id of the collection the face belongs to
faceId string Yes The id of the face to associate the external key with. Max 64 characters
externalKey string Yes The external key to associate. See External key format

Response Example:

{
  "faceId": "face_abc123xyz789",
  "externalKey": "user-123",
  "result": "Created"
}

Response Fields:

Field Path Type Description
faceId string The id of the face the external key was associated with
externalKey string The external key that was associated
result string Whether the association was newly created or updated. Possible values: Created, Updated

Example Request:

curl -X PUT "https://verifeye-face-api-eu.realeyes.ai/v1/external-key/set" \
  -H "Authorization: ApiKey API-KEY-FROM-DEV-CONSOLE" \
  -H "Content-Type: application/json" \
  -d '{
    "collectionId": "my-collection",
    "faceId": "face_abc123xyz789",
    "externalKey": "user-123"
  }'

Response Codes:

  • 200 - Association created or updated
  • 400 - Validation failure, or the external key is already associated with a different face
  • 401 - Authentication failure
  • 404 - Collection not found

Get Face ID by External Key

Returns the face associated with the specified external key in a collection. An external key maps to exactly one face.

Endpoint: GET /v1/external-key/get-face-id

Authentication: API Key or Bearer Token

Query Parameters:

Parameter Type Required Description
collectionId string Yes The collection identifier
externalKey string Yes The external key to look up. See External key format

Response Example:

{
  "faceId": "face_abc123xyz789"
}

Response Fields:

Field Path Type Description
faceId string (nullable) The id of the face associated with the external key. null when the key has no face

Example Request:

curl -X GET "https://verifeye-face-api-eu.realeyes.ai/v1/external-key/get-face-id?collectionId=my-collection&externalKey=user-123" \
  -H "Authorization: ApiKey API-KEY-FROM-DEV-CONSOLE"

Response Codes:

  • 200 - Lookup succeeded
  • 400 - Validation failure
  • 401 - Authentication failure
  • 404 - Collection not found

Get Face IDs by External Key

Returns the face associated with the specified external key in a collection. An external key maps to exactly one face.

Endpoint: GET /v1/external-key/get-face-ids

Authentication: API Key or Bearer Token

Query Parameters:

Parameter Type Required Description
collectionId string Yes The collection identifier
externalKey string Yes The external key to look up. See External key format

Response Example:

{
  "faceId": "face_abc123xyz789",
  "faceIds": ["face_abc123xyz789"]
}

Response Fields:

Field Path Type Description
faceId string (nullable) The id of the face associated with the external key. null when the key has no face
faceIds array Deprecated. Use faceId instead. The same id as a one-element array, empty when the key has no face. Supported until 31 December 2026 and removed after that date

Example Request:

curl -X GET "https://verifeye-face-api-eu.realeyes.ai/v1/external-key/get-face-ids?collectionId=my-collection&externalKey=user-123" \
  -H "Authorization: ApiKey API-KEY-FROM-DEV-CONSOLE"

Response Codes:

  • 200 - Lookup succeeded
  • 400 - Validation failure
  • 401 - Authentication failure
  • 404 - Collection not found

Delete External Key Association

Removes an external key association. When faceId is omitted, the external key is unlinked from whichever face it points at; otherwise the pair is removed only for that face. This only removes the key association — it does not delete the face itself (use Delete Face for that).

Endpoint: DELETE /v1/external-key/delete

Authentication: API Key or Bearer Token

Query Parameters:

Parameter Type Required Description
collectionId string Yes The collection identifier
externalKey string Yes The external key whose association is removed. See External key format
faceId string No When omitted, the external key is unlinked from whichever face it points at. When provided, the pair is removed only for that face

Response Example:

{}

Example Request:

curl -X DELETE "https://verifeye-face-api-eu.realeyes.ai/v1/external-key/delete?collectionId=my-collection&externalKey=user-123" \
  -H "Authorization: ApiKey API-KEY-FROM-DEV-CONSOLE"

Response Codes:

  • 200 - Associations removed (idempotent)
  • 400 - Validation failure
  • 401 - Authentication failure
  • 404 - Collection not found

External Key Format

  • Maximum length: 512 characters.
  • Allowed characters: printable ASCII only (0x21–0x7E). Spaces, control characters and Unicode characters are rejected with 400.
  • Recommended encoding: keep keys ASCII. If you need to embed richer identifiers (Unicode names, or values containing spaces or slashes), base64url-encode them on your side and store the encoded value (e.g. matching ^[A-Za-z0-9_-]{1,512}$).
  • Why ASCII only: external keys are used as lookup keys and may appear in URLs and logs. Restricting to printable ASCII avoids URL-encoding ambiguity and Unicode normalization collisions, where two visually identical keys are not byte-for-byte equal and therefore do not match.

Use Cases

For end-to-end scenarios using this API — including registering a face and checking it later — see the Use Cases page.


Health Check

Check the API health status.

Endpoint: GET /v1/healthz

Authentication: None required

Response Example:

2026-08-04T10:30:45Z

Response Fields:

Name Type Description
(response body) string The server UTC time in ISO 8601 format

Example Request:

curl -X GET "https://verifeye-face-api-eu.realeyes.ai/v1/healthz"

Response Codes:

  • 200 - API is healthy

Common Response Codes

Code Description
200 Success
400 Bad Request - Invalid parameters
401 Unauthorized - Missing or invalid authentication
403 Forbidden - Valid authentication but account not found or insufficient permissions
404 Not Found - Resource not found
409 Conflict - An identical request with the same Idempotency-Key is still being processed, or ended in a 504 or a 5xx other than 503 within the last minute; retry after the Retry-After header
500 Internal Server Error
503 Service Unavailable - Onboard only: the faces cannot be onboarded right now; retry after the Retry-After header
504 Gateway Timeout - The request did not complete within the time budget

Model validation failures (400) return a JSON body (ProblemDetails) with an errors object listing the invalid fields. A 401 returns {"message":"Unauthorized"} — no errors object. Some request-level errors — a missing image, an unfetchable image URL — return a plain-text message instead. Do not assume a single error shape; branch on Content-Type and on the status code.


Swagger Documentation

Interactive API documentation is available via Swagger UI:

The OpenAPI specification is available at:


Last updated: 2026-11-03