204 lines
4.3 KiB
Markdown
204 lines
4.3 KiB
Markdown
# Linear Routing Reference
|
|
|
|
**App name:** `linear`
|
|
**Base URL proxied:** `api.linear.app`
|
|
|
|
## API Type
|
|
|
|
Linear uses a GraphQL API exclusively. All requests are POST requests to the `/graphql` endpoint.
|
|
|
|
## API Path Pattern
|
|
|
|
```
|
|
/linear/graphql
|
|
```
|
|
|
|
All operations use POST with a JSON body containing the `query` field.
|
|
|
|
## Common Operations
|
|
|
|
### Get Current User (Viewer)
|
|
```bash
|
|
POST /linear/graphql
|
|
Content-Type: application/json
|
|
|
|
{
|
|
"query": "{ viewer { id name email } }"
|
|
}
|
|
```
|
|
|
|
### Get Organization
|
|
```bash
|
|
POST /linear/graphql
|
|
Content-Type: application/json
|
|
|
|
{
|
|
"query": "{ organization { id name urlKey } }"
|
|
}
|
|
```
|
|
|
|
### List Teams
|
|
```bash
|
|
POST /linear/graphql
|
|
Content-Type: application/json
|
|
|
|
{
|
|
"query": "{ teams { nodes { id name key } } }"
|
|
}
|
|
```
|
|
|
|
### List Issues
|
|
```bash
|
|
POST /linear/graphql
|
|
Content-Type: application/json
|
|
|
|
{
|
|
"query": "{ issues(first: 20) { nodes { id identifier title state { name } priority } pageInfo { hasNextPage endCursor } } }"
|
|
}
|
|
```
|
|
|
|
### Get Issue by Identifier
|
|
```bash
|
|
POST /linear/graphql
|
|
Content-Type: application/json
|
|
|
|
{
|
|
"query": "{ issue(id: \"MTN-527\") { id identifier title description state { name } priority assignee { name } team { key } createdAt } }"
|
|
}
|
|
```
|
|
|
|
### Filter Issues by State
|
|
```bash
|
|
POST /linear/graphql
|
|
Content-Type: application/json
|
|
|
|
{
|
|
"query": "{ issues(first: 20, filter: { state: { type: { eq: \"started\" } } }) { nodes { id identifier title state { name } } } }"
|
|
}
|
|
```
|
|
|
|
### Search Issues
|
|
```bash
|
|
POST /linear/graphql
|
|
Content-Type: application/json
|
|
|
|
{
|
|
"query": "{ searchIssues(first: 20, term: \"search term\") { nodes { id identifier title } } }"
|
|
}
|
|
```
|
|
|
|
### Create Issue
|
|
```bash
|
|
POST /linear/graphql
|
|
Content-Type: application/json
|
|
|
|
{
|
|
"query": "mutation { issueCreate(input: { teamId: \"TEAM_ID\", title: \"Issue title\", description: \"Description\" }) { success issue { id identifier title } } }"
|
|
}
|
|
```
|
|
|
|
### Update Issue
|
|
```bash
|
|
POST /linear/graphql
|
|
Content-Type: application/json
|
|
|
|
{
|
|
"query": "mutation { issueUpdate(id: \"ISSUE_ID\", input: { title: \"Updated title\", priority: 2 }) { success issue { id identifier title priority } } }"
|
|
}
|
|
```
|
|
|
|
### Create Comment
|
|
```bash
|
|
POST /linear/graphql
|
|
Content-Type: application/json
|
|
|
|
{
|
|
"query": "mutation { commentCreate(input: { issueId: \"ISSUE_ID\", body: \"Comment text\" }) { success comment { id body } } }"
|
|
}
|
|
```
|
|
|
|
### List Projects
|
|
```bash
|
|
POST /linear/graphql
|
|
Content-Type: application/json
|
|
|
|
{
|
|
"query": "{ projects(first: 20) { nodes { id name state createdAt } } }"
|
|
}
|
|
```
|
|
|
|
### List Labels
|
|
```bash
|
|
POST /linear/graphql
|
|
Content-Type: application/json
|
|
|
|
{
|
|
"query": "{ issueLabels(first: 50) { nodes { id name color } } }"
|
|
}
|
|
```
|
|
|
|
### List Workflow States
|
|
```bash
|
|
POST /linear/graphql
|
|
Content-Type: application/json
|
|
|
|
{
|
|
"query": "{ workflowStates(first: 50) { nodes { id name type team { key } } } }"
|
|
}
|
|
```
|
|
|
|
### List Users
|
|
```bash
|
|
POST /linear/graphql
|
|
Content-Type: application/json
|
|
|
|
{
|
|
"query": "{ users(first: 50) { nodes { id name email active } } }"
|
|
}
|
|
```
|
|
|
|
### List Cycles
|
|
```bash
|
|
POST /linear/graphql
|
|
Content-Type: application/json
|
|
|
|
{
|
|
"query": "{ cycles(first: 20) { nodes { id name number startsAt endsAt } } }"
|
|
}
|
|
```
|
|
|
|
## Pagination
|
|
|
|
Linear uses Relay-style cursor-based pagination:
|
|
|
|
```bash
|
|
# First page
|
|
POST /linear/graphql
|
|
{
|
|
"query": "{ issues(first: 20) { nodes { id identifier title } pageInfo { hasNextPage endCursor } } }"
|
|
}
|
|
|
|
# Next page
|
|
POST /linear/graphql
|
|
{
|
|
"query": "{ issues(first: 20, after: \"CURSOR_VALUE\") { nodes { id identifier title } pageInfo { hasNextPage endCursor } } }"
|
|
}
|
|
```
|
|
|
|
## Notes
|
|
|
|
- Linear uses GraphQL exclusively (no REST API)
|
|
- Issue identifiers (e.g., `MTN-527`) can be used in place of UUIDs for the `id` parameter
|
|
- Priority values: 0 = No priority, 1 = Urgent, 2 = High, 3 = Medium, 4 = Low
|
|
- Workflow state types: `backlog`, `unstarted`, `started`, `completed`, `canceled`
|
|
- Some mutations (delete, create labels/projects) may require additional OAuth scopes
|
|
- Use `searchIssues(term: "...")` for full-text search
|
|
- Filter operators: `eq`, `neq`, `in`, `nin`, `containsIgnoreCase`, etc.
|
|
|
|
## Resources
|
|
|
|
- [Linear API Overview](https://linear.app/developers)
|
|
- [Linear GraphQL Getting Started](https://linear.app/developers/graphql)
|
|
- [Linear GraphQL Schema (Apollo Studio)](https://studio.apollographql.com/public/Linear-API/schema/reference?variant=current)
|
|
- [Linear API and Webhooks](https://linear.app/docs/api-and-webhooks)
|