Issues

API for managing SonarQube issues.

Issues API for SonarQube SDK.

This module provides methods to search, update, and manage issues found by SonarQube analysis.

Example

Using the Issues API:

from sonarqube import SonarQubeClient

client = SonarQubeClient(base_url="...", token="...")

# Search for issues
issues = client.issues.search(
    project_keys=["my-project"], severities=["CRITICAL", "BLOCKER"]
)
for issue in issues.issues:
    print(f"{issue.severity}: {issue.message}")
class sonarqube.api.issues.IssuesAPI(client)[source]

Bases: BaseAPI

API for managing SonarQube issues.

Issues are problems found by SonarQube during code analysis. This API provides methods to search, assign, comment, and transition issues.

API_PATH

Base path for issues API (“/api/issues”).

Example

Using the issues API:

# Search for critical issues
issues = client.issues.search(
    project_keys=["my-project"], severities=["CRITICAL"]
)

# Assign an issue
client.issues.assign(issue="AXoN-12345", assignee="john")

# Transition an issue
client.issues.do_transition(issue="AXoN-12345", transition="resolve")
Parameters:

client (HTTPClient)

add_comment(issue, text)[source]

Add a comment to an issue.

Requires authentication and ‘Browse’ permission on the project.

Parameters:
  • issue (str) – Issue key.

  • text (str) – Comment text (max 40000 characters).

Return type:

Issue

Returns:

The updated issue.

Raises:
  • SonarQubeNotFoundError – If issue not found.

  • SonarQubePermissionError – If lacking required permissions.

Example

>>> issue = client.issues.add_comment(
...     issue="AXoN-12345", text="This should be fixed in the next sprint."
... )
assign(issue, assignee=None)[source]

Assign or unassign an issue.

Requires authentication and ‘Browse’ permission on the project.

Parameters:
  • issue (str) – Issue key.

  • assignee (Optional[str], default: None) – User login to assign, or None to unassign.

Return type:

Issue

Returns:

The updated issue.

Raises:
  • SonarQubeNotFoundError – If issue not found.

  • SonarQubePermissionError – If lacking required permissions.

Example

>>> # Assign to a user
>>> issue = client.issues.assign(issue="AXoN-12345", assignee="john")
>>> # Unassign
>>> issue = client.issues.assign(issue="AXoN-12345")
authors(project, ps=None, q=None)[source]

Get list of issue authors.

Requires ‘Browse’ permission on the project.

Parameters:
  • project (str) – Project key.

  • ps (Optional[int], default: None) – Page size (max 100).

  • q (Optional[str], default: None) – Search query for author names.

Return type:

IssueAuthorsResponse

Returns:

Response containing list of authors.

Example

>>> response = client.issues.authors(project="my-project")
>>> for author in response.authors:
...     print(author)
bulk_change(issues, add_tags=None, assign=None, comment=None, do_transition=None, remove_tags=None, set_severity=None, set_type=None)[source]

Bulk change issues.

Requires authentication and ‘Browse’ permission on the project.

Parameters:
  • issues (list[str]) – List of issue keys.

  • add_tags (Optional[list[str]], default: None) – Tags to add.

  • assign (Optional[str], default: None) – User to assign (use empty string to unassign).

  • comment (Optional[str], default: None) – Comment to add.

  • do_transition (Optional[str], default: None) – Transition to perform.

  • remove_tags (Optional[list[str]], default: None) – Tags to remove.

  • set_severity (Optional[str], default: None) – New severity.

  • set_type (Optional[str], default: None) – New type.

Return type:

dict[str, Any]

Returns:

Response containing bulk change results.

Example

>>> result = client.issues.bulk_change(
...     issues=["AXoN-12345", "AXoN-12346"], add_tags=["team-a"], assign="john"
... )
changelog(issue)[source]

Get changelog for an issue.

Requires ‘Browse’ permission on the project.

Parameters:

issue (str) – Issue key.

Return type:

IssueChangelogResponse

Returns:

Response containing changelog entries.

Example

>>> changelog = client.issues.changelog(issue="AXoN-12345")
>>> for entry in changelog.changelog:
...     print(entry)
delete_comment(comment)[source]

Delete a comment from an issue.

Requires authentication and ownership of the comment.

Parameters:

comment (str) – Comment key.

Return type:

Issue

Returns:

The updated issue.

Example

>>> issue = client.issues.delete_comment(comment="AU-Tpxb")
do_transition(issue, transition)[source]

Perform a transition on an issue.

Requires authentication and ‘Browse’ permission on the project.

Parameters:
  • issue (str) – Issue key.

  • transition (str) – Transition to perform (confirm, unconfirm, reopen, resolve, falsepositive, wontfix, close).

Return type:

Issue

Returns:

The updated issue.

Raises:
  • SonarQubeNotFoundError – If issue not found.

  • SonarQubeValidationError – If transition is not valid.

Example

>>> issue = client.issues.do_transition(issue="AXoN-12345", transition="resolve")
edit_comment(comment, text)[source]

Edit a comment on an issue.

Requires authentication and ownership of the comment.

Parameters:
  • comment (str) – Comment key.

  • text (str) – New comment text.

Return type:

Issue

Returns:

The updated issue.

Example

>>> issue = client.issues.edit_comment(comment="AU-Tpxb", text="Updated comment")
search(additional_fields=None, asc=None, assigned=None, assignees=None, author=None, branch=None, clean_code_attribute_categories=None, code_variants=None, component_keys=None, created_after=None, created_at=None, created_before=None, created_in_last=None, directories=None, facets=None, files=None, impact_severities=None, impact_software_qualities=None, in_new_code_period=None, issue_statuses=None, issues=None, languages=None, on_component_only=None, p=None, project_keys=None, ps=None, pull_request=None, resolutions=None, resolved=None, rules=None, s=None, scopes=None, severities=None, statuses=None, tags=None, types=None)[source]

Search for issues.

Requires ‘Browse’ permission on the project.

Parameters:
  • additional_fields (Optional[list[str]], default: None) – Additional fields to return.

  • asc (Optional[bool], default: None) – Ascending sort order.

  • assigned (Optional[bool], default: None) – Filter by assigned status.

  • assignees (Optional[list[str]], default: None) – Filter by assignees.

  • author (Optional[str], default: None) – Filter by author.

  • branch (Optional[str], default: None) – Branch name.

  • clean_code_attribute_categories (Optional[list[str]], default: None) – Clean code attribute categories.

  • code_variants (Optional[list[str]], default: None) – Code variants.

  • component_keys (Optional[list[str]], default: None) – Component keys.

  • created_after (Optional[str], default: None) – Issues created after this date.

  • created_at (Optional[str], default: None) – Issues created at this date.

  • created_before (Optional[str], default: None) – Issues created before this date.

  • created_in_last (Optional[str], default: None) – Issues created in last period (e.g., “1m”).

  • directories (Optional[list[str]], default: None) – Filter by directories.

  • facets (Optional[list[str]], default: None) – Facets to return.

  • files (Optional[list[str]], default: None) – Filter by files.

  • impact_severities (Optional[list[str]], default: None) – Impact severities.

  • impact_software_qualities (Optional[list[str]], default: None) – Impact software qualities.

  • in_new_code_period (Optional[bool], default: None) – Issues in new code period.

  • issue_statuses (Optional[list[str]], default: None) – Issue statuses.

  • issues (Optional[list[str]], default: None) – Issue keys.

  • languages (Optional[list[str]], default: None) – Filter by languages.

  • on_component_only (Optional[bool], default: None) – Only issues on the component.

  • p (Optional[int], default: None) – Page number.

  • project_keys (Optional[list[str]], default: None) – Project keys.

  • ps (Optional[int], default: None) – Page size.

  • pull_request (Optional[str], default: None) – Pull request ID.

  • resolutions (Optional[list[str]], default: None) – Filter by resolutions.

  • resolved (Optional[bool], default: None) – Filter by resolved status.

  • rules (Optional[list[str]], default: None) – Filter by rules.

  • s (Optional[str], default: None) – Sort field.

  • scopes (Optional[list[str]], default: None) – Filter by scopes.

  • severities (Optional[list[str]], default: None) – Filter by severities.

  • statuses (Optional[list[str]], default: None) – Filter by statuses.

  • tags (Optional[list[str]], default: None) – Filter by tags.

  • types (Optional[list[str]], default: None) – Filter by types.

Return type:

IssueSearchResponse

Returns:

Response containing list of issues and paging info.

Example

>>> response = client.issues.search(
...     project_keys=["my-project"], severities=["CRITICAL", "BLOCKER"]
... )
>>> for issue in response.issues:
...     print(f"{issue.severity}: {issue.message}")
set_severity(issue, severity)[source]

Set severity for an issue.

Requires authentication and ‘Browse’ permission on the project.

Parameters:
  • issue (str) – Issue key.

  • severity (str) – New severity (BLOCKER, CRITICAL, MAJOR, MINOR, INFO).

Return type:

Issue

Returns:

The updated issue.

Example

>>> issue = client.issues.set_severity(issue="AXoN-12345", severity="CRITICAL")
set_tags(issue, tags)[source]

Set tags for an issue.

Requires authentication and ‘Browse’ permission on the project.

Parameters:
  • issue (str) – Issue key.

  • tags (list[str]) – List of tags to set.

Return type:

Issue

Returns:

The updated issue.

Example

>>> issue = client.issues.set_tags(issue="AXoN-12345", tags=["team-a", "priority"])
set_type(issue, type_)[source]

Set type for an issue.

Requires authentication and ‘Browse’ permission on the project.

Parameters:
  • issue (str) – Issue key.

  • type – New type (BUG, VULNERABILITY, CODE_SMELL).

  • type_ (str)

Return type:

Issue

Returns:

The updated issue.

Example

>>> issue = client.issues.set_type(issue="AXoN-12345", type_="BUG")
Parameters:
Return type:

Issue

tags(project=None, ps=None, q=None)[source]

Get list of issue tags.

Requires ‘Browse’ permission on the project.

Parameters:
  • project (Optional[str], default: None) – Project key.

  • ps (Optional[int], default: None) – Page size (max 100).

  • q (Optional[str], default: None) – Search query for tags.

Return type:

IssueTagsResponse

Returns:

Response containing list of tags.

Example

>>> response = client.issues.tags(project="my-project")
>>> for tag in response.tags:
...     print(tag)

Models

Pydantic models for Issues API.

This module provides models for the /api/issues endpoints including searching, updating, and managing issues.

Example

Using issue models:

from sonarqube.models.issues import IssueSearchResponse

response = client.issues.search(project_keys=["my-project"])
for issue in response.issues:
    print(f"{issue.severity}: {issue.message}")
class sonarqube.models.issues.TextRange(**data)[source]

Bases: SonarQubeModel

Text range within a file.

start_line

Starting line number.

end_line

Ending line number.

start_offset

Starting character offset.

end_offset

Ending character offset.

Parameters:
  • data (Any)

  • startLine (int)

  • endLine (int)

  • startOffset (int | None)

  • endOffset (int | None)

start_line: int
end_line: int
start_offset: Optional[int]
end_offset: Optional[int]
model_config: ClassVar[ConfigDict] = {'extra': 'ignore', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True, 'validate_default': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class sonarqube.models.issues.IssueLocation(**data)[source]

Bases: SonarQubeModel

A location within an issue flow.

component

Component key.

text_range

Text range in the component.

msg

Message for this location.

Parameters:
  • data (Any)

  • component (str | None)

  • textRange (TextRange | None)

  • msg (str | None)

component: Optional[str]
text_range: Optional[TextRange]
msg: Optional[str]
model_config: ClassVar[ConfigDict] = {'extra': 'ignore', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True, 'validate_default': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class sonarqube.models.issues.IssueFlow(**data)[source]

Bases: SonarQubeModel

A flow of locations for an issue.

locations

List of locations in the flow.

Parameters:
  • data (Any)

  • locations (list[IssueLocation])

locations: list[IssueLocation]
model_config: ClassVar[ConfigDict] = {'extra': 'ignore', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True, 'validate_default': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class sonarqube.models.issues.IssueComment(**data)[source]

Bases: SonarQubeModel

A comment on an issue.

key

Comment key.

login

User login who made the comment.

html_text

HTML-formatted comment text.

markdown

Markdown-formatted comment text.

created_at

Comment creation date.

Parameters:
  • data (Any)

  • key (str)

  • login (str)

  • htmlText (str | None)

  • markdown (str | None)

  • createdAt (str | None)

key: str
login: str
html_text: Optional[str]
markdown: Optional[str]
created_at: Optional[str]
model_config: ClassVar[ConfigDict] = {'extra': 'ignore', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True, 'validate_default': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class sonarqube.models.issues.Issue(**data)[source]

Bases: SonarQubeModel

A SonarQube issue.

key

Unique issue key.

rule

Rule key that raised the issue.

severity

Issue severity (BLOCKER, CRITICAL, MAJOR, MINOR, INFO).

component

Component key where issue was found.

project

Project key.

line

Line number in the file.

message

Issue message.

status

Issue status (OPEN, CONFIRMED, REOPENED, RESOLVED, CLOSED).

resolution

Issue resolution if resolved.

type

Issue type (BUG, VULNERABILITY, CODE_SMELL).

effort

Effort to fix the issue.

debt

Technical debt.

author

Author of the code.

tags

Issue tags.

creation_date

Issue creation date.

update_date

Issue last update date.

text_range

Text range in the file.

flows

Issue flows for complex issues.

comments

Issue comments.

Example

>>> issue = Issue(
...     key="AXoN-12345",
...     rule="python:S1234",
...     severity="MAJOR",
...     component="my-project:src/main.py",
...     project="my-project",
...     message="Remove this unused variable",
... )
Parameters:
  • data (Any)

  • key (str)

  • rule (str)

  • severity (str | None)

  • component (str)

  • project (str)

  • line (int | None)

  • message (str | None)

  • status (str | None)

  • resolution (str | None)

  • type (str | None)

  • effort (str | None)

  • debt (str | None)

  • author (str | None)

  • tags (list[str] | None)

  • creationDate (str | None)

  • updateDate (str | None)

  • closeDate (str | None)

  • textRange (TextRange | None)

  • flows (list[IssueFlow] | None)

  • comments (list[IssueComment] | None)

  • assignee (str | None)

  • hash (str | None)

  • scope (str | None)

  • quickFixAvailable (bool | None)

  • ruleDescriptionContextKey (str | None)

  • messageFormattings (list[dict[str, Any]] | None)

  • codeVariants (list[str] | None)

  • cleanCodeAttribute (str | None)

  • cleanCodeAttributeCategory (str | None)

  • impacts (list[dict[str, Any]] | None)

key: str
rule: str
severity: Optional[str]
component: str
project: str
line: Optional[int]
message: Optional[str]
status: Optional[str]
resolution: Optional[str]
type: Optional[str]
effort: Optional[str]
debt: Optional[str]
author: Optional[str]
tags: Optional[list[str]]
creation_date: Optional[str]
update_date: Optional[str]
close_date: Optional[str]
text_range: Optional[TextRange]
flows: Optional[list[IssueFlow]]
comments: Optional[list[IssueComment]]
assignee: Optional[str]
hash: Optional[str]
scope: Optional[str]
quick_fix_available: Optional[bool]
rule_description_context_key: Optional[str]
message_formattings: Optional[list[dict[str, Any]]]
code_variants: Optional[list[str]]
clean_code_attribute: Optional[str]
clean_code_attribute_category: Optional[str]
impacts: Optional[list[dict[str, Any]]]
model_config: ClassVar[ConfigDict] = {'extra': 'ignore', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True, 'validate_default': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class sonarqube.models.issues.IssueSearchResponse(**data)[source]

Bases: SonarQubeModel

Response from searching issues.

paging

Paging information.

issues

List of issues.

components

List of components referenced by issues.

rules

List of rules referenced by issues.

facets

Facet information for filtering.

Example

>>> response = client.issues.search(project_keys=["my-project"])
>>> for issue in response.issues:
...     print(f"{issue.severity}: {issue.message}")
Parameters:
paging: Optional[Paging]
issues: list[Issue]
components: Optional[list[Component]]
rules: Optional[list[dict[str, Any]]]
facets: Optional[list[dict[str, Any]]]
p: Optional[int]
ps: Optional[int]
total: Optional[int]
effort_total: Optional[int]
model_config: ClassVar[ConfigDict] = {'extra': 'ignore', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True, 'validate_default': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class sonarqube.models.issues.IssueChangelogResponse(**data)[source]

Bases: SonarQubeModel

Response from getting issue changelog.

changelog

List of changelog entries.

Parameters:
changelog: list[dict[str, Any]]
model_config: ClassVar[ConfigDict] = {'extra': 'ignore', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True, 'validate_default': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class sonarqube.models.issues.IssueAuthorsResponse(**data)[source]

Bases: SonarQubeModel

Response from getting issue authors.

authors

List of author names.

Parameters:
authors: list[str]
model_config: ClassVar[ConfigDict] = {'extra': 'ignore', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True, 'validate_default': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class sonarqube.models.issues.IssueTagsResponse(**data)[source]

Bases: SonarQubeModel

Response from getting issue tags.

tags

List of tags.

Parameters:
tags: list[str]
model_config: ClassVar[ConfigDict] = {'extra': 'ignore', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True, 'validate_default': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].