Client¶
LinearClient
¶
LinearClient(
api_key: str | None = None,
access_token: str | None = None,
*,
endpoint: str = DEFAULT_ENDPOINT,
timeout: float = 30.0,
http_client: Client | None = None,
)
Client for Linear's GraphQL API.
Authenticate with either a personal API key or an OAuth access token:
client = LinearClient(api_key="lin_api_...")
client = LinearClient(access_token="...") # OAuth 2.0 token
If neither argument is given, the LINEAR_API_KEY environment variable is
used. The client owns an httpx.Client and can be used as a context manager
to ensure it is closed.
Create a client.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
api_key
|
str | None
|
A Linear personal API key, sent verbatim in the
|
None
|
access_token
|
str | None
|
An OAuth 2.0 access token, sent as
|
None
|
endpoint
|
str
|
GraphQL endpoint URL. Defaults to the public Linear API. |
DEFAULT_ENDPOINT
|
timeout
|
float
|
Per-request timeout in seconds for the owned HTTP client. |
30.0
|
http_client
|
Client | None
|
An existing |
None
|
Raises:
| Type | Description |
|---|---|
ValueError
|
If both or neither credential is provided (and
|
Source code in src/linear_python_client/client.py
close
¶
execute
¶
Run a raw GraphQL query or mutation and return its data payload.
This is the escape hatch backing every convenience method; use it directly for any operation the typed methods do not cover.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
query
|
str
|
The GraphQL document to send. |
required |
variables
|
dict[str, Any] | None
|
Optional variables for the query. |
None
|
Returns:
| Type | Description |
|---|---|
dict[str, Any]
|
The |
Raises:
| Type | Description |
|---|---|
LinearAuthenticationError
|
The credentials were rejected. |
LinearRateLimitError
|
A rate limit was exceeded. |
LinearGraphQLError
|
The API returned one or more GraphQL errors. |
LinearNetworkError
|
The request never produced a usable response. |
Source code in src/linear_python_client/client.py
viewer
¶
viewer() -> ViewerResponse
user
¶
user(request: UserRequest) -> UserResponse
Fetch a single user by id.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
request
|
UserRequest
|
A |
required |
Returns:
| Type | Description |
|---|---|
UserResponse
|
A |
UserResponse
|
|
Source code in src/linear_python_client/client.py
users
¶
users(request: UsersRequest | None = None) -> UsersResponse
List users in the workspace.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
request
|
UsersRequest | None
|
A |
None
|
Returns:
| Type | Description |
|---|---|
UsersResponse
|
Source code in src/linear_python_client/client.py
team
¶
team(request: TeamRequest) -> TeamResponse
Fetch a single team by id.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
request
|
TeamRequest
|
A |
required |
Returns:
| Type | Description |
|---|---|
TeamResponse
|
A |
TeamResponse
|
|
Source code in src/linear_python_client/client.py
teams
¶
teams(request: TeamsRequest | None = None) -> TeamsResponse
List teams in the workspace.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
request
|
TeamsRequest | None
|
A |
None
|
Returns:
| Type | Description |
|---|---|
TeamsResponse
|
Source code in src/linear_python_client/client.py
issue
¶
issue(request: IssueRequest) -> IssueResponse
Fetch a single issue by id or human identifier.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
request
|
IssueRequest
|
An |
required |
Returns:
| Type | Description |
|---|---|
IssueResponse
|
An |
IssueResponse
|
is |
Source code in src/linear_python_client/client.py
issue_details
¶
issue_details(
request: IssueRequest,
) -> IssueDetailsResponse
Fetch a single issue with its full related data.
Returns the same core fields as issue
plus comments, attachments, project, cycle, parent, sub-issues,
subscribers, and relations.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
request
|
IssueRequest
|
An |
required |
Returns:
| Type | Description |
|---|---|
IssueDetailsResponse
|
|
IssueDetailsResponse
|
|
IssueDetailsResponse
|
|
Source code in src/linear_python_client/client.py
issues
¶
issues(
request: IssuesRequest | None = None,
) -> IssuesResponse
List issues, optionally filtered and ordered.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
request
|
IssuesRequest | None
|
An |
None
|
Returns:
| Type | Description |
|---|---|
IssuesResponse
|
An |
Source code in src/linear_python_client/client.py
create_issue
¶
create_issue(
request: IssueCreateRequest,
) -> CreateIssueResponse
Create an issue.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
request
|
IssueCreateRequest
|
required |
Returns:
| Type | Description |
|---|---|
CreateIssueResponse
|
|
CreateIssueResponse
|
exposing |
Source code in src/linear_python_client/client.py
update_issue
¶
update_issue(
request: IssueUpdateRequest,
) -> UpdateIssueResponse
Update an issue.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
request
|
IssueUpdateRequest
|
An |
required |
Returns:
| Type | Description |
|---|---|
UpdateIssueResponse
|
|
UpdateIssueResponse
|
exposing |
Raises:
| Type | Description |
|---|---|
ValueError
|
If no fields besides |
Source code in src/linear_python_client/client.py
archive_issue
¶
archive_issue(
request: IssueArchiveRequest,
) -> ArchiveIssueResponse
Archive an issue.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
request
|
IssueArchiveRequest
|
required |
Returns:
| Type | Description |
|---|---|
ArchiveIssueResponse
|
|
ArchiveIssueResponse
|
exposing |
Source code in src/linear_python_client/client.py
add_label
¶
add_label(
request: IssueAddLabelRequest,
) -> AddLabelResponse
Add a single label to an issue without disturbing its other labels.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
request
|
IssueAddLabelRequest
|
required |
Returns:
| Type | Description |
|---|---|
AddLabelResponse
|
An |
AddLabelResponse
|
|
Source code in src/linear_python_client/client.py
remove_label
¶
remove_label(
request: IssueRemoveLabelRequest,
) -> RemoveLabelResponse
Remove a single label from an issue without disturbing its other labels.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
request
|
IssueRemoveLabelRequest
|
required |
Returns:
| Type | Description |
|---|---|
RemoveLabelResponse
|
|
RemoveLabelResponse
|
exposing |
Source code in src/linear_python_client/client.py
set_issue_state
¶
set_issue_state(
request: IssueSetStateRequest,
) -> UpdateIssueResponse
Move an issue to a workflow state (status).
A focused wrapper over update_issue that sets only the state. Resolve a
state UUID by name with
find_workflow_state.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
request
|
IssueSetStateRequest
|
required |
Returns:
| Type | Description |
|---|---|
UpdateIssueResponse
|
|
UpdateIssueResponse
|
exposing |
Source code in src/linear_python_client/client.py
project
¶
project(request: ProjectRequest) -> ProjectResponse
Fetch a single project by id.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
request
|
ProjectRequest
|
required |
Returns:
| Type | Description |
|---|---|
ProjectResponse
|
|
ProjectResponse
|
|
Source code in src/linear_python_client/client.py
projects
¶
projects(
request: ProjectsRequest | None = None,
) -> ProjectsResponse
List projects in the workspace.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
request
|
ProjectsRequest | None
|
A |
None
|
Returns:
| Type | Description |
|---|---|
ProjectsResponse
|
Source code in src/linear_python_client/client.py
comment
¶
comment(request: CommentRequest) -> CommentResponse
Fetch a single comment by id.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
request
|
CommentRequest
|
required |
Returns:
| Type | Description |
|---|---|
CommentResponse
|
|
CommentResponse
|
|
Source code in src/linear_python_client/client.py
comments
¶
comments(
request: CommentsRequest | None = None,
) -> CommentsResponse
List comments, optionally scoped to a single issue.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
request
|
CommentsRequest | None
|
A |
None
|
Returns:
| Type | Description |
|---|---|
CommentsResponse
|
Source code in src/linear_python_client/client.py
create_comment
¶
create_comment(
request: CommentCreateRequest,
) -> CreateCommentResponse
Add a comment to an issue.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
request
|
CommentCreateRequest
|
required |
Returns:
| Type | Description |
|---|---|
CreateCommentResponse
|
|
CreateCommentResponse
|
exposing |
Source code in src/linear_python_client/client.py
workflow_states
¶
workflow_states(
request: WorkflowStatesRequest | None = None,
) -> WorkflowStatesResponse
List workflow states, optionally scoped to a single team.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
request
|
WorkflowStatesRequest | None
|
A |
None
|
Returns:
| Type | Description |
|---|---|
WorkflowStatesResponse
|
Source code in src/linear_python_client/client.py
find_workflow_state
¶
find_workflow_state(
request: FindWorkflowStateRequest,
) -> WorkflowStateResponse
Resolve a workflow state by name within a team.
Useful for turning a human status name (e.g. "In Progress") into the
UUID that set_issue_state
expects. Matching is case-insensitive.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
request
|
FindWorkflowStateRequest
|
required |
Returns:
| Type | Description |
|---|---|
WorkflowStateResponse
|
|
WorkflowStateResponse
|
|
Source code in src/linear_python_client/client.py
find_team
¶
find_team(request: FindTeamRequest) -> TeamResponse
Resolve a team by display name or key.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
request
|
FindTeamRequest
|
A |
required |
Returns:
| Type | Description |
|---|---|
TeamResponse
|
A |
TeamResponse
|
|
Source code in src/linear_python_client/client.py
find_user
¶
find_user(request: FindUserRequest) -> UserResponse
Resolve a user by name, display name, or email.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
request
|
FindUserRequest
|
A |
required |
Returns:
| Type | Description |
|---|---|
UserResponse
|
A |
UserResponse
|
|
Source code in src/linear_python_client/client.py
find_project
¶
find_project(
request: FindProjectRequest,
) -> ProjectResponse
Resolve a project by name (case-insensitive).
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
request
|
FindProjectRequest
|
required |
Returns:
| Type | Description |
|---|---|
ProjectResponse
|
A |
ProjectResponse
|
is |
Source code in src/linear_python_client/client.py
find_label
¶
find_label(request: FindLabelRequest) -> IssueLabelResponse
Resolve an issue label by name, optionally scoped to a team.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
request
|
FindLabelRequest
|
required |
Returns:
| Type | Description |
|---|---|
IssueLabelResponse
|
|
IssueLabelResponse
|
|
Source code in src/linear_python_client/client.py
issue_labels
¶
issue_labels(
request: IssueLabelsRequest | None = None,
) -> IssueLabelsResponse
List issue labels in the workspace.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
request
|
IssueLabelsRequest | None
|
An |
None
|
Returns:
| Type | Description |
|---|---|
IssueLabelsResponse
|
Source code in src/linear_python_client/client.py
paginate
¶
paginate(
method: Callable[[RequestT], ConnectionResponse[NodeT]],
request: RequestT,
*,
page_size: int | None = None,
) -> Iterator[NodeT]
Yield every node across all pages of a list method.
Transparently follows the cursor (page_info.end_cursor) until
has_next_page is false, so you can iterate an entire result set without
managing pagination yourself:
from linear_python_client import IssuesRequest
for issue in client.paginate(client.issues, IssuesRequest(filter={...})):
print(issue.identifier, issue.title)
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
method
|
Callable[[RequestT], ConnectionResponse[NodeT]]
|
A list method on this client (e.g. |
required |
request
|
RequestT
|
The request to start from. It is copied; |
required |
page_size
|
int | None
|
Results to request per page, set as |
None
|
Yields:
| Type | Description |
|---|---|
NodeT
|
Each node from every page, in order. |