Results
Results, reports, certificates and completion records.
/v1/results/{id}Get a result
Numbers follow the released rule: nothing while a reviewer still decides a scored attempt or the organisation shares results through a person only, nothing for a void, the reviewer's decision once decided. A practice attempt is the person's own and is never listed; a candidate's interview or any other job interview isn't a result here.
Path parameters
idstringrequiredResult id (
res_…); the id without its prefix is accepted too.
Returns
200 The result. data is Result.
Fields of data
idstringrequiredres_+ the session's id.pattern `^res_.*`
sessionIdstring | nullrequiredportalIdstring | nullrequiredThe portal it was started from (
portal_…; bare for keys on 2026-07-08).subjectIdstring | nullrequiredsub_…(bare for keys on 2026-07-08).subjectNamestring | nullrequiredkindstring | nullrequiredWhat the subject is: assessor, roleplay, tutor, …
personobject | nullrequiredidstringrequiredPerson id (
usr_…).pattern `^usr_.*`
externalIdstring | nullrequiredYour own id for them; only for a key holding people:read.
unitIdstring | nullrequiredstartedAtstring (date-time) | nullrequiredendedAtstring (date-time) | nullrequireddurationSecondsinteger | nullrequiredscoredbooleanrequiredA scored attempt (an assessment); its numbers follow the released rule.
release"not_scored" | "awaiting_review" | "reviewers_only" | "voided" | "released"requirednot_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 | nullrequired0-100: the released percent of a scored attempt, else the report's overall. Null while not released.
percentnumber | nullrequiredpassedboolean | nullrequiredpassMarknumber | nullrequiredscenarioobject | nullrequiredidstringrequiredtitlestringrequired
questionSetobject | nullrequiredidstringrequiredtitlestringrequired
difficultystring | nullrequiredcategoriesobject[]requiredThe rubric's categories with evidence, 0-100. Empty while not released.
idstringrequiredlabelstringrequiredscorenumberrequired
reviewobject | nullrequiredA reviewer's decision; null while the result is held for a reviewer or kept from the person (it would say pass or fail).
decisionstring | nullrequiredconfirm, pass, not_yet or void.
decidedAtstring (date-time)requiredISO 8601 UTC timestamp.
reviewerobject | nullrequiredidstringrequiredPerson id (
usr_…).pattern `^usr_.*`
correctedbooleanrequiredThe reviewer corrected marks.
contestobject | nullrequiredThe person asked for another look (never their words).
atstring (date-time)requiredISO 8601 UTC timestamp.
openbooleanrequired
certificateobject | nullrequiredThe certificate; null while the result is held for a reviewer or kept from the person.
idstringrequiredCertificate id (
cert_…).pattern `^cert_.*`
numberstringrequiredstatus"valid" | "expired" | "withdrawn"requiredvalidUntilstring | nullrequiredverifyUrlstringrequired
completionobject | nullrequiredThe completion record; null while the result is held for a reviewer or kept from the person.
status"recorded" | "withdrawn"requiredatstring (date-time)requiredISO 8601 UTC timestamp.
reportAvailablebooleanrequiredA written report exists (GET /results/{id}/report, with transcripts:read, where the rules allow the words).
erasedbooleanrequiredThe retention job took the conversation's words out.
updatedAtstring (date-time)requiredISO 8601 UTC timestamp.
Errors
invalid_requestunauthorizedforbiddenupgrade_requirednot_foundrate_limitedserver_error
Request
curl "https://app.zentiqai.com/v1/results/res_123" \
-H "Authorization: Bearer $ZENTIQ_API_KEY"import { Zentiq } from "@zentiq/node";
const zentiq = new Zentiq({ apiKey: process.env.ZENTIQ_API_KEY });
const result = await zentiq.getResult("res_123");import os
from zentiq import Zentiq
zentiq = Zentiq(api_key=os.environ["ZENTIQ_API_KEY"])
result = zentiq.get_result("res_123")Example answer
{
"data": {
"id": "res_cmfq2b7x10000abcd1234",
"sessionId": "sess_cmfq2b7x10000abcd1234",
"portalId": "portal_cmfq2b7x10000abcd1234",
"subjectId": "sub_cmfq2b7x10000abcd1234",
"subjectName": "…",
"kind": "roleplay"
},
"error": null,
"requestId": "req_4f1c2e9a7b3d5e6f7a8b9c0d"
}/v1/results/{id}/reportA result's written report
The report's words: its summary, strengths, what to work on and the next step. Only where the conversation itself may be read (never a young learner's, nor a website visitor's who said they are under 18: 403 learner_conversation), once the result is released; a subject that keeps nothing has no words.
Path parameters
idstringrequiredResult id (
res_…); the id without its prefix is accepted too.
Returns
200 The report's words. data is ResultReport.
Fields of data
resultIdstringrequiredResult id (
res_…).pattern `^res_.*`
summarystring | nullrequiredstrengthsstring[]requiredworkOnstring[]requirednextstring | nullrequired
Errors
invalid_requestunauthorizedforbiddenupgrade_requiredcandidate_interviewlearner_conversationnot_foundrate_limitedserver_error
Request
curl "https://app.zentiqai.com/v1/results/res_123/report" \
-H "Authorization: Bearer $ZENTIQ_API_KEY"import { Zentiq } from "@zentiq/node";
const zentiq = new Zentiq({ apiKey: process.env.ZENTIQ_API_KEY });
const result = await zentiq.getResultReport("res_123");import os
from zentiq import Zentiq
zentiq = Zentiq(api_key=os.environ["ZENTIQ_API_KEY"])
result = zentiq.get_result_report("res_123")Example answer
{
"data": {
"resultId": "res_cmfq2b7x10000abcd1234",
"summary": "…",
"strengths": [
"…"
],
"workOn": [
"…"
],
"next": "…"
},
"error": null,
"requestId": "req_4f1c2e9a7b3d5e6f7a8b9c0d"
}/v1/resultsList results
Newest first. Numbers follow the released rule: nothing while a reviewer still decides a scored attempt or the organisation shares results through a person only, nothing for a void, the reviewer's decision once decided. A practice attempt is the person's own and is never listed; a candidate's interview or any other job interview isn't a result here. updatedAfter lists what changed since (a review, a certificate, a completion): for syncing.
Query parameters
limitintegerPage size, 1-200 (default 50).
cursorstringportalIdstringPortal id (
portal_…).subjectIdstringSubject id (
sub_…).unitIdstringUnit id (
unit_…).personIdstringPerson id (
usr_…).externalUserIdstringThe person you know by this id (needs
people:read).release"not_scored" | "awaiting_review" | "reviewers_only" | "voided" | "released"passed"true" | "false"fromstringReported at or after.
tostringReported before.
updatedAfterstringChanged since (a report, a review, a contest, a certificate, a completion): for syncing.
Returns
200 A page of results. A page: data is a list of Result, and nextCursor fetches the next page.
Fields of data
idstringrequiredres_+ the session's id.pattern `^res_.*`
sessionIdstring | nullrequiredportalIdstring | nullrequiredThe portal it was started from (
portal_…; bare for keys on 2026-07-08).subjectIdstring | nullrequiredsub_…(bare for keys on 2026-07-08).subjectNamestring | nullrequiredkindstring | nullrequiredWhat the subject is: assessor, roleplay, tutor, …
personobject | nullrequiredidstringrequiredPerson id (
usr_…).pattern `^usr_.*`
externalIdstring | nullrequiredYour own id for them; only for a key holding people:read.
unitIdstring | nullrequiredstartedAtstring (date-time) | nullrequiredendedAtstring (date-time) | nullrequireddurationSecondsinteger | nullrequiredscoredbooleanrequiredA scored attempt (an assessment); its numbers follow the released rule.
release"not_scored" | "awaiting_review" | "reviewers_only" | "voided" | "released"requirednot_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 | nullrequired0-100: the released percent of a scored attempt, else the report's overall. Null while not released.
percentnumber | nullrequiredpassedboolean | nullrequiredpassMarknumber | nullrequiredscenarioobject | nullrequiredidstringrequiredtitlestringrequired
questionSetobject | nullrequiredidstringrequiredtitlestringrequired
difficultystring | nullrequiredcategoriesobject[]requiredThe rubric's categories with evidence, 0-100. Empty while not released.
idstringrequiredlabelstringrequiredscorenumberrequired
reviewobject | nullrequiredA reviewer's decision; null while the result is held for a reviewer or kept from the person (it would say pass or fail).
decisionstring | nullrequiredconfirm, pass, not_yet or void.
decidedAtstring (date-time)requiredISO 8601 UTC timestamp.
reviewerobject | nullrequiredidstringrequiredPerson id (
usr_…).pattern `^usr_.*`
correctedbooleanrequiredThe reviewer corrected marks.
contestobject | nullrequiredThe person asked for another look (never their words).
atstring (date-time)requiredISO 8601 UTC timestamp.
openbooleanrequired
certificateobject | nullrequiredThe certificate; null while the result is held for a reviewer or kept from the person.
idstringrequiredCertificate id (
cert_…).pattern `^cert_.*`
numberstringrequiredstatus"valid" | "expired" | "withdrawn"requiredvalidUntilstring | nullrequiredverifyUrlstringrequired
completionobject | nullrequiredThe completion record; null while the result is held for a reviewer or kept from the person.
status"recorded" | "withdrawn"requiredatstring (date-time)requiredISO 8601 UTC timestamp.
reportAvailablebooleanrequiredA written report exists (GET /results/{id}/report, with transcripts:read, where the rules allow the words).
erasedbooleanrequiredThe retention job took the conversation's words out.
updatedAtstring (date-time)requiredISO 8601 UTC timestamp.
Errors
invalid_requestunauthorizedforbiddenupgrade_requiredrate_limitedserver_error
Request
curl "https://app.zentiqai.com/v1/results?limit=20" \
-H "Authorization: Bearer $ZENTIQ_API_KEY"import { Zentiq } from "@zentiq/node";
const zentiq = new Zentiq({ apiKey: process.env.ZENTIQ_API_KEY });
const page = await zentiq.listResults({
limit: 20,
});import os
from zentiq import Zentiq
zentiq = Zentiq(api_key=os.environ["ZENTIQ_API_KEY"])
page = zentiq.list_results(limit=20)Example answer
{
"data": [
{
"id": "res_cmfq2b7x10000abcd1234",
"sessionId": "sess_cmfq2b7x10000abcd1234",
"portalId": "portal_cmfq2b7x10000abcd1234",
"subjectId": "sub_cmfq2b7x10000abcd1234",
"subjectName": "…",
"kind": "roleplay"
}
],
"error": null,
"requestId": "req_4f1c2e9a7b3d5e6f7a8b9c0d",
"nextCursor": null
}