OlammaAPI

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

TaskA bug, a feature request or a project task, with an id like APP-12.
Product or projectWhere it belongs, by key. Project access decides who can see and change it.
Sub-taskA step under a task, one level deep: sub-tasks can’t have their own.
SprintA fixed stretch of work, if the product uses sprints. Assign a task with sprint: an id, current, next, or null for the backlog.
ActivityEvery change and note, with who made it and when. Get task returns it.

From a bug report to done

  1. Find your product keys. Every task belongs to a product or project, named by a three-letter key like APP, with surfaces like web. 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()
  2. 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()
  3. Move it along, with a note. Send the updatedAt you read as expectedVersion, 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()
  4. 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()
  5. Close it, sub-tasks and all. closeSubtasks closes 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

StatusMeans
openRecorded, not started. Lists show open tasks unless you ask otherwise.
in_progressSomeone is working on it.
to_testDone by the person working on it, waiting to be checked.
do_laterParked on purpose.
doneFinished.
wont_doClosed 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.