Read project status

How to read open work, boards, personal queues, logged time versus estimates, and an overview snapshot for a project through the API and MCP.

Written for
integration-developer
Roles
Requires
API token with the read scope
Feature
projects

This recipe builds a status view of a project (open work, who has what, time spent against estimates) from read-only calls. All calls need a token with the read scope; the token sees what its owner sees.

1. Find the project

curl "https://saq.no/api/w/acme/projects" \
  -H "Authorization: Bearer saq_YOUR_TOKEN"

Each project summary has id, key, name, description, billingClient, collaboratingClients, billingMode (period or on_close), memberCount, openTickets, myRole, and archived. GET /api/w/acme/projects/website adds members (with identityId, name, email, role, categoryId) and the token's permissions on the project.

2. Open tickets

curl "https://saq.no/api/w/acme/tickets?projectId=01924c3e-0000-7000-8000-000000000004&stateCategory=open&limit=50" \
  -H "Authorization: Bearer saq_YOUR_TOKEN"

Page with cursor until nextCursor is null. Narrow further with stateIds, kindIds, assigneeId (none for unassigned), due=overdue, or q. Each summary carries estimateMinutes, dueDate, assignee, and state.category, which is enough for counts by state, by assignee, and overdue lists.

3. The board

curl "https://saq.no/api/w/acme/board?projectId=01924c3e-0000-7000-8000-000000000004" \
  -H "Authorization: Bearer saq_YOUR_TOKEN"

The response has one column per state: { "columns": [{ "state": {…}, "total": 12, "tickets": [...], "nextCursor": … }] }. total is the column's full count even when only the first tickets are included; cards are ordered by priority, then latest activity. Without projectId you get the workspace board. Column paging beyond the first page is browser-only, so use GET /tickets?projectId=…&stateIds=<state id> to walk a large column.

4. The owner's own queue

GET /api/w/acme/my returns assigned, reported, watching, and dueSoon for the token's owner. With an agent key this is the agent's queue, which is usually empty; use a personal token for a person's view.

5. Estimates versus spent time

Estimates live on leaf tickets; a parent's estimate is the sum of its children. Read a ticket page to get both:

curl "https://saq.no/api/w/acme/tickets/ACME-184" \
  -H "Authorization: Bearer saq_YOUR_TOKEN"

For a workspace user's token the page carries billing.estimateMinutes, billing.rollupEstimateMinutes (including visible descendants), and time with loggedMinutes, billableMinutes, and unbilledMinutes. Client users' tokens do not receive time or estimates.

For spent time across a date range, GET /api/w/acme/time?from=2026-09-01&to=2026-09-30 lists the owner's entries (an Owner or Admin token can add userId=<person id> for someone else; ticketId narrows to one ticket). Each entry has projectId, projectName, minutes, billable, and billed, so a per-project sum is a filter and an addition on your side.

The Reports page (minutes and money by person, project, ticket, client, period, category, or outcome) is browser-only; GET /reports is not open to API tokens. Money figures (rates, charged amounts) are only available there and on client timesheets.

6. One-call overview with MCP

The MCP tool get_context_pack returns, in one request, the owner's assigned tickets, overdue and due-soon tickets, blocked tickets with their blockers, stale tickets (14 days without activity), the current period's logged minutes against estimates, open deliverables with unbilled time, time bank balances, and recent GitHub links. Each section holds up to 25 items with a truncated flag; search_tickets with project, blocked: true, staleDays, or unbilledOnClose: true pages the rest. See Connect an MCP client.

Visibility reminders

  • Archived tickets are excluded unless you pass archived=true.
  • Tickets on projects the owner is not a member of are invisible; an agent account sees every project.
  • Time bank balances (get_bank_balances) need client-wide billing document access; project managers get per-project usage only.