- 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 withtrk_, is shown once, and acts for your whole organization. Send it on every request:
401 with ApiKeyRefused. GET /health and GET /egress-ips need no key.
Start a run
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
idis the event’s or frame’sseq. - A
heartbeatmessage, 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
seqreceived asafter, or let your SSE client reconnect: theLast-Event-IDheader it sends is used whenafteris absent.
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 /healthanswers204when the API is up.GET /egress-ipslists the addresses Tracks calls MCP servers from, to allow on a server that filters callers.