Linear API
Stateful Linear GraphQL API emulation with organizations, users, teams, workflow states, issues, comments, labels, projects, cycles, OAuth apps, tokens, webhooks, and basic agent sessions.
Start
npx emulate --service linearWhen Linear is the only enabled service, it starts on http://localhost:4000. When all services are started, it uses http://localhost:4012.
URL Mapping
| Real Linear URL | Emulator URL |
|-----------------|--------------|
| https://api.linear.app/graphql | $LINEAR_EMULATOR_URL/graphql |
| https://linear.app/oauth/authorize | $LINEAR_EMULATOR_URL/oauth/authorize |
| https://api.linear.app/oauth/token | $LINEAR_EMULATOR_URL/oauth/token |
| https://api.linear.app/oauth/revoke | $LINEAR_EMULATOR_URL/oauth/revoke |
GraphQL
POST /graphql- GraphQL endpoint for queries and mutationsGET /graphql- query-string GraphQL endpoint for tooling
Supported queries:
viewerorganizationusers,userteams,teamworkflowStates,workflowStateissues,issuecomments,commentissueLabels,issueLabelprojects,projectcycles,cyclewebhooks,webhookagentSessions,agentSession
Supported mutations:
issueCreate,issueUpdate,issueDelete,issueArchive,issueUnarchivecommentCreate,commentUpdate,commentDeleteissueLabelCreate,issueLabelUpdate,issueLabelDeleteissueAddLabel,issueRemoveLabelwebhookCreate,webhookDeleteagentSessionCreateOnIssue,agentSessionCreateOnComment,agentSessionUpdateagentActivityCreate
Connections use Relay-style cursors with nodes, edges, and pageInfo.
Auth
GraphQL accepts Authorization: Bearer <token> or a bare personal API key value. The default seeded token is lin_test_admin.
Scope checks are relaxed by default. Set linear.strict_scopes: true to require supported operation scopes such as read, write, issues:create, comments:create, and admin.
OAuth
GET /oauth/authorize- authorization endpoint with local user pickerPOST /oauth/authorize/callback- local callback used by the user pickerPOST /oauth/token- authorization code, refresh token, and client credentials grantsPOST /oauth/revoke- revoke access or refresh tokens
OAuth apps can use actor: user or actor: app. The configured actor is authoritative. User actor apps use authorization code flows. App actor apps use the app install flow and can request client credentials tokens.
Seed Config
linear:
organization:
name: Acme
url_key: acme
users:
- email: admin@example.com
name: Admin User
admin: true
- email: dev@example.com
name: Developer
teams:
- key: ENG
name: Engineering
issues:
- team: ENG
title: Fix local checkout test
state: Todo
assignee: dev@example.com
oauth_apps:
- client_id: lin_example_client_id
client_secret: example_client_secret
name: My Linear App
redirect_uris:
- http://localhost:3000/api/auth/callback/linear
scopes: [read, write, issues:create, comments:create]
tokens:
- token: lin_test_admin
user: admin@example.com
scopes: [read, write, issues:create, comments:create, admin]Webhooks
Create local webhook subscriptions through webhookCreate or seed config. Supported writes dispatch Linear-shaped payloads with these headers:
Linear-DeliveryLinear-EventLinear-Signature
Inspector
GET /- tabbed inspector for issues, teams, users, projects, agent sessions, OAuth apps, tokens, webhook subscriptions, and webhook deliveries
Current Limits
Full Linear schema coverage, exact production rate limiting, notification inbox behavior, rich document APIs, customer APIs, initiative APIs, exact search relevance, and full production agent behavior are not implemented.