Base URL
Conventions
- JSON request and response bodies.
snake_casefield names everywhere.- ISO 8601 strings for every date.
- Cursor pagination on every list endpoint - see Pagination.
- Bearer token auth on every endpoint - see Authentication.
- Stable error envelope with codes, messages, and a
request_id- see Errors. X-Request-Idon every response (success or failure) - quote it in support tickets.
What’s in the box
| Area | Highlights |
|---|---|
| Threads | List, create, update; status (open / snoozed / done); messages, internal comments |
| Contacts | CRUD, lookup by id or by email |
| Companies | CRUD, lookup by external_id or domain |
| Projects | CRUD; list available statuses |
| Issues | CRUD; list Linear workflow states |
| Tags | CRUD on tags and tag groups |
| Changelogs | CRUD and tags |
| Docs | Help-center articles and groups |
| Portal | Read the public roadmap and a contact’s portal view |
| Members | List members, invite, change role, remove, manage pending invites |
| Files | Multipart upload to the CDN for attachments and inline media |
| Webhooks | Subscribe to resource events with HMAC-signed deliveries (configured in the dashboard) |
Verify your setup
A single call confirms your key works and tells you which workspace and scopes it has:linear_team_ids is empty and default_linear_team_id is null when Linear isn’t connected.
If that returns a 401, your key is missing or malformed. If it returns 410 unsupported_key_version, you’ve passed a v1 key - mint a v2 one in Settings → Integrations → API.
Where to go next
- Authentication - minting keys, scopes, the bearer header.
- Errors - every error code and what to do about it.
- Rate limits - limits, headers, and how to pace yourself.
- Pagination - the cursor pattern every list uses.
- Webhooks - subscribe to events instead of polling.