Skip to main content
The API starts runs and follows them, uploads files, connects MCP servers, creates and launches experiments, and lists your library. The OpenAPI document describes every endpoint, to generate a client in any language.
  • Base URL: https://tracks.alpic.ai/api
  • Format: JSON request and response bodies, with Content-Type: application/json.

Authentication

Create a key in API keys in the web app. It starts with trk_, is shown once, and acts for your whole organization. Send it on every request:
A missing, malformed or revoked key gets a 401 with ApiKeyRefused. GET /health and GET /egress-ips need no key.

Start a run

It answers 201 with the run, its status preparing. Then follow it with GET /runs/{id}/events/stream, or poll GET /runs/{id} until its status is ended.

Errors

An error is a JSON object with a _tag naming it and a message saying what happened, in plain words:
Any other 5xx is an unexpected error on our side: retry later. Retry a POST /runs with the same Idempotency-Key, so it can’t start a second run.

Retry safely with Idempotency-Key

POST /runs takes an optional Idempotency-Key header: any value you choose, up to 255 characters. A request with a key already used in your organization returns the run the first request created, without starting another, whatever its body. Send one whenever you may retry, after a timeout or a 5xx. No other endpoint takes one. Ending or canceling is safe to repeat: on a run that has ended, it does nothing.

Pagination

Lists return { "data": [...], "has_more": true }. While has_more is true, ask for the next page by passing the last item received as after: These take limit, from 1 to 1000, 100 by default. GET /runs also filters by label=key:value, repeated to require several labels. The other lists (experiments, an experiment’s executions, an execution’s slots, connections) return every item at once, with has_more always false.

Follow a run live

Two endpoints send a run’s recording as server-sent events as it happens:
  • Each message’s id is the event’s or frame’s seq.
  • A heartbeat message, with empty data, comes every 30 seconds to keep the connection open.
  • The connection closes once the run has ended and everything was sent.
  • It may also close earlier. To pick up where it stopped, call again with the last seq received as after, or let your SSE client reconnect: the Last-Event-ID header it sends is used when after is absent.
To know whether a closed connection means the run ended, check GET /runs/{id}.

Limits

Tracks sets no rate limit on requests and no cap on how many runs work at once. Your balance and each run’s budget bound what you spend: runs start only while your balance is above $0.

Other endpoints

  • GET /health answers 204 when the API is up.
  • GET /egress-ips lists the addresses Tracks calls MCP servers from, to allow on a server that filters callers.