Skip to main content
ConfigView pulls Linear data through one Personal API key. The key inherits the permissions of the user who created it, so the inventory follows that user’s access — not the workspace as a whole. You will end up with 1 secret in ConfigView (LINEAR_API_KEY) when setup is complete.

⚠️ Required: the key must be created by a Workspace Admin

Linear’s Personal API key carries the creating user’s permissions. ConfigView requires the key to come from a Workspace Admin — not a regular member, and not a guest. With a member-level key:
  • OAuth Applications, Organization Invites and Audit Entries return authorization errors and are recorded as empty
  • Private teams the member cannot see are missing from Teams, and every table derived from them is short by that team’s rows
  • Integrations and Webhooks come back empty or partial
  • Seat and plan data on Organization is present but the surrounding governance picture is not
None of this raises an error — ConfigView records a gated capability as an empty snapshot, exactly as it does for a workspace on a plan that never had the feature. That is the right behaviour for a mixed estate, but it means a member-tier key produces a quietly incomplete inventory. If no admin is available, ask the customer to (a) elevate an existing user temporarily, or (b) create a dedicated service user, promote it to Admin, then create the key from that account.

Step 1: Create the Personal API key

  1. Sign in to Linear as a Workspace Admin (see the callout above — this is not optional)
  2. Verify your role: SettingsMembers. Your row must read Admin. If it reads Member or Guest, stop and use the workaround above.
  3. Go to SettingsSecurity & accessPersonal API keys (or open linear.app/settings/account/security)
  4. Click New API key, give it a label such as ConfigView
  5. Copy the key (starts with lin_api_). Linear shows it once — if you lose it you must create a new one.
Store it bare. Copy the key on its own, with no Bearer prefix. Linear’s personal API keys go in the Authorization header without Bearer — only OAuth access tokens use that prefix. A key stored as Bearer lin_api_... fails with an HTTP 400 that reads like a malformed query. The health check detects this specific mistake and names it.
OAuth alternative. Linear also supports OAuth 2.0 for multi-tenant apps. ConfigView is single-tenant per satellite, so the Personal API key is the right choice — simpler, and it gets the larger complexity budget (3,000,000 points/hour against an OAuth app’s 2,000,000).

Step 2: Add the secret to ConfigView

  1. Go to your ConfigView dashboard: https://{companyname}.configview.com/admin/secret/
  2. Click Add Secret
  3. Secret name: LINEAR_API_KEY
  4. Secret value: Paste the lin_api_... key from Step 1
  5. Click Save

Step 3: Enable the Linear scripts

  1. Go to: https://{companyname}.configview.com/admin/cron/
  2. You should see linear in the list of available apps
  3. Enable the scripts you want. No script depends on another — Linear serves one GraphQL endpoint and every collector queries it directly, so they can be enabled in any order and run in parallel.

Identity & licensing

Security & governance

Work structure

Workflow configuration

Work items


Rate limits and collection caps

Linear meters two budgets per API key, and either can throttle a run: Complexity is the limit that actually bites. It scales with page size × fields × nesting, so the collectors use different page sizes rather than one folder-wide constant — 50 for wide types like issues, 100–250 for narrow configuration tables. ConfigView paces requests well under the ceiling and reads the live X-RateLimit-Complexity-Remaining header on every response, pausing until the window resets when the workspace is close to exhausting it. Three collectors are deliberately capped, because the underlying data is unbounded: When a cap is reached the run log prints an explicit TRUNCATED warning naming the collector — a partial snapshot is never reported as if it were the whole workspace. Raise the limit in tools/linear_specs.py (max_pages) and regenerate if a customer needs the full history. Project Members has a different kind of cap. Linear serves a project’s member list as a nested connection, which has no cursor of its own, so only the first 100 members per project are returned. The collector prints a warning naming any project that hits that ceiling.

What gets collected

30 collectors, one table each. Every table is a per-run snapshot stamped with run_at, and each collector prunes older snapshots after a successful insert — so query the latest with:

What is deliberately not collected

ConfigView reads inventory, not credentials. These fields exist in Linear’s API and are left out on purpose: Attachment URLs are collected, and for uploaded files these can be signed object-store URLs. Treat linear_attachments with the same care as a storage-bucket listing.

Verifying the setup

Run the health check from /admin/cron/. It probes, in order:
  1. LINEAR_API_KEY retrievable from Secret Manager — and not stored with a Bearer prefix
  2. viewer — names the identity behind the key and whether it is an admin
  3. organization — workspace name, user count, plan and SSO posture
  4. users — the core read path
  5. Teams, Projects, Issues, Integrations, Webhooks, OAuth applications, Organization invites, Audit log, Initiatives — each reported as ok or skip, never as a failure when the plan or key scope simply does not grant it
  6. Rate-limit headroom — remaining requests and complexity points for the hour
A workspace on the Free plan with a member-level key should still show overall: ok, with several checks marked skip. That is the design: a skip means “not granted here”, a fail means “broken”.

Troubleshooting