Skip to main content
Testorim is a single-origin application: the app, the HTTP API and the WebSocket used for live runs all serve from https://app.testorim.com.

The API surface

The API-key surface is small and deliberately so. It covers what a pipeline, a terminal or an integration needs: Full detail, including every response field, is in the API reference.
The API is unversioned in the URL. There is no /v1 prefix. The 1.0.0 in the reference is a documentation version, not a server version.

Scoping

An API key is bound to one user and one workspace. Every request pins the workspace to the key’s, so a key issued for workspace A can never read or write workspace B, even if the owning person belongs to both. If that person is later removed from the workspace, the key stops working. Every list and lookup is workspace-scoped. A resource in another workspace returns 404, never 403, so the API does not leak the existence of things you cannot see. A key held by someone with the viewer role is read-only: any request that is not GET, HEAD or OPTIONS is rejected with 403 and code: "read_only_role".

Rate limits

A throttled request returns 429 with { "error": …, "retryAfter": <seconds> } and a Retry-After header. There are no X-RateLimit-* headers, so do not write a client that depends on them. Rate limits are separate from plan quotas. Exhausting the workspace’s monthly run allowance also returns 429, but with no Retry-After.

Request rules

  • JSON bodies are capped at 1 MB.
  • Any string containing a NUL byte rejects the whole request with 400.
  • Schema failures return 400 with an issues array naming each problem.

Starting a run

POST /api/runs/trigger responds 202 Accepted with a run id. It does not wait for the run. Poll GET /api/runs/{id} until the status is terminal, or let the CLI do it for you.

What the API does not do

  • No outbound webhooks. Testorim will not call your server when a run finishes. Trigger the run yourself and read the result.
  • No streaming over HTTP. Live screenshots go over the app’s WebSocket, which is session-authenticated and not part of the API-key surface.
  • No billing, org or integration management. Those are app-only.