Assignments
Assigned work.
/v1/assignmentsList assignments
Work set in the organization, newest first, with how many learners are at each state. Read one for every learner's state.
Query parameters
limitintegerPage size, 1-200 (default 50).
cursorstringThe
nextCursorof the previous page.subjectIdstringOnly work in this subject.
unitIdstringOnly work set for this class or team.
personIdstringOnly work set for this learner.
Returns
200 A page of assignments. A page: data is a list of Assignment, and nextCursor fetches the next page.
Fields of data
idstringrequiredAssignment id (
asg_…).pattern `^asg_.*`
subjectIdstringrequiredThe subject it is in (
sub_…; bare for keys on 2026-07-08).unitIdstring | nullrequiredThe class or team it was set for (everyone in it and below); null when set for named learners.
titlestringrequiredinstructionsstring | nullrequiredskillsstring[]requiredThe subject's skill ids it covers.
focusAssignmentFocus | nullrequiredThe topic, question set or scenario; null: anything in the subject.
difficulty"easy" | "medium" | "hard" | nullrequiredThe level a session must be at, or harder; null: any.
targetinteger | nullrequiredThe score (1-100) a session must reach; null: none.
minutesinteger | nullrequiredMinutes of counting sessions it asks for; null: one counting session.
dueAtstring (date-time) | nullrequiredcreatedByobjectrequiredWho set it: a member, an API key, or the tutor's own suggestion.
kind"member" | "api_key" | "tutor"requiredidstring | nullrequiredThe person (
usr_…) or the API key (key_…); null for the tutor.
countsobjectrequiredassignedintegerrequiredstartedintegerrequiredcompletedintegerrequiredoverdueintegerrequiredNot completed by the due date.
createdAtstring (date-time)requiredISO 8601 UTC timestamp.
updatedAtstring (date-time)requiredISO 8601 UTC timestamp.
Errors
invalid_requestunauthorizedforbiddenupgrade_requiredrate_limitedserver_error
Request
curl "https://app.zentiqai.com/v1/assignments?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.listAssignments({
limit: 20,
});import os
from zentiq import Zentiq
zentiq = Zentiq(api_key=os.environ["ZENTIQ_API_KEY"])
page = zentiq.list_assignments(limit=20)Response
{
"data": [
{
"id": "asg_cmfq2b7x10000abcd1234",
"subjectId": "sub_cmfq2b7x10000abcd1234",
"unitId": "unit_cmfq2b7x10000abcd1234",
"title": "…",
"instructions": "…",
"skills": [
"…"
]
}
],
"error": null,
"requestId": "req_4f1c2e9a7b3d5e6f7a8b9c0d",
"nextCursor": null
}/v1/assignmentsSet work
For a class or team (unitId: everyone in it and below) or for named learners (personIds), in one subject. An API key sets work for any class, team or learner in the organization, as an owner or admin does in the console. Named learners must hold a learner's place in the organization (400 invalid_request otherwise). The focus, difficulty and target must be ones the subject offers (400 invalid_request otherwise). Refused on a unit that is switched off, or where homework is switched off (409 conflict, details.reason). Each learner's state then moves on its own: started when they begin a session in the subject, completed when what they did meets the assignment (an assessment's on a confirmed pass).
Body
subjectIdstringrequiredThe subject the work is in.
titlestringrequired1-120 characters
instructionsstring | nullunitIdstring | nullSet it for a class or team: every learner in it and below.
personIdsstring[] | nullOr for named learners (up to 500), each holding a learner's place here.
skillsstring[] | nullThe subject's skill ids it covers.
minutesinteger | nullMinutes of counting sessions it asks for.
dueAtstring | nullfocusobject | nullOne of the subject's topics, question sets or scenarios, by id.
idstringrequired1-80 characters
difficulty"easy" | "medium" | "hard" | nullOnly where the subject has levels.
targetinteger | nullA target score, where one fits the subject (role-plays, and tutors that give a score).
Returns
201 The assignment, with every learner it was set for. data is AssignmentWithLearners.
Fields of data
idstringrequiredAssignment id (
asg_…).pattern `^asg_.*`
subjectIdstringrequiredThe subject it is in (
sub_…; bare for keys on 2026-07-08).unitIdstring | nullrequiredThe class or team it was set for (everyone in it and below); null when set for named learners.
titlestringrequiredinstructionsstring | nullrequiredskillsstring[]requiredThe subject's skill ids it covers.
focusAssignmentFocus | nullrequiredThe topic, question set or scenario; null: anything in the subject.
difficulty"easy" | "medium" | "hard" | nullrequiredThe level a session must be at, or harder; null: any.
targetinteger | nullrequiredThe score (1-100) a session must reach; null: none.
minutesinteger | nullrequiredMinutes of counting sessions it asks for; null: one counting session.
dueAtstring (date-time) | nullrequiredcreatedByobjectrequiredWho set it: a member, an API key, or the tutor's own suggestion.
kind"member" | "api_key" | "tutor"requiredidstring | nullrequiredThe person (
usr_…) or the API key (key_…); null for the tutor.
countsobjectrequiredassignedintegerrequiredstartedintegerrequiredcompletedintegerrequiredoverdueintegerrequiredNot completed by the due date.
createdAtstring (date-time)requiredISO 8601 UTC timestamp.
updatedAtstring (date-time)requiredISO 8601 UTC timestamp.
learnersobject[]requiredEvery learner it was set for, with where they are.
personIdstringrequiredPerson id (
usr_…).pattern `^usr_.*`
state"assigned" | "started" | "completed" | "overdue"requiredassigned, started, completed, or overdue (not completed by the due date).
minutesDoneintegerrequiredMinutes spent in sessions that count towards it.
startedAtstring (date-time) | nullrequiredcompletedAtstring (date-time) | nullrequired
Errors
invalid_requestunauthorizedforbiddenupgrade_requirednot_foundconflictidempotency_conflictidempotency_in_progressrate_limitedserver_errorcapacity
Events
Request
curl -X POST "https://app.zentiqai.com/v1/assignments" \
-H "Authorization: Bearer $ZENTIQ_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"subjectId": "…",
"title": "…"
}'import { Zentiq } from "@zentiq/node";
const zentiq = new Zentiq({ apiKey: process.env.ZENTIQ_API_KEY });
const result = await zentiq.createAssignment({
subjectId: "…",
title: "…",
});import os
from zentiq import Zentiq
zentiq = Zentiq(api_key=os.environ["ZENTIQ_API_KEY"])
result = zentiq.create_assignment({
"subjectId": "…",
"title": "…",
})Response
{
"data": {
"id": "asg_cmfq2b7x10000abcd1234",
"subjectId": "sub_cmfq2b7x10000abcd1234",
"unitId": "unit_cmfq2b7x10000abcd1234",
"title": "…",
"instructions": "…",
"skills": [
"…"
]
},
"error": null,
"requestId": "req_4f1c2e9a7b3d5e6f7a8b9c0d"
}/v1/assignments/{id}Get an assignment
With every learner it was set for and where they are (learners by id; their names are read with people:read).
Path parameters
idstringrequiredAssignment id (
asg_…); the id without its prefix is accepted too.
Returns
200 The assignment. data is AssignmentWithLearners.
Fields of data
idstringrequiredAssignment id (
asg_…).pattern `^asg_.*`
subjectIdstringrequiredThe subject it is in (
sub_…; bare for keys on 2026-07-08).unitIdstring | nullrequiredThe class or team it was set for (everyone in it and below); null when set for named learners.
titlestringrequiredinstructionsstring | nullrequiredskillsstring[]requiredThe subject's skill ids it covers.
focusAssignmentFocus | nullrequiredThe topic, question set or scenario; null: anything in the subject.
difficulty"easy" | "medium" | "hard" | nullrequiredThe level a session must be at, or harder; null: any.
targetinteger | nullrequiredThe score (1-100) a session must reach; null: none.
minutesinteger | nullrequiredMinutes of counting sessions it asks for; null: one counting session.
dueAtstring (date-time) | nullrequiredcreatedByobjectrequiredWho set it: a member, an API key, or the tutor's own suggestion.
kind"member" | "api_key" | "tutor"requiredidstring | nullrequiredThe person (
usr_…) or the API key (key_…); null for the tutor.
countsobjectrequiredassignedintegerrequiredstartedintegerrequiredcompletedintegerrequiredoverdueintegerrequiredNot completed by the due date.
createdAtstring (date-time)requiredISO 8601 UTC timestamp.
updatedAtstring (date-time)requiredISO 8601 UTC timestamp.
learnersobject[]requiredEvery learner it was set for, with where they are.
personIdstringrequiredPerson id (
usr_…).pattern `^usr_.*`
state"assigned" | "started" | "completed" | "overdue"requiredassigned, started, completed, or overdue (not completed by the due date).
minutesDoneintegerrequiredMinutes spent in sessions that count towards it.
startedAtstring (date-time) | nullrequiredcompletedAtstring (date-time) | nullrequired
Errors
invalid_requestunauthorizedforbiddenupgrade_requirednot_foundrate_limitedserver_error
Request
curl "https://app.zentiqai.com/v1/assignments/asg_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.getAssignment("asg_123");import os
from zentiq import Zentiq
zentiq = Zentiq(api_key=os.environ["ZENTIQ_API_KEY"])
result = zentiq.get_assignment("asg_123")Response
{
"data": {
"id": "asg_cmfq2b7x10000abcd1234",
"subjectId": "sub_cmfq2b7x10000abcd1234",
"unitId": "unit_cmfq2b7x10000abcd1234",
"title": "…",
"instructions": "…",
"skills": [
"…"
]
},
"error": null,
"requestId": "req_4f1c2e9a7b3d5e6f7a8b9c0d"
}/v1/assignments/{id}Change an assignment
Its title, instructions, due date or minutes; null clears the instructions, the due date or the minutes. A due date already gone is refused. Who it is for and what counts towards it stay as set: delete it and set it again to change those.
Path parameters
idstringrequiredAssignment id (
asg_…); the id without its prefix is accepted too.
Body
titlestring1-120 characters
instructionsstring | nullnull clears them.
dueAtstring | nullnull clears it. A date already gone is refused.
minutesinteger | nullnull clears it.
Returns
200 The assignment. data is AssignmentWithLearners.
Fields of data
idstringrequiredAssignment id (
asg_…).pattern `^asg_.*`
subjectIdstringrequiredThe subject it is in (
sub_…; bare for keys on 2026-07-08).unitIdstring | nullrequiredThe class or team it was set for (everyone in it and below); null when set for named learners.
titlestringrequiredinstructionsstring | nullrequiredskillsstring[]requiredThe subject's skill ids it covers.
focusAssignmentFocus | nullrequiredThe topic, question set or scenario; null: anything in the subject.
difficulty"easy" | "medium" | "hard" | nullrequiredThe level a session must be at, or harder; null: any.
targetinteger | nullrequiredThe score (1-100) a session must reach; null: none.
minutesinteger | nullrequiredMinutes of counting sessions it asks for; null: one counting session.
dueAtstring (date-time) | nullrequiredcreatedByobjectrequiredWho set it: a member, an API key, or the tutor's own suggestion.
kind"member" | "api_key" | "tutor"requiredidstring | nullrequiredThe person (
usr_…) or the API key (key_…); null for the tutor.
countsobjectrequiredassignedintegerrequiredstartedintegerrequiredcompletedintegerrequiredoverdueintegerrequiredNot completed by the due date.
createdAtstring (date-time)requiredISO 8601 UTC timestamp.
updatedAtstring (date-time)requiredISO 8601 UTC timestamp.
learnersobject[]requiredEvery learner it was set for, with where they are.
personIdstringrequiredPerson id (
usr_…).pattern `^usr_.*`
state"assigned" | "started" | "completed" | "overdue"requiredassigned, started, completed, or overdue (not completed by the due date).
minutesDoneintegerrequiredMinutes spent in sessions that count towards it.
startedAtstring (date-time) | nullrequiredcompletedAtstring (date-time) | nullrequired
Errors
invalid_requestunauthorizedforbiddenupgrade_requirednot_foundrate_limitedserver_error
Events
Request
curl -X PATCH "https://app.zentiqai.com/v1/assignments/asg_123" \
-H "Authorization: Bearer $ZENTIQ_API_KEY" \
-H "Content-Type: application/json" \
-d '{}'import { Zentiq } from "@zentiq/node";
const zentiq = new Zentiq({ apiKey: process.env.ZENTIQ_API_KEY });
const result = await zentiq.updateAssignment("asg_123", {});import os
from zentiq import Zentiq
zentiq = Zentiq(api_key=os.environ["ZENTIQ_API_KEY"])
result = zentiq.update_assignment("asg_123", {})Response
{
"data": {
"id": "asg_cmfq2b7x10000abcd1234",
"subjectId": "sub_cmfq2b7x10000abcd1234",
"unitId": "unit_cmfq2b7x10000abcd1234",
"title": "…",
"instructions": "…",
"skills": [
"…"
]
},
"error": null,
"requestId": "req_4f1c2e9a7b3d5e6f7a8b9c0d"
}/v1/assignments/{id}Delete an assignment
Withdraws the work: it and every learner's state on it go. Sessions, results and reports stay.
Path parameters
idstringrequiredAssignment id (
asg_…); the id without its prefix is accepted too.
Returns
200 Deleted. data is object.
Fields of data
deletedtruerequiredidstringrequiredAssignment id (
asg_…).pattern `^asg_.*`
Errors
invalid_requestunauthorizedforbiddenupgrade_requirednot_foundrate_limitedserver_error
Events
Request
curl -X DELETE "https://app.zentiqai.com/v1/assignments/asg_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.deleteAssignment("asg_123");import os
from zentiq import Zentiq
zentiq = Zentiq(api_key=os.environ["ZENTIQ_API_KEY"])
result = zentiq.delete_assignment("asg_123")Response
{
"data": {
"deleted": true,
"id": "asg_cmfq2b7x10000abcd1234"
},
"error": null,
"requestId": "req_4f1c2e9a7b3d5e6f7a8b9c0d"
}