Skip to the content
Menu: Schemas

Schemas

Every object the API takes and answers with. New fields can appear at any time: ignore the ones you don't know.

AddMembershipInput

  • role"OWNER" | "ADMIN" | "AVATAR_BUILDER" | "WORKSPACE_ADMIN" | "LEADER" | "LEARNER" | "OBSERVER"required

    OWNER (never given or changed through the API), ADMIN, AVATAR_BUILDER, WORKSPACE_ADMIN (these four at the organisation level only), LEADER, LEARNER, OBSERVER.

  • unitIdstring | null
  • workspaceIdstring | null
  • gradeBandstring | null
  • ageBand"18+" | null

AgentAnswer

One written answer from a business's public website assistant.

  • answerstringrequired

    The assistant's written answer, from what the business has told it. Email addresses, phone numbers and payment or identity numbers are removed.

  • urlstringrequired

    The assistant's own page, where a person can talk to it, book or reach the team.

  • aiGeneratedtruerequired

    Always true: the answer is AI-generated (EU AI Act Article 50(2)). Say so when you pass it on.

AgentAskInput

  • questionstringrequired

    One question, up to 800 characters. Leave out people's names and contact details: email addresses, phone numbers and payment or identity numbers are removed before it is read.

    1-800 characters

ApiKey

An API key. The secret is never returned after creation.

  • idstringrequired

    API key id (key_…).

    pattern `^key_.*`

  • namestringrequired
  • prefixstringrequired

    The key's first characters, as shown in the console.

  • scopesstring[]required

    The scopes as set on the key; [] or ["*"] is full access (sensitive scopes are added by name).

  • apiVersion"2026-07-08" | "2026-10-01"required

    The contract the key speaks.

  • createdBystring | nullrequired

    Who made it: a member (usr_…) or a key (key_…); null for older keys.

  • lastUsedAtstring (date-time) | nullrequired
  • revokedAtstring (date-time) | nullrequired
  • createdAtstring (date-time)required

    ISO 8601 UTC timestamp.

AssessmentCompletedData

A scored attempt completed; the final result once a person has decided it.

  • eventIdstring | null
  • organizationIdstring | null
  • workspaceIdstring | null
  • unitIdstring | null
  • userIdstring | null
  • sessionIdstring | null
  • blueprintVersioninteger | null
  • workspaceNamestring | null
  • passedboolean | null
  • percentnumber | null
  • marksnumber | null
  • outOfnumber | null
  • passMarknumber | null
  • questionSetobject | null
    • idstring | null
    • titlestring | null
  • humanReviewboolean | null
  • reviewboolean | null
  • criticalFailboolean | null
  • difficultystring | null
  • finalboolean | null
  • aiobject | null
    • passedboolean | null
    • percentnumber | null
    • marksnumber | null
  • decisionstring | null
  • voidedboolean | null
  • reviewedboolean | null

AssignmentCompletedData

A person completed assigned work.

  • eventIdstring | null
  • organizationIdstring | null
  • workspaceIdstring | null
  • unitIdstring | null
  • userIdstring | null
  • sessionIdstring | null
  • blueprintVersioninteger | null
  • assignmentIdstring | null
  • titlestring | null
  • minutesnumber | null
  • passboolean | null

AssignmentCreatedData

Work was assigned.

  • eventIdstring | null
  • organizationIdstring | null
  • workspaceIdstring | null
  • unitIdstring | null
  • userIdstring | null
  • sessionIdstring | null
  • blueprintVersioninteger | null
  • assignmentIdstring | null
  • titlestring | null
  • learnersinteger | null
  • dueAtstring | null
  • minutesnumber | null
  • skillsstring[] | null
  • focusobject | null
    • kindstring | null
    • idstring | null
    • titlestring | null
  • difficultystring | null
  • targetnumber | null

AssignmentStartedData

A person started assigned work.

  • eventIdstring | null
  • organizationIdstring | null
  • workspaceIdstring | null
  • unitIdstring | null
  • userIdstring | null
  • sessionIdstring | null
  • blueprintVersioninteger | null
  • assignmentIdstring | null

AttemptGrantedData

A person was given one more scored attempt.

  • eventIdstring | null
  • organizationIdstring | null
  • workspaceIdstring | null
  • unitIdstring | null
  • userIdstring | null
  • sessionIdstring | null
  • blueprintVersioninteger | null
  • workspaceNamestring | null
  • reportIdstring | null
  • incompleteboolean | null

AttestationRecordedData

A person confirmed an attestation before a completion.

  • eventIdstring | null
  • organizationIdstring | null
  • workspaceIdstring | null
  • unitIdstring | null
  • userIdstring | null
  • sessionIdstring | null
  • blueprintVersioninteger | null
  • workspaceNamestring | null
  • questionSetobject | null
    • idstring | null
    • titlestring | null
  • versioninteger | null
  • documentIdsstring[] | null

Avatar

A face a persona can wear: from the library, or your organisation's own.

  • idstringrequired

    Avatar id (av_…).

    pattern `^av_.*`

  • namestringrequired
  • kind"builtin" | "custom"required

    builtin: Zentiq's library; custom: your organisation's own.

  • genderstring | nullrequired

    A library face's gender (female, male); null for your own pictures.

  • ageBandstring | nullrequired

    A library face's age band (20s, 30s, 40s, 50s, 60s); null for your own.

  • heritagestring | nullrequired

    A library face's heritage (white, black, indian, chinese, korean, japanese, thai, hispanic, middleeastern, mixed); null for your own.

  • previewUrlstring | nullrequired

    The picture. A library face is public (usable in an <img>); your own needs your API key (or a console sign-in).

  • createdAtstring (date-time)required

    ISO 8601 UTC timestamp.

  • aiGeneratedtruerequired

    Always true: this avatar's video and voice in every session are AI-generated, and so is its picture unless it is a photo you uploaded (EU AI Act Article 50(2)).

AvatarInput

Exactly one of imageBase64 or imageUrl, and consent: whose face it is and that they agreed, or subject "generated" for a face made by AI.

  • namestring

    Default "Custom avatar".

  • imageBase64string

    The picture as a data:image/… URI (PNG, JPEG or WebP).

  • imageUrlstring (uri)

    Or a public https address to fetch it from (6 MB at most).

  • consentConsentrequired

    Consent to clone a real person's voice or to make an avatar from their picture. Recorded with who confirmed it (the API key), when, a hashed IP address, the exact wording and its version. The organisation's owners can export records and withdraw them; a withdrawn voice or face stops starting new sessions.

BookingRequestedData

A website visitor asked for a booking: contact details, the service and time asked for, and their consent.

  • eventIdstring | null
  • organizationIdstring | null
  • workspaceIdstring | null
  • unitIdstring | null
  • userIdstring | null
  • sessionIdstring | null
  • blueprintVersioninteger | null
  • workspaceNamestring | null
  • referencestring | null
  • summarystring | null
  • needstring | null
  • budgetstring | null
  • timelinestring | null
  • contactobject | null
    • namestring | null
    • emailstring | null
    • phonestring | null
    • companystring | null
    • rolestring | null
    • preferredTimestring | null
    • locationstring | null
    • referencestring | null
  • consentobject | null
    • purposestring | null
    • marketingboolean | null
    • textstring | null
    • versioninteger | null
    • atstring | null
    • givenboolean | null
  • promisestring | null
  • dueAtstring | null
  • departmentstring | null
  • verifiedboolean | null
  • portalIdstring | null
  • servicestring | null
  • whenstring | null
  • statusstring | null
  • inboxItemIdstring | null

Candidate

A candidate: someone who took a role's interview. A person decides every outcome: scores and bands are a sorting aid for the hiring team, never a verdict, and no decision is made automatically.

  • idstringrequired

    cand_…: the candidate's interview.

    pattern `^cand_.*`

  • sessionIdstringrequired

    Session id (sess_…).

    pattern `^sess_.*`

  • roleIdstringrequired

    Subject id (sub_…).

  • portalIdstring | nullrequired
  • inviteIdstring | nullrequired
  • externalIdstring | nullrequired

    Your ATS's id from the invite.

  • namestring | nullrequired

    Null once erased.

  • emailstring | nullrequired
  • phonestring | nullrequired
  • interviewedAtstring (date-time)required

    ISO 8601 UTC timestamp.

  • minutesnumber | nullrequired
  • typedbooleanrequired

    They typed instead of speaking.

  • roundinteger | nullrequired
  • withdrawnbooleanrequired

    They chose to end the interview: never scored.

  • erasedbooleanrequired
  • erasedAtstring (date-time) | nullrequired
  • mustHaves"met" | "missed" | "unclear" | "none" | nullrequired

    The must-have requirements: all met, one missed, unclear (a person checks), or none set. Flagged for a person, never acted on. Null once erased.

  • requirementsobject[]required

    Each requirement's result; never the answer. Empty once erased.

    • idstringrequired
    • metboolean | nullrequired
    • knockoutbooleanrequired
  • scorenumber | nullrequired

    Only where the role shares scores, and never once erased; else null.

  • band"strong" | "possible" | "below" | "unscored" | nullrequired

    Only where the role shares scores, and never once erased; else null.

  • rankinteger | nullrequired

    Place by score among the role's candidates in the same round (1 = highest; erased and withdrawn candidates hold no place); only where the role shares scores.

  • decisionobject | nullrequired

    The latest decision a person made; null while it awaits one.

    • value"invite" | "hold" | "decline"required

      decline is shown to people as "not progressing".

    • reason"must_haves" | "strong_answers" | "missing_must_have" | "stronger_candidate" | "more_evidence" | "withdrew" | "other" | nullrequired

      The reason code from the fixed list (a note is never given out).

    • decidedAtstring (date-time)required

      ISO 8601 UTC timestamp.

    • decidedByobject | nullrequired

      The member who decided (never an API key).

      • idstringrequired

        Person id (usr_…).

        pattern `^usr_.*`

  • reviewsobjectrequired
    • countintegerrequired
    • requiredintegerrequired
    • recommendationsobject | nullrequired

      How many reviewers recommend advance, hold or do not advance. Only where the role shares scores (candidates.share_scores), and never once erased; else null.

      • advanceintegerrequired
      • holdintegerrequired
      • doNotAdvanceintegerrequired
  • holdbooleanrequired

    A legal hold keeps their data past the role's retention.

  • reviewRequestedbooleanrequired

    They asked for a review of the decision and no decision was recorded since.

  • retentionExpiresAtstring (date-time) | nullrequired

    When their data is erased (null while held or once erased).

  • updatedAtstring (date-time)required

    ISO 8601 UTC timestamp.

CandidateCompliance

A candidate's US hiring record: the notices they read, their consent and their requests.

  • candidateIdstringrequired

    Candidate id (cand_…).

    pattern `^cand_.*`

  • roleIdstringrequired

    Subject id (sub_…).

  • laws("illinois" | "nyc" | "colorado")[]required

    The US hiring rules the pack applies to the role now: illinois, nyc, colorado.

  • consentobject | nullrequired

    What the candidate read and agreed to at the start; null for an interview started before the pack was on for the role.

    • atstring (date-time) | nullrequired

      When the candidate agreed to take part and started.

    • shownAtstring (date-time) | nullrequired

      When the page with the notices was made for them.

    • noticesobject[]required
      • kind"aivia" | "nyc" | "colorado"required
      • versionstringrequired
      • fingerprintstringrequired

        SHA-256 of the notice's exact text as shown.

    • illinoisConsentbooleanrequired

      They gave the separate consent to the AI analysing their interview (Illinois).

  • nycNoticeobject | nullrequired

    New York City: how the notice reached the candidate at least 10 business days before the interview.

    • via"posting" | "invite_email" | "invite_link" | "door_email"required

      posting (the date your job posting gave it), invite_email, invite_link or door_email.

    • noticeAtstring (date-time) | nullrequired
    • postedOnstring (date) | nullrequired
  • requestsCandidateRequest[]required

CandidateDecisionInput

A person's decision on one candidate. A person decides every outcome: scores and bands are a sorting aid for the hiring team, never a verdict, and no decision is made automatically.

  • decision"invite" | "hold" | "decline"required
  • reason"must_haves" | "strong_answers" | "missing_must_have" | "stronger_candidate" | "more_evidence" | "withdrew" | "other"required

    must_haves, strong_answers, missing_must_have, stronger_candidate, more_evidence, withdrew or other (other needs a note).

  • notestring

    Kept for the hiring team; never given out through the API or webhooks.

    at most 600 characters

  • decidedBystringrequired

    The member who made the decision (usr_…). Their own hiring access applies, and a decline needs them to have opened the interview or reviewed it in Zentiq.

  • sendOutcomeEmailboolean

    Email the candidate the outcome, with their link to ask for a review.

CandidateInterview

A candidate's interview for your hiring system: every read is logged on the candidate. A person decides every outcome: scores and bands are a sorting aid for the hiring team, never a verdict, and no decision is made automatically.

  • idstringrequired

    Candidate id (cand_…).

    pattern `^cand_.*`

  • sessionIdstringrequired

    Session id (sess_…).

    pattern `^sess_.*`

  • roleIdstringrequired

    Subject id (sub_…).

  • portalIdstring | nullrequired
  • inviteIdstring | nullrequired
  • externalIdstring | nullrequired

    Your ATS's id from the invite.

  • namestring | nullrequired
  • emailstring | nullrequired
  • phonestring | nullrequired
  • locationstring | nullrequired
  • titlestringrequired

    The job, as the interview named it.

  • roundinteger | nullrequired
  • versioninteger | nullrequired

    The version of the role the interview ran on.

  • level"relaxed" | "standard" | "rigorous" | nullrequired

    How demanding the interview was set to be (the same for every candidate of the role).

  • panelbooleanrequired

    Two AI interviewers took turns.

  • typedbooleanrequired

    They typed instead of speaking.

  • practiceQuestionbooleanrequired

    It opened with an unscored practice question. Its answer is never kept, never in the transcript and never marked.

  • startedAtstring (date-time) | nullrequired
  • endedAtstring (date-time) | nullrequired
  • interviewedAtstring (date-time)required

    When it ended and reached the hiring team.

  • minutesnumber | nullrequired
  • scoresSharedbooleanrequired

    The role shares scores (candidates.share_scores): the numbers below are filled in.

  • scorenumber | nullrequired
  • band"strong" | "possible" | "below" | "unscored" | nullrequired
  • rankinteger | nullrequired

    Place by score among the role's candidates in the same round (1 = highest).

  • mustHaves"met" | "missed" | "unclear" | "none"required
  • requirementsobject[]required

    The must-have questions, with their answers.

    • idstringrequired
    • questionstringrequired
    • answerstring | nullrequired

      Their answer in a few words, as the interview heard it; null when it was never answered.

    • metboolean | nullrequired

      Whether it meets the requirement (decided in code); null when unclear: a person checks it.

    • knockoutbooleanrequired

      A must-have: not meeting it is flagged to the hiring team, never acted on.

    • whystring | nullrequired

      Why the role needs it, as the role says.

  • questionsobject[]required

    The interview questions, in order, with the answers and what the platform found in them.

    • idstring | nullrequired

      The question's id in the role's question set.

    • nintegerrequired

      Its number in the interview ("Question 2 of 5").

      at least 1

    • questionstringrequired
    • answerstring | nullrequired

      What they said after the interviewer read the question, up to the next one, from the transcript; null when it can't be told or nothing is kept.

    • status"answered" | "skipped" | "asked"required
    • verdict"right" | "partial" | "not-yet" | nullrequired

      How the answer compares with what the role looks for. Only where the role shares scores.

    • marksnumber | nullrequired

      Marks given. Only where the role shares scores.

    • outOfnumber | nullrequired

      The marks the question carries.

    • notestring | nullrequired

      A short note on the answer, as the report wrote it.

    • redFlagboolean | nullrequired

      The answer showed one of the question's red flags (for a person to check). Only where the role shares scores.

    • hintsintegerrequired

      Hints the interviewer gave on it.

  • summarystring | nullrequired

    The written summary for the hiring team.

  • strengthsstring[]required
  • concernsstring[]required

    Where the evidence was thin.

  • competenciesobject[]required

    The role's competencies with their score (0-100) where there was evidence and the role shares scores.

    • idstringrequired
    • labelstringrequired
    • weightnumberrequired
    • scorenumber | nullrequired
  • evidenceobject[]required

    What the report quotes from the interview, by competency.

    • competencyIdstringrequired
    • quotestring | nullrequired

      Their own words.

    • notestring | nullrequired
  • transcriptobjectrequired
    • keptbooleanrequired

      false when the role keeps no transcripts (then turns is empty).

    • turnsobject[]required
      • speaker"ai" | "candidate"required

        ai: Zentiq's AI interviewer; candidate: the person.

      • namestring | nullrequired

        Which AI interviewer spoke, when two took turns; else null.

      • textstringrequired
      • offsetMsinteger | nullrequired

        Milliseconds from the start of the interview, when known.

  • adjustmentsobjectrequired

    Whether they asked for an adjustment during the interview: make sure it was given. Never which one, nor why (it can reveal a disability): that stays with the hiring team in Zentiq.

    • requestedbooleanrequired
  • reviewRequestobject | nullrequired

    They asked for a review of the decision (from the link in an outcome email); open until a person decides again.

    • requestedAtstring (date-time)required

      ISO 8601 UTC timestamp.

    • messagestring | nullrequired
    • openbooleanrequired
  • reviewsobjectrequired
    • countintegerrequired
    • requiredintegerrequired

      Reviews a decision waits for (candidates.reviews_required).

    • blindbooleanrequired

      Blind review (candidates.blind_review): each reviewer sees the others' reviews only after adding their own.

    • hiddenBy"blind_review" | "scores_not_shared" | nullrequired

      Why items is null: the role's blind review, or its scores aren't shared.

    • itemsobject[] | nullrequired

      Each reviewer's recommendation and ratings, never their notes. Null while hidden.

  • integrityobjectrequired

    Moments a recorded interview noted for a person to watch (how many, of which kinds), never part of the score. Their details stay in Zentiq.

    • countintegerrequired
    • kindsobject[]required
      • kind"face_out_of_view" | "another_person" | "left_page" | "pasted_text" | "camera_off" | "microphone_off" | "connection_dropped"required
      • countintegerrequired
  • flagsobjectrequired

    Things the report asks a person to look at; their words stay in Zentiq.

    • countintegerrequired
  • recorded"audio" | "audio_video" | nullrequired

    A recording exists (watch it in Zentiq); it is never given out.

  • decisionobject | nullrequired

    The latest decision a person made; null while it awaits one.

    • value"invite" | "hold" | "decline"required

      decline is shown to people as "not progressing".

    • reason"must_haves" | "strong_answers" | "missing_must_have" | "stronger_candidate" | "more_evidence" | "withdrew" | "other" | nullrequired

      The reason code from the fixed list (a note is never given out).

    • decidedAtstring (date-time)required

      ISO 8601 UTC timestamp.

    • decidedByobject | nullrequired

      The member who decided (never an API key).

      • idstringrequired

        Person id (usr_…).

        pattern `^usr_.*`

  • updatedAtstring (date-time)required

    ISO 8601 UTC timestamp.

CandidateRequest

A candidate's request under the US hiring pack. Their message and contact details stay in Zentiq.

  • idstringrequired

    Candidate request id (creq_…).

    pattern `^creq_.*`

  • kind"deletion" | "alternative" | "review" | "correction"required

    deletion (their interview, any recording and every copy), alternative (another way to be assessed, or an accommodation), review (a person to review a decision) or correction (their data corrected).

  • status"open" | "paused" | "done"required

    open; paused while a legal hold keeps the interview (the candidate was told); done once answered, or (a deletion) once the interview was erased.

  • roleIdstringrequired

    Subject id (sub_…).

  • candidateIdstring | nullrequired

    The candidate whose interview it is about; null before an interview (an invitation) or from the door.

  • inviteIdstring | nullrequired
  • source"link" | "interview" | "door" | "outcome_email"required

    link: the candidate's own page; door: the interview's page; outcome_email: the review link in an outcome email.

  • requestedAtstring (date-time)required

    ISO 8601 UTC timestamp.

  • dueAtstring (date-time)required

    When the hiring team is asked to have answered: 30 days for a deletion, a review or a correction, 14 for another way.

  • autoDeleteAtstring (date-time) | nullrequired

    A deletion the role carries out automatically: when (day 30), unless a person acts first or a legal hold is on.

  • overduebooleanrequired
  • outcomestring (one of 10) | nullrequired

    What happened, once done: deleted, deleted_automatically, alternative_offered, accommodation_given, not_possible, withdrawn_by_candidate, decision_stands, decision_changed, data_corrected or nothing_to_correct.

  • resolvedAtstring (date-time) | nullrequired

CandidateWebhookData

