Quickstart
From a read key to your first answer, in three calls.
Get a read key
Every request carries an organization read key as Authorization: Bearer sqly_ro_…. A read key is organization-wide (every project), created by an organization admin in Settings → API keys, and expires after 30, 60, 90, 180 days as chosen at creation. There is no renewal: create a new key and revoke the old one. Project ingest keys (sqly_…) are refused with wrong_key_type.
List the organization's projects
List the organization’s projects. The projects of the key’s organization, oldest first. Start here: every other route takes a project id from this list. Cheap.
curl "https://app.squally.dev/api/v1/projects" \ -H "Authorization: Bearer $SQUALLY_API_KEY"The answer looks like this (invented data):
{ "projects": [ { "id": "3f7c2a91-5b8e-4d0a-9c61-2e4b7f0d8a15", "name": "storefront-web", "stableBranch": "main", "createdAt": "2026-06-02T09:14:00.000Z" }, { "id": "a8d4e1c7-6f20-4b93-8e5a-1c7d3b9f0e42", "name": "admin-console", "stableBranch": "develop", "createdAt": "2026-07-18T13:40:00.000Z" } ]}Ask about one project - here, its runs
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.
curl "https://app.squally.dev/api/v1/projects/$PROJECT/runs" \ -H "Authorization: Bearer $SQUALLY_API_KEY"Next: Conventions for errors and retries, and the API reference for every endpoint.