GenuineAIGenuineAI
For usersFor developers
  • Overview
  • Guides
  • How-to
  • API reference
Documentation
  • Quickstart
  • Authentication
  • Errors
  • Rate limits
  • API reference
Platform
  • Platform overview
  • Solutions
  • Pricing
  • Sign in
Company
  • Status
  • Trust Center
  • Contact
  • Terms of Service
  • Privacy Policy

© 2026 GenuineAI Ventures LLC

support@genuinehq.com
Overview
Core
Media library
    Files
    Uploads
    Stock photos
    Downloads
    File versions
    File analysis
    Media analysis schemas
    Faces
    Albums
    People
      List peoplegetRename a personputDelete a persondeleteList photosgetRebuild the face indexpostSet the cover facepostVerify suggestionspostAssign a facepostMerge two peoplepostList suggestionsgetConfirm a suggestionpostReject a suggestionpostResolve suggestionspostUnassign a facepost
    Media tags
    Share links
    Publications
    Distribution control
AI
Documents
Knowledge
Creative
Website & content
Automation
Customer channels
Administration
Schemas
GenuineAI API
GenuineAI API

People

The named identities faces are grouped into, and the suggestions that propose each grouping. The detections themselves are in Faces.


List people

GET
https://api.genuineai.app/api/v1
/people

Beta — this operation may change on 30 days notice. See versioning.

Returns the people in the workspace, most-photographed first, each with the number of faces assigned to it and the number of suggestions waiting for review.

unnamed=true returns only the clusters nobody has named yet, and needs_review=true only those with suggestions pending — the two queues the review UI is built around.

List people › query Parameters

cursor
​string · maxLength: 512 · pattern: ^[A-Za-z0-9_-]+$
fp_name
​string
limit
​integer
needs_review
​boolean
offset
​integer · min: 0
sort
​string · minLength: 1 · maxLength: 64 · pattern: ^-?[a-z0-9_]+$
unnamed
​boolean

List people › Headers

X-Tenant-Id
​string · uuid · required

The workspace this request acts in. Every row the API returns is isolated to it at the database layer by row-level security.

List people › Responses

Success

​Person[] · required
has_more
​boolean · required

Whether more rows exist past this page.

next_cursor
​string | null · required

Pass back as cursor for the next page. Null on the last page.

GET/people
curl https://api.genuineai.app/api/v1/people \ --header 'X-Tenant-Id: <string>' \ --header 'X-Api-Key: <api-key>'
Example Responses
{ "data": [ { "fp_id": "00000000-0000-0000-0000-000000000000", "fp_name": "fp_name", "fp_cover": "fp_cover", "fp_metadata": {}, "fp_active": true, "fp_created": "2024-08-25T15:00:00Z", "fp_updated": "2024-08-25T15:00:00Z", "cover_thumbnail": "cover_thumbnail", "face_count": 0, "manual_count": 0, "suggestion_count": 0, "total_count": 0 } ], "has_more": true, "next_cursor": "next_cursor" }
json
application/json

Rename a person

PUT
https://api.genuineai.app/api/v1
/people/{id}

Beta — this operation may change on 30 days notice. See versioning.

Rename a person › path Parameters

id
​string · uuid · required

Rename a person › Headers

X-Tenant-Id
​string · uuid · required

The workspace this request acts in. Every row the API returns is isolated to it at the database layer by row-level security.

Rename a person › Request Body optional

fp_name
​string

Rename a person › Responses

Success

No data returned
PUT/people/{id}
curl https://api.genuineai.app/api/v1/people/:id \ --request PUT \ --header 'Content-Type: application/json' \ --header 'X-Tenant-Id: <string>' \ --header 'X-Api-Key: <api-key>' \ --data '{ "fp_name": "fp_name" }'
Example Request Body
{ "fp_name": "fp_name" }
json
Example Responses
No example specified for this content type

Delete a person

DELETE
https://api.genuineai.app/api/v1
/people/{id}

Beta — this operation may change on 30 days notice. See versioning.

Releases every face assigned to this person and then deactivates it. The faces and the photos survive — they go back to being unassigned detections, available to be grouped again.

Delete a person › path Parameters

id
​string · uuid · required

Delete a person › Headers

X-Tenant-Id
​string · uuid · required

The workspace this request acts in. Every row the API returns is isolated to it at the database layer by row-level security.

Delete a person › Responses

Success. No content.