A candidate event's data: ids, the role, the portal, a status and timestamps only. Never a name, an email, answers, notes, ratings or scores.

  • eventIdstring | nullrequired
  • statusstring | nullrequired
  • candidateIdstring | nullrequired
  • sessionIdstring | nullrequired
  • inviteIdstring | null
  • roleIdstring | nullrequired
  • rolestring | null
  • portalIdstring | null
  • decisionstring | null
  • recommendationstring | null
  • reasonstring | null
  • by"team" | "candidate" | null
  • reviewerIdstring | null
  • offerIdstring | null
  • slotIdstring | null
  • timingstring | null
  • startAtstring | null
  • opensAtstring | null
  • lateAtstring | null
  • deadlineAtstring | null
  • rescheduledboolean | null
  • occurredAtstring | nullrequired
  • externalIdstring | null
  • resentboolean | null

CandidateWithHistory

A candidate with their decision history. A person decides every outcome: scores and bands are a sorting aid for the hiring team, never a verdict, and no decision is made automatically.

  • idstringrequired

    cand_…: the candidate's interview.

    pattern `^cand_.*`

  • sessionIdstringrequired

    Session id (sess_…).

    pattern `^sess_.*`

  • roleIdstringrequired

    Subject id (sub_…).

  • portalIdstring | nullrequired
  • inviteIdstring | nullrequired
  • externalIdstring | nullrequired

    Your ATS's id from the invite.

  • namestring | nullrequired

    Null once erased.

  • emailstring | nullrequired
  • phonestring | nullrequired
  • interviewedAtstring (date-time)required

    ISO 8601 UTC timestamp.

  • minutesnumber | nullrequired
  • typedbooleanrequired

    They typed instead of speaking.

  • roundinteger | nullrequired
  • withdrawnbooleanrequired

    They chose to end the interview: never scored.

  • erasedbooleanrequired
  • erasedAtstring (date-time) | nullrequired
  • mustHaves"met" | "missed" | "unclear" | "none" | nullrequired

    The must-have requirements: all met, one missed, unclear (a person checks), or none set. Flagged for a person, never acted on. Null once erased.

  • requirementsobject[]required

    Each requirement's result; never the answer. Empty once erased.

    • idstringrequired
    • metboolean | nullrequired
    • knockoutbooleanrequired
  • scorenumber | nullrequired

    Only where the role shares scores, and never once erased; else null.

  • band"strong" | "possible" | "below" | "unscored" | nullrequired

    Only where the role shares scores, and never once erased; else null.

  • rankinteger | nullrequired

    Place by score among the role's candidates in the same round (1 = highest; erased and withdrawn candidates hold no place); only where the role shares scores.

  • decisionobject | nullrequired

    The latest decision a person made; null while it awaits one.

    • value"invite" | "hold" | "decline"required

      decline is shown to people as "not progressing".

    • reason"must_haves" | "strong_answers" | "missing_must_have" | "stronger_candidate" | "more_evidence" | "withdrew" | "other" | nullrequired

      The reason code from the fixed list (a note is never given out).

    • decidedAtstring (date-time)required

      ISO 8601 UTC timestamp.

    • decidedByobject | nullrequired

      The member who decided (never an API key).

      • idstringrequired

        Person id (usr_…).

        pattern `^usr_.*`

  • reviewsobjectrequired
    • countintegerrequired
    • requiredintegerrequired
    • recommendationsobject | nullrequired

      How many reviewers recommend advance, hold or do not advance. Only where the role shares scores (candidates.share_scores), and never once erased; else null.

      • advanceintegerrequired
      • holdintegerrequired
      • doNotAdvanceintegerrequired
  • holdbooleanrequired

    A legal hold keeps their data past the role's retention.

  • reviewRequestedbooleanrequired

    They asked for a review of the decision and no decision was recorded since.

  • retentionExpiresAtstring (date-time) | nullrequired

    When their data is erased (null while held or once erased).

  • updatedAtstring (date-time)required

    ISO 8601 UTC timestamp.

  • decisionsobject[]required

    Every decision recorded, newest first.

    • value"invite" | "hold" | "decline"required

      decline is shown to people as "not progressing".

    • reason"must_haves" | "strong_answers" | "missing_must_have" | "stronger_candidate" | "more_evidence" | "withdrew" | "other" | nullrequired

      The reason code from the fixed list (a note is never given out).

    • decidedAtstring (date-time)required

      ISO 8601 UTC timestamp.

    • decidedByobject | nullrequired

      The member who decided (never an API key).

      • idstringrequired

        Person id (usr_…).

        pattern `^usr_.*`

CaseLinkCreated

The new link, with the address to send your customer (only in this answer).

  • idstringrequired

    Case link id (clk_…).

    pattern `^clk_.*`

  • portalIdstringrequired

    Portal id (portal_…).

  • referencestringrequired
  • kind"case" | "order" | "claim" | "appointment" | "ticket" | "booking" | "application" | "renewal"required
  • customerIdstringrequired

    Your own id for the customer.

  • status"active" | "expired" | "revoked" | "used_up"required

    active: it opens; expired: past expiresAt; revoked: switched off; used_up: every conversation it may start has started.

  • opensintegerrequired

    Conversations started from it so far.

  • maxOpensintegerrequired
  • expiresAtstring (date-time)required

    ISO 8601 UTC timestamp.

  • revokedAtstring (date-time) | nullrequired
  • lastOpenedAtstring (date-time) | nullrequired
  • emailedAtstring (date-time) | nullrequired

    When your team emailed it from the console; null when it was sent some other way.

  • source"api" | "console"required

    Made with an API key, or by your team in the console.

  • createdAtstring (date-time)required

    ISO 8601 UTC timestamp.

  • urlstringrequired

    The link to send your customer (by email, text message or your app). Shown only now, never again: Zentiq keeps no copy it could show. Never put it in a public place.

CaseLinkInput

