GET /api/v1/jobs
Lists the caller’s async jobs. Payload and artifact manifest are omitted — use GET /api/v1/forecasts/:id for full job state (forecasts only).
Query parameters
| Param | Default | Notes |
|---|---|---|
page | 1 | |
limit | 50 | 1–200. |
sort | created_at | id, created_at, settled_at, eur_cents_final. |
order | desc | asc / desc. |
status | (none) | Optional: queued, running, completed, failed, canceled. |
pipeline_type | (none) | Optional filter; forecast is the only emitted value. |
Call the endpoint
bash
curl -sS -H "Authorization: Bearer $SYBILION_API_TOKEN" \
"https://api.sybilion.dev/api/v1/jobs?page=1&limit=20&status=completed"python
for page in client.iter_jobs_pages(limit=50, status="completed"):
for job in page.jobs:
print(job.job_id, job.status, job.eur_cents_final)go
err := c.ForEachJobsPage(context.Background(), "created_at", "desc", 50,
func(ctx context.Context, page *api.ApiV1JobsGet200Response) (bool, error) {
for _, j := range page.GetJobs() {
fmt.Println(j.GetJobId(), j.GetStatus(), j.GetEurCentsFinal())
}
return true, nil
},
)
if err != nil {
log.Fatal(err)
}r
library(sybilion)
cl <- sybilion_client(token = Sys.getenv("SYBILION_API_TOKEN"))
cl$iter_jobs_pages(
function(page) {
for (j in page$jobs) cat(j$job_id, j$status, j$eur_cents_final, "\n")
TRUE
},
status = "completed"
)java
import com.sybilion.Client;
import com.sybilion.Options;
Client c = new Client(Options.builder().token(System.getenv("SYBILION_API_TOKEN")).build());
c.forEachJobsPage("created_at", "desc", 50, "completed", null, page -> {
for (var j : page.getJobs()) {
System.out.println(j.getJobId() + " " + j.getStatus() + " " + j.getEurCentsFinal());
}
return true;
});Response
json
{
"jobs": [
{
"job_id": "1f2a8b3e-4c5d-46d7-9a01-2b3c4d5e6f70",
"pipeline_type": "forecast",
"status": "completed",
"created_at": "2026-04-30T10:00:00Z",
"settled": true,
"settled_at": "2026-04-30T10:05:42Z",
"eur_cents_final": 3,
"terminal_reason": null
}
],
"pagination": {
"page": 1,
"limit": 20,
"total": 8,
"total_pages": 1,
"sort": "created_at",
"order": "desc"
}
}Field reference
jobs[]
| Field | Meaning |
|---|---|
job_id | UUID of the job. Use with GET /api/v1/forecasts/:id for full state. |
pipeline_type | Always "forecast" currently. |
status | One of queued, running, completed, failed, canceled. |
created_at | RFC3339 timestamp of submission. |
settled | true once the job has reached a terminal state and billing settled. |
settled_at | RFC3339 timestamp of settlement, or null until then. |
eur_cents_final | Final charge in EUR cents, or null before settlement. |
terminal_reason | Failure or cancellation reason string, or null. |
workflow_id and run_id may appear as optional fields — they are opaque internal identifiers, not part of the public API contract.
pagination
| Field | Meaning |
|---|---|
page | Current 1-indexed page. |
limit | Page size used for this response. |
total | Total matching jobs across all pages. |
total_pages | ceil(total / limit). |
sort | Sort field used. |
order | Sort direction used. |
Visibility
When a post-settlement visibility window is in effect, older jobs are filtered out here as well as on the forecast detail endpoint — no row appears in the list if GET /api/v1/forecasts/:id would respond with 404.
Common errors
| Code | Cause | What to do |
|---|---|---|
400 | Invalid query parameter. | Check the query parameters table above. |
401 | Missing or invalid bearer token. | Check the API key. |
429 | Rate limit exceeded. | Wait before retrying. Check tier limits on /tiers. |