Skip to content

API changelog

Every change to the Squally read API, newest first.

v1, beta. The API may change until the beta ends; every change is listed in the changelog (docs/openapi/CHANGELOG.md).

v1 is in beta: the API may change until the beta ends, and every change is listed here, newest first. The document itself is v1.json, generated from the code (npx tsx scripts/generate-openapi.ts).

1.0.0-beta, document only — 2026-09-24 (fifth)

No change to any endpoint, and timeLostMs keeps its type (number | null) - but what the API PUTS in it changed, so the description did too.

  • /projects/{projectId}/flaky: timeLostMs is now computed for every listed test. It used to be computed only for tests that had both passed and failed in the window, so a test that never passed - and a test that passes in every run but only on the retry - came back as null. Both now carry a number, and the two are usually the largest on the list.
  • The field description no longer says null means “never passed in the window - the worst case”. It describes the arithmetic (wasted attempts x the final attempt duration, where a failed run wastes every attempt and a retry-rescued run wastes the ones before the retry), states that 0 is a real measurement, and says null is a guard that should not occur on this response.
  • Sorting by timeLost puts null last instead of first, for the same reason: it no longer marks the worst case.

1.0.0-beta, document only — 2026-09-24 (fourth)

No change to any endpoint or response.

  • x-error-codes: the action of test_not_found now reads “Check the test name and filePath exactly as Squally shows them; do not retry.” It used to tell the caller to URL-encode the name - right for an HTTP request, wrong for an agent passing the name as a tool argument, which then gets encoded twice. The encoding rule for HTTP callers is unchanged, in the testName parameter description.

1.0.0-beta, document only — 2026-09-24 (third)

No change to any endpoint or response, and no operationId changed.

  • Every operation has a short summary (“List runs”, “Get test status”, …). The longer sentence each had before is now the first sentence of its description.
  • Operations are grouped by tags, each with a one-line description, listed on the document in this order: Projects, Runs, Tests, Flakiness, Errors, Project.

1.0.0-beta, document only — 2026-09-24 (second)

No change to any endpoint or response. The document carries more of what a client needs:

  • x-error-codes on the document: every error code the API can answer with, one entry each - code, status, when (the sentence the API sends), action (what to do) and hasBody (false only for 429, which the edge answers without a JSON body).
  • Retry rules in the description, in one place: 429 - wait 60 seconds, then retry; 5xx - exponential backoff from 1 second, capped at 30 seconds; 400, 401, 403, 404 - never retry. This replaces “back off for at least 60 s”.
  • An example body for every 200 response. The data is invented.
  • This changelog is served at /openapi/CHANGELOG.md.

1.0.0-beta, document only — 2026-09-24

No change to any endpoint or response. The document reads better:

  • Error responses carry their schema inline, with code limited to the slugs that route answers with at that status, and one full example (error and code) per slug. The shared components/schemas/ApiError is gone; the shape it described is unchanged.
  • Integers no longer carry the ±9007199254740991 bounds, and date-time fields no longer carry a regex next to format: date-time.

1.0.0-beta — 2026-09-23

First published version. Twelve read endpoints under /api/v1: projects, runs (list, one run, a test’s attempts with the Copy-for-AI prompt), branches, flaky tests, a test’s stored status and history, error signatures (list and one), the dashboard overview, and project settings.