No data returned
DELETE/people/{id}
curl https://api.genuineai.app/api/v1/people/:id \ --request DELETE \ --header 'X-Tenant-Id: <string>' \ --header 'X-Api-Key: <api-key>'
Example Responses
No example specified for this content type

List photos

GET
https://api.genuineai.app/api/v1
/people/{id}/photos

Beta — this operation may change on 30 days notice. See versioning.

Only files the caller may read are returned — the file's own access rules still apply, so two people looking at the same person can see different photos.

List photos › path Parameters

id
​string · uuid · required

List photos › query Parameters

cursor
​string · maxLength: 512 · pattern: ^[A-Za-z0-9_-]+$
limit
​integer
offset
​integer · min: 0
sort
​string · minLength: 1 · maxLength: 64 · pattern: ^-?[a-z0-9_]+$

List photos › Headers

X-Tenant-Id
​string · uuid · required

The workspace this request acts in. Every row the API returns is isolated to it at the database layer by row-level security.

List photos › Responses

Success

​PersonPhoto[] · required
has_more
​boolean · required

Whether more rows exist past this page.

next_cursor
​string | null · required

Pass back as cursor for the next page. Null on the last page.

GET/people/{id}/photos
curl https://api.genuineai.app/api/v1/people/:id/photos \ --header 'X-Tenant-Id: <string>' \ --header 'X-Api-Key: <api-key>'
Example Responses
{ "data": [ { "file_id": "00000000-0000-0000-0000-000000000000", "file_name": "file_name", "file_type": "file_type", "file_size": 0, "file_created": "2024-08-25T15:00:00Z", "file_updated": "2024-08-25T15:00:00Z", "file_replicas": "file_replicas", "file_metadata": {}, "file_status": "file_status", "file_bucket": "file_bucket", "file_folder": "file_folder", "file_provider_id": "00000000-0000-0000-0000-000000000000", "fd_id": "00000000-0000-0000-0000-000000000000", "fd_thumbnail": "fd_thumbnail", "fd_confidence": 0, "fd_match_distance": 0, "fd_box": {} } ], "has_more": true, "next_cursor": "next_cursor" }
json
application/json

Rebuild the face index

POST
https://api.genuineai.app/api/v1
/people/{id}/reindex

Beta — this operation may change on 30 days notice. See versioning.

Recomputes the references this person is matched against, after their assignments have changed enough to be worth it. Runs in the background: a request made while one is already running answers 202 rather than starting a second.

Rebuild the face index › path Parameters

id
​string · uuid · required

Rebuild the face index › Headers

X-Tenant-Id
​string · uuid · required

The workspace this request acts in. Every row the API returns is isolated to it at the database layer by row-level security.

Rebuild the face index › Responses

Success

No data returned
POST/people/{id}/reindex
curl https://api.genuineai.app/api/v1/people/:id/reindex \ --request POST \ --header 'X-Tenant-Id: <string>' \ --header 'X-Api-Key: <api-key>'
Example Responses
No example specified for this content type

Set the cover face

POST
https://api.genuineai.app/api/v1
/people/{id}/set-cover

Beta — this operation may change on 30 days notice. See versioning.

The detection must already belong to this person.

Set the cover face › path Parameters

id
​string · uuid · required

Set the cover face › Headers

X-Tenant-Id
​string · uuid · required

The workspace this request acts in. Every row the API returns is isolated to it at the database layer by row-level security.

Set the cover face › Request Body

fd_id
​string · uuid · required

Set the cover face › Responses

Success

No data returned
POST/people/{id}/set-cover
curl https://api.genuineai.app/api/v1/people/:id/set-cover \ --request POST \ --header 'Content-Type: application/json' \ --header 'X-Tenant-Id: <string>' \ --header 'X-Api-Key: <api-key>' \ --data '{ "fd_id": "00000000-0000-0000-0000-000000000000" }'
Example Request Body
{ "fd_id": "00000000-0000-0000-0000-000000000000" }
json
Example Responses
No example specified for this content type

Verify suggestions

POST
https://api.genuineai.app/api/v1
/people/{id}/suggestions/verify

Beta — this operation may change on 30 days notice. See versioning.

Runs one vision comparison of the person's reference faces against each unverified candidate and records a match, no_match or unsure verdict — it catches what the face embeddings cannot.

It decides nothing on its own: verdicts come back through the suggestion list, and a no_match withholds that suggestion. Idempotent, and already-verified candidates are skipped, so calling it twice costs nothing.

Verify suggestions › path Parameters

id
​string · uuid · required

Verify suggestions › Headers

