Skip to content

Get an error signature

GET
/projects/{projectId}/errors/{fingerprint}
curl --request GET \
--url 'https://app.squally.dev/api/v1/projects/example/errors/example?days=7' \
--header 'Authorization: Bearer <token>'

One error signature: its counts, the tests it hits and the runs it occurred in. A signature quiet in the period is answered over everything still stored (windowEmpty: true). Moderate.

projectId
required
string

A project id from GET /projects.

fingerprint
required
string
/^[0-9A-Za-z_-]{1,128}$/

An error signature fingerprint from GET /projects/{projectId}/errors.

days
integer
default: 30
Allowed values: 7 30 90

The period, in days, ending now. Must not exceed the plan’s retention (Standard 60, Pro 90 days); a longer period is refused with 400 invalid_period rather than answered with less data.

OK

Media typeapplication/json
object
project
required
object
id
required
string
name
required
string
window
required
object
days
required
integer
>= -9007199254740991 <= 9007199254740991
from
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))$/
to
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))$/
signature
required
object
fingerprint
required
string
title
required
string
message
required
string
category
required
string
filePath
required
Any of:
string
fileCount
required
integer
>= -9007199254740991 <= 9007199254740991
testCount
required
integer
>= -9007199254740991 <= 9007199254740991
testNames
required
Array<string>
occurrenceCount
required
integer
>= -9007199254740991 <= 9007199254740991
runCount
required
integer
>= -9007199254740991 <= 9007199254740991
firstSeen
required

First seen in what is still stored: the earliest occurrence the plan’s retention has kept, NOT bounded by the requested period. ISO-8601.

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))$/
lastSeen
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))$/
isNew
required
boolean
windowEmpty
required

True when the signature did not occur in the requested period; the figures then cover everything still stored.

boolean
tests
required
Array<object>
object
testName
required
string
filePath
required
Any of:
string
occurrenceCount
required
integer
>= -9007199254740991 <= 9007199254740991
runs
required
Array<object>
object
runId
required
string
runNumber
required
integer
>= -9007199254740991 <= 9007199254740991
branch
required
Any of:
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))$/
testName
required
string
filePath
required
Any of:
string
attempts
required
integer
>= -9007199254740991 <= 9007199254740991
occurrences
required
integer
>= -9007199254740991 <= 9007199254740991
finalStatus
required
string
Examplegenerated
{
"project": {
"id": "example",
"name": "example"
},
"window": {
"days": 1,
"from": "2026-04-15T12:00:00Z",
"to": "2026-04-15T12:00:00Z"
},
"signature": {
"fingerprint": "example",
"title": "example",
"message": "example",
"category": "example",
"filePath": "example",
"fileCount": 1,
"testCount": 1,
"testNames": [
"example"
],
"occurrenceCount": 1,
"runCount": 1,
"firstSeen": "2026-04-15T12:00:00Z",
"lastSeen": "2026-04-15T12:00:00Z",
"isNew": true
},
"windowEmpty": true,
"tests": [
{
"testName": "example",
"filePath": "example",
"occurrenceCount": 1
}
],
"runs": [
{
"runId": "example",
"runNumber": 1,
"branch": "example",
"startedAt": "2026-04-15T12:00:00Z",
"testName": "example",
"filePath": "example",
"attempts": 1,
"occurrences": 1,
"finalStatus": "example"
}
]
}
Squally-Key-Expires-At
string format: date-time

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

Error: invalid_period

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_period
Example
{
"code": "invalid_period"
}

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: error_not_found, 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: error_not_found project_not_found
Example
{
"code": "error_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"
}