Skip to content

List flaky and broken tests (expensive)

GET
/projects/{projectId}/flaky
curl --request GET \
--url 'https://app.squally.dev/api/v1/projects/example/flaky?status=flaky&sort=timeLost&page=1&perPage=10' \
--header 'Authorization: Bearer <token>'

Flaky and broken tests as the flakiness engine judges them over its fixed 14-day window, ranked by time lost. THE EXPENSIVE ENDPOINT: it runs the engine live on every call - call it once per question, not in a loop, and use the test status route for a single test.

projectId
required
string

A project id from GET /projects.

status
string
Allowed values: flaky broken

Only tests with this verdict.

sort
string
default: timeLost
Allowed values: timeLost rate impact

Ranking: time lost (default), flake rate, or impact on the stable branch.

search
string
>= 1 characters <= 200 characters

Case-insensitive substring of the test name or its file.

page
integer
default: 1 >= 1

1-based page number. A page past the end answers the last page.

perPage
integer
default: 10
Allowed values: 10 25 50

Rows per page.

OK

Media typeapplication/json
object
project
required
object
id
required
string
name
required
string
windowDays
required

The engine’s fixed window in days. The flaky list takes no other period.

integer
>= -9007199254740991 <= 9007199254740991
sort
required
string
page
required
object
page
required
integer
>= -9007199254740991 <= 9007199254740991
perPage
required
integer
>= -9007199254740991 <= 9007199254740991
total
required
integer
>= -9007199254740991 <= 9007199254740991
pageCount
required
integer
>= -9007199254740991 <= 9007199254740991
tests
required
Array<object>
object
testName
required
string
filePath
required
Any of:
string
status
required
string
statusReason
required
string
alsoActive
required
Array<string>
timeLostMs
required
Any of:
number
flakeScore
required
number
flipRate
required
number
failureRate
required
Any of:
number
runsConsidered
required
integer
>= -9007199254740991 <= 9007199254740991
failureStreak
required
integer
>= -9007199254740991 <= 9007199254740991
lastSeenAt
required
string format: date-time
/^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$/
lastRun
required
object
runId
required
string
runNumber
required
integer
>= -9007199254740991 <= 9007199254740991
status
required
string
startedAt
required
string format: date-time
/^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$/
gatheringDataCount
required
integer
>= -9007199254740991 <= 9007199254740991
Examplegenerated
{
"project": {
"id": "example",
"name": "example"
},
"windowDays": 1,
"sort": "example",
"page": {
"page": 1,
"perPage": 1,
"total": 1,
"pageCount": 1
},
"tests": [
{
"testName": "example",
"filePath": "example",
"status": "example",
"statusReason": "example",
"alsoActive": [
"example"
],
"timeLostMs": 1,
"flakeScore": 1,
"flipRate": 1,
"failureRate": 1,
"runsConsidered": 1,
"failureStreak": 1,
"lastSeenAt": "2026-04-15T12:00:00Z",
"lastRun": {
"runId": "example",
"runNumber": 1,
"status": "example",
"startedAt": "2026-04-15T12:00:00Z"
}
}
],
"gatheringDataCount": 1
}
Squally-Key-Expires-At
string format: date-time

When the read key expires (ISO-8601). Present only from 7 days before expiry.

Error: invalid_parameter

Media typeapplication/json
object
error
required

A sentence for a human. May be reworded.

string
code
required

Stable slug - match on this, not on the sentence.

string
Allowed values: missing_key invalid_key wrong_key_type key_revoked key_expired tier_too_low project_not_found invalid_period rate_limited test_not_found ambiguous_test internal_error invalid_parameter run_not_found error_not_found
code
required
Allowed values: invalid_parameter
Example
{
"code": "invalid_parameter"
}

Error: invalid_key, key_expired, key_revoked, missing_key, wrong_key_type

Media typeapplication/json
object
error
required

A sentence for a human. May be reworded.

string
code
required

Stable slug - match on this, not on the sentence.

string
Allowed values: missing_key invalid_key wrong_key_type key_revoked key_expired tier_too_low project_not_found invalid_period rate_limited test_not_found ambiguous_test internal_error invalid_parameter run_not_found error_not_found
code
required
Allowed values: invalid_key key_expired key_revoked missing_key wrong_key_type
Example
{
"code": "invalid_key"
}

Error: tier_too_low

Media typeapplication/json
object
error
required

A sentence for a human. May be reworded.

string
code
required

Stable slug - match on this, not on the sentence.

string
Allowed values: missing_key invalid_key wrong_key_type key_revoked key_expired tier_too_low project_not_found invalid_period rate_limited test_not_found ambiguous_test internal_error invalid_parameter run_not_found error_not_found
code
required
Allowed values: tier_too_low
Example
{
"code": "tier_too_low"
}

Error: project_not_found

Media typeapplication/json
object
error
required

A sentence for a human. May be reworded.

string
code
required

Stable slug - match on this, not on the sentence.

string
Allowed values: missing_key invalid_key wrong_key_type key_revoked key_expired tier_too_low project_not_found invalid_period rate_limited test_not_found ambiguous_test internal_error invalid_parameter run_not_found error_not_found
code
required
Allowed values: project_not_found
Example
{
"code": "project_not_found"
}

Rate limited by the edge firewall. No JSON body and no Retry-After - back off for at least 60 s.

Error: internal_error

Media typeapplication/json
object
error
required

A sentence for a human. May be reworded.

string
code
required

Stable slug - match on this, not on the sentence.

string
Allowed values: missing_key invalid_key wrong_key_type key_revoked key_expired tier_too_low project_not_found invalid_period rate_limited test_not_found ambiguous_test internal_error invalid_parameter run_not_found error_not_found
code
required
Allowed values: internal_error
Example
{
"code": "internal_error"
}