Compliance
Face and voice consent records, and the AI label in your own app.
/v1/compliance/ai-labelThe AI label attestation
Whether an owner has confirmed that your own app shows its own AI label for the whole of every session and a notice at its start, so the SDKs may hide theirs (the session token's disclosure.ownLabel), with the words they confirmed.
Returns
200 The current answer. data is AiLabelAttestation.
Fields of data
attestedbooleanrequiredAn owner has confirmed that your own app shows its own AI label: from the next session, the SDKs may hide theirs.
attestedAtstring (date-time) | nullrequiredWhen the current answer was given.
attestedByobject | nullrequiredThe owner who gave it.
idstringrequiredPerson id (
usr_…).pattern `^usr_.*`
versionstring | nullrequiredThe version of the words they confirmed.
currentVersionstringrequiredThe version of today's words.
wordsstringrequiredWhat an owner confirms, word for word.
Errors
invalid_requestunauthorizedforbiddenupgrade_requiredrate_limitedserver_error
Request
curl "https://app.zentiqai.com/v1/compliance/ai-label" \
-H "Authorization: Bearer $ZENTIQ_API_KEY"import { Zentiq } from "@zentiq/node";
const zentiq = new Zentiq({ apiKey: process.env.ZENTIQ_API_KEY });
const result = await zentiq.getAiLabelAttestation();import os
from zentiq import Zentiq
zentiq = Zentiq(api_key=os.environ["ZENTIQ_API_KEY"])
result = zentiq.get_ai_label_attestation()Response
{
"data": {
"attested": true,
"attestedAt": "2026-09-25T12:00:00.000Z",
"attestedBy": {
"id": "usr_cmfq2b7x10000abcd1234"
},
"version": "…",
"currentVersion": "…",
"words": "…"
},
"error": null,
"requestId": "req_4f1c2e9a7b3d5e6f7a8b9c0d"
}/v1/compliance/ai-labelConfirm or withdraw the AI label attestation
The owner in attestedBy confirms today's words (attested: true with confirm: true) or withdraws the confirmation (attested: false). It applies from the next session: with it, aiLabel: { show: false } hides the SDK's label; without it, the SDKs draw their label again. Recorded in the organization's activity log in the owner's name.
Body
attestedbooleanrequiredtrue confirms the words; false withdraws the confirmation (the SDKs draw their label again from the next session).
confirmbooleanRequired (true) to confirm: the owner has read today's words (
words) and confirms them.attestedBystringrequiredThe owner who confirms or withdraws it (
usr_…).
Returns
200 The answer now. data is AiLabelAttestation.
Fields of data
attestedbooleanrequiredAn owner has confirmed that your own app shows its own AI label: from the next session, the SDKs may hide theirs.
attestedAtstring (date-time) | nullrequiredWhen the current answer was given.
attestedByobject | nullrequiredThe owner who gave it.
idstringrequiredPerson id (
usr_…).pattern `^usr_.*`
versionstring | nullrequiredThe version of the words they confirmed.
currentVersionstringrequiredThe version of today's words.
wordsstringrequiredWhat an owner confirms, word for word.
Errors
invalid_requestunauthorizedforbiddenupgrade_requiredrate_limitedserver_error
Request
curl -X PUT "https://app.zentiqai.com/v1/compliance/ai-label" \
-H "Authorization: Bearer $ZENTIQ_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"attested": true,
"attestedBy": "usr_123"
}'import { Zentiq } from "@zentiq/node";
const zentiq = new Zentiq({ apiKey: process.env.ZENTIQ_API_KEY });
const result = await zentiq.setAiLabelAttestation({
attested: true,
attestedBy: "usr_123",
});import os
from zentiq import Zentiq
zentiq = Zentiq(api_key=os.environ["ZENTIQ_API_KEY"])
result = zentiq.set_ai_label_attestation({
"attested": True,
"attestedBy": "usr_123",
})Response
{
"data": {
"attested": true,
"attestedAt": "2026-09-25T12:00:00.000Z",
"attestedBy": {
"id": "usr_cmfq2b7x10000abcd1234"
},
"version": "…",
"currentVersion": "…",
"words": "…"
},
"error": null,
"requestId": "req_4f1c2e9a7b3d5e6f7a8b9c0d"
}/v1/consents/{id}Get a consent record
One consent record, as its printable receipt shows it.
Path parameters
idstringrequiredConsent record id (
cns_…); the id without its prefix is accepted too.
Returns
200 The consent record. data is ConsentRecord.
Fields of data
idstringrequiredConsent record id (
cns_…).pattern `^cns_.*`
referencestringrequiredThe short reference printed on the receipt.
kindstringrequiredvoice_clone, likeness, character_rights or trademark.
kindLabelstringrequiredsubjectKindstringrequiredself (the person who confirmed it), other (someone else, named) or generated (no real person).
subjectstringrequiredWhose face, voice, character or logo it is, in words.
attestedByobjectrequiredWho confirmed the consent.
kind"member" | "api_key" | "unknown"requiredidstring | nullrequiredThe member (
usr_…) or the API key (key_…) that confirmed it.namestringrequiredrolestringrequiredTheir role when they confirmed it.
textVersionstringrequiredThe version of the words confirmed.
textstringrequiredThe exact words confirmed, with the name filled in.
sourcestringrequiredWhere it was confirmed (
api.avatars,dashboard.voice_clone, …).sourceLabelstringrequiredassetType"voice" | "avatar" | "look"requiredWhat it made: a cloned voice, a face, or a branded look.
assetsobject[]requiredThe voices, faces or looks made with it;
active: falseonce retired.idstringrequiredvo_…for a voice,av_…for a face, the look's own id for a look.namestring | nullrequiredactiveboolean | nullrequired
personaIdstring | nullrequiredstatus"active" | "revoked"requiredcreatedAtstring (date-time)requiredISO 8601 UTC timestamp.
revokedAtstring (date-time) | nullrequiredrevokedBystring | nullrequiredThe name of the member who recorded the withdrawal.
revokeReasonstring | nullrequired
Errors
invalid_requestunauthorizedforbiddenupgrade_requirednot_foundrate_limitedserver_error
Request
curl "https://app.zentiqai.com/v1/consents/cns_123" \
-H "Authorization: Bearer $ZENTIQ_API_KEY"import { Zentiq } from "@zentiq/node";
const zentiq = new Zentiq({ apiKey: process.env.ZENTIQ_API_KEY });
const result = await zentiq.getConsent("cns_123");import os
from zentiq import Zentiq
zentiq = Zentiq(api_key=os.environ["ZENTIQ_API_KEY"])
result = zentiq.get_consent("cns_123")Response
{
"data": {
"id": "cns_cmfq2b7x10000abcd1234",
"reference": "CR-4F2A9C1B",
"kind": "likeness",
"kindLabel": "…",
"subjectKind": "self",
"subject": "…"
},
"error": null,
"requestId": "req_4f1c2e9a7b3d5e6f7a8b9c0d"
}/v1/consentsList consent records
The consent register, newest first: every face, voice, character and logo consent recorded when a voice was cloned or an avatar made from a picture, with who confirmed it and in what role, the exact words and their version, the assets made with it and whether it was withdrawn. Paging through it is the console's export.
Query parameters
limitintegerPage size, 1-200 (default 50).
cursorstringThe
nextCursorof the previous page.status"active" | "revoked"assetType"voice" | "avatar" | "look"
Returns
200 A page of consent records. A page: data is a list of ConsentRecord, and nextCursor fetches the next page.
Fields of data
idstringrequiredConsent record id (
cns_…).pattern `^cns_.*`
referencestringrequiredThe short reference printed on the receipt.
kindstringrequiredvoice_clone, likeness, character_rights or trademark.
kindLabelstringrequiredsubjectKindstringrequiredself (the person who confirmed it), other (someone else, named) or generated (no real person).
subjectstringrequiredWhose face, voice, character or logo it is, in words.
attestedByobjectrequiredWho confirmed the consent.
kind"member" | "api_key" | "unknown"requiredidstring | nullrequiredThe member (
usr_…) or the API key (key_…) that confirmed it.namestringrequiredrolestringrequiredTheir role when they confirmed it.
textVersionstringrequiredThe version of the words confirmed.
textstringrequiredThe exact words confirmed, with the name filled in.
sourcestringrequiredWhere it was confirmed (
api.avatars,dashboard.voice_clone, …).sourceLabelstringrequiredassetType"voice" | "avatar" | "look"requiredWhat it made: a cloned voice, a face, or a branded look.
assetsobject[]requiredThe voices, faces or looks made with it;
active: falseonce retired.idstringrequiredvo_…for a voice,av_…for a face, the look's own id for a look.namestring | nullrequiredactiveboolean | nullrequired
personaIdstring | nullrequiredstatus"active" | "revoked"requiredcreatedAtstring (date-time)requiredISO 8601 UTC timestamp.
revokedAtstring (date-time) | nullrequiredrevokedBystring | nullrequiredThe name of the member who recorded the withdrawal.
revokeReasonstring | nullrequired
Errors
invalid_requestunauthorizedforbiddenupgrade_requiredrate_limitedserver_error
Request
curl "https://app.zentiqai.com/v1/consents?limit=20" \
-H "Authorization: Bearer $ZENTIQ_API_KEY"import { Zentiq } from "@zentiq/node";
const zentiq = new Zentiq({ apiKey: process.env.ZENTIQ_API_KEY });
const page = await zentiq.listConsents({
limit: 20,
});import os
from zentiq import Zentiq
zentiq = Zentiq(api_key=os.environ["ZENTIQ_API_KEY"])
page = zentiq.list_consents(limit=20)Response
{
"data": [
{
"id": "cns_cmfq2b7x10000abcd1234",
"reference": "CR-4F2A9C1B",
"kind": "likeness",
"kindLabel": "…",
"subjectKind": "self",
"subject": "…"
}
],
"error": null,
"requestId": "req_4f1c2e9a7b3d5e6f7a8b9c0d",
"nextCursor": null
}/v1/consents/{id}/revokeWithdraw a consent
Records that the person withdrew their consent, in the name of the owner in revokedBy. The record is marked withdrawn (who, when, why) and its face, voice or look is retired: it leaves the pickers, and no persona wearing it can start a new session (409 consent_withdrawn). Nothing is deleted; past sessions keep their history. Withdrawing twice changes nothing.
Path parameters
idstringrequiredConsent record id (
cns_…); the id without its prefix is accepted too.
Body
revokedBystringrequiredThe owner who records the withdrawal (
usr_…): consent records are for the organization's owners.reasonstringWhy, for the register.
at most 500 characters
Returns
200 The consent record, withdrawn. data is ConsentWithdrawal.
Fields of data
A face, voice, character or logo consent, as the consent register in the console shows it.
alreadyWithdrawnbooleanrequiredIt was withdrawn before: nothing changed.
assetsRetiredintegerrequiredVoices, faces or looks taken out of use by this withdrawal.
Errors
invalid_requestunauthorizedforbiddenupgrade_requirednot_foundidempotency_conflictidempotency_in_progressrate_limitedserver_error
Request
curl -X POST "https://app.zentiqai.com/v1/consents/cns_123/revoke" \
-H "Authorization: Bearer $ZENTIQ_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"revokedBy": "usr_123"
}'import { Zentiq } from "@zentiq/node";
const zentiq = new Zentiq({ apiKey: process.env.ZENTIQ_API_KEY });
const result = await zentiq.revokeConsent("cns_123", {
revokedBy: "usr_123",
});import os
from zentiq import Zentiq
zentiq = Zentiq(api_key=os.environ["ZENTIQ_API_KEY"])
result = zentiq.revoke_consent("cns_123", {
"revokedBy": "usr_123",
})Response
{
"data": {
"consent": {
"id": "cns_cmfq2b7x10000abcd1234",
"reference": "CR-4F2A9C1B",
"kind": "likeness",
"kindLabel": "…",
"subjectKind": "self",
"subject": "…"
},
"alreadyWithdrawn": true,
"assetsRetired": 1
},
"error": null,
"requestId": "req_4f1c2e9a7b3d5e6f7a8b9c0d"
}