List signal runs
A signal's run history, newest first, with the job_id each run created.
GET
https://api.up2data.ai/v1/signals/{signal_id}/runsOne entry per tick. job_id is the batch job that run submitted; read its results with GET /v1/batch/{job_id} or GET /v1/batch/{job_id}/results. A deferred run was rate limited at submission and is retried after Retry-After under the same run_number; a failed run carries the error from its last attempt. signal_id is a path parameter; limit and offset are query parameters.
#Request
| Field | Type | Notes |
|---|---|---|
signal_idrequired | string | Path parameter. The signal_id returned by POST /signals. |
limit | integer | Query parameter. 1 to 200, default 50. |
offset | integer | Query parameter. Default 0. |
#Call it
curl -X GET "https://api.up2data.ai/v1/signals/9d1f4c2e-7b3a-4e8f-a1c5-2f6b8d9e0a11/runs?limit=50" \
-H "X-API-Key: YOUR_API_KEY"import requests
url = "https://api.up2data.ai/v1/signals/9d1f4c2e-7b3a-4e8f-a1c5-2f6b8d9e0a11/runs?limit=50"
headers = {
"X-API-Key": "YOUR_API_KEY",
}
response = requests.get(url, headers=headers)
print(response.json())const url = "https://api.up2data.ai/v1/signals/9d1f4c2e-7b3a-4e8f-a1c5-2f6b8d9e0a11/runs?limit=50";
const headers = {
"X-API-Key": "YOUR_API_KEY",
};
const response = await fetch(url, {
method: "GET",
headers,
});
const data = await response.json();
console.log(data);package main
import (
"fmt"
"io"
"net/http"
)
func main() {
url := "https://api.up2data.ai/v1/signals/9d1f4c2e-7b3a-4e8f-a1c5-2f6b8d9e0a11/runs?limit=50"
req, err := http.NewRequest("GET", url, nil)
if err != nil {
panic(err)
}
req.Header.Set("X-API-Key", "YOUR_API_KEY")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
respBody, _ := io.ReadAll(resp.Body)
fmt.Println(string(respBody))
}#Response
{
"data": {
"signal_id": "9d1f4c2e-7b3a-4e8f-a1c5-2f6b8d9e0a11",
"runs": [
{ "run_id": "4b8e0c1d-2a6f-4c3b-9e7d-5f1a2b3c4d5e", "run_number": 3, "scheduled_for": "2026-11-03T08:00:00Z", "started_at": "2026-11-03T08:00:00Z", "finished_at": "2026-11-03T08:00:01Z", "status": "succeeded", "attempts": 1, "job_id": "job_7hd92kfa", "error": null },
{ "run_id": "0c2d4e6f-8a1b-4c3d-9e5f-7a9b1c3d5e7f", "run_number": 2, "scheduled_for": "2026-11-02T08:00:00Z", "started_at": "2026-11-02T08:00:00Z", "finished_at": "2026-11-02T08:00:14Z", "status": "failed", "attempts": 3, "job_id": null, "error": "up2data responded 500: internal_error" },
{ "run_id": "1d3e5f7a-9b2c-4d4e-8f6a-0b2c4d6e8f0a", "run_number": 1, "scheduled_for": "2026-11-01T08:00:00Z", "started_at": "2026-11-01T08:00:00Z", "finished_at": "2026-11-01T08:00:01Z", "status": "succeeded", "attempts": 1, "job_id": "job_3xk81mqp", "error": null }
],
"total": 3,
"limit": 50,
"offset": 0
},
"meta": { "creditsUsed": 0, "creditsRemaining": 98413, "billed": false, "reason": "success", "requestId": "req_t4sk0001" }
}#Errors
| Status | Type | When | Billed |
|---|---|---|---|
| 400 | invalid_request | limit is outside 1 to 200 or offset is negative. | No |
| 404 | not_found | No signal with this signal_id in your organization, or signal_id is not a UUID. | No |
| 401 | invalid_api_key | Missing, malformed, or revoked key. | No |
| 429 | rate_limited | Over the 5,000 requests/min limit. Honor Retry-After. | No |
| 500 | internal_error | Something broke on the server side. | No |
| 503 | upstream_error | The scheduling service is unreachable. Safe to retry. | No |
See the Errors guide for every error type this version can return.