PolderAPI

Backlog API

Activity

Read the workspace timeline and write a note onto it.

Base URLhttps://backlog.polder.work

The activity timeline merges what happened in a workspace into one stream, newest first: issue activity, project activity, comments, asset events and the notes people write to each other. It is the same feed as the Activity page in Backlog.

It has its own scopes, activity:read and activity:write, rather than a corner of issues:read: the feed is a readable record of who did what all week, not a view of the work. See Scopes.

Visibility follows your rights. Entries about issues in teams you cannot see are left out, and so are asset events for asset types you cannot see.

Read the timeline

GET/api/v1/workspaces/{workspace}/activityscope activity:read

One page of entries and a cursor for the next. Unlike the other collections this one is cursor-paged: new entries arrive at the top while you read, and an offset would shift under you. Pass meta.next_cursor back as cursor to get the next page; null means the end.

Query

Parameter Description
cursor The next_cursor of the previous page.
per_page Defaults to 50, at most 200.
kinds[] Only these kinds: issue_activity, project_activity, comment, note, asset_event.
teams[] Only entries about issues of these team ids. Projects, notes and asset events are left out when you filter on teams.
actors[] Only entries by these user ids.
date YYYY-MM-DD: one day, read in the workspace's time zone. Without it you get every day (unlike the page in the app, which opens on today). all is the same as leaving it out.

Filters are lenient: ids that are not numbers, unknown kinds and a malformed date are dropped rather than refused. Dropping every value of a filter means "no filter", so a nonsense filter returns more, not less.

curl "https://backlog.polder.work/api/v1/workspaces/7/activity?kinds[]=comment&kinds[]=note&per_page=20" \
  -H "Authorization: Bearer $POLDER_TOKEN"
{
  "data": [
    {
      "id": "comment-5521",
      "kind": "comment",
      "body": "<p>Looks good to me.</p>",
      "is_reply": false,
      "user": { "id": 5, "name": "Sanne", "email": "sanne@example.com", "isBot": false, "avatarUrl": null },
      "created_at": "2026-10-28T08:15:00+00:00",
      "subject": { "type": "issue", "identifier": "ENG-12", "title": "Printer is on fire", "url": "/issues/ENG-12" }
    }
  ],
  "meta": { "per_page": 20, "next_cursor": "…" }
}

There is no total or page: counting would be the most expensive query on the request.

Entries all have id (kind and row id, such as comment-5521), kind, user, created_at and subject. The rest depends on kind:

kind Extra fields subject
issue_activity type (what changed, for example triage_submitted), from, to, source (null, or mcp when an assistant did it) {type: "issue", identifier, title, url}
comment body (sanitised HTML), is_reply the issue
project_activity type {type: "project", title, color, url}
asset_event type (the asset event kind, such as issued), detail (who it was handed to, the new status, …) {type: "asset", identifier, title, color, url}
note note_id, body, source, edited_at, can_edit (true if you wrote it) null

url values are relative to the Backlog host. user is null for entries made by the system.

Write a note

POST/api/v1/workspaces/{workspace}/activity/notesscope activity:write

Puts a note on the timeline: "the customer called", "we agreed to push the release". It is the one entry that is not a by-product of doing something else. It goes through the same action as the app, so the HTML is sanitised. A body that is empty after sanitising (a lone <script>, for example) is 422 on body.

Field Type Required Description
body string yes Max 20 000 characters. Rich text as HTML; it is sanitised.
curl https://backlog.polder.work/api/v1/workspaces/7/activity/notes \
  -H "Authorization: Bearer $POLDER_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"body": "<p>Customer called: they want the export before Friday.</p>"}'

Answers 201 with the note. The note is shaped differently from a feed entry: it is the row you just made, not one of four kinds.

{
  "data": {
    "id": 77,
    "body": "<p>Customer called: they want the export before Friday.</p>",
    "source": null,
    "user": { "id": 5, "name": "Sanne", "email": "sanne@example.com", "isBot": false },
    "edited_at": null,
    "created_at": "2026-10-28T08:15:00+00:00"
  }
}

The API can write notes but not edit or delete them.

Assistants have list_activity and create_activity_note (MCP); they can also edit and delete notes, which this API cannot.