Skip to Content
APITickets
last verified · 2026-07-16

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.

GET/api/v1/tickets

List tickets for your project, newest first, paginated by cursor.

NameTypeRequiredDefaultDescription
statusstringNoFilter by ticket status.
prioritystringNoFilter by priority.
cursorstringNoOpaque cursor from a previous response's next_cursor.
limitintegerNo50Max rows to return.
curl
curl "https://lumis.work/api/v1/tickets?status=open&limit=20" \ -H "Authorization: Bearer $LUMIS_MCP_TOKEN"
TypeScript
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();
Python
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 }
POST/api/v1/tickets

Create a ticket in your project.

NameTypeRequiredDescription
titlestringYesTicket title (accepts name as an alias).
descriptionstringNoFree-text body.
prioritystringNoPriority label, e.g. P0–P3.
effortstringNoSize/effort label.
typestringNoTicket type.
curl
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"}'
TypeScript
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();
Python
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.

GET/api/v1/tickets/:id

Read a single ticket by id. Returns 404 if it doesn’t exist (or belongs to a project you can’t access).

PATCH/api/v1/tickets/:id

Update one or more fields on a ticket.

NameTypeRequiredDescription
titlestringNoNew title.
statusstringNoNew status. Invalid transitions return 409.
prioritystringNoNew priority.
bodystringNoNew body text.
frontmatterobjectNoMerged into the ticket's structured metadata.
curl
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"}'
TypeScript
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' }), });
Python
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.

DELETE/api/v1/tickets/:id

Delete a ticket. Returns { "version": "v1", "ok": true, "ticket": {...} } with the deleted row, or 404 if it doesn’t exist.