Skip to content

Traceability reports API

A traceability report covers the requirements of one tracker: the Jira issues of the projects and issue types you choose, or the GitHub issues of the repositories you choose. Each version of a report is a snapshot taken when it is generated: the matching requirements, their linked test cases, the latest results and the defects. The screens are described in Traceability with Jira and Traceability with GitHub.

Every endpoint is under /api/v1/projects/{projectId}/traceability, where {projectId} is the project code (for example ACME). The endpoints need the Pro or Enterprise plan; on other plans they answer 403 forbidden. Reading needs access to the project. Creating, generating, renaming and deleting need the test-cases.write permission, the same one that links test cases to Jira issues.

Method and pathWhat it does
GET /sourcesLists the organization’s active Jira and GitHub connections, each with its provider. An empty list means no integration is active, so no report can be created.
GET /sources/{connectionUlid}/projectsLists the Jira projects that connection allows, read live from Jira.
GET /sources/{connectionUlid}/issue-types?projects=WEB,APILists the distinct issue type names of the given Jira projects, sorted.
GET /sources/{connectionUlid}/repositoriesGitHub: lists the repositories a report may read through that connection.
GET /sources/{connectionUlid}/labels?repository=acme/shopGitHub: lists the repository’s label names.
GET /sources/{connectionUlid}/milestones?repository=acme/shopGitHub: lists the repository’s milestones, open and closed, with title and state.
GET /reportsLists the project’s reports, newest first.
POST /reportsSaves a report and queues its first version. Answers 201.
GET /reports/{reportUlid}Reads one report.
PATCH /reports/{reportUlid}Renames a report.
DELETE /reports/{reportUlid}Deletes the report and all its versions. Answers 204.
GET /reports/{reportUlid}/versionsLists the report’s versions, newest first.
POST /reports/{reportUlid}/versionsQueues a new version with the report’s projects and issue types. Answers 201.
GET /versions/{versionUlid}Reads a version: its status and totals and, once it is ready, the totals of each project.
PATCH /versions/{versionUlid}Renames a version. null clears the name.
DELETE /versions/{versionUlid}Deletes the version. Answers 204.
GET /versions/{versionUlid}/requirementsLists one tab of a ready version, with filters and page-based pagination.

POST /reports takes the connection ULID from GET /sources and the project keys that GET /sources/{connectionUlid}/projects returns. Issue type names come from GET /sources/{connectionUlid}/issue-types.

POST /reports takes:

FieldRule
nameRequired, 1 to 200 characters after trimming.
filters.providerjira. For a GitHub report, github with other filters: see GitHub reports.
filters.projectsRequired, 1 to 20 objects with connectionUlid and projectKey, without duplicates. Each project must be allowed by an active connection of the organization. Otherwise the request answers 422 traceability_project_not_allowed and saves nothing.
filters.issueTypesOptional, up to 50 names. Omitted or empty means every issue type of the projects. Names compare without regard to letter case, and duplicates collapse.

The 201 response holds the report and its first version, whose status is pending. Read the version until its status is ready.

A report with filters.provider: "github" reads the issues of up to 20 repositories:

{
"name": "Checkout requirements",
"filters": {
"provider": "github",
"repositories": [{ "connectionUlid": "01J9Z3K4M5N6P7Q8R9S0T1V2W3", "fullName": "acme/shop" }],
"labels": ["requirement"],
"milestone": "v2.0",
"state": "all"
}
}
FieldRule
filters.repositoriesRequired, 1 to 20, from GET /sources/{connectionUlid}/repositories: the project’s repository mapping on that connection, or every repository it can see when the project maps none. Otherwise 403 github_repository_not_mapped or 422 github_repository_not_visible, and nothing is saved.
filters.labelsOptional, up to 20 names without commas. An issue must carry every one of them. Empty keeps every issue.
filters.milestoneOptional milestone title, in any letter case. A repository without a milestone of that title contributes no issues.
filters.stateopen, closed or all (default).

The repositories are checked again when each version is generated. Pull requests are never requirements. A requirement’s key is owner/name#number, its projectKey is owner/name, its type is Issue and its status is Open, Closed or Closed as not planned, in the status categories to_do (open) or done (closed). A GitHub requirement is linked when a test case of the project links the issue as a requirement (see the GitHub API).

A version has these fields:

  • status: pending, generating, ready or failed.
  • number: 1, 2, 3 and so on within the report. A deleted version’s number is never reused.
  • name: the name given by renaming, or null to show it as Version {number}.
  • totals: requirements, linked and unlinked. null until the version is ready.
  • errorCode, for a failed version: connection_unavailable when a selected project’s connection was removed, paused or no longer allows the project; requirements_limit_exceeded when the filters match more than 5,000 requirements; provider_error when Jira could not be read.
  • createdAt and generatedAt: epoch milliseconds. generatedAt is null until the version is ready.

A version is never changed once it is ready. Only one version of a report can be pending or generating at a time: a POST /reports/{reportUlid}/versions made while another one is open answers 409 traceability_version_in_progress.

GET /versions/{versionUlid} also returns report (its ULID, name and filters) and projects: one entry per selected project, in the report’s order, with its connectionUlid, projectKey, name and the requirements, linked and unlinked counts. projects is empty until the version is ready.

GET /versions/{versionUlid}/requirements answers one tab of a ready version. A version that is not ready answers 409 traceability_version_not_ready.

ParameterMeaning
tablinked (default) or unlinked.
qUp to 200 characters. Matches the Jira key exactly, in any letter case, or a case-insensitive part of the title or the key.
projectKeyOnly requirements of this Jira project.
statusComma-separated status categories: to_do, in_progress, done.
resultStatusComma-separated latest results of the linked cases: passed, failed, skipped, blocked, untested. Ignored on unlinked.
defectStatusComma-separated statuses of the linked defects: open, in_progress, resolved, closed. Ignored on unlinked.
pageFrom 1. Default 1. A page past the last one has no items.
pageSizeFrom 1 to 100. Default 25.

Filters combine with AND, and the values inside one filter combine with OR.

A requirement is linked when at least one test case of the project links it, archived cases included. The unlinked tab holds the others.

The response has items, page, pageSize and total (the requirements that match every filter, over all pages). A version never changes once it is ready, so consecutive pages never overlap. Each requirement carries its Jira identifiers and URL, its statusName and statusCategory, its updatedAt as read when the version was generated, its caseCount, its staleCaseCount, its defects (total, the distinct defects linked to its cases, and byStatus, the same defects counted by current status: open, in_progress, resolved and closed), and up to 200 cases, with casesTruncated when more exist. Each case carries its displayId, title, archived flag, caseUpdatedAt, stale flag, latestResult (or null), and up to 20 defects, with defectsTruncated when more exist.

Reading a connection’s projects or issue types, creating reports and creating versions are rate limited per organization. A 429 too_many_requests response includes Retry-After.

Every error uses the standard error envelope.

StatusCodeWhen
403forbiddenThe plan does not include integrations, or your role lacks test-cases.write on a create, generate, rename or delete.
403github_repository_not_mappedGitHub: the project’s repository mapping leaves the repository out.
409github_connection_staleGitHub: the installation was suspended or uninstalled.
422github_repository_not_visibleGitHub: the installation cannot see the repository.
503github_unavailableGitHub cannot be reached right now.
403jira_project_not_allowedThe connection does not allow the Jira project asked for.
403jira_permission_deniedJira refused the read for the connection’s account.
404not_foundNo report, version or connection with that ULID that you can see.
404jira_not_foundJira does not find the project or issue type asked for.
409jira_connection_staleThe Jira connection is stale. Check it in the integration settings.
409traceability_version_in_progressAnother version of the report is pending or generating.
409traceability_version_not_readyRequirements were requested from a version that is not ready.
422traceability_project_not_allowedA selected project is not allowed by an active connection. Nothing is saved.
422validation_failedThe body, a query parameter or a path parameter is malformed.
429too_many_requestsThe rate limit of the reads or writes listed above is reached. Retry-After says when to retry.
503jira_unavailableJira cannot be reached right now.
503jira_rate_limitedJira is throttling requests. Retry-After says when to retry.