Nightroll Work

API and MCP reference

Everything the app does is one of these 521 operations, with the caller's permissions. The web app, the REST API, the MCP server, thekb CLI and the SDKs all come from the same contract, so this page is always complete.

Calling an operation

POST /api/v1/<op> with a JSON body and authorization: Bearer kb_…. Create keys in Settings → API keys: personal tokens act as you; agent keys act for you and show up as via agent:name in history. A key never gets more than its owner's role.

Errors are application/problem+json (RFC 9457) whose detail says what to fix. Writes take Idempotency-Key (24 h replay); reads answer with an ETag (send If-None-Match for a 304). Every answer carries x-kb-seq, the org's change sequence.

Changes, batches, streams

api.batch runs up to 50 operations in one transaction. api.changes {since} pages through every event since a sequence number; GET /api/v1/stream is the same as server-sent events, resumable with Last-Event-ID. Webhooks deliver events signed with HMAC.

Machine calls (API keys, agents, automation) count toward the Free plan's monthly allowance; people clicking in the app never do.

MCP

Point Claude or any MCP client at https://work.nightroll.app/mcp (Streamable HTTP) with the same header. Each operation below is a tool named module_verb, annotated read-only or destructive; destructive tools need confirm: true, which clients ask you for.

claude mcp add --transport http work https://work.nightroll.app/mcp \
  --header "Authorization: Bearer kb_…"

CLI and SDKs

One dependency-free Python file is both the SDK and the kb CLI: sign in with a device code, then run any operation or TQL.

curl -fsSLo kb https://work.nightroll.app/sdk/work.py && chmod +x kb
./kb login
./kb tql "assignee = currentUser() AND statusCategory != Done"
./kb issues.create project=WEB title="Fix login"

TypeScript: work.ts with schema.d.ts, typed from the contract (new Nightroll Work({token}).issues.create(…)).

VS Code

Install nightroll-work.vsix (Extensions → ⋯ → Install from VSIX) and run Work: Sign in: you approve a code in the browser, like the CLI. The Nightroll Work view lists your issues (any TQL, in settings); open one as a preview with its comments, create one from the selected code (file and line quoted), move it through the workflow, and create its branch from your branch template. The status bar shows the issue the current branch is for.

activity

activity.listread

REST POST /api/v1/activity.list · MCP tool activity_list · scopes activity:read

Input

sinceintegerOnly events after this sequence number (e.g. `previous.seq` from `activity.seen`).
subjectrequiredstring`kind:id`, e.g. "issue:12" or "page:ab12…".

Output object[]

actorstring
actor_kindstringhuman | key | agent | system | automation
created_atinteger
kindstringEvent kind, e.g. "issue.updated", "comment.created".
payloadanyEvent payload as emitted (changed fields are `{from, to}`).
seqinteger
subjectstring
titlestringThe subject's current title, if it still exists and is viewable.
viastringWhat a machine actor came through, e.g. `agent:claude`.
curl https://work.nightroll.app/api/v1/activity.list \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"subject":"<subject>"}'
activity.recentread

REST POST /api/v1/activity.recent · MCP tool activity_recent · scopes activity:read

Input

limitintegerDefault 30, max 100.

Output object[]

actorstring
actor_kindstringhuman | key | agent | system | automation
created_atinteger
kindstringEvent kind, e.g. "issue.updated", "comment.created".
payloadanyEvent payload as emitted (changed fields are `{from, to}`).
seqinteger
subjectstring
titlestringThe subject's current title, if it still exists and is viewable.
viastringWhat a machine actor came through, e.g. `agent:claude`.
curl https://work.nightroll.app/api/v1/activity.recent \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
activity.seenread

REST POST /api/v1/activity.seen · MCP tool activity_seen · scopes activity:read

Input

subjectrequiredstring

Output object

changesintegerEvents by other people since then.
previousobjectWhen you last looked before now; null the first time.
curl https://work.nightroll.app/api/v1/activity.seen \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"subject":"<subject>"}'

ai

ai.allowedread

REST POST /api/v1/ai.allowed · MCP tool ai_allowed · scopes ai:read

Input

subjectsrequiredstring[]

Output object[]

allowedboolean
reasonstringWhy not (excluded by policy, or AI is off).
subjectstring
curl https://work.nightroll.app/api/v1/ai.allowed \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"subjects":[]}'
ai.completewrite

REST POST /api/v1/ai.complete · MCP tool ai_complete · scopes ai:write

Input

featurerequiredstringWhat this is for (assistant, summary, triage, test…); usage is grouped by it.
max_tokensintegerLongest answer (default 1024, at most 8192).
messagesrequiredobject[]
modelstringMust be one of the provider's models; default: its default model.
providerstringProvider id; default: the first enabled one with a key.
subjectsstring[]What the prompt contains: the caller must see each, and none may be excluded from AI.
systemstring

Output object

input_tokensinteger
modelstring
output_tokensinteger
providerstring
textstring
curl https://work.nightroll.app/api/v1/ai.complete \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"feature":"<feature>","messages":[]}'
ai.contextread

REST POST /api/v1/ai.context · MCP tool ai_context · scopes ai:read

Input

modestringsummary (default) | changes (what happened after `since`) | explain (rewritten for `profile`)
profilestringFor `explain`: a reader profile key (`ai.profiles`).
sinceintegerFor `changes`: an outbox sequence number (`previous.seq` from `activity.seen`).
subjectrequiredstring`issue:12`, `page:…`, `sprint:3`, or any indexed subject.

Output object

featurestringsummary | changes: the `feature` to pass to `ai.complete`.
materialstringThe subject's material alone (JSON text), for callers writing their own prompt.
promptstring
subjectstring
systemstringReady to send: the system prompt and the user message (the subject's material inside).
titlestring
curl https://work.nightroll.app/api/v1/ai.context \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"subject":"<subject>"}'
ai.explainwrite

REST POST /api/v1/ai.explain · MCP tool ai_explain · scopes ai:write

Input

modelstring
profilerequiredstringA reader profile key (`ai.profiles`).
providerstring
subjectrequiredstring

Output object

modelstring
providerstring
textstring
curl https://work.nightroll.app/api/v1/ai.explain \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"profile":"<profile>","subject":"<subject>"}'
ai.key_revokedestructive

REST POST /api/v1/ai.key_revoke · MCP tool ai_key_revoke · scopes admin

Input

idrequiredstring

Output object

automation_applybooleanAI automation steps marked "apply" may change things without review (otherwise they only propose).
browser_keysbooleanPeople may use their own provider keys, kept in their browser and never sent to us.
enabledbooleanAI features are on for this org.
excludedstring[]Subjects AI never reads, with everything inside them (`space:ENG`, `project:WEB`, `page:…`, `issue:12`).
member_daily_tokensintegerOrg-key tokens one member may use per day (UTC); null = no cap.
monthly_tokensintegerOrg-key tokens allowed per calendar month (UTC); null = no cap.
org_keysbooleanAI features may run on the org's stored keys (digests, automations, summaries for everyone).
providersobject[]
used_monthintegerOrg-key tokens used this month by everyone, and today by you.
used_todayinteger
curl https://work.nightroll.app/api/v1/ai.key_revoke \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":"<id>"}'
ai.key_setwrite

REST POST /api/v1/ai.key_set · MCP tool ai_key_set · scopes admin

Input

labelstring
providerrequiredstring
secretrequiredstringThe provider's API key. Stored encrypted; never shown again.

Output object

automation_applybooleanAI automation steps marked "apply" may change things without review (otherwise they only propose).
browser_keysbooleanPeople may use their own provider keys, kept in their browser and never sent to us.
enabledbooleanAI features are on for this org.
excludedstring[]Subjects AI never reads, with everything inside them (`space:ENG`, `project:WEB`, `page:…`, `issue:12`).
member_daily_tokensintegerOrg-key tokens one member may use per day (UTC); null = no cap.
monthly_tokensintegerOrg-key tokens allowed per calendar month (UTC); null = no cap.
org_keysbooleanAI features may run on the org's stored keys (digests, automations, summaries for everyone).
providersobject[]
used_monthintegerOrg-key tokens used this month by everyone, and today by you.
used_todayinteger
curl https://work.nightroll.app/api/v1/ai.key_set \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"provider":"<provider>","secret":"<secret>"}'
ai.policyread

REST POST /api/v1/ai.policy · MCP tool ai_policy · scopes ai:read

Input

None: send {}.

Output object

automation_applybooleanAI automation steps marked "apply" may change things without review (otherwise they only propose).
browser_keysbooleanPeople may use their own provider keys, kept in their browser and never sent to us.
enabledbooleanAI features are on for this org.
excludedstring[]Subjects AI never reads, with everything inside them (`space:ENG`, `project:WEB`, `page:…`, `issue:12`).
member_daily_tokensintegerOrg-key tokens one member may use per day (UTC); null = no cap.
monthly_tokensintegerOrg-key tokens allowed per calendar month (UTC); null = no cap.
org_keysbooleanAI features may run on the org's stored keys (digests, automations, summaries for everyone).
providersobject[]
used_monthintegerOrg-key tokens used this month by everyone, and today by you.
used_todayinteger
curl https://work.nightroll.app/api/v1/ai.policy \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
ai.policy_setwrite

REST POST /api/v1/ai.policy_set · MCP tool ai_policy_set · scopes admin

Input

automation_applybooleanDefault false.
browser_keysrequiredboolean
enabledrequiredboolean
excludedrequiredstring[]
member_daily_tokensinteger
monthly_tokensinteger
org_keysrequiredboolean

Output object

automation_applybooleanAI automation steps marked "apply" may change things without review (otherwise they only propose).
browser_keysbooleanPeople may use their own provider keys, kept in their browser and never sent to us.
enabledbooleanAI features are on for this org.
excludedstring[]Subjects AI never reads, with everything inside them (`space:ENG`, `project:WEB`, `page:…`, `issue:12`).
member_daily_tokensintegerOrg-key tokens one member may use per day (UTC); null = no cap.
monthly_tokensintegerOrg-key tokens allowed per calendar month (UTC); null = no cap.
org_keysbooleanAI features may run on the org's stored keys (digests, automations, summaries for everyone).
providersobject[]
used_monthintegerOrg-key tokens used this month by everyone, and today by you.
used_todayinteger
curl https://work.nightroll.app/api/v1/ai.policy_set \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"browser_keys":true,"enabled":true,"excluded":[],"org_keys":true}'
ai.profile_deletedestructive

REST POST /api/v1/ai.profile_delete · MCP tool ai_profile_delete · scopes admin

Input

idrequiredstring

Output object[]

instructionsstringHow to write for them.
keystring
labelstring
curl https://work.nightroll.app/api/v1/ai.profile_delete \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":"<id>"}'
ai.profile_savewrite

REST POST /api/v1/ai.profile_save · MCP tool ai_profile_save · scopes admin

Input

instructionsrequiredstring
keyrequiredstringLowercase letters, digits and `-`.
labelrequiredstring

Output object[]

instructionsstringHow to write for them.
keystring
labelstring
curl https://work.nightroll.app/api/v1/ai.profile_save \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"instructions":"<instructions>","key":"<key>","label":"<label>"}'
ai.profilesread

REST POST /api/v1/ai.profiles · MCP tool ai_profiles · scopes ai:read

Input

None: send {}.

Output object[]

instructionsstringHow to write for them.
keystring
labelstring
curl https://work.nightroll.app/api/v1/ai.profiles \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
ai.proposal_applywrite

REST POST /api/v1/ai.proposal_apply · MCP tool ai_proposal_apply · scopes ai:write

Input

idrequiredinteger

Output object

answerstringThe model's answer.
created_atinteger
decided_atinteger
decided_bystring
errorstring
idinteger
inputany
opstringWhat applying runs.
rulestringThe automation rule that asked, by name.
statestringopen | applied | dismissed | failed
subjectstring
taskstring
titlestringThe subject's title now.
curl https://work.nightroll.app/api/v1/ai.proposal_apply \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
ai.proposal_dismisswrite

REST POST /api/v1/ai.proposal_dismiss · MCP tool ai_proposal_dismiss · scopes ai:write

Input

idrequiredinteger

Output object

answerstringThe model's answer.
created_atinteger
decided_atinteger
decided_bystring
errorstring
idinteger
inputany
opstringWhat applying runs.
rulestringThe automation rule that asked, by name.
statestringopen | applied | dismissed | failed
subjectstring
taskstring
titlestringThe subject's title now.
curl https://work.nightroll.app/api/v1/ai.proposal_dismiss \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
ai.proposalsread

REST POST /api/v1/ai.proposals · MCP tool ai_proposals · scopes ai:read

Input

statestringDefault open.
subjectstring

Output object[]

answerstringThe model's answer.
created_atinteger
decided_atinteger
decided_bystring
errorstring
idinteger
inputany
opstringWhat applying runs.
rulestringThe automation rule that asked, by name.
statestringopen | applied | dismissed | failed
subjectstring
taskstring
titlestringThe subject's title now.
curl https://work.nightroll.app/api/v1/ai.proposals \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
ai.provider_deletedestructive

REST POST /api/v1/ai.provider_delete · MCP tool ai_provider_delete · scopes admin

Input

idrequiredstring

Output object

automation_applybooleanAI automation steps marked "apply" may change things without review (otherwise they only propose).
browser_keysbooleanPeople may use their own provider keys, kept in their browser and never sent to us.
enabledbooleanAI features are on for this org.
excludedstring[]Subjects AI never reads, with everything inside them (`space:ENG`, `project:WEB`, `page:…`, `issue:12`).
member_daily_tokensintegerOrg-key tokens one member may use per day (UTC); null = no cap.
monthly_tokensintegerOrg-key tokens allowed per calendar month (UTC); null = no cap.
org_keysbooleanAI features may run on the org's stored keys (digests, automations, summaries for everyone).
providersobject[]
used_monthintegerOrg-key tokens used this month by everyone, and today by you.
used_todayinteger
curl https://work.nightroll.app/api/v1/ai.provider_delete \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":"<id>"}'
ai.provider_modelswrite

REST POST /api/v1/ai.provider_models · MCP tool ai_provider_models · scopes admin

Input

idrequiredstring

Output object

modelsobject[]Everything the provider lists, plus allowed models it no longer lists (so they can be removed).
providerstring
curl https://work.nightroll.app/api/v1/ai.provider_models \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":"<id>"}'
ai.provider_savewrite

REST POST /api/v1/ai.provider_save · MCP tool ai_provider_save · scopes admin

Input

base_urlrequiredstringhttp(s) base, e.g. https://api.anthropic.com
browserrequiredboolean
default_modelrequiredstring
enabledrequiredboolean
idrequiredstringLowercase letters, digits and `-`.
kindrequiredstringanthropic | openai
labelrequiredstring
modelsrequiredstring[]
needs_keyrequiredboolean

Output object

automation_applybooleanAI automation steps marked "apply" may change things without review (otherwise they only propose).
browser_keysbooleanPeople may use their own provider keys, kept in their browser and never sent to us.
enabledbooleanAI features are on for this org.
excludedstring[]Subjects AI never reads, with everything inside them (`space:ENG`, `project:WEB`, `page:…`, `issue:12`).
member_daily_tokensintegerOrg-key tokens one member may use per day (UTC); null = no cap.
monthly_tokensintegerOrg-key tokens allowed per calendar month (UTC); null = no cap.
org_keysbooleanAI features may run on the org's stored keys (digests, automations, summaries for everyone).
providersobject[]
used_monthintegerOrg-key tokens used this month by everyone, and today by you.
used_todayinteger
curl https://work.nightroll.app/api/v1/ai.provider_save \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"base_url":"<base_url>","browser":true,"default_model":"<default_model>","enabled":true,"id":"<id>","kind":"<kind>","label":"<label>","models":[],"needs_key":true}'
ai.runwrite

REST POST /api/v1/ai.run · MCP tool ai_run · scopes ai:write

Input

applybooleanApply without review, if the org's AI policy allows automation to (otherwise it's proposed).
instructionsstringExtra guidance (or, for `prompt`, the whole ask).
optionsanyFor classify: the choices, as a list or comma-separated text.
rulestringThe automation rule asking (`{{rule}}`, its name), for the record.
subjectrequiredstringWhat it's about: `issue:12`, `page:…`.
taskrequiredstringclassify (pick one of `options`) | summarize | draft_reply | prompt (follow `instructions`)
thenobjectWhat to do with the answer. Default for summarize/draft_reply/prompt: a comment on the subject.

Output object

jobinteger
curl https://work.nightroll.app/api/v1/ai.run \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"subject":"<subject>","task":"<task>"}'
ai.summarizewrite

REST POST /api/v1/ai.summarize · MCP tool ai_summarize · scopes ai:write

Input

modestringsummary (default) | changes
modelstring
providerstring
sinceinteger
subjectrequiredstring

Output object

modelstring
providerstring
summarystring
curl https://work.nightroll.app/api/v1/ai.summarize \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"subject":"<subject>"}'
ai.usagewrite

REST POST /api/v1/ai.usage · MCP tool ai_usage · scopes admin

Input

daysintegerLook back this many days (1-366, default 30).

Output object[]

actorstring
callsinteger
errorsinteger
featurestring
input_tokensinteger
modelstring
output_tokensinteger
providerstring
curl https://work.nightroll.app/api/v1/ai.usage \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'

analytics

analytics.exportwrite

REST POST /api/v1/analytics.export · MCP tool analytics_export · scopes admin

Input

formatrequiredstringndjson | parquet
fromrequiredstringFirst day, `YYYY-MM-DD` (UTC).
torequiredstringLast day, inclusive.

Output object

datastringThe file, base64.
eventsinteger
namestring
truncatedbooleanMore events in the range than one file holds: export a shorter range.
curl https://work.nightroll.app/api/v1/analytics.export \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"format":"<format>","from":"<from>","to":"<to>"}'
analytics.querywrite

REST POST /api/v1/analytics.query · MCP tool analytics_query · scopes admin

Input

sqlrequiredstringOne SELECT over `events(seq, kind, subject, actor, actor_kind, via, at, payload)`; `at` is Unix seconds, `payload` JSON (use json_extract).

Output object

columnsstring[]
msinteger
rowsany[][]
truncatedbooleanMore rows matched than came back.
curl https://work.nightroll.app/api/v1/analytics.query \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"sql":"<sql>"}'
analytics.report_deletedestructive

REST POST /api/v1/analytics.report_delete · MCP tool analytics_report_delete · scopes admin

Input

idrequiredinteger

Output any

curl https://work.nightroll.app/api/v1/analytics.report_delete \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
analytics.report_runwrite

REST POST /api/v1/analytics.report_run · MCP tool analytics_report_run · scopes admin

Input

idrequiredinteger

Output object

created_bystring
everystringmanual | daily | weekly | monthly
idinteger
last_errorstring
last_resultanyThe first rows of the last run.
last_rowsinteger
last_run_atinteger
namestring
next_run_atinteger
recipientsstring[]Identity ids or `team:<id>` / `team:admins` told when it runs (admins only see it).
sqlstring
curl https://work.nightroll.app/api/v1/analytics.report_run \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
analytics.report_savewrite

REST POST /api/v1/analytics.report_save · MCP tool analytics_report_save · scopes admin

Input

everyrequiredstringmanual | daily | weekly | monthly
idinteger
namerequiredstring
recipientsstring[]
sqlrequiredstring

Output object

created_bystring
everystringmanual | daily | weekly | monthly
idinteger
last_errorstring
last_resultanyThe first rows of the last run.
last_rowsinteger
last_run_atinteger
namestring
next_run_atinteger
recipientsstring[]Identity ids or `team:<id>` / `team:admins` told when it runs (admins only see it).
sqlstring
curl https://work.nightroll.app/api/v1/analytics.report_save \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"every":"<every>","name":"<name>","sql":"<sql>"}'
analytics.reportswrite

REST POST /api/v1/analytics.reports · MCP tool analytics_reports · scopes admin

Input

None: send {}.

Output object[]

created_bystring
everystringmanual | daily | weekly | monthly
idinteger
last_errorstring
last_resultanyThe first rows of the last run.
last_rowsinteger
last_run_atinteger
namestring
next_run_atinteger
recipientsstring[]Identity ids or `team:<id>` / `team:admins` told when it runs (admins only see it).
sqlstring
curl https://work.nightroll.app/api/v1/analytics.reports \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'

api

api.batchwriteRuns up to 50 ops in order in one transaction: all of them commit, or (on the first error) none do.

REST POST /api/v1/api.batch · MCP tool api_batch · scopes api:read | api:write

Input

opsrequiredobject[]

Output object

resultsany[]Each op's output, in order.
curl https://work.nightroll.app/api/v1/api.batch \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"ops":[]}'
api.changesreadEvents after `since` that the caller can see, oldest first. Poll with `since = next` (or use the event stream).

REST POST /api/v1/api.changes · MCP tool api_changes · scopes api:read

Input

limitintegerEvents to scan, 1-500 (default 100).
sinceintegerA sequence number from `next`, an `x-kb-seq` header or an event; 0 = from the beginning.

Output object

eventsobject[]
morebooleanMore events are waiting: call again right away.
nextintegerPass as `since` next time (it also skips events you can't see).
curl https://work.nightroll.app/api/v1/api.changes \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'

approvals

approvals.cancelwrite

REST POST /api/v1/approvals.cancel · MCP tool approvals_cancel · scopes issues:write

Input

idrequiredinteger

Output object

approvalsinteger
approversstring[]
can_decidebooleanThe caller may approve or reject it now.
created_atinteger
decided_atinteger
idinteger
keystring
neededinteger
notestring
requested_bystring
statestringpending | approved (move it) | rejected | cancelled | done (moved)
titlestring
to_statusstring
transitionstring
votesobject[]
curl https://work.nightroll.app/api/v1/approvals.cancel \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
approvals.decidewrite

REST POST /api/v1/approvals.decide · MCP tool approvals_decide · scopes issues:write

Input

approverequiredboolean
idrequiredinteger
notestring

Output object

blockedstringWhy it couldn't move yet (the requester can move it once that's fixed).
movedbooleanThe issue moved now (approved and nothing stopped it).
requestobject
curl https://work.nightroll.app/api/v1/approvals.decide \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"approve":true,"id":1}'
approvals.listread

REST POST /api/v1/approvals.list · MCP tool approvals_list · scopes issues:read

Input

keyrequiredstring

Output object[]

approvalsinteger
approversstring[]
can_decidebooleanThe caller may approve or reject it now.
created_atinteger
decided_atinteger
idinteger
keystring
neededinteger
notestring
requested_bystring
statestringpending | approved (move it) | rejected | cancelled | done (moved)
titlestring
to_statusstring
transitionstring
votesobject[]
curl https://work.nightroll.app/api/v1/approvals.list \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"key":"<key>"}'
approvals.mineread

REST POST /api/v1/approvals.mine · MCP tool approvals_mine · scopes issues:read

Input

None: send {}.

Output object[]

approvalsinteger
approversstring[]
can_decidebooleanThe caller may approve or reject it now.
created_atinteger
decided_atinteger
idinteger
keystring
neededinteger
notestring
requested_bystring
statestringpending | approved (move it) | rejected | cancelled | done (moved)
titlestring
to_statusstring
transitionstring
votesobject[]
curl https://work.nightroll.app/api/v1/approvals.mine \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
approvals.requestwrite

REST POST /api/v1/approvals.request · MCP tool approvals_request · scopes issues:write

Input

keyrequiredstring
notestring
to_statusrequiredstringThe status to move to (a transition with approvers).

Output object

approvalsinteger
approversstring[]
can_decidebooleanThe caller may approve or reject it now.
created_atinteger
decided_atinteger
idinteger
keystring
neededinteger
notestring
requested_bystring
statestringpending | approved (move it) | rejected | cancelled | done (moved)
titlestring
to_statusstring
transitionstring
votesobject[]
curl https://work.nightroll.app/api/v1/approvals.request \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"key":"<key>","to_status":"<to_status>"}'

assets

assets.createwrite

REST POST /api/v1/assets.create · MCP tool assets_create · scopes assets:write

Input

namerequiredstring
ownerstring
statusstring
typerequiredstring
valuesobject

Output object

created_atinteger
created_bystring
idinteger
issuesstring[]Linked issue keys.
keystringLAPTOP-12
namestring
ownerstringMember id.
statusstringactive | maintenance | retired
typestring
updated_atinteger
valuesobjectField values by key (references hold asset keys).
curl https://work.nightroll.app/api/v1/assets.create \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"name":"<name>","type":"<type>"}'
assets.deletedestructive

REST POST /api/v1/assets.delete · MCP tool assets_delete · scopes assets:write

Input

keyrequiredstringAsset key (LAPTOP-12) or id.

Output object

okboolean
curl https://work.nightroll.app/api/v1/assets.delete \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"key":"<key>"}'
assets.for_issueread

REST POST /api/v1/assets.for_issue · MCP tool assets_for_issue · scopes assets:read

Input

issuerequiredstring

Output object[]

created_atinteger
created_bystring
idinteger
issuesstring[]Linked issue keys.
keystringLAPTOP-12
namestring
ownerstringMember id.
statusstringactive | maintenance | retired
typestring
updated_atinteger
valuesobjectField values by key (references hold asset keys).
curl https://work.nightroll.app/api/v1/assets.for_issue \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"issue":"<issue>"}'
assets.getread

REST POST /api/v1/assets.get · MCP tool assets_get · scopes assets:read

Input

keyrequiredstringAsset key (LAPTOP-12) or id.

Output object

created_atinteger
created_bystring
idinteger
issuesstring[]Linked issue keys.
keystringLAPTOP-12
namestring
ownerstringMember id.
statusstringactive | maintenance | retired
typestring
updated_atinteger
valuesobjectField values by key (references hold asset keys).
curl https://work.nightroll.app/api/v1/assets.get \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"key":"<key>"}'
assets.listread

REST POST /api/v1/assets.list · MCP tool assets_list · scopes assets:read

Input

qstringWords in the key, name or field values.
refers_tostringAssets whose reference fields point at this asset key (what depends on it).
statusstringactive | maintenance | retired
typestringA type key.

Output object[]

created_atinteger
created_bystring
idinteger
issuesstring[]Linked issue keys.
keystringLAPTOP-12
namestring
ownerstringMember id.
statusstringactive | maintenance | retired
typestring
updated_atinteger
valuesobjectField values by key (references hold asset keys).
curl https://work.nightroll.app/api/v1/assets.list \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
assets.type_deletedestructive

REST POST /api/v1/assets.type_delete · MCP tool assets_type_delete · scopes admin

Input

idrequiredinteger

Output object[]

countinteger
descriptionstring
fieldsobject[]
iconstring
idinteger
keystringAsset keys start with it: LAPTOP-12.
namestring
positionnumber
curl https://work.nightroll.app/api/v1/assets.type_delete \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
assets.type_savewrite

REST POST /api/v1/assets.type_save · MCP tool assets_type_save · scopes admin

Input

descriptionstring
fieldsobject[]
iconstring
idinteger
keystringLetters and digits, 2–10, starting with a letter (create only).
namerequiredstring
positionnumber

Output object[]

countinteger
descriptionstring
fieldsobject[]
iconstring
idinteger
keystringAsset keys start with it: LAPTOP-12.
namestring
positionnumber
curl https://work.nightroll.app/api/v1/assets.type_save \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"name":"<name>"}'
assets.typesread

REST POST /api/v1/assets.types · MCP tool assets_types · scopes assets:read

Input

None: send {}.

Output object[]

countinteger
descriptionstring
fieldsobject[]
iconstring
idinteger
keystringAsset keys start with it: LAPTOP-12.
namestring
positionnumber
curl https://work.nightroll.app/api/v1/assets.types \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
assets.updatewrite

REST POST /api/v1/assets.update · MCP tool assets_update · scopes assets:write

Input

keyrequiredstring
namestring
ownerstringMember id; empty clears.
statusstring
valuesobjectFields to set (null clears); others unchanged.

Output object

created_atinteger
created_bystring
idinteger
issuesstring[]Linked issue keys.
keystringLAPTOP-12
namestring
ownerstringMember id.
statusstringactive | maintenance | retired
typestring
updated_atinteger
valuesobjectField values by key (references hold asset keys).
curl https://work.nightroll.app/api/v1/assets.update \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"key":"<key>"}'

attachments

attachments.addwrite

REST POST /api/v1/attachments.add · MCP tool attachments_add · scopes attachments:write

Input

content_typestring
datarequiredstringBase64 of the file, 10 MB max.
namerequiredstring
subjectrequiredstringWhat it's attached to, e.g. `issue:42`.

Output object

content_typestring
created_atinteger
created_bystring
idstring
namestring
sizeinteger
subjectstring
curl https://work.nightroll.app/api/v1/attachments.add \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"data":"<data>","name":"<name>","subject":"<subject>"}'
attachments.deletedestructive

REST POST /api/v1/attachments.delete · MCP tool attachments_delete · scopes attachments:write

Input

idrequiredstring

Output object

content_typestring
created_atinteger
created_bystring
idstring
namestring
sizeinteger
subjectstring
curl https://work.nightroll.app/api/v1/attachments.delete \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":"<id>"}'
attachments.getread

REST POST /api/v1/attachments.get · MCP tool attachments_get · scopes attachments:read

Input

as_urlbooleanA download link instead of the bytes, where the deployment serves files from their own origin.
idrequiredstring

Output object

content_typestring
datastringBase64 of the file (empty when `url` is given).
idstring
namestring
urlstringWith `as_url`, where the deployment has a files origin: a five-minute link that downloads it.
curl https://work.nightroll.app/api/v1/attachments.get \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":"<id>"}'
attachments.listread

REST POST /api/v1/attachments.list · MCP tool attachments_list · scopes attachments:read

Input

subjectrequiredstring

Output object[]

content_typestring
created_atinteger
created_bystring
idstring
namestring
sizeinteger
subjectstring
curl https://work.nightroll.app/api/v1/attachments.list \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"subject":"<subject>"}'

audit

audit.exportwrite

REST POST /api/v1/audit.export · MCP tool audit_export · scopes admin

Input

actorstringIdentity id of who acted (or `system`, `anonymous`).
actor_kindstringhuman | key | agent | system | automation.
fromintegerUnix seconds, inclusive.
kindstringEvent kind, e.g. `issue.updated`; a trailing `*` matches a prefix (`auth.*`).
qstringText anywhere in the subject, via or details.
subjectstring`kind:id`, e.g. `issue:42`.
tointegerUnix seconds, exclusive.

Output object

countinteger
ndjsonstringOne JSON entry per line, oldest first.
truncatedbooleanTrue when more than 50,000 entries matched (narrow the dates and export again).
curl https://work.nightroll.app/api/v1/audit.export \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
audit.listwriteNewest first. Page with `before = next_before`.

REST POST /api/v1/audit.list · MCP tool audit_list · scopes admin

Input

actorstringIdentity id of who acted (or `system`, `anonymous`).
actor_kindstringhuman | key | agent | system | automation.
beforeinteger
fromintegerUnix seconds, inclusive.
kindstringEvent kind, e.g. `issue.updated`; a trailing `*` matches a prefix (`auth.*`).
limitinteger1-200, default 50.
qstringText anywhere in the subject, via or details.
subjectstring`kind:id`, e.g. `issue:42`.
tointegerUnix seconds, exclusive.

Output object

entriesobject[]
next_beforeintegerPass as `before` for the next page; null at the end.
planstring
retention_daysintegerEntries older than this many days are deleted.
curl https://work.nightroll.app/api/v1/audit.list \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
audit.recordwriteRecords a sign-in or membership event that happened in the directory (the cell calls it; not a public op).

REST POST /api/v1/audit.record · MCP tool audit_record · scopes system

Input

kindrequiredstring
payloadany
subjectrequiredstring

Output any

curl https://work.nightroll.app/api/v1/audit.record \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"kind":"<kind>","subject":"<subject>"}'

automation

automation.catalogread

REST POST /api/v1/automation.catalog · MCP tool automation_catalog · scopes automation:read

Input

None: send {}.

Output object

generalobject[]Presets for any rule (web requests…).
opsstring[]Every op an action may run.
subjectsobject[]
variablesobject[]Variables every rule has besides the subject's fields.
curl https://work.nightroll.app/api/v1/automation.catalog \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
automation.deletedestructive

REST POST /api/v1/automation.delete · MCP tool automation_delete · scopes admin

Input

idrequiredinteger

Output any

curl https://work.nightroll.app/api/v1/automation.delete \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
automation.listread

REST POST /api/v1/automation.list · MCP tool automation_list · scopes automation:read

Input

None: send {}.

Output object[]

actionsobject[]
conditionsobject[]
created_atinteger
created_bystring
enabledboolean
idinteger
last_run_atinteger
namestring
next_run_atintegerScheduled rules: when it runs next.
runsinteger
triggerobject
curl https://work.nightroll.app/api/v1/automation.list \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
automation.logread

REST POST /api/v1/automation.log · MCP tool automation_log · scopes automation:read

Input

ruleintegerOne rule's runs; omit for all.

Output object[]

actorstring
atinteger
eventstring
idinteger
labelstringThe subject's key or title at the time.
messagestring
okboolean
ruleinteger
subjectstring`kind:id` it ran on; null for scheduled runs.
curl https://work.nightroll.app/api/v1/automation.log \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
automation.runwrite

REST POST /api/v1/automation.run · MCP tool automation_run · scopes admin

Input

idrequiredinteger

Output any

curl https://work.nightroll.app/api/v1/automation.run \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
automation.savewrite

REST POST /api/v1/automation.save · MCP tool automation_save · scopes admin

Input

actionsobject[]
conditionsobject[]
enabledboolean
idintegerOmit to create.
namestring
triggerobject

Output object

actionsobject[]
conditionsobject[]
created_atinteger
created_bystring
enabledboolean
idinteger
last_run_atinteger
namestring
next_run_atintegerScheduled rules: when it runs next.
runsinteger
triggerobject
curl https://work.nightroll.app/api/v1/automation.save \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'

chat

chat.bot_tokenwrite

REST POST /api/v1/chat.bot_token · MCP tool chat_bot_token · scopes system

Input

idrequiredinteger

Output object

tokenstring
curl https://work.nightroll.app/api/v1/chat.bot_token \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
chat.connection_deletedestructive

REST POST /api/v1/chat.connection_delete · MCP tool chat_connection_delete · scopes admin

Input

idrequiredinteger

Output object

created_atinteger
created_bystring
has_bot_tokenbooleanSlack only: a bot token is stored (needed for unfurls).
hook_pathstringRequest URL to give the platform (after the site's address).
idinteger
last_errorstring
last_event_atinteger
linkedintegerChat accounts linked to members.
namestring
projectstringDefault project for `create` without one and for issues made from messages.
providerstringslack | teams | discord
requestsinteger
curl https://work.nightroll.app/api/v1/chat.connection_delete \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
chat.connection_savewrite

REST POST /api/v1/chat.connection_save · MCP tool chat_connection_save · scopes admin

Input

bot_tokenstringSlack bot token (xoxb-…), for unfurls; "" removes it. Kept when omitted.
idinteger
namestring
projectstring
providerstringslack | teams | discord (new connections).
secretstringSlack signing secret, Teams outgoing-webhook security token, or Discord application public key. Kept when omitted.

Output object

created_atinteger
created_bystring
has_bot_tokenbooleanSlack only: a bot token is stored (needed for unfurls).
hook_pathstringRequest URL to give the platform (after the site's address).
idinteger
last_errorstring
last_event_atinteger
linkedintegerChat accounts linked to members.
namestring
projectstringDefault project for `create` without one and for issues made from messages.
providerstringslack | teams | discord
requestsinteger
curl https://work.nightroll.app/api/v1/chat.connection_save \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
chat.connectionsread

REST POST /api/v1/chat.connections · MCP tool chat_connections · scopes chat:read

Input

None: send {}.

Output object[]

created_atinteger
created_bystring
has_bot_tokenbooleanSlack only: a bot token is stored (needed for unfurls).
hook_pathstringRequest URL to give the platform (after the site's address).
idinteger
last_errorstring
last_event_atinteger
linkedintegerChat accounts linked to members.
namestring
projectstringDefault project for `create` without one and for issues made from messages.
providerstringslack | teams | discord
requestsinteger
curl https://work.nightroll.app/api/v1/chat.connections \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
chat.ingestwrite

REST POST /api/v1/chat.ingest · MCP tool chat_ingest · scopes system

Input

bodyrequiredstringThe raw body (the signature covers it).
connectionrequiredinteger
headersrequiredobjectRequest headers, lowercase names.
membersobjectOrg members `{id: {scopes, teams}}`, so linked chat users act as themselves.
originstringThe site's address as the platform called it (for links in replies).

Output object

replyanyThe JSON to answer the platform with (null = empty 200).
resultstringaccepted | refused (bad signature)
curl https://work.nightroll.app/api/v1/chat.ingest \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"body":"<body>","connection":1,"headers":"<headers>"}'
chat.subscription_deletedestructive

REST POST /api/v1/chat.subscription_delete · MCP tool chat_subscription_delete · scopes admin

Input

idrequiredinteger

Output object

idinteger
curl https://work.nightroll.app/api/v1/chat.subscription_delete \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
chat.subscription_savewrite

REST POST /api/v1/chat.subscription_save · MCP tool chat_subscription_save · scopes admin

Input

connectioninteger
eventsstring[]Any of issue.created, issue.updated, issue.assigned, issue.deleted, comment.created.
idinteger
namestring
originstringThe site's address, for links in posts (the web sends its own).
tqlstringIssues to post about, e.g. `project = WEB AND priority = high`; empty = every issue.
webhook_urlstringThe channel's incoming webhook URL. Kept when omitted.

Output object

connectioninteger
created_atinteger
created_bystring
eventsstring[]
idinteger
last_sent_atinteger
namestring
sentinteger
tqlstring
curl https://work.nightroll.app/api/v1/chat.subscription_save \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
chat.subscription_testwrite

REST POST /api/v1/chat.subscription_test · MCP tool chat_subscription_test · scopes admin

Input

idrequiredinteger

Output object

idinteger
curl https://work.nightroll.app/api/v1/chat.subscription_test \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
chat.subscriptionsread

REST POST /api/v1/chat.subscriptions · MCP tool chat_subscriptions · scopes chat:read

Input

None: send {}.

Output object[]

connectioninteger
created_atinteger
created_bystring
eventsstring[]
idinteger
last_sent_atinteger
namestring
sentinteger
tqlstring
curl https://work.nightroll.app/api/v1/chat.subscriptions \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'

checklists

checklists.addwrite

REST POST /api/v1/checklists.add · MCP tool checklists_add · scopes issues:write

Input

assigneestring
due_datestring
keyrequiredstring
textrequiredstringOne item, or several separated by new lines.

Output object

can_editbooleanThe caller can change it (edits the issue).
doneinteger
itemsobject[]
keystring
totalinteger
curl https://work.nightroll.app/api/v1/checklists.add \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"key":"<key>","text":"<text>"}'
checklists.applywrite

REST POST /api/v1/checklists.apply · MCP tool checklists_apply · scopes issues:write

Input

keyrequiredstring
templaterequiredinteger

Output object

can_editbooleanThe caller can change it (edits the issue).
doneinteger
itemsobject[]
keystring
totalinteger
curl https://work.nightroll.app/api/v1/checklists.apply \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"key":"<key>","template":1}'
checklists.deletedestructive

REST POST /api/v1/checklists.delete · MCP tool checklists_delete · scopes issues:write

Input

idrequiredinteger

Output object

deletedintegerRows removed or moved (a project counts itself plus its issues; an option counts the issues it moved).
curl https://work.nightroll.app/api/v1/checklists.delete \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
checklists.listread

REST POST /api/v1/checklists.list · MCP tool checklists_list · scopes issues:read

Input

keyrequiredstring

Output object

can_editbooleanThe caller can change it (edits the issue).
doneinteger
itemsobject[]
keystring
totalinteger
curl https://work.nightroll.app/api/v1/checklists.list \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"key":"<key>"}'
checklists.reorderwrite

REST POST /api/v1/checklists.reorder · MCP tool checklists_reorder · scopes issues:write

Input

idsrequiredinteger[]Item ids in their new order.
keyrequiredstring

Output object

can_editbooleanThe caller can change it (edits the issue).
doneinteger
itemsobject[]
keystring
totalinteger
curl https://work.nightroll.app/api/v1/checklists.reorder \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"ids":1,"key":"<key>"}'
checklists.template_deletedestructive

REST POST /api/v1/checklists.template_delete · MCP tool checklists_template_delete · scopes admin

Input

idrequiredinteger

Output object

deletedintegerRows removed or moved (a project counts itself plus its issues; an option counts the issues it moved).
curl https://work.nightroll.app/api/v1/checklists.template_delete \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
checklists.template_savewrite

REST POST /api/v1/checklists.template_save · MCP tool checklists_template_save · scopes admin

Input

autoboolean
idinteger
itemsrequiredstring[]
kindrequiredstring
namerequiredstring

Output object[]

autobooleanAdded to every new issue of the type.
idinteger
itemsstring[]
kindstringIssue type key.
namestring
curl https://work.nightroll.app/api/v1/checklists.template_save \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"items":[],"kind":"<kind>","name":"<name>"}'
checklists.templatesread

REST POST /api/v1/checklists.templates · MCP tool checklists_templates · scopes issues:read

Input

None: send {}.

Output object[]

autobooleanAdded to every new issue of the type.
idinteger
itemsstring[]
kindstringIssue type key.
namestring
curl https://work.nightroll.app/api/v1/checklists.templates \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
checklists.updatewrite

REST POST /api/v1/checklists.update · MCP tool checklists_update · scopes issues:write

Input

assigneestring"" unassigns.
doneboolean
due_datestring"" clears.
idrequiredinteger
textstring

Output object

can_editbooleanThe caller can change it (edits the issue).
doneinteger
itemsobject[]
keystring
totalinteger
curl https://work.nightroll.app/api/v1/checklists.update \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'

comments

comments.createwrite

REST POST /api/v1/comments.create · MCP tool comments_create · scopes comments:write

Input

anchorstringInline comment: JSON `{"exact": "quoted text", "prefix": "…", "suffix": "…"}` locating the text it's about.
bodyrequiredstringMarkdown (what search, mentions, email and agents read).
body_docstringThe same body as a rich document (TipTap JSON, as the web editor writes it); optional.
internalbooleanAn internal note: the team sees it, customers in the service desk portal never do. Replies follow their thread.
parentintegerReply to this comment's thread.
subjectrequiredstring

Output object

idinteger
curl https://work.nightroll.app/api/v1/comments.create \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"body":"<body>","subject":"<subject>"}'
comments.deletedestructive

REST POST /api/v1/comments.delete · MCP tool comments_delete · scopes comments:write

Input

idrequiredinteger

Output object

idinteger
curl https://work.nightroll.app/api/v1/comments.delete \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
comments.importwrite

REST POST /api/v1/comments.import · MCP tool comments_import · scopes admin

Input

authorrequiredstringMember id, or a name for someone who isn't a member.
bodyrequiredstringMarkdown.
created_atintegerUnix seconds.
subjectrequiredstring

Output object

idinteger
curl https://work.nightroll.app/api/v1/comments.import \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"author":"<author>","body":"<body>","subject":"<subject>"}'
comments.listread

REST POST /api/v1/comments.list · MCP tool comments_list · scopes comments:read

Input

subjectrequiredstring

Output object[]

anchorstringInline anchor JSON (thread starters only).
authorstring
bodystring
body_docstringThe body as a rich document (TipTap JSON); null when there's only markdown.
created_atinteger
edited_atintegerWhen the author last edited it.
idinteger
internalbooleanAn internal note (not shown to customers).
parentintegerThe thread's first comment; null for a thread starter.
reactionsobject[]
resolved_atinteger
resolved_bystring
curl https://work.nightroll.app/api/v1/comments.list \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"subject":"<subject>"}'
comments.reactwrite

REST POST /api/v1/comments.react · MCP tool comments_react · scopes comments:write

Input

emojirequiredstringOne emoji (or a short code), 16 bytes max.
idrequiredinteger
onrequiredbooleanfalse removes it.

Output object

idinteger
curl https://work.nightroll.app/api/v1/comments.react \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"emoji":"<emoji>","id":1,"on":true}'
comments.resolvewrite

REST POST /api/v1/comments.resolve · MCP tool comments_resolve · scopes comments:write

Input

idrequiredintegerThe thread's first comment.
resolvedrequiredbooleanfalse reopens it.

Output object

idinteger
curl https://work.nightroll.app/api/v1/comments.resolve \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1,"resolved":true}'
comments.updatewrite

REST POST /api/v1/comments.update · MCP tool comments_update · scopes comments:write

Input

bodyrequiredstringMarkdown. Without `body_doc` it replaces the rich document too.
body_docstring
idrequiredinteger

Output object

idinteger
curl https://work.nightroll.app/api/v1/comments.update \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"body":"<body>","id":1}'

desk

desk.chat_requestwrite

REST POST /api/v1/desk.chat_request · MCP tool desk_chat_request · scopes system

Input

channelstringWhere replies go (Slack: the channel id).
chat_namestring
chat_userrequiredstring
connectionrequiredinteger
projectrequiredstringThe desk's project (the chat connection's default project).
providerrequiredstringslack | teams | discord
textrequiredstringFirst line the summary, the rest the description.

Output object

keystring
replystringWhat to tell the sender.
resultstringcreated | commented | ignored
curl https://work.nightroll.app/api/v1/desk.chat_request \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"chat_user":"<chat_user>","connection":1,"project":"<project>","provider":"<provider>","text":"<text>"}'
desk.chat_statuswrite

REST POST /api/v1/desk.chat_status · MCP tool desk_chat_status · scopes system

Input

chat_userrequiredstring
connectionrequiredinteger
keyrequiredstring

Output object

keystring
replystringWhat to tell the sender.
resultstringcreated | commented | ignored
curl https://work.nightroll.app/api/v1/desk.chat_status \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"chat_user":"<chat_user>","connection":1,"key":"<key>"}'
desk.customer_addwrite

REST POST /api/v1/desk.customer_add · MCP tool desk_customer_add · scopes issues:write

Input

emailrequiredstring
namerequiredstring

Output object

customerobject
passwordstringA password to hand to the customer (shown once); they sign in to the portal with it.
curl https://work.nightroll.app/api/v1/desk.customer_add \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"email":"<email>","name":"<name>"}'
desk.customer_blockwrite

REST POST /api/v1/desk.customer_block · MCP tool desk_customer_block · scopes admin

Input

blockedrequiredboolean
idrequiredinteger

Output object

activebooleanThey've set a password (signed up, or were given one).
blockedboolean
created_atinteger
emailstring
idinteger
last_seen_atinteger
namestring
requestsinteger
curl https://work.nightroll.app/api/v1/desk.customer_block \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"blocked":true,"id":1}'
desk.customer_resetwrite

REST POST /api/v1/desk.customer_reset · MCP tool desk_customer_reset · scopes issues:write

Input

idrequiredinteger

Output object

customerobject
passwordstringA password to hand to the customer (shown once); they sign in to the portal with it.
curl https://work.nightroll.app/api/v1/desk.customer_reset \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
desk.customersread

REST POST /api/v1/desk.customers · MCP tool desk_customers · scopes issues:read

Input

qstring

Output object[]

activebooleanThey've set a password (signed up, or were given one).
blockedboolean
created_atinteger
emailstring
idinteger
last_seen_atinteger
namestring
requestsinteger
curl https://work.nightroll.app/api/v1/desk.customers \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
desk.deflection_statsread

REST POST /api/v1/desk.deflection_stats · MCP tool desk_deflection_stats · scopes issues:read

Input

projectrequiredstring

Output object

requestsinteger
solvedinteger
topany[][]Articles that solved the most, with counts.
viewedintegerThe last 30 days.
curl https://work.nightroll.app/api/v1/desk.deflection_stats \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"project":"<project>"}'
desk.email_addresswrite

REST POST /api/v1/desk.email_address · MCP tool desk_email_address · scopes admin

Input

projectrequiredstring

Output object

pathstringPOST inbound email here (Postmark, Mailgun, SendGrid inbound parse, or JSON `{from, name, subject, text}`).
curl https://work.nightroll.app/api/v1/desk.email_address \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"project":"<project>"}'
desk.email_ingestwrite

REST POST /api/v1/desk.email_ingest · MCP tool desk_email_ingest · scopes system

Input

fromrequiredstringThe sender's address and name.
namestring
subjectstring
textstring
tokenrequiredstringThe token in the desk's email webhook address.

Output object

keystring
replystringWhat to tell the sender.
resultstringcreated | commented | ignored
curl https://work.nightroll.app/api/v1/desk.email_ingest \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"from":"<from>","token":"<token>"}'
desk.listread

REST POST /api/v1/desk.list · MCP tool desk_list · scopes issues:read

Input

None: send {}.

Output object[]

enabledboolean
introstring
kb_spacestringThe pages space whose articles the portal suggests (W704).
namestring
open_signupbooleanAnyone may create a portal account (else agents add customers).
projectstring
curl https://work.nightroll.app/api/v1/desk.list \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
desk.portal_articlewrite

REST POST /api/v1/desk.portal_article · MCP tool desk_portal_article · scopes desk:public

Input

idrequiredstring

Output object

idstring
textstringMarkdown.
titlestring
curl https://work.nightroll.app/api/v1/desk.portal_article \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":"<id>"}'
desk.portal_commentwrite

REST POST /api/v1/desk.portal_comment · MCP tool desk_portal_comment · scopes desk:portal

Input

bodyrequiredstring
keyrequiredstring

Output object

okboolean
curl https://work.nightroll.app/api/v1/desk.portal_comment \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"body":"<body>","key":"<key>"}'
desk.portal_createwrite

REST POST /api/v1/desk.portal_create · MCP tool desk_portal_create · scopes desk:portal

Input

titlerequiredstring
typerequiredinteger
valuesobject

Output object

categorystring
created_atinteger
deskstring
keystring
request_typestring
statusstringThe lane's name, and its category (todo | in_progress | done).
titlestring
updated_atinteger
curl https://work.nightroll.app/api/v1/desk.portal_create \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"title":"<title>","type":1}'
desk.portal_formwrite

REST POST /api/v1/desk.portal_form · MCP tool desk_portal_form · scopes desk:portal

Input

typerequiredinteger
valuesobject

Output any

curl https://work.nightroll.app/api/v1/desk.portal_form \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"type":1}'
desk.portal_infowrite

REST POST /api/v1/desk.portal_info · MCP tool desk_portal_info · scopes desk:public

Input

None: send {}.

Output object[]

has_articlesbooleanHelp articles to suggest (W704).
introstring
namestring
open_signupboolean
projectstring
typesobject[]
curl https://work.nightroll.app/api/v1/desk.portal_info \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
desk.portal_loginwrite

REST POST /api/v1/desk.portal_login · MCP tool desk_portal_login · scopes desk:public

Input

emailrequiredstring
passwordrequiredstring

Output object

customerobject
tokenstring`Authorization: Bearer kbc_…` for the portal ops.
curl https://work.nightroll.app/api/v1/desk.portal_login \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"email":"<email>","password":"<password>"}'
desk.portal_logoutwrite

REST POST /api/v1/desk.portal_logout · MCP tool desk_portal_logout · scopes desk:portal

Input

None: send {}.

Output object

okboolean
curl https://work.nightroll.app/api/v1/desk.portal_logout \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
desk.portal_mewrite

REST POST /api/v1/desk.portal_me · MCP tool desk_portal_me · scopes desk:portal

Input

None: send {}.

Output object

activebooleanThey've set a password (signed up, or were given one).
blockedboolean
created_atinteger
emailstring
idinteger
last_seen_atinteger
namestring
requestsinteger
curl https://work.nightroll.app/api/v1/desk.portal_me \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
desk.portal_requestwrite

REST POST /api/v1/desk.portal_request · MCP tool desk_portal_request · scopes desk:portal

Input

keyrequiredstring

Output object

commentsobject[]
descriptionstring
requestobject
curl https://work.nightroll.app/api/v1/desk.portal_request \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"key":"<key>"}'
desk.portal_requestswrite

REST POST /api/v1/desk.portal_requests · MCP tool desk_portal_requests · scopes desk:portal

Input

None: send {}.

Output object[]

categorystring
created_atinteger
deskstring
keystring
request_typestring
statusstringThe lane's name, and its category (todo | in_progress | done).
titlestring
updated_atinteger
curl https://work.nightroll.app/api/v1/desk.portal_requests \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
desk.portal_signupwrite

REST POST /api/v1/desk.portal_signup · MCP tool desk_portal_signup · scopes desk:public

Input

emailrequiredstring
namerequiredstring
passwordrequiredstring

Output object

customerobject
tokenstring`Authorization: Bearer kbc_…` for the portal ops.
curl https://work.nightroll.app/api/v1/desk.portal_signup \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"email":"<email>","name":"<name>","password":"<password>"}'
desk.portal_solvedwrite

REST POST /api/v1/desk.portal_solved · MCP tool desk_portal_solved · scopes desk:public

Input

pagerequiredstringThe article that answered it.
querystring
typeinteger

Output object

okboolean
curl https://work.nightroll.app/api/v1/desk.portal_solved \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"page":"<page>"}'
desk.portal_suggestwrite

REST POST /api/v1/desk.portal_suggest · MCP tool desk_portal_suggest · scopes desk:public

Input

textrequiredstringWhat the customer typed so far.
typeintegerThe request type being filled (its desk's knowledge base); none = every desk's.

Output object[]

idstring
snippetstring
titlestring
curl https://work.nightroll.app/api/v1/desk.portal_suggest \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"text":"<text>"}'
desk.queueread

REST POST /api/v1/desk.queue · MCP tool desk_queue · scopes issues:read

Input

idrequiredinteger
limitinteger

Output object

queueobject
rowsobject[]
totalinteger
curl https://work.nightroll.app/api/v1/desk.queue \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
desk.queue_deletedestructive

REST POST /api/v1/desk.queue_delete · MCP tool desk_queue_delete · scopes admin

Input

idrequiredinteger

Output object

okboolean
curl https://work.nightroll.app/api/v1/desk.queue_delete \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
desk.queue_savewrite

REST POST /api/v1/desk.queue_save · MCP tool desk_queue_save · scopes admin

Input

idinteger
namerequiredstring
projectrequiredstring
tqlrequiredstringTQL; `project = <key>` is added.

Output object[]

idinteger
namestring
projectstring
tqlstring
curl https://work.nightroll.app/api/v1/desk.queue_save \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"name":"<name>","project":"<project>","tql":"<tql>"}'
desk.requestread

REST POST /api/v1/desk.request · MCP tool desk_request · scopes issues:read

Input

keyrequiredstring

Output object

channelstringportal | agent
created_atinteger
customerobject
issueinteger
keystring
participantsinteger[]
projectstring
typeintegerRequest type id and name.
type_namestring
curl https://work.nightroll.app/api/v1/desk.request \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"key":"<key>"}'
desk.request_createwrite

REST POST /api/v1/desk.request_create · MCP tool desk_request_create · scopes issues:write

Input

customerrequiredinteger
titlerequiredstring
typerequiredinteger
valuesobject

Output any

curl https://work.nightroll.app/api/v1/desk.request_create \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"customer":1,"title":"<title>","type":1}'
desk.savewrite

REST POST /api/v1/desk.save · MCP tool desk_save · scopes admin

Input

enabledrequiredboolean
introstring
kb_spacestringA pages space to suggest articles from (empty = none).
namestringThe portal's name for this desk (default: the project's).
open_signupboolean
projectrequiredstring

Output object

deskobject
queuesobject[]
typesobject[]
curl https://work.nightroll.app/api/v1/desk.save \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"enabled":true,"project":"<project>"}'
desk.settingsread

REST POST /api/v1/desk.settings · MCP tool desk_settings · scopes issues:read

Input

projectrequiredstring

Output object

deskobject
queuesobject[]
typesobject[]
curl https://work.nightroll.app/api/v1/desk.settings \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"project":"<project>"}'
desk.type_deletedestructive

REST POST /api/v1/desk.type_delete · MCP tool desk_type_delete · scopes admin

Input

idrequiredinteger

Output object[]

descriptionstring
enabledboolean
fieldsobject[]
idinteger
kindstringThe issue type key requests of this type get.
namestring
positionnumber
projectstring
curl https://work.nightroll.app/api/v1/desk.type_delete \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
desk.type_savewrite

REST POST /api/v1/desk.type_save · MCP tool desk_type_save · scopes admin

Input

descriptionstring
enabledboolean
fieldsobject[]
idinteger
kindrequiredstringIssue type key.
namerequiredstring
positionnumber
projectrequiredstring

Output object[]

descriptionstring
enabledboolean
fieldsobject[]
idinteger
kindstringThe issue type key requests of this type get.
namestring
positionnumber
projectstring
curl https://work.nightroll.app/api/v1/desk.type_save \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"kind":"<kind>","name":"<name>","project":"<project>"}'

diagrams

diagrams.renderread

REST POST /api/v1/diagrams.render · MCP tool diagrams_render · scopes diagrams:read

Input

coderequiredstring
kindrequiredstringplantuml

Output object

errorstring
idinteger
serverstringThe server that rendered it.
statestringpending (being rendered) | ok | error
svgstringThe SVG (PlantUML draws syntax errors into it too); show it as an image, never inline.
curl https://work.nightroll.app/api/v1/diagrams.render \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"code":"<code>","kind":"<kind>"}'
diagrams.render_resultwrite

REST POST /api/v1/diagrams.render_result · MCP tool diagrams_render_result · scopes system

Input

errorstring
idrequiredinteger
okrequiredboolean
svgstring

Output object

errorstring
idinteger
serverstringThe server that rendered it.
statestringpending (being rendered) | ok | error
svgstringThe SVG (PlantUML draws syntax errors into it too); show it as an image, never inline.
curl https://work.nightroll.app/api/v1/diagrams.render_result \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1,"ok":true}'
diagrams.settingsread

REST POST /api/v1/diagrams.settings · MCP tool diagrams_settings · scopes diagrams:read

Input

None: send {}.

Output object

plantuml_enabledbooleanPlantUML diagrams render (their source is sent to `plantuml_server`).
plantuml_serverstringBase URL of the PlantUML server (`…/plantuml`, the part before `/svg`).
curl https://work.nightroll.app/api/v1/diagrams.settings \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
diagrams.settings_setwrite

REST POST /api/v1/diagrams.settings_set · MCP tool diagrams_settings_set · scopes admin

Input

plantuml_enabledboolean
plantuml_serverstring

Output object

plantuml_enabledbooleanPlantUML diagrams render (their source is sent to `plantuml_server`).
plantuml_serverstringBase URL of the PlantUML server (`…/plantuml`, the part before `/svg`).
curl https://work.nightroll.app/api/v1/diagrams.settings_set \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'

errors

errors.ingestwrite

REST POST /api/v1/errors.ingest · MCP tool errors_ingest · scopes system

Input

bodyrequiredstring
headersrequiredobjectRequest headers, lowercase names (plus `token` from the query string).
sourcerequiredinteger

Output object

issuestring
resultstringcreated | updated | reopened | resolved | ignored | refused
curl https://work.nightroll.app/api/v1/errors.ingest \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"body":"<body>","headers":"<headers>","source":1}'
errors.issueread

REST POST /api/v1/errors.issue · MCP tool errors_issue · scopes errors:read

Input

keyrequiredstring

Output object[]

countinteger
culpritstring
environmentstring
first_seeninteger
last_seeninteger
levelstring
providerstring
resolvedboolean
sourcestring
titlestring
urlstring
curl https://work.nightroll.app/api/v1/errors.issue \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"key":"<key>"}'
errors.source_deletedestructive

REST POST /api/v1/errors.source_delete · MCP tool errors_source_delete · scopes admin

Input

idrequiredinteger

Output object

created_atinteger
created_bystring
deliveriesinteger
groupsintegerError groups seen.
hook_pathstringWebhook path (after the site's address).
idinteger
kindstringIssue type for new issues ("" = the project's default).
labelsstring[]Labels for new issues (existing labels).
last_errorstring
last_event_atinteger
namestring
prioritystringPriority for new issues ("" = the default).
projectstringProject the issues go to.
providerstringsentry | datadog | rollbar
reopenbooleanReopen a done issue when its error happens again.
curl https://work.nightroll.app/api/v1/errors.source_delete \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
errors.source_savewrite

REST POST /api/v1/errors.source_save · MCP tool errors_source_save · scopes admin

Input

idinteger
kindstring
labelsstring[]
namestring
prioritystring
projectstring
providerstringsentry | datadog | rollbar (new sources).
reopenboolean
secretstringSentry: the integration's client secret. Datadog and Rollbar get a generated token when omitted.

Output object

secretstringThe secret/token, when it was generated now (paste it into Datadog's header or Rollbar's URL).
sourceobject
curl https://work.nightroll.app/api/v1/errors.source_save \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
errors.source_secretwrite

REST POST /api/v1/errors.source_secret · MCP tool errors_source_secret · scopes admin

Input

idrequiredinteger

Output object

secretstring
curl https://work.nightroll.app/api/v1/errors.source_secret \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
errors.sourcesread

REST POST /api/v1/errors.sources · MCP tool errors_sources · scopes errors:read

Input

None: send {}.

Output object[]

created_atinteger
created_bystring
deliveriesinteger
groupsintegerError groups seen.
hook_pathstringWebhook path (after the site's address).
idinteger
kindstringIssue type for new issues ("" = the project's default).
labelsstring[]Labels for new issues (existing labels).
last_errorstring
last_event_atinteger
namestring
prioritystringPriority for new issues ("" = the default).
projectstringProject the issues go to.
providerstringsentry | datadog | rollbar
reopenbooleanReopen a done issue when its error happens again.
curl https://work.nightroll.app/api/v1/errors.sources \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'

export

export.buildwriteWhat the cell passes in: members and teams live in the directory, outside the org file.

REST POST /api/v1/export.build · MCP tool export_build · scopes system

Input

directoryrequiredany
idrequiredinteger

Output any

curl https://work.nightroll.app/api/v1/export.build \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"directory":"<directory>","id":1}'
export.downloadwrite

REST POST /api/v1/export.download · MCP tool export_download · scopes owner

Input

as_urlbooleanA download link instead of the bytes, where the deployment serves files from their own origin.
idrequiredinteger

Output object

datastringBase64 of the `.tar` (empty when `url` is given).
namestring
urlstringWith `as_url`, where the deployment has a files origin: a five-minute link that downloads it.
curl https://work.nightroll.app/api/v1/export.download \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
export.listwrite

REST POST /api/v1/export.list · MCP tool export_list · scopes owner

Input

None: send {}.

Output object[]

countsanyWhat's inside: rows per table, issues, pages, files.
created_atinteger
errorstring
finished_atinteger
idinteger
requested_bystring
sizeintegerBytes of the archive.
statestringqueued | ready | failed
curl https://work.nightroll.app/api/v1/export.list \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
export.startwrite

REST POST /api/v1/export.start · MCP tool export_start · scopes owner

Input

None: send {}.

Output object

countsanyWhat's inside: rows per table, issues, pages, files.
created_atinteger
errorstring
finished_atinteger
idinteger
requested_bystring
sizeintegerBytes of the archive.
statestringqueued | ready | failed
curl https://work.nightroll.app/api/v1/export.start \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'

feedback

feedback.board_savewrite

REST POST /api/v1/feedback.board_save · MCP tool feedback_board_save · scopes admin

Input

descriptionstring
enabledboolean
idinteger
namerequiredstring
visibilitystringpublic | signed_in | team

Output object[]

descriptionstring
enabledboolean
idinteger
namestring
positionnumber
visibilitystringpublic (anyone, signed out too) | signed_in (portal accounts) | team (members only)
curl https://work.nightroll.app/api/v1/feedback.board_save \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"name":"<name>"}'
feedback.boardsread

REST POST /api/v1/feedback.boards · MCP tool feedback_boards · scopes feedback:read

Input

None: send {}.

Output object[]

descriptionstring
enabledboolean
idinteger
namestring
positionnumber
visibilitystringpublic (anyone, signed out too) | signed_in (portal accounts) | team (members only)
curl https://work.nightroll.app/api/v1/feedback.boards \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
feedback.createwrite

REST POST /api/v1/feedback.create · MCP tool feedback_create · scopes feedback:write

Input

boardrequiredinteger
bodystring
titlerequiredstring

Output object

authorstringA member id, or `customer:<id>`.
author_namestringThe author's name when they're a customer.
boardinteger
bodystring
created_atinteger
idinteger
issuesstring[]Linked issue keys (team views only).
merged_intointegerMerged into this idea (its votes moved there).
shipped_atinteger
statusstringunder_review | planned | in_progress | shipped | declined
titlestring
updated_atinteger
votedbooleanThe caller voted for it.
votesinteger
curl https://work.nightroll.app/api/v1/feedback.create \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"board":1,"title":"<title>"}'
feedback.idearead

REST POST /api/v1/feedback.idea · MCP tool feedback_idea · scopes feedback:read

Input

idrequiredinteger

Output object

commentsany[][]Public comments (portal) or all (team): (id, author name, mine, body, internal, created_at).
ideaobject
votersstring[]Voters (team views only): member ids and customer names.
curl https://work.nightroll.app/api/v1/feedback.idea \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
feedback.ideasread

REST POST /api/v1/feedback.ideas · MCP tool feedback_ideas · scopes feedback:read

Input

boardinteger
qstring
sortstringvotes (default) | new | updated
statusstring

Output object[]

authorstringA member id, or `customer:<id>`.
author_namestringThe author's name when they're a customer.
boardinteger
bodystring
created_atinteger
idinteger
issuesstring[]Linked issue keys (team views only).
merged_intointegerMerged into this idea (its votes moved there).
shipped_atinteger
statusstringunder_review | planned | in_progress | shipped | declined
titlestring
updated_atinteger
votedbooleanThe caller voted for it.
votesinteger
curl https://work.nightroll.app/api/v1/feedback.ideas \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
feedback.mergewrite

REST POST /api/v1/feedback.merge · MCP tool feedback_merge · scopes feedback:write

Input

idrequiredintegerThe duplicate.
intorequiredintegerThe idea it goes into (votes move there).

Output object

authorstringA member id, or `customer:<id>`.
author_namestringThe author's name when they're a customer.
boardinteger
bodystring
created_atinteger
idinteger
issuesstring[]Linked issue keys (team views only).
merged_intointegerMerged into this idea (its votes moved there).
shipped_atinteger
statusstringunder_review | planned | in_progress | shipped | declined
titlestring
updated_atinteger
votedbooleanThe caller voted for it.
votesinteger
curl https://work.nightroll.app/api/v1/feedback.merge \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1,"into":1}'
feedback.portal_boardswrite

REST POST /api/v1/feedback.portal_boards · MCP tool feedback_portal_boards · scopes desk:public

Input

None: send {}.

Output object[]

descriptionstring
enabledboolean
idinteger
namestring
positionnumber
visibilitystringpublic (anyone, signed out too) | signed_in (portal accounts) | team (members only)
curl https://work.nightroll.app/api/v1/feedback.portal_boards \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
feedback.portal_commentwrite

REST POST /api/v1/feedback.portal_comment · MCP tool feedback_portal_comment · scopes desk:portal

Input

bodyrequiredstring
idrequiredinteger

Output object

commentsany[][]Public comments (portal) or all (team): (id, author name, mine, body, internal, created_at).
ideaobject
votersstring[]Voters (team views only): member ids and customer names.
curl https://work.nightroll.app/api/v1/feedback.portal_comment \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"body":"<body>","id":1}'
feedback.portal_ideawrite

REST POST /api/v1/feedback.portal_idea · MCP tool feedback_portal_idea · scopes desk:public

Input

idrequiredinteger

Output object

commentsany[][]Public comments (portal) or all (team): (id, author name, mine, body, internal, created_at).
ideaobject
votersstring[]Voters (team views only): member ids and customer names.
curl https://work.nightroll.app/api/v1/feedback.portal_idea \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
feedback.portal_ideaswrite

REST POST /api/v1/feedback.portal_ideas · MCP tool feedback_portal_ideas · scopes desk:public

Input

boardinteger
qstring
sortstringvotes (default) | new | updated
statusstring

Output object[]

authorstringA member id, or `customer:<id>`.
author_namestringThe author's name when they're a customer.
boardinteger
bodystring
created_atinteger
idinteger
issuesstring[]Linked issue keys (team views only).
merged_intointegerMerged into this idea (its votes moved there).
shipped_atinteger
statusstringunder_review | planned | in_progress | shipped | declined
titlestring
updated_atinteger
votedbooleanThe caller voted for it.
votesinteger
curl https://work.nightroll.app/api/v1/feedback.portal_ideas \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
feedback.portal_similarwrite

REST POST /api/v1/feedback.portal_similar · MCP tool feedback_portal_similar · scopes desk:public

Input

boardinteger
textrequiredstring

Output object[]

idinteger
statusstring
titlestring
votesinteger
curl https://work.nightroll.app/api/v1/feedback.portal_similar \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"text":"<text>"}'
feedback.portal_submitwrite

REST POST /api/v1/feedback.portal_submit · MCP tool feedback_portal_submit · scopes desk:portal

Input

boardrequiredinteger
bodystring
titlerequiredstring

Output object

authorstringA member id, or `customer:<id>`.
author_namestringThe author's name when they're a customer.
boardinteger
bodystring
created_atinteger
idinteger
issuesstring[]Linked issue keys (team views only).
merged_intointegerMerged into this idea (its votes moved there).
shipped_atinteger
statusstringunder_review | planned | in_progress | shipped | declined
titlestring
updated_atinteger
votedbooleanThe caller voted for it.
votesinteger
curl https://work.nightroll.app/api/v1/feedback.portal_submit \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"board":1,"title":"<title>"}'
feedback.portal_votewrite

REST POST /api/v1/feedback.portal_vote · MCP tool feedback_portal_vote · scopes desk:portal

Input

idrequiredinteger
onbooleanfalse takes the vote back.

Output object

authorstringA member id, or `customer:<id>`.
author_namestringThe author's name when they're a customer.
boardinteger
bodystring
created_atinteger
idinteger
issuesstring[]Linked issue keys (team views only).
merged_intointegerMerged into this idea (its votes moved there).
shipped_atinteger
statusstringunder_review | planned | in_progress | shipped | declined
titlestring
updated_atinteger
votedbooleanThe caller voted for it.
votesinteger
curl https://work.nightroll.app/api/v1/feedback.portal_vote \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
feedback.updatewrite

REST POST /api/v1/feedback.update · MCP tool feedback_update · scopes feedback:write

Input

boardinteger
bodystring
idrequiredinteger
statusstring
titlestring

Output object

authorstringA member id, or `customer:<id>`.
author_namestringThe author's name when they're a customer.
boardinteger
bodystring
created_atinteger
idinteger
issuesstring[]Linked issue keys (team views only).
merged_intointegerMerged into this idea (its votes moved there).
shipped_atinteger
statusstringunder_review | planned | in_progress | shipped | declined
titlestring
updated_atinteger
votedbooleanThe caller voted for it.
votesinteger
curl https://work.nightroll.app/api/v1/feedback.update \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
feedback.votewrite

REST POST /api/v1/feedback.vote · MCP tool feedback_vote · scopes feedback:write

Input

idrequiredinteger
onbooleanfalse takes the vote back.

Output object

authorstringA member id, or `customer:<id>`.
author_namestringThe author's name when they're a customer.
boardinteger
bodystring
created_atinteger
idinteger
issuesstring[]Linked issue keys (team views only).
merged_intointegerMerged into this idea (its votes moved there).
shipped_atinteger
statusstringunder_review | planned | in_progress | shipped | declined
titlestring
updated_atinteger
votedbooleanThe caller voted for it.
votesinteger
curl https://work.nightroll.app/api/v1/feedback.vote \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'

flags

flags.listread

REST POST /api/v1/flags.list · MCP tool flags_list · scopes flags:read

Input

None: send {}.

Output object

flagsobject[]Every flag set for the org (unset flags use the code's default).
modulesobject[]Every module in this cell and whether it's on for the org.
curl https://work.nightroll.app/api/v1/flags.list \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
flags.setwrite

REST POST /api/v1/flags.set · MCP tool flags_set · scopes admin

Input

keyrequiredstring`module:<name>` or `feature:<name>`.
valuerequiredanyJSON value (usually true/false); null clears it back to the default.

Output object

keystring`module:<name>` or `feature:<name>`.
updated_atinteger
updated_bystring
valueany
curl https://work.nightroll.app/api/v1/flags.set \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"key":"<key>","value":"<value>"}'

forms

forms.evaluateread

REST POST /api/v1/forms.evaluate · MCP tool forms_evaluate · scopes issues:read

Input

kindrequiredstring
projectrequiredstring
valuesanyThe form's current values, issue-shaped (built-ins by name, custom fields under `fields`).

Output object

curl https://work.nightroll.app/api/v1/forms.evaluate \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"kind":"<kind>","project":"<project>"}'
forms.rule_deletedestructive

REST POST /api/v1/forms.rule_delete · MCP tool forms_rule_delete · scopes admin

Input

idrequiredinteger

Output object

deletedintegerRows removed or moved (a project counts itself plus its issues; an option counts the issues it moved).
curl https://work.nightroll.app/api/v1/forms.rule_delete \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
forms.rule_reorderwrite

REST POST /api/v1/forms.rule_reorder · MCP tool forms_rule_reorder · scopes admin

Input

idsrequiredinteger[]

Output object[]

actionsobject[]
conditionsobject[]All must hold (empty = always).
enabledboolean
idinteger
kindsstring[]Issue type keys; empty = every type.
namestring
positionnumber
projectsstring[]Project keys; empty = every project.
curl https://work.nightroll.app/api/v1/forms.rule_reorder \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"ids":1}'
forms.rule_savewrite

REST POST /api/v1/forms.rule_save · MCP tool forms_rule_save · scopes admin

Input

actionsrequiredobject[]
conditionsobject[]
enabledboolean
idinteger
kindsstring[]
namerequiredstring
projectsstring[]

Output object[]

actionsobject[]
conditionsobject[]All must hold (empty = always).
enabledboolean
idinteger
kindsstring[]Issue type keys; empty = every type.
namestring
positionnumber
projectsstring[]Project keys; empty = every project.
curl https://work.nightroll.app/api/v1/forms.rule_save \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"actions":[],"name":"<name>"}'
forms.rulesread

REST POST /api/v1/forms.rules · MCP tool forms_rules · scopes issues:read

Input

None: send {}.

Output object[]

actionsobject[]
conditionsobject[]All must hold (empty = always).
enabledboolean
idinteger
kindsstring[]Issue type keys; empty = every type.
namestring
positionnumber
projectsstring[]Project keys; empty = every project.
curl https://work.nightroll.app/api/v1/forms.rules \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'

git

git.branchread

REST POST /api/v1/git.branch · MCP tool git_branch · scopes git:read

Input

keyrequiredstring

Output object

branchstring
checkoutstringThe command that creates it locally.
pr_titlestring
curl https://work.nightroll.app/api/v1/git.branch \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"key":"<key>"}'
git.connection_createwrite

REST POST /api/v1/git.connection_create · MCP tool git_connection_create · scopes admin

Input

namerequiredstring
providerrequiredstring

Output object

connectionobject
secretstringThe webhook secret to paste into the provider (also readable later by admins).
curl https://work.nightroll.app/api/v1/git.connection_create \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"name":"<name>","provider":"<provider>"}'
git.connection_deletedestructive

REST POST /api/v1/git.connection_delete · MCP tool git_connection_delete · scopes admin

Input

idrequiredinteger

Output object

created_atinteger
created_bystring
deliveriesinteger
hook_pathstringWebhook path to give the provider (after the site's address).
idinteger
last_errorstringWhy the last delivery was refused (bad signature, …), if it was.
last_event_atinteger
namestring
providerstringgithub | gitlab | bitbucket | gitea
reposstring[]
curl https://work.nightroll.app/api/v1/git.connection_delete \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
git.connection_secretwrite

REST POST /api/v1/git.connection_secret · MCP tool git_connection_secret · scopes admin

Input

idrequiredinteger

Output object

secretstring
curl https://work.nightroll.app/api/v1/git.connection_secret \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
git.connectionsread

REST POST /api/v1/git.connections · MCP tool git_connections · scopes git:read

Input

None: send {}.

Output object[]

created_atinteger
created_bystring
deliveriesinteger
hook_pathstringWebhook path to give the provider (after the site's address).
idinteger
last_errorstringWhy the last delivery was refused (bad signature, …), if it was.
last_event_atinteger
namestring
providerstringgithub | gitlab | bitbucket | gitea
reposstring[]
curl https://work.nightroll.app/api/v1/git.connections \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
git.doraread

REST POST /api/v1/git.dora · MCP tool git_dora · scopes git:read

Input

daysintegerWindow in days (default 30).
projectstringOnly deployments linked to this project's issues.

Output object

change_failure_ratenumberFailed share of finished production deployments, 0–1.
daysinteger
deploymentsintegerSuccessful production deployments in the window.
deployments_per_daynumber
environmentsstring[]
lead_time_hoursnumberMedian hours from an issue's first commit to its first successful production deployment.
restore_hoursnumberMedian hours from a failed production deployment to the next successful one in the same repo and environment.
seriesany[][][day (YYYY-MM-DD), successes, failures] per day with deployments.
curl https://work.nightroll.app/api/v1/git.dora \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
git.ingestwrite

REST POST /api/v1/git.ingest · MCP tool git_ingest · scopes system

Input

authorsobjectMembers whose email the body mentions, `{email: {id, scopes, teams}}`, so smart commits act as their authors.
bodyrequiredstringThe raw body, as received (the signature covers it byte for byte).
connectionrequiredinteger
headersrequiredobjectRequest headers, lowercase names.

Output object

linkedstring[]
resultstringaccepted | ignored (an event this module doesn't use) | refused (bad signature)
curl https://work.nightroll.app/api/v1/git.ingest \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"body":"<body>","connection":1,"headers":"<headers>"}'
git.issueread

REST POST /api/v1/git.issue · MCP tool git_issue · scopes git:read

Input

keyrequiredstring

Output object

branchesobject[]
buildsobject[]The latest run of each build (workflow, pipeline, status context), newest first.
commitsobject[]Newest first, at most 50.
deploymentsobject[]The latest deployment to each environment, newest first.
flagsobject[]Feature flags (LaunchDarkly, Unleash) linked to the issue.
prsobject[]
curl https://work.nightroll.app/api/v1/git.issue \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"key":"<key>"}'
git.reportwrite

REST POST /api/v1/git.report · MCP tool git_report · scopes git:write

Input

branchstring
idrequiredstringYour CI's id for this run or deployment; reporting the same id again updates it.
keysstring[]Issue keys it delivers, besides those found in the branch, message and linked commits.
kindrequiredstringbuild | deployment
messagestring
namerequiredstringBuild name (workflow, job), or the environment for a deployment.
reporequiredstringRepository name (`acme/web`); builds and deployments reported through the API are grouped under it.
shastring
statusrequiredstringqueued | running | success | failure | cancelled (pending for deployments); common CI words are mapped.
urlstring

Output object

linkedstring[]
curl https://work.nightroll.app/api/v1/git.report \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":"<id>","kind":"<kind>","name":"<name>","repo":"<repo>","status":"<status>"}'
git.settingsread

REST POST /api/v1/git.settings · MCP tool git_settings · scopes git:read

Input

None: send {}.

Output object

branch_templatestringBranch name for "branch from issue": {key}, {summary} (the title as a slug), {type}, {project}.
merge_statusstringWhen a linked PR merges, move its issues to this status key ("" = don't; "@done" = the project's first done lane).
pr_templatestringPull request title: {key}, {title}, {type}, {project}.
production_envsstringComma-separated environment names that count as production (DORA metrics, release badges).
smart_commitsbooleanRun `#comment`, `#time` and `#<transition>` commands in commit messages, as the member whose email wrote the commit.
curl https://work.nightroll.app/api/v1/git.settings \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
git.settings_savewrite

REST POST /api/v1/git.settings_save · MCP tool git_settings_save · scopes admin

Input

branch_templaterequiredstringBranch name for "branch from issue": {key}, {summary} (the title as a slug), {type}, {project}.
merge_statusrequiredstringWhen a linked PR merges, move its issues to this status key ("" = don't; "@done" = the project's first done lane).
pr_templaterequiredstringPull request title: {key}, {title}, {type}, {project}.
production_envsstringComma-separated environment names that count as production (DORA metrics, release badges).
smart_commitsrequiredbooleanRun `#comment`, `#time` and `#<transition>` commands in commit messages, as the member whose email wrote the commit.

Output object

branch_templatestringBranch name for "branch from issue": {key}, {summary} (the title as a slug), {type}, {project}.
merge_statusstringWhen a linked PR merges, move its issues to this status key ("" = don't; "@done" = the project's first done lane).
pr_templatestringPull request title: {key}, {title}, {type}, {project}.
production_envsstringComma-separated environment names that count as production (DORA metrics, release badges).
smart_commitsbooleanRun `#comment`, `#time` and `#<transition>` commands in commit messages, as the member whose email wrote the commit.
curl https://work.nightroll.app/api/v1/git.settings_save \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"branch_template":"<branch_template>","merge_status":"<merge_status>","pr_template":"<pr_template>","smart_commits":true}'
git.version_deploymentsread

REST POST /api/v1/git.version_deployments · MCP tool git_version_deployments · scopes git:read

Input

projectrequiredstring
versionrequiredinteger

Output object[]

deployedintegerOf the version's fix issues, how many have a successful deployment here.
environmentstring
issuesinteger
last_atinteger
last_statusstring
productionboolean
curl https://work.nightroll.app/api/v1/git.version_deployments \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"project":"<project>","version":1}'

imports

imports.cancelwrite

REST POST /api/v1/imports.cancel · MCP tool imports_cancel · scopes admin

Input

idrequiredinteger

Output object

base_urlstring
created_atinteger
created_bystring
errorstring
finished_atinteger
idinteger
logstring[]The latest lines (≤ 200).
namestring
optionsany
pendingintegerRequests still queued.
sourcestringjira
started_atinteger
statestringqueued | running | done | failed | cancelled
statsanyCounts so far (projects, issues, comments, attachments, …).
curl https://work.nightroll.app/api/v1/imports.cancel \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
imports.historyread

REST POST /api/v1/imports.history · MCP tool imports_history · scopes issues:read

Input

keyrequiredstring

Output object[]

atinteger
authorstring
fieldstring
from_valuestring
to_valuestring
curl https://work.nightroll.app/api/v1/imports.history \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"key":"<key>"}'
imports.nextwrite

REST POST /api/v1/imports.next · MCP tool imports_next · scopes system

Input

runrequiredinteger

Output object

binarybooleanAnswer bytes as base64 (attachments).
bodystring
doneboolean
headersany[][][name, value] pairs, credentials included (cell-internal).
methodstring
taskinteger
urlstring
curl https://work.nightroll.app/api/v1/imports.next \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"run":1}'
imports.resumewrite

REST POST /api/v1/imports.resume · MCP tool imports_resume · scopes system

Input

runrequiredinteger

Output object

doneboolean
curl https://work.nightroll.app/api/v1/imports.resume \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"run":1}'
imports.runswrite

REST POST /api/v1/imports.runs · MCP tool imports_runs · scopes admin

Input

None: send {}.

Output object[]

base_urlstring
created_atinteger
created_bystring
errorstring
finished_atinteger
idinteger
logstring[]The latest lines (≤ 200).
namestring
optionsany
pendingintegerRequests still queued.
sourcestringjira
started_atinteger
statestringqueued | running | done | failed | cancelled
statsanyCounts so far (projects, issues, comments, attachments, …).
curl https://work.nightroll.app/api/v1/imports.runs \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
imports.startwrite

REST POST /api/v1/imports.start · MCP tool imports_start · scopes admin

Input

attachmentsbooleanBring attachments (≤ 10 MB each).
base_urlstringThe site, e.g. https://acme.atlassian.net or your Data Center address. Others: empty for the public service (or your GitHub Enterprise API address).
emailstringJira/Confluence Cloud: your Atlassian account email (with an API token); Data Center: empty, with a personal access token. Trello: your API key (with a token).
projectsstring[]What to bring: Jira project keys, Confluence space keys, GitHub `owner/repo`s, Linear team keys, Trello board ids, Asana project ids. Empty = all the token can see (not for GitHub and Trello; Notion: every page shared with the integration, into one space named by the first entry).
sourcerequiredstringjira | confluence | github | linear | trello | asana | notion
tokenstringEmpty for a public site that allows anonymous reads.

Output object

base_urlstring
created_atinteger
created_bystring
errorstring
finished_atinteger
idinteger
logstring[]The latest lines (≤ 200).
namestring
optionsany
pendingintegerRequests still queued.
sourcestringjira
started_atinteger
statestringqueued | running | done | failed | cancelled
statsanyCounts so far (projects, issues, comments, attachments, …).
curl https://work.nightroll.app/api/v1/imports.start \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"source":"<source>"}'
imports.stepwrite

REST POST /api/v1/imports.step · MCP tool imports_step · scopes system

Input

bodystringText, or base64 for binary tasks.
errorstringWhy there was no answer.
membersobjectThe org's members `{email: id}`, to match people.
runrequiredinteger
statusrequiredintegerHTTP status (0 = no answer).
taskrequiredinteger
teamsobjectThe org's teams `{name: id}`, to match groups.

Output object

doneboolean
curl https://work.nightroll.app/api/v1/imports.step \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"run":1,"status":1,"task":1}'
imports.sync_savewrite

REST POST /api/v1/imports.sync_save · MCP tool imports_sync_save · scopes admin

Input

directionstringboth | in
everyinteger
idrequiredinteger
pausedbooleanPaused: nothing is polled or sent; changes made here wait in the queue.
statusesobject

Output object

base_urlstring
created_atinteger
created_bystring
errorstring
finished_atinteger
idinteger
logstring[]The latest lines (≤ 200).
namestring
optionsany
pendingintegerRequests still queued.
sourcestringjira
started_atinteger
statestringqueued | running | done | failed | cancelled
statsanyCounts so far (projects, issues, comments, attachments, …).
curl https://work.nightroll.app/api/v1/imports.sync_save \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
imports.sync_startwrite

REST POST /api/v1/imports.sync_start · MCP tool imports_sync_start · scopes admin

Input

attachmentsbooleanBring attachments (≤ 10 MB each).
base_urlrequiredstringThe Jira site: https://acme.atlassian.net or your Data Center address.
directionstringboth | in (Jira → here only).
emailstringCloud: your Atlassian account email (with an API token); Data Center: empty, with a personal access token.
everyintegerSeconds between polls (60–3600, default 120).
jira_projectrequiredstringThe Jira project key.
projectstringA project here to link instead (issues matched by number); empty = the Jira project is imported first.
statusesobjectJira status name → lane name here, where they differ.
tokenstringNeeded to write to Jira; empty only for a read-only mirror (`direction: in`) of a public site.

Output object

base_urlstring
created_atinteger
created_bystring
errorstring
finished_atinteger
idinteger
logstring[]The latest lines (≤ 200).
namestring
optionsany
pendingintegerRequests still queued.
sourcestringjira
started_atinteger
statestringqueued | running | done | failed | cancelled
statsanyCounts so far (projects, issues, comments, attachments, …).
curl https://work.nightroll.app/api/v1/imports.sync_start \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"base_url":"<base_url>","jira_project":"<jira_project>"}'
imports.userswrite

REST POST /api/v1/imports.users · MCP tool imports_users · scopes admin

Input

runrequiredinteger

Output object[]

emailstring
extstring
memberstringThe member they were matched to (by email), if any.
namestring
curl https://work.nightroll.app/api/v1/imports.users \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"run":1}'

incidents

incidents.declarewrite

REST POST /api/v1/incidents.declare · MCP tool incidents_declare · scopes incidents:write

Input

commanderstringMember id (default: whoever declares it).
issuesstring[]Issue keys it touches.
severitystringA severity key (default: the least severe).
summarystring
titlerequiredstring

Output object

incidentobject
pagesany[][]Paging attempts: (provider name, action, state, error, at).
timelineobject[]
curl https://work.nightroll.app/api/v1/incidents.declare \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"title":"<title>"}'
incidents.getread

REST POST /api/v1/incidents.get · MCP tool incidents_get · scopes incidents:read

Input

idrequiredinteger

Output object

incidentobject
pagesany[][]Paging attempts: (provider name, action, state, error, at).
timelineobject[]
curl https://work.nightroll.app/api/v1/incidents.get \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
incidents.listread

REST POST /api/v1/incidents.list · MCP tool incidents_list · scopes incidents:read

Input

openbooleanOnly open ones (not resolved).

Output object[]

commanderstringThe incident commander (a member id).
created_bystring
idinteger
issuesstring[]Linked issue keys.
last_update_atintegerWhen the last status update was posted.
postmortemstringIts postmortem page (W706).
resolved_atinteger
severitystring
started_atinteger
statusstringinvestigating | identified | monitoring | resolved
summarystring
titlestring
updated_atinteger
curl https://work.nightroll.app/api/v1/incidents.list \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
incidents.notewrite

REST POST /api/v1/incidents.note · MCP tool incidents_note · scopes incidents:write

Input

bodyrequiredstring
idrequiredinteger

Output object

incidentobject
pagesany[][]Paging attempts: (provider name, action, state, error, at).
timelineobject[]
curl https://work.nightroll.app/api/v1/incidents.note \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"body":"<body>","id":1}'
incidents.pagewrite

REST POST /api/v1/incidents.page · MCP tool incidents_page · scopes incidents:write

Input

idrequiredinteger

Output object

incidentobject
pagesany[][]Paging attempts: (provider name, action, state, error, at).
timelineobject[]
curl https://work.nightroll.app/api/v1/incidents.page \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
incidents.page_requestwrite

REST POST /api/v1/incidents.page_request · MCP tool incidents_page_request · scopes system

Input

idrequiredinteger

Output object

bodystring
gonebooleanNothing to send (the pager or incident is gone).
headersany[][]
methodstring
urlstring
curl https://work.nightroll.app/api/v1/incidents.page_request \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
incidents.page_resultwrite

REST POST /api/v1/incidents.page_result · MCP tool incidents_page_result · scopes system

Input

bodystring
errorstring
idrequiredinteger
statusrequiredinteger

Output object

okboolean
curl https://work.nightroll.app/api/v1/incidents.page_result \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1,"status":1}'
incidents.pager_deletedestructive

REST POST /api/v1/incidents.pager_delete · MCP tool incidents_pager_delete · scopes admin

Input

idrequiredinteger

Output object[]

enabledboolean
idinteger
last_errorstring
namestring
providerstringpagerduty | opsgenie
regionstringOpsgenie: us | eu.
severitiesstring[]Severities it pages for (empty = every severity marked “page”).
curl https://work.nightroll.app/api/v1/incidents.pager_delete \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
incidents.pager_savewrite

REST POST /api/v1/incidents.pager_save · MCP tool incidents_pager_save · scopes admin

Input

enabledboolean
idinteger
keystringPagerDuty: an Events API v2 integration (routing) key. Opsgenie: an API integration key. Left out keeps it.
namestring
providerstringpagerduty | opsgenie
regionstring
severitiesstring[]

Output object[]

enabledboolean
idinteger
last_errorstring
namestring
providerstringpagerduty | opsgenie
regionstringOpsgenie: us | eu.
severitiesstring[]Severities it pages for (empty = every severity marked “page”).
curl https://work.nightroll.app/api/v1/incidents.pager_save \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
incidents.pagerswrite

REST POST /api/v1/incidents.pagers · MCP tool incidents_pagers · scopes admin

Input

None: send {}.

Output object[]

enabledboolean
idinteger
last_errorstring
namestring
providerstringpagerduty | opsgenie
regionstringOpsgenie: us | eu.
severitiesstring[]Severities it pages for (empty = every severity marked “page”).
curl https://work.nightroll.app/api/v1/incidents.pagers \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
incidents.postmortemwrite

REST POST /api/v1/incidents.postmortem · MCP tool incidents_postmortem · scopes incidents:write

Input

aibooleanLet the org's AI draft the summary and a root-cause hypothesis.
idrequiredinteger
spacerequiredstringThe pages space to write it in.

Output object

ai_notestringWhy the AI part was skipped, if it was.
createdbooleanMade now (false: the incident already had one).
pagestringThe page (a draft until someone publishes it).
curl https://work.nightroll.app/api/v1/incidents.postmortem \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1,"space":"<space>"}'
incidents.severitiesread

REST POST /api/v1/incidents.severities · MCP tool incidents_severities · scopes incidents:read

Input

None: send {}.

Output object[]

colorstring
keystring
namestring
pagebooleanDeclaring (or raising to) this severity pages on-call.
positionnumber
update_minutesintegerRemind the commander when no update was posted for this long (0 = never).
curl https://work.nightroll.app/api/v1/incidents.severities \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
incidents.severity_deletedestructive

REST POST /api/v1/incidents.severity_delete · MCP tool incidents_severity_delete · scopes admin

Input

keyrequiredstring

Output object[]

colorstring
keystring
namestring
pagebooleanDeclaring (or raising to) this severity pages on-call.
positionnumber
update_minutesintegerRemind the commander when no update was posted for this long (0 = never).
curl https://work.nightroll.app/api/v1/incidents.severity_delete \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"key":"<key>"}'
incidents.severity_savewrite

REST POST /api/v1/incidents.severity_save · MCP tool incidents_severity_save · scopes admin

Input

colorstring
keystringOmit to make one (from the name).
namerequiredstring
pageboolean
positionnumber
update_minutesinteger

Output object[]

colorstring
keystring
namestring
pagebooleanDeclaring (or raising to) this severity pages on-call.
positionnumber
update_minutesintegerRemind the commander when no update was posted for this long (0 = never).
curl https://work.nightroll.app/api/v1/incidents.severity_save \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"name":"<name>"}'
incidents.updatewrite

REST POST /api/v1/incidents.update · MCP tool incidents_update · scopes incidents:write

Input

commanderstringMember id; empty clears.
idrequiredinteger
messagestringA status update for the timeline.
publicbooleanThe update is public (for a status page); default true.
severitystring
statusstringinvestigating | identified | monitoring | resolved
summarystring
titlestring

Output object

incidentobject
pagesany[][]Paging attempts: (provider name, action, state, error, at).
timelineobject[]
curl https://work.nightroll.app/api/v1/incidents.update \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'

issues

issues.assignwrite

REST POST /api/v1/issues.assign · MCP tool issues_assign · scopes issues:write

Input

assigneerequiredstringMember id; empty string unassigns.
basestringThe assignee you saw (null = unassigned); see `issues.update` `base`.
keyrequiredstring

Output object

affects_versionsstring[]
assigneestring
categorystringThe lane's category: todo | in_progress | done.
childrenintegerChildren (issues whose parent this is).
componentsstring[]
created_atinteger
created_bystring
descriptionstring
description_docstringThe description as a rich document (TipTap JSON); null when there's only the markdown `description`.
due_datestringYYYY-MM-DD
epicstringKey of the epic (level-1 ancestor: the parent, or a sub-task's grandparent).
fieldsobjectCustom field values by key, formulas computed.
fix_versionsstring[]
idintegerInternal id; comments use the subject `issue:{id}`.
keystring`{project}-{number}`, e.g. "KB-12".
kindstring
labelsstring[]Label keys.
noticesobject[]Only on `issues.update` / `issues.assign` answers: fields someone else changed since `base` that yours replaced.
numberinteger
parentstringKey of the parent issue (one hierarchy level up).
pointsnumberStory points.
prioritystring
projectstring
rankstringBacklog order within the project: sort by this text, ascending (see `issues.rank`). Null until the backfill runs.
recurringstringday | week | month when this issue is a recurring template.
resolutionstringResolution key; set while in a done lane.
resolved_atinteger
securityintegerSecurity level id: only its members (plus the reporter, assignee and admins) see the issue. Null = the project's viewers.
sprintintegerSprint id; null = backlog.
start_datestringYYYY-MM-DD
statusstringLane key within the project.
titlestring
updated_atinteger
votesinteger
watchersinteger
curl https://work.nightroll.app/api/v1/issues.assign \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"assignee":"<assignee>","key":"<key>"}'
issues.board_getread

REST POST /api/v1/issues.board_get · MCP tool issues_board_get · scopes issues:read

Input

projectrequiredstring

Output object

can_editbooleanThe caller may change this (project admins).
card_fieldsstring[]Which of key, kind, priority, labels, epic, parent, points, assignee, due cards show.
projectstring
quick_filtersobject[]
swimlanesstringnone | assignee | epic | priority
wipobjectStatus key → most cards that column should hold (a warning, never a block).
curl https://work.nightroll.app/api/v1/issues.board_get \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"project":"<project>"}'
issues.board_savewrite

REST POST /api/v1/issues.board_save · MCP tool issues_board_save · scopes issues:write

Input

card_fieldsrequiredstring[]
projectrequiredstring
quick_filtersrequiredobject[]
swimlanesrequiredstring
wiprequiredobject

Output object

can_editbooleanThe caller may change this (project admins).
card_fieldsstring[]Which of key, kind, priority, labels, epic, parent, points, assignee, due cards show.
projectstring
quick_filtersobject[]
swimlanesstringnone | assignee | epic | priority
wipobjectStatus key → most cards that column should hold (a warning, never a block).
curl https://work.nightroll.app/api/v1/issues.board_save \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"card_fields":[],"project":"<project>","quick_filters":[],"swimlanes":"<swimlanes>","wip":"<wip>"}'
issues.bulkdestructive

REST POST /api/v1/issues.bulk · MCP tool issues_bulk · scopes issues:write

Input

assigneestringMember id; "" unassigns.
deletebooleanDelete them (sub-tasks go with their parents).
dry_runbooleanWork it out and show what would change, then roll it all back.
fieldsobjectCustom field values to set on each.
fix_versions_addstring[]Version names to add as fix versions.
keysrequiredstring[]Issue keys to change (max 500). All changes apply or none do.
labels_addstring[]
labels_removestring[]
move_tostringMove them to this project.
parentstringParent key; null clears.
prioritystring
resolutionstring
sprintintegerSprint id; null = backlog.
statusstring

Output object

deletedinteger
previewobject[]dry_run: what each affected issue would look like.
undointegerPass to `issues.bulk_undo` until `undo_until` to put everything back.
undo_untilinteger
updatedstring[]Keys after the change (moved issues have new keys).
curl https://work.nightroll.app/api/v1/issues.bulk \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"keys":[]}'
issues.bulk_undodestructive

REST POST /api/v1/issues.bulk_undo · MCP tool issues_bulk_undo · scopes issues:write

Input

forcebooleanUndo even over changes made to these issues since (they're lost).
idrequiredinteger

Output object

restoredstring[]Issues put back as they were.
curl https://work.nightroll.app/api/v1/issues.bulk_undo \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
issues.bulk_undosdestructive

REST POST /api/v1/issues.bulk_undos · MCP tool issues_bulk_undos · scopes issues:write

Input

None: send {}.

Output object[]

created_atinteger
expires_atinteger
idinteger
summarystring
curl https://work.nightroll.app/api/v1/issues.bulk_undos \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
issues.burndownread

REST POST /api/v1/issues.burndown · MCP tool issues_burndown · scopes issues:read

Input

idrequiredinteger

Output object

daysobject[]One entry per day from the start through today (or the end); days without changes carry the last snapshot.
sprintobject
curl https://work.nightroll.app/api/v1/issues.burndown \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
issues.calendar_feed_deleteread

REST POST /api/v1/issues.calendar_feed_delete · MCP tool issues_calendar_feed_delete · scopes issues:read

Input

idrequiredinteger

Output object

idinteger
curl https://work.nightroll.app/api/v1/issues.calendar_feed_delete \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
issues.calendar_feed_rotateread

REST POST /api/v1/issues.calendar_feed_rotate · MCP tool issues_calendar_feed_rotate · scopes issues:read

Input

idrequiredinteger

Output object

feedobject
pathstringThe feed's address after the site's: `/cal/{org}/{token}.ics`. Shown once; rotate to get a new one.
curl https://work.nightroll.app/api/v1/issues.calendar_feed_rotate \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
issues.calendar_feed_saveread

REST POST /api/v1/issues.calendar_feed_save · MCP tool issues_calendar_feed_save · scopes issues:read

Input

dueboolean
idinteger
namestring
projectsstring[]
releasesboolean
sprintsboolean
tqlstring

Output object

feedobject
pathstringThe feed's address after the site's: `/cal/{org}/{token}.ics`. Shown once; rotate to get a new one.
curl https://work.nightroll.app/api/v1/issues.calendar_feed_save \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
issues.calendar_feedsread

REST POST /api/v1/issues.calendar_feeds · MCP tool issues_calendar_feeds · scopes issues:read

Input

None: send {}.

Output object[]

created_atinteger
dueboolean
idinteger
last_fetched_atinteger
namestring
projectsstring[]Sprints and releases of these projects (empty = every project you can see).
releasesboolean
sprintsboolean
tqlstringWhich issues' due dates (empty = every issue you can see that has one).
curl https://work.nightroll.app/api/v1/issues.calendar_feeds \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
issues.calendar_icsread

REST POST /api/v1/issues.calendar_ics · MCP tool issues_calendar_ics · scopes issues:read

Input

originstringThe site's address, for issue links.
tokenrequiredstring

Output object

icsstring
curl https://work.nightroll.app/api/v1/issues.calendar_ics \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"token":"<token>"}'
issues.calendar_ownerwrite

REST POST /api/v1/issues.calendar_owner · MCP tool issues_calendar_owner · scopes system

Input

originstringThe site's address, for issue links.
tokenrequiredstring

Output object

memberstring
curl https://work.nightroll.app/api/v1/issues.calendar_owner \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"token":"<token>"}'
issues.carry_overwrite

REST POST /api/v1/issues.carry_over · MCP tool issues_carry_over · scopes issues:write

Input

keyrequiredstring

Output object

affects_versionsstring[]
assigneestring
categorystringThe lane's category: todo | in_progress | done.
childrenintegerChildren (issues whose parent this is).
componentsstring[]
created_atinteger
created_bystring
descriptionstring
description_docstringThe description as a rich document (TipTap JSON); null when there's only the markdown `description`.
due_datestringYYYY-MM-DD
epicstringKey of the epic (level-1 ancestor: the parent, or a sub-task's grandparent).
fieldsobjectCustom field values by key, formulas computed.
fix_versionsstring[]
idintegerInternal id; comments use the subject `issue:{id}`.
keystring`{project}-{number}`, e.g. "KB-12".
kindstring
labelsstring[]Label keys.
noticesobject[]Only on `issues.update` / `issues.assign` answers: fields someone else changed since `base` that yours replaced.
numberinteger
parentstringKey of the parent issue (one hierarchy level up).
pointsnumberStory points.
prioritystring
projectstring
rankstringBacklog order within the project: sort by this text, ascending (see `issues.rank`). Null until the backfill runs.
recurringstringday | week | month when this issue is a recurring template.
resolutionstringResolution key; set while in a done lane.
resolved_atinteger
securityintegerSecurity level id: only its members (plus the reporter, assignee and admins) see the issue. Null = the project's viewers.
sprintintegerSprint id; null = backlog.
start_datestringYYYY-MM-DD
statusstringLane key within the project.
titlestring
updated_atinteger
votesinteger
watchersinteger
curl https://work.nightroll.app/api/v1/issues.carry_over \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"key":"<key>"}'
issues.clonewrite

REST POST /api/v1/issues.clone · MCP tool issues_clone · scopes issues:write

Input

keyrequiredstring
linksbooleanCopy the original's links (default false). The clone is always linked to it ("clones").
subtasksbooleanClone sub-tasks too (default true).
titlestringDefaults to "CLONE - <title>".

Output object

affects_versionsstring[]
assigneestring
categorystringThe lane's category: todo | in_progress | done.
childrenintegerChildren (issues whose parent this is).
componentsstring[]
created_atinteger
created_bystring
descriptionstring
description_docstringThe description as a rich document (TipTap JSON); null when there's only the markdown `description`.
due_datestringYYYY-MM-DD
epicstringKey of the epic (level-1 ancestor: the parent, or a sub-task's grandparent).
fieldsobjectCustom field values by key, formulas computed.
fix_versionsstring[]
idintegerInternal id; comments use the subject `issue:{id}`.
keystring`{project}-{number}`, e.g. "KB-12".
kindstring
labelsstring[]Label keys.
noticesobject[]Only on `issues.update` / `issues.assign` answers: fields someone else changed since `base` that yours replaced.
numberinteger
parentstringKey of the parent issue (one hierarchy level up).
pointsnumberStory points.
prioritystring
projectstring
rankstringBacklog order within the project: sort by this text, ascending (see `issues.rank`). Null until the backfill runs.
recurringstringday | week | month when this issue is a recurring template.
resolutionstringResolution key; set while in a done lane.
resolved_atinteger
securityintegerSecurity level id: only its members (plus the reporter, assignee and admins) see the issue. Null = the project's viewers.
sprintintegerSprint id; null = backlog.
start_datestringYYYY-MM-DD
statusstringLane key within the project.
titlestring
updated_atinteger
votesinteger
watchersinteger
curl https://work.nightroll.app/api/v1/issues.clone \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"key":"<key>"}'
issues.component_deletedestructive

REST POST /api/v1/issues.component_delete · MCP tool issues_component_delete · scopes issues:write

Input

idrequiredinteger
move_tointegerIssues move to this version instead of losing it.

Output object

deletedintegerRows removed or moved (a project counts itself plus its issues; an option counts the issues it moved).
curl https://work.nightroll.app/api/v1/issues.component_delete \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
issues.component_savewrite

REST POST /api/v1/issues.component_save · MCP tool issues_component_save · scopes issues:write

Input

default_assigneestringMember id; "" clears.
descriptionstring
idintegerOmit to create.
leadstringMember id; "" clears.
namestring
projectstringRequired to create.

Output object

default_assigneestringNew issues with this component and no assignee go to this member.
descriptionstring
idinteger
issuesintegerIssues with this component.
leadstring
namestring
projectstring
curl https://work.nightroll.app/api/v1/issues.component_save \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
issues.componentsread

REST POST /api/v1/issues.components · MCP tool issues_components · scopes issues:read

Input

projectrequiredstring

Output object[]

default_assigneestringNew issues with this component and no assignee go to this member.
descriptionstring
idinteger
issuesintegerIssues with this component.
leadstring
namestring
projectstring
curl https://work.nightroll.app/api/v1/issues.components \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"project":"<project>"}'
issues.createwrite

REST POST /api/v1/issues.create · MCP tool issues_create · scopes issues:write

Input

affects_versionsstring[]
assigneestringMember id. Defaults to a component's default assignee.
componentsstring[]Component names of the project.
descriptionstringMarkdown (what search, TQL, mentions and agents read).
description_docstringThe same description as a rich document (TipTap JSON, as the web editor writes it); optional.
due_datestringYYYY-MM-DD
fieldsobjectCustom field values by field key (see `issues.fields`). Fields left out get their default.
fix_versionsstring[]Version names of the project.
kindstringDefaults to the first type.
labelsstring[]Label keys.
parentstringKey of the parent: an issue of the type one level up (a story's epic, a sub-task's story).
pointsnumber
prioritystringDefaults to the last (least urgent) priority.
projectrequiredstringProject key, e.g. "KB".
securityintegerSecurity level id (you must be one of its members).
sprintintegerIgnored for sub-tasks, which follow their parent.
start_datestringYYYY-MM-DD, on or before the due date (the timeline draws start → due).
statusstringA lane key of the project; defaults to its first "todo" lane.
titlerequiredstring

Output object

affects_versionsstring[]
assigneestring
categorystringThe lane's category: todo | in_progress | done.
childrenintegerChildren (issues whose parent this is).
componentsstring[]
created_atinteger
created_bystring
descriptionstring
description_docstringThe description as a rich document (TipTap JSON); null when there's only the markdown `description`.
due_datestringYYYY-MM-DD
epicstringKey of the epic (level-1 ancestor: the parent, or a sub-task's grandparent).
fieldsobjectCustom field values by key, formulas computed.
fix_versionsstring[]
idintegerInternal id; comments use the subject `issue:{id}`.
keystring`{project}-{number}`, e.g. "KB-12".
kindstring
labelsstring[]Label keys.
noticesobject[]Only on `issues.update` / `issues.assign` answers: fields someone else changed since `base` that yours replaced.
numberinteger
parentstringKey of the parent issue (one hierarchy level up).
pointsnumberStory points.
prioritystring
projectstring
rankstringBacklog order within the project: sort by this text, ascending (see `issues.rank`). Null until the backfill runs.
recurringstringday | week | month when this issue is a recurring template.
resolutionstringResolution key; set while in a done lane.
resolved_atinteger
securityintegerSecurity level id: only its members (plus the reporter, assignee and admins) see the issue. Null = the project's viewers.
sprintintegerSprint id; null = backlog.
start_datestringYYYY-MM-DD
statusstringLane key within the project.
titlestring
updated_atinteger
votesinteger
watchersinteger
curl https://work.nightroll.app/api/v1/issues.create \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"project":"<project>","title":"<title>"}'
issues.dashboard_deletedestructive

REST POST /api/v1/issues.dashboard_delete · MCP tool issues_dashboard_delete · scopes issues:write

Input

idrequiredinteger

Output object

deletedintegerRows removed or moved (a project counts itself plus its issues; an option counts the issues it moved).
curl https://work.nightroll.app/api/v1/issues.dashboard_delete \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
issues.dashboard_getread

REST POST /api/v1/issues.dashboard_get · MCP tool issues_dashboard_get · scopes issues:read

Input

idrequiredinteger

Output object

can_editboolean
created_atinteger
editorsstring[]
gadgetsobject[]
idinteger
namestring
ownerstring
updated_atinteger
viewersstring[]Who else sees it (`everyone`, `admins`, `team:<id>`, member ids). Empty = only the owner.
curl https://work.nightroll.app/api/v1/issues.dashboard_get \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
issues.dashboard_savewrite

REST POST /api/v1/issues.dashboard_save · MCP tool issues_dashboard_save · scopes issues:write

Input

editorsstring[]
gadgetsobject[]
idinteger
namerequiredstring
viewersstring[]

Output object

can_editboolean
created_atinteger
editorsstring[]
gadgetsobject[]
idinteger
namestring
ownerstring
updated_atinteger
viewersstring[]Who else sees it (`everyone`, `admins`, `team:<id>`, member ids). Empty = only the owner.
curl https://work.nightroll.app/api/v1/issues.dashboard_save \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"name":"<name>"}'
issues.dashboardsread

REST POST /api/v1/issues.dashboards · MCP tool issues_dashboards · scopes issues:read

Input

None: send {}.

Output object[]

can_editboolean
created_atinteger
editorsstring[]
gadgetsobject[]
idinteger
namestring
ownerstring
updated_atinteger
viewersstring[]Who else sees it (`everyone`, `admins`, `team:<id>`, member ids). Empty = only the owner.
curl https://work.nightroll.app/api/v1/issues.dashboards \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
issues.deletedestructive

REST POST /api/v1/issues.delete · MCP tool issues_delete · scopes issues:write

Input

keyrequiredstringIssue key, e.g. "KB-12". Keys from before a move still work.

Output object

deletedintegerRows removed or moved (a project counts itself plus its issues; an option counts the issues it moved).
curl https://work.nightroll.app/api/v1/issues.delete \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"key":"<key>"}'
issues.field_deletedestructive

REST POST /api/v1/issues.field_delete · MCP tool issues_field_delete · scopes admin

Input

idrequiredinteger

Output object

deletedintegerRows removed or moved (a project counts itself plus its issues; an option counts the issues it moved).
curl https://work.nightroll.app/api/v1/issues.field_delete \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
issues.field_savewrite

REST POST /api/v1/issues.field_save · MCP tool issues_field_save · scopes admin

Input

default_valueanynull clears.
descriptionstring
formulastring
idintegerOmit to create.
keystringCreate only; derived from the name when omitted.
kindsstring[]
namestring
optionsobject[]
positionnumber
projectsstring[]
requiredboolean
typestringCreate only. text | textarea | number | select | multiselect | cascade | user | users | date | url | labels | formula

Output object

default_valueanyValue new issues start with.
descriptionstring
formulastringFormula fields: arithmetic over number fields and `points`, e.g. `{reach} * {impact} / {points}`.
idinteger
keystringStable key used in `fields` on issues.
kindsstring[]Issue type keys that use this field; empty = all.
namestring
optionsobject[]Choices for select, multiselect and cascade.
positionnumber
projectsstring[]Project keys that use this field; empty = all.
requiredboolean
typestringtext | textarea | number | select | multiselect | cascade | user | users | date | url | labels | formula
curl https://work.nightroll.app/api/v1/issues.field_save \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
issues.fieldsread

REST POST /api/v1/issues.fields · MCP tool issues_fields · scopes issues:read

Input

None: send {}.

Output object[]

default_valueanyValue new issues start with.
descriptionstring
formulastringFormula fields: arithmetic over number fields and `points`, e.g. `{reach} * {impact} / {points}`.
idinteger
keystringStable key used in `fields` on issues.
kindsstring[]Issue type keys that use this field; empty = all.
namestring
optionsobject[]Choices for select, multiselect and cascade.
positionnumber
projectsstring[]Project keys that use this field; empty = all.
requiredboolean
typestringtext | textarea | number | select | multiselect | cascade | user | users | date | url | labels | formula
curl https://work.nightroll.app/api/v1/issues.fields \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
issues.filter_deletedestructive

REST POST /api/v1/issues.filter_delete · MCP tool issues_filter_delete · scopes issues:write

Input

idrequiredinteger

Output object

deletedintegerRows removed or moved (a project counts itself plus its issues; an option counts the issues it moved).
curl https://work.nightroll.app/api/v1/issues.filter_delete \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
issues.filter_runreadRuns a saved filter as the caller (their permissions apply), optionally within one project.

REST POST /api/v1/issues.filter_run · MCP tool issues_filter_run · scopes issues:read

Input

idrequiredinteger
limitinteger
offsetinteger
projectstringOnly this project's issues (boards pass theirs).

Output object

issuesobject[]
limitinteger
offsetinteger
totalintegerEvery match you can see.
curl https://work.nightroll.app/api/v1/issues.filter_run \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
issues.filter_savewrite

REST POST /api/v1/issues.filter_save · MCP tool issues_filter_save · scopes issues:write

Input

descriptionstring
editorsstring[]
idintegerOmit to create.
namestring
tqlstringTQL; checked when saved.
viewersstring[]

Output object

can_editbooleanThe caller may change it.
created_atinteger
descriptionstring
editorsstring[]Who else may change or delete it (same entries).
idinteger
namestring
ownerstring
tqlstring
updated_atinteger
viewersstring[]Who else sees it: `everyone`, `admins`, `team:<id>`, member ids. Empty = only the owner.
curl https://work.nightroll.app/api/v1/issues.filter_save \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
issues.filter_subsread

REST POST /api/v1/issues.filter_subs · MCP tool issues_filter_subs · scopes issues:read

Input

filterintegerOnly subscriptions to this filter.

Output object[]

atstringHH:MM in the subscriber's own time.
everystringdaily | weekdays | weekly
filterinteger
filter_namestring
idinteger
last_sentstringThe subscriber's local date of the last email.
skip_emptybooleanSend nothing when the filter matches no issues.
tz_offsetintegerMinutes behind UTC (the browser's `getTimezoneOffset()`).
weekdayintegerweekly: 0 Sunday … 6 Saturday.
curl https://work.nightroll.app/api/v1/issues.filter_subs \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
issues.filter_subscriberead

REST POST /api/v1/issues.filter_subscribe · MCP tool issues_filter_subscribe · scopes issues:read

Input

atrequiredstringHH:MM, 24-hour, your own time.
everyrequiredstringdaily | weekdays | weekly
filterrequiredinteger
idintegerOmit to subscribe; give one of yours to change it.
skip_emptyboolean
tz_offsetinteger
weekdayintegerweekly: 0 Sunday … 6 Saturday (default Monday).

Output object

atstringHH:MM in the subscriber's own time.
everystringdaily | weekdays | weekly
filterinteger
filter_namestring
idinteger
last_sentstringThe subscriber's local date of the last email.
skip_emptybooleanSend nothing when the filter matches no issues.
tz_offsetintegerMinutes behind UTC (the browser's `getTimezoneOffset()`).
weekdayintegerweekly: 0 Sunday … 6 Saturday.
curl https://work.nightroll.app/api/v1/issues.filter_subscribe \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"at":"<at>","every":"<every>","filter":1}'
issues.filter_unsubscriberead

REST POST /api/v1/issues.filter_unsubscribe · MCP tool issues_filter_unsubscribe · scopes issues:read

Input

idrequiredinteger

Output object

deletedintegerRows removed or moved (a project counts itself plus its issues; an option counts the issues it moved).
curl https://work.nightroll.app/api/v1/issues.filter_unsubscribe \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
issues.filtersread

REST POST /api/v1/issues.filters · MCP tool issues_filters · scopes issues:read

Input

None: send {}.

Output object[]

can_editbooleanThe caller may change it.
created_atinteger
descriptionstring
editorsstring[]Who else may change or delete it (same entries).
idinteger
namestring
ownerstring
tqlstring
updated_atinteger
viewersstring[]Who else sees it: `everyone`, `admins`, `team:<id>`, member ids. Empty = only the owner.
curl https://work.nightroll.app/api/v1/issues.filters \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
issues.focusread

REST POST /api/v1/issues.focus · MCP tool issues_focus · scopes issues:read

Input

limitintegerDefault 10, max 50.

Output object

due_todayinteger
in_progressinteger
itemsobject[]
openintegerAll open issues assigned to you (the list may be cut).
overdueinteger
curl https://work.nightroll.app/api/v1/issues.focus \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
issues.gadgetread

REST POST /api/v1/issues.gadget · MCP tool issues_gadget · scopes issues:read

Input

configrequiredobject
typerequiredstring

Output object

bucketsobject[]pie.
gridobjecttwo_d.
healthobjectsprint_health (null when no sprint is active).
issuesobject[]filter: the first rows.
partialboolean
seriesobjectcreated_resolved.
totalintegerMatching issues counted, and whether there were more than the gadget reads.
curl https://work.nightroll.app/api/v1/issues.gadget \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"config":"<config>","type":"<type>"}'
issues.getread

REST POST /api/v1/issues.get · MCP tool issues_get · scopes issues:read

Input

keyrequiredstringIssue key, e.g. "KB-12". Keys from before a move still work.

Output object

affects_versionsstring[]
assigneestring
categorystringThe lane's category: todo | in_progress | done.
childrenintegerChildren (issues whose parent this is).
componentsstring[]
created_atinteger
created_bystring
descriptionstring
description_docstringThe description as a rich document (TipTap JSON); null when there's only the markdown `description`.
due_datestringYYYY-MM-DD
epicstringKey of the epic (level-1 ancestor: the parent, or a sub-task's grandparent).
fieldsobjectCustom field values by key, formulas computed.
fix_versionsstring[]
idintegerInternal id; comments use the subject `issue:{id}`.
keystring`{project}-{number}`, e.g. "KB-12".
kindstring
labelsstring[]Label keys.
noticesobject[]Only on `issues.update` / `issues.assign` answers: fields someone else changed since `base` that yours replaced.
numberinteger
parentstringKey of the parent issue (one hierarchy level up).
pointsnumberStory points.
prioritystring
projectstring
rankstringBacklog order within the project: sort by this text, ascending (see `issues.rank`). Null until the backfill runs.
recurringstringday | week | month when this issue is a recurring template.
resolutionstringResolution key; set while in a done lane.
resolved_atinteger
securityintegerSecurity level id: only its members (plus the reporter, assignee and admins) see the issue. Null = the project's viewers.
sprintintegerSprint id; null = backlog.
start_datestringYYYY-MM-DD
statusstringLane key within the project.
titlestring
updated_atinteger
votesinteger
watchersinteger
curl https://work.nightroll.app/api/v1/issues.get \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"key":"<key>"}'
issues.goal_deletedestructive

REST POST /api/v1/issues.goal_delete · MCP tool issues_goal_delete · scopes issues:write

Input

idrequiredinteger

Output object

deletedintegerRows removed or moved (a project counts itself plus its issues; an option counts the issues it moved).
curl https://work.nightroll.app/api/v1/issues.goal_delete \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
issues.goal_getread

REST POST /api/v1/issues.goal_get · MCP tool issues_goal_get · scopes issues:read

Input

idrequiredinteger

Output object

childrenobject[]Direct sub-goals (key results).
goalobject
issuesobject[]Linked issues the reader can see.
curl https://work.nightroll.app/api/v1/issues.goal_get \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
issues.goal_savewrite

REST POST /api/v1/issues.goal_save · MCP tool issues_goal_save · scopes issues:write

Input

descriptionstring
editorsstring[]
idinteger
metricobjectA number to move: progress is how far `current` has gone from `start` toward `target`.
namerequiredstring
ownerstringMember id; default you.
parentinteger
statusstringgoal_status key; default the first.
target_datestring

Output object

can_editboolean
descriptionstring
donenumber
editorsstring[]Who else may change it (owner and admins always can).
idinteger
linkedintegerLinked issues the reader can see, and the standard issues under them (done / total, points when any).
metricobjectA number to move: progress is how far `current` has gone from `start` toward `target`.
namestring
ownerstring
parentintegerThe objective this is a key result (or sub-goal) of.
positionnumber
progressinteger0-100: the metric, the linked work, and sub-goals averaged.
statusstringA goal_status option key (On track, At risk, Off track, Achieved by default; configurable).
target_datestringYYYY-MM-DD
totalnumber
unitstringpoints | issues
updated_atinteger
curl https://work.nightroll.app/api/v1/issues.goal_save \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"name":"<name>"}'
issues.goalsread

REST POST /api/v1/issues.goals · MCP tool issues_goals · scopes issues:read

Input

issuestringOnly goals this issue (key) is linked to.

Output object[]

can_editboolean
descriptionstring
donenumber
editorsstring[]Who else may change it (owner and admins always can).
idinteger
linkedintegerLinked issues the reader can see, and the standard issues under them (done / total, points when any).
metricobjectA number to move: progress is how far `current` has gone from `start` toward `target`.
namestring
ownerstring
parentintegerThe objective this is a key result (or sub-goal) of.
positionnumber
progressinteger0-100: the metric, the linked work, and sub-goals averaged.
statusstringA goal_status option key (On track, At risk, Off track, Achieved by default; configurable).
target_datestringYYYY-MM-DD
totalnumber
unitstringpoints | issues
updated_atinteger
curl https://work.nightroll.app/api/v1/issues.goals \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
issues.importwrite

REST POST /api/v1/issues.import · MCP tool issues_import · scopes issues:write

Input

dry_runbooleanValidate everything, create nothing.
projectrequiredstring
rowsrequiredany[]One object per issue, with the fields of `issues.create` (title required; project defaults to `project`).

Output object

createdstring[]Keys created (in a dry run: the keys they would get).
dry_runboolean
errorsobject[]
curl https://work.nightroll.app/api/v1/issues.import \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"project":"<project>","rows":[]}'
issues.import_onewrite

REST POST /api/v1/issues.import_one · MCP tool issues_import_one · scopes admin

Input

affects_versionsstring[]
assigneestringMember ids.
componentsstring[]
created_atintegerUnix seconds.
created_bystring
descriptionstring
due_datestring
fieldsobjectCustom field values by field key.
fix_versionsstring[]
kindstringNames; made when the org doesn't have them.
labelsstring[]
numberintegerThe number it had (PROJ-123 → 123); taken or missing = the next free one.
old_keystringIts key in the old tracker, when that differs from the new one: it keeps working.
parentstringKey of an already imported parent.
pointsnumber
prioritystring
projectrequiredstring
resolved_atinteger
sprintobject
statusstring
status_categorystringtodo | in_progress | done, for a lane that has to be made.
titlerequiredstring
updated_atinteger

Output object

affects_versionsstring[]
assigneestring
categorystringThe lane's category: todo | in_progress | done.
childrenintegerChildren (issues whose parent this is).
componentsstring[]
created_atinteger
created_bystring
descriptionstring
description_docstringThe description as a rich document (TipTap JSON); null when there's only the markdown `description`.
due_datestringYYYY-MM-DD
epicstringKey of the epic (level-1 ancestor: the parent, or a sub-task's grandparent).
fieldsobjectCustom field values by key, formulas computed.
fix_versionsstring[]
idintegerInternal id; comments use the subject `issue:{id}`.
keystring`{project}-{number}`, e.g. "KB-12".
kindstring
labelsstring[]Label keys.
noticesobject[]Only on `issues.update` / `issues.assign` answers: fields someone else changed since `base` that yours replaced.
numberinteger
parentstringKey of the parent issue (one hierarchy level up).
pointsnumberStory points.
prioritystring
projectstring
rankstringBacklog order within the project: sort by this text, ascending (see `issues.rank`). Null until the backfill runs.
recurringstringday | week | month when this issue is a recurring template.
resolutionstringResolution key; set while in a done lane.
resolved_atinteger
securityintegerSecurity level id: only its members (plus the reporter, assignee and admins) see the issue. Null = the project's viewers.
sprintintegerSprint id; null = backlog.
start_datestringYYYY-MM-DD
statusstringLane key within the project.
titlestring
updated_atinteger
votesinteger
watchersinteger
curl https://work.nightroll.app/api/v1/issues.import_one \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"project":"<project>","title":"<title>"}'
issues.listread

REST POST /api/v1/issues.list · MCP tool issues_list · scopes issues:read

Input

assigneestring
backlogbooleanOnly issues in no sprint.
componentstringComponent or fix version name (with `project`).
fix_versionstring
labelstring
parentstringParent key: its children (an epic's issues, a story's sub-tasks).
projectstring
qstringText in the key, title or description.
sprintinteger
statusstring

Output object[]

affects_versionsstring[]
assigneestring
categorystringThe lane's category: todo | in_progress | done.
childrenintegerChildren (issues whose parent this is).
componentsstring[]
created_atinteger
created_bystring
descriptionstring
description_docstringThe description as a rich document (TipTap JSON); null when there's only the markdown `description`.
due_datestringYYYY-MM-DD
epicstringKey of the epic (level-1 ancestor: the parent, or a sub-task's grandparent).
fieldsobjectCustom field values by key, formulas computed.
fix_versionsstring[]
idintegerInternal id; comments use the subject `issue:{id}`.
keystring`{project}-{number}`, e.g. "KB-12".
kindstring
labelsstring[]Label keys.
noticesobject[]Only on `issues.update` / `issues.assign` answers: fields someone else changed since `base` that yours replaced.
numberinteger
parentstringKey of the parent issue (one hierarchy level up).
pointsnumberStory points.
prioritystring
projectstring
rankstringBacklog order within the project: sort by this text, ascending (see `issues.rank`). Null until the backfill runs.
recurringstringday | week | month when this issue is a recurring template.
resolutionstringResolution key; set while in a done lane.
resolved_atinteger
securityintegerSecurity level id: only its members (plus the reporter, assignee and admins) see the issue. Null = the project's viewers.
sprintintegerSprint id; null = backlog.
start_datestringYYYY-MM-DD
statusstringLane key within the project.
titlestring
updated_atinteger
votesinteger
watchersinteger
curl https://work.nightroll.app/api/v1/issues.list \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
issues.movewrite

REST POST /api/v1/issues.move · MCP tool issues_move · scopes issues:write

Input

keyrequiredstring
projectrequiredstringTarget project key.
statusstringStatus in the target project; defaults to the same key if it exists there, else its first "todo" lane.

Output object

affects_versionsstring[]
assigneestring
categorystringThe lane's category: todo | in_progress | done.
childrenintegerChildren (issues whose parent this is).
componentsstring[]
created_atinteger
created_bystring
descriptionstring
description_docstringThe description as a rich document (TipTap JSON); null when there's only the markdown `description`.
due_datestringYYYY-MM-DD
epicstringKey of the epic (level-1 ancestor: the parent, or a sub-task's grandparent).
fieldsobjectCustom field values by key, formulas computed.
fix_versionsstring[]
idintegerInternal id; comments use the subject `issue:{id}`.
keystring`{project}-{number}`, e.g. "KB-12".
kindstring
labelsstring[]Label keys.
noticesobject[]Only on `issues.update` / `issues.assign` answers: fields someone else changed since `base` that yours replaced.
numberinteger
parentstringKey of the parent issue (one hierarchy level up).
pointsnumberStory points.
prioritystring
projectstring
rankstringBacklog order within the project: sort by this text, ascending (see `issues.rank`). Null until the backfill runs.
recurringstringday | week | month when this issue is a recurring template.
resolutionstringResolution key; set while in a done lane.
resolved_atinteger
securityintegerSecurity level id: only its members (plus the reporter, assignee and admins) see the issue. Null = the project's viewers.
sprintintegerSprint id; null = backlog.
start_datestringYYYY-MM-DD
statusstringLane key within the project.
titlestring
updated_atinteger
votesinteger
watchersinteger
curl https://work.nightroll.app/api/v1/issues.move \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"key":"<key>","project":"<project>"}'
issues.option_deletedestructive

REST POST /api/v1/issues.option_delete · MCP tool issues_option_delete · scopes issues:write

Input

idrequiredinteger
replace_withstringKey that issues currently using this option move to. Required when any do.

Output object

deletedintegerRows removed or moved (a project counts itself plus its issues; an option counts the issues it moved).
curl https://work.nightroll.app/api/v1/issues.option_delete \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
issues.option_reorderwrite

REST POST /api/v1/issues.option_reorder · MCP tool issues_option_reorder · scopes issues:write

Input

idsrequiredinteger[]Option ids of one list in their new order.

Output object[]

categorystringStatuses only: todo | in_progress | done. Drives "open", progress bars and dashboards.
colorstringHex color, or empty.
fieldstringstatus | priority | kind | label | retro | resolution | goal_status
iconstring`glyph:<name>`, emoji/text, or a `data:image/…` URL; empty for none.
idinteger
keystring
namestring
positionnumber
projectstringStatuses: the project whose lane this is, or null for the org template new projects copy.
rulesobjectTypes only (empty defaults otherwise).
curl https://work.nightroll.app/api/v1/issues.option_reorder \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"ids":1}'
issues.option_savewrite

REST POST /api/v1/issues.option_save · MCP tool issues_option_save · scopes issues:write

Input

categorystringStatuses: todo | in_progress | done
colorstring
fieldstringstatus | priority | kind | label | retro | resolution | goal_status (create only)
iconstring
idintegerOmit to create.
keystringStable key stored on issues; derived from the name when omitted (create only).
namestring
positionnumberDefaults to the end of the list.
projectstringStatuses: project key for a project lane, omit for the org template (create only).
rulesobjectTypes only: replaces the type's rules.

Output object

categorystringStatuses only: todo | in_progress | done. Drives "open", progress bars and dashboards.
colorstringHex color, or empty.
fieldstringstatus | priority | kind | label | retro | resolution | goal_status
iconstring`glyph:<name>`, emoji/text, or a `data:image/…` URL; empty for none.
idinteger
keystring
namestring
positionnumber
projectstringStatuses: the project whose lane this is, or null for the org template new projects copy.
rulesobjectTypes only (empty defaults otherwise).
curl https://work.nightroll.app/api/v1/issues.option_save \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
issues.option_scheme_deletedestructive

REST POST /api/v1/issues.option_scheme_delete · MCP tool issues_option_scheme_delete · scopes admin

Input

idrequiredinteger

Output object

deletedintegerRows removed or moved (a project counts itself plus its issues; an option counts the issues it moved).
curl https://work.nightroll.app/api/v1/issues.option_scheme_delete \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
issues.option_scheme_savewrite

REST POST /api/v1/issues.option_scheme_save · MCP tool issues_option_scheme_save · scopes admin

Input

default_keystring
fieldrequiredstringpriority | resolution (fixed once created)
idinteger
keysrequiredstring[]
namerequiredstring

Output object[]

default_keystringFor new issues (priority) or when nothing else picks one (resolution); null = the usual (last priority, first resolution) among `keys`.
fieldstringpriority | resolution
idinteger
keysstring[]Option keys in it (shown in the org's order).
namestring
projectsstring[]Projects using it.
curl https://work.nightroll.app/api/v1/issues.option_scheme_save \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"field":"<field>","keys":[],"name":"<name>"}'
issues.option_schemesread

REST POST /api/v1/issues.option_schemes · MCP tool issues_option_schemes · scopes issues:read

Input

None: send {}.

Output object[]

default_keystringFor new issues (priority) or when nothing else picks one (resolution); null = the usual (last priority, first resolution) among `keys`.
fieldstringpriority | resolution
idinteger
keysstring[]Option keys in it (shown in the org's order).
namestring
projectsstring[]Projects using it.
curl https://work.nightroll.app/api/v1/issues.option_schemes \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
issues.optionsread

REST POST /api/v1/issues.options · MCP tool issues_options · scopes issues:read

Input

None: send {}.

Output object[]

categorystringStatuses only: todo | in_progress | done. Drives "open", progress bars and dashboards.
colorstringHex color, or empty.
fieldstringstatus | priority | kind | label | retro | resolution | goal_status
iconstring`glyph:<name>`, emoji/text, or a `data:image/…` URL; empty for none.
idinteger
keystring
namestring
positionnumber
projectstringStatuses: the project whose lane this is, or null for the org template new projects copy.
rulesobjectTypes only (empty defaults otherwise).
curl https://work.nightroll.app/api/v1/issues.options \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
issues.planwrite

REST POST /api/v1/issues.plan · MCP tool issues_plan · scopes issues:write

Input

keysrequiredstring[]Issue keys.
sprintintegerTarget sprint; null = backlog.

Output object[]

affects_versionsstring[]
assigneestring
categorystringThe lane's category: todo | in_progress | done.
childrenintegerChildren (issues whose parent this is).
componentsstring[]
created_atinteger
created_bystring
descriptionstring
description_docstringThe description as a rich document (TipTap JSON); null when there's only the markdown `description`.
due_datestringYYYY-MM-DD
epicstringKey of the epic (level-1 ancestor: the parent, or a sub-task's grandparent).
fieldsobjectCustom field values by key, formulas computed.
fix_versionsstring[]
idintegerInternal id; comments use the subject `issue:{id}`.
keystring`{project}-{number}`, e.g. "KB-12".
kindstring
labelsstring[]Label keys.
noticesobject[]Only on `issues.update` / `issues.assign` answers: fields someone else changed since `base` that yours replaced.
numberinteger
parentstringKey of the parent issue (one hierarchy level up).
pointsnumberStory points.
prioritystring
projectstring
rankstringBacklog order within the project: sort by this text, ascending (see `issues.rank`). Null until the backfill runs.
recurringstringday | week | month when this issue is a recurring template.
resolutionstringResolution key; set while in a done lane.
resolved_atinteger
securityintegerSecurity level id: only its members (plus the reporter, assignee and admins) see the issue. Null = the project's viewers.
sprintintegerSprint id; null = backlog.
start_datestringYYYY-MM-DD
statusstringLane key within the project.
titlestring
updated_atinteger
votesinteger
watchersinteger
curl https://work.nightroll.app/api/v1/issues.plan \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"keys":[]}'
issues.plan_baseline_deletedestructive

REST POST /api/v1/issues.plan_baseline_delete · MCP tool issues_plan_baseline_delete · scopes issues:write

Input

baselinerequiredinteger
planrequiredinteger

Output object[]

created_atinteger
created_bystring
datesobjectIssue key → [start, due].
idinteger
namestring
scenariointegerThe scenario it was taken from (null = the live issues).
curl https://work.nightroll.app/api/v1/issues.plan_baseline_delete \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"baseline":1,"plan":1}'
issues.plan_baseline_savewrite

REST POST /api/v1/issues.plan_baseline_save · MCP tool issues_plan_baseline_save · scopes issues:write

Input

namerequiredstring
planrequiredinteger
scenariointegerSnapshot this scenario's dates (default the live issues).

Output object[]

created_atinteger
created_bystring
datesobjectIssue key → [start, due].
idinteger
namestring
scenariointegerThe scenario it was taken from (null = the live issues).
curl https://work.nightroll.app/api/v1/issues.plan_baseline_save \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"name":"<name>","plan":1}'
issues.plan_baselinesread

REST POST /api/v1/issues.plan_baselines · MCP tool issues_plan_baselines · scopes issues:read

Input

idrequiredinteger

Output object[]

created_atinteger
created_bystring
datesobjectIssue key → [start, due].
idinteger
namestring
scenariointegerThe scenario it was taken from (null = the live issues).
curl https://work.nightroll.app/api/v1/issues.plan_baselines \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
issues.plan_changewrite

REST POST /api/v1/issues.plan_change · MCP tool issues_plan_change · scopes issues:write

Input

assigneestring
discardbooleanDrop this issue's staged change instead.
due_datestring
keyrequiredstring
planrequiredinteger
scenariorequiredinteger
start_datestringThe dates and assignee to stage (YYYY-MM-DD; assignee "" = unassign, omitted = unchanged).

Output object

countinteger
curl https://work.nightroll.app/api/v1/issues.plan_change \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"key":"<key>","plan":1,"scenario":1}'
issues.plan_commitwrite

REST POST /api/v1/issues.plan_commit · MCP tool issues_plan_commit · scopes issues:write

Input

keysstring[]Only these issues (default all staged).
planrequiredinteger
scenariorequiredinteger

Output object

countinteger
curl https://work.nightroll.app/api/v1/issues.plan_commit \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"plan":1,"scenario":1}'
issues.plan_deletedestructive

REST POST /api/v1/issues.plan_delete · MCP tool issues_plan_delete · scopes issues:write

Input

idrequiredinteger

Output object

deletedintegerRows removed or moved (a project counts itself plus its issues; an option counts the issues it moved).
curl https://work.nightroll.app/api/v1/issues.plan_delete \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
issues.plan_ganttread

REST POST /api/v1/issues.plan_gantt · MCP tool issues_plan_gantt · scopes issues:read

Input

baselineintegerCompare with this baseline.
idrequiredinteger
scenariointeger

Output object

baselineobjectThe chosen baseline's dates, and how many days each issue's due date has moved since (+ = later).
criticalstring[]Issues with no slack: a day's slip on any of them moves `finish`. In schedule order.
finishstringLast due date of the plan's dated open work.
slackobjectDays each dated open issue can slip without moving `finish` (along "blocks" links).
varianceobject
curl https://work.nightroll.app/api/v1/issues.plan_gantt \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
issues.plan_savewrite

REST POST /api/v1/issues.plan_save · MCP tool issues_plan_save · scopes issues:write

Input

editorsstring[]
idinteger
namerequiredstring
settingsrequiredobject
viewersstring[]

Output object

can_editboolean
editorsstring[]
idinteger
namestring
ownerstring
scenariosobject[]
settingsobject
updated_atinteger
viewersstring[]
curl https://work.nightroll.app/api/v1/issues.plan_save \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"name":"<name>","settings":"<settings>"}'
issues.plan_scenario_deletedestructive

REST POST /api/v1/issues.plan_scenario_delete · MCP tool issues_plan_scenario_delete · scopes issues:write

Input

planrequiredinteger
scenariorequiredinteger

Output object

can_editboolean
editorsstring[]
idinteger
namestring
ownerstring
scenariosobject[]
settingsobject
updated_atinteger
viewersstring[]
curl https://work.nightroll.app/api/v1/issues.plan_scenario_delete \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"plan":1,"scenario":1}'
issues.plan_scenario_savewrite

REST POST /api/v1/issues.plan_scenario_save · MCP tool issues_plan_scenario_save · scopes issues:write

Input

copy_fromintegerNew scenarios start as a copy of this one's changes.
idintegerOmit to add one.
namerequiredstring
planrequiredinteger

Output object

can_editboolean
editorsstring[]
idinteger
namestring
ownerstring
scenariosobject[]
settingsobject
updated_atinteger
viewersstring[]
curl https://work.nightroll.app/api/v1/issues.plan_scenario_save \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"name":"<name>","plan":1}'
issues.plan_schedulewrite

REST POST /api/v1/issues.plan_schedule · MCP tool issues_plan_schedule · scopes issues:write

Input

planrequiredinteger
scenariorequiredinteger
startstringFirst day work can start (default today).

Output object

countinteger
curl https://work.nightroll.app/api/v1/issues.plan_schedule \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"plan":1,"scenario":1}'
issues.plan_viewread

REST POST /api/v1/issues.plan_view · MCP tool issues_plan_view · scopes issues:read

Input

idrequiredinteger
scenariointegerShow this scenario's staged changes; omit for the issues as they are.

Output object

depsobject[]
itemsobject[]
loadobject[]Work per person per week against their capacity.
planobject
scenariointeger
totalintegerMatching issues (more than `items` when cut at 2,000).
curl https://work.nightroll.app/api/v1/issues.plan_view \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
issues.plansread

REST POST /api/v1/issues.plans · MCP tool issues_plans · scopes issues:read

Input

None: send {}.

Output object[]

can_editboolean
editorsstring[]
idinteger
namestring
ownerstring
scenariosobject[]
settingsobject
updated_atinteger
viewersstring[]
curl https://work.nightroll.app/api/v1/issues.plans \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
issues.project_createwrite

REST POST /api/v1/issues.project_create · MCP tool issues_project_create · scopes issues:write

Input

colorstring
copy_fromstringCopy columns, workflow, components and board settings from this project…
descriptionstring
iconstring
keyrequiredstring
leadstringProject lead (member id): a default assignee and a workflow role.
namerequiredstring
stylestringscrum (backlog and sprints) | kanban (a continuous board). Default scrum.
templatestring…or start from a project template (key, see `issues.templates`). Neither = the org's default columns.

Output object

adminsstring[]Who changes settings, columns, workflow, components and versions.
can_adminboolean
can_editbooleanWhat the caller may do.
colorstring
countsobjectIssues per status category.
created_atinteger
created_bystring
descriptionstring
editorsstring[]Who creates and changes issues, sprints and links.
iconstring
keystring
leadstringAdministers the project (as do org admins and anyone in `admins`).
namestring
priority_schemeintegerPriority / resolution schemes in use; null = all the org's options.
resolution_schemeinteger
schemeintegerPermission scheme in use (its lists replace the project's own); null = the project's own lists.
stylestringscrum | kanban
viewersstring[]Who sees the project and its issues: `everyone`, `admins`, `team:<id>`, member ids.
curl https://work.nightroll.app/api/v1/issues.project_create \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"key":"<key>","name":"<name>"}'
issues.project_deletedestructive

REST POST /api/v1/issues.project_delete · MCP tool issues_project_delete · scopes admin

Input

keyrequiredstring

Output object

deletedintegerRows removed or moved (a project counts itself plus its issues; an option counts the issues it moved).
curl https://work.nightroll.app/api/v1/issues.project_delete \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"key":"<key>"}'
issues.project_getread

REST POST /api/v1/issues.project_get · MCP tool issues_project_get · scopes issues:read

Input

keyrequiredstring

Output object

adminsstring[]Who changes settings, columns, workflow, components and versions.
can_adminboolean
can_editbooleanWhat the caller may do.
colorstring
countsobjectIssues per status category.
created_atinteger
created_bystring
descriptionstring
editorsstring[]Who creates and changes issues, sprints and links.
iconstring
keystring
leadstringAdministers the project (as do org admins and anyone in `admins`).
namestring
priority_schemeintegerPriority / resolution schemes in use; null = all the org's options.
resolution_schemeinteger
schemeintegerPermission scheme in use (its lists replace the project's own); null = the project's own lists.
stylestringscrum | kanban
viewersstring[]Who sees the project and its issues: `everyone`, `admins`, `team:<id>`, member ids.
curl https://work.nightroll.app/api/v1/issues.project_get \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"key":"<key>"}'
issues.project_listread

REST POST /api/v1/issues.project_list · MCP tool issues_project_list · scopes issues:read

Input

None: send {}.

Output object[]

adminsstring[]Who changes settings, columns, workflow, components and versions.
can_adminboolean
can_editbooleanWhat the caller may do.
colorstring
countsobjectIssues per status category.
created_atinteger
created_bystring
descriptionstring
editorsstring[]Who creates and changes issues, sprints and links.
iconstring
keystring
leadstringAdministers the project (as do org admins and anyone in `admins`).
namestring
priority_schemeintegerPriority / resolution schemes in use; null = all the org's options.
resolution_schemeinteger
schemeintegerPermission scheme in use (its lists replace the project's own); null = the project's own lists.
stylestringscrum | kanban
viewersstring[]Who sees the project and its issues: `everyone`, `admins`, `team:<id>`, member ids.
curl https://work.nightroll.app/api/v1/issues.project_list \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
issues.project_optionsread

REST POST /api/v1/issues.project_options · MCP tool issues_project_options · scopes issues:read

Input

projectrequiredstring

Output object

default_prioritystring
default_resolutionstring
prioritiesstring[]Allowed keys in order; the default for new issues / resolving.
resolutionsstring[]
curl https://work.nightroll.app/api/v1/issues.project_options \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"project":"<project>"}'
issues.project_updatewrite

REST POST /api/v1/issues.project_update · MCP tool issues_project_update · scopes issues:write

Input

adminsstring[]
colorstring
descriptionstring
editorsstring[]
iconstring
keyrequiredstring
leadstringMember id; empty clears.
namestring
priority_schemeintegerPriority / resolution scheme (`issues.option_schemes`); null = all the org's options.
resolution_schemeinteger
schemeintegerUse a shared permission scheme; null = back to the project's own lists.
stylestring
viewersstring[]Permission lists (`everyone`, `admins`, `team:<id>`, member ids).

Output object

adminsstring[]Who changes settings, columns, workflow, components and versions.
can_adminboolean
can_editbooleanWhat the caller may do.
colorstring
countsobjectIssues per status category.
created_atinteger
created_bystring
descriptionstring
editorsstring[]Who creates and changes issues, sprints and links.
iconstring
keystring
leadstringAdministers the project (as do org admins and anyone in `admins`).
namestring
priority_schemeintegerPriority / resolution schemes in use; null = all the org's options.
resolution_schemeinteger
schemeintegerPermission scheme in use (its lists replace the project's own); null = the project's own lists.
stylestringscrum | kanban
viewersstring[]Who sees the project and its issues: `everyone`, `admins`, `team:<id>`, member ids.
curl https://work.nightroll.app/api/v1/issues.project_update \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"key":"<key>"}'
issues.queryreadIssues matching a TQL query (JQL-style), e.g. `project = KB AND status != Done AND assignee = currentUser() ORDER BY priority DESC`. Fields: project, key, summary, description, text (~ only), status, statusCategory, priority, type, resolution, assignee, reporter, labels, component, fixVersion, affectedVersion, sprint, parent, epic, created, updated, resolved, due, points, votes, watchers, and custom fields by key or name (quote names with spaces). Operators: = != > >= < <= ~ (contains) !~ IN (...) NOT IN (...) IS [NOT] EMPTY; AND, OR, NOT, parentheses. Functions: currentUser(), openSprints(), closedSprints(), futureSprints(), releasedVersions(), unreleasedVersions(), now(), startOfDay(), endOfDay(), startOfWeek(), startOfMonth(), startOfYear(); relative dates like -7d, -2w, 3h.

Issues matching a TQL query (JQL-style), e.g. `project = KB AND status != Done AND assignee = currentUser() ORDER BY priority DESC`. Fields: project, key, summary, description, text (~ only), status, statusCategory, priority, type, resolution, assignee, reporter, labels, component, fixVersion, affectedVersion, sprint, parent, epic, created, updated, resolved, due, points, votes, watchers, and custom fields by key or name (quote names with spaces). Operators: = != > >= < <= ~ (contains) !~ IN (...) NOT IN (...) IS [NOT] EMPTY; AND, OR, NOT, parentheses. Functions: currentUser(), openSprints(), closedSprints(), futureSprints(), releasedVersions(), unreleasedVersions(), now(), startOfDay(), endOfDay(), startOfWeek(), startOfMonth(), startOfYear(); relative dates like -7d, -2w, 3h.

REST POST /api/v1/issues.query · MCP tool issues_query · scopes issues:read

Input

limitinteger1-500, default 50.
offsetinteger
tqlrequiredstring

Output object

issuesobject[]
limitinteger
offsetinteger
totalintegerEvery match you can see.
curl https://work.nightroll.app/api/v1/issues.query \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"tql":"<tql>"}'
issues.rankwrite

REST POST /api/v1/issues.rank · MCP tool issues_rank · scopes issues:write

Input

afterstring…or just below this one. Neither = the top.
beforestringPut it just above this issue (same project)…
keyrequiredstring

Output object

keystring
rankstring
curl https://work.nightroll.app/api/v1/issues.rank \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"key":"<key>"}'
issues.recur_setwrite

REST POST /api/v1/issues.recur_set · MCP tool issues_recur_set · scopes issues:write

Input

everystringday | week | month; null stops recurring.
keyrequiredstring
next_onstringFirst date to create a copy (YYYY-MM-DD); defaults to one period from today.

Output object

affects_versionsstring[]
assigneestring
categorystringThe lane's category: todo | in_progress | done.
childrenintegerChildren (issues whose parent this is).
componentsstring[]
created_atinteger
created_bystring
descriptionstring
description_docstringThe description as a rich document (TipTap JSON); null when there's only the markdown `description`.
due_datestringYYYY-MM-DD
epicstringKey of the epic (level-1 ancestor: the parent, or a sub-task's grandparent).
fieldsobjectCustom field values by key, formulas computed.
fix_versionsstring[]
idintegerInternal id; comments use the subject `issue:{id}`.
keystring`{project}-{number}`, e.g. "KB-12".
kindstring
labelsstring[]Label keys.
noticesobject[]Only on `issues.update` / `issues.assign` answers: fields someone else changed since `base` that yours replaced.
numberinteger
parentstringKey of the parent issue (one hierarchy level up).
pointsnumberStory points.
prioritystring
projectstring
rankstringBacklog order within the project: sort by this text, ascending (see `issues.rank`). Null until the backfill runs.
recurringstringday | week | month when this issue is a recurring template.
resolutionstringResolution key; set while in a done lane.
resolved_atinteger
securityintegerSecurity level id: only its members (plus the reporter, assignee and admins) see the issue. Null = the project's viewers.
sprintintegerSprint id; null = backlog.
start_datestringYYYY-MM-DD
statusstringLane key within the project.
titlestring
updated_atinteger
votesinteger
watchersinteger
curl https://work.nightroll.app/api/v1/issues.recur_set \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"key":"<key>"}'
issues.recur_tickwrite

REST POST /api/v1/issues.recur_tick · MCP tool issues_recur_tick · scopes admin

Input

None: send {}.

Output object

createdstring[]
curl https://work.nightroll.app/api/v1/issues.recur_tick \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
issues.recurringread

REST POST /api/v1/issues.recurring · MCP tool issues_recurring · scopes issues:read

Input

None: send {}.

Output object[]

everystring
keystring
next_onstring
titlestring
curl https://work.nightroll.app/api/v1/issues.recurring \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
issues.release_notesread

REST POST /api/v1/issues.release_notes · MCP tool issues_release_notes · scopes issues:read

Input

group_bystringtype (default) | component | none
include_openbooleanInclude fix-version issues that aren't done yet (default false).
versionrequiredintegerVersion id.

Output object

issuesintegerIssues in the notes.
markdownstringMarkdown.
curl https://work.nightroll.app/api/v1/issues.release_notes \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"version":1}'
issues.release_notes_airead

REST POST /api/v1/issues.release_notes_ai · MCP tool issues_release_notes_ai · scopes issues:read

Input

include_openboolean
modelstring
providerstring
tonestring
versionrequiredinteger

Output object

issuesintegerIssues in the notes.
markdownstringMarkdown.
curl https://work.nightroll.app/api/v1/issues.release_notes_ai \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"version":1}'
issues.release_notes_promptread

REST POST /api/v1/issues.release_notes_prompt · MCP tool issues_release_notes_prompt · scopes issues:read

Input

include_openboolean
tonestringe.g. "friendly, for customers" (default) or "technical, for developers".
versionrequiredinteger

Output object

promptstring
subjectsstring[]
systemstring
curl https://work.nightroll.app/api/v1/issues.release_notes_prompt \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"version":1}'
issues.release_notes_publishwrite

REST POST /api/v1/issues.release_notes_publish · MCP tool issues_release_notes_publish · scopes issues:write

Input

spacerequiredstringSpace key to publish into.
titlestringDefault "<project> <version> release notes".
versionrequiredinteger

Output object

pagestringThe page's id.
titlestring
curl https://work.nightroll.app/api/v1/issues.release_notes_publish \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"space":"<space>","version":1}'
issues.release_notes_savewrite

REST POST /api/v1/issues.release_notes_save · MCP tool issues_release_notes_save · scopes issues:write

Input

notesrequiredstringMarkdown.
versionrequiredinteger

Output object

descriptionstring
doneinteger
idinteger
issuesintegerIssues with this fix version, and how many of them are done.
namestring
notesstringSaved release notes (markdown).
projectstring
release_datestring
releasedboolean
released_atinteger
start_datestringYYYY-MM-DD
curl https://work.nightroll.app/api/v1/issues.release_notes_save \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"notes":"<notes>","version":1}'
issues.report_cycleread

REST POST /api/v1/issues.report_cycle · MCP tool issues_report_cycle · scopes issues:read

Input

daysintegerDays back from today (default 30 for flow, 90 for cycle time; at most 365).
projectrequiredstring

Output object

cycleobjectStarted → resolved.
itemsobject[]Issues resolved in the window, oldest first: the control chart's points.
leadobjectCreated → resolved.
curl https://work.nightroll.app/api/v1/issues.report_cycle \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"project":"<project>"}'
issues.report_flowread

REST POST /api/v1/issues.report_flow · MCP tool issues_report_flow · scopes issues:read

Input

daysintegerDays back from today (default 30 for flow, 90 for cycle time; at most 365).
projectrequiredstring

Output object

countsinteger[][]counts[d][s]: issues in `statuses[s]` at the end of `days[d]`.
daysstring[]YYYY-MM-DD (UTC), oldest first.
statusesobject[]The project's columns, in board order.
curl https://work.nightroll.app/api/v1/issues.report_flow \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"project":"<project>"}'
issues.retro_addwrite

REST POST /api/v1/issues.retro_add · MCP tool issues_retro_add · scopes issues:write

Input

anonymousbooleanHide the author from everyone (the server keeps it only so they can remove the card).
bodyrequiredstring
colrequiredstring
sprintrequiredinteger

Output object

anonymousboolean
authorstringnull on anonymous cards.
bodystring
colstringRetro column key (org-configurable, field "retro").
created_atinteger
idinteger
minebooleanThe caller wrote it (true on your own anonymous cards too, so you can remove them).
sprintinteger
votedbooleanWhether the caller voted.
votesinteger
curl https://work.nightroll.app/api/v1/issues.retro_add \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"body":"<body>","col":"<col>","sprint":1}'
issues.retro_deletedestructive

REST POST /api/v1/issues.retro_delete · MCP tool issues_retro_delete · scopes issues:write

Input

idrequiredinteger

Output object

deletedintegerRows removed or moved (a project counts itself plus its issues; an option counts the issues it moved).
curl https://work.nightroll.app/api/v1/issues.retro_delete \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
issues.retro_listread

REST POST /api/v1/issues.retro_list · MCP tool issues_retro_list · scopes issues:read

Input

idrequiredinteger

Output object[]

anonymousboolean
authorstringnull on anonymous cards.
bodystring
colstringRetro column key (org-configurable, field "retro").
created_atinteger
idinteger
minebooleanThe caller wrote it (true on your own anonymous cards too, so you can remove them).
sprintinteger
votedbooleanWhether the caller voted.
votesinteger
curl https://work.nightroll.app/api/v1/issues.retro_list \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
issues.retro_votewrite

REST POST /api/v1/issues.retro_vote · MCP tool issues_retro_vote · scopes issues:write

Input

idrequiredinteger

Output object

anonymousboolean
authorstringnull on anonymous cards.
bodystring
colstringRetro column key (org-configurable, field "retro").
created_atinteger
idinteger
minebooleanThe caller wrote it (true on your own anonymous cards too, so you can remove them).
sprintinteger
votedbooleanWhether the caller voted.
votesinteger
curl https://work.nightroll.app/api/v1/issues.retro_vote \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
issues.scheme_deletedestructive

REST POST /api/v1/issues.scheme_delete · MCP tool issues_scheme_delete · scopes admin

Input

idrequiredinteger

Output object

deletedintegerRows removed or moved (a project counts itself plus its issues; an option counts the issues it moved).
curl https://work.nightroll.app/api/v1/issues.scheme_delete \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
issues.scheme_savewrite

REST POST /api/v1/issues.scheme_save · MCP tool issues_scheme_save · scopes admin

Input

adminsstring[]
descriptionstring
editorsstring[]
idintegerOmit to create.
namestring
viewersstring[]

Output object

adminsstring[]
descriptionstring
editorsstring[]
idinteger
namestring
projectsstring[]Keys of projects using it.
viewersstring[]
curl https://work.nightroll.app/api/v1/issues.scheme_save \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
issues.schemesread

REST POST /api/v1/issues.schemes · MCP tool issues_schemes · scopes issues:read

Input

None: send {}.

Output object[]

adminsstring[]
descriptionstring
editorsstring[]
idinteger
namestring
projectsstring[]Keys of projects using it.
viewersstring[]
curl https://work.nightroll.app/api/v1/issues.schemes \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
issues.security_deletedestructive

REST POST /api/v1/issues.security_delete · MCP tool issues_security_delete · scopes admin

Input

idrequiredinteger

Output object

deletedintegerRows removed or moved (a project counts itself plus its issues; an option counts the issues it moved).
curl https://work.nightroll.app/api/v1/issues.security_delete \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
issues.security_levelsread

REST POST /api/v1/issues.security_levels · MCP tool issues_security_levels · scopes issues:read

Input

None: send {}.

Output object[]

descriptionstring
idinteger
issuesintegerIssues at this level.
membersstring[]Who sees issues at this level (besides each issue's reporter and assignee, and org admins).
minebooleanWhether the caller is a member (may put issues at this level).
namestring
positionnumber
curl https://work.nightroll.app/api/v1/issues.security_levels \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
issues.security_savewrite

REST POST /api/v1/issues.security_save · MCP tool issues_security_save · scopes admin

Input

descriptionstring
idinteger
membersstring[]
namestring
positionnumber

Output object

descriptionstring
idinteger
issuesintegerIssues at this level.
membersstring[]Who sees issues at this level (besides each issue's reporter and assignee, and org admins).
minebooleanWhether the caller is a member (may put issues at this level).
namestring
positionnumber
curl https://work.nightroll.app/api/v1/issues.security_save \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
issues.similarread

REST POST /api/v1/issues.similar · MCP tool issues_similar · scopes issues:read

Input

keystringThe issue itself, left out of its own matches.
limitintegerDefault 5, max 20.
projectstringSame-project matches come first.
titlerequiredstring

Output object[]

assigneestring
categorystringopen | done
keystring
statusstring
titlestring
curl https://work.nightroll.app/api/v1/issues.similar \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"title":"<title>"}'
issues.socialread

REST POST /api/v1/issues.social · MCP tool issues_social · scopes issues:read

Input

keyrequiredstring

Output object

votedboolean
votesinteger
watchersstring[]Watcher ids.
watchingboolean
curl https://work.nightroll.app/api/v1/issues.social \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"key":"<key>"}'
issues.sprint_completewrite

REST POST /api/v1/issues.sprint_complete · MCP tool issues_sprint_complete · scopes issues:write

Input

idrequiredinteger
move_tointegerA planned sprint of the same project that unfinished issues move to; omit for the backlog.

Output object

committed_pointsnumberPoints in the sprint when it started (velocity: committed).
completed_atinteger
completed_pointsnumberPoints done when it completed (velocity: completed).
created_atinteger
done_issuesinteger
done_pointsnumber
end_datestring
goalstring
idinteger
issuesintegerCurrent contents.
namestring
pointsnumber
projectstring
start_datestringYYYY-MM-DD
statestringplanned | active | closed
curl https://work.nightroll.app/api/v1/issues.sprint_complete \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
issues.sprint_deletedestructive

REST POST /api/v1/issues.sprint_delete · MCP tool issues_sprint_delete · scopes issues:write

Input

idrequiredinteger

Output object

deletedintegerRows removed or moved (a project counts itself plus its issues; an option counts the issues it moved).
curl https://work.nightroll.app/api/v1/issues.sprint_delete \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
issues.sprint_getread

REST POST /api/v1/issues.sprint_get · MCP tool issues_sprint_get · scopes issues:read

Input

idrequiredinteger

Output object

committed_pointsnumberPoints in the sprint when it started (velocity: committed).
completed_atinteger
completed_pointsnumberPoints done when it completed (velocity: completed).
created_atinteger
done_issuesinteger
done_pointsnumber
end_datestring
goalstring
idinteger
issuesintegerCurrent contents.
namestring
pointsnumber
projectstring
start_datestringYYYY-MM-DD
statestringplanned | active | closed
curl https://work.nightroll.app/api/v1/issues.sprint_get \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
issues.sprint_listread

REST POST /api/v1/issues.sprint_list · MCP tool issues_sprint_list · scopes issues:read

Input

projectrequiredstring

Output object[]

committed_pointsnumberPoints in the sprint when it started (velocity: committed).
completed_atinteger
completed_pointsnumberPoints done when it completed (velocity: completed).
created_atinteger
done_issuesinteger
done_pointsnumber
end_datestring
goalstring
idinteger
issuesintegerCurrent contents.
namestring
pointsnumber
projectstring
start_datestringYYYY-MM-DD
statestringplanned | active | closed
curl https://work.nightroll.app/api/v1/issues.sprint_list \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"project":"<project>"}'
issues.sprint_reportread

REST POST /api/v1/issues.sprint_report · MCP tool issues_sprint_report · scopes issues:read

Input

idrequiredinteger

Output object

addedobject[]Put into the sprint after it started.
completedobject[]Done (in a done column) and still in the sprint.
not_completedobject[]Still open in the sprint, or (closed sprints) moved out when it completed.
removedobject[]Taken out while it ran (not counting the move at completion).
curl https://work.nightroll.app/api/v1/issues.sprint_report \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
issues.sprint_savewrite

REST POST /api/v1/issues.sprint_save · MCP tool issues_sprint_save · scopes issues:write

Input

end_datestring
goalstring
idintegerOmit to create.
namestringDefaults to "{KEY} Sprint {n}".
projectstringRequired to create.
start_datestring

Output object

committed_pointsnumberPoints in the sprint when it started (velocity: committed).
completed_atinteger
completed_pointsnumberPoints done when it completed (velocity: completed).
created_atinteger
done_issuesinteger
done_pointsnumber
end_datestring
goalstring
idinteger
issuesintegerCurrent contents.
namestring
pointsnumber
projectstring
start_datestringYYYY-MM-DD
statestringplanned | active | closed
curl https://work.nightroll.app/api/v1/issues.sprint_save \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
issues.sprint_startwrite

REST POST /api/v1/issues.sprint_start · MCP tool issues_sprint_start · scopes issues:write

Input

end_datestringDefaults to the planned date, else two weeks after the start.
idrequiredinteger
start_datestringDefaults to the planned date, else today.

Output object

committed_pointsnumberPoints in the sprint when it started (velocity: committed).
completed_atinteger
completed_pointsnumberPoints done when it completed (velocity: completed).
created_atinteger
done_issuesinteger
done_pointsnumber
end_datestring
goalstring
idinteger
issuesintegerCurrent contents.
namestring
pointsnumber
projectstring
start_datestringYYYY-MM-DD
statestringplanned | active | closed
curl https://work.nightroll.app/api/v1/issues.sprint_start \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
issues.standupread

REST POST /api/v1/issues.standup · MCP tool issues_standup · scopes issues:read

Input

daystringYYYY-MM-DD, the reader's own date (default today, UTC).
projectrequiredstring

Output object

daystring
peopleobject[]Everyone with sprint work or a statement today, busiest first (the order to go round in).
sprintintegerActive sprint id, if one runs.
curl https://work.nightroll.app/api/v1/issues.standup \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"project":"<project>"}'
issues.standup_savewrite

REST POST /api/v1/issues.standup_save · MCP tool issues_standup_save · scopes issues:write

Input

blockersrequiredstring
daystring
projectrequiredstring
todayrequiredstring
yesterdayrequiredstring

Output object

daystring
peopleobject[]Everyone with sprint work or a statement today, busiest first (the order to go round in).
sprintintegerActive sprint id, if one runs.
curl https://work.nightroll.app/api/v1/issues.standup_save \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"blockers":"<blockers>","project":"<project>","today":"<today>","yesterday":"<yesterday>"}'
issues.structure_deletedestructive

REST POST /api/v1/issues.structure_delete · MCP tool issues_structure_delete · scopes issues:write

Input

idrequiredinteger

Output object

deletedintegerRows removed or moved (a project counts itself plus its issues; an option counts the issues it moved).
curl https://work.nightroll.app/api/v1/issues.structure_delete \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
issues.structure_getread

REST POST /api/v1/issues.structure_get · MCP tool issues_structure_get · scopes issues:read

Input

idrequiredinteger

Output object

can_editboolean
editorsstring[]
idinteger
namestring
ownerstring
sourceobjectWhere a structure's rows come from.
updated_atinteger
viewersstring[]Who else sees it (`everyone`, `admins`, `team:<id>`, member ids). Empty = only the owner.
curl https://work.nightroll.app/api/v1/issues.structure_get \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
issues.structure_savewrite

REST POST /api/v1/issues.structure_save · MCP tool issues_structure_save · scopes issues:write

Input

editorsstring[]
idinteger
namerequiredstring
sourcerequiredobjectWhere a structure's rows come from.
viewersstring[]

Output object

can_editboolean
editorsstring[]
idinteger
namestring
ownerstring
sourceobjectWhere a structure's rows come from.
updated_atinteger
viewersstring[]Who else sees it (`everyone`, `admins`, `team:<id>`, member ids). Empty = only the owner.
curl https://work.nightroll.app/api/v1/issues.structure_save \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"name":"<name>","source":"<source>"}'
issues.structure_treereadWhere a structure's rows come from.

REST POST /api/v1/issues.structure_tree · MCP tool issues_structure_tree · scopes issues:read

Input

depthintegerLevels below the roots, 1-6 (default 3).
expandstringHow rows expand: children (hierarchy) | links | both | none.
link_typeintegerlinks: only this link type (id, outward direction); empty = every type.
sum_fieldsstring[]Number custom fields (keys) to sum next to points.
tqlrequiredstringTQL for the top-level rows (≤500).

Output object

partialbooleanCut at the row or root limit.
rowsobject[]
total_rootsintegerRoots matched by the TQL (they may be more than shown).
curl https://work.nightroll.app/api/v1/issues.structure_tree \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"tql":"<tql>"}'
issues.structuresread

REST POST /api/v1/issues.structures · MCP tool issues_structures · scopes issues:read

Input

None: send {}.

Output object[]

can_editboolean
editorsstring[]
idinteger
namestring
ownerstring
sourceobjectWhere a structure's rows come from.
updated_atinteger
viewersstring[]Who else sees it (`everyone`, `admins`, `team:<id>`, member ids). Empty = only the owner.
curl https://work.nightroll.app/api/v1/issues.structures \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
issues.template_deletedestructive

REST POST /api/v1/issues.template_delete · MCP tool issues_template_delete · scopes admin

Input

idrequiredinteger

Output object

deletedintegerRows removed or moved (a project counts itself plus its issues; an option counts the issues it moved).
curl https://work.nightroll.app/api/v1/issues.template_delete \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
issues.template_savewrite

REST POST /api/v1/issues.template_save · MCP tool issues_template_save · scopes admin

Input

configobject…or give them.
descriptionstring
from_projectstringTake the columns, workflow, components and board from this project…
idintegerOmit to add one.
namerequiredstring
stylerequiredstringscrum | kanban

Output object[]

configobject
descriptionstring
idinteger
keystring
namestring
positionnumber
stylestringscrum | kanban
curl https://work.nightroll.app/api/v1/issues.template_save \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"name":"<name>","style":"<style>"}'
issues.templatesread

REST POST /api/v1/issues.templates · MCP tool issues_templates · scopes issues:read

Input

None: send {}.

Output object[]

configobject
descriptionstring
idinteger
keystring
namestring
positionnumber
stylestringscrum | kanban
curl https://work.nightroll.app/api/v1/issues.templates \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
issues.timelineread

REST POST /api/v1/issues.timeline · MCP tool issues_timeline · scopes issues:read

Input

projectrequiredstring

Output object

can_editbooleanThe caller can reschedule (edit the project's issues).
depsobject[]
itemsobject[]Epics (level ≥ 1, highest first) and their children, in rank order; `parent` gives the nesting.
levelsobjectHierarchy level per type key (types missing here are level 0).
curl https://work.nightroll.app/api/v1/issues.timeline \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"project":"<project>"}'
issues.transition_deletedestructive

REST POST /api/v1/issues.transition_delete · MCP tool issues_transition_delete · scopes issues:write

Input

idrequiredinteger

Output object

deletedintegerRows removed or moved (a project counts itself plus its issues; an option counts the issues it moved).
curl https://work.nightroll.app/api/v1/issues.transition_delete \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
issues.transition_savewrite

REST POST /api/v1/issues.transition_save · MCP tool issues_transition_save · scopes issues:write

Input

from_statusstringStatus key, or null / "" for any status.
idintegerOmit to create.
namestringDefaults to the target status's name.
projectstringRequired to create.
rulesobject
to_statusstring

Output object

from_statusstringnull = from any status.
idinteger
namestring
positionnumber
projectstring
rulesobject
to_statusstring
curl https://work.nightroll.app/api/v1/issues.transition_save \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
issues.transitionsread

REST POST /api/v1/issues.transitions · MCP tool issues_transitions · scopes issues:read

Input

keyrequiredstring

Output object[]

allowedbooleanFalse when a condition blocks the caller (see `reason`).
idintegerTransition id; null in an open workflow.
namestring
needs_approvalbooleanMoving needs approval first (`approvals.request`).
reasonstring
requirestring[]Fields the transition requires.
to_statusstring
curl https://work.nightroll.app/api/v1/issues.transitions \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"key":"<key>"}'
issues.triageread

REST POST /api/v1/issues.triage · MCP tool issues_triage · scopes issues:read

Input

descriptionstring
keystring
modelstring
projectrequiredstring
providerstring
titlerequiredstring

Output object

assigneestringA member id seen working on this project or on similar issues.
duplicatesobject[]
kindstringKeys of the org's options; null when the model had no confident pick (or picked something that doesn't exist).
labelsstring[]
prioritystring
whystringOne sentence on why.
curl https://work.nightroll.app/api/v1/issues.triage \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"project":"<project>","title":"<title>"}'
issues.triage_parseread

REST POST /api/v1/issues.triage_parse · MCP tool issues_triage_parse · scopes issues:read

Input

keystring
projectrequiredstring
textrequiredstringThe model's answer.
titlestring

Output object

assigneestringA member id seen working on this project or on similar issues.
duplicatesobject[]
kindstringKeys of the org's options; null when the model had no confident pick (or picked something that doesn't exist).
labelsstring[]
prioritystring
whystringOne sentence on why.
curl https://work.nightroll.app/api/v1/issues.triage_parse \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"project":"<project>","text":"<text>"}'
issues.triage_promptread

REST POST /api/v1/issues.triage_prompt · MCP tool issues_triage_prompt · scopes issues:read

Input

descriptionstring
keystringTriaging an existing issue (the queue): its key.
projectrequiredstring
titlerequiredstring

Output object

promptstring
subjectsstring[]What the prompt contains (for AI exclusions).
systemstring
curl https://work.nightroll.app/api/v1/issues.triage_prompt \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"project":"<project>","title":"<title>"}'
issues.updatewrite

REST POST /api/v1/issues.update · MCP tool issues_update · scopes issues:write

Input

add_labelsstring[]Labels to add (after `labels`).
affects_versionsstring[]
baseobjectThe values you saw for the fields you're changing (same names as the issue's; custom fields under `fields`). Where someone else changed one since, your value still wins and the answer's `notices` say who and what.
componentsstring[]Replace the issue's components / versions (names).
descriptionstringMarkdown. Sent without `description_doc`, it replaces the rich document too.
description_docstringThe description as a rich document (TipTap JSON); send `description` (its markdown) with it. null clears it.
due_datestringYYYY-MM-DD; null clears.
expect_statusstringCompare-and-set: fail with 409 if the issue is no longer in this status.
fieldsobjectCustom field values to set (null clears); fields left out are unchanged.
fix_versionsstring[]
keyrequiredstring
kindstring
labelsstring[]Replaces the issue's labels.
parentstringParent key; null clears.
pointsnumbernull clears.
prioritystring
remove_labelsstring[]Labels to remove (after `labels`).
resolutionstringResolution key when landing in (or already in) a done lane; defaults to the transition's, else the first.
securityintegerSecurity level id; null = visible to the whole project.
start_datestringYYYY-MM-DD; null clears.
statusstringTarget lane. If the project has a workflow, a transition to it must exist and be allowed.
titlestring

Output object

affects_versionsstring[]
assigneestring
categorystringThe lane's category: todo | in_progress | done.
childrenintegerChildren (issues whose parent this is).
componentsstring[]
created_atinteger
created_bystring
descriptionstring
description_docstringThe description as a rich document (TipTap JSON); null when there's only the markdown `description`.
due_datestringYYYY-MM-DD
epicstringKey of the epic (level-1 ancestor: the parent, or a sub-task's grandparent).
fieldsobjectCustom field values by key, formulas computed.
fix_versionsstring[]
idintegerInternal id; comments use the subject `issue:{id}`.
keystring`{project}-{number}`, e.g. "KB-12".
kindstring
labelsstring[]Label keys.
noticesobject[]Only on `issues.update` / `issues.assign` answers: fields someone else changed since `base` that yours replaced.
numberinteger
parentstringKey of the parent issue (one hierarchy level up).
pointsnumberStory points.
prioritystring
projectstring
rankstringBacklog order within the project: sort by this text, ascending (see `issues.rank`). Null until the backfill runs.
recurringstringday | week | month when this issue is a recurring template.
resolutionstringResolution key; set while in a done lane.
resolved_atinteger
securityintegerSecurity level id: only its members (plus the reporter, assignee and admins) see the issue. Null = the project's viewers.
sprintintegerSprint id; null = backlog.
start_datestringYYYY-MM-DD
statusstringLane key within the project.
titlestring
updated_atinteger
votesinteger
watchersinteger
curl https://work.nightroll.app/api/v1/issues.update \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"key":"<key>"}'
issues.version_deletedestructive

REST POST /api/v1/issues.version_delete · MCP tool issues_version_delete · scopes issues:write

Input

idrequiredinteger
move_tointegerIssues move to this version instead of losing it.

Output object

deletedintegerRows removed or moved (a project counts itself plus its issues; an option counts the issues it moved).
curl https://work.nightroll.app/api/v1/issues.version_delete \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
issues.version_releasewrite

REST POST /api/v1/issues.version_release · MCP tool issues_version_release · scopes issues:write

Input

idrequiredinteger
move_tointegerUnfinished issues move to this version of the same project; omit to leave them.
releasedrequiredbooleanfalse un-releases.

Output object

descriptionstring
doneinteger
idinteger
issuesintegerIssues with this fix version, and how many of them are done.
namestring
notesstringSaved release notes (markdown).
projectstring
release_datestring
releasedboolean
released_atinteger
start_datestringYYYY-MM-DD
curl https://work.nightroll.app/api/v1/issues.version_release \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1,"released":true}'
issues.version_savewrite

REST POST /api/v1/issues.version_save · MCP tool issues_version_save · scopes issues:write

Input

descriptionstring
idinteger
namestring
projectstring
release_datestring
start_datestringYYYY-MM-DD; "" clears.

Output object

descriptionstring
doneinteger
idinteger
issuesintegerIssues with this fix version, and how many of them are done.
namestring
notesstringSaved release notes (markdown).
projectstring
release_datestring
releasedboolean
released_atinteger
start_datestringYYYY-MM-DD
curl https://work.nightroll.app/api/v1/issues.version_save \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
issues.versionsread

REST POST /api/v1/issues.versions · MCP tool issues_versions · scopes issues:read

Input

projectrequiredstring

Output object[]

descriptionstring
doneinteger
idinteger
issuesintegerIssues with this fix version, and how many of them are done.
namestring
notesstringSaved release notes (markdown).
projectstring
release_datestring
releasedboolean
released_atinteger
start_datestringYYYY-MM-DD
curl https://work.nightroll.app/api/v1/issues.versions \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"project":"<project>"}'
issues.votewrite

REST POST /api/v1/issues.vote · MCP tool issues_vote · scopes issues:write

Input

keyrequiredstring
votedrequiredboolean

Output object

votedboolean
votesinteger
watchersstring[]Watcher ids.
watchingboolean
curl https://work.nightroll.app/api/v1/issues.vote \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"key":"<key>","voted":true}'
issues.watchwrite

REST POST /api/v1/issues.watch · MCP tool issues_watch · scopes issues:write

Input

keyrequiredstring
watchingrequiredboolean
whostringSomeone else to add or remove (admins and the issue's assignee/reporter); default the caller.

Output object

votedboolean
votesinteger
watchersstring[]Watcher ids.
watchingboolean
curl https://work.nightroll.app/api/v1/issues.watch \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"key":"<key>","watching":true}'
issues.workflowread

REST POST /api/v1/issues.workflow · MCP tool issues_workflow · scopes issues:read

Input

projectrequiredstring

Output object[]

from_statusstringnull = from any status.
idinteger
namestring
positionnumber
projectstring
rulesobject
to_statusstring
curl https://work.nightroll.app/api/v1/issues.workflow \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"project":"<project>"}'
issues.workflow_copywrite

REST POST /api/v1/issues.workflow_copy · MCP tool issues_workflow_copy · scopes issues:write

Input

fromrequiredstring
torequiredstring

Output object[]

from_statusstringnull = from any status.
idinteger
namestring
positionnumber
projectstring
rulesobject
to_statusstring
curl https://work.nightroll.app/api/v1/issues.workflow_copy \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"from":"<from>","to":"<to>"}'

jobs

jobs.listwrite

REST POST /api/v1/jobs.list · MCP tool jobs_list · scopes admin

Input

limitinteger1-200, default 50.
statestringqueued | running | done | dead; all when omitted.

Output object

jobsobject[]
schedulesobject[]
curl https://work.nightroll.app/api/v1/jobs.list \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
jobs.retrywrite

REST POST /api/v1/jobs.retry · MCP tool jobs_retry · scopes admin

Input

idrequiredinteger

Output object

attemptsinteger
created_atinteger
finished_atinteger
idinteger
kindstring`<module>.<what>`, e.g. `webhooks.deliver`.
last_errorstring
max_attemptsinteger
payloadany
run_atinteger
statestringqueued | running | done | dead.
curl https://work.nightroll.app/api/v1/jobs.retry \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'

keys

keys.createwrite

REST POST /api/v1/keys.create · MCP tool keys_create · scopes keys:write

Input

cidrsstring[]Only accept it from these addresses or CIDR ranges.
expires_daysintegerDays until it expires (1–365, default 90).
kindrequiredstringpersonal | agent
namerequiredstring
scopesrequiredstring[]Scopes like `issues:read`, `issues:write`, `pages:read`; `read` = every module's read scope, `write` = every module's read and write. A key never gets more than its owner's role allows.

Output object

keyobject
secretstringThe key itself. Shown once: store it now.
curl https://work.nightroll.app/api/v1/keys.create \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"kind":"<kind>","name":"<name>","scopes":[]}'
keys.listread

REST POST /api/v1/keys.list · MCP tool keys_list · scopes keys:read

Input

None: send {}.

Output object[]

cidrsstring[]
created_atinteger
expires_atinteger
idinteger
kindstringpersonal (acts as you) | agent (acts on your behalf as `agent:<name>`)
last_ipstring
last_used_atinteger
namestring
ownerstring
prefixstringFirst characters of the key, to recognize it.
revoked_atinteger
scopesstring[]
curl https://work.nightroll.app/api/v1/keys.list \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
keys.revokedestructive

REST POST /api/v1/keys.revoke · MCP tool keys_revoke · scopes keys:write

Input

idrequiredinteger

Output object

cidrsstring[]
created_atinteger
expires_atinteger
idinteger
kindstringpersonal (acts as you) | agent (acts on your behalf as `agent:<name>`)
last_ipstring
last_used_atinteger
namestring
ownerstring
prefixstringFirst characters of the key, to recognize it.
revoked_atinteger
scopesstring[]
curl https://work.nightroll.app/api/v1/keys.revoke \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'

market

market.bundlewrite

REST POST /api/v1/market.bundle · MCP tool market_bundle · scopes admin

Input

idrequiredinteger

Output any

curl https://work.nightroll.app/api/v1/market.bundle \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
market.listingread

REST POST /api/v1/market.listing · MCP tool market_listing · scopes market:read

Input

idrequiredinteger

Output object

bundlestringThe signed bundle, to install (`plugins.install {signed: {bundle, publisher, signature, listing}}`).
latestobjectThe latest approved version.
signaturestring
curl https://work.nightroll.app/api/v1/market.listing \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
market.listingsread

REST POST /api/v1/market.listings · MCP tool market_listings · scopes market:read

Input

qstringWords in the name or summary.

Output object[]

allowstring[]
idinteger
listinginteger
namestring
notestring
permissionsstring[]
pluginstring
publisher_keystring
publisher_orgstring
reviewed_atinteger
runtimestringrhai | wasm
sha256string
statestringsubmitted | approved | rejected
submitted_atinteger
summarystring
versionstring
curl https://work.nightroll.app/api/v1/market.listings \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
market.reviewwrite

REST POST /api/v1/market.review · MCP tool market_review · scopes admin

Input

approverequiredboolean
idrequiredintegerThe version id.
notestringWhy (shown to the publisher).

Output object

allowstring[]
idinteger
listinginteger
namestring
notestring
permissionsstring[]
pluginstring
publisher_keystring
publisher_orgstring
reviewed_atinteger
runtimestringrhai | wasm
sha256string
statestringsubmitted | approved | rejected
submitted_atinteger
summarystring
versionstring
curl https://work.nightroll.app/api/v1/market.review \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"approve":true,"id":1}'
market.submissionsread

REST POST /api/v1/market.submissions · MCP tool market_submissions · scopes market:read

Input

None: send {}.

Output object

reviewerbooleanThe caller reviews the catalog (an admin of the org that keeps it).
versionsobject[]
curl https://work.nightroll.app/api/v1/market.submissions \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
market.submitwrite

REST POST /api/v1/market.submit · MCP tool market_submit · scopes market:write

Input

bundlerequiredstringThe bundle text from `plugins.sign`.
publisherrequiredstring
signaturerequiredstring

Output object

allowstring[]
idinteger
listinginteger
namestring
notestring
permissionsstring[]
pluginstring
publisher_keystring
publisher_orgstring
reviewed_atinteger
runtimestringrhai | wasm
sha256string
statestringsubmitted | approved | rejected
submitted_atinteger
summarystring
versionstring
curl https://work.nightroll.app/api/v1/market.submit \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"bundle":"<bundle>","publisher":"<publisher>","signature":"<signature>"}'

notifications

notifications.digestread

REST POST /api/v1/notifications.digest · MCP tool notifications_digest · scopes notifications:read

Input

None: send {}.

Output object

emptybooleanNothing to report (no open work, no mentions).
focusanyThe ranked focus list (`issues.focus`); null when issues are switched off.
mentionsobject[]Unread mentions of you or your teams.
periodstringday | week
weekanyWeekly: issues of yours done in the last 7 days, open ones due in the next 7, and overdue ones.
curl https://work.nightroll.app/api/v1/notifications.digest \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
notifications.digest_prefsread

REST POST /api/v1/notifications.digest_prefs · MCP tool notifications_digest_prefs · scopes notifications:read

Input

None: send {}.

Output object

aibooleanAdd a short AI-written plan for the day (needs a usable AI model; org key for email).
atstringHH:MM in the person's own time.
browserbooleanShow a browser notification the first time the app is open after `at`.
emailbooleanSend it by email each morning.
periodstringday | week
tz_offsetintegerMinutes behind UTC, as the browser's `Date.getTimezoneOffset()` gives it.
week_dayintegerWeekly: the day it comes, 0 = Sunday … 6 = Saturday.
weekdaysbooleanWeekdays only (Monday to Friday, local time).
curl https://work.nightroll.app/api/v1/notifications.digest_prefs \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
notifications.digest_prefs_setwrite

REST POST /api/v1/notifications.digest_prefs_set · MCP tool notifications_digest_prefs_set · scopes notifications:write

Input

airequiredbooleanAdd a short AI-written plan for the day (needs a usable AI model; org key for email).
atrequiredstringHH:MM in the person's own time.
browserrequiredbooleanShow a browser notification the first time the app is open after `at`.
emailrequiredbooleanSend it by email each morning.
periodstringday | week
tz_offsetrequiredintegerMinutes behind UTC, as the browser's `Date.getTimezoneOffset()` gives it.
week_dayintegerWeekly: the day it comes, 0 = Sunday … 6 = Saturday.
weekdaysrequiredbooleanWeekdays only (Monday to Friday, local time).

Output object

aibooleanAdd a short AI-written plan for the day (needs a usable AI model; org key for email).
atstringHH:MM in the person's own time.
browserbooleanShow a browser notification the first time the app is open after `at`.
emailbooleanSend it by email each morning.
periodstringday | week
tz_offsetintegerMinutes behind UTC, as the browser's `Date.getTimezoneOffset()` gives it.
week_dayintegerWeekly: the day it comes, 0 = Sunday … 6 = Saturday.
weekdaysbooleanWeekdays only (Monday to Friday, local time).
curl https://work.nightroll.app/api/v1/notifications.digest_prefs_set \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"ai":true,"at":"<at>","browser":true,"email":true,"tz_offset":1,"weekdays":true}'
notifications.email_memberwrite

REST POST /api/v1/notifications.email_member · MCP tool notifications_email_member · scopes system

Input

identityrequiredstring
notificationrequiredany

Output object

updatedinteger
curl https://work.nightroll.app/api/v1/notifications.email_member \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"identity":"<identity>","notification":"<notification>"}'
notifications.listread

REST POST /api/v1/notifications.list · MCP tool notifications_list · scopes notifications:read

Input

None: send {}.

Output object[]

actorstring
created_atinteger
idintegerThe event's seq; one notification per event.
kindstringEvent kind, e.g. "comment.created".
readboolean
reasonstring"mentioned", "assigned".
subjectstring`kind:id`, e.g. "issue:12".
teamintegerSet when it reached the caller only through this team.
titlestringThe subject's current title.
curl https://work.nightroll.app/api/v1/notifications.list \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
notifications.mark_readwrite

REST POST /api/v1/notifications.mark_read · MCP tool notifications_mark_read · scopes notifications:write

Input

idintegerA notification id; omit to mark everything read.

Output object

updatedinteger
curl https://work.nightroll.app/api/v1/notifications.mark_read \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
notifications.policiesread

REST POST /api/v1/notifications.policies · MCP tool notifications_policies · scopes notifications:read

Input

None: send {}.

Output object

limitsobject
policiesobject[]
curl https://work.nightroll.app/api/v1/notifications.policies \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
notifications.policies_setwrite

REST POST /api/v1/notifications.policies_set · MCP tool notifications_policies_set · scopes admin

Input

limitsobject
policiesrequiredobject[]

Output object

limitsobject
policiesobject[]
curl https://work.nightroll.app/api/v1/notifications.policies_set \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"policies":[]}'
notifications.prefsread

REST POST /api/v1/notifications.prefs · MCP tool notifications_prefs · scopes notifications:read

Input

None: send {}.

Output object

channelsobject[]
email_by_defaultstring[]Reasons that email by default (everything goes to the inbox by default).
policiesobject[]The org's policies (W807): locked ones override these rules, required ones can't be turned off.
quietobject
reasonsobject[]Reasons rules can name, with what happens by default.
rulesobject[]
curl https://work.nightroll.app/api/v1/notifications.prefs \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
notifications.prefs_setwriteReplaces your rules and/or quiet hours in this organization.

REST POST /api/v1/notifications.prefs_set · MCP tool notifications_prefs_set · scopes notifications:write

Input

quietobject
rulesobject[]

Output object

channelsobject[]
email_by_defaultstring[]Reasons that email by default (everything goes to the inbox by default).
policiesobject[]The org's policies (W807): locked ones override these rules, required ones can't be turned off.
quietobject
reasonsobject[]Reasons rules can name, with what happens by default.
rulesobject[]
curl https://work.nightroll.app/api/v1/notifications.prefs_set \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
notifications.push_deliveredwrite

REST POST /api/v1/notifications.push_delivered · MCP tool notifications_push_delivered · scopes system

Input

endpointrequiredstring
okrequiredbooleanfalse: the push service says the subscription is gone.

Output object

publicstringThe application server key for `pushManager.subscribe` (base64url); null until the cell made one.
curl https://work.nightroll.app/api/v1/notifications.push_delivered \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"endpoint":"<endpoint>","ok":true}'
notifications.push_keyread

REST POST /api/v1/notifications.push_key · MCP tool notifications_push_key · scopes notifications:read

Input

None: send {}.

Output object

publicstringThe application server key for `pushManager.subscribe` (base64url); null until the cell made one.
curl https://work.nightroll.app/api/v1/notifications.push_key \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
notifications.push_queuewrite

REST POST /api/v1/notifications.push_queue · MCP tool notifications_push_queue · scopes system

Input

None: send {}.

Output object

publicstringThe application server key for `pushManager.subscribe` (base64url); null until the cell made one.
curl https://work.nightroll.app/api/v1/notifications.push_queue \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
notifications.push_subscribewrite

REST POST /api/v1/notifications.push_subscribe · MCP tool notifications_push_subscribe · scopes notifications:write

Input

authrequiredstring
endpointrequiredstring
labelstringe.g. "Chrome on Mac".
p256dhrequiredstring`keys.p256dh` and `keys.auth` of the browser's subscription (base64url).

Output object[]

created_atinteger
endpointstring
labelstring
last_ok_atinteger
curl https://work.nightroll.app/api/v1/notifications.push_subscribe \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"auth":"<auth>","endpoint":"<endpoint>","p256dh":"<p256dh>"}'
notifications.push_subscriptionsread

REST POST /api/v1/notifications.push_subscriptions · MCP tool notifications_push_subscriptions · scopes notifications:read

Input

None: send {}.

Output object[]

created_atinteger
endpointstring
labelstring
last_ok_atinteger
curl https://work.nightroll.app/api/v1/notifications.push_subscriptions \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
notifications.push_targetswrite

REST POST /api/v1/notifications.push_targets · MCP tool notifications_push_targets · scopes system

Input

identityrequiredstring

Output object

privatestring
publicstring
subscriptionsany[][](endpoint, p256dh, auth)
curl https://work.nightroll.app/api/v1/notifications.push_targets \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"identity":"<identity>"}'
notifications.push_testwrite

REST POST /api/v1/notifications.push_test · MCP tool notifications_push_test · scopes notifications:write

Input

None: send {}.

Output object[]

created_atinteger
endpointstring
labelstring
last_ok_atinteger
curl https://work.nightroll.app/api/v1/notifications.push_test \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
notifications.push_unsubscribewrite

REST POST /api/v1/notifications.push_unsubscribe · MCP tool notifications_push_unsubscribe · scopes notifications:write

Input

endpointrequiredstring

Output object[]

created_atinteger
endpointstring
labelstring
last_ok_atinteger
curl https://work.nightroll.app/api/v1/notifications.push_unsubscribe \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"endpoint":"<endpoint>"}'
notifications.vapid_setwrite

REST POST /api/v1/notifications.vapid_set · MCP tool notifications_vapid_set · scopes system

Input

privaterequiredstring
publicrequiredstring

Output object

publicstringThe application server key for `pushManager.subscribe` (base64url); null until the cell made one.
curl https://work.nightroll.app/api/v1/notifications.vapid_set \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"private":"<private>","public":"<public>"}'

pages

pages.analyticsread

REST POST /api/v1/pages.analytics · MCP tool pages_analytics · scopes pages:read

Input

daysintegerDays back for the daily series (7-365, default 30).
idrequiredstring

Output object

peopleobject[]Who has seen the page, most recent first.
readersinteger
seriesobject[]Every day of the window, oldest first.
viewsintegerAll-time views and distinct readers.
curl https://work.nightroll.app/api/v1/pages.analytics \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":"<id>"}'
pages.attachment_addwrite

REST POST /api/v1/pages.attachment_add · MCP tool pages_attachment_add · scopes pages:write

Input

datarequiredstringBase64 bytes; at most 50 KB decoded.
mimerequiredstring
namerequiredstring
pagerequiredstring

Output object

created_atinteger
created_bystring
idstring
mimestring
namestring
pagestring
sizeinteger
curl https://work.nightroll.app/api/v1/pages.attachment_add \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"data":"<data>","mime":"<mime>","name":"<name>","page":"<page>"}'
pages.attachment_deletedestructive

REST POST /api/v1/pages.attachment_delete · MCP tool pages_attachment_delete · scopes pages:write

Input

idrequiredstring

Output object

deletedinteger
curl https://work.nightroll.app/api/v1/pages.attachment_delete \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":"<id>"}'
pages.attachment_getread

REST POST /api/v1/pages.attachment_get · MCP tool pages_attachment_get · scopes pages:read

Input

as_urlbooleanA download link instead of the bytes, where the deployment serves files from their own origin.
idrequiredstring

Output object

datastringBase64 bytes (empty when `url` is given).
idstring
mimestring
namestring
urlstringWith `as_url`, where the deployment has a files origin: a five-minute link that downloads it.
curl https://work.nightroll.app/api/v1/pages.attachment_get \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":"<id>"}'
pages.attachmentsread

REST POST /api/v1/pages.attachments · MCP tool pages_attachments · scopes pages:read

Input

idrequiredstring

Output object[]

created_atinteger
created_bystring
idstring
mimestring
namestring
pagestring
sizeinteger
curl https://work.nightroll.app/api/v1/pages.attachments \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":"<id>"}'
pages.blogread

REST POST /api/v1/pages.blog · MCP tool pages_blog · scopes pages:read

Input

limitintegerNewest first; default 50, max 5000.
spacestringOne space's blog; omitted = every space you can see.

Output object[]

created_bystring
iconstring
idstring
published_atintegerWhen it was first published; null for drafts.
spacestring
statusstringdraft (yours, unpublished) | current
summarystringThe start of the post's text (markdown), for the blog list.
titlestring
updated_atinteger
curl https://work.nightroll.app/api/v1/pages.blog \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
pages.boardread

REST POST /api/v1/pages.board · MCP tool pages_board · scopes pages:read

Input

idrequiredstring

Output object

can_editboolean
statestringThe yrs (Yjs) document as one update, base64; empty for a board nobody has drawn on.
textstringIts notes' text, one per line.
curl https://work.nightroll.app/api/v1/pages.board \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":"<id>"}'
pages.by_labelread

REST POST /api/v1/pages.by_label · MCP tool pages_by_label · scopes pages:read

Input

labelrequiredstring
spacestring

Output object[]

iconstring
idstring
labelsstring[]
spacestring
titlestring
updated_atinteger
curl https://work.nightroll.app/api/v1/pages.by_label \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"label":"<label>"}'
pages.createwrite

REST POST /api/v1/pages.create · MCP tool pages_create · scopes pages:write

Input

doc_jsonstringStarting content (TipTap JSON) instead of a template.
iconstring
kindstringpage (default) | blog: a blog post in the space's blog (no parent).
parentstring
spacerequiredstring
templateintegerTemplate id: the new draft starts with its content.
titlestringDefaults to "Untitled" (made unique). Titles are unique, so `[[Title]]` always means one page.

Output object

can_editbooleanWhether the caller may edit (and so change permissions or delete).
created_atinteger
created_bystring
doc_jsonstringPublished content as ProseMirror/TipTap JSON. Empty with version ≥ 1 means legacy markdown in `text`.
editorsstring[]
has_changesbooleanThe live (being edited) doc differs from the published version.
iconstring
idstring
kindstringpage (in the space's tree) | blog (a dated post in the space's blog)
labelsstring[]Labels (lowercase tags).
parentstringParent page id; null = top level of the space.
published_atintegerWhen it was first published; null for drafts.
spacestring
statusstringdraft (only its author sees it, never published) | current
textstringPublished content as markdown: search, mentions, smart-link embeds and agents read this.
titlestring
updated_atinteger
updated_bystring
versionintegerPublished version number; 0 = never published.
viewersstring[]The page's own restrictions; null = inherited from its parent pages and the space.
curl https://work.nightroll.app/api/v1/pages.create \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"space":"<space>"}'
pages.db_column_deletedestructive

REST POST /api/v1/pages.db_column_delete · MCP tool pages_db_column_delete · scopes pages:write

Input

dbrequiredinteger
idrequiredinteger

Output object

can_editboolean
columnsobject[]
idinteger
pagestring
rowsobject[]
titlestring
curl https://work.nightroll.app/api/v1/pages.db_column_delete \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"db":1,"id":1}'
pages.db_column_savewrite

REST POST /api/v1/pages.db_column_save · MCP tool pages_db_column_save · scopes pages:write

Input

beforeintegerPut it before this column (omitted = keep its place, or last for a new one).
dbrequiredinteger
idintegerOmitted = a new column.
namerequiredstring
optionsobject[]
typerequiredstring

Output object

can_editboolean
columnsobject[]
idinteger
pagestring
rowsobject[]
titlestring
curl https://work.nightroll.app/api/v1/pages.db_column_save \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"db":1,"name":"<name>","type":"<type>"}'
pages.db_createwrite

REST POST /api/v1/pages.db_create · MCP tool pages_db_create · scopes pages:write

Input

pagerequiredstring
titlestring

Output object

can_editboolean
columnsobject[]
idinteger
pagestring
rowsobject[]
titlestring
curl https://work.nightroll.app/api/v1/pages.db_create \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"page":"<page>"}'
pages.db_deletedestructive

REST POST /api/v1/pages.db_delete · MCP tool pages_db_delete · scopes pages:write

Input

idrequiredinteger

Output object

deletedinteger
curl https://work.nightroll.app/api/v1/pages.db_delete \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
pages.db_getread

REST POST /api/v1/pages.db_get · MCP tool pages_db_get · scopes pages:read

Input

idrequiredinteger

Output object

can_editboolean
columnsobject[]
idinteger
pagestring
rowsobject[]
titlestring
curl https://work.nightroll.app/api/v1/pages.db_get \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
pages.db_row_addwrite

REST POST /api/v1/pages.db_row_add · MCP tool pages_db_row_add · scopes pages:write

Input

cellsobject
dbrequiredinteger

Output object

can_editboolean
columnsobject[]
idinteger
pagestring
rowsobject[]
titlestring
curl https://work.nightroll.app/api/v1/pages.db_row_add \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"db":1}'
pages.db_row_deletedestructive

REST POST /api/v1/pages.db_row_delete · MCP tool pages_db_row_delete · scopes pages:write

Input

dbrequiredinteger
rowrequiredinteger

Output object

can_editboolean
columnsobject[]
idinteger
pagestring
rowsobject[]
titlestring
curl https://work.nightroll.app/api/v1/pages.db_row_delete \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"db":1,"row":1}'
pages.db_row_updatewrite

REST POST /api/v1/pages.db_row_update · MCP tool pages_db_row_update · scopes pages:write

Input

cellsrequiredobjectColumn id → new value; null clears the cell. Other cells are kept.
dbrequiredinteger
rowrequiredinteger

Output object

can_editboolean
columnsobject[]
idinteger
pagestring
rowsobject[]
titlestring
curl https://work.nightroll.app/api/v1/pages.db_row_update \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"cells":"<cells>","db":1,"row":1}'
pages.db_updatewrite

REST POST /api/v1/pages.db_update · MCP tool pages_db_update · scopes pages:write

Input

idrequiredinteger
titlerequiredstring

Output object

can_editboolean
columnsobject[]
idinteger
pagestring
rowsobject[]
titlestring
curl https://work.nightroll.app/api/v1/pages.db_update \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1,"title":"<title>"}'
pages.dbsread

REST POST /api/v1/pages.dbs · MCP tool pages_dbs · scopes pages:read

Input

pagerequiredstring

Output object[]

can_editboolean
columnsobject[]
idinteger
pagestring
rowsobject[]
titlestring
curl https://work.nightroll.app/api/v1/pages.dbs \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"page":"<page>"}'
pages.deletedestructive

REST POST /api/v1/pages.delete · MCP tool pages_delete · scopes pages:write

Input

idrequiredstring

Output object

deletedinteger
curl https://work.nightroll.app/api/v1/pages.delete \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":"<id>"}'
pages.discarddestructive

REST POST /api/v1/pages.discard · MCP tool pages_discard · scopes pages:write

Input

idrequiredstring

Output object

can_editbooleanWhether the caller may edit (and so change permissions or delete).
created_atinteger
created_bystring
doc_jsonstringPublished content as ProseMirror/TipTap JSON. Empty with version ≥ 1 means legacy markdown in `text`.
editorsstring[]
has_changesbooleanThe live (being edited) doc differs from the published version.
iconstring
idstring
kindstringpage (in the space's tree) | blog (a dated post in the space's blog)
labelsstring[]Labels (lowercase tags).
parentstringParent page id; null = top level of the space.
published_atintegerWhen it was first published; null for drafts.
spacestring
statusstringdraft (only its author sees it, never published) | current
textstringPublished content as markdown: search, mentions, smart-link embeds and agents read this.
titlestring
updated_atinteger
updated_bystring
versionintegerPublished version number; 0 = never published.
viewersstring[]The page's own restrictions; null = inherited from its parent pages and the space.
curl https://work.nightroll.app/api/v1/pages.discard \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":"<id>"}'
pages.exportread

REST POST /api/v1/pages.export · MCP tool pages_export · scopes pages:read

Input

formatrequiredstringmarkdown | html | word
idrequiredstring

Output object

datastringThe file's text (Markdown or HTML).
mimestring
namestringA file name for the download.
curl https://work.nightroll.app/api/v1/pages.export \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"format":"<format>","id":"<id>"}'
pages.followread

REST POST /api/v1/pages.follow · MCP tool pages_follow · scopes pages:read

Input

followrequiredbooleantrue to follow, false to stop.
keyrequiredstring

Output object

followersinteger
followingboolean
keystring
curl https://work.nightroll.app/api/v1/pages.follow \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"follow":true,"key":"<key>"}'
pages.getread

REST POST /api/v1/pages.get · MCP tool pages_get · scopes pages:read

Input

idrequiredstring

Output object

can_editbooleanWhether the caller may edit (and so change permissions or delete).
created_atinteger
created_bystring
doc_jsonstringPublished content as ProseMirror/TipTap JSON. Empty with version ≥ 1 means legacy markdown in `text`.
editorsstring[]
has_changesbooleanThe live (being edited) doc differs from the published version.
iconstring
idstring
kindstringpage (in the space's tree) | blog (a dated post in the space's blog)
labelsstring[]Labels (lowercase tags).
parentstringParent page id; null = top level of the space.
published_atintegerWhen it was first published; null for drafts.
spacestring
statusstringdraft (only its author sees it, never published) | current
textstringPublished content as markdown: search, mentions, smart-link embeds and agents read this.
titlestring
updated_atinteger
updated_bystring
versionintegerPublished version number; 0 = never published.
viewersstring[]The page's own restrictions; null = inherited from its parent pages and the space.
curl https://work.nightroll.app/api/v1/pages.get \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":"<id>"}'
pages.includeread

REST POST /api/v1/pages.include · MCP tool pages_include · scopes pages:read

Input

excerptbooleanOnly its excerpt (the first Excerpt block) rather than the whole page.
idrequiredstringThe page to include.

Output object

doc_jsonstringThe published content (or the excerpt's) as TipTap JSON; empty when the page was never published.
iconstring
idstring
no_excerptbooleanexcerpt was asked for but the page has no Excerpt block.
spacestring
textstringThe same as markdown (excerpts: plain text).
titlestring
versioninteger
curl https://work.nightroll.app/api/v1/pages.include \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":"<id>"}'
pages.labelsread

REST POST /api/v1/pages.labels · MCP tool pages_labels · scopes pages:read

Input

spacestringOnly labels used in this space.

Output object[]

labelstring
pagesinteger
curl https://work.nightroll.app/api/v1/pages.labels \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
pages.listread

REST POST /api/v1/pages.list · MCP tool pages_list · scopes pages:read

Input

spacestring

Output object[]

created_bystring
has_changesboolean
iconstring
idstring
kindstringpage | whiteboard (blog posts aren't in the tree)
parentstring
positionnumber
restrictedbooleanHas its own view or edit restrictions.
spacestring
statusstring
titlestring
updated_atinteger
versioninteger
curl https://work.nightroll.app/api/v1/pages.list \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
pages.live_checkwrite

REST POST /api/v1/pages.live_check · MCP tool pages_live_check · scopes pages:write

Input

idrequiredstring

Output object

okboolean
curl https://work.nightroll.app/api/v1/pages.live_check \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":"<id>"}'
pages.movewrite

REST POST /api/v1/pages.move · MCP tool pages_move · scopes pages:write

Input

beforestringPut it right before this sibling; omit to put it last.
idrequiredstring
parentstringNew parent page id; null or "" = top level of the (new) space.
spacestringMove to another space (with its sub-pages). Defaults to the parent's space.

Output object

can_editbooleanWhether the caller may edit (and so change permissions or delete).
created_atinteger
created_bystring
doc_jsonstringPublished content as ProseMirror/TipTap JSON. Empty with version ≥ 1 means legacy markdown in `text`.
editorsstring[]
has_changesbooleanThe live (being edited) doc differs from the published version.
iconstring
idstring
kindstringpage (in the space's tree) | blog (a dated post in the space's blog)
labelsstring[]Labels (lowercase tags).
parentstringParent page id; null = top level of the space.
published_atintegerWhen it was first published; null for drafts.
spacestring
statusstringdraft (only its author sees it, never published) | current
textstringPublished content as markdown: search, mentions, smart-link embeds and agents read this.
titlestring
updated_atinteger
updated_bystring
versionintegerPublished version number; 0 = never published.
viewersstring[]The page's own restrictions; null = inherited from its parent pages and the space.
curl https://work.nightroll.app/api/v1/pages.move \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":"<id>"}'
pages.permissionsread

REST POST /api/v1/pages.permissions · MCP tool pages_permissions · scopes pages:read

Input

idrequiredstring

Output object

can_editboolean
editorsstring[]
inherited_editorsstring[]
inherited_viewersstring[]What applies when the page's own list is unset (nearest restricted parent, else the space).
ownerstring
viewersstring[]The page's own lists; null = inherited.
curl https://work.nightroll.app/api/v1/pages.permissions \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":"<id>"}'
pages.properties_reportread

REST POST /api/v1/pages.properties_report · MCP tool pages_properties_report · scopes pages:read

Input

columnsstring[]Only these columns, in this order (default: every key, in first-seen order).
descendingboolean
labelstringPages with this label…
sortstringSort by this column (default: title).
spacestring…and/or in this space.

Output object

columnsstring[]
rowsobject[]
curl https://work.nightroll.app/api/v1/pages.properties_report \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
pages.publishwrite

REST POST /api/v1/pages.publish · MCP tool pages_publish · scopes pages:write

Input

doc_jsonrequiredstringThe document to publish (TipTap JSON), as the editor has it.
idrequiredstring
messagestringOptional note shown in the page history.
textrequiredstringThe same content as markdown.
titlestring

Output object

can_editbooleanWhether the caller may edit (and so change permissions or delete).
created_atinteger
created_bystring
doc_jsonstringPublished content as ProseMirror/TipTap JSON. Empty with version ≥ 1 means legacy markdown in `text`.
editorsstring[]
has_changesbooleanThe live (being edited) doc differs from the published version.
iconstring
idstring
kindstringpage (in the space's tree) | blog (a dated post in the space's blog)
labelsstring[]Labels (lowercase tags).
parentstringParent page id; null = top level of the space.
published_atintegerWhen it was first published; null for drafts.
spacestring
statusstringdraft (only its author sees it, never published) | current
textstringPublished content as markdown: search, mentions, smart-link embeds and agents read this.
titlestring
updated_atinteger
updated_bystring
versionintegerPublished version number; 0 = never published.
viewersstring[]The page's own restrictions; null = inherited from its parent pages and the space.
curl https://work.nightroll.app/api/v1/pages.publish \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"doc_json":"<doc_json>","id":"<id>","text":"<text>"}'
pages.restorewrite

REST POST /api/v1/pages.restore · MCP tool pages_restore · scopes pages:write

Input

idrequiredstring
versionrequiredinteger

Output object

can_editbooleanWhether the caller may edit (and so change permissions or delete).
created_atinteger
created_bystring
doc_jsonstringPublished content as ProseMirror/TipTap JSON. Empty with version ≥ 1 means legacy markdown in `text`.
editorsstring[]
has_changesbooleanThe live (being edited) doc differs from the published version.
iconstring
idstring
kindstringpage (in the space's tree) | blog (a dated post in the space's blog)
labelsstring[]Labels (lowercase tags).
parentstringParent page id; null = top level of the space.
published_atintegerWhen it was first published; null for drafts.
spacestring
statusstringdraft (only its author sees it, never published) | current
textstringPublished content as markdown: search, mentions, smart-link embeds and agents read this.
titlestring
updated_atinteger
updated_bystring
versionintegerPublished version number; 0 = never published.
viewersstring[]The page's own restrictions; null = inherited from its parent pages and the space.
curl https://work.nightroll.app/api/v1/pages.restore \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":"<id>","version":1}'
pages.set_labelswrite

REST POST /api/v1/pages.set_labels · MCP tool pages_set_labels · scopes pages:write

Input

idrequiredstring
labelsrequiredstring[]Replaces the page's labels (cleaned: lowercase, dashes for spaces).

Output string[]

curl https://work.nightroll.app/api/v1/pages.set_labels \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":"<id>","labels":[]}'
pages.set_permissionswrite

REST POST /api/v1/pages.set_permissions · MCP tool pages_set_permissions · scopes pages:write

Input

editorsstring[]
idrequiredstring
viewersstring[]`everyone`, `admins`, `team:<id>` or member ids; null = inherit; omit to leave unchanged.

Output object

can_editbooleanWhether the caller may edit (and so change permissions or delete).
created_atinteger
created_bystring
doc_jsonstringPublished content as ProseMirror/TipTap JSON. Empty with version ≥ 1 means legacy markdown in `text`.
editorsstring[]
has_changesbooleanThe live (being edited) doc differs from the published version.
iconstring
idstring
kindstringpage (in the space's tree) | blog (a dated post in the space's blog)
labelsstring[]Labels (lowercase tags).
parentstringParent page id; null = top level of the space.
published_atintegerWhen it was first published; null for drafts.
spacestring
statusstringdraft (only its author sees it, never published) | current
textstringPublished content as markdown: search, mentions, smart-link embeds and agents read this.
titlestring
updated_atinteger
updated_bystring
versionintegerPublished version number; 0 = never published.
viewersstring[]The page's own restrictions; null = inherited from its parent pages and the space.
curl https://work.nightroll.app/api/v1/pages.set_permissions \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":"<id>"}'
pages.space_analyticsread

REST POST /api/v1/pages.space_analytics · MCP tool pages_space_analytics · scopes pages:read

Input

daysinteger
keyrequiredstring

Output object

pagesobject[]Most viewed pages in the window (pages you can see), top 20.
readersinteger
seriesobject[]
viewsinteger
curl https://work.nightroll.app/api/v1/pages.space_analytics \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"key":"<key>"}'
pages.space_createwrite

REST POST /api/v1/pages.space_create · MCP tool pages_space_create · scopes pages:write

Input

colorstring
descriptionstring
iconstring
keyrequiredstring2-10 letters/digits, starting with a letter (like project keys).
namerequiredstring

Output object

can_editbooleanWhat the caller may do.
can_manageboolean
colorstring
created_atinteger
created_bystringThe owner: may change permissions and delete the space (as may admins).
descriptionstring
editorsstring[]Who may add and edit its pages (pages can narrow this).
followersinteger
followingbooleanThe caller follows the space (new blog posts notify them).
homestringThe space's home page id.
iconstring
keystring
namestring
pagesintegerPublished pages in the space.
viewersstring[]Who sees the space: `everyone`, `admins`, `team:<id>` or member ids.
curl https://work.nightroll.app/api/v1/pages.space_create \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"key":"<key>","name":"<name>"}'
pages.space_deletedestructive

REST POST /api/v1/pages.space_delete · MCP tool pages_space_delete · scopes pages:write

Input

keyrequiredstring

Output object

deletedinteger
curl https://work.nightroll.app/api/v1/pages.space_delete \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"key":"<key>"}'
pages.space_exportwrite

REST POST /api/v1/pages.space_export · MCP tool pages_space_export · scopes pages:write

Input

formatrequiredstringmarkdown | html
keyrequiredstring

Output object

created_atinteger
errorstring
finished_atinteger
formatstring
idinteger
pagesinteger
requested_bystring
sizeinteger
spacestring
statestringqueued | ready | failed
curl https://work.nightroll.app/api/v1/pages.space_export \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"format":"<format>","key":"<key>"}'
pages.space_export_getread

REST POST /api/v1/pages.space_export_get · MCP tool pages_space_export_get · scopes pages:read

Input

as_urlbooleanA download link instead of the bytes, where the deployment serves files from their own origin.
idrequiredinteger

Output object

datastringThe .tar, base64 (empty when `url` is given).
namestring
urlstringWith `as_url`, where the deployment has a files origin: a five-minute link that downloads it.
curl https://work.nightroll.app/api/v1/pages.space_export_get \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
pages.space_exportsread

REST POST /api/v1/pages.space_exports · MCP tool pages_space_exports · scopes pages:read

Input

keyrequiredstring

Output object[]

created_atinteger
errorstring
finished_atinteger
formatstring
idinteger
pagesinteger
requested_bystring
sizeinteger
spacestring
statestringqueued | ready | failed
curl https://work.nightroll.app/api/v1/pages.space_exports \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"key":"<key>"}'
pages.space_getread

REST POST /api/v1/pages.space_get · MCP tool pages_space_get · scopes pages:read

Input

keyrequiredstring

Output object

can_editbooleanWhat the caller may do.
can_manageboolean
colorstring
created_atinteger
created_bystringThe owner: may change permissions and delete the space (as may admins).
descriptionstring
editorsstring[]Who may add and edit its pages (pages can narrow this).
followersinteger
followingbooleanThe caller follows the space (new blog posts notify them).
homestringThe space's home page id.
iconstring
keystring
namestring
pagesintegerPublished pages in the space.
viewersstring[]Who sees the space: `everyone`, `admins`, `team:<id>` or member ids.
curl https://work.nightroll.app/api/v1/pages.space_get \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"key":"<key>"}'
pages.space_permissionswrite

REST POST /api/v1/pages.space_permissions · MCP tool pages_space_permissions · scopes pages:write

Input

editorsstring[]
keyrequiredstring
viewersstring[]

Output object

can_editbooleanWhat the caller may do.
can_manageboolean
colorstring
created_atinteger
created_bystringThe owner: may change permissions and delete the space (as may admins).
descriptionstring
editorsstring[]Who may add and edit its pages (pages can narrow this).
followersinteger
followingbooleanThe caller follows the space (new blog posts notify them).
homestringThe space's home page id.
iconstring
keystring
namestring
pagesintegerPublished pages in the space.
viewersstring[]Who sees the space: `everyone`, `admins`, `team:<id>` or member ids.
curl https://work.nightroll.app/api/v1/pages.space_permissions \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"key":"<key>"}'
pages.space_updatewrite

REST POST /api/v1/pages.space_update · MCP tool pages_space_update · scopes pages:write

Input

colorstring
descriptionstring
homestringA page id in this space.
iconstring
keyrequiredstring
namestring

Output object

can_editbooleanWhat the caller may do.
can_manageboolean
colorstring
created_atinteger
created_bystringThe owner: may change permissions and delete the space (as may admins).
descriptionstring
editorsstring[]Who may add and edit its pages (pages can narrow this).
followersinteger
followingbooleanThe caller follows the space (new blog posts notify them).
homestringThe space's home page id.
iconstring
keystring
namestring
pagesintegerPublished pages in the space.
viewersstring[]Who sees the space: `everyone`, `admins`, `team:<id>` or member ids.
curl https://work.nightroll.app/api/v1/pages.space_update \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"key":"<key>"}'
pages.spacesread

REST POST /api/v1/pages.spaces · MCP tool pages_spaces · scopes pages:read

Input

None: send {}.

Output object[]

can_editbooleanWhat the caller may do.
can_manageboolean
colorstring
created_atinteger
created_bystringThe owner: may change permissions and delete the space (as may admins).
descriptionstring
editorsstring[]Who may add and edit its pages (pages can narrow this).
followersinteger
followingbooleanThe caller follows the space (new blog posts notify them).
homestringThe space's home page id.
iconstring
keystring
namestring
pagesintegerPublished pages in the space.
viewersstring[]Who sees the space: `everyone`, `admins`, `team:<id>` or member ids.
curl https://work.nightroll.app/api/v1/pages.spaces \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
pages.template_deletedestructive

REST POST /api/v1/pages.template_delete · MCP tool pages_template_delete · scopes pages:write

Input

idrequiredinteger

Output object

deletedinteger
curl https://work.nightroll.app/api/v1/pages.template_delete \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
pages.template_savewrite

REST POST /api/v1/pages.template_save · MCP tool pages_template_save · scopes pages:write

Input

descriptionstring
doc_jsonrequiredstring
iconstring
idinteger
namerequiredstring
spacestring

Output object

created_bystring
descriptionstring
doc_jsonstring
iconstring
idinteger
namestring
spacestringSpace it belongs to; null = every space.
curl https://work.nightroll.app/api/v1/pages.template_save \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"doc_json":"<doc_json>","name":"<name>"}'
pages.templatesread

REST POST /api/v1/pages.templates · MCP tool pages_templates · scopes pages:read

Input

None: send {}.

Output object[]

created_bystring
descriptionstring
doc_jsonstring
iconstring
idinteger
namestring
spacestringSpace it belongs to; null = every space.
curl https://work.nightroll.app/api/v1/pages.templates \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
pages.updatewrite

REST POST /api/v1/pages.update · MCP tool pages_update · scopes pages:write

Input

iconstring
idrequiredstring
titlestring

Output object

can_editbooleanWhether the caller may edit (and so change permissions or delete).
created_atinteger
created_bystring
doc_jsonstringPublished content as ProseMirror/TipTap JSON. Empty with version ≥ 1 means legacy markdown in `text`.
editorsstring[]
has_changesbooleanThe live (being edited) doc differs from the published version.
iconstring
idstring
kindstringpage (in the space's tree) | blog (a dated post in the space's blog)
labelsstring[]Labels (lowercase tags).
parentstringParent page id; null = top level of the space.
published_atintegerWhen it was first published; null for drafts.
spacestring
statusstringdraft (only its author sees it, never published) | current
textstringPublished content as markdown: search, mentions, smart-link embeds and agents read this.
titlestring
updated_atinteger
updated_bystring
versionintegerPublished version number; 0 = never published.
viewersstring[]The page's own restrictions; null = inherited from its parent pages and the space.
curl https://work.nightroll.app/api/v1/pages.update \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":"<id>"}'
pages.version_getread

REST POST /api/v1/pages.version_get · MCP tool pages_version_get · scopes pages:read

Input

idrequiredstring
versionrequiredinteger

Output object

authorstring
created_atinteger
doc_jsonstring
messagestring
textstring
titlestring
versioninteger
curl https://work.nightroll.app/api/v1/pages.version_get \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":"<id>","version":1}'
pages.versionsread

REST POST /api/v1/pages.versions · MCP tool pages_versions · scopes pages:read

Input

idrequiredstring

Output object[]

authorstring
created_atinteger
messagestring
titlestring
versioninteger
curl https://work.nightroll.app/api/v1/pages.versions \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":"<id>"}'
pages.viewread

REST POST /api/v1/pages.view · MCP tool pages_view · scopes pages:read

Input

idrequiredstring

Output object

viewsinteger
curl https://work.nightroll.app/api/v1/pages.view \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":"<id>"}'

plugins

plugins.actionread

REST POST /api/v1/plugins.action · MCP tool plugins_action · scopes plugins:read

Input

actionrequiredstring
contextany
inputany
pluginrequiredstring

Output object

errorstring
logsstring[]
okboolean
valueany
curl https://work.nightroll.app/api/v1/plugins.action \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"action":"<action>","plugin":"<plugin>"}'
plugins.callread

REST POST /api/v1/plugins.call · MCP tool plugins_call · scopes plugins:read

Input

inputany
oprequiredstring
pluginrequiredstring

Output object

errorstring
logsstring[]
okboolean
valueany
curl https://work.nightroll.app/api/v1/plugins.call \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"op":"<op>","plugin":"<plugin>"}'
plugins.enablewrite

REST POST /api/v1/plugins.enable · MCP tool plugins_enable · scopes admin

Input

enabledrequiredboolean
keyrequiredstring

Output object

allowstring[]
descriptionstring
enabledboolean
eventsobject[]
installed_atinteger
installed_bystring
keystring
listinginteger
namestring
opsobject[]
permissionsstring[]
publisherstringSigned bundles: the publisher's key, and the marketplace listing it came from.
runtimestringrhai | wasm
settingsobject[]
token_prefixstringFirst characters of the install token.
uiobjectWhere a plugin shows up in the app.
updated_atinteger
versionstring
curl https://work.nightroll.app/api/v1/plugins.enable \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"enabled":true,"key":"<key>"}'
plugins.http_resultwrite

REST POST /api/v1/plugins.http_result · MCP tool plugins_http_result · scopes system

Input

bodystring
errorstring
idrequiredinteger
statusrequiredinteger0 = no answer.

Output object

okboolean
curl https://work.nightroll.app/api/v1/plugins.http_result \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1,"status":1}'
plugins.http_takewrite

REST POST /api/v1/plugins.http_take · MCP tool plugins_http_take · scopes system

Input

idrequiredinteger

Output object

bodystring
gonebooleanGone (uninstalled, disabled, or already sent): nothing to do.
headersany[][]
methodstring
urlstring
curl https://work.nightroll.app/api/v1/plugins.http_take \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
plugins.installwrite

REST POST /api/v1/plugins.install · MCP tool plugins_install · scopes admin

Input

manifestobjectWith `source` or `wasm`; or give `signed` instead.
settingsobjectSetting values by key.
signedobjectA signed bundle (W616): `bundle` is the JSON text `{manifest, source | wasm}`, signed (Ed25519) by `publisher`.
sourcestringRhai source defining the handlers (`fn estimate(input) { … }`).
wasmstringOr a Wasm module, base64.

Output object

pluginobject
tokenstringThe install token (new installs and rotations only; shown once): `Authorization: Bearer kbp_…` for the plugin's own backend.
curl https://work.nightroll.app/api/v1/plugins.install \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
plugins.listread

REST POST /api/v1/plugins.list · MCP tool plugins_list · scopes plugins:read

Input

None: send {}.

Output object[]

allowstring[]
descriptionstring
enabledboolean
eventsobject[]
installed_atinteger
installed_bystring
keystring
listinginteger
namestring
opsobject[]
permissionsstring[]
publisherstringSigned bundles: the publisher's key, and the marketplace listing it came from.
runtimestringrhai | wasm
settingsobject[]
token_prefixstringFirst characters of the install token.
uiobjectWhere a plugin shows up in the app.
updated_atinteger
versionstring
curl https://work.nightroll.app/api/v1/plugins.list \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
plugins.renderread

REST POST /api/v1/plugins.render · MCP tool plugins_render · scopes plugins:read

Input

contextanyWhat it's shown for: issue panels `{key}`, card badges `{keys}`, page macros `{page, params}`, commands `{issue?, page?, path, selection?}`, gadgets `{dashboard}`.
keyrequiredstring
pluginrequiredstring
slotrequiredstringissue_panel | card_badge | page_macro | command | gadget

Output object

errorstring
logsstring[]
okboolean
valueany
curl https://work.nightroll.app/api/v1/plugins.render \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"key":"<key>","plugin":"<plugin>","slot":"<slot>"}'
plugins.runswrite

REST POST /api/v1/plugins.runs · MCP tool plugins_runs · scopes admin

Input

keyrequiredstring

Output object[]

atinteger
bystring
callsstring[]
errorstring
fuelinteger
handlerstring
idinteger
logsstring[]
msinteger
okboolean
triggerstring
curl https://work.nightroll.app/api/v1/plugins.runs \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"key":"<key>"}'
plugins.settings_savewrite

REST POST /api/v1/plugins.settings_save · MCP tool plugins_settings_save · scopes admin

Input

keyrequiredstring
settingsrequiredobjectValues by setting key; a secret left out keeps its value.

Output object

allowstring[]
descriptionstring
enabledboolean
eventsobject[]
installed_atinteger
installed_bystring
keystring
listinginteger
namestring
opsobject[]
permissionsstring[]
publisherstringSigned bundles: the publisher's key, and the marketplace listing it came from.
runtimestringrhai | wasm
settingsobject[]
token_prefixstringFirst characters of the install token.
uiobjectWhere a plugin shows up in the app.
updated_atinteger
versionstring
curl https://work.nightroll.app/api/v1/plugins.settings_save \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"key":"<key>","settings":"<settings>"}'
plugins.signwrite

REST POST /api/v1/plugins.sign · MCP tool plugins_sign · scopes admin

Input

manifestrequiredobjectWhat a plugin is and may do.
sourcestring
wasmstring

Output object

bundlestringThe bundle text: submit it as is (`market.submit`), or install it (`plugins.install {signed}`).
publisherstringThis org's publisher key (hex).
sha256string
signaturestring
curl https://work.nightroll.app/api/v1/plugins.sign \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"manifest":"<manifest>"}'
plugins.token_rotatewrite

REST POST /api/v1/plugins.token_rotate · MCP tool plugins_token_rotate · scopes admin

Input

keyrequiredstring

Output object

pluginobject
tokenstringThe install token (new installs and rotations only; shown once): `Authorization: Bearer kbp_…` for the plugin's own backend.
curl https://work.nightroll.app/api/v1/plugins.token_rotate \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"key":"<key>"}'
plugins.toolsread

REST POST /api/v1/plugins.tools · MCP tool plugins_tools · scopes plugins:read

Input

None: send {}.

Output object[]

descriptionstring
inputany
opstring
pluginstring
plugin_namestring
writesbooleanWhether it may change data (its scope is a write scope or admin).
curl https://work.nightroll.app/api/v1/plugins.tools \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
plugins.uiread

REST POST /api/v1/plugins.ui · MCP tool plugins_ui · scopes plugins:read

Input

None: send {}.

Output object[]

descriptionstring
keystring
pluginstring
plugin_namestring
slotstringissue_panel | card_badge | page_macro | command | gadget
titlestring
wherestring[]Commands: palette and/or slash.
curl https://work.nightroll.app/api/v1/plugins.ui \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
plugins.uninstallwrite

REST POST /api/v1/plugins.uninstall · MCP tool plugins_uninstall · scopes admin

Input

keyrequiredstring

Output object

okboolean
curl https://work.nightroll.app/api/v1/plugins.uninstall \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"key":"<key>"}'

poker

poker.acceptwrite

REST POST /api/v1/poker.accept · MCP tool poker_accept · scopes issues:write

Input

idrequiredinteger
pointsrequirednumber

Output object

can_runbooleanThe caller runs it (facilitator, or a project admin).
can_votebooleanThe caller may vote (edits the project).
created_atinteger
currentstringThe issue being estimated.
current_descriptionstring
facilitatorstring
idinteger
itemsobject[]
namestring
projectstring
revealedboolean
scalestring[]
sprintinteger
statestringopen | closed
statsobject
votesobject[]
curl https://work.nightroll.app/api/v1/poker.accept \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1,"points":1}'
poker.addwrite

REST POST /api/v1/poker.add · MCP tool poker_add · scopes issues:write

Input

idrequiredinteger
keysrequiredstring[]

Output object

can_runbooleanThe caller runs it (facilitator, or a project admin).
can_votebooleanThe caller may vote (edits the project).
created_atinteger
currentstringThe issue being estimated.
current_descriptionstring
facilitatorstring
idinteger
itemsobject[]
namestring
projectstring
revealedboolean
scalestring[]
sprintinteger
statestringopen | closed
statsobject
votesobject[]
curl https://work.nightroll.app/api/v1/poker.add \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1,"keys":[]}'
poker.closewrite

REST POST /api/v1/poker.close · MCP tool poker_close · scopes issues:write

Input

idrequiredinteger

Output object

can_runbooleanThe caller runs it (facilitator, or a project admin).
can_votebooleanThe caller may vote (edits the project).
created_atinteger
currentstringThe issue being estimated.
current_descriptionstring
facilitatorstring
idinteger
itemsobject[]
namestring
projectstring
revealedboolean
scalestring[]
sprintinteger
statestringopen | closed
statsobject
votesobject[]
curl https://work.nightroll.app/api/v1/poker.close \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
poker.createwrite

REST POST /api/v1/poker.create · MCP tool poker_create · scopes issues:write

Input

keysstring[]Issue keys, in order.
namestring
projectrequiredstring
scalestring[]Card values (default 0, ½, 1, 2, 3, 5, 8, 13, 20, 40, ?, ☕).
sprintintegerEstimate this sprint's issues without points (default when `keys` is empty: the backlog's top 10 without points).

Output object

can_runbooleanThe caller runs it (facilitator, or a project admin).
can_votebooleanThe caller may vote (edits the project).
created_atinteger
currentstringThe issue being estimated.
current_descriptionstring
facilitatorstring
idinteger
itemsobject[]
namestring
projectstring
revealedboolean
scalestring[]
sprintinteger
statestringopen | closed
statsobject
votesobject[]
curl https://work.nightroll.app/api/v1/poker.create \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"project":"<project>"}'
poker.deletedestructive

REST POST /api/v1/poker.delete · MCP tool poker_delete · scopes issues:write

Input

idrequiredinteger

Output object

deletedintegerRows removed or moved (a project counts itself plus its issues; an option counts the issues it moved).
curl https://work.nightroll.app/api/v1/poker.delete \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
poker.getread

REST POST /api/v1/poker.get · MCP tool poker_get · scopes issues:read

Input

idrequiredinteger

Output object

can_runbooleanThe caller runs it (facilitator, or a project admin).
can_votebooleanThe caller may vote (edits the project).
created_atinteger
currentstringThe issue being estimated.
current_descriptionstring
facilitatorstring
idinteger
itemsobject[]
namestring
projectstring
revealedboolean
scalestring[]
sprintinteger
statestringopen | closed
statsobject
votesobject[]
curl https://work.nightroll.app/api/v1/poker.get \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
poker.gowrite

REST POST /api/v1/poker.go · MCP tool poker_go · scopes issues:write

Input

idrequiredinteger
keystringIssue key; omit for the next one without an estimate.

Output object

can_runbooleanThe caller runs it (facilitator, or a project admin).
can_votebooleanThe caller may vote (edits the project).
created_atinteger
currentstringThe issue being estimated.
current_descriptionstring
facilitatorstring
idinteger
itemsobject[]
namestring
projectstring
revealedboolean
scalestring[]
sprintinteger
statestringopen | closed
statsobject
votesobject[]
curl https://work.nightroll.app/api/v1/poker.go \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
poker.revealwrite

REST POST /api/v1/poker.reveal · MCP tool poker_reveal · scopes issues:write

Input

idrequiredinteger

Output object

can_runbooleanThe caller runs it (facilitator, or a project admin).
can_votebooleanThe caller may vote (edits the project).
created_atinteger
currentstringThe issue being estimated.
current_descriptionstring
facilitatorstring
idinteger
itemsobject[]
namestring
projectstring
revealedboolean
scalestring[]
sprintinteger
statestringopen | closed
statsobject
votesobject[]
curl https://work.nightroll.app/api/v1/poker.reveal \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
poker.revotewrite

REST POST /api/v1/poker.revote · MCP tool poker_revote · scopes issues:write

Input

idrequiredinteger

Output object

can_runbooleanThe caller runs it (facilitator, or a project admin).
can_votebooleanThe caller may vote (edits the project).
created_atinteger
currentstringThe issue being estimated.
current_descriptionstring
facilitatorstring
idinteger
itemsobject[]
namestring
projectstring
revealedboolean
scalestring[]
sprintinteger
statestringopen | closed
statsobject
votesobject[]
curl https://work.nightroll.app/api/v1/poker.revote \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
poker.sessionsread

REST POST /api/v1/poker.sessions · MCP tool poker_sessions · scopes issues:read

Input

projectrequiredstring

Output object[]

created_atinteger
estimatedinteger
facilitatorstring
idinteger
itemsinteger
namestring
sprintinteger
statestring
curl https://work.nightroll.app/api/v1/poker.sessions \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"project":"<project>"}'
poker.votewrite

REST POST /api/v1/poker.vote · MCP tool poker_vote · scopes issues:write

Input

idrequiredinteger
valuerequiredstringA card of the session's scale; empty takes your vote back.

Output object

can_runbooleanThe caller runs it (facilitator, or a project admin).
can_votebooleanThe caller may vote (edits the project).
created_atinteger
currentstringThe issue being estimated.
current_descriptionstring
facilitatorstring
idinteger
itemsobject[]
namestring
projectstring
revealedboolean
scalestring[]
sprintinteger
statestringopen | closed
statsobject
votesobject[]
curl https://work.nightroll.app/api/v1/poker.vote \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1,"value":"<value>"}'

roadmap

roadmap.changelogread

REST POST /api/v1/roadmap.changelog · MCP tool roadmap_changelog · scopes roadmap:read

Input

None: send {}.

Output object[]

bodystringMarkdown.
created_atinteger
idinteger
projectstring
publicbooleanPublished (public).
published_atinteger
titlestring
versionintegerThe released version it was drafted from.
curl https://work.nightroll.app/api/v1/roadmap.changelog \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
roadmap.changelog_deletedestructive

REST POST /api/v1/roadmap.changelog_delete · MCP tool roadmap_changelog_delete · scopes roadmap:write

Input

idrequiredinteger

Output object

okboolean
curl https://work.nightroll.app/api/v1/roadmap.changelog_delete \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
roadmap.changelog_savewrite

REST POST /api/v1/roadmap.changelog_save · MCP tool roadmap_changelog_save · scopes roadmap:write

Input

bodystring
idinteger
publicbooleanPublish it (true) or keep it a draft.
titlerequiredstring

Output object[]

bodystringMarkdown.
created_atinteger
idinteger
projectstring
publicbooleanPublished (public).
published_atinteger
titlestring
versionintegerThe released version it was drafted from.
curl https://work.nightroll.app/api/v1/roadmap.changelog_save \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"title":"<title>"}'
roadmap.item_deletedestructive

REST POST /api/v1/roadmap.item_delete · MCP tool roadmap_item_delete · scopes roadmap:write

Input

idrequiredinteger

Output object[]

columnstringnow | next | later | shipped: where it shows.
column_setstringauto (from the linked issues), or the column set by hand.
descriptionstring
doneintegerLinked issues done / all.
idinteger
ideaintegerThe feedback idea it answers, and its votes.
issuesstring[]Linked issue keys (team view only).
positionnumber
publicbooleanShown on the public roadmap.
titlestring
totalinteger
updated_atinteger
votesinteger
curl https://work.nightroll.app/api/v1/roadmap.item_delete \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
roadmap.item_savewrite

REST POST /api/v1/roadmap.item_save · MCP tool roadmap_item_save · scopes roadmap:write

Input

columnstringauto | now | next | later | shipped
descriptionstring
idinteger
ideaintegerA feedback idea id.
issuesstring[]Issue keys that deliver it (replaces the list).
positionnumber
publicboolean
titlerequiredstring

Output object[]

columnstringnow | next | later | shipped: where it shows.
column_setstringauto (from the linked issues), or the column set by hand.
descriptionstring
doneintegerLinked issues done / all.
idinteger
ideaintegerThe feedback idea it answers, and its votes.
issuesstring[]Linked issue keys (team view only).
positionnumber
publicbooleanShown on the public roadmap.
titlestring
totalinteger
updated_atinteger
votesinteger
curl https://work.nightroll.app/api/v1/roadmap.item_save \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"title":"<title>"}'
roadmap.itemsread

REST POST /api/v1/roadmap.items · MCP tool roadmap_items · scopes roadmap:read

Input

None: send {}.

Output object[]

columnstringnow | next | later | shipped: where it shows.
column_setstringauto (from the linked issues), or the column set by hand.
descriptionstring
doneintegerLinked issues done / all.
idinteger
ideaintegerThe feedback idea it answers, and its votes.
issuesstring[]Linked issue keys (team view only).
positionnumber
publicbooleanShown on the public roadmap.
titlestring
totalinteger
updated_atinteger
votesinteger
curl https://work.nightroll.app/api/v1/roadmap.items \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
roadmap.publicwrite

REST POST /api/v1/roadmap.public · MCP tool roadmap_public · scopes desk:public | roadmap:read

Input

None: send {}.

Output object

changelogobject[]Published changelog entries, newest first (≤ 50).
itemsobject[]Public items by column: now, next, later, shipped.
curl https://work.nightroll.app/api/v1/roadmap.public \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'

scripts

scripts.deletedestructive

REST POST /api/v1/scripts.delete · MCP tool scripts_delete · scopes admin

Input

idrequiredinteger

Output object

deletedintegerRows removed or moved (a project counts itself plus its issues; an option counts the issues it moved).
curl https://work.nightroll.app/api/v1/scripts.delete \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
scripts.listwrite

REST POST /api/v1/scripts.list · MCP tool scripts_list · scopes admin

Input

None: send {}.

Output object[]

codestring
descriptionstring
enabledboolean
eventsstring[]listener: event kinds (`issue.created`, `issue.*`, `*`).
fieldstringfield: the custom field key it computes.
idinteger
kindstringconsole | listener | field | tql
namestring
run_asstringWhose permissions it runs with (the admin who last saved it).
updated_atinteger
curl https://work.nightroll.app/api/v1/scripts.list \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
scripts.runwrite

REST POST /api/v1/scripts.run · MCP tool scripts_run · scopes admin

Input

coderequiredstring
inputanyBound to `input` in the script.

Output object

callsstring[]Ops it called, in order.
errorstring
fuelinteger
logsstring[]
msinteger
runinteger
valueanyThe script's last expression.
curl https://work.nightroll.app/api/v1/scripts.run \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"code":"<code>"}'
scripts.runswrite

REST POST /api/v1/scripts.runs · MCP tool scripts_runs · scopes admin

Input

idintegerA script's runs, or console runs when omitted.

Output object[]

atinteger
bystring
callsstring[]
errorstring
fuelinteger
idinteger
logsstring[]
msinteger
okboolean
triggerstring
valuestring
curl https://work.nightroll.app/api/v1/scripts.runs \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
scripts.savewrite

REST POST /api/v1/scripts.save · MCP tool scripts_save · scopes admin

Input

coderequiredstring
descriptionstring
enabledboolean
eventsstring[]
fieldstring
idinteger
kindrequiredstringconsole | listener | field | tql
namerequiredstring

Output object[]

codestring
descriptionstring
enabledboolean
eventsstring[]listener: event kinds (`issue.created`, `issue.*`, `*`).
fieldstringfield: the custom field key it computes.
idinteger
kindstringconsole | listener | field | tql
namestring
run_asstringWhose permissions it runs with (the admin who last saved it).
updated_atinteger
curl https://work.nightroll.app/api/v1/scripts.save \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"code":"<code>","kind":"<kind>","name":"<name>"}'
scripts.testwrite

REST POST /api/v1/scripts.test · MCP tool scripts_test · scopes admin

Input

idrequiredinteger
inputanyOverrides the input (default: a sample for the kind — the last event / an issue key's issue / no args).
keystringfield scripts: run against this issue.

Output object

callsstring[]Ops it called, in order.
errorstring
fuelinteger
logsstring[]
msinteger
runinteger
valueanyThe script's last expression.
curl https://work.nightroll.app/api/v1/scripts.test \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'

sla

sla.calendar_deletedestructive

REST POST /api/v1/sla.calendar_delete · MCP tool sla_calendar_delete · scopes admin

Input

idrequiredinteger

Output object

deletedintegerRows removed or moved (a project counts itself plus its issues; an option counts the issues it moved).
curl https://work.nightroll.app/api/v1/sla.calendar_delete \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
sla.calendar_savewrite

REST POST /api/v1/sla.calendar_save · MCP tool sla_calendar_save · scopes admin

Input

holidaysstring[]YYYY-MM-DD days off.
hoursrequiredobjectWeekday ("0" Sunday … "6" Saturday) → ["HH:MM", "HH:MM"] working hours; missing days are off.
idinteger
namerequiredstring
tz_offsetrequiredintegerMinutes behind UTC (as `Date.getTimezoneOffset()` gives it): 300 for New York in winter, -60 for Paris.

Output object[]

holidaysstring[]YYYY-MM-DD days off.
hoursobjectWeekday ("0" Sunday … "6" Saturday) → ["HH:MM", "HH:MM"] working hours; missing days are off.
idinteger
namestring
tz_offsetintegerMinutes behind UTC (as `Date.getTimezoneOffset()` gives it): 300 for New York in winter, -60 for Paris.
curl https://work.nightroll.app/api/v1/sla.calendar_save \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"hours":"<hours>","name":"<name>","tz_offset":1}'
sla.calendarsread

REST POST /api/v1/sla.calendars · MCP tool sla_calendars · scopes issues:read

Input

None: send {}.

Output object[]

holidaysstring[]YYYY-MM-DD days off.
hoursobjectWeekday ("0" Sunday … "6" Saturday) → ["HH:MM", "HH:MM"] working hours; missing days are off.
idinteger
namestring
tz_offsetintegerMinutes behind UTC (as `Date.getTimezoneOffset()` gives it): 300 for New York in winter, -60 for Paris.
curl https://work.nightroll.app/api/v1/sla.calendars \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
sla.issueread

REST POST /api/v1/sla.issue · MCP tool sla_issue · scopes issues:read

Input

keyrequiredstring

Output object[]

calendarstring
due_atintegerWhen it breaches (running clocks; unix seconds).
elapsed_minutesinteger
metricstring
namestring
policyinteger
remaining_minutesintegerNegative once breached.
started_atinteger
statestringrunning | met | breached (stopped late, or still running past the target)
stopped_atinteger
target_minutesinteger
curl https://work.nightroll.app/api/v1/sla.issue \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"key":"<key>"}'
sla.policiesread

REST POST /api/v1/sla.policies · MCP tool sla_policies · scopes issues:read

Input

None: send {}.

Output object[]

calendarinteger
enabledboolean
idinteger
kindsstring[]
metricstringfirst_response (stops at the first comment by someone other than the reporter) | resolution (stops when resolved)
namestring
prioritiesstring[]
projectsstring[]Empty = every project / type / priority.
sinceintegerApplies to issues created from this time (unix seconds).
target_minutesintegerBusiness minutes allowed.
curl https://work.nightroll.app/api/v1/sla.policies \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
sla.policy_deletedestructive

REST POST /api/v1/sla.policy_delete · MCP tool sla_policy_delete · scopes admin

Input

idrequiredinteger

Output object

deletedintegerRows removed or moved (a project counts itself plus its issues; an option counts the issues it moved).
curl https://work.nightroll.app/api/v1/sla.policy_delete \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
sla.policy_savewrite

REST POST /api/v1/sla.policy_save · MCP tool sla_policy_save · scopes admin

Input

calendarrequiredinteger
enabledboolean
idinteger
kindsstring[]
metricrequiredstringfirst_response (stops at the first comment by someone other than the reporter) | resolution (stops when resolved)
namerequiredstring
prioritiesstring[]
projectsstring[]Empty = every project / type / priority.
sinceintegerApplies to issues created from this time (unix seconds).
target_minutesrequiredintegerBusiness minutes allowed.

Output object[]

calendarinteger
enabledboolean
idinteger
kindsstring[]
metricstringfirst_response (stops at the first comment by someone other than the reporter) | resolution (stops when resolved)
namestring
prioritiesstring[]
projectsstring[]Empty = every project / type / priority.
sinceintegerApplies to issues created from this time (unix seconds).
target_minutesintegerBusiness minutes allowed.
curl https://work.nightroll.app/api/v1/sla.policy_save \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"calendar":1,"metric":"<metric>","name":"<name>","target_minutes":1}'
sla.reportread

REST POST /api/v1/sla.report · MCP tool sla_report · scopes issues:read

Input

daysintegerClocks started in the last N days (default 30).
projectstringOnly this project.

Output object[]

avg_minutesinteger
breachedinteger
metinteger
met_pctintegermet / (met + breached) × 100; null with nothing finished.
namestring
policyinteger
runninginteger
curl https://work.nightroll.app/api/v1/sla.report \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'

staging

staging.applywrite

REST POST /api/v1/staging.apply · MCP tool staging_apply · scopes system

Input

changesrequiredobject[]
fromrequiredstringThe staging org's slug (for the event).

Output any

curl https://work.nightroll.app/api/v1/staging.apply \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"changes":[],"from":"<from>"}'
staging.configwrite

REST POST /api/v1/staging.config · MCP tool staging_config · scopes system

Input

None: send {}.

Output object

baseobjectThe configuration at the copy (empty outside staging orgs).
tablesobject
curl https://work.nightroll.app/api/v1/staging.config \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
staging.preparewrite

REST POST /api/v1/staging.prepare · MCP tool staging_prepare · scopes system

Input

datarequiredstringnone | anonymized
ownerrequiredstringWho sample issues are assigned to.

Output any

curl https://work.nightroll.app/api/v1/staging.prepare \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"data":"<data>","owner":"<owner>"}'
staging.rebasewrite

REST POST /api/v1/staging.rebase · MCP tool staging_rebase · scopes system

Input

changesrequiredobject[]
fromrequiredstringThe staging org's slug (for the event).

Output any

curl https://work.nightroll.app/api/v1/staging.rebase \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"changes":[],"from":"<from>"}'

tests

tests.caseread

REST POST /api/v1/tests.case · MCP tool tests_case · scopes issues:read

Input

keyrequiredstring

Output object

automation_idstringMatches imported results: JUnit `classname.name`, xUnit test name, Cucumber `feature;scenario` id.
coversstring[]Requirement keys it covers.
folderstringA path like "Checkout/Payments" ("" = top level).
idinteger
keystring`{project}-T{number}`, e.g. "WEB-T12".
last_run_atinteger
last_statusstringIts latest result anywhere: pass | fail | blocked | skip | todo (null = never run).
preconditionsstring
projectstring
stepsobject[]
titlestring
updated_atinteger
curl https://work.nightroll.app/api/v1/tests.case \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"key":"<key>"}'
tests.case_deletedestructive

REST POST /api/v1/tests.case_delete · MCP tool tests_case_delete · scopes issues:write

Input

keyrequiredstring

Output object

deletedintegerRows removed or moved (a project counts itself plus its issues; an option counts the issues it moved).
curl https://work.nightroll.app/api/v1/tests.case_delete \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"key":"<key>"}'
tests.case_savewrite

REST POST /api/v1/tests.case_save · MCP tool tests_case_save · scopes issues:write

Input

automation_idstring
coversstring[]Requirement keys it covers (replaces).
folderstring
keystringOmit to create (then `project` is required).
preconditionsstring
projectstring
stepsobject[]
titlerequiredstring

Output object

automation_idstringMatches imported results: JUnit `classname.name`, xUnit test name, Cucumber `feature;scenario` id.
coversstring[]Requirement keys it covers.
folderstringA path like "Checkout/Payments" ("" = top level).
idinteger
keystring`{project}-T{number}`, e.g. "WEB-T12".
last_run_atinteger
last_statusstringIts latest result anywhere: pass | fail | blocked | skip | todo (null = never run).
preconditionsstring
projectstring
stepsobject[]
titlestring
updated_atinteger
curl https://work.nightroll.app/api/v1/tests.case_save \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"title":"<title>"}'
tests.casesread

REST POST /api/v1/tests.cases · MCP tool tests_cases · scopes issues:read

Input

folderstringOnly this folder (and below).
projectrequiredstring

Output object[]

automation_idstringMatches imported results: JUnit `classname.name`, xUnit test name, Cucumber `feature;scenario` id.
coversstring[]Requirement keys it covers.
folderstringA path like "Checkout/Payments" ("" = top level).
idinteger
keystring`{project}-T{number}`, e.g. "WEB-T12".
last_run_atinteger
last_statusstringIts latest result anywhere: pass | fail | blocked | skip | todo (null = never run).
preconditionsstring
projectstring
stepsobject[]
titlestring
updated_atinteger
curl https://work.nightroll.app/api/v1/tests.cases \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"project":"<project>"}'
tests.coverageread

REST POST /api/v1/tests.coverage · MCP tool tests_coverage · scopes issues:read

Input

planintegerResults within this plan only.
projectrequiredstring
tqlstringRequirements: issues matching this TQL (default: the project's open stories and tasks… everything not done).

Output object[]

keystring
statusstringok | nok | not_run | partial | uncovered
testsobject[]
titlestring
curl https://work.nightroll.app/api/v1/tests.coverage \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"project":"<project>"}'
tests.executewrite

REST POST /api/v1/tests.execute · MCP tool tests_execute · scopes issues:write

Input

commentstring
defectsstring[]
environmentstring
planinteger
statusrequiredstring
stepsobject[]
testrequiredstring

Output object

commentstring
defectsstring[]Issue keys of the bugs it found.
duration_msinteger
environmentstring
executed_atinteger
executed_bystring
idinteger
planinteger
sourcestringmanual | junit | xunit | cucumber
statusstring
stepsobject[]
teststring
curl https://work.nightroll.app/api/v1/tests.execute \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"status":"<status>","test":"<test>"}'
tests.for_issueread

REST POST /api/v1/tests.for_issue · MCP tool tests_for_issue · scopes issues:read

Input

keyrequiredstring

Output object

keystring
statusstringok | nok | not_run | partial | uncovered
testsobject[]
titlestring
curl https://work.nightroll.app/api/v1/tests.for_issue \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"key":"<key>"}'
tests.importwrite

REST POST /api/v1/tests.import · MCP tool tests_import · scopes issues:write

Input

contentrequiredstringThe report file's text.
create_missingbooleanCreate cases for results that match none (default true).
environmentstring
formatrequiredstringjunit | xunit | cucumber
planintegerRecord the results in this plan (cases get added to it).
projectrequiredstring

Output object

createdstring[]
failedinteger
passedinteger
resultsinteger
skippedinteger
unmatchedstring[]Results that matched no case (with create_missing off).
curl https://work.nightroll.app/api/v1/tests.import \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"content":"<content>","format":"<format>","project":"<project>"}'
tests.planread

REST POST /api/v1/tests.plan · MCP tool tests_plan · scopes issues:read

Input

idrequiredinteger

Output object

can_editboolean
countsobjectCounts per status (todo includes never run).
created_atinteger
created_bystring
descriptionstring
idinteger
namestring
projectstring
statestring
testsobject[]Its cases with their latest result in this plan.
versionstring
curl https://work.nightroll.app/api/v1/tests.plan \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
tests.plan_deletedestructive

REST POST /api/v1/tests.plan_delete · MCP tool tests_plan_delete · scopes issues:write

Input

idrequiredinteger

Output object

deletedintegerRows removed or moved (a project counts itself plus its issues; an option counts the issues it moved).
curl https://work.nightroll.app/api/v1/tests.plan_delete \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
tests.plan_savewrite

REST POST /api/v1/tests.plan_save · MCP tool tests_plan_save · scopes issues:write

Input

descriptionstring
idinteger
namerequiredstring
projectrequiredstring
statestringopen | closed
testsstring[]Test case keys, in order (replaces).
versionstringFix version this plan tests.

Output object

can_editboolean
countsobjectCounts per status (todo includes never run).
created_atinteger
created_bystring
descriptionstring
idinteger
namestring
projectstring
statestring
testsobject[]Its cases with their latest result in this plan.
versionstring
curl https://work.nightroll.app/api/v1/tests.plan_save \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"name":"<name>","project":"<project>"}'
tests.plansread

REST POST /api/v1/tests.plans · MCP tool tests_plans · scopes issues:read

Input

folderstringOnly this folder (and below).
projectrequiredstring

Output object[]

can_editboolean
countsobjectCounts per status (todo includes never run).
created_atinteger
created_bystring
descriptionstring
idinteger
namestring
projectstring
statestring
testsobject[]Its cases with their latest result in this plan.
versionstring
curl https://work.nightroll.app/api/v1/tests.plans \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"project":"<project>"}'
tests.runsread

REST POST /api/v1/tests.runs · MCP tool tests_runs · scopes issues:read

Input

keyrequiredstring

Output object[]

commentstring
defectsstring[]Issue keys of the bugs it found.
duration_msinteger
environmentstring
executed_atinteger
executed_bystring
idinteger
planinteger
sourcestringmanual | junit | xunit | cucumber
statusstring
stepsobject[]
teststring
curl https://work.nightroll.app/api/v1/tests.runs \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"key":"<key>"}'

time

time.account_deletedestructive

REST POST /api/v1/time.account_delete · MCP tool time_account_delete · scopes admin

Input

idrequiredinteger

Output object

deletedintegerRows removed or moved (a project counts itself plus its issues; an option counts the issues it moved).
curl https://work.nightroll.app/api/v1/time.account_delete \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
time.account_savewrite

REST POST /api/v1/time.account_save · MCP tool time_account_save · scopes admin

Input

activeboolean
customerstring
idinteger
keyrequiredstring
namerequiredstring
ratenumber

Output object[]

activeboolean
customerstring
idinteger
keystring
namestring
ratenumberPer hour, in the org's currency (approvers and admins only).
curl https://work.nightroll.app/api/v1/time.account_save \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"key":"<key>","name":"<name>"}'
time.accountsread

REST POST /api/v1/time.accounts · MCP tool time_accounts · scopes issues:read

Input

None: send {}.

Output object[]

activeboolean
customerstring
idinteger
keystring
namestring
ratenumberPer hour, in the org's currency (approvers and admins only).
curl https://work.nightroll.app/api/v1/time.accounts \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
time.estimatewrite

REST POST /api/v1/time.estimate · MCP tool time_estimate · scopes issues:write

Input

keyrequiredstring
originalstringDurations; "" clears.
remainingstring

Output object

can_logboolean
keystring
logsobject[]
originalinteger
remainingintegerLeft to do: set by hand, else original − spent (never below 0).
spentintegerSeconds logged on the issue (and, in `with_children`, on everything under it).
timer_started_atintegerYour timer, when it's running on this issue: when it started.
with_childreninteger
curl https://work.nightroll.app/api/v1/time.estimate \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"key":"<key>"}'
time.issueread

REST POST /api/v1/time.issue · MCP tool time_issue · scopes issues:read

Input

keyrequiredstring

Output object

can_logboolean
keystring
logsobject[]
originalinteger
remainingintegerLeft to do: set by hand, else original − spent (never below 0).
spentintegerSeconds logged on the issue (and, in `with_children`, on everything under it).
timer_started_atintegerYour timer, when it's running on this issue: when it started.
with_childreninteger
curl https://work.nightroll.app/api/v1/time.issue \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"key":"<key>"}'
time.logwrite

REST POST /api/v1/time.log · MCP tool time_log · scopes issues:write

Input

accountinteger
billableboolean
daystringYYYY-MM-DD; default today.
durationrequiredstring"1h 30m", "45m", "1.5h", "2d", "1w" (a bare number = hours).
keyrequiredstring
notestring
whostringMember id (approvers and admins only); default you.

Output object

can_logboolean
keystring
logsobject[]
originalinteger
remainingintegerLeft to do: set by hand, else original − spent (never below 0).
spentintegerSeconds logged on the issue (and, in `with_children`, on everything under it).
timer_started_atintegerYour timer, when it's running on this issue: when it started.
with_childreninteger
curl https://work.nightroll.app/api/v1/time.log \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"duration":"<duration>","key":"<key>"}'
time.log_deletedestructive

REST POST /api/v1/time.log_delete · MCP tool time_log_delete · scopes issues:write

Input

idrequiredinteger

Output object

deletedintegerRows removed or moved (a project counts itself plus its issues; an option counts the issues it moved).
curl https://work.nightroll.app/api/v1/time.log_delete \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
time.log_updatewrite

REST POST /api/v1/time.log_update · MCP tool time_log_update · scopes issues:write

Input

accountinteger0 clears.
billableboolean
daystring
durationstring
idrequiredinteger
notestring

Output object

can_logboolean
keystring
logsobject[]
originalinteger
remainingintegerLeft to do: set by hand, else original − spent (never below 0).
spentintegerSeconds logged on the issue (and, in `with_children`, on everything under it).
timer_started_atintegerYour timer, when it's running on this issue: when it started.
with_childreninteger
curl https://work.nightroll.app/api/v1/time.log_update \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
time.pendingread

REST POST /api/v1/time.pending · MCP tool time_pending · scopes issues:read

Input

None: send {}.

Output object[]

secondsinteger
updated_atinteger
weekstring
whostring
curl https://work.nightroll.app/api/v1/time.pending \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
time.reportread

REST POST /api/v1/time.report · MCP tool time_report · scopes issues:read

Input

fromrequiredstringYYYY-MM-DD, inclusive.
group_byrequiredstringwho | issue | project | epic | account | day
torequiredstring
tqlstringOnly work on issues matching this TQL.
whostringOnly this person.

Output object

amountnumber
billable_secondsinteger
currencystring
rowsobject[]
secondsinteger
curl https://work.nightroll.app/api/v1/time.report \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"from":"<from>","group_by":"<group_by>","to":"<to>"}'
time.reviewwrite

REST POST /api/v1/time.review · MCP tool time_review · scopes issues:write

Input

actionrequiredstringapprove | reject | reopen
notestring
weekrequiredstring
whorequiredstring

Output object

can_editboolean
can_reviewboolean
daysstring[]
hours_per_daynumberHours a working day (setting).
notestring
reviewerstring
rowsobject[]
statusstringopen | submitted | approved | rejected
totalinteger
totalsinteger[]Per day, and the week.
weekstringMonday.
whostring
curl https://work.nightroll.app/api/v1/time.review \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"action":"<action>","week":"<week>","who":"<who>"}'
time.settingsread

REST POST /api/v1/time.settings · MCP tool time_settings · scopes issues:read

Input

None: send {}.

Output object

approverbooleanThe caller approves timesheets.
approversstring[]Who approves timesheets and sees rates: `everyone`, `admins`, `team:<id>`, member ids.
can_adminboolean
currencystring
hours_per_daynumber
ratesobject[]Per-person rates (override the account's).
curl https://work.nightroll.app/api/v1/time.settings \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
time.settings_savewrite

REST POST /api/v1/time.settings_save · MCP tool time_settings_save · scopes admin

Input

approversrequiredstring[]Who approves timesheets and sees rates: `everyone`, `admins`, `team:<id>`, member ids.
currencyrequiredstring
hours_per_dayrequirednumber
ratesrequiredobject[]Per-person rates (override the account's).

Output object

approverbooleanThe caller approves timesheets.
approversstring[]Who approves timesheets and sees rates: `everyone`, `admins`, `team:<id>`, member ids.
can_adminboolean
currencystring
hours_per_daynumber
ratesobject[]Per-person rates (override the account's).
curl https://work.nightroll.app/api/v1/time.settings_save \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"approvers":[],"currency":"<currency>","hours_per_day":1,"rates":[]}'
time.submitwrite

REST POST /api/v1/time.submit · MCP tool time_submit · scopes issues:write

Input

weekrequiredstringAny day in the week.

Output object

can_editboolean
can_reviewboolean
daysstring[]
hours_per_daynumberHours a working day (setting).
notestring
reviewerstring
rowsobject[]
statusstringopen | submitted | approved | rejected
totalinteger
totalsinteger[]Per day, and the week.
weekstringMonday.
whostring
curl https://work.nightroll.app/api/v1/time.submit \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"week":"<week>"}'
time.timerread

REST POST /api/v1/time.timer · MCP tool time_timer · scopes issues:read

Input

None: send {}.

Output object

keystring
notestring
started_atinteger
titlestring
curl https://work.nightroll.app/api/v1/time.timer \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
time.timer_startwrite

REST POST /api/v1/time.timer_start · MCP tool time_timer_start · scopes issues:write

Input

keyrequiredstring
notestring

Output object

keystring
notestring
started_atinteger
titlestring
curl https://work.nightroll.app/api/v1/time.timer_start \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"key":"<key>"}'
time.timer_stopwrite

REST POST /api/v1/time.timer_stop · MCP tool time_timer_stop · scopes issues:write

Input

discardbooleanThrow the timer away instead of logging it.
notestringReplaces the note given at start.

Output object

keystring
notestring
started_atinteger
titlestring
curl https://work.nightroll.app/api/v1/time.timer_stop \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
time.timesheetread

REST POST /api/v1/time.timesheet · MCP tool time_timesheet · scopes issues:read

Input

weekstringAny day in the week; default this week.
whostringMember id; default you (approvers can see anyone's).

Output object

can_editboolean
can_reviewboolean
daysstring[]
hours_per_daynumberHours a working day (setting).
notestring
reviewerstring
rowsobject[]
statusstringopen | submitted | approved | rejected
totalinteger
totalsinteger[]Per day, and the week.
weekstringMonday.
whostring
curl https://work.nightroll.app/api/v1/time.timesheet \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'

usage

usage.getread

REST POST /api/v1/usage.get · MCP tool usage_get · scopes usage:read

Input

None: send {}.

Output object

currentobject[]Every metric this month, with the plan's limit (null = none).
historyobject[]The last six months, newest first.
planstringfree | paid.
curl https://work.nightroll.app/api/v1/usage.get \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
usage.record_hourwrite

REST POST /api/v1/usage.record_hour · MCP tool usage_record_hour · scopes system

Input

cpu_msrequiredinteger
hourrequiredintegerUnix time / 3600.
messagesrequiredinteger
sockets_peakrequiredinteger
storage_bytesrequiredinteger

Output any

curl https://work.nightroll.app/api/v1/usage.record_hour \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"cpu_ms":1,"hour":1,"messages":1,"sockets_peak":1,"storage_bytes":1}'
usage.resourcesread

REST POST /api/v1/usage.resources · MCP tool usage_resources · scopes usage:read

Input

None: send {}.

Output object

dayobjectThe last 24 hours.
last_monthobjectLast month (UTC), for invoices.
monthobjectThis month (UTC).
curl https://work.nightroll.app/api/v1/usage.resources \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'

webhooks

webhooks.attemptwrite

REST POST /api/v1/webhooks.attempt · MCP tool webhooks_attempt · scopes admin

Input

idrequiredinteger

Output object

bodystring
eventstring
idinteger
ownerstringA member's subscription: send only if they can see `subject` (checked by the cell as them).
secretstring
subjectstring
urlstring
curl https://work.nightroll.app/api/v1/webhooks.attempt \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
webhooks.deletedestructive

REST POST /api/v1/webhooks.delete · MCP tool webhooks_delete · scopes admin

Input

idrequiredinteger

Output object

idinteger
curl https://work.nightroll.app/api/v1/webhooks.delete \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
webhooks.deliverieswrite

REST POST /api/v1/webhooks.deliveries · MCP tool webhooks_deliveries · scopes admin

Input

hookintegerOne webhook's deliveries; omit for all (including automation web requests).

Output object[]

attemptsinteger
bodystringThe JSON sent (CloudEvents 1.0).
created_atinteger
done_atinteger
eventstring
hookinteger
idinteger
last_codeinteger
last_errorstring
next_atinteger
statestringpending | ok | failed
urlstring
curl https://work.nightroll.app/api/v1/webhooks.deliveries \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
webhooks.eventsread

REST POST /api/v1/webhooks.events · MCP tool webhooks_events · scopes webhooks:read

Input

None: send {}.

Output object[]

kindstringe.g. issue.created
labelstring
subjectstringWhat it is about: issue, page, …
curl https://work.nightroll.app/api/v1/webhooks.events \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
webhooks.listwrite

REST POST /api/v1/webhooks.list · MCP tool webhooks_list · scopes admin

Input

None: send {}.

Output object[]

activeboolean
appstringWhat made it: zapier | n8n | make | other ("" for admin webhooks).
created_atinteger
created_bystring
eventsstring[]Event kinds, e.g. "issue.created", "issue.*", or "*" for everything.
idinteger
namestring
ownerstringThe member whose subscription this is (it sends only what they can see); null = an org-wide admin webhook.
recent_failuresintegerDeliveries that ended in failure in the last 7 days.
secretstringShared secret: each request carries `X-Work-Signature: sha256=<hex HMAC-SHA256(secret, body)>`.
urlstring
curl https://work.nightroll.app/api/v1/webhooks.list \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
webhooks.redeliverwrite

REST POST /api/v1/webhooks.redeliver · MCP tool webhooks_redeliver · scopes admin

Input

idrequiredinteger

Output object

idinteger
curl https://work.nightroll.app/api/v1/webhooks.redeliver \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
webhooks.resultwrite

REST POST /api/v1/webhooks.result · MCP tool webhooks_result · scopes admin

Input

codeintegerHTTP status, if a response came back.
errorstringTransport error, if any.
idrequiredinteger
lastbooleanNo more attempts follow: a failure is final.
owner_gonebooleanThe subscriber left the org: the subscription is switched off too.
skippedbooleanNot sent: the subscriber can't see the event (the delivery is dropped).

Output object

okboolean2xx came back.
curl https://work.nightroll.app/api/v1/webhooks.result \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
webhooks.savewrite

REST POST /api/v1/webhooks.save · MCP tool webhooks_save · scopes admin

Input

activeboolean
eventsstring[]Event kinds ("issue.created", "issue.*", "*").
idintegerOmit to create.
namestring
rotate_secretbooleantrue makes a new secret.
urlstring

Output object

activeboolean
appstringWhat made it: zapier | n8n | make | other ("" for admin webhooks).
created_atinteger
created_bystring
eventsstring[]Event kinds, e.g. "issue.created", "issue.*", or "*" for everything.
idinteger
namestring
ownerstringThe member whose subscription this is (it sends only what they can see); null = an org-wide admin webhook.
recent_failuresintegerDeliveries that ended in failure in the last 7 days.
secretstringShared secret: each request carries `X-Work-Signature: sha256=<hex HMAC-SHA256(secret, body)>`.
urlstring
curl https://work.nightroll.app/api/v1/webhooks.save \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
webhooks.sendwrite

REST POST /api/v1/webhooks.send · MCP tool webhooks_send · scopes webhooks:write

Input

bodyrequiredanyJSON body to POST.
eventstringEvent name for the X-Work-Event header and the log.
urlrequiredstring

Output object

idinteger
curl https://work.nightroll.app/api/v1/webhooks.send \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"body":"<body>","url":"<url>"}'
webhooks.subscribewrite

REST POST /api/v1/webhooks.subscribe · MCP tool webhooks_subscribe · scopes webhooks:write

Input

appstringzapier | n8n | make | other
eventsrequiredstring[]Event kinds ("issue.created", "issue.*", "*"); see `webhooks.events`.
namestring
urlrequiredstringWhere to POST events (Zapier's targetUrl, an n8n or Make webhook URL).

Output object

activeboolean
appstringWhat made it: zapier | n8n | make | other ("" for admin webhooks).
created_atinteger
created_bystring
eventsstring[]Event kinds, e.g. "issue.created", "issue.*", or "*" for everything.
idinteger
namestring
ownerstringThe member whose subscription this is (it sends only what they can see); null = an org-wide admin webhook.
recent_failuresintegerDeliveries that ended in failure in the last 7 days.
secretstringShared secret: each request carries `X-Work-Signature: sha256=<hex HMAC-SHA256(secret, body)>`.
urlstring
curl https://work.nightroll.app/api/v1/webhooks.subscribe \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"events":[],"url":"<url>"}'
webhooks.subscriptionsread

REST POST /api/v1/webhooks.subscriptions · MCP tool webhooks_subscriptions · scopes webhooks:read

Input

None: send {}.

Output object[]

activeboolean
appstringWhat made it: zapier | n8n | make | other ("" for admin webhooks).
created_atinteger
created_bystring
eventsstring[]Event kinds, e.g. "issue.created", "issue.*", or "*" for everything.
idinteger
namestring
ownerstringThe member whose subscription this is (it sends only what they can see); null = an org-wide admin webhook.
recent_failuresintegerDeliveries that ended in failure in the last 7 days.
secretstringShared secret: each request carries `X-Work-Signature: sha256=<hex HMAC-SHA256(secret, body)>`.
urlstring
curl https://work.nightroll.app/api/v1/webhooks.subscriptions \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{}'
webhooks.testwrite

REST POST /api/v1/webhooks.test · MCP tool webhooks_test · scopes admin

Input

idrequiredinteger

Output object

idinteger
curl https://work.nightroll.app/api/v1/webhooks.test \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
webhooks.unsubscribewrite

REST POST /api/v1/webhooks.unsubscribe · MCP tool webhooks_unsubscribe · scopes webhooks:write

Input

idrequiredinteger

Output object

idinteger
curl https://work.nightroll.app/api/v1/webhooks.unsubscribe \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"id":1}'
webhooks.visibleread

REST POST /api/v1/webhooks.visible · MCP tool webhooks_visible · scopes webhooks:read

Input

subjectrequiredstring

Output object

visibleboolean
curl https://work.nightroll.app/api/v1/webhooks.visible \
  -H "authorization: Bearer $WORK_TOKEN" \
  -d '{"subject":"<subject>"}'