Skip to the content
Menu: Keys and scopes

Keys and scopes

Every request carries an organisation API key as a Bearer token:

HTTP
Authorization: Bearer zq_live_…

A key belongs to one organisation and reaches only that organisation's data: an id from another organisation is 404 not_found. A key acts as an admin of its organisation, limited by its scopes; it is never an owner (see The organisation).

Make a key#

In the Zentiq console, open More → API Keys and choose Create a key:

  1. Name it after where it will live ("Website", "CRM sync"), so you can tell your keys apart later.
  2. What can it do? Pick a preset below, or Choose scopes to tick them one by one.
  3. Create key, then copy it. It is shown once: Zentiq keeps only a fingerprint of it.

The developer API is part of every plan. When an organisation's plan doesn't include it, every call answers 403 upgrade_required with feature: "api.access".

A full-access key can also make keys with the API (POST /v1/keys), never with a scope it doesn't hold itself. The new key's secret is in that answer's key, once.

Presets#

PresetForScopes
Read onlyReads the organisation's setup, sessions (numbers), results and usage. Changes nothing; no contacts, no conversation words.avatars:readvoices:readpersonas:readduos:readwidgets:readknowledge:readportals:readcontent:readsessions:readresults:readassignments:readsettings:readevents:readusage:read
Website assistantBuilds a persona with knowledge, puts it on your website and follows up its leads, bookings and hand-offs.avatars:readavatars:writevoices:readvoices:writepersonas:readpersonas:writeknowledge:readknowledge:writewidgets:readwidgets:writeportals:readportals:publishinbox:readinbox:writewebhooks:manageevents:read
CRMReceives website leads, bookings and hand-offs, with contact details, and updates their status.inbox:readinbox:writeevents:readwebhooks:manage
Hiring integrationSets up screening roles, invites candidates from your ATS and records the hiring team's decisions.portals:readportals:writeportals:publishcontent:readcontent:writecandidates:readcandidates:writewebhooks:manageevents:read
Chat escalationHands conversations from your text chat (Intercom, Zendesk or your own) to the video avatar, and nothing else.escalations:write
People syncKeeps units, members and learners in step with your HR or school system.people:readpeople:write
Learning platformBuilds and publishes training portals, embeds them for your signed-in users, syncs people and reads results.portals:readportals:writeportals:publishcontent:readcontent:writeembed:writepeople:readpeople:writesessions:readresults:readassignments:readassignments:writewebhooks:manageevents:read
Full accessEverything a key can do, except the sensitive scopes you add yourself (a candidate's data copy, interview content, case links, consent records).* (full access)

Scopes#

A key holds the scopes it lists. Every operation in the reference names the scopes it needs, and a key without one of them gets 403 forbidden with a message naming it.

ScopeGrantsNotes
avatars:readRead faces: the library, uploads and designs.None
avatars:writeUpload, design and delete faces.None
voices:readRead voices.None
voices:writeClone and delete voices.None
personas:readRead personas (the avatars people talk to).None
personas:writeCreate, change and delete personas.None
duos:readRead the duo library and the organisation's duos.

Keys made before 2026-10-01 hold it through personas:read.

duos:writeAdd duos from the library and publish them.

Keys made before 2026-10-01 hold it through personas:write.

widgets:readRead a persona's website widget.

Keys made before 2026-10-01 hold it through personas:read.

widgets:writeSet up a persona's website widget (switching it on also needs portals:publish).

Keys made before 2026-10-01 hold it through personas:write.

knowledge:readRead knowledge packs and their documents, and search them.None
knowledge:writeCreate and delete knowledge packs and documents.None
portals:readRead portals, subjects (their structure), doors and domains.None
portals:writeCreate and change portals, subjects, doors and domains.None
content:readRead subject content and its versions.

Keys made before 2026-10-01 hold it through portals:read.

content:writeEdit subject content (drafts) and subject documents.

Keys made before 2026-10-01 hold it through portals:write.

portals:publishPublish portals and subject versions, open doors to visitors, switch a widget on.

Keys made before 2026-10-01 hold it through portals:write.

embed:writeIssue embed tokens for signed-in users of your own app.

Keys made before 2026-10-01 hold it through portals:write.

customers:tokensMint identity tokens for your website's signed-in customers (Actions), and nothing else.None
escalations:writeHand a text chat conversation to the video avatar (escalation links), and nothing else.None
connections:writeConnect, test, list and disconnect your own systems (a calendar, a CRM, a shop, an MCP server) for Actions. Keys are write-only.None
sessions:readRead live sessions and their analytics (numbers).None
sessions:writeStart, steer, speak into and end sessions.None
transcripts:readRead conversation words (transcripts, summaries) where the privacy rules allow.

Keys made before 2026-10-01 hold it through sessions:read.

results:readRead released results, reports (numbers), certificates and completion records.None
results:writeReview, void and grant results; revoke certificates (a named person decides).None
assignments:readRead assigned work.None
assignments:writeAssign work.None
candidates:readRead roles, invites and candidates.

Keys made before 2026-10-01 get it only by name.

candidates:writeInvite candidates and record decisions (a named person decides).

Keys made before 2026-10-01 get it only by name.

candidates:dataA candidate's data copy and erasure.

Never part of full access: add it by name.

candidates:interviewsRead candidates' interviews: answers, transcript, the written summary and the marks.

Never part of full access: add it by name.

Only an owner or admin can put it on a key, in the console: never a key, never a connected app. Every read is logged.

cases:writeSend customers case links (a conversation that already knows their case), list them and revoke them.

Never part of full access: add it by name.

Only an owner or admin can put it on a key, in the console: never a key, never a connected app. Every read is logged.

inbox:readRead leads, bookings and hand-offs (with contact details) and knowledge gaps.

Keys made before 2026-10-01 get it only by name.

inbox:writeChange the status of leads, bookings and hand-offs.

Keys made before 2026-10-01 get it only by name.

people:readRead units, members, learners and guardian links.

Keys made before 2026-10-01 get it only by name.

people:writeAdd and change units, learners, leaders and observers; record guardian consent. Admin-level places need a full-access key.

Keys made before 2026-10-01 get it only by name.

consents:readRead face and voice consent records.

Never part of full access: add it by name.

Only an owner can put it on a key.

consents:writeWithdraw face and voice consent.

Never part of full access: add it by name.

Only an owner can put it on a key.

settings:readRead switches.None
settings:writeChange switches.None
events:readRead the event log.

Keys made before 2026-10-01 hold it through webhooks:manage.

webhooks:manageManage webhooks and read their deliveries.None
usage:readRead minutes and usage.None

Full access#

A key whose scopes are ["*"] (or empty) has full access: every scope except the sensitive ones you add by name, ["*", "candidates:data"] for example. Only a full-access key can manage keys.

Interview content#

candidates:interviews reads candidates' interviews for your hiring system (see Interviews in your hiring system). Only an owner or admin gives it, in the console: tick Interview content (hiring) when making the key. A key can never give it to another key (403), full access never includes it, and an app or assistant connected to Zentiq never holds it. Every read is logged on the candidate.

cases:write sends customers case links from your CRM or helpdesk, lists them and revokes them (see Case links from your CRM or helpdesk). Only an owner or admin gives it, in the console: choose scopes and tick it when making the key. A key can never give it to another key (403), full access never includes it, and an app or assistant connected to Zentiq never holds it: a case link lets whoever holds it talk to your avatar as that customer.

Keys made before 2026-10-01#

A key made before the 2026-10-01 contract keeps exactly what it could do then:

  • where a scope was split out (transcripts:read from sessions:read, embed:write and portals:publish from portals:write, and the others in the Notes column above), the key holds it through the scope it already had;
  • a full-access key does not reach candidates:*, people:*, inbox:* or consents:* until an owner adds them to it by name: data it could never reach doesn't become reachable by itself.

GET /v1/me shows what any key may do, after all of this: apiKey.effectiveScopes, apiKey.fullAccess and apiKey.apiVersion (its contract).

Keep keys safe#

  • On your server only. Never put a key in a web page, a mobile app or a repository. Browsers join live sessions with a session token and embedded portals with an embed token; your server makes both.
  • One key per integration, with only the scopes it needs, so you can revoke one without stopping the others.
  • To replace a key (it may have leaked, or someone left): make a new one, switch your server to it, then revoke the old one in the console or with DELETE /v1/keys/{id}. Revoking works at once.
  • Watch it: GET /v1/keys lists every key with when it was last used, never its secret.