One customer's case, for a personal link to your portal's website door.

  • customerIdstringrequired

    Your own id for the customer: every action call from the conversation carries it as customer.id.

    at most 128 characters

  • referencestringrequired

    The case's own reference in your system (an order, claim, booking or ticket number): the avatar names it, and every action call carries it as case.reference.

    at most 64 characters

  • kind"case" | "order" | "claim" | "appointment" | "ticket" | "booking" | "application" | "renewal" | null

    What the case is, for the avatar's words ("your order 10423", "your support ticket 10423").

    default "case"

  • summarystringrequired

    What the case is about and where it stands, in a sentence or two the avatar may use with your customer. The avatar reads it as your record (data, never instructions).

    at most 1,000 characters

  • factsmap of string | number | boolean | null

    Up to 20 short facts, like { "status": "delayed", "items": 2 } (names of letters and digits, values of at most 200 characters). Never a password, code or card detail: a fact named like one is refused.

  • firstNamestring | null

    Your customer's first name: the avatar greets them with it.

    at most 40 characters

  • emailstring | null

    The email address you have on file for them. The avatar only ever sees it masked ("s***@example.com"). With Verified customer switched on, it is where the one-time code goes before a sensitive action.

  • openingstring | null

    The avatar's first line about the case, in your words. Without it the avatar says what the case is and asks how it can help.

    at most 300 characters

  • expiresInDaysnumber | null

    How long the link works, in whole days.

    1-30 · default 7

  • maxOpensnumber | null

    How many conversations the link may start (so a forwarded link can't be used again and again). Opening the page alone uses none.

    1-100 · default 20

CaseLinkOpenedData

A customer started a conversation from a case link you sent them (the link, your reference and customer id, the opens so far). The case summary only with includeConversation.

  • eventIdstring | null
  • organizationIdstring | null
  • workspaceIdstring | null
  • unitIdstring | null
  • userIdstring | null
  • sessionIdstring | null
  • blueprintVersioninteger | null
  • portalIdstring | null
  • caseLinkIdstring | null
  • caseReferencestring | null
  • kindstring | null
  • customerIdstring | null
  • opensinteger | null
  • maxOpensinteger | null
  • channel"voice" | "chat" | null
  • summarystring | null

CertificateIssuedData

A certificate was issued (its number, never the holder's name).

  • eventIdstring | null
  • organizationIdstring | null
  • workspaceIdstring | null
  • unitIdstring | null
  • userIdstring | null
  • sessionIdstring | null
  • blueprintVersioninteger | null
  • workspaceNamestring | null
  • idstring | null
  • subjectstring | null
  • percentnumber | null
  • issuedAtstring | null
  • versioninteger | null
  • validUntilstring | null
  • titlestring | null
  • levelstring | null
  • issuerstring | null
  • showScoreboolean | null
  • setIdstring | null

CertificateNoticeData

A certificate close to or past its valid-until date.

  • eventIdstring | null
  • organizationIdstring | null
  • workspaceIdstring | null
  • unitIdstring | null
  • userIdstring | null
  • sessionIdstring | null
  • blueprintVersioninteger | null
  • workspaceNamestring | null
  • certificateIdstring | null
  • subjectstring | null
  • titlestring | null
  • validUntilstring | null
  • renewalAssignmentIdstring | null

CertificateRevokedData

A certificate was withdrawn (a fixed reason).

  • eventIdstring | null
  • organizationIdstring | null
  • workspaceIdstring | null
  • unitIdstring | null
  • userIdstring | null
  • sessionIdstring | null
  • blueprintVersioninteger | null
  • workspaceNamestring | null
  • certificateIdstring | null
  • reason"Attempt voided after review" | "Result changed after review" | null

ChatTurnInput

One message of the chat so far.

  • role"visitor" | "agent" | "bot"required

    Who said it: the customer (visitor), a person on your team (agent) or your chat bot (bot).

  • textstringrequired

    What they said: plain text.

    at most 4,000 characters

  • atstring | number | null

    When it was said: an ISO 8601 date and time (or seconds since 1970).

CompletionRecordedData

A completion record was written for a confirmed pass.

  • eventIdstring | null
  • organizationIdstring | null
  • workspaceIdstring | null
  • unitIdstring | null
  • userIdstring | null
  • sessionIdstring | null
  • blueprintVersioninteger | null
  • workspaceNamestring | null
  • kindstring | null
  • percentnumber | null
  • passMarknumber | null
  • versioninteger | null
  • setIdstring | null
  • setTitlestring | null
  • attemptinteger | null
  • startedAtstring | null
  • endedAtstring | null
  • completedAtstring | null
  • documentsobject[] | null
  • documentsHashstring | null
  • reviewedboolean | null
  • reviewerIdstring | null
  • decisionstring | null
  • decidedAtstring | null

CompletionWithdrawnData

A completion was withdrawn (a fixed reason).

  • eventIdstring | null
  • organizationIdstring | null
  • workspaceIdstring | null
  • unitIdstring | null
  • userIdstring | null
  • sessionIdstring | null
  • blueprintVersioninteger | null
  • workspaceNamestring | null
  • reason"Attempt voided after review" | "Result changed after review" | null

Connection

One of the organisation's connected systems. Never a key or a token.

  • idstringrequired

    Connection id (conn_…).

  • kind"mcp" | "calcom" | "hubspot" | "shopify" | "google_calendar" | "microsoft_calendar" | "slack" | "zapier"required
  • namestringrequired

    The system, in words.

  • labelstringrequired
  • status"pending" | "active" | "failing" | "reconnect"required
  • statusWordsstringrequired
  • secretHintstringrequired

    The last four characters of its key, like "…4f2a" ("" when there is none): the only part of a key ever shown.

  • createdAtstring (date-time)required

    ISO 8601 UTC timestamp.

  • lastUsedAtstring (date-time) | nullrequired
  • healthobjectrequired
    • callsintegerrequired
    • successRatenumber | nullrequired

      Calls the system answered, as a share of all (0 to 1); null before the first.

    • p50Msinteger | nullrequired

      The median time of the latest calls, in ms.

    • lastErrorobject | nullrequired
      • codestringrequired
      • wordsstringrequired
      • atstring | nullrequired
  • detailsmap of string | number | booleanrequired

    What isn't secret: the server's host, the shop, the event type, the calendar.

ConnectionCreated

  • connectionConnectionrequired

    One of the organisation's connected systems. Never a key or a token.

  • authorizeUrlstring | nullrequired

    For a sign-in: where an owner approves it, signed in to the console. null when it is connected already.

ConnectionDeleted

Disconnected: the connection and its key are deleted.

  • idstringrequired
  • actionsOffintegerrequired

    Actions that used it, now switched off.

ConnectionFailedData

One of your connected systems started failing (its id, kind, an error code and the HTTP status): its actions tell visitors they can't do that just now. Never its key or anything it sent back.

  • connectionIdstring | null
  • kindstring | null
  • errorCodestring | null
  • statusinteger | null

ConnectionInput

A system to connect, and what it needs.

  • kind"mcp" | "calcom" | "hubspot" | "shopify" | "google_calendar" | "microsoft_calendar" | "slack" | "zapier"required

    Which system.

  • labelstring | null

    A plain name (never a key).

    at most 60 characters

  • urlstring | null

    mcp: the server's public https MCP address (standard port; private and local addresses are refused).

  • auth"none" | "bearer" | "oauth" | null

    mcp: how it signs in. oauth: the answer's authorizeUrl is where an owner approves it, signed in to the console.

  • tokenstring | null

    mcp (bearer), hubspot (a private app's access token) or shopify (an older app's Admin API access token, made in the Shopify admin before 2026). Write-only: checked, sealed in the vault and never returned (only a masked hint).

  • apiKeystring | null

    calcom: a Cal.com API key. Write-only: checked, sealed in the vault and never returned (only a masked hint).

  • eventTypeIdstring | number | null

    calcom: the event type's number.

  • timeZonestring | null

    calcom, google_calendar, microsoft_calendar: an IANA time zone, like America/New_York.

  • shopstring | null

    shopify: the shop's address, like your-shop.myshopify.com.

  • clientIdstring | null

    shopify: a Dev Dashboard app's Client ID (the app's Settings), with clientSecret instead of token. Zentiq asks Shopify for the app's 24-hour tokens itself (the client credentials grant: the store must be in the app's own Shopify organisation).

    at most 100 characters

  • clientSecretstring | null

    shopify: a Dev Dashboard app's Client secret, with clientId. It also verifies the order notifications Shopify sends for order emails. Write-only: checked, sealed in the vault and never returned (only a masked hint).

  • apiSecretstring | null

    shopify with token: the older app's API secret key, which only order emails need (Shopify signs its order notifications with it). Write-only: checked, sealed in the vault and never returned (only a masked hint).

  • propertiesstring | string[] | null

    hubspot: the contact properties the avatar may read (HubSpot's own names).

  • calendarIdstring | null

    google_calendar: which calendar ("primary" unless named).

  • hoursmap of string | null

    google_calendar, microsoft_calendar: opening hours per day, like { "mon": "09:00-17:00" } (a day left out is closed).

  • slotMinutesnumber | null
  • lengthMinutesnumber | null
  • titlestring | null

    google_calendar, microsoft_calendar: a booking's title.

    at most 60 characters

ConnectionList

  • onbooleanrequired

    The organisation's actions.connectors switch: off, nothing connected is used and nothing new can be connected.

  • connectionsConnection[]required

ConnectionTest

A read-only call that proves it still works.

  • okbooleanrequired
  • wordsstringrequired
  • connectionConnectionrequired

    One of the organisation's connected systems. Never a key or a token.

ConsentRecordedData

Consent was recorded for a membership (who recorded it, never their address).

  • eventIdstring | null
  • organizationIdstring | null
  • workspaceIdstring | null
  • unitIdstring | null
  • userIdstring | null
  • sessionIdstring | null
  • blueprintVersioninteger | null
  • bystring | null

ConversationRatedData

A visitor rated a conversation (the comment only with includeConversation). Never a candidate's.

  • eventIdstring | null
  • organizationIdstring | null
  • workspaceIdstring | null
  • unitIdstring | null
  • userIdstring | null
  • sessionIdstring | null
  • blueprintVersioninteger | null
  • ratingnumber | null
  • commentstring | null

CreatedInvites

The invites made, each with its link, and the candidates skipped with why.

  • createdInvite[]required
  • skippedobject[]required
    • emailstringrequired
    • externalIdstring | nullrequired
    • reason"open_invite" | "already_interviewed" | "listed_twice"required
    • messagestringrequired
  • emailobjectrequired
    • requestedbooleanrequired
    • sentintegerrequired
    • failedintegerrequired
    • queuedintegerrequired

      Still to go: sent straight after this answer.

CreateInvitesInput

Invite candidates to a role's first-round interview.

  • candidatesobject[]required

    At most 200, or 100 when Zentiq emails them. An address with an open invite for the role, one that completed the interview within its retention, or one listed twice is skipped.

    at most 200 items

    • namestringrequired

      2-120 characters

    • emailstringrequired

      at most 254 characters

    • phonestring | null
    • externalIdstring

      pattern `^[^\s@]{1,200}$`

    • metadatamap of string

      Your own data about the applicant, returned as it was: at most 20 string keys. Never sent by webhook.

  • timingInviteTimingrequired

    When candidates may take the interview: any time, by a deadline, or at a set time.

  • timeZonestring

    IANA time zone the emails' times read in (default Europe/London).

    at most 64 characters

  • sendboolean

    true: Zentiq emails each candidate their link (with a calendar file for a set time, and reminders). false (default): copy the links yourself.

  • portalIdstring

    The portal whose door the links open; default: the role's own (where it is published and open to visitors).

CreatePersonInput

  • externalIdstring | null

    Your own id for the person: the sync key. A repeat with it returns the same person.

  • emailstring (email) | null

    Without an externalId, the person is found or added by email. An email another account already has is refused (409).

  • namestring | null
  • role"OWNER" | "ADMIN" | "AVATAR_BUILDER" | "WORKSPACE_ADMIN" | "LEADER" | "LEARNER" | "OBSERVER"required

    OWNER (never given or changed through the API), ADMIN, AVATAR_BUILDER, WORKSPACE_ADMIN (these four at the organisation level only), LEADER, LEARNER, OBSERVER.

  • unitIdstring | null
  • workspaceIdstring | null

    A workspace admin's subject.

  • gradeBandstring | null
  • ageBand"18+" | null
  • loginCardboolean | null

    A learner without an email gets a login card (needs accounts without email switched on).

CreateUnitInput

  • namestringrequired

    1-80 characters

  • parentIdstring | null
  • kindstring | null

    class, team, group, department, region, school or club (default: the organisation's).

  • gradeBandstring | null
  • leaderobject | null

    Invites the unit's leader by email (takes a staff seat).

    • emailstring (email)required

CustomerToken

A short-lived identity token for one signed-in customer.

  • tokenstringrequired

    zct1.…: for this portal and one conversation only. Give it to the website widget or a conversation's start; never put it in a URL.

  • expiresAtstring (date-time)required

    ISO 8601 UTC timestamp.

CustomerTokenInput

The customer signed in on your website.

  • customerIdstringrequired

    Your own id for the signed-in customer: sent to your system as customer.id on every call.

    at most 128 characters

  • namestring | null

    Shown to them as "Signed in as …".

    at most 80 characters

  • emailstring | null
  • authTimenumber | null

    When they signed in, seconds since 1970 (within the last 30 days).

  • ttlSecondsnumber | null

    How long the token lasts, in seconds. At most 900: a longer one is cut to 900 (expiresAt says when).

    at least 30 · default 600

  • contactobject | null

    Verified customer: the contact on record, where Zentiq sends a one-time code before a sensitive action (when the organisation switches it on). Signed into the token; never shown to the avatar, the conversation or a log, only as a masked read-back ("s***@example.com"). Use the address you would send a password reset to.

    • emailstring | null

      The customer's email address on record: where a one-time code is sent.

Dashboard

A Workspaces portal: the front door (address, sign-in methods) and its subjects, each built from a template.

  • idstring
  • namestring
  • slugstring
  • status"draft" | "published" | "archived"
  • welcomestring | null
  • addressstring

    Where people open it: /d/<org>/<slug>, or the verified custom domain.

  • loginMethods("email" | "login_card" | "class_code" | "visitor")[]
  • personaIdstring | null
  • subjectsobject[]
    • idstring
    • namestring
    • typestring

      The template's blueprint key.

    • statusstring
  • createdAtstring (date-time)
  • updatedAtstring (date-time)
  • publishRefusedstring

    Only on a publish that was refused (POST /portals with publish: true, POST /portals/{id}/publish): what to finish before the portal can go live. The portal stays a draft.

DashboardInput

  • namestringrequired

    at most 80 characters

  • templatesstring[]required

    Template keys from GET /portals/templates.

    at most 12 items

  • personaIdstring

    A persona of yours to serve every subject; omitted = the portal gets its own.

  • welcomestring

    at most 160 characters

  • loginMethods("email" | "login_card" | "class_code" | "visitor")[]
  • publishboolean

    true publishes it once it passes the go-live check; otherwise, or when the check refuses it (see publishRefused), it stays a draft.

    default false

DashboardPersona

  • namestring
  • facestring | null
  • voicestring | null
  • accentstring | null
  • greetingstring | null
  • characterstring
  • readyboolean

    true once it has a face and a voice: people can talk to it.

DashboardTemplate

  • keystring
  • group"Learn" | "Train" | "Serve" | "Assess"
  • labelstring
  • descriptionstring
  • availableboolean

    Whether it can be built today.

Deleted

  • deletedboolean
  • idstring

DeliveryList

Type: object[]

Document

A document in a knowledge pack.

  • idstringrequired

    Document id (doc_…).

    pattern `^doc_.*`

  • knowledgeBaseIdstringrequired

    Knowledge base id (kb_…).

    pattern `^kb_.*`

  • namestringrequired
  • typestring | nullrequired

    pdf, txt, md, docx, csv, url or text.

  • bytesinteger | nullrequired
  • status"processing" | "ready" | "failed"required

    processing until it has been read; then ready, or failed.

  • chunkCountinteger | nullrequired

    How many passages were read from it, once ready.

  • errorstring | nullrequired

    When failed: one plain sentence (the file couldn't be read, took too long, reading is unavailable, or it couldn't be processed).

  • createdAtstring (date-time)required

    ISO 8601 UTC timestamp.

  • updatedAtstring (date-time)required

    ISO 8601 UTC timestamp.

DocumentInput

A document from an address ({ url }) or as text ({ text }): exactly one.

  • urlstring (uri)

    A public https address to fetch and read (25 MB at most; every redirect is checked too).

  • textstring

    Text to read (1 MB at most).

    at most 1,048,576 characters

  • namestring

    at most 200 characters

DocumentUpload

A document as a file.

  • filestring (binary)required

    pdf, txt, md, docx or csv; 25 MB at most.

  • namestring

DoorReadiness

  • openbooleanrequired
  • textstringrequired

    The readiness line, in plain words ("Public page open").

  • fix"publish" | "visitors" | "organisation" | nullrequired

    What to do when it is closed: publish the portal, open it to visitors, or let outside people in (the organisation's public website switch).

DownloadUrl

Where to download the original file, for a few minutes.

  • urlstringrequired

    A short-lived signed address of the original file.

  • expiresAtstring (date-time)required

    ISO 8601 UTC timestamp.

Duo

A duo of the organisation's.

  • idstringrequired

    Duo id (duo_…).

    pattern `^duo_.*`

  • personaIdstringrequired

    The persona sessions and portals use (its name is "A & B").

    pattern `^pa_.*`

  • source"library" | "generated" | "composed" | "upload"required

    Where its picture came from.

  • libraryKeystring | nullrequired

    The ready-made duo it was copied from.

  • peopleobject[]required
    • namestringrequired
    • gender"female" | "male"required
    • rolestring | nullrequired

      Their part in the conversation, in a few words.

    • voiceIdstring | nullrequired
  • relationshipstring | nullrequired
  • status"draft" | "ready_for_render" | "registering" | "testing" | "live" | "needs_changes" | "failed"required

    draft, then ready_for_render once published; registering and testing on the render side; live when its test run passed, or needs_changes / failed.

  • statusWordsstringrequired

    Where it is, in one plain sentence.

  • previewUrlstring | nullrequired

    Its picture (your API key reads it: it is the organisation's own avatar).

  • languagesstring[]required

    The languages a duo speaks (the ten codes GET /languages marks duo).

  • testReasonsstring[]required

    Why its test run didn't pass, in plain words (needs_changes, failed).

  • updatedAtstring (date-time)required

    ISO 8601 UTC timestamp.

  • aiGeneratedtruerequired

    Always true: the duo's video and voices are AI-generated, and so is their picture unless it is a photo you uploaded (EU AI Act Article 50(2)).

DuoAccess

What the organisation may do with duos now.

  • builderOpenbooleanrequired

    Duos are open to the organisation (while not, every other /duos operation is 404).

  • canUsebooleanrequired

    The plan uses ready-made duos.

  • canBuildbooleanrequired

    The plan builds its own duos.

  • upgradeobject | nullrequired

    The plan that would add what's missing, and the words for it; null when nothing is.

    • planstringrequired
    • messagestringrequired

DuoInput

A new duo, as a draft.

  • source"library"required

    A copy of one of Zentiq's ready-made duos (your own duos come in a later release).

  • libraryKeystringrequired

    From GET /duos/library.

EmbedToken

A one-time sign-in for one of your users.

  • tokenstringrequired

    Five minutes, single use.

  • expiresAtstring (date-time)required

    ISO 8601 UTC timestamp.

  • urlstringrequired

    Opens the portal as that person (a full page).

  • embedUrlstringrequired

    What an iframe mounts (zentiq-embed.js, @zentiq/react's <ZentiqPortal>).

EmbedTokenInput

The person your backend signs in.

  • externalUserIdstringrequired

    Your own id for this person: the same person as POST /people with this externalId.

    1-120 characters

  • namestring

    at most 80 characters

  • emailstring

    at most 200 characters

  • role"learner" | "leader" | "observer"

    Default learner. A leader takes a staff seat.

  • unitIdstring

    Their team or class (unit_…).

  • unitNamestring

    Or a group by name, made under the portal's team on first sight.

    1-80 characters

  • gradeBandstring

    at most 8 characters

  • consentobject

    { by: "organisation" }: your organisation attests the consent a young learner needs (recorded as yours; needs people:write as well). Without it, a learner under the consent age waits for a guardian's consent.

    • by"organisation"required

Error

The error envelope. The request id is in the X-Request-Id header.

  • errorobjectrequired
    • codestring (one of 33)required

      What went wrong, from the error catalogue.

    • messagestringrequired

      Plain English, safe to show an admin.

    • paramstring

      The input at fault, as a path: body.faqs[3].a, query.limit, params.id.

    • detailsmap of any

      Structured extras: a plan refusal's feature and plan (and reason: plan_required when the plan is why a feature's switch is off), a conflict's reason, go-live problems, the current version.

Escalation

A link that opens the video avatar with the chat so far.

  • idstringrequired

    Escalation id (esc_…).

    pattern `^esc_.*`

  • urlstringrequired

    The link to show the customer (or open in the widget). It works once, for 30 minutes; the token is in its fragment, never sent to a server.

  • tokenstringrequired

    zesc_…: the link's own token (already in url). For one conversation only; never put it in a query string or a log.

  • expiresAtstring (date-time)required

    ISO 8601 UTC timestamp.

EscalationCompletedData

A conversation your text chat handed to the video avatar ended: where it came from, your chat tool's ids, how long and the outcome. The summary only with includeConversation, where allowed.

  • eventIdstring | null
  • organizationIdstring | null
  • workspaceIdstring | null
  • unitIdstring | null
  • userIdstring | null
  • sessionIdstring | null
  • blueprintVersioninteger | null
  • workspaceNamestring | null
  • escalationIdstring | null
  • portalIdstring | null
  • source"api" | "intercom" | "zendesk" | "widget" | null
  • externalRefstring | null
  • customerRefstring | null
  • status"completed" | "abandoned" | null
  • minutesnumber | null
  • secondsnumber | null
  • turnsHandedOverinteger | null
  • referencestring | null
  • startedAtstring | null
  • endedAtstring | null
  • outcome"resolved" | "handoff" | "booking" | "lead" | "unresolved" | "no_conversation" | null
  • resolvedboolean | null
  • summarystring | null

EscalationInput

A chat to hand to the video avatar.

  • transcriptChatTurnInput[]required

    The chat so far, oldest first: at most 50 turns and 20,000 characters in all (send the newest). The avatar reads it as information, never as instructions.

    at most 50 items

  • customerobject | null

    The customer, when your chat knows them.

    • externalIdstring | null

      Your own id for the customer: it comes back on escalation.completed as customerRef.

      at most 128 characters

    • firstNamestring | null

      The avatar greets them by it.

      at most 80 characters

    • emailstring | null

      Kept with the escalation only; never read out, never sent back.

  • reasonstring | null

    A short phrase finishing "your chat about …" ("the refund on order 1042"): the avatar opens with it.

    at most 120 characters

  • returnUrlstring | null

    An https address the visitor is offered at the end (back to your chat).

    at most 2,000 characters

Event

An event as a webhook receives it, in the calling key's contract.

  • idstringrequired

    evt_…: the webhook envelope's id, the same on every delivery.

    pattern `^evt_.*`

  • typestringrequired
  • apiVersion"2026-07-08" | "2026-10-01"

    From 2026-10-01: the contract data is written in.

  • organizationIdstring

    From 2026-10-01.

    pattern `^org_.*`

  • createdAtstring (date-time)required

    ISO 8601 UTC timestamp.

  • datamap of anyrequired

    Exactly what a webhook with this key's rights receives (the event type's data schema; see GET /v1/event-types).

  • aiGeneratedtrue

    Present, and true, when data carries words an avatar wrote: a summary, a report or an avatar's turn (EU AI Act Article 50(2)). Every contract.

EventType

One event type a webhook can receive.

  • typestringrequired
  • descriptionstringrequired
  • since"2026-07-08" | "2026-10-01"required

    The contract it appeared in.

  • explicitOnlybooleanrequired

    Never part of "*": a webhook receives it only by naming it.

  • requiresConversationbooleanrequired

    Only for a webhook with includeConversation.

  • fieldsobjectrequired

    data's fields by class (a.b, [] a list's items): contact only on leads, bookings and hand-offs; result only for released results; conversation only with includeConversation, where allowed.

    • structurestring[]required
    • contactstring[]required
    • resultstring[]required
    • conversationstring[]required
  • dataSchemamap of anyrequired

    data's JSON Schema in the current contract.

GoLiveProblem

Something to finish before going live.

  • fieldstringrequired

    Where it is in the content document (faqs, screening.requirements[1], facts); setup for the set-up as a whole.

  • messagestringrequired
  • shortstringrequired

    A few words for a list.

GuardianConsentInput

  • by"organisation" | "guardian" | "teacher"required

    Who gave it: the organisation attests, a guardian gave it, a teacher recorded it on file.

  • guardianEmailstring (email) | null

    Kept on the place as evidence; never sent in any event or webhook.

  • methodstringrequired

    How it was given: school_form, in_person, email, …

    1-40 characters

  • evidenceRefstring | null

    Your own reference to the evidence.

HandoffJoinedData

Someone from your team joined a website visitor's live conversation as themselves (their user id, how they joined).

  • eventIdstring | null
  • organizationIdstring | null
  • workspaceIdstring | null
  • unitIdstring | null
  • userIdstring | null
  • sessionIdstring | null
  • blueprintVersioninteger | null
  • workspaceNamestring | null
  • referencestring | null
  • portalIdstring | null
  • staffUserIdstring | null
  • via"console" | "email" | "api" | null
  • staffCountinteger | null

HandoffLeftData

Someone from your team left a website visitor's live conversation: how long they were in it, and whether the assistant carried on or the conversation ended.

  • eventIdstring | null
  • organizationIdstring | null
  • workspaceIdstring | null
  • unitIdstring | null
  • userIdstring | null
  • sessionIdstring | null
  • blueprintVersioninteger | null
  • workspaceNamestring | null
  • referencestring | null
  • portalIdstring | null
  • staffUserIdstring | null
  • secondsinteger | null
  • next"stayed" | "resumed" | "ended" | null

HandoffRequestedData

A website visitor asked for a person: their contact details, what they need and their consent. The summary and reason only with includeConversation.

  • eventIdstring | null
  • organizationIdstring | null
  • workspaceIdstring | null
  • unitIdstring | null
  • userIdstring | null
  • sessionIdstring | null
  • blueprintVersioninteger | null
  • workspaceNamestring | null
  • referencestring | null
  • summarystring | null
  • needstring | null
  • budgetstring | null
  • timelinestring | null
  • contactobject | null
    • namestring | null
    • emailstring | null
    • phonestring | null
    • companystring | null
    • rolestring | null
    • preferredTimestring | null
    • locationstring | null
    • referencestring | null
  • consentobject | null
    • purposestring | null
    • marketingboolean | null
    • textstring | null
    • versioninteger | null
    • atstring | null
    • givenboolean | null
  • promisestring | null
  • dueAtstring | null
  • departmentstring | null
  • verifiedboolean | null
  • portalIdstring | null
  • reasonstring | null
  • intentstring | null
  • inboxItemIdstring | null

HandoffUpdatedData

A website visitor's request for a person gained their contact details after it was sent (they agreed and said how to reach them later in the conversation): the same fields as handoff.requested, with the same reference.

  • eventIdstring | null
  • organizationIdstring | null
  • workspaceIdstring | null
  • unitIdstring | null
  • userIdstring | null
  • sessionIdstring | null
  • blueprintVersioninteger | null
  • workspaceNamestring | null
  • referencestring | null
  • summarystring | null
  • needstring | null
  • budgetstring | null
  • timelinestring | null
  • contactobject | null
    • namestring | null
    • emailstring | null
    • phonestring | null
    • companystring | null
    • rolestring | null
    • preferredTimestring | null
    • locationstring | null
    • referencestring | null
  • consentobject | null
    • purposestring | null
    • marketingboolean | null
    • textstring | null
    • versioninteger | null
    • atstring | null
    • givenboolean | null
  • promisestring | null
  • dueAtstring | null
  • departmentstring | null
  • verifiedboolean | null
  • portalIdstring | null
  • reasonstring | null
  • intentstring | null
  • inboxItemIdstring | null

Health

The API is up.

  • status"ok"required
  • version"v1"required

InboxItem

A website visitor's request the team acts on: a lead, a booking request or a hand-off (one per conversation).

  • idstringrequired

    inb_…: the visitor's conversation (webhooks' inboxItemId).

    pattern `^inb_.*`

  • sessionIdstringrequired

    Session id (sess_…).

    pattern `^sess_.*`

  • portalIdstring | nullrequired

    The portal the visitor came through, when known.

  • subjectIdstring | nullrequired
  • subjectstring | nullrequired

    The subject's name when the request came in.

  • referencestring | nullrequired

    The reference the visitor was given.

  • receivedAtstring (date-time)required

    When the conversation's first request came in.

  • kinds("lead" | "booking" | "handoff")[]required
  • primary"lead" | "booking" | "handoff"required

    What the item is mainly about: a booking, else a lead, else a hand-off.

  • status"new" | "contacted" | "confirmed" | "closed"required
  • statusAtstring (date-time) | nullrequired
  • statusByobject | nullrequired

    Who moved it last: a member, or an API key (yours included, so a sync can ignore its own changes).

    • type"user" | "api_key"required
    • idstringrequired

      usr_… or key_….

  • notestring | nullrequired

    The team's note with the latest status.

  • overduebooleanrequired
  • dueAtstring (date-time) | nullrequired

    When the visitor was promised an answer by.

  • promisestring | nullrequired

    What the visitor was told about when they would hear back.

  • contactobject | nullrequired

    The details the visitor gave, with their consent, for this request; payment and identity numbers are masked. Never an under-18's.

    • namestring | nullrequired
    • emailstring | nullrequired
    • phonestring | nullrequired
    • companystring | nullrequired
    • rolestring | nullrequired
    • locationstring | nullrequired
    • preferredTimestring | nullrequired
    • referencestring | nullrequired
  • teamstring | nullrequired

    The team it went to.

  • leadobject | nullrequired
    • bandstring | nullrequired
    • pointsnumber | nullrequired
  • bookingobject | nullrequired

    A booking request: nothing is in a calendar until someone confirms it with the visitor.

    • servicestring | nullrequired
    • whenstring | nullrequired
  • consentobject | nullrequired

    What the visitor agreed to: to be contacted about this request, never marketing.

    • purposestring | nullrequired
    • marketingfalserequired
    • versioninteger | nullrequired
    • atstring (date-time) | nullrequired
    • givenboolean | nullrequired
  • verifiedboolean | nullrequired

    false: some of the request was read only from the visitor's page (it could be made up); null: recorded before Zentiq checked.

  • removedFieldsstring[]required

    Details the visitor had removed; delete them from your records too.

  • updatedAtstring (date-time)required

    ISO 8601 UTC timestamp.

  • needstring | null

    What they need, in their words. Only for a key holding transcripts:read, and never from an under-18's, a candidate's or a safety-flagged conversation (absent otherwise).

  • budgetstring | null

    Only for a key holding transcripts:read, and never from an under-18's, a candidate's or a safety-flagged conversation (absent otherwise).

  • timelinestring | null

    Only for a key holding transcripts:read, and never from an under-18's, a candidate's or a safety-flagged conversation (absent otherwise).

  • summarystring | null

    The conversation's summary. Only for a key holding transcripts:read, and never from an under-18's, a candidate's or a safety-flagged conversation (absent otherwise).

  • reasonstring | null

    Why they asked for a person. Only for a key holding transcripts:read, and never from an under-18's, a candidate's or a safety-flagged conversation (absent otherwise).

  • answersmap of string | null

    A lead's answers to the qualification questions. Only for a key holding transcripts:read, and never from an under-18's, a candidate's or a safety-flagged conversation (absent otherwise).

InboxItemUpdate

Move a request on. Records lead.updated or booking.updated with by = this key.

  • status"new" | "contacted" | "confirmed" | "closed"required
  • notestring

    The team's note with the new status (at most 500 characters).

    at most 500 characters

  • expectedStatus"new" | "contacted" | "confirmed" | "closed"

    The status you last saw: when it has changed since, nothing changes (409 conflict, details.currentStatus).

InboxMoveData

A website visitor's request moved on in the inbox: its status, the one before, and who moved it.

  • eventIdstring | null
  • organizationIdstring | null
  • workspaceIdstring | null
  • unitIdstring | null
  • userIdstring | null
  • sessionIdstring | null
  • blueprintVersioninteger | null
  • workspaceNamestring | null
  • referencestring | null
  • requeststring | null
  • statusstring | null
  • previousstring | null
  • byobject | null
    • type"user" | "api_key" | null
    • idstring | null

Invite

A personal invitation to a role's first-round interview.

  • idstringrequired

    Invite id (inv_…).

    pattern `^inv_.*`

  • roleIdstringrequired

    Subject id (sub_…).

  • portalIdstring | nullrequired

    The portal whose door the link opens.

  • externalIdstring | nullrequired

    Your ATS's own id for the applicant, sent back on every candidate event.

  • metadatamap of stringrequired
  • namestring | nullrequired

    Null once the candidate's data was erased.

  • emailstring | nullrequired
  • phonestring | nullrequired
  • status"invited" | "opened" | "started" | "completed" | "cancelled" | "expired"required

    invited → opened → started → completed; or cancelled (by the team, rescheduled, or a missed set time) or expired (a passed deadline).

  • cancelReason"late" | "withdrawn_by_team" | "rescheduled" | nullrequired
  • timing"open" | "deadline" | "scheduled"required
  • startAtstring (date-time) | nullrequired

    scheduled: the interview time.

  • opensAtstring (date-time) | nullrequired

    scheduled: when the link opens.

  • lateAtstring (date-time) | nullrequired

    scheduled: not started by then, the invite is cancelled as late.

  • deadlineAtstring (date-time) | nullrequired

    deadline: the interview must be started by then.

  • sentAtstring (date-time) | nullrequired

    When Zentiq last emailed it; null when the link was only copied.

  • openedAtstring (date-time) | nullrequired
  • startedAtstring (date-time) | nullrequired
  • completedAtstring (date-time) | nullrequired
  • cancelledAtstring (date-time) | nullrequired
  • candidateIdstring | nullrequired

    The candidate (cand_…) once their interview reached the hiring team.

  • linkstring | nullrequired

    The candidate's personal link while it can be used: a secret, give it only to them.

  • createdAtstring (date-time)required

    ISO 8601 UTC timestamp.

InviteTiming

When candidates may take the interview: any time, by a deadline, or at a set time.

  • mode"scheduled"required
  • deadlineAtstring (date-time)

    30 minutes to 90 days from now.

  • startAtstring (date-time)

    In the future, within 90 days.

  • earlyMinutesinteger

    scheduled: how early the link opens (default 10).

    0-120

  • lateMinutesinteger

    scheduled: how late a start may be before the invite is cancelled (default 15).

    1-120

JobCompletedData

A long-running job finished (the drafts it wrote, by id).

  • eventIdstring | null
  • organizationIdstring | null
  • workspaceIdstring | null
  • unitIdstring | null
  • userIdstring | null
  • sessionIdstring | null
  • blueprintVersioninteger | null
  • jobIdstring | null
  • typestring | null
  • statusstring | null
  • subjectIdsstring[] | null

KeyInput

  • namestring

    Up to 60 characters. Default "API key".

  • scopesstring[]

    Scope names, or ["*"] (the default, [] means the same) for full access. A key can only give scopes it holds itself.

    at most 64 items

  • apiVersion"2026-07-08" | "2026-10-01"

    The contract the new key speaks. Default: the contract of this request.

KeyList

Type: ApiKey[]

KeyRevoked

The key stops working on its next request.

  • revokedtruerequired
  • idstringrequired

    API key id (key_…).

    pattern `^key_.*`

KeyWithSecret

A new key, with its secret (shown once).

  • idstringrequired

    API key id (key_…).

    pattern `^key_.*`

  • namestringrequired
  • prefixstringrequired

    The key's first characters, as shown in the console.

  • scopesstring[]required

    The scopes as set on the key; [] or ["*"] is full access (sensitive scopes are added by name).

  • apiVersion"2026-07-08" | "2026-10-01"required

    The contract the key speaks.

  • createdBystring | nullrequired

    Who made it: a member (usr_…) or a key (key_…); null for older keys.

  • lastUsedAtstring (date-time) | nullrequired
  • revokedAtstring (date-time) | nullrequired
  • createdAtstring (date-time)required

    ISO 8601 UTC timestamp.

  • keystringrequired

    The full key. Returned once: store it now.

KnowledgeBase

A knowledge pack: documents an avatar answers from once attached to its persona.

  • idstringrequired

    Knowledge base id (kb_…).

    pattern `^kb_.*`

  • namestringrequired
  • documentCountintegerrequired

    Its documents (not deleted ones).

  • readyCountintegerrequired

    Its documents that have been read: the ones the avatar answers from.

  • createdAtstring (date-time)required

    ISO 8601 UTC timestamp.

  • updatedAtstring (date-time)required

    ISO 8601 UTC timestamp.

KnowledgeBaseInput

A knowledge pack's name.

  • namestringrequired

    at most 200 characters

KnowledgeDocumentFailedData

A knowledge document could not be read; errorCode says why.

  • documentIdstring | null
  • knowledgeBaseIdstring | null
  • error"The document could not be read. Check that it is a readable PDF, Word, text, Markdown or CSV file." | "No text was found in the document. If it is a scan or a picture, upload a version with text you can select." | "Processing the document took too long. Try a smaller file." | "Document processing is unavailable right now. Try again later." | "The document could not be processed." | null
  • errorCode"unreadable" | "empty" | "timeout" | "unavailable" | "failed" | null

KnowledgeDocumentProcessedData

A knowledge document was read and is ready.

  • documentIdstring | null
  • knowledgeBaseIdstring | null
  • chunkCountinteger | null

KnowledgeGapData

The assistant couldn't answer some questions (the questions only with includeConversation).

  • eventIdstring | null
  • organizationIdstring | null
  • workspaceIdstring | null
  • unitIdstring | null
  • userIdstring | null
  • sessionIdstring | null
  • blueprintVersioninteger | null
  • workspaceNamestring | null
  • sourcestring | null
  • referencestring | null
  • questionsstring[] | null

Language

A language from the catalogue.

  • codestringrequired

    BCP-47 code: what the API takes and returns.

  • namestringrequired

    English name.

  • nativeNamestringrequired

    Its own name.

  • duobooleanrequired

    A duo (two people in one conversation) speaks it: ten languages do.

  • duoNamestring | nullrequired

    How a duo shows it (a duo has one Portuguese); null when a duo doesn't speak it.

  • betabooleanrequired

    Offered to one avatar in beta (Cantonese).

Languages

The language catalogue, the voice engines and the accent keys.

  • languagesLanguage[]required

    Every language an avatar speaks, from the catalogue: one avatar any of them, a duo the ten flagged duo.

  • enginesobjectrequired

    The two voice engines.

    • premierVoiceEnginerequired

      A voice engine. The voice decides which one a persona runs on: see Voice.engine.

    • globalVoiceEnginerequired

      A voice engine. The voice decides which one a persona runs on: see Voice.engine.

  • accentsobject[]required

    Values for settings.accent that speak English with the accent of another language.

    • keystringrequired
    • labelstringrequired

LeadCapturedData

A website visitor left their details as a lead: contact details, the lead's band and their consent. The summary only with includeConversation.

  • eventIdstring | null
  • organizationIdstring | null
  • workspaceIdstring | null
  • unitIdstring | null
  • userIdstring | null
  • sessionIdstring | null
  • blueprintVersioninteger | null
  • workspaceNamestring | null
  • referencestring | null
  • summarystring | null
  • needstring | null
  • budgetstring | null
  • timelinestring | null
  • contactobject | null
    • namestring | null
    • emailstring | null
    • phonestring | null
    • companystring | null
    • rolestring | null
    • preferredTimestring | null
    • locationstring | null
    • referencestring | null
  • consentobject | null
    • purposestring | null
    • marketingboolean | null
    • textstring | null
    • versioninteger | null
    • atstring | null
    • givenboolean | null
  • promisestring | null
  • dueAtstring | null
  • departmentstring | null
  • verifiedboolean | null
  • portalIdstring | null
  • leadBandstring | null
  • pointsnumber | null
  • answersmap of string | null
  • inboxItemIdstring | null

LearnerSignedInData

A learner signed in to a portal.

  • eventIdstring | null
  • organizationIdstring | null
  • workspaceIdstring | null
  • unitIdstring | null
  • userIdstring | null
  • sessionIdstring | null
  • blueprintVersioninteger | null
  • methodstring | null
  • portalIdstring | null

LibraryDuo

One of Zentiq's ready-made duos.

  • keystringrequired

    What POST /duos takes as libraryKey.

  • titlestringrequired
  • scenariostring | nullrequired
  • peopleobject[]required

    The person on the left, then the one on the right.

    • namestringrequired
    • gender"female" | "male"required
    • rolestring | nullrequired

      Their part in the conversation, in a few words.

  • relationshipstring | nullrequired

    couple, colleagues, family or panel.

  • previewUrlstringrequired

    Their picture (public).

  • aiGeneratedtruerequired

    Always true: the duo's video and voices are AI-generated, and so is their picture unless it is a photo you uploaded (EU AI Act Article 50(2)).

LoginCard

How a learner without an email signs in.

  • usernamestringrequired
  • orgCodestringrequired
  • pinstringrequired

    Shown once, never again: print or hand it over now.

MasteryUpdatedData

A person's level on a skill moved.

  • eventIdstring | null
  • organizationIdstring | null
  • workspaceIdstring | null
  • unitIdstring | null
  • userIdstring | null
  • sessionIdstring | null
  • blueprintVersioninteger | null
  • skillstring | null
  • topicstring | null
  • beforenumber | null
  • afternumber | null
  • confidencenumber | null

Me

The calling key, its organisation, plan and limits.

  • organizationobjectrequired
    • idstringrequired

      Organisation id (org_…).

      pattern `^org_.*`

    • displayNamestringrequired

      The name the organisation chose for the API (never an internal workspace name).

    • planstringrequired

      The plan's code (free, starter, plus, pro, business, enterprise).

    • createdAtstring (date-time)required

      ISO 8601 UTC timestamp.

  • planobjectrequired
    • keystringrequired
    • namestringrequired
    • includedMinutesnumber | nullrequired

      The plan's minutes this cycle; null on an unlimited account.

    • featuresstring[]required

      The plan's features that are on (dashboards.serve, embed.website, api.access, …).

  • limitsobjectrequired
    • maxConcurrentSessionsinteger | nullrequired

      Live sessions at once; null = no limit.

    • activeSessionsintegerrequired
    • minutesRemainingnumber | nullrequired

      Minutes the account can still spend (and within its own monthly API cap); null = unlimited.

  • rateLimitsobjectrequired

    The rate limits this key works within (RateLimit-* headers on every answer).

    • windowSecondsintegerrequired
    • perKeyobjectrequired

      Requests per window, by operation class (each operation's class is in the reference as x-zentiq-rate-class).

      • readintegerrequired
      • writeintegerrequired
      • liveintegerrequired
      • heavyintegerrequired
      • searchintegerrequired
    • perOrganizationobjectrequired

      Shared by all of the organisation's keys.

      • readintegerrequired
      • writeintegerrequired
      • liveintegerrequired
      • heavyintegerrequired
      • searchintegerrequired
  • apiKeyobjectrequired
    • idstringrequired

      API key id (key_…).

      pattern `^key_.*`

    • namestring | nullrequired
    • prefixstringrequired

      The key's first characters, as shown in the console.

    • scopesstring[]required

      The key's scopes as set on it; [] or ["*"] is full access.

    • effectiveScopesstring[]required

      Every scope the key holds, after full access and the implied scopes of keys made before 2026-10-01.

    • fullAccessbooleanrequired
    • apiVersion"2026-07-08" | "2026-10-01"required

      The contract the key is pinned to (Zentiq-Version may ask for a newer one).

    • lastUsedAtstring (date-time) | nullrequired
    • createdAtstring (date-time)required

      ISO 8601 UTC timestamp.

MemberAddedData

Someone was added to the organisation.

  • eventIdstring | null
  • organizationIdstring | null
  • workspaceIdstring | null
  • unitIdstring | null
  • userIdstring | null
  • sessionIdstring | null
  • blueprintVersioninteger | null
  • rolestring | null
  • methodstring | null
  • gradeBandstring | null
  • statusstring | null

MemberRemovedData

Someone was removed.

  • eventIdstring | null
  • organizationIdstring | null
  • workspaceIdstring | null
  • unitIdstring | null
  • userIdstring | null
  • sessionIdstring | null
  • blueprintVersioninteger | null
  • rolestring | null
  • scopestring | null
  • rolesstring[] | null
  • teamsstring[] | null
  • accountDeactivatedboolean | null

Membership

A person's place: a role at a unit or at the organisation level.

  • idstringrequired

    Membership id (mbr_…).

    pattern `^mbr_.*`

  • personIdstringrequired

    Person id (usr_…).

    pattern `^usr_.*`

  • rolestringrequired

    One of the member roles.

  • unitIdstring | nullrequired

    The unit it is held at; null at the organisation level.

  • workspaceIdstring | nullrequired

    A workspace admin's subject (sub_…; bare for keys on 2026-07-08).

  • statusstringrequired

    active, waiting_consent (a child's place waiting for a parent's consent) or disabled.

  • gradeBandstring | nullrequired
  • ageBand"18+" | nullrequired

    "18+": an adult learner, who starts without a parent's or guardian's consent.

  • consentAtstring (date-time) | nullrequired
  • consentBy"organisation" | "guardian" | "teacher" | nullrequired

    Who gave a learner's consent: the organisation, a guardian or a teacher (never their details).

  • createdAtstring (date-time)required

    ISO 8601 UTC timestamp.

  • updatedAtstring (date-time)required

    ISO 8601 UTC timestamp.

MemberStateData

A member, or one of their places, switched off or on.

  • eventIdstring | null
  • organizationIdstring | null
  • workspaceIdstring | null
  • unitIdstring | null
  • userIdstring | null
  • sessionIdstring | null
  • blueprintVersioninteger | null
  • scopestring | null
  • rolesstring[] | null
  • membershipIdstring | null
  • rolestring | null

MemberUpdatedData

A member's role or unit changed.

  • eventIdstring | null
  • organizationIdstring | null
  • workspaceIdstring | null
  • unitIdstring | null
  • userIdstring | null
  • sessionIdstring | null
  • blueprintVersioninteger | null
  • membershipIdstring | null
  • fromobject | null
    • rolestring | null
    • unitIdstring | null
  • toobject | null
    • rolestring | null
    • unitIdstring | null

MemoryWrittenData

The platform noted something for a person's next session (what kind, never the note).

  • eventIdstring | null
  • organizationIdstring | null
  • workspaceIdstring | null
  • unitIdstring | null
  • userIdstring | null
  • sessionIdstring | null
  • blueprintVersioninteger | null
  • kindstring | null
  • sourcestring | null
  • skillstring | null
  • charsinteger | null

Person

Someone in the organisation: a member, a learner, a parent.

  • idstringrequired

    Person id (usr_…).

    pattern `^usr_.*`

  • externalIdstring | nullrequired

    Your own id for the person (the sync key), when you gave one.

  • namestringrequired
  • emailstring | nullrequired

    Null for a login card or a person known only by your id.

  • loginNamestring | nullrequired

    A login card's sign-in name (<organisation code>/<username>).

  • membershipsMembership[]required
  • lastSignInAtstring (date-time) | nullrequired
  • disabledbooleanrequired

    Switched off: no sign-in anywhere; their places keep their own status.

  • createdAtstring (date-time)required

    ISO 8601 UTC timestamp.

  • updatedAtstring (date-time)required

    ISO 8601 UTC timestamp.

Persona

An avatar people talk to: a face, a voice, a character and what it knows.

  • idstringrequired

    Persona id (pa_…).

    pattern `^pa_.*`

  • namestringrequired
  • systemPromptstringrequired
  • greetingstring | nullrequired
  • avatarIdstring | nullrequired
  • voiceIdstring | nullrequired
  • settingsPersonaSettingsrequired

    Behaviour settings.

  • knowledgePersonaKnowledge | nullrequired
  • castobjectrequired

    Who the avatar is: one person, or a duo (two people in one conversation).

    • kind"single" | "duo"required
    • peopleobject[]required

      One person, or a duo's two, by name.

      • namestringrequired
  • duoIdstring | nullrequired

    The duo (GET /duos/{id}) when it is one made from /duos; null otherwise.

  • avatarAvatar | nullrequired
  • voiceVoice | nullrequired
  • createdAtstring (date-time)required

    ISO 8601 UTC timestamp.

  • updatedAtstring (date-time)required

    ISO 8601 UTC timestamp.

PersonaInput

A new persona.

  • namestringrequired

    at most 200 characters

  • systemPromptstringrequired

    The character: who they are, what they help with, how they behave.

    at most 16,000 characters

  • greetingstring | null

    The first thing they say.

    at most 2,000 characters

  • avatarIdstring

    Avatar id (av_…).

  • voiceIdstring

    Voice id (vo_…).

  • voiceProfileIdstringdeprecated

    Deprecated: use voiceId.

  • Behaviour settings to set (see PersonaSettings).

  • llmSettingsPersonaSettingsInputdeprecated

    Deprecated: use settings.

  • knowledgeobject | null
    • baseIdsstring[]required

      Knowledge base ids (kb_…), 1 to 20.

    • topKnumber
    • minScorenumber
    • maxCharsnumber

PersonaKnowledge

The knowledge packs attached to a persona: the avatar answers from them.

  • baseIdsstring[]required
  • topKintegerrequired
  • minScorenumberrequired
  • maxCharsinteger

PersonaPatch

What to change; what isn't sent stays as it is.

  • namestring

    at most 200 characters

  • systemPromptstring

    The character: who they are, what they help with, how they behave.

    at most 16,000 characters

  • greetingstring | null

    The first thing they say.

    at most 2,000 characters

  • avatarIdstring

    Avatar id (av_…).

  • voiceIdstring

    Voice id (vo_…).

  • voiceProfileIdstringdeprecated

    Deprecated: use voiceId.

  • Behaviour settings to set (see PersonaSettings).

  • llmSettingsPersonaSettingsInputdeprecated

    Deprecated: use settings.

  • knowledgeobject | null
    • baseIdsstring[]required

      Knowledge base ids (kb_…), 1 to 20.

    • topKnumber
    • minScorenumber
    • maxCharsnumber

PersonaSettings

Behaviour settings.

  • engine"premier" | "global"required

    The voice engine the persona runs on, decided by its voice: premier for your organisation's cloned voices, global for the studio voices.

  • globalVoicestring

    Deprecated: present when engine is global. Choose a voice by voiceId.

  • languagestringrequired

    The language it speaks first: a code from GET /languages.

  • languageMode"follow" | "fixed"required

    follow: it answers in the language people speak to it (starting in language); fixed: it keeps to language.

  • accentstringrequired

    An accent for English, in words ("Scottish") or a key from GET /languages accents; "" for none.

  • voice_accentstringrequired

    A studio voice's English accent variant (neutral is American).

  • skipGreetingbooleanrequired
  • interruptiblebooleanrequired

    People can talk over it.

  • ccbooleanrequired

    Captions shown by default.

  • companystringrequired
  • greet_mode"single" | "rotate" | "ai"required
  • greetingsstring[]required
  • idle_actionsbooleanrequired

    Small natural movements between turns.

  • display_mode"half_body" | "presenter" | "full_body"required

    How the camera frames it.

  • hand_motionbooleanrequired

    Hand gestures while speaking.

  • visionbooleanrequired

    It may see the user's camera, when the user allows it.

  • vision_safe_modebooleanrequired

    Seeing, without reading emotions.

  • ai_disclosurebooleanrequired

    Always true: every avatar tells people it's an AI (EU AI Act Article 50(1)), and it can't be switched off.

  • ai_disclosure_textstringrequired

    Your own wording for the AI disclosure (it always says it's an AI); "" for the standard one, "You're speaking with an AI avatar."

PersonaSettingsInput

Behaviour settings to set (see PersonaSettings).

  • languagestring | null

    A code or a name from GET /languages (a duo: one of its ten).

  • languageMode"follow" | "fixed" | null

    follow: answer in the language people speak; fixed: keep to language (the default).

  • accentstring | null

    An accent for English, in words, or a key from GET /languages accents (longer is cut at 60).

    at most 60 characters

  • voice_accent"neutral" | "amgen" | "valley" | "south" | "rp" | "brixton" | "transat" | "aussie" | null
  • skipGreetingboolean | null
  • interruptibleboolean | null
  • ccboolean | null
  • companystring | null

    at most 80 characters

  • greet_mode"single" | "rotate" | "ai" | null
  • greetingsstring[] | null

    Opening lines to choose from (the first 10, each cut at 200).

    at most 10 items

  • idle_actionsboolean | null
  • display_mode"half_body" | "presenter" | "full_body" | null
  • hand_motionboolean | null
  • visionboolean | null
  • vision_safe_modeboolean | null
  • ai_disclosureboolean | null

    Always true: every avatar tells people it's an AI (EU AI Act Article 50(1)), and it can't be switched off. Accepted for compatibility; false is ignored, and the persona reads back true.

  • ai_disclosure_textstring | null

    Your own wording for the AI disclosure. It must still say plainly that it's an AI ("AI", or "artificial intelligence" in the avatar's language), or the request is refused (400 invalid_request). "" = the default, "You're speaking with an AI avatar."

    at most 140 characters

  • engine"premier" | "global"deprecated

    Read-only from 2026-10-01 (ignored): the voice decides the engine. Choose a voice by voiceId.

  • globalVoicestringdeprecated

    Read-only from 2026-10-01 (ignored). Keys on 2026-07-08 may still name a studio voice here when they send no voiceId.

PersonCreated

The person, and a new login card's PIN once.

  • idstringrequired

    Person id (usr_…).

    pattern `^usr_.*`

  • externalIdstring | nullrequired

    Your own id for the person (the sync key), when you gave one.

  • namestringrequired
  • emailstring | nullrequired

    Null for a login card or a person known only by your id.

  • loginNamestring | nullrequired

    A login card's sign-in name (<organisation code>/<username>).

  • membershipsMembership[]required
  • lastSignInAtstring (date-time) | nullrequired
  • disabledbooleanrequired

    Switched off: no sign-in anywhere; their places keep their own status.

  • createdAtstring (date-time)required

    ISO 8601 UTC timestamp.

  • updatedAtstring (date-time)required

    ISO 8601 UTC timestamp.

  • loginCardLoginCard | nullrequired

    Only on the answer that made the card; never replayed.

Portal

A portal: its doors, how people sign in, who speaks, and its subjects.

  • idstringrequired

    Portal id (portal_…).

  • namestringrequired
  • slugstringrequired
  • status"draft" | "published" | "archived"required

    draft until published; people only reach a published portal.

  • group"learn" | "train" | "serve" | "assess" | "mixed" | nullrequired

    Its subjects' group, mixed when they differ; null without subjects.

  • welcomestring | nullrequired
  • addressstringrequired

    Where people open it: the sign-in page, or the verified custom domain.

  • addressesobjectrequired
    • membersstringrequired

      The sign-in page (/d/<org>/<portal>).

    • visitorsstring | nullrequired

      The visitor page (/v/<org>/<portal>) when a subject opens to visitors; null otherwise.

    • embedstringrequired

      What an iframe mounts, with ?t=<embed token>.

  • loginMethods("email" | "login_card" | "class_code" | "visitor")[]required
  • unitIdstring | nullrequired

    The team or class it is for; null = the whole organisation.

  • personaIdstring | nullrequired

    Who speaks on it.

  • brandobjectrequired
    • primarystring | nullrequired

      #rrggbb

    • logoUrlstring | nullrequired
    • mode"light" | "dark" | "system" | nullrequired
  • domainobject | nullrequired

    The organisation's own address for it, when one is set.

    • namestringrequired
    • verifiedbooleanrequired
    • verifiedAtstring (date-time) | nullrequired
  • subjectsPortalSubject[]required
  • createdAtstring (date-time)required

    ISO 8601 UTC timestamp.

  • updatedAtstring (date-time)required

    ISO 8601 UTC timestamp.

  • publishRefusedstring

    Only when a publish was asked for and the go-live check refused it (POST /portals with publish: true; POST /portals/{id}/publish for keys on 2026-07-08): what to finish first. The portal stays a draft.

PortalCreatedData

A portal was created.

  • eventIdstring | null
  • organizationIdstring | null
  • workspaceIdstring | null
  • unitIdstring | null
  • userIdstring | null
  • sessionIdstring | null
  • blueprintVersioninteger | null
  • portalIdstring | null
  • namestring | null
  • slugstring | null
  • subjectsstring[] | null
  • viastring | null

PortalDoors

Every way in to a portal.

  • membersobjectrequired
    • urlstringrequired

      The sign-in page.

    • loginMethods("email" | "login_card" | "class_code" | "visitor")[]required
    • unitIdstring | nullrequired
  • visitorsVisitorsDoorrequired

    The visitors' door: people come in without signing in.

  • embedobjectrequired
    • urlstringrequired

      What an iframe mounts, with ?t= and a token from POST /portals/{id}/embed-tokens.

    • scriptstringrequired

      The snippet for a signed-in embed (your backend gets the token).

  • customDomainobject | nullrequired
    • namestringrequired
    • verifiedbooleanrequired
    • verifiedAtstring (date-time) | nullrequired

PortalGoLive

What stops the portal going live, subject by subject.

PortalGoLiveProblem

Something a subject still needs before the portal goes live.

  • fieldstringrequired

    Where it is in the content document (faqs, screening.requirements[1], facts); setup for the set-up as a whole.

  • messagestringrequired
  • shortstringrequired

    A few words for a list.

  • subjectIdstring | nullrequired

    The subject it is about; null for something about the whole portal: its actions (field is actions) or its rehearsal before go-live (field is rehearsal).

  • subjectNamestringrequired

PortalInput

A new portal. It starts as a draft.

  • namestringrequired

    1-80 characters

  • templatesstring[]

    Template keys from GET /portals/templates; one subject each.

    at most 12 items

  • templatestringdeprecated

    One template (the 2026-07-08 form of templates).

    1-60 characters

  • personaIdstring

    A persona of yours to speak on every subject; left out = the portal gets its own.

  • unitIdstring | null

    The team or class it is for; left out or null = the whole organisation.

  • welcomestring | null
  • loginMethods("email" | "login_card" | "class_code" | "visitor")[]
  • publishboolean

    Publish it once it passes the go-live check (needs portals:publish); otherwise it stays a draft and publishRefused says why.

PortalPersona

Who speaks on a portal.

  • idstringrequired

    Persona id (pa_…).

    pattern `^pa_.*`

  • namestringrequired
  • facestring | nullrequired

    The face's name.

  • voicestring | nullrequired

    The voice's name.

  • avatarIdstring | nullrequired
  • voiceIdstring | nullrequired
  • accentstring | nullrequired
  • greetingstring | nullrequired
  • characterstringrequired
  • languagestringrequired

    The language it speaks (a name from GET /languages): English unless set.

  • readybooleanrequired

    It has a face and a voice: people can talk to it.

PortalPersonaUpdate

What to change about who speaks. A new face of the other gender brings a matching voice unless one is given.

  • avatarIdstring

    A face (av_…) from GET /avatars.

  • voiceIdstring

    A voice (vo_…) from GET /voices.

  • facestringdeprecated

    A library face by first name ("Marcus"). Prefer avatarId.

    at most 40 characters

  • voicestringdeprecated

    A studio voice by name ("James"). Prefer voiceId.

    at most 40 characters

  • accentstring

    In plain words ("British").

    at most 60 characters

  • characterstring

    Who they are and how they behave, word for word (up to 4,000 characters; longer is 413).

  • greetingstring

    Their first line (up to 300 characters).

  • namestring

    Up to 80 characters.

  • languagestring

    The language it speaks: a name or code from GET /languages ("German", "es"); one it doesn't know is 400. A duo speaks one of its ten.

    at most 80 characters

PortalSubject

A subject on a portal.

  • idstringrequired

    Subject id (sub_…).

  • namestringrequired
  • templatestringrequired

    The template it was built from (custom for one written for the organisation).

  • typestringrequired

    The same as template (its name in the 2026-07-08 contract).

  • kind"tutor" | "roleplay" | "assessor" | "service"required

    What the avatar does: tutor teaches, roleplay plays someone to practise with, assessor asks and scores, service talks to website visitors.

  • group"learn" | "train" | "serve" | "assess"required
  • screeningbooleanrequired

    A candidate screening role.

  • status"draft" | "published" | "archived"required
  • hasDraftbooleanrequired

    A draft version waits to be published (POST /subjects/{id}/publish).

PortalTemplate

A template a portal's subjects are built from.

  • keystringrequired

    What POST /portals takes in templates.

  • group"Learn" | "Train" | "Serve" | "Assess"required
  • labelstringrequired
  • descriptionstringrequired
  • availablebooleanrequired

    It can be built today.

  • kind"tutor" | "roleplay" | "assessor" | "service"required

    What the avatar does: tutor teaches, roleplay plays someone to practise with, assessor asks and scores, service talks to website visitors.

  • duobooleanrequired

    Written for two people in one conversation (needs a duo).

  • requiresstring[]required

    The plan features it needs (its portal family, candidate screening, ready-made duos).

  • includedInPlanbooleanrequired

    The organisation's plan has every feature it needs.

PortalUpdate

The fields to change.

  • namestring

    1-80 characters

  • welcomestring | null
  • loginMethods("email" | "login_card" | "class_code" | "visitor")[]

    Adding visitor opens it to visitors: needs portals:publish, and runs the go-live check on a published portal.

  • unitIdstring | null
  • personaIdstring

    One of your personas to speak on it instead of its own.

  • brandobject
    • primarystring | null

      #rrggbb or a colour name (green); null goes back to the organisation's colour.

    • mode"light" | "dark" | "system" | null
    • hideZentiqBadgeboolean | null

      Honoured when the plan includes removing the badge.

PortalUpdatedData

A portal changed (which fields).

  • eventIdstring | null
  • organizationIdstring | null
  • workspaceIdstring | null
  • unitIdstring | null
  • userIdstring | null
  • sessionIdstring | null
  • blueprintVersioninteger | null
  • portalIdstring | null
  • personaIdstring | null
  • fieldsstring[] | null
  • statusstring | null
  • viastring | null
  • addedstring | null
  • removedstring | number | boolean | null
  • domainstring | null
  • domainVerifiedstring | null
  • allowedOriginsstring[] | null
  • loginMethodsstring[] | null
  • toolstring | null

PracticeStartedData

A person started a practice attempt.

  • eventIdstring | null
  • organizationIdstring | null
  • workspaceIdstring | null
  • unitIdstring | null
  • userIdstring | null
  • sessionIdstring | null
  • blueprintVersioninteger | null
  • workspaceNamestring | null
  • portalIdstring | null

ReportProducedData

A session's report is ready: numbers once released; its words only with includeConversation, where allowed. Never for a candidate.

  • eventIdstring | null
  • organizationIdstring | null
  • workspaceIdstring | null
  • unitIdstring | null
  • userIdstring | null
  • sessionIdstring | null
  • blueprintVersioninteger | null
  • workspaceNamestring | null
  • kindstring | null
  • summarystring | null
  • overallnumber | null
  • scorenumber | null
  • practiceboolean | null
  • passedboolean | null
  • percentnumber | null
  • scenarioobject | null
    • idstring | null
    • titlestring | null
  • questionSetobject | null
    • idstring | null
    • titlestring | null
  • difficultystring | null
  • heldboolean | null
  • screeningboolean | null
  • provisionalboolean | null
  • finalboolean | null
  • reportobject | null
    • kindstring | null
    • summarystring | null
    • scoresmap of number | null
    • overallnumber | null
    • strengthsstring[] | null
    • workOnstring[] | null
    • nextstring | null
    • betterstring[] | null
    • masteryobject[] | null
    • deliveryobject | null
      • learnerWordsinteger | null
      • avatarWordsinteger | null
      • talkSharenumber | null
      • questionsAskedinteger | null
      • fillerWordsinteger | null
      • fillerPerHundrednumber | null
      • longestTurnWordsinteger | null
      • turnsinteger | null
      • paceWpmnumber | null
      • topFillersobject[] | null
    • assessmentobject | null
      • passedboolean | null
      • percentnumber | null
      • marksnumber | null
      • outOfnumber | null
      • passMarknumber | null
      • practiceboolean | null
      • reviewboolean | null
      • humanReviewboolean | null
      • certificateboolean | null
      • criticalFailboolean | null
      • itemsobject[] | null
    • visitorobject | null
      • intentstring | null
      • topicsstring[] | null
      • answeredobject[] | null
      • consentboolean | null
      • handoffobject | null
      • bookingobject | null
      • leadScorestring | null
      • resolvedboolean | null
      • pointsnumber | null
      • unansweredstring[] | null
      • forgottenstring[] | null
    • outcomeobject | null
      • agreedboolean | null
      • scorenumber | null
      • issuesobject[] | null
    • criticalobject[] | null
    • practiceNotestring | null
    • omittedstring[] | null
    • scenarioobject | null
      • idstring | null
      • titlestring | null
    • questionSetobject | null
      • idstring | null
      • titlestring | null
    • difficultystring | null

ResponseTimes

How long the avatar took to start answering each turn, measured in the person's browser from when they stopped speaking or sent a typed line to the avatar's first sound. Only where the organisation measures response times (Settings, Features: "Measure how fast the avatar answers"), and only on Zentiq's own session pages (a portal's sessions, your website avatar's conversations): a session your own app shows isn't timed, and a builder's preview never is.

  • p50Msintegerrequired

    The typical wait in milliseconds: half the answers started sooner.

  • p90Msintegerrequired

    Nine answers in ten started within this many milliseconds.

  • maxMsintegerrequired

    The slowest answer's wait, in milliseconds.

  • turnsintegerrequired

    How many turns were timed. Turns that couldn't be timed fairly (talking over each other, a page in the background, a reconnect) aren't counted.

Result

A session's result: numbers only (never the summary, feedback, evidence, answers, flags or notes). Practice attempts, candidates' interviews and other job interviews are never results here.

  • idstringrequired

    res_ + the session's id.

    pattern `^res_.*`

  • sessionIdstring | nullrequired
  • portalIdstring | nullrequired

    The portal it was started from (portal_…; bare for keys on 2026-07-08).

  • subjectIdstring | nullrequired

    sub_… (bare for keys on 2026-07-08).

  • subjectNamestring | nullrequired
  • kindstring | nullrequired

    What the subject is: assessor, roleplay, tutor, …

  • personobject | nullrequired
    • idstringrequired

      Person id (usr_…).

      pattern `^usr_.*`

    • externalIdstring | nullrequired

      Your own id for them; only for a key holding people:read.

  • unitIdstring | nullrequired
  • startedAtstring (date-time) | nullrequired
  • endedAtstring (date-time) | nullrequired
  • durationSecondsinteger | nullrequired
  • scoredbooleanrequired

    A scored attempt (an assessment); its numbers follow the released rule.

  • release"not_scored" | "awaiting_review" | "reviewers_only" | "voided" | "released"required

    not_scored (a role-play, a lesson: its numbers are the report's); awaiting_review (a reviewer still decides it); reviewers_only (results go to the person through a reviewer only); voided; released.

  • scorenumber | nullrequired

    0-100: the released percent of a scored attempt, else the report's overall. Null while not released.

  • percentnumber | nullrequired
  • passedboolean | nullrequired
  • passMarknumber | nullrequired
  • scenarioobject | nullrequired
    • idstringrequired
    • titlestringrequired
  • questionSetobject | nullrequired
    • idstringrequired
    • titlestringrequired
  • difficultystring | nullrequired
  • categoriesobject[]required

    The rubric's categories with evidence, 0-100. Empty while not released.

    • idstringrequired
    • labelstringrequired
    • scorenumberrequired
  • reviewobject | nullrequired

    A reviewer's decision; null while the result is held for a reviewer or kept from the person (it would say pass or fail).

    • decisionstring | nullrequired

      confirm, pass, not_yet or void.

    • decidedAtstring (date-time)required

      ISO 8601 UTC timestamp.

    • reviewerobject | nullrequired
      • idstringrequired

        Person id (usr_…).

        pattern `^usr_.*`

    • correctedbooleanrequired

      The reviewer corrected marks.

  • contestobject | nullrequired

    The person asked for another look (never their words).

    • atstring (date-time)required

      ISO 8601 UTC timestamp.

    • openbooleanrequired
  • certificateobject | nullrequired

    The certificate; null while the result is held for a reviewer or kept from the person.

    • idstringrequired

      Certificate id (cert_…).

      pattern `^cert_.*`

    • numberstringrequired
    • status"valid" | "expired" | "withdrawn"required
    • validUntilstring | nullrequired
    • verifyUrlstringrequired
  • completionobject | nullrequired

    The completion record; null while the result is held for a reviewer or kept from the person.

    • status"recorded" | "withdrawn"required
    • atstring (date-time)required

      ISO 8601 UTC timestamp.

  • reportAvailablebooleanrequired

    A written report exists (GET /results/{id}/report, with transcripts:read, where the rules allow the words).

  • erasedbooleanrequired

    The retention job took the conversation's words out.

  • updatedAtstring (date-time)required

    ISO 8601 UTC timestamp.

ResultContestedData

A person asked for their result to be looked at again.

  • eventIdstring | null
  • organizationIdstring | null
  • workspaceIdstring | null
  • unitIdstring | null
  • userIdstring | null
  • sessionIdstring | null
  • blueprintVersioninteger | null
  • workspaceNamestring | null
  • percentnumber | null
  • passedboolean | null
  • questionSetobject | null
    • idstring | null
    • titlestring | null

ResultReport

The report's words, where the conversation's rules allow them.

  • resultIdstringrequired

    Result id (res_…).

    pattern `^res_.*`

  • summarystring | nullrequired
  • strengthsstring[]required
  • workOnstring[]required
  • nextstring | nullrequired

ReviewCompletedData

A person decided a result under review.

  • eventIdstring | null
  • organizationIdstring | null
  • workspaceIdstring | null
  • unitIdstring | null
  • userIdstring | null
  • sessionIdstring | null
  • blueprintVersioninteger | null
  • workspaceNamestring | null
  • decisionstring | null
  • passedboolean | null
  • voidedboolean | null
  • percentnumber | null
  • marksnumber | null
  • outOfnumber | null
  • passMarknumber | null
  • aiobject | null
    • passedboolean | null
    • percentnumber | null
    • marksnumber | null
  • reviewerIdstring | null
  • reportIdstring | null
  • contestedboolean | null
  • beforeboolean | null
  • finalboolean | null
  • incompleteboolean | null

ReviewRequestedData

A result waits for a person's review (why, never the score).

  • eventIdstring | null
  • organizationIdstring | null
  • workspaceIdstring | null
  • unitIdstring | null
  • userIdstring | null
  • sessionIdstring | null
  • blueprintVersioninteger | null
  • workspaceNamestring | null
  • reasonstring | null
  • passMarknumber | null

Role

A screening role: the subject candidates are interviewed on.

  • idstringrequired

    The role is a screening subject (sub_…); edit its content through /subjects/{id}/content.

  • titlestringrequired

    The job being hired for (the screening block's role), or the subject's name while it has none.

  • subjectNamestringrequired
  • locationstring | nullrequired
  • market"us" | "uk" | "eu" | nullrequired

    Where the role hires (its own, or the organisation's country): us, uk or eu. Null while unpublished.

  • status"draft" | "published" | "archived"required
  • portalIdsstring[]required
  • timingobject | nullrequired

    The role's default timing for new invites; null when it sets none.

    • mode"open" | "deadline" | "scheduled"required
    • deadlineDaysinteger | nullrequired
    • earlyMinutesinteger | nullrequired
    • lateMinutesinteger | nullrequired
  • closesOnstring (date) | nullrequired

    Applications close at the end of this day (the role's time zone); no invite may start after it.

  • bandsobject | nullrequired

    The score bands the hiring team sorts by (a sorting aid, never a verdict).

    • strongnumberrequired
    • possiblenumberrequired
  • roundsobject[]required

    Rounds of the interview candidates took: scores compare only within a round.

    • roundintegerrequired

      at least 1

    • versionintegerrequired

      The first published version of the role in this round.

      at least 1

    • changed("set" | "questions" | "level" | "bands" | "mustHaves")[]required

      What changed from the round before: the question set, the questions, the level, the bands or the must-haves.

  • latestRoundinteger | nullrequired
  • reviewsRequiredintegerrequired

    Reviews a decision waits for (switch candidates.reviews_required); a decline waits for at least one.

  • blindReviewbooleanrequired
  • shareScoresbooleanrequired

    Switch candidates.share_scores: whether candidates' score, band and rank are given out through the API. Off by default. Never by webhook.

  • holdbooleanrequired

    A legal hold is on the whole role: nothing about its candidates is erased while it is on.

  • doorobject | nullrequired

    The interview link a job advert carries (a portal's visitor door), open once it is published and open to visitors.

    • portalIdstringrequired

      Portal id (portal_…).

    • urlstringrequired
    • openbooleanrequired
  • createdAtstring (date-time)required

    ISO 8601 UTC timestamp.

  • updatedAtstring (date-time)required

    ISO 8601 UTC timestamp.

SayInput

  • textstringrequired

    Up to 2,000 characters.

  • interruptboolean | null

    Cut off any speech in progress first (default true).

  • languagestring | null

    The line's language: one of GET /languages. Default: the session's.

  • turnIdstring | null

    External turn mode: the turn this line answers.

  • eventIdstring | null

    External turn mode: makes a redelivered line idempotent.

  • endSessionboolean | null

    External turn mode: end the session after this line.

ScoreRecordedData

A released score for a person's session.

  • eventIdstring | null
  • organizationIdstring | null
  • workspaceIdstring | null
  • unitIdstring | null
  • userIdstring | null
  • sessionIdstring | null
  • blueprintVersioninteger | null
  • scorenumber | null
  • scoresmap of number | null

SearchInput

What to look for.

  • querystringrequired

    at most 4,096 characters

  • topKinteger

    How many passages (default 5).

    1-50

  • minScorenumber

    Leave out passages below this similarity (0-1, default 0).

    0-1

SearchResult

The closest passages, best first.

  • resultsobject[]required
    • documentIdstringrequired

      Document id (doc_…).

      pattern `^doc_.*`

    • textstringrequired
    • scorenumberrequired

      0-1 similarity (higher is closer).

    • metadataobjectrequired
      • pageinteger | nullrequired

Session

A live conversation with a persona.

  • idstringrequired

    Session id (sess_…).

    pattern `^sess_.*`

  • personaIdstring | nullrequired

    The persona that spoke (pa_…).

  • status"ACTIVE" | "COMPLETED" | "ABANDONED"required

    ACTIVE while live; COMPLETED or ABANDONED once ended.

  • sourcestringrequired

    Where it started: api, portal, visitor, playground, demo or guide.

  • turnModestring | nullrequired

    external when your app owns every avatar turn (autoRespond false); null otherwise.

  • autoRespondbooleanrequired

    False when the avatar only speaks the lines your app sends (POST /sessions/{id}/say).

  • roomstring | nullrequired

    The realtime room, while it has one.

  • minutesBillednumber | nullrequired

    Minutes charged once the session ended; null while live.

  • startedAtstring (date-time)required

    ISO 8601 UTC timestamp.

  • endedAtstring (date-time) | nullrequired
  • durationinteger | nullrequired

    Seconds, once ended.

  • createdAtstring (date-time)required

    ISO 8601 UTC timestamp.

  • modestringrequired

    AVATAR (a talking avatar), VOICE_CALL or CHAT (typed).

  • subjectIdstring | nullrequired

    The portal subject it ran in (sub_…; bare for keys on 2026-07-08); null for a persona session.

  • kind"persona" | "subject" | "visitor"required

    A persona session (your app's, or the console's), a lesson or role-play in a subject, or a website visitor's conversation.

  • aiGeneratedtruerequired

    Always true: the avatar's video, voice and words are AI-generated (EU AI Act Article 50(2)). Keep this marker with the content when you store or pass it on.

  • responseTimesResponseTimes | nullrequired

    How fast the avatar started answering, once the session ended; null when it wasn't measured.

SessionAnalytics

Only recorded data: speech-recognition, model and speech-synthesis timings and interruptions are not recorded and are listed in notRecorded.

  • sessionIdstringrequired

    Session id (sess_…).

    pattern `^sess_.*`

  • statusstringrequired
  • sourcestringrequired
  • durationobjectrequired
    • secondsintegerrequired
    • livebooleanrequired
    • startedAtstring (date-time)required

      ISO 8601 UTC timestamp.

    • endedAtstring (date-time) | nullrequired
  • billingobjectrequired
    • ratenumberrequired
    • billedSecondsintegerrequired
    • billedMinutesnumberrequired
    • ledgerobjectrequired

      The minutes ledger entries for this session.

      • chargedSecondsintegerrequired
      • absorbedSecondsintegerrequired
      • unmeteredSecondsintegerrequired
      • wallSecondsintegerrequired
      • entriesintegerrequired
  • turnsobjectrequired
    • totalintegerrequired
    • userintegerrequired
    • avatarintegerrequired
  • talkShareobjectrequired
    • method"word_timings" | "word_count" | nullrequired
    • usernumber | nullrequired
    • avatarnumber | nullrequired
    • userWordsintegerrequired
    • avatarWordsintegerrequired
    • userSpeechMsinteger | nullrequired
    • avatarSpeechMsinteger | nullrequired
  • timingobjectrequired
    • turnTimestampsbooleanrequired
    • wordTimingsbooleanrequired
    • userToAvatarMsobject | nullrequired

      Time between a person's turn being recorded and the avatar's reply being recorded. Not a pure response latency: turns are timestamped when they are stored.

      • medianintegerrequired
      • p90integerrequired
      • samplesintegerrequired
    • turnsobject[]required
      • indexintegerrequired
      • role"user" | "avatar"required
      • speakerstring

        A duo's speaker.

      • atMsinteger | nullrequired
      • wordsintegerrequired
      • speechMsinteger | nullrequired
      • sincePreviousMsinteger | nullrequired
  • interruptionsanyrequired

    Not recorded yet.

  • clientMetricsobject | nullrequired
    • paceWpmnumber | nullrequired
    • talkListenRationumber | nullrequired
    • fillerWordsPerMinutenumber | nullrequired
  • candidatebooleanrequired

    A candidate's screening interview: report and summary are always null.

  • reportobject | nullrequired
    • kindstring | nullrequired
    • summarystring | nullrequired
    • scorenumber | nullrequired
    • overallnumber | nullrequired
    • percentnumber | nullrequired
    • passedboolean | nullrequired
    • producedAtstring (date-time)required

      ISO 8601 UTC timestamp.

  • summarystring | nullrequired
  • disclosureobject | nullrequired
    • requiredboolean | nullrequired
    • textstring | nullrequired
    • methodstring | nullrequired
    • recordedAtstring (date-time)required

      ISO 8601 UTC timestamp.

  • notRecordedstring[]required
  • aiGeneratedtruerequired

    Always true: the avatar's video, voice and words are AI-generated (EU AI Act Article 50(2)). Keep this marker with the content when you store or pass it on.

SessionAnalyticsSummary

The short analytics GET /sessions/{id} carries.

  • durationSecondsintegerrequired
  • billedMinutesnumberrequired
  • billedSecondsintegerrequired
  • billingRatenumberrequired

    Billable seconds per wall-clock second, fixed when the session started.

  • turnCountintegerrequired
  • talkShareobjectrequired
    • usernumber | nullrequired
    • avatarnumber | nullrequired
  • summarystring | nullrequired

    The report's short summary, or a transcript summary already made in the portal: conversation words, so only where the transcript may be read (never a candidate's interview, a young learner's conversation or a website visitor's who said they are under 18).

  • scorenumber | nullrequired

    The report's score, when it has one.

SessionDetail

A session with its short analytics (the full breakdown is GET /sessions/{id}/analytics).

  • idstringrequired

    Session id (sess_…).

    pattern `^sess_.*`

  • personaIdstring | nullrequired

    The persona that spoke (pa_…).

  • status"ACTIVE" | "COMPLETED" | "ABANDONED"required

    ACTIVE while live; COMPLETED or ABANDONED once ended.

  • sourcestringrequired

    Where it started: api, portal, visitor, playground, demo or guide.

  • turnModestring | nullrequired

    external when your app owns every avatar turn (autoRespond false); null otherwise.

  • autoRespondbooleanrequired

    False when the avatar only speaks the lines your app sends (POST /sessions/{id}/say).

  • roomstring | nullrequired

    The realtime room, while it has one.

  • minutesBillednumber | nullrequired

    Minutes charged once the session ended; null while live.

  • startedAtstring (date-time)required

    ISO 8601 UTC timestamp.

  • endedAtstring (date-time) | nullrequired
  • durationinteger | nullrequired

    Seconds, once ended.

  • createdAtstring (date-time)required

    ISO 8601 UTC timestamp.

  • modestringrequired

    AVATAR (a talking avatar), VOICE_CALL or CHAT (typed).

  • subjectIdstring | nullrequired

    The portal subject it ran in (sub_…; bare for keys on 2026-07-08); null for a persona session.

  • kind"persona" | "subject" | "visitor"required

    A persona session (your app's, or the console's), a lesson or role-play in a subject, or a website visitor's conversation.

  • aiGeneratedtruerequired

    Always true: the avatar's video, voice and words are AI-generated (EU AI Act Article 50(2)). Keep this marker with the content when you store or pass it on.

  • responseTimesResponseTimes | nullrequired

    How fast the avatar started answering, once the session ended; null when it wasn't measured.

  • analyticsSessionAnalyticsSummary | nullrequired

SessionEndedData

A session ended, once: its length and minutes. Its summary only with includeConversation, where allowed.

  • eventIdstring | null
  • organizationIdstring | null
  • workspaceIdstring | null
  • unitIdstring | null
  • userIdstring | null
  • sessionIdstring | null
  • blueprintVersioninteger | null
  • personaIdstring | null
  • durationSecondsnumber | null
  • billedMinutesnumber | null
  • reasonstring | null
  • minutesnumber | null
  • secondsnumber | null
  • statusstring | null
  • completedAssignmentsstring[] | null
  • scorenumber | null
  • selfboolean | null
  • withheldboolean | null
  • withdrawnboolean | null
  • incompleteboolean | null
  • unverifiedboolean | null
  • reapedboolean | null
  • voidedboolean | null
  • summarystring | null

SessionStartedData

A live session started: an API session, or a member's session on a portal (never its plan).

  • eventIdstring | null
  • organizationIdstring | null
  • workspaceIdstring | null
  • unitIdstring | null
  • userIdstring | null
  • sessionIdstring | null
  • blueprintVersioninteger | null
  • personaIdstring | null
  • identitystring | null
  • workspaceNamestring | null
  • selfboolean | null
  • portalIdstring | null
  • kindstring | null
  • focusstring | null
  • difficultystring | null
  • bootstrapboolean | null
  • assignmentsstring[] | null

SessionToken

What your app needs to join the session.

  • sessionIdstringrequired

    Session id (sess_…).

    pattern `^sess_.*`

  • sessionTokenstringrequired

    Short-lived client token (15 minutes) for the realtime room.

  • urlstringrequired

    The realtime transport URL.

  • roomstringrequired
  • personaobjectrequired
    • idstringrequired

      Persona id (pa_…).

      pattern `^pa_.*`

    • namestringrequired

      The name the avatar hears. Only a duo's carries " & " ("Mark & Susan"); a single persona named "Smith & Jones" comes back as "Smith and Jones".

  • disclosureobjectrequired

    The AI disclosure (EU AI Act Article 50): keep label visible on or next to the avatar's video for the whole session and show text at its start. Recorded against the session.

    • requiredbooleanrequired

      Always true: the AI disclosure can't be switched off.

    • textstringrequired

      The notice to show when the session starts, in the session's language (the persona's own wording when it has one).

    • labelstringrequired

      The short label to keep on or right next to the avatar's video for the whole session, in the session's language (the persona's own wording when it has one). The browser and React SDKs draw it for you.

    • languagestringrequired

      The language of label and text, as a code.

    • display"whole_session"required

      When the label shows: for the whole session.

    • rulestringrequired

      What your app must do, in plain words: keep the label visible for the whole session and show the notice at the start. You may restyle or move it, never remove, hide or cover it.

    • ownLabelbooleanrequired

      True only when an owner of your organisation has confirmed, in the console, that your app shows its own AI label for the whole of every session. Only then may the SDKs' own label be hidden.

  • ccbooleanrequired

    The persona's caption preference. The transcript always streams on the data topic "chat"; cc is a render hint.

  • aiGeneratedtruerequired

    Always true: the avatar's video, voice and words are AI-generated (EU AI Act Article 50(2)). Keep this marker with the content when you store or pass it on.

SessionTokenInput

  • personaIdstringrequired

    The persona to start (pa_…).

  • identitystring | null

    Your end user's id (optional): the participant identity in the room.

  • languagestring | null

    Per-session spoken-language override: one of GET /languages, as a code or the name.

  • languageMode"follow" | "fixed" | null

    How this session keeps its language: follow switches to the person's language when they use another; fixed answers in the session's language anyway. Default: the persona's own setting.

  • overridesobject | null
    • systemPromptstring | null

      Replaces the persona's prompt for this session (up to 16,000 characters).

    • greetingstring | null

      Replaces the greeting (up to 2,000 characters); an empty string means no greeting.

    • variablesmap of any | null
  • autoRespondboolean | null

    false: your app owns every avatar turn; the avatar only speaks the greeting and the lines you send with say.

  • turnModeobject | null

    { mode: "external" } is the same as autoRespond false.

    • modestring

SessionTranscriptReadyData

A session's whole transcript can be read with GET /v1/sessions/{id}/transcript (ids only; only where the API may read it).

  • eventIdstring | null
  • organizationIdstring | null
  • workspaceIdstring | null
  • unitIdstring | null
  • userIdstring | null
  • sessionIdstring | null
  • blueprintVersioninteger | null
  • personaIdstring | null

SettingChangedData

A switch changed.

  • eventIdstring | null
  • organizationIdstring | null
  • workspaceIdstring | null
  • unitIdstring | null
  • userIdstring | null
  • sessionIdstring | null
  • blueprintVersioninteger | null
  • keystring | null
  • scopeTypestring | null
  • scopeIdstring | null
  • fromstring | number | boolean | null
  • tostring | number | boolean | null
  • lockedboolean | null

SetupPlan

What to build for a goal. POST /portals with the template builds it.

  • templatestringrequired

    A key from GET /portals/templates, or custom when nothing there fits.

  • fit"exact" | "close" | "none"required

    How well the template fits; none goes with custom.

  • customKind"service" | "tutor" | "roleplay" | "assessor"

    For custom: what the avatar mostly does.

  • templateLabelstringrequired
  • portalNamestringrequired
  • audiencestringrequired

    Who the avatar talks to, in plain words.

  • orgType"company" | "school" | "tutoring" | "individual" | "family" | "other"required
  • summarystringrequired

SetupPlanInput

  • goalstringrequired

    1-600 characters

StaffToken

What your helpdesk needs to join the visitor's call as the member, as themselves.

  • sessionIdstringrequired

    Session id (sess_…).

    pattern `^sess_.*`

  • staffTokenstringrequired

    Short-lived client token (15 minutes) for the realtime room, as the person: microphone and camera, no data channel.

  • urlstringrequired

    The realtime transport URL.

  • roomstringrequired
  • identitystringrequired

    The person's identity in the room: staff-<userId>-<random>, with the attribute zq_role=staff.

  • userIdstringrequired

    Person id (usr_…).

    pattern `^usr_.*`

  • handedOverbooleanrequired

    True when this person is the first from the team in the call: the avatar says who joined and what the visitor needs, then goes quiet until the team has left.

StaffTokenInput

  • userIdstring | null

    The member who joins. A member's own key (made by them in the console) joins as them and may leave this out; only a full-access key may name another member.

SteerInput

  • systemPromptstring | null
  • languagestring | null

    One of GET /languages (a duo's: one of the ten it speaks).

  • variablesmap of any | null

Subject

A subject: what an avatar teaches, practises, assesses or answers, on one or more portals.

  • idstringrequired

    Subject id (sub_…).

  • namestringrequired
  • templatestringrequired

    The template it was built from (custom for one written for the organisation).

  • kind"tutor" | "roleplay" | "assessor" | "service"required
  • group"learn" | "train" | "serve" | "assess"required
  • screeningbooleanrequired

    A candidate screening role (its invites and candidates are under /roles).

  • status"draft" | "published" | "archived"required

    draft until it (or its portal) is published.

  • liveVersionintegerrequired

    The version sessions run; 0 when there is none.

  • draftVersioninteger | nullrequired

    A pending draft to publish; null when there is none.

  • languagesstring[]required

    Language codes (GET /languages).

  • visitorLanguage"follow" | "listed" | "english" | nullrequired

    A website subject: whether it follows the visitor's language, keeps to languages, or speaks English. Null for any other.

  • unitIdstring | nullrequired
  • portalIdsstring[]required
  • createdAtstring (date-time)required

    ISO 8601 UTC timestamp.

  • updatedAtstring (date-time)required

    ISO 8601 UTC timestamp.

SubjectAssessment

How a structured assessment runs. On a write, the fields sent replace theirs.

  • questionsintegerrequired

    How many questions one attempt asks.

  • passMarknumberrequired
  • timedSecondsinteger
  • feedback"after-each" | "at-end"required
  • hintsboolean
  • hintCostnumber
  • factCheckedboolean
  • purposestring

    What the assessment is for, in the notice people confirm before a scored attempt.

  • contactstring

    Who people ask for an adjustment or about a result.

  • review"borderline" | "all"
  • certificateboolean
  • humanReviewboolean
  • retakeAfterDaysinteger
  • retakeLimitobject
    • attemptsintegerrequired
    • withinDaysintegerrequired
  • contestDaysinteger
  • practiceModeboolean
  • reportstringrequired

    What the report contains.

SubjectAssessmentInput

How a structured assessment runs. On a write, the fields sent replace theirs.

  • questionsinteger

    How many questions one attempt asks.

    1-80

  • passMarknumber

    0-100

  • timedSecondsinteger | null
  • feedback"after-each" | "at-end"
  • hintsboolean | null
  • hintCostnumber | null
  • factCheckedboolean | null
  • purposestring | null
  • contactstring | null
  • review"borderline" | "all" | null
  • certificateboolean | null
  • humanReviewboolean | null
  • retakeAfterDaysinteger | null
  • retakeLimitobject | null
    • attemptsintegerrequired

      1-20

    • withinDaysintegerrequired

      1-1,095

  • contestDaysinteger | null
  • practiceModeboolean | null
  • reportstring

    What the report contains.

    1-600 characters

SubjectBookableService

Something visitors can ask to book.

  • idstringrequired

    The item's id within this subject: letters, numbers, dots, dashes or underscores.

  • namestringrequired
  • minutesintegerrequired
  • detailsstring
  • leadTimeHoursinteger
  • hoursstring

SubjectBookableServiceInput

Something visitors can ask to book.

  • idstring

    The item's id within this subject: letters, numbers, dots, dashes or underscores.

    at most 60 characters · pattern `^[A-Za-z0-9][A-Za-z0-9._-]*$`

  • namestringrequired

    1-80 characters

  • minutesintegerrequired

    5-480

  • detailsstring | null
  • leadTimeHoursinteger | null
  • hoursstring | null

SubjectContent

A subject's content, one section per thing a business edits. Sections that don't apply to the subject's kind are left out; a section that applies but isn't set is null (objects) or [] (lists).

SubjectContentDraft

The draft saved, and whether it could go live.

  • versionintegerrequired

    The version shown; its ETag is "v<version>".

  • livebooleanrequired

    It is what sessions run.

  • basedOninteger | nullrequired

    The version it was saved over; null for the first.

  • contentSubjectContentrequired

    A subject's content, one section per thing a business edits. Sections that don't apply to the subject's kind are left out; a section that applies but isn't set is null (objects) or [] (lists).

  • goLiveobjectrequired

SubjectContentSet

The sections to change. A list replaces the whole list; an object section changes only the fields sent (null clears an optional one); facts also takes { key: value }. A document read with GET can be sent back as it is.

SubjectContentUpdate

Sections to change. Always saved as a draft; publish it with POST /subjects/{id}/publish.

  • The sections to change. A list replaces the whole list; an object section changes only the fields sent (null clears an optional one); facts also takes { key: value }. A document read with GET can be sent back as it is.

  • notestring

    Kept with the version.

    at most 200 characters

  • baseVersioninteger

    The version your change is based on (or send If-Match: "v<n>"); a newer one is 409 version_conflict.

    at least 1

SubjectContentVersion

One version of a subject's content.

  • versionintegerrequired

    The version shown; its ETag is "v<version>".

  • livebooleanrequired

    It is what sessions run.

  • basedOninteger | nullrequired

    The version it was saved over; null for the first.

  • contentSubjectContentrequired

    A subject's content, one section per thing a business edits. Sections that don't apply to the subject's kind are left out; a section that applies but isn't set is null (objects) or [] (lists).

SubjectDepartment

A team visitors can be passed to.

  • idstring

    The item's id within this subject: letters, numbers, dots, dashes or underscores.

  • namestringrequired
  • handlesstringrequired
  • contactstring
  • phonestring
  • emailstring
  • hoursstring

    A set of opening hours, by its id in hours.sets.

  • callbackPromisestring
  • callbackWithinHoursinteger

SubjectDepartmentInput

A team visitors can be passed to.

  • idstring | null
  • namestringrequired

    1-80 characters

  • handlesstringrequired

    1-400 characters

  • contactstring | null
  • phonestring | null
  • emailstring | null
  • hoursstring | null
  • callbackPromisestring | null
  • callbackWithinHoursinteger | null

SubjectDraftSavedData

A subject's draft version was saved.

  • eventIdstring | null
  • organizationIdstring | null
  • workspaceIdstring | null
  • unitIdstring | null
  • userIdstring | null
  • sessionIdstring | null
  • blueprintVersioninteger | null
  • workspaceNamestring | null
  • versioninteger | null
  • viastring | null

SubjectFact

A fact about the organisation that the subject's content uses.

  • keystringrequired

    Fills {{key}} wherever the subject's content says it.

  • labelstringrequired
  • valuestringrequired

    The organisation's own value; "" = not filled in yet.

  • helpstring
  • keepboolean

    A method or guardrail default the organisation keeps until it writes its own.

  • perPersonboolean

    Each person gives their own value on the start screen (the role an interview is for).

SubjectFactInput

A fact about the organisation that the subject's content uses.

  • keystringrequired

    Fills {{key}} wherever the subject's content says it.

    1-40 characters · pattern `^[a-z][a-z0-9_]*$`

  • labelstring

    1-80 characters

  • valuestringrequired

    The organisation's own value; "" = not filled in yet.

    0-2,000 characters

  • helpstring | null
  • keepboolean | null
  • perPersonboolean | null

SubjectFaq

An approved answer to a question visitors ask.

  • idstring

    The item's id within this subject: letters, numbers, dots, dashes or underscores.

  • qstringrequired

    The question, as visitors ask it.

  • askstring[]

    Other ways visitors ask it (any language).

  • astringrequired

    The approved answer.

  • linkstring
  • thenstring

    What to do after answering: offer_handoff:<team>, start_booking:<service>.

SubjectFaqInput

An approved answer to a question visitors ask.

  • idstring | null
  • qstringrequired

    The question, as visitors ask it.

    1-300 characters

  • askstring[] | null
  • astringrequired

    The approved answer.

    1-1,200 characters

  • linkstring | null
  • thenstring | null

SubjectGoLive

Whether a version of the subject can go live, and what to finish first.

  • versionintegerrequired

    The version checked.

  • readybooleanrequired
  • problemsGoLiveProblem[]required
  • warningsGoLiveProblem[]required

    Worth fixing; never a refusal.

SubjectHours

Opening hours the assistant can reason about. On a write, the fields sent replace theirs.

  • timezonestringrequired

    An IANA time zone, like America/New_York.

  • bankHolidays"england-and-wales" | "scotland" | "northern-ireland" | "us-common" | "us-federal" | "none"
  • setsmap of objectrequired

    Opening hours by set id (main, sales). A day left out on a write is closed.

  • closuresobject[]
    • datestringrequired
    • labelstringrequired
    • setsstring[]

SubjectHoursInput

Opening hours the assistant can reason about. On a write, the fields sent replace theirs.

  • timezonestring

    An IANA time zone, like America/New_York.

    1-60 characters

  • bankHolidays"england-and-wales" | "scotland" | "northern-ireland" | "us-common" | "us-federal" | "none" | null
  • setsmap of object

    Opening hours by set id (main, sales). A day left out on a write is closed.

  • closuresobject[] | null

SubjectLeadScoring

How a lead is banded. On a write, the fields sent replace theirs.

  • hotstringrequired
  • warmstringrequired
  • coldstringrequired
  • hotAtinteger
  • warmAtinteger

SubjectLeadScoringInput

How a lead is banded. On a write, the fields sent replace theirs.

  • hotstring

    1-500 characters

  • warmstring

    1-500 characters

  • coldstring

    1-500 characters

  • hotAtinteger | null
  • warmAtinteger | null

SubjectLocation

Where the business is.

  • namestringrequired
  • addressstringrequired
  • mapUrlstring
  • parkingstring
  • accessstring

SubjectLocationInput

Where the business is.

  • namestringrequired

    1-80 characters

  • addressstringrequired

    1-300 characters

  • mapUrlstring | null
  • parkingstring | null
  • accessstring | null

SubjectPublish

What to publish.

  • versioninteger

    The version to publish (default: the newest, the pending draft). An older one is brought back as the newest.

    at least 1

  • newRoundboolean

    A screening role that keeps candidates: changes to how candidates compare start a new round (otherwise 409 conflict, reason round_locked).

SubjectQualification

A question asked about an enquiry before it goes to the team.

  • idstringrequired

    The item's id within this subject: letters, numbers, dots, dashes or underscores.

  • questionstringrequired
  • fieldstring (one of 11)
  • whystring
  • pointsmap of integer

    Points per kind of answer, for the lead score.

SubjectQualificationInput

A question asked about an enquiry before it goes to the team.

  • idstring

    The item's id within this subject: letters, numbers, dots, dashes or underscores.

    at most 60 characters · pattern `^[A-Za-z0-9][A-Za-z0-9._-]*$`

  • questionstringrequired

    1-300 characters

  • fieldstring (one of 11) | null
  • whystring | null
  • pointsmap of integer | null

SubjectQuestion

A question people are asked (the answer key is the organisation's own content).

  • idstringrequired

    The item's id within this subject: letters, numbers, dots, dashes or underscores.

  • textstringrequired
  • topicstring
  • competencystring

    The rubric category it measures.

  • difficulty"easy" | "medium" | "hard"
  • format"open" | "short" | "scenario" | "choice"
  • optionsstring[]
  • followUpsstring[]
  • followUpsRigorousstring[]
  • twiststring
  • lookForstring[]
  • redFlagsstring[]
  • anchorsobject
    • 1string
    • 3string
    • 5string
  • notestring
  • modelAnswerstring
  • acceptedstring[]
  • marksinteger
  • timeSecondsinteger
  • criticalboolean
  • pinned"first" | "last"

SubjectQuestionInput

A question people are asked (the answer key is the organisation's own content).

  • idstring

    The item's id within this subject: letters, numbers, dots, dashes or underscores.

    at most 60 characters · pattern `^[A-Za-z0-9][A-Za-z0-9._-]*$`

  • textstringrequired

    1-600 characters

  • topicstring | null
  • competencystring | null
  • difficulty"easy" | "medium" | "hard" | null
  • format"open" | "short" | "scenario" | "choice" | null
  • optionsstring[] | null
  • followUpsstring[] | null
  • followUpsRigorousstring[] | null
  • twiststring | null
  • lookForstring[] | null
  • redFlagsstring[] | null
  • anchorsobject | null
    • 1string | null
    • 3string | null
    • 5string | null
  • notestring | null
  • modelAnswerstring | null
  • acceptedstring[] | null
  • marksinteger | null
  • timeSecondsinteger | null
  • criticalboolean | null
  • pinned"first" | "last" | null

SubjectQuestionSet

A named group of questions.

  • idstringrequired

    The item's id within this subject: letters, numbers, dots, dashes or underscores.

  • titlestringrequired
  • descriptionstring
  • questionIdsstring[]required
  • order"fixed" | "shuffled"required

    Left out on a write: fixed.

  • askinteger
  • level"easy" | "medium" | "hard" | "mixed"
  • region"uk" | "us" | "intl"

    The country the content is written for: uk or us, or intl for a law module's version for everywhere outside the UK; left out = anywhere.

  • hiddenboolean
  • formstring
  • intensity"relaxed" | "standard" | "rigorous"
  • assessmentobject
    • mode"scored" | "practice" | "either"
    • passMarknumber
    • timedSecondsinteger
    • feedback"after-each" | "at-end"
    • hintsboolean
    • hintCostnumber
    • review"borderline" | "all"
    • certificateboolean

SubjectQuestionSetInput

A named group of questions.

  • idstring

    The item's id within this subject: letters, numbers, dots, dashes or underscores.

    at most 60 characters · pattern `^[A-Za-z0-9][A-Za-z0-9._-]*$`

  • titlestringrequired

    1-80 characters

  • descriptionstring | null
  • questionIdsstring[]required

    at most 80 items

  • order"fixed" | "shuffled"

    Left out on a write: fixed.

  • askinteger | null
  • level"easy" | "medium" | "hard" | "mixed" | null
  • region"uk" | "us" | "intl" | null
  • hiddenboolean | null
  • formstring | null
  • intensity"relaxed" | "standard" | "rigorous" | null
  • assessmentobject | null
    • mode"scored" | "practice" | "either" | null
    • passMarknumber | null
    • timedSecondsinteger | null
    • feedback"after-each" | "at-end" | null
    • hintsboolean | null
    • hintCostnumber | null
    • review"borderline" | "all" | null
    • certificateboolean | null

SubjectQuestionsTranslate

The language to translate the subject's questions into.

  • languagestringrequired

    A name or code from GET /languages ("German", "es"): the portal's language.

    1-80 characters

SubjectQuestionsTranslated

A draft with the subject's questions in another language, to check and publish.

  • versionintegerrequired

    The draft that holds the translated questions.

  • languagestringrequired

    The language's name.

  • translatedintegerrequired

    How many questions were translated.

SubjectRubric

How conversations are marked. On a write, the fields sent replace theirs.

  • scalenumberrequired
  • categoriesobject[]required

    Weights add up to 1.

    • idstringrequired
    • labelstring
    • weightnumberrequired
    • notestring
    • anchorsmap of string
  • masteredAtnumberrequired
  • criticalobject[]
    • idstringrequired

      The item's id within this subject: letters, numbers, dots, dashes or underscores.

    • labelstringrequired
    • capnumber
    • categoriesmap of number
    • when"beyond_walk_away"

SubjectRubricInput

How conversations are marked. On a write, the fields sent replace theirs.

  • scalenumber
  • categoriesobject[]

    Weights add up to 1.

    at most 50 items

    • idstring

      1-60 characters

    • labelstring | null
    • weightnumberrequired

      0-1

    • notestring | null
    • anchorsmap of string | null
  • masteredAtnumber
  • criticalobject[] | null

SubjectSafetyLines

The organisation's exact safety wording. On a write, the fields sent replace theirs.

  • emergencystring
  • crisisstring
  • childstring
  • domesticAbusestring
  • cannotSpeakstring

SubjectSafetyLinesInput

The organisation's exact safety wording. On a write, the fields sent replace theirs.

  • emergencystring | null
  • crisisstring | null
  • childstring | null
  • domesticAbusestring | null
  • cannotSpeakstring | null

SubjectScenario

A role-play scenario: the avatar plays the counterpart.

  • idstringrequired

    The item's id within this subject: letters, numbers, dots, dashes or underscores.

  • titlestringrequired
  • contextstring

    The situation, shown to the person before they start.

  • counterpartstringrequired

    Who the avatar plays, shown to the person.

  • privatestring

    The counterpart's hidden brief: never shown to the person.

  • goalstringrequired
  • openingstring
  • difficulty"easy" | "medium" | "hard" | "any"required

    Left out on a write: any.

  • skillsstring[]
  • successstring
  • minutesinteger
  • audienceBriefstring
  • audienceQuestionsobject
    • easystring[]required
    • mediumstring[]required
    • hardstring[]required
  • traineeBriefstring
  • sensitiveboolean
  • hiddenboolean

    Kept but never offered: a sensitive situation written for another industry, until it is rewritten for this business and checked.

  • contentNotestring
  • issuesobject[]
    • idstringrequired

      The item's id within this subject: letters, numbers, dots, dashes or underscores.

    • labelstringrequired
    • unitstring
    • better"high" | "low"required

      high = the trainee wants a bigger number; low = a smaller one.

    • targetnumberrequired
    • walkAwaynumberrequired
    • counterpartLimitnumber

      The counterpart's real limit: never shown to the trainee.

    • weightnumber

SubjectScenarioInput

A role-play scenario: the avatar plays the counterpart.

  • idstring

    The item's id within this subject: letters, numbers, dots, dashes or underscores.

    at most 60 characters · pattern `^[A-Za-z0-9][A-Za-z0-9._-]*$`

  • titlestringrequired

    1-80 characters

  • contextstring | null
  • counterpartstringrequired

    Who the avatar plays, shown to the person.

    1-400 characters

  • privatestring | null
  • goalstringrequired

    1-300 characters

  • openingstring | null
  • difficulty"easy" | "medium" | "hard" | "any"

    Left out on a write: any.

  • skillsstring[] | null
  • successstring | null
  • minutesinteger | null
  • audienceBriefstring | null
  • audienceQuestionsobject | null
    • easystring[]required

      at most 8 items

    • mediumstring[]required

      at most 8 items

    • hardstring[]required

      at most 8 items

  • traineeBriefstring | null
  • sensitiveboolean | null
  • hiddenboolean | null
  • contentNotestring | null
  • issuesobject[] | null

SubjectScreening

A candidate screening role. On a write, the fields sent replace theirs.

  • rolestringrequired

    The job title.

  • locationstring
  • introstringrequired

    What candidates read before they start.

  • noticestringrequired
  • capture("name" | "email" | "phone" | "location")[]required
  • requirementsobject[]required
    • idstringrequired

      The item's id within this subject: letters, numbers, dots, dashes or underscores.

    • questionstringrequired

      Asked word for word near the start.

    • kind"yes_no" | "choice" | "number" | "text"required
    • optionsstring[]
    • meetsobject

      The answer that meets it: one of anyOf (yes for yes/no), or a range; left out = recorded, not judged.

      • anyOfstring[]
      • minnumber
      • maxnumber
    • knockoutboolean

      Not meeting it is flagged to the hiring team; a person decides.

    • whystring
  • setIdstring

    The question set the interview uses.

  • uncheckedstring[]

    Questions written for the role by Magic Setup that no person has checked yet: the role can't go live until this is empty. Send [] once they are checked.

  • bandsobjectrequired
    • strongnumberrequired
    • possiblenumberrequired
  • humanContactstringrequired

    Who candidates contact for adjustments or a person instead.

  • adjustmentsstringrequired
  • retentionDaysintegerrequired
  • closesOnstring
  • timingobject
    • mode"open" | "deadline" | "scheduled"required
    • deadlineDaysinteger
    • earlyMinutesinteger
    • lateMinutesinteger
  • recording"transcript" | "audio" | "audio_video"
  • cameraOptionalboolean
  • openDoorboolean
  • intensity"relaxed" | "standard" | "rigorous"
  • style"structured" | "natural"
  • bookingUrlstring
  • hiringForstring
  • outcomeEmailsobject
    • invitestring
    • holdstring
    • declinestring
  • market"us" | "uk" | "eu"
  • usStatestring
  • nycboolean
  • timeZonestring

SubjectScreeningInput

A candidate screening role. On a write, the fields sent replace theirs.

  • rolestring

    The job title.

    2-120 characters

  • locationstring | null
  • introstring

    What candidates read before they start.

    10-1,200 characters

  • noticestring

    10-1,500 characters

  • capture("name" | "email" | "phone" | "location")[]

    at most 4 items

  • requirementsobject[]

    at most 10 items

    • idstring

      The item's id within this subject: letters, numbers, dots, dashes or underscores.

      at most 60 characters · pattern `^[A-Za-z0-9][A-Za-z0-9._-]*$`

    • questionstringrequired

      Asked word for word near the start.

      3-300 characters

    • kind"yes_no" | "choice" | "number" | "text"required
    • optionsstring[] | null
    • meetsobject | null
      • anyOfstring[] | null
      • minnumber | null
      • maxnumber | null
    • knockoutboolean | null
    • whystring | null
  • setIdstring | null
  • uncheckedstring[] | null
  • bandsobject
    • strongnumberrequired

      0-100

    • possiblenumberrequired

      0-100

  • humanContactstring

    Who candidates contact for adjustments or a person instead.

    0-300 characters

  • adjustmentsstring

    5-600 characters

  • retentionDaysinteger

    7-1,461

  • closesOnstring | null
  • timingobject | null
    • mode"open" | "deadline" | "scheduled"required
    • deadlineDaysinteger | null
    • earlyMinutesinteger | null
    • lateMinutesinteger | null
  • recording"transcript" | "audio" | "audio_video" | null
  • cameraOptionalboolean | null
  • openDoorboolean | null
  • intensity"relaxed" | "standard" | "rigorous" | null
  • style"structured" | "natural" | null
  • bookingUrlstring | null
  • hiringForstring | null
  • outcomeEmailsobject | null
    • invitestring | null
    • holdstring | null
    • declinestring | null
  • market"us" | "uk" | "eu" | "US" | "UK" | "EU" | null
  • usStatestring | null
  • nycboolean | null
  • timeZonestring | null

SubjectService

How a website conversation runs. On a write, the fields sent replace theirs.

  • goalstringrequired
  • openingstring
  • outOfHoursOpeningstring
  • helpsWithstring[]
  • capture(string (one of 11))[]required

    The details the avatar may ask a visitor for, with consent.

  • captureRulesmap of string

    How to ask for each detail, by capture field.

  • consentstringrequired
  • privacyNoticeUrlstring
  • neverCollectstring[]
  • handoffstringrequired
  • handoffRulesobject
    • offerAfterUnansweredinteger
    • alwaysHandoffTopicsstring[]
    • urgentTopicsstring[]
    • emergencyTopicsstring[]
    • staffSummarystring
  • bookingboolean
  • bookingRulesstring
  • outOfHoursstring
  • escalateOnstring[]
  • closedScreenstring
  • endobject
    • nextStepsmap of string
    • ratingPromptstring
    • thanksLinestring

SubjectServiceInput

How a website conversation runs. On a write, the fields sent replace theirs.

  • goalstring

    1-300 characters

  • openingstring | null
  • outOfHoursOpeningstring | null
  • helpsWithstring[] | null
  • capture(string (one of 11))[]

    The details the avatar may ask a visitor for, with consent.

    at most 11 items

  • captureRulesmap of string | null
  • consentstring

    1-400 characters

  • privacyNoticeUrlstring (uri) | null
  • neverCollectstring[] | null
  • handoffstring

    1-400 characters

  • handoffRulesobject | null
    • offerAfterUnansweredinteger | null
    • alwaysHandoffTopicsstring[] | null
    • urgentTopicsstring[] | null
    • emergencyTopicsstring[] | null
    • staffSummarystring | null
  • bookingboolean | null
  • bookingRulesstring | null
  • outOfHoursstring | null
  • escalateOnstring[] | null
  • closedScreenstring | null
  • endobject | null
    • nextStepsmap of string | null
    • ratingPromptstring | null
    • thanksLinestring | null

SubjectTopic

A curriculum topic.

  • idstringrequired
  • titlestring
  • descriptionstring
  • gradeany[]

    [lowest, highest] grade, 1 to 12.

  • skillsstring[]required

    The skills this topic trains (the rubric and the start screen refer to them). Left out on a write: kept as they are.

  • prerequisitesstring[]
  • sourceHintstring

    Which of the organisation's documents covers it.

  • keyPointsstring[]

    What the avatar teaches first, in plain language.

  • checkliststring[]
  • region"uk" | "us" | "intl"

    The country the content is written for: uk or us, or intl for a law module's version for everywhere outside the UK; left out = anywhere.

SubjectTopicInput

A curriculum topic.

  • idstring

    1-60 characters

  • titlestring | null
  • descriptionstring | null
  • gradeany[] | null
  • skillsstring[]

    The skills this topic trains (the rubric and the start screen refer to them). Left out on a write: kept as they are.

    at most 50 items

  • prerequisitesstring[] | null
  • sourceHintstring | null
  • keyPointsstring[] | null
  • checkliststring[] | null
  • region"uk" | "us" | "intl" | null

SubjectVersion

A stored version of a subject's content.

  • versionintegerrequired
  • livebooleanrequired
  • draftbooleanrequired

    The pending draft.

  • notestring | nullrequired
  • createdAtstring (date-time)required

    ISO 8601 UTC timestamp.

  • createdByobjectrequired
    • type"user" | "api_key" | "system"required
    • idstring | nullrequired

      usr_… or key_…; null for the system.

SubjectWidget

A website widget's subject: set through PUT /personas/{id}/widget. Read-only here: a write may only send it back as it is.

  • emailstring

    Where visitors' requests are emailed.

SubjectWidgetInput

A website widget's subject: set through PUT /personas/{id}/widget. Read-only here: a write may only send it back as it is.

  • emailstring | null

Transcript

The turn-by-turn transcript.

  • sessionIdstringrequired

    Session id (sess_…).

    pattern `^sess_.*`

  • turnsTranscriptTurn[]required
  • keptbooleanrequired

    True when the turns are the whole transcript; false when the session's subject keeps nothing (no turns).

  • aiGeneratedtruerequired

    Always true: the avatar's video, voice and words are AI-generated (EU AI Act Article 50(2)). Keep this marker with the content when you store or pass it on.

TranscriptFinalData

One finished turn of a session the API started, with its words. Needs includeConversation.

  • sessionIdstring | null
  • role"user" | "assistant" | null
  • textstring | null
  • tsnumber | null

TranscriptTurn

One turn as recorded: ts (when it was stored), speaker for a duo, words with timings when speech recognition gave them.

  • rolestringrequired

    user or assistant (the avatar); a duo's turns carry speaker.

  • textstringrequired
  • aiGeneratedbooleanrequired

    True for the avatar's turns (AI-generated words, EU AI Act Article 50(2)); false for what the person said.

Unit

A class, team or group in the organisation's tree.

  • idstringrequired

    Unit id (unit_…).

    pattern `^unit_.*`

  • parentIdstring | nullrequired

    The unit above it; null at the top level.

  • namestringrequired
  • kindstringrequired

    class, team, group, department, region, school or club.

  • gradeBandstring | nullrequired

    A class's year or grade: the default for learners who join with its code.

  • disabledbooleanrequired

    Switched off (itself or a unit above it): it grants nothing until switched on.

  • joinCodestring | nullrequired

    The code learners join with, where joining by code is on.

  • sortOrderintegerrequired
  • countsobjectrequired
    • membersintegerrequired
    • learnersintegerrequired
    • leadersintegerrequired
    • waitingintegerrequired

      Learners whose place waits for a parent's consent.

  • createdAtstring (date-time)required

    ISO 8601 UTC timestamp.

  • updatedAtstring (date-time)required

    ISO 8601 UTC timestamp.

UnitCreatedData

A unit was created.

  • eventIdstring | null
  • organizationIdstring | null
  • workspaceIdstring | null
  • unitIdstring | null
  • userIdstring | null
  • sessionIdstring | null
  • blueprintVersioninteger | null
  • namestring | null
  • kindstring | null
  • parentIdstring | null
  • leaderUserIdstring | null

UnitDeletedData

A unit was deleted.

  • eventIdstring | null
  • organizationIdstring | null
  • workspaceIdstring | null
  • unitIdstring | null
  • userIdstring | null
  • sessionIdstring | null
  • blueprintVersioninteger | null
  • namestring | null
  • movedTostring | null
  • subTeamsinteger | null
  • portalsinteger | null
  • subjectsinteger | null
  • assignmentsinteger | null
  • membershipsRemovedinteger | null

UnitRenamedData

A unit was renamed.

  • eventIdstring | null
  • organizationIdstring | null
  • workspaceIdstring | null
  • unitIdstring | null
  • userIdstring | null
  • sessionIdstring | null
  • blueprintVersioninteger | null
  • fromstring | null
  • tostring | null
  • duplicateNameboolean | null

UnitSwitchData

A unit switched off or on, with everything below it.

  • eventIdstring | null
  • organizationIdstring | null
  • workspaceIdstring | null
  • unitIdstring | null
  • userIdstring | null
  • sessionIdstring | null
  • blueprintVersioninteger | null
  • namestring | null
  • unitsBelowinteger | null
  • stillOffBecauseOfAParentboolean | null

UnitUpdatedData

A unit was moved or changed.

  • eventIdstring | null
  • organizationIdstring | null
  • workspaceIdstring | null
  • unitIdstring | null
  • userIdstring | null
  • sessionIdstring | null
  • blueprintVersioninteger | null
  • parentIdstring | null
  • sortOrdernumber | null
  • gradeBandstring | null

UnitWritten

A unit as created or changed.

  • idstringrequired

    Unit id (unit_…).

    pattern `^unit_.*`

  • parentIdstring | nullrequired

    The unit above it; null at the top level.

  • namestringrequired
  • kindstringrequired

    class, team, group, department, region, school or club.

  • gradeBandstring | nullrequired

    A class's year or grade: the default for learners who join with its code.

  • disabledbooleanrequired

    Switched off (itself or a unit above it): it grants nothing until switched on.

  • joinCodestring | nullrequired

    The code learners join with, where joining by code is on.

  • sortOrderintegerrequired
  • countsobjectrequired
    • membersintegerrequired
    • learnersintegerrequired
    • leadersintegerrequired
    • waitingintegerrequired

      Learners whose place waits for a parent's consent.

  • createdAtstring (date-time)required

    ISO 8601 UTC timestamp.

  • updatedAtstring (date-time)required

    ISO 8601 UTC timestamp.

  • duplicateNameobject | nullrequired

    Another unit at the same level already has this name (allowed, flagged).

    • idstringrequired

      Unit id (unit_…).

      pattern `^unit_.*`

    • namestringrequired

UpdateMembershipInput

  • role"OWNER" | "ADMIN" | "AVATAR_BUILDER" | "WORKSPACE_ADMIN" | "LEADER" | "LEARNER" | "OBSERVER"

    OWNER (never given or changed through the API), ADMIN, AVATAR_BUILDER, WORKSPACE_ADMIN (these four at the organisation level only), LEADER, LEARNER, OBSERVER.

  • unitIdstring | null
  • gradeBandstring | null
  • ageBand"18+" | null

    "18+" marks an adult learner (a place waiting for consent is switched on); null clears it.

  • status"active" | "disabled"

    Switch this place off or on. A place waiting for consent turns active only through guardian consent.

UpdateSubjectInput

  • namestring

    1-80 characters

  • unitIdstring | null

    The unit it belongs to; null: the organisation level.

  • visitorLanguage"follow" | "listed" | "english" | null

    A website subject only: follow the visitor's language, keep to its languages (listed), or English only; null goes back to the organisation's own setting.

UpdateUnitInput

  • namestring

    1-80 characters

  • parentIdstring | null

    Move it under another unit; null moves it to the top level.

  • sortOrderinteger
  • gradeBandstring | null

    null clears it.

  • disabledboolean

    Switch it (and everything below it) off or on. Nothing is deleted.

UpgradeRequired

A plan refusal for keys on the 2026-07-08 contract. From 2026-10-01 it is an Error with code upgrade_required and details: { feature, plan, limit, reason }.

  • error"upgrade_required"required
  • featurestringrequired
  • planstring | nullrequired
  • messagestringrequired
  • limitnumber
  • reason"plan_required"

    The feature's switch is off because the plan doesn't include it (plan names the plan that does).

Usage

Session time for the period, with the plan and minutes from the account's minutes. There is no overage: when minutes run out, new sessions can't start until more are added.

  • planobjectrequired
    • keystringrequired

      free, starter, plus, pro, business or enterprise.

    • namestringrequired
    • intervalstringrequired

      month or year.

  • unlimitedbooleanrequired

    An unlimited account has no minute counts (the minute fields are null).

  • includedMinutesinteger | nullrequired

    The plan's minutes this cycle.

  • minutesUsednumberrequired

    Session time in the period, in minutes.

  • remainingMinutesinteger | nullrequired

    Every minute the account can still spend: plan, minute packs and bonus.

  • cycleobjectrequired
    • startstring (date-time)required

      ISO 8601 UTC timestamp.

    • endstring (date-time)required

      ISO 8601 UTC timestamp.

  • minutesobject | nullrequired
    • planIncludedintegerrequired
    • planUsedintegerrequired
    • planLeftintegerrequired
    • purchasedLeftintegerrequired

      Minute packs; they never expire.

    • bonusLeftintegerrequired
    • totalLeftintegerrequired
  • periodobjectrequired
    • startstring (date-time)required

      ISO 8601 UTC timestamp.

    • endstring (date-time)required

      ISO 8601 UTC timestamp.

  • sessionCountintegerrequired
  • bySourceobjectrequired
    • portalnumberrequired
    • apinumberrequired
  • byDayobject[]required
    • datestringrequired

      YYYY-MM-DD (UTC).

    • minutesnumberrequired
    • sessionsintegerrequired
  • byPersonaobject[]required
    • personaIdstringrequired

      Persona id (pa_…).

      pattern `^pa_.*`

    • personaNamestringrequired
    • minutesnumberrequired
    • sessionsintegerrequired

UsageThresholdData

The organisation's minutes crossed a warning level.

  • thresholdstring | null
  • minutesLeftnumber | null
  • planMinutesnumber | null
  • planUsedPercentnumber | null
  • renewsOnstring | null

VisitorDetailRemovedData

A website visitor asked for details to be forgotten: which fields to delete from your systems.

  • eventIdstring | null
  • organizationIdstring | null
  • workspaceIdstring | null
  • unitIdstring | null
  • userIdstring | null
  • sessionIdstring | null
  • blueprintVersioninteger | null
  • fieldsstring[] | null

VisitorsDoor

The visitors' door: people come in without signing in.

  • urlstring | nullrequired

    The visitor page to hand out (or the custom domain that leads there); null when no subject opens to visitors.

  • openbooleanrequired

    Visitors can come in now.

  • readinessDoorReadiness | nullrequired

    Null when no subject opens to visitors (a website assistant or a screening role).

  • allowedOriginsstring[]required

    The only websites that may show the visitor page in a frame and start conversations from it; [] = any.

  • scriptstring | nullrequired

    The snippet that puts the visitor page on your website.

VisitorsDoorUpdate

  • allowedOriginsstring[]

    Website addresses (https://www.example.com); [] allows any website again.

    at most 20 items

  • openboolean

    true opens the portal to visitors (needs portals:publish; runs the go-live check on a published portal, and lets outside people in); false closes it.

VisitorSessionEndedData

A website visitor's conversation ended (never a candidate's interview).

  • eventIdstring | null
  • organizationIdstring | null
  • workspaceIdstring | null
  • unitIdstring | null
  • userIdstring | null
  • sessionIdstring | null
  • blueprintVersioninteger | null
  • workspaceNamestring | null
  • minutesnumber | null
  • secondsnumber | null
  • statusstring | null
  • screeningboolean | null
  • typedboolean | null
  • restartedboolean | null
  • withdrawnboolean | null
  • unverifiedboolean | null
  • reapedboolean | null
  • handoffboolean | null
  • bookingboolean | null
  • resolvedboolean | null

Voice

A voice. One voice speaks every language in languages in its own timbre: choose a voice for how it sounds.

  • idstringrequired

    Voice id (vo_…).

    pattern `^vo_.*`

  • namestringrequired
  • languagestringrequired

    Its default language (a catalogue code).

  • languagesstring[]required

    The languages this voice is promised in, as catalogue codes (GET /languages): every catalogue language for a studio voice, the ten marked for duos for a cloned voice. Set the language on the persona or the session, not by choosing another voice.

  • engine"premier" | "global"required

    The voice engine a persona speaking with this voice runs on: global for the studio voices, premier for cloned voices.

  • genderstring | nullrequired

    female or male for a studio voice; null when not known.

  • kind"builtin" | "custom"required

    builtin: a studio voice; custom: your organisation's clone.

  • createdAtstring (date-time)required

    ISO 8601 UTC timestamp.

VoiceCloneCompletedData

A cloned voice is ready to use.

  • voiceIdstring | null
  • namestring | null

VoiceCloneInput

Clone a voice from a short sample, with the consent of the person it belongs to.

  • namestring

    Default "My voice".

  • audioBase64stringrequired

    10 to 60 seconds of clean speech: base64, or a data:audio/… URI (25 MB at most).

  • formatstring

    The sample's format when it isn't in the data URI.

  • consentConsentrequired

    Consent to clone a real person's voice or to make an avatar from their picture. Recorded with who confirmed it (the API key), when, a hashed IP address, the exact wording and its version. The organisation's owners can export records and withdraw them; a withdrawn voice or face stops starting new sessions.

VoiceEngine

A voice engine. The voice decides which one a persona runs on: see Voice.engine.

  • namestringrequired
  • languageCountintegerrequired

    How many catalogue languages this engine's voices are promised in.

  • voiceCloningbooleanrequired
  • defaultbooleanrequired

    The studio voices run on it.

  • notestringrequired

Webhook

A signed webhook. Deliveries: X-Zentiq-Signature: sha256=HMAC(secret, "<X-Zentiq-Timestamp>.<body>"), retried for about two days; never redirected.

  • idstringrequired

    Webhook id (wh_…).

    pattern `^wh_.*`

  • urlstringrequired

    Where deliveries go: a public https address, checked again before every attempt.

  • descriptionstring | nullrequired
  • eventsstring[]required

    The event types it receives; ["*"] = every type except transcript.final, which must be named.

  • includeConversationbooleanrequired

    Send conversation words to this webhook where Zentiq's privacy rules allow them: transcript.final (sessions your app started through the API, and only when named in events), session.ended's and report.produced's summaries, report feedback lines and quotes, a visitor's own words (need, budget, timeline, a lead's answers, a hand-off's summary and reason), a rating's comment, knowledge.gap's questions and case_link.opened's case summary. Never from a child's, a candidate's (any hiring session), a practice, a held or a safety-flagged session. Off by default. Turning it on needs a key holding transcripts:read; every change is recorded in the organisation's activity log. Refused, and off, while the organisation has zero data retention on.

  • activebooleanrequired

    False while switched off, and after three days of failed deliveries (then pausedAt says when).

  • pausedAtstring (date-time) | nullrequired

    When it was paused after failing every delivery for three days; PATCH { active: true } resumes it.

  • apiVersion"2026-07-08" | "2026-10-01"required

    The contract its deliveries are written in (the creating key's; PATCH to move it).

  • createdAtstring (date-time)required

    ISO 8601 UTC timestamp.

  • updatedAtstring (date-time)required

    ISO 8601 UTC timestamp.

WebhookDeleted

  • deletedtruerequired
  • idstringrequired

    Webhook id (wh_…).

    pattern `^wh_.*`

WebhookDelivery

One event's delivery to one webhook, with its last attempt.

  • idstringrequired

    whd_… (sent as X-Zentiq-Delivery-Id). Keys on the 2026-07-08 contract receive the id without its prefix.

  • webhookIdstringrequired

    Webhook id (wh_…).

    pattern `^wh_.*`

  • eventIdstring | nullrequired

    The event delivered (evt_…, the envelope's id); null for deliveries logged before the outbox.

  • eventstringrequired

    The event's type.

  • state"pending" | "retrying" | "delivered" | "failed"required

    pending (the first attempt is under way), retrying (the next attempt is at nextAttemptAt), delivered, failed (no attempt left, or closed: see errorCode).

  • attemptsintegerrequired
  • statusinteger | nullrequired

    The HTTP status of the last attempt; null when none was reached.

  • okbooleanrequired
  • responseMsinteger | nullrequired
  • errorCodestring | nullrequired

    Why the last attempt failed or the delivery closed: http_status, redirect, timeout, network, address_refused, internal_error, webhook_inactive, webhook_paused, unsubscribed, withdrawn, event_gone.

  • nextAttemptAtstring (date-time) | nullrequired
  • createdAtstring (date-time)required

    ISO 8601 UTC timestamp.

WebhookEnvelope

Every webhook's body (2026-10-01). Verify X-Zentiq-Signature before trusting it; de-duplicate by id.

  • idstringrequired

    The event's id (evt_…), stable across retries.

  • typestringrequired
  • apiVersion"2026-07-08" | "2026-10-01"required
  • organizationIdstringrequired

    org_…

  • createdAtstring (date-time)required
  • dataobjectrequired
  • aiGeneratedtrue

    Present, and true, when data carries words an avatar wrote: a summary, a report or an avatar's turn (EU AI Act Article 50(2)). Every contract.

WebhookEvent

The JSON body of every webhook delivery (headers X-Zentiq-Signature, X-Zentiq-Timestamp, X-Zentiq-Event). Every event's data is an allowlist: ids, statuses, timestamps, counts and the organisation's own short names. Conversation words (transcript.final's text, summaries, report feedback and quotes, a visitor's questions and answers, a rating's comment, knowledge.gap's questions) go only to a webhook with includeConversation on, and never from a child's, a candidate's, a practice, a held or a safety-flagged session; without it they are null (transcript.final is not sent). lead.captured, booking.requested and handoff.requested carry the visitor's contact details (captured: name, email, phone, company, role, location, preferred time, reference), their consent and a booking's service and when, for your own CRM; what they described in their own words (captured.need, budget, timeline, a lead's answers, a hand-off's reason) goes only with includeConversation. Never sent: safety flags (safety.flagged is not delivered, and reports carry no flags or flag counts), admin notes, a candidate's scores or bands, results that are held for review, kept from the person or voided (score, percent, passed and marks are null), a practice attempt's score, the minor flag, a session's plan, people's names and notes.

  • idstringrequired
  • typestringrequired
  • createdAtstring (date-time)required
  • dataobjectrequired

WebhookInput

A new webhook.

  • urlstringrequired

    A public https address. Private and local addresses are refused; redirects are never followed.

    at most 2,048 characters

  • eventsstring[]

    Event types, or ["*"] (the default). transcript.final needs includeConversation: true.

    at most 100 items

  • descriptionstring

    at most 200 characters

  • includeConversationboolean

    Send conversation words to this webhook where Zentiq's privacy rules allow them: transcript.final (sessions your app started through the API, and only when named in events), session.ended's and report.produced's summaries, report feedback lines and quotes, a visitor's own words (need, budget, timeline, a lead's answers, a hand-off's summary and reason), a rating's comment, knowledge.gap's questions and case_link.opened's case summary. Never from a child's, a candidate's (any hiring session), a practice, a held or a safety-flagged session. Off by default. Turning it on needs a key holding transcripts:read; every change is recorded in the organisation's activity log. Refused, and off, while the organisation has zero data retention on.

WebhookList

Type: Webhook[]

WebhookPatch

What to change on a webhook; anything left out stays.

  • urlstring

    at most 2,048 characters

  • eventsstring[]

    at most 100 items

  • descriptionstring | null
  • activeboolean

    true resumes a paused webhook (its failing run starts again); false switches it off.

  • apiVersion"2026-07-08" | "2026-10-01"

    Move its deliveries to another contract.

  • includeConversationboolean

    Send conversation words to this webhook where Zentiq's privacy rules allow them: transcript.final (sessions your app started through the API, and only when named in events), session.ended's and report.produced's summaries, report feedback lines and quotes, a visitor's own words (need, budget, timeline, a lead's answers, a hand-off's summary and reason), a rating's comment, knowledge.gap's questions and case_link.opened's case summary. Never from a child's, a candidate's (any hiring session), a practice, a held or a safety-flagged session. Off by default. Turning it on needs a key holding transcripts:read; every change is recorded in the organisation's activity log. Refused, and off, while the organisation has zero data retention on.

WebhookTestData

A test ping, sent only to the webhook it was asked for.

  • eventIdstring | null
  • webhookIdstring | null

WebhookWithSecret

A webhook just made, with its signing secret (shown once).

  • idstringrequired

    Webhook id (wh_…).

    pattern `^wh_.*`

  • urlstringrequired

    Where deliveries go: a public https address, checked again before every attempt.

  • descriptionstring | nullrequired
  • eventsstring[]required

    The event types it receives; ["*"] = every type except transcript.final, which must be named.

  • includeConversationbooleanrequired

    Send conversation words to this webhook where Zentiq's privacy rules allow them: transcript.final (sessions your app started through the API, and only when named in events), session.ended's and report.produced's summaries, report feedback lines and quotes, a visitor's own words (need, budget, timeline, a lead's answers, a hand-off's summary and reason), a rating's comment, knowledge.gap's questions and case_link.opened's case summary. Never from a child's, a candidate's (any hiring session), a practice, a held or a safety-flagged session. Off by default. Turning it on needs a key holding transcripts:read; every change is recorded in the organisation's activity log. Refused, and off, while the organisation has zero data retention on.

  • activebooleanrequired

    False while switched off, and after three days of failed deliveries (then pausedAt says when).

  • pausedAtstring (date-time) | nullrequired

    When it was paused after failing every delivery for three days; PATCH { active: true } resumes it.

  • apiVersion"2026-07-08" | "2026-10-01"required

    The contract its deliveries are written in (the creating key's; PATCH to move it).

  • createdAtstring (date-time)required

    ISO 8601 UTC timestamp.

  • updatedAtstring (date-time)required

    ISO 8601 UTC timestamp.

  • secretstringrequired

    The signing secret: returned once, at creation.

Widget

A persona's website widget.

  • personaIdstringrequired

    Persona id (pa_…).

    pattern `^pa_.*`

  • existsbooleanrequired

    The widget has been set up (the first PUT makes it).

  • onbooleanrequired

    Switched on.

  • livebooleanrequired

    Switched on and showing: its public door is open and it has websites to show on.

  • lookWidgetLookrequired

    How the widget shows on your pages.

  • labelstringrequired

    The button's words as visitors see them.

  • allowedOriginsstring[]required

    The websites that may show it (every other website gets nothing).

  • requestEmailstring | nullrequired

    Where visitors' messages and requests go.

  • templatestring | nullrequired

    What its conversations are set up as: support-agent or receptionist.

  • stepsWidgetStep[]required

    What it needs before it goes live, in order.

  • documentsintegerrequired

    Documents it answers from (the persona's knowledge).

  • answersintegerrequired

    Approved answers of its own.

  • publicIdstring | nullrequired

    The widget's public id (<organisation>/w-…): all the snippet names.

  • snippetstring | nullrequired

    The code to paste into your pages, as the layout needs it.

  • configUrlstring | nullrequired

    Where a website reads the widget's public settings (for your own button).

  • portalIdstring | nullrequired

    Its hidden website-assistant portal (never listed by GET /portals).

  • subjectIdstring | nullrequired

    Its subject: edit its answers through /subjects/{id}/content.

  • outOfDatebooleanrequired

    The persona's first line or languages changed since the widget was saved; any PUT brings them over.

WidgetInput

What to change; the first PUT makes the widget. What isn't sent stays as it is.

  • purpose"support" | "reception"

    What its conversations are set up as when it is first made: support (a support agent) or reception (a receptionist).

  • layout"floating" | "inline"

    floating (a button in a corner) or inline (inside your page).

  • initialState"minimized" | "expanded"

    minimized or expanded ("minimised" is read too).

  • position"bottom-right" | "top-right" | "bottom-left" | "top-left"

    A floating widget's corner ("right" and "left" read as the bottom ones).

  • labelstring | null

    The button's words (null or "" for "Talk to <name>").

    at most 40 characters

  • accentstring

    The button's colour, #rrggbb.

  • start"voice" | "chat"

    The panel opens ready to talk (voice) or to type (chat).

  • allowedOriginsstring[]

    Replaces the websites that may show it, such as https://www.example.com (20 at most).

    at most 20 items

  • requestEmailstring | null

    Where visitors' messages and requests go; null clears it.

  • onboolean

    Switch it on (needs the portals:publish scope and what steps lists) or off (its door closes at once).

WidgetLook

How the widget shows on your pages.

  • layout"floating" | "inline"required

    floating: a button in a corner of every page; inline: the panel inside an element of your page.

  • initialState"minimized" | "expanded"required

    minimized: the button only until a visitor clicks; expanded: the panel opens with the page (nothing listens until a visitor presses Talk).

  • position"bottom-right" | "top-right" | "bottom-left" | "top-left"required

    The corner a floating widget sits in.

  • labelstringrequired

    The button's own words; "" for "Talk to <name>".

  • accentstringrequired

    The button's colour, #rrggbb.

  • start"voice" | "chat"required

    The panel opens ready to talk, or ready to type.

WidgetSaved

The widget as saved.

  • personaIdstringrequired

    Persona id (pa_…).

    pattern `^pa_.*`

  • existsbooleanrequired

    The widget has been set up (the first PUT makes it).

  • onbooleanrequired

    Switched on.

  • livebooleanrequired

    Switched on and showing: its public door is open and it has websites to show on.

  • lookWidgetLookrequired

    How the widget shows on your pages.

  • labelstringrequired

    The button's words as visitors see them.

  • allowedOriginsstring[]required

    The websites that may show it (every other website gets nothing).

  • requestEmailstring | nullrequired

    Where visitors' messages and requests go.

  • templatestring | nullrequired

    What its conversations are set up as: support-agent or receptionist.

  • stepsWidgetStep[]required

    What it needs before it goes live, in order.

  • documentsintegerrequired

    Documents it answers from (the persona's knowledge).

  • answersintegerrequired

    Approved answers of its own.

  • publicIdstring | nullrequired

    The widget's public id (<organisation>/w-…): all the snippet names.

  • snippetstring | nullrequired

    The code to paste into your pages, as the layout needs it.

  • configUrlstring | nullrequired

    Where a website reads the widget's public settings (for your own button).

  • portalIdstring | nullrequired

    Its hidden website-assistant portal (never listed by GET /portals).

  • subjectIdstring | nullrequired

    Its subject: edit its answers through /subjects/{id}/content.

  • outOfDatebooleanrequired

    The persona's first line or languages changed since the widget was saved; any PUT brings them over.

  • saidstringrequired

    What happened, in one sentence.

WidgetStep

One thing the widget needs before it can go live.

  • key"websites" | "email" | "knowledge" | "organisation" | "setup"required
  • donebooleanrequired
  • titlestringrequired
  • fixstringrequired

    What to do, in one sentence; "" when done.

WidgetUpdatedData

A persona's website widget was switched on or off, or changed.

  • eventIdstring | null
  • organizationIdstring | null
  • workspaceIdstring | null
  • unitIdstring | null
  • userIdstring | null
  • sessionIdstring | null
  • blueprintVersioninteger | null
  • personaIdstring | null
  • onboolean | null
  • liveboolean | null

WorkspaceCreatedData

A subject was created.

  • eventIdstring | null
  • organizationIdstring | null
  • workspaceIdstring | null
  • unitIdstring | null
  • userIdstring | null
  • sessionIdstring | null
  • blueprintVersioninteger | null
  • namestring | null
  • blueprintKeystring | null

WorkspacePublishedData

A subject's version went live.

  • eventIdstring | null
  • organizationIdstring | null
  • workspaceIdstring | null
  • unitIdstring | null
  • userIdstring | null
  • sessionIdstring | null
  • blueprintVersioninteger | null
  • versioninteger | null