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: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.
OAuth Applications,Organization InvitesandAudit Entriesreturn 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 rowsIntegrationsandWebhookscome back empty or partial- Seat and plan data on
Organizationis present but the surrounding governance picture is not
Step 1: Create the Personal API key
- Sign in to Linear as a Workspace Admin (see the callout above — this is not optional)
- Verify your role: Settings → Members. Your row must read Admin. If it reads Member or Guest, stop and use the workaround above.
- Go to Settings → Security & access → Personal API keys (or open linear.app/settings/account/security)
- Click New API key, give it a label such as
ConfigView - 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 noBearerprefix. Linear’s personal API keys go in theAuthorizationheader withoutBearer— only OAuth access tokens use that prefix. A key stored asBearer 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
- Go to your ConfigView dashboard:
https://{companyname}.configview.com/admin/secret/ - Click Add Secret
- Secret name:
LINEAR_API_KEY - Secret value: Paste the
lin_api_...key from Step 1 - Click Save
Step 3: Enable the Linear scripts
- Go to:
https://{companyname}.configview.com/admin/cron/ - You should see linear in the list of available apps
- 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 withrun_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:
LINEAR_API_KEYretrievable from Secret Manager — and not stored with aBearerprefixviewer— names the identity behind the key and whether it is an adminorganization— workspace name, user count, plan and SSO postureusers— the core read path- 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
- Rate-limit headroom — remaining requests and complexity points for the hour
skip. That is the design: a skip means “not granted here”, a fail means “broken”.