X-Tenant-Id
​string · uuid · required

The workspace this request acts in. Every row the API returns is isolated to it at the database layer by row-level security.

Verify suggestions › Responses

Success

No data returned
POST/people/{id}/suggestions/verify
curl https://api.genuineai.app/api/v1/people/:id/suggestions/verify \ --request POST \ --header 'X-Tenant-Id: <string>' \ --header 'X-Api-Key: <api-key>'
Example Responses
No example specified for this content type

Assign a face

POST
https://api.genuineai.app/api/v1
/people/assign

Beta — this operation may change on 30 days notice. See versioning.

Assigns one detected face. Omit fp_id and a new person is created for it — optionally named with fp_name — which is how a face is named for the first time.

Assign a face › Headers

X-Tenant-Id
​string · uuid · required

The workspace this request acts in. Every row the API returns is isolated to it at the database layer by row-level security.

Assign a face › Request Body

fd_id
​string · uuid · required
fp_id
​string · uuid
fp_name
​string

Assign a face › Responses

Success

No data returned
POST/people/assign
curl https://api.genuineai.app/api/v1/people/assign \ --request POST \ --header 'Content-Type: application/json' \ --header 'X-Tenant-Id: <string>' \ --header 'X-Api-Key: <api-key>' \ --data '{ "fd_id": "00000000-0000-0000-0000-000000000000", "fp_id": "00000000-0000-0000-0000-000000000000", "fp_name": "fp_name" }'
Example Request Body
{ "fd_id": "00000000-0000-0000-0000-000000000000", "fp_id": "00000000-0000-0000-0000-000000000000", "fp_name": "fp_name" }
json
Example Responses
No example specified for this content type

Merge two people

POST
https://api.genuineai.app/api/v1
/people/merge

Beta — this operation may change on 30 days notice. See versioning.

Moves every face from source_id onto target_id and retires the source. This is the fix for one person having been split across two clusters.

Merge two people › Headers

X-Tenant-Id
​string · uuid · required

The workspace this request acts in. Every row the API returns is isolated to it at the database layer by row-level security.

Merge two people › Request Body

source_id
​string · uuid · required
target_id
​string · uuid · required

Merge two people › Responses

Success

No data returned
POST/people/merge
curl https://api.genuineai.app/api/v1/people/merge \ --request POST \ --header 'Content-Type: application/json' \ --header 'X-Tenant-Id: <string>' \ --header 'X-Api-Key: <api-key>' \ --data '{ "source_id": "00000000-0000-0000-0000-000000000000", "target_id": "00000000-0000-0000-0000-000000000000" }'
Example Request Body
{ "source_id": "00000000-0000-0000-0000-000000000000", "target_id": "00000000-0000-0000-0000-000000000000" }
json
Example Responses
No example specified for this content type

List suggestions

GET
https://api.genuineai.app/api/v1
/people/suggestions

Beta — this operation may change on 30 days notice. See versioning.

Faces the matcher believes belong to someone already named, closest match first, waiting for a yes or no. Filter to one person with fp_id.

Suggestions that plainly contradict the person are withheld rather than shown and rejected: a gender estimate against confidently-gendered references, an age far from the person's median, or a no_match verdict from the vision check. Anything already verified carries its verdict here.

List suggestions › query Parameters

cursor
​string · maxLength: 512 · pattern: ^[A-Za-z0-9_-]+$
fp_id
​string · uuid
limit
​integer
offset
​integer · min: 0
sort
​string · minLength: 1 · maxLength: 64 · pattern: ^-?[a-z0-9_]+$

List suggestions › Headers

X-Tenant-Id
​string · uuid · required

The workspace this request acts in. Every row the API returns is isolated to it at the database layer by row-level security.

List suggestions › Responses

Success

​FaceSuggestion[] · required
has_more
​boolean · required

Whether more rows exist past this page.

next_cursor
​string | null · required

Pass back as cursor for the next page. Null on the last page.

GET/people/suggestions
curl https://api.genuineai.app/api/v1/people/suggestions \ --header 'X-Tenant-Id: <string>' \ --header 'X-Api-Key: <api-key>'
Example Responses
{ "data": [ { "fd_id": "00000000-0000-0000-0000-000000000000", "fd_file": "fd_file", "fd_thumbnail": "fd_thumbnail", "fd_confidence": 0, "fd_created": "2024-08-25T15:00:00Z", "fd_gender": "fd_gender", "fd_gender_confidence": 0, "fd_age": "fd_age", "suggest_verify": {}, "suggested_distance": 0, "fp_id": "00000000-0000-0000-0000-000000000000", "fp_name": "fp_name", "person_thumbnail": "person_thumbnail", "person_gender": "person_gender", "person_age": 0, "file_id": "00000000-0000-0000-0000-000000000000", "file_name": "file_name", "file_type": "file_type", "file_replicas": {}, "file_bucket": "file_bucket", "file_folder": "file_folder", "file_provider_id": "file_provider_id", "file_created": "2024-08-25T15:00:00Z" } ], "has_more": true, "next_cursor": "next_cursor" }
json
application/json

Confirm a suggestion

POST
https://api.genuineai.app/api/v1
/people/suggestions/{id}/confirm

Beta — this operation may change on 30 days notice. See versioning.

Confirm a suggestion › path Parameters

id
​string · uuid · required

Confirm a suggestion › Headers

X-Tenant-Id
​string · uuid · required

The workspace this request acts in. Every row the API returns is isolated to it at the database layer by row-level security.

Confirm a suggestion › Responses

Success

No data returned
POST/people/suggestions/{id}/confirm
curl https://api.genuineai.app/api/v1/people/suggestions/:id/confirm \ --request POST \ --header 'X-Tenant-Id: <string>' \ --header 'X-Api-Key: <api-key>'
Example Responses
No example specified for this content type

Reject a suggestion

POST
https://api.genuineai.app/api/v1
/people/suggestions/{id}/reject

Beta — this operation may change on 30 days notice. See versioning.

Reject a suggestion › path Parameters

id
​string · uuid · required

Reject a suggestion › Headers

X-Tenant-Id
​string · uuid · required

The workspace this request acts in. Every row the API returns is isolated to it at the database layer by row-level security.

Reject a suggestion › Responses

Success

No data returned
POST/people/suggestions/{id}/reject
curl https://api.genuineai.app/api/v1/people/suggestions/:id/reject \ --request POST \ --header 'X-Tenant-Id: <string>' \ --header 'X-Api-Key: <api-key>'
Example Responses
No example specified for this content type

Resolve suggestions

POST
https://api.genuineai.app/api/v1
/people/suggestions/actions/resolve

Beta — this operation may change on 30 days notice. See versioning.

Applies one action — confirm or reject — to every id in fd_ids. A suggestion someone else already resolved is skipped rather than failing the batch, so the counts in the response are the truth about what this call did.

Resolve suggestions › Headers

X-Tenant-Id
​string · uuid · required

The workspace this request acts in. Every row the API returns is isolated to it at the database layer by row-level security.

Resolve suggestions › Request Body

action
​string · enum · required
Enum values:
confirm
reject
fd_ids
​string[] · required

Resolve suggestions › Responses

Success

confirmed
​integer
rejected
​integer
skipped
​integer

Already assigned or already resolved elsewhere.

POST/people/suggestions/actions/resolve
curl https://api.genuineai.app/api/v1/people/suggestions/actions/resolve \ --request POST \ --header 'Content-Type: application/json' \ --header 'X-Tenant-Id: <string>' \ --header 'X-Api-Key: <api-key>' \ --data '{ "action": "confirm", "fd_ids": [ "00000000-0000-0000-0000-000000000000" ] }'
Example Request Body
{ "action": "confirm", "fd_ids": [ "00000000-0000-0000-0000-000000000000" ] }
json
Example Responses
{ "confirmed": 0, "rejected": 0, "skipped": 0 }
json
application/json

Unassign a face

POST
https://api.genuineai.app/api/v1
/people/unassign

Beta — this operation may change on 30 days notice. See versioning.

Detaches a face from its person and leaves it as an unassigned detection.

Unassign a face › Headers

X-Tenant-Id
​string · uuid · required

The workspace this request acts in. Every row the API returns is isolated to it at the database layer by row-level security.

Unassign a face › Request Body

fd_id
​string · uuid · required

Unassign a face › Responses

Success

No data returned
POST/people/unassign
curl https://api.genuineai.app/api/v1/people/unassign \ --request POST \ --header 'Content-Type: application/json' \ --header 'X-Tenant-Id: <string>' \ --header 'X-Api-Key: <api-key>' \ --data '{ "fd_id": "00000000-0000-0000-0000-000000000000" }'
Example Request Body
{ "fd_id": "00000000-0000-0000-0000-000000000000" }
json
Example Responses
No example specified for this content type

AlbumsMedia tags