Get a test's attempts in a run, with the Copy-for-AI prompt
const url = 'https://app.squally.dev/api/v1/projects/example/runs/example/tests/example';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/example/tests/example \ --header 'Authorization: Bearer <token>'Every attempt of one test in one run, oldest first, each with its errors, code frame and a ready-made prompt for an assistant that has the repository open (null for an attempt without a real failure). Cheap.
Authorizations
Section titled “Authorizations”Parameters
Section titled “ Parameters ”Path Parameters
Section titled “Path Parameters”A project id from GET /projects.
A run id from GET /projects/{projectId}/runs - or any shard’s id of a sharded run.
The full test name as Squally stores it (Playwright’s title path). URL-encode it, including “/” as %2F. A name used in several spec files needs ?filePath=.
Query Parameters
Section titled “Query Parameters”The spec file of the test, as stored (e.g. tests/checkout.spec.ts); an empty value means a test with no file. Needed only when the name exists in several files - the 400 ambiguous_test answer lists them.
Responses
Section titled “ Responses ”OK
object
object
object
Examplegenerated
{ "project": { "id": "example", "name": "example" }, "run": { "id": "example", "runNumber": 1, "branch": "example" }, "test": { "name": "example", "filePath": "example" }, "attempts": [ { "retry": 1, "label": "example", "status": "example", "durationMs": 1, "browserName": "example", "errors": [ { "message": "example", "stack": "example", "snippet": "example", "location": { "file": "example", "line": 1, "column": 1 } } ], "copyPrompt": "example", "shard": { "index": 1, "runId": "example" } } ]}Headers
Section titled “Headers”When the read key expires (ISO-8601). Present only from 7 days before expiry.
Error: ambiguous_test
object
A sentence for a human. May be reworded.
Stable slug - match on this, not on the sentence.
Example
{ "code": "ambiguous_test"}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, run_not_found, test_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"}