Working with Tasks
Tasks holds your team’s bugs, feature requests and project tasks. This guide records a bug, moves it through its statuses, breaks it into sub-tasks and closes it.
How it fits together
| Task | A bug, a feature request or a project task, with an id like APP-12. |
| Product or project | Where it belongs, by key. Project access decides who can see and change it. |
| Sub-task | A step under a task, one level deep: sub-tasks can’t have their own. |
| Sprint | A fixed stretch of work, if the product uses sprints. Assign a task with sprint: an id, current, next, or null for the backlog. |
| Activity | Every change and note, with who made it and when. Get task returns it. |
From a bug report to done
- Find your product keys. Every task belongs to a product or project, named by a three-letter key like
APP, with surfaces likeweb. Get workspace lists them.curl "https://api.olamma.sh/v1/w/your-workspace" \ -H "Authorization: Bearer $OLAMMA_KEY"const response = await fetch(`https://api.olamma.sh/v1/w/your-workspace`, { headers: { Authorization: `Bearer ${process.env.OLAMMA_KEY}`, }, }); const data = await response.json(); if (!response.ok) throw new Error(`${data.error.code}: ${data.error.message}`);import os import requests response = requests.get( "https://api.olamma.sh/v1/w/your-workspace", headers={"Authorization": f"Bearer {os.environ['OLAMMA_KEY']}"}, timeout=30, ) data = response.json() response.raise_for_status() - Record a bug. The key’s agent becomes its reporter.
curl -X POST "https://api.olamma.sh/v1/w/your-workspace/tasks" \ -H "Authorization: Bearer $OLAMMA_KEY" \ -H "Idempotency-Key: sentry-4821" \ -H "Content-Type: application/json" \ -d '{ "type": "bug", "product": "APP", "surface": "web", "title": "Checkout fails for saved cards", "description": "Steps: pay with a saved card.\nExpected: payment goes through.\nActual: error 500.", "priority": "high" }'const response = await fetch(`https://api.olamma.sh/v1/w/your-workspace/tasks`, { method: "POST", headers: { Authorization: `Bearer ${process.env.OLAMMA_KEY}`, "Idempotency-Key": "sentry-4821", "Content-Type": "application/json", }, body: JSON.stringify({ "type": "bug", "product": "APP", "surface": "web", "title": "Checkout fails for saved cards", "description": "Steps: pay with a saved card.\nExpected: payment goes through.\nActual: error 500.", "priority": "high" }), }); const data = await response.json(); if (!response.ok) throw new Error(`${data.error.code}: ${data.error.message}`);import os import requests response = requests.post( "https://api.olamma.sh/v1/w/your-workspace/tasks", headers={"Authorization": f"Bearer {os.environ['OLAMMA_KEY']}", "Idempotency-Key": "sentry-4821"}, json={ "type": "bug", "product": "APP", "surface": "web", "title": "Checkout fails for saved cards", "description": "Steps: pay with a saved card.\nExpected: payment goes through.\nActual: error 500.", "priority": "high" }, timeout=30, ) data = response.json() response.raise_for_status() - Move it along, with a note. Send the
updatedAtyou read asexpectedVersion, so you never overwrite a change someone made meanwhile.curl -X PATCH "https://api.olamma.sh/v1/w/your-workspace/tasks/APP-12" \ -H "Authorization: Bearer $OLAMMA_KEY" \ -H "Idempotency-Key: app-12-start" \ -H "Content-Type: application/json" \ -d '{ "status": "in_progress", "note": "Reproduced on staging.", "expectedVersion": "2026-12-01T09:30:00.000Z" }'const response = await fetch(`https://api.olamma.sh/v1/w/your-workspace/tasks/APP-12`, { method: "PATCH", headers: { Authorization: `Bearer ${process.env.OLAMMA_KEY}`, "Idempotency-Key": "app-12-start", "Content-Type": "application/json", }, body: JSON.stringify({ "status": "in_progress", "note": "Reproduced on staging.", "expectedVersion": "2026-12-01T09:30:00.000Z" }), }); const data = await response.json(); if (!response.ok) throw new Error(`${data.error.code}: ${data.error.message}`);import os import requests response = requests.patch( "https://api.olamma.sh/v1/w/your-workspace/tasks/APP-12", headers={"Authorization": f"Bearer {os.environ['OLAMMA_KEY']}", "Idempotency-Key": "app-12-start"}, json={ "status": "in_progress", "note": "Reproduced on staging.", "expectedVersion": "2026-12-01T09:30:00.000Z" }, timeout=30, ) data = response.json() response.raise_for_status() - Break it down. Sub-tasks copy their parent’s product, surface, type, priority and assignee.
curl -X POST "https://api.olamma.sh/v1/w/your-workspace/tasks/APP-12/subtasks" \ -H "Authorization: Bearer $OLAMMA_KEY" \ -H "Idempotency-Key: app-12-breakdown" \ -H "Content-Type: application/json" \ -d '{ "titles": [ "Reproduce on staging", "Fix the card token refresh", "Add a regression test" ] }'const response = await fetch(`https://api.olamma.sh/v1/w/your-workspace/tasks/APP-12/subtasks`, { method: "POST", headers: { Authorization: `Bearer ${process.env.OLAMMA_KEY}`, "Idempotency-Key": "app-12-breakdown", "Content-Type": "application/json", }, body: JSON.stringify({ "titles": [ "Reproduce on staging", "Fix the card token refresh", "Add a regression test" ] }), }); const data = await response.json(); if (!response.ok) throw new Error(`${data.error.code}: ${data.error.message}`);import os import requests response = requests.post( "https://api.olamma.sh/v1/w/your-workspace/tasks/APP-12/subtasks", headers={"Authorization": f"Bearer {os.environ['OLAMMA_KEY']}", "Idempotency-Key": "app-12-breakdown"}, json={ "titles": [ "Reproduce on staging", "Fix the card token refresh", "Add a regression test" ] }, timeout=30, ) data = response.json() response.raise_for_status() - Close it, sub-tasks and all.
closeSubtaskscloses the unfinished sub-tasks in the same change.curl -X PATCH "https://api.olamma.sh/v1/w/your-workspace/tasks/APP-12" \ -H "Authorization: Bearer $OLAMMA_KEY" \ -H "Idempotency-Key: app-12-done" \ -H "Content-Type: application/json" \ -d '{ "status": "done", "closeSubtasks": "done", "note": "Fixed in release 2026.12.01." }'const response = await fetch(`https://api.olamma.sh/v1/w/your-workspace/tasks/APP-12`, { method: "PATCH", headers: { Authorization: `Bearer ${process.env.OLAMMA_KEY}`, "Idempotency-Key": "app-12-done", "Content-Type": "application/json", }, body: JSON.stringify({ "status": "done", "closeSubtasks": "done", "note": "Fixed in release 2026.12.01." }), }); const data = await response.json(); if (!response.ok) throw new Error(`${data.error.code}: ${data.error.message}`);import os import requests response = requests.patch( "https://api.olamma.sh/v1/w/your-workspace/tasks/APP-12", headers={"Authorization": f"Bearer {os.environ['OLAMMA_KEY']}", "Idempotency-Key": "app-12-done"}, json={ "status": "done", "closeSubtasks": "done", "note": "Fixed in release 2026.12.01." }, timeout=30, ) data = response.json() response.raise_for_status()
Statuses
| Status | Means |
|---|---|
open | Recorded, not started. Lists show open tasks unless you ask otherwise. |
in_progress | Someone is working on it. |
to_test | Done by the person working on it, waiting to be checked. |
do_later | Parked on purpose. |
done | Finished. |
wont_do | Closed without doing it. |
Starting a sub-task also starts its parent if the parent is still open. Finishing sub-tasks never closes the parent; that stays a decision for a person, or for closeSubtasks.
Finding tasks
List tasks shows open tasks, most recently updated first, with an exact total. Combine filters such as status, type, product, query, due=overdue or topLevel=true, and page with cursor.
curl -G "https://api.olamma.sh/v1/w/your-workspace/tasks" \
-H "Authorization: Bearer $OLAMMA_KEY" \
--data-urlencode 'status=active' \
--data-urlencode 'type=bug' \
--data-urlencode 'product=APP' \
--data-urlencode 'due=overdue'const response = await fetch(`https://api.olamma.sh/v1/w/your-workspace/tasks?${new URLSearchParams({"status":"active","type":"bug","product":"APP","due":"overdue"})}`, {
headers: {
Authorization: `Bearer ${process.env.OLAMMA_KEY}`,
},
});
const data = await response.json();
if (!response.ok) throw new Error(`${data.error.code}: ${data.error.message}`);import os
import requests
response = requests.get(
"https://api.olamma.sh/v1/w/your-workspace/tasks",
headers={"Authorization": f"Bearer {os.environ['OLAMMA_KEY']}"},
params={"status":"active","type":"bug","product":"APP","due":"overdue"},
timeout=30,
)
data = response.json()
response.raise_for_status()Good to know
- A task linked to an outside tracker, such as GitHub or Linear, may wait for a person to approve changes that would reach that tracker. You get
202; see Approvals. - Agents can’t set the fields Olamma uses to route bugs to its own automation.
Descriptions and notes can hold text from outside your team, such as a customer’s report. Answers list them under untrusted; see Untrusted text.