Works
Works, steps and brand tasks.
Privacy and analytics
We use necessary technical cookies and, only with your consent, analytics and marketing pixels to improve the website and measure campaigns.
Works, steps and brand tasks.
Works of the brand with status, progress and how many tasks wait for the brand. A work is a larger job with several steps; a task is one bounded step.
| Field | Value |
|---|---|
| Kind | Read |
| HTTP method | POST /api/v1/works.list |
| MCP tool | works_list |
| Scope | works.read |
| Minimum role | Viewer |
| Human confirmation | No |
| Doors | Nödo, Voice, MCP, API |
| Status | Available |
| Widget | list |
Input
{
status?: "active" | "finished" | "archived" | "all" // default "active"
cursor?: string // ≤ 512 · Opaque cursor from a previous `nextCursor`.
limit?: integer // 1–50 · default 20
}Output
{
items: Array<{
id: string // uuid
name: string
status: string
dueDate: string | null
progress: {
done: integer // -9007199254740991–9007199254740991
total: integer // -9007199254740991–9007199254740991
}
waitingOnBrand: integer // -9007199254740991–9007199254740991 · Tasks waiting for the brand.
}>
nextCursor: string | null
}One work with its steps and who holds each one. detailed adds deliverables and answers; keep concise unless you need them.
| Field | Value |
|---|---|
| Kind | Read |
| HTTP method | POST /api/v1/works.get |
| MCP tool | works_get |
| Scope | works.read |
| Minimum role | Viewer |
| Human confirmation | No |
| Doors | Nödo, Voice, MCP, API |
| Status | Planned |
| Widget | record |
Input
{
workId: string // uuid
format?: "concise" | "detailed" // default "concise" · `concise` returns names and states only; `detailed` adds ids and full fields.
}Output
{
id: string // uuid
name: string
status: string
dueDate: string | null
progress: {
done: integer // -9007199254740991–9007199254740991
total: integer // -9007199254740991–9007199254740991
}
waitingOnBrand: integer // -9007199254740991–9007199254740991 · Tasks waiting for the brand.
steps: Array<{
id: string // uuid
title: string
status: string
kind: "questionnaire" | "files" | "review" | "information"
dueDate: string | null
owner: "brand" | "nomad"
}>
}Tasks waiting for the brand across all works, most urgent first. Use it to answer "what do I have pending?".
| Field | Value |
|---|---|
| Kind | Read |
| HTTP method | POST /api/v1/works.tasks.pending |
| MCP tool | works_tasks_pending |
| Scope | works.read |
| Minimum role | Viewer |
| Human confirmation | No |
| Doors | Nödo, Voice, MCP, API |
| Status | Planned |
| Widget | list |
Input
{
cursor?: string // ≤ 512 · Opaque cursor from a previous `nextCursor`.
limit?: integer // 1–50 · default 20
}Output
{
items: Array<{
id: string // uuid
workId: string // uuid
workName: string
title: string
status: string
kind: "questionnaire" | "files" | "review" | "information"
dueDate: string | null
}>
nextCursor: string | null
}One task with its questionnaire (the snapshot contracted with the work), saved draft answers and deliverables to review.
| Field | Value |
|---|---|
| Kind | Read |
| HTTP method | POST /api/v1/works.tasks.get |
| MCP tool | works_tasks_get |
| Scope | works.read |
| Minimum role | Viewer |
| Human confirmation | No |
| Doors | Nödo, Voice, MCP, API |
| Status | Planned |
| Widget | form |
Input
{
taskId: string // uuid
}Output
{
id: string // uuid
workId: string // uuid
workName: string
title: string
status: string
kind: "questionnaire" | "files" | "review" | "information"
dueDate: string | null
questions: Array<{
id: string
label: string
type: string
required: boolean
options?: string[]
}>
draft: Array<{
questionId: string
value: string | number | boolean | string[]
}>
deliverables: Array<{
assetId: string // uuid
name: string
version: integer // -9007199254740991–9007199254740991
}>
revision: integer // -9007199254740991–9007199254740991
}Saves questionnaire answers. With submit: true the task is handed in and the work advances, which asks for confirmation.
| Field | Value |
|---|---|
| Kind | Write |
| HTTP method | POST /api/v1/works.tasks.answer |
| MCP tool | works_tasks_answer |
| Scope | works.write |
| Minimum role | Member |
| Human confirmation | Yes |
| Doors | Nödo, MCP, API |
| Status | Planned |
| Widget | form |
Input
{
taskId: string // uuid
expectedRevision: integer // -9007199254740991–9007199254740991
answers: Array<{
questionId: string
value: string | number | boolean | string[]
}> // ≤ 100 items
submit?: boolean // default false
}Output
{
ok: true
id?: string
revision?: integer // -9007199254740991–9007199254740991
}Approves a deliverable or requests changes with a comment. Only for review tasks that are waiting for the brand; the task status is checked server-side.
| Field | Value |
|---|---|
| Kind | Write |
| HTTP method | POST /api/v1/works.tasks.review |
| MCP tool | works_tasks_review |
| Scope | works.write |
| Minimum role | Member |
| Human confirmation | Yes |
| Doors | Nödo, MCP, API |
| Status | Planned |
| Widget | review |
Input
{
decision: "approve"
taskId: string // uuid
expectedRevision: integer // -9007199254740991–9007199254740991
}
| {
decision: "request_changes"
taskId: string // uuid
expectedRevision: integer // -9007199254740991–9007199254740991
comment: string // ≤ 4000
}Output
{
ok: true
id?: string
revision?: integer // -9007199254740991–9007199254740991
}Creates a work from a Store product included in the brand plan. If the product is paid and not included it returns an action link to its Store page instead; it never charges.
| Field | Value |
|---|---|
| Kind | Write |
| HTTP method | POST /api/v1/works.create_from_product |
| MCP tool | works_create_from_product |
| Scope | works.write |
| Minimum role | Member |
| Human confirmation | Yes |
| Doors | Nödo, MCP, API |
| Status | Planned |
| Widget | confirm |
Input
{
productSlug: string // ≤ 120
notes?: string // ≤ 2000
}Output
{
ok: true
id?: string
revision?: integer // -9007199254740991–9007199254740991
}
| {
ok: false
reason: "not_in_plan"
storeUrl: string // uri
}Updated on January 1, 1970