Linear
Read issues with a GraphQL query. Personal keys omit the Bearer prefix.
What you can track
Issues created over time (count by createdAt) for one team. A snapshot of the issues this query returns can omit extract.date on the aggregate: that is one count on the fetch day, and it still is only the first page. The getting-started queries return issues { nodes { id title createdAt } }, which is a list you can count by createdAt.
Credential
A personal API key, or an OAuth token. Personal keys are sent as Authorization: <key> with no Bearer prefix. OAuth tokens use Authorization: Bearer <token>. The members-area guide matches the personal-key form.
Host: api.linear.app. Suggested name: LINEAR_KEY. Create the key under Settings → Account → Security & access. The docs say the same page. Read access is what the members-area guide asks you to pick; the getting-started page describes personal keys but does not name a “Read” checkbox. If the UI offers Read, use only that.
Where to get it
Linear GraphQL. Endpoint: POST https://api.linear.app/graphql.
tlly job
GraphQL POST with a stored secret is allowed when the body is a query and not a mutation. Keep the word mutation out of the body, including comments. The body is a string.
{"series":"issues_opened","cron":"0 7 * * 1","request":{"url":"https://api.linear.app/graphql","method":"POST","headers":{"Authorization":"{{secret:LINEAR_KEY}}","Content-Type":"application/json"},"body":"{\"query\":\"query { issues(first: 50) { nodes { createdAt } } }\"}"},"extract":{"format":"json","items":"data.issues.nodes","date":"createdAt","aggregate":"count"}}
first: 50 is one page. The docs use cursor pagination and say not to poll every issue. tlly will not follow Linear’s cursor. Say when the page is full.
Gotchas
- Archived issues are hidden unless the query asks for them (includeArchived).
- The docs say the API can rate-limit and do not give a number on this page. Weekly is enough for a count.
- GraphQL can return errors with HTTP 200. If test_job shows an errors array, fix the query before scheduling.
- Team id is a UUID (command menu → Copy model UUID), not the issue key like BLA-123, when you filter to a team. Filtering by team was not given a finished query here; add it only after the preview.
Alert ideas
Red when issues opened this week are far above the usual bar. Open bugs by priority only after a preview shows a priority field you can where.
Verification
Checked 2026-10-26: endpoint https://api.linear.app/graphql, personal key header without Bearer, OAuth with Bearer, and the issues/nodes shape on the getting-started page. Numeric rate limit unverified. Priority field path unverified.