Add Privacy Key Credential
Overview
The Add Privacy Key Credential API adds a Privacy Key as a credential to an existing account. It supports two ways of supplying the key:
- Send a facial image - the platform mints the Privacy Key for you, server-side, using Omnifaces image processing. This is the recommended path: the minted key is guaranteed to be compatible with your tenant's duplicate-detection and search features.
- Send a ready-made Privacy Key - a key you already hold (for example, one returned by the 1:1 Privacy Key Matching API) is stored as-is.
In both cases the credential is registered against your tenant's Privacy Key search policy, so accounts enrolled through this API behave the same as accounts enrolled through a live transaction.
This API works with Privacy Key credentials only. It does not create or affect traditional biometric enrollments (biometric templates stored by the platform); those are managed through the standard transaction workflows.
Authentication & Authorization
- Requests must include a valid bearer customer token.
- The Customer Create Account FIDO2 Credentials permission (
CustomerCreateAccountFido2Credentials) is required to invoke this API.
This permission is not enabled by default. Contact your authID representative to have it added to your tenant and mapped to the appropriate roles.
When to Use
Use this API when you:
- Need to enroll an account with a Privacy Key credential without running an interactive transaction
- Are migrating accounts from another system and hold reference facial images
- Already hold a Privacy Key from a prior workflow and want to attach it to an account
The image you send is used only to mint the Privacy Key. It is processed in transit and is never stored by the platform.
Trust Model
An image supplied through this API is asserted by you, the operator. It does not pass through the injection and presentation attack checks that a live transaction performs, so only submit images whose authenticity your organization has already established. This is why the API requires a dedicated operator permission.
Endpoint
POST /accounts/{accountNumber}/fido2CredentialsCreates a Privacy Key credential for the given account. When an image is supplied, the Privacy Key is minted from it server-side.
Request
The request format depends on which enrollment mode you use.
Path Parameters
| Field | Type | Required | Description |
|---|---|---|---|
| accountNumber | string | Yes | The account the credential is added to |
Mode 1 - Mint from image
Content-Type: multipart/form-data
Send the facial image as a binary file part. One credential is created per request.
curl -X POST "https://<host>/IDCompleteBackendEngine/Default/AdministrationServiceRest/v1/accounts/<accountNumber>/fido2Credentials" \
-H "Authorization: Bearer <token>" \
-F "[email protected]" \
-F "description=Enrollment key"| Field | Type | Required | Description |
|---|---|---|---|
| image | binary | Yes | Facial image used to mint the Privacy Key server-side |
| description | string | No | A label for the credential, shown in account details |
When an image is provided, it always wins: any ready-made key included in the same request is disregarded, and the credential stored (and returned) is the one minted from the image.
Mode 2 - Store a ready-made key
Content-Type: application/json
The body is an array of credential objects, one credential created per entry.
curl -X POST "https://<host>/IDCompleteBackendEngine/Default/AdministrationServiceRest/v1/accounts/<accountNumber>/fido2Credentials" \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '[{ "Fido2PublicKey": "<privacy key>", "Description": "Enrollment key" }]'| Field | Type | Required | Description |
|---|---|---|---|
| Fido2PublicKey | string | Yes | A ready-made Privacy Key to store as the credential |
| Description | string | No | A label for the credential, shown in account details |
Behavior by Tenant Search Policy
Your tenant is configured with one of three Privacy Key search policies. The API's behavior depends on the policy and on whether you sent an image or a ready-made key.
Image provided (key minted server-side)
| Tenant policy | Behavior |
|---|---|
| Disabled / no policy | Key is minted and stored. No search-space interaction. |
| Add | Key is minted, stored, and enrolled into the tenant's search space. |
| AddAndBlockDuplicates | Key is minted and checked against the search space in a single atomic step. If the face matches a different account, the request is rejected as a duplicate and nothing is stored. |
Ready-made key provided (no image)
| Tenant policy | Behavior |
|---|---|
| Disabled / no policy | Key is stored. Behavior unchanged from earlier releases. |
| Add | Key is stored and enrolled into the tenant's search space. |
| AddAndBlockDuplicates | Request is rejected. Duplicate detection requires data that only server-side minting produces, so a ready-made key cannot satisfy this policy. Send an image instead. |
Response
The response is an array with one entry per created credential.
[
{
"Id": "string",
"CreatedDate": "2026-08-17T12:00:00Z",
"Description": "Enrollment key",
"KeyData": "string"
}
]Fields
| Field | Type | Description |
|---|---|---|
| Id | string | Unique identifier of the stored credential |
| CreatedDate | string (date-time) | When the credential was created |
| Description | string | The label supplied in the request |
| KeyData | string | The minted Privacy Key material. Returned only when the credential was minted from an image. |
Errors
| Scenario | Result |
|---|---|
| Image matches a different account (AddAndBlockDuplicates) | Rejected as duplicate; nothing stored |
| Ready-made key sent under AddAndBlockDuplicates | Rejected; send an image instead |
| Neither image nor key supplied | Rejected as invalid request |
| Image can't be processed (e.g. no face detected) | 400 Bad Request naming the offending argument |
| Privacy Key search service unreachable | Fails closed; no credential written; safe to retry |
| Credential already exists or account credential limit reached | 409 Conflict |
| Missing or invalid token / permission | 401 Unauthorized |
Updated about 2 hours ago
