« tlly.dev

Playbooks · Integrations

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

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.