List runs
const url = 'https://app.squally.dev/api/v1/projects/example/runs?days=7&status=passed&perPage=10&direction=next';const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request GET \ --url 'https://app.squally.dev/api/v1/projects/example/runs?days=7&status=passed&perPage=10&direction=next' \ --header 'Authorization: Bearer <token>'Runs in a period, newest first - one row per logical run (a sharded CI run is one row). Filter by branch, commit SHA prefix or outcome; page with the cursors. Cheap to moderate: one bounded scan.
Authorizations
Section titled “Authorizations”Parameters
Section titled “ Parameters ”Path Parameters
Section titled “Path Parameters”A project id from GET /projects.
Query Parameters
Section titled “Query Parameters”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.
Exact branch name.
A commit SHA or a prefix of one (4-40 hex characters). Matches the run’s commit or its tested revision (a pull request’s head behind a merge commit).
Only runs with this outcome.
Rows per page.
Opaque. Pass nextCursor for older runs, or prevCursor together with direction=prev for newer runs.
Which way the cursor pages.
Responses
Section titled “ Responses ”OK
object
object
object
object
object
Examplegenerated
{ "project": { "id": "example", "name": "example" }, "window": { "days": 1, "from": "2026-04-15T12:00:00Z", "to": "2026-04-15T12:00:00Z" }, "stableBranch": "example", "runs": [ { "id": "example", "runNumber": 1, "branch": "example", "commitSha": "example", "testedRevision": "example", "pullRequestNumber": 1, "status": "example", "startedAt": "2026-04-15T12:00:00Z", "finishedAt": "2026-04-15T12:00:00Z", "durationMs": 1, "counts": { "total": 1, "passed": 1, "failed": 1, "skipped": 1, "recovered": 1 }, "shards": { "received": 1, "expected": 1 } } ], "total": 1, "nextCursor": "example", "prevCursor": "example"}Headers
Section titled “Headers”When the read key expires (ISO-8601). Present only from 7 days before expiry.
Error: invalid_parameter, invalid_period
object
A sentence for a human. May be reworded.
Stable slug - match on this, not on the sentence.
Example
{ "code": "invalid_parameter"}Error: invalid_key, key_expired, key_revoked, missing_key, wrong_key_type
object
A sentence for a human. May be reworded.
Stable slug - match on this, not on the sentence.
Example
{ "code": "invalid_key"}Error: tier_too_low
object
A sentence for a human. May be reworded.
Stable slug - match on this, not on the sentence.
Example
{ "code": "tier_too_low"}Error: project_not_found
object
A sentence for a human. May be reworded.
Stable slug - match on this, not on the sentence.
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
object
A sentence for a human. May be reworded.
Stable slug - match on this, not on the sentence.
Example
{ "code": "internal_error"}