Skip to content

Coverage Matrix API

The coverage matrix endpoint returns the latest result status for every test case in a project, broken down by environment. Each row represents a test case; each cell within a row represents the most recent recorded result for that case in one of the project’s environments.

The endpoint is read-only — it emits no audit events and makes no state changes.

All requests require an authenticated session (API token or cookie) with at least viewer membership in the project’s organization. A projectId that belongs to a different organization returns 404 not_found.

GET/api/v1/projects/{projectId}/coverage-matrix

{projectId} is the project code (for example ACME).

ParameterDefaultNotes
page1Page number (1-based)
pageSize50Rows per page (min 1, max 200)
suiteUlidOptional comma-separated list of suite ULIDs. When present, only test cases belonging to any of the listed suites are returned (OR semantics). A single ULID behaves identically to the previous behavior. Unknown or cross-project ULIDs in the list are silently ignored; if all provided ULIDs are unknown the result is an empty page with total = 0. A malformed ULID (not a valid 26-character Crockford base32) in the list returns 422 validation_failed.
statusOptional comma-separated filter on derived latest status. Accepted values: passed, failed, blocked, skipped, untested, none. none matches rows that have at least one empty cell (a case never run in any environment). Multiple values are OR-combined. Unknown tokens return 422 validation_failed.
qOptional text search query. When non-empty (after trimming), restricts rows to cases whose text fields (selected by searchBy) contain q as a case-insensitive substring. % and _ in q match literally. An empty or whitespace-only value is treated as absent (no text filter).
searchByallControls which field is searched when q is non-empty. Accepted values: all (default), title, id. See the searchBy values table. An unknown value returns 422 validation_failed.

200 with the following shape:

{
"columns": [ ... ],
"rows": {
"items": [ ... ],
"page": 1,
"pageSize": 50,
"total": 120
}
}

An array of environment objects, one per live environment in the project, in creation order. These are the matrix column headers.

FieldTypeNotes
environmentIdstring (ULID)The environment’s ULID
namestringDisplay name (for example Staging)
slugstringURL-safe identifier (for example staging)

Soft-deleted environments are never included.

A paginated array of test-case rows. Each row has the following fields:

FieldTypeNotes
testCaseIdstring (ULID)The test case’s ULID
caseNumbernumberHuman-readable case number within the project
titlestringTest case title
suiteobject | nullThe suite this case belongs to ({ ulid, name }), or null if unassigned
cellsarrayOne cell per column, in the same order as columns

Each entry in cells:

FieldTypeNotes
environmentIdstring (ULID)Matches the corresponding columns[i].environmentId
statusstring | nullLatest result status for this case in this environment, or null if no result exists
executedAtnumber | nullUnix epoch milliseconds of the most recent result, or null
runUlidstring (ULID) | nullThe run that produced the latest result, or null

A null status means the test case has never been run in that environment — it is an empty cell, distinct from a result with status untested. cells.length always equals columns.length.

ValueMeaning
passedThe latest result is passing
failedThe latest result is failing
blockedThe latest result is blocked
skippedThe latest result was skipped
untestedThe case was explicitly marked untested in the latest result
nullNo result recorded in this environment (empty cell)
ValueColumns matched
all (default)Case title or display ID (#<caseNumber>) — OR-combined
titleCase title only
idDisplay ID only — the #<caseNumber> format shown in the UI

When q is absent or empty, searchBy has no effect.

total in the response always reflects the count of rows after all active filters (suite + status + text) are applied.

When two results for the same (test_case, environment) pair share the same executedAt timestamp, the result with the greater internal ID wins.

Results from runs with no environment assigned (environment_id IS NULL) are never included in any cell.

StatusCodeCondition
404not_foundprojectId does not exist or belongs to a different organization
422validation_failedpageSize out of range, unknown status token, malformed ULID in suiteUlid, unknown searchBy value

Filter by two suites and search by title:

Terminal window
curl -sS \
-H "Authorization: Bearer $PROBARA_API_TOKEN" \
"https://probara.net/api/v1/projects/ACME/coverage-matrix?suiteUlid=01JAAAA...,01JBBBB...&q=login&searchBy=title"

Filter by status with pagination:

Terminal window
curl -sS \
-H "Authorization: Bearer $PROBARA_API_TOKEN" \
"https://probara.net/api/v1/projects/ACME/coverage-matrix?pageSize=20&status=failed,none"

Response excerpt:

{
"columns": [
{ "environmentId": "01JAAAA...", "name": "Staging", "slug": "staging" },
{ "environmentId": "01JBBBB...", "name": "Production", "slug": "production" }
],
"rows": {
"items": [
{
"testCaseId": "01JCCCC...",
"caseNumber": 1,
"title": "Login with valid credentials",
"suite": { "ulid": "01JDDDD...", "name": "Authentication" },
"cells": [
{
"environmentId": "01JAAAA...",
"status": "failed",
"executedAt": 1718700000000,
"runUlid": "01JEEEE..."
},
{ "environmentId": "01JBBBB...", "status": null, "executedAt": null, "runUlid": null }
]
}
],
"page": 1,
"pageSize": 20,
"total": 3
}
}