Tickets
A ticket is a unit of work in a project’s queue — the same record the board and dossier views render. Use this resource to file work from an external system, read status for a dashboard, or drive a ticket through its lifecycle from a script.
Creating or updating a ticket fires the matching ticket.created /
ticket.updated webhook event to any subscription listening
for it.
/api/v1/ticketsList tickets for your project, newest first, paginated by cursor.
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
status | string | No | — | Filter by ticket status. |
priority | string | No | — | Filter by priority. |
cursor | string | No | — | Opaque cursor from a previous response's next_cursor. |
limit | integer | No | 50 | Max rows to return. |
curl "https://lumis.work/api/v1/tickets?status=open&limit=20" \
-H "Authorization: Bearer $LUMIS_MCP_TOKEN"const res = await fetch('https://lumis.work/api/v1/tickets?status=open', {
headers: { authorization: `Bearer ${process.env.LUMIS_MCP_TOKEN}` },
});
const { tickets, next_cursor, has_more } = await res.json();import os, requests
res = requests.get(
"https://lumis.work/api/v1/tickets",
params={"status": "open"},
headers={"authorization": f"Bearer {os.environ['LUMIS_MCP_TOKEN']}"},
)
tickets = res.json()["tickets"]{
"version": "v1",
"tickets": [
{
"id": "b3f1...",
"project_key": "acme-co",
"venture_key": "acme-co",
"title": "Fix onboarding email link",
"status": "open",
"priority": "P2",
"body": "The invite link in the onboarding email 404s.",
"frontmatter": {},
"version": 1,
"synced_at": "2026-07-16T18:04:22.000Z"
}
],
"next_cursor": null,
"has_more": false
}/api/v1/ticketsCreate a ticket in your project.
| Name | Type | Required | Description |
|---|---|---|---|
title | string | Yes | Ticket title (accepts name as an alias). |
description | string | No | Free-text body. |
priority | string | No | Priority label, e.g. P0–P3. |
effort | string | No | Size/effort label. |
type | string | No | Ticket type. |
curl -X POST https://lumis.work/api/v1/tickets \
-H "Authorization: Bearer $LUMIS_MCP_TOKEN" \
-H "Content-Type: application/json" \
-d '{"title": "Fix onboarding email link", "priority": "P2"}'const res = await fetch('https://lumis.work/api/v1/tickets', {
method: 'POST',
headers: {
authorization: `Bearer ${process.env.LUMIS_MCP_TOKEN}`,
'content-type': 'application/json',
},
body: JSON.stringify({ title: 'Fix onboarding email link', priority: 'P2' }),
});
const { ticket } = await res.json();import os, requests
res = requests.post(
"https://lumis.work/api/v1/tickets",
headers={"authorization": f"Bearer {os.environ['LUMIS_MCP_TOKEN']}"},
json={"title": "Fix onboarding email link", "priority": "P2"},
)
ticket = res.json()["ticket"]{
"version": "v1",
"ticket": {
"id": "b3f1...",
"project_key": "acme-co",
"venture_key": "acme-co",
"title": "Fix onboarding email link",
"status": "open",
"priority": "P2",
"body": null,
"frontmatter": {},
"version": 1,
"synced_at": "2026-07-16T18:04:22.000Z"
}
}Returns 201 on success.
/api/v1/tickets/:idRead a single ticket by id. Returns 404 if it doesn’t exist (or belongs to a
project you can’t access).
/api/v1/tickets/:idUpdate one or more fields on a ticket.
| Name | Type | Required | Description |
|---|---|---|---|
title | string | No | New title. |
status | string | No | New status. Invalid transitions return 409. |
priority | string | No | New priority. |
body | string | No | New body text. |
frontmatter | object | No | Merged into the ticket's structured metadata. |
curl -X PATCH https://lumis.work/api/v1/tickets/b3f1... \
-H "Authorization: Bearer $LUMIS_MCP_TOKEN" \
-H "Content-Type: application/json" \
-d '{"status": "in_progress"}'await fetch(`https://lumis.work/api/v1/tickets/${id}`, {
method: 'PATCH',
headers: {
authorization: `Bearer ${process.env.LUMIS_MCP_TOKEN}`,
'content-type': 'application/json',
},
body: JSON.stringify({ status: 'in_progress' }),
});requests.patch(
f"https://lumis.work/api/v1/tickets/{id}",
headers={"authorization": f"Bearer {os.environ['LUMIS_MCP_TOKEN']}"},
json={"status": "in_progress"},
)A status that isn’t a valid transition from the ticket’s current status
returns 409 with { "error", "from", "to", "message" }; an unrecognized
status value returns 400. See Errors.
/api/v1/tickets/:idDelete a ticket. Returns { "version": "v1", "ok": true, "ticket": {...} }
with the deleted row, or 404 if it doesn’t exist.