---
title: "Pipelines · intentic sandbox API"
description: "Continuous integration runs, and asking an agent to fix a red one. Every route in the pipelines group of the intentic sandbox API, with its input, its answer and a playground."
url: "https://intentic.dev/api/ci/"
---

Ship and share

# Pipelines

Continuous integration runs, and asking an agent to fix a red one

**On this page (6 sections)**

- [Pipeline runs across the repos](#ci-runs)
- [Run a pipeline again](#ci-rerun)
- [Cancel a pipeline run](#ci-cancel)
- [The steps inside one pipeline run](#ci-jobs)
- [Put an agent on a broken pipeline](#ci-fix)
- [Mark the pipelines as read](#ci-seen)

Read the runs and the jobs inside them, re-run or cancel one, and mark the board read. The interesting one hands a failing run to an agent rather than to you.

**GET`/ci/runs` Pipeline runs across the repos**

What the forges are reporting for every workspace repo that has a remote, served from a cache and filled in on demand. Repos whose notifications are not wired up say so.

### What you send

Nothing. Call it as it is.

### What comes back

| Field | Type |
| --- | --- |
| `repos` Which workspace repositories are wired to… | object[] |
| `repo` Which workspace repository | string |
| `host` Which forge it lives on | "github" | "gitlab" |
| `project` The project there | string |
| `url` Its page on the forge | string |
| `hookWarning` Present when the sandbox could not… | string |
| `runs` Runs across all of them, newest… | object[] |
| `repo` Which workspace repository it belongs to | string |
| `host` Which forge is running it | "github" | "gitlab" |
| `project` The project there, as that forge… | string |
| `runId` The forge's own id for the… | number |
| `title` The run's headline, usually the commit… | string |
| `authorName` Who the forge credits for setting… | string |
| `authorAvatarUrl` Their picture, hosted by the forge | string |
| `trigger` What set it off, in the… | string |
| `branch` Which branch | string |
| `sha` Which commit | string |
| `status` How it is going | "running" | "success" | "failed" | "canceled" … (5) |
| `url` Its page on the forge | string |
| `createdAt` When it started, in milliseconds | number |
| `durationSeconds` How long it took | number |
| `failedJobs` What broke, by name | string[] |
| `seenAt` When this was last looked at,… | number |

Try it answered in this tab

curl

```bash
curl "$SANDBOX/ci/runs" \
 -H "x-intentic-control: $INTENTIC_TOKEN"
```

TypeScript

```typescript
import { sandbox } from "@intentic/sandbox-client";

const result = await sandbox.ci.runs();
```

**POST`/ci/runs/rerun` Run a pipeline again**

Asks the forge to re-run one pipeline. The daemon only passes the request along.

### What you send

| Field | Type | Where |
| --- | --- | --- |
| `repo` required Which workspace repository | string | body |
| `runId` required Which run, by the forge's own… | number | body |

### What comes back

| Field | Type |
| --- | --- |
| `ok` Always true | true |

Try it answered in this tab

curl

```bash
curl -X POST "$SANDBOX/ci/runs/rerun" \
 -H "x-intentic-control: $INTENTIC_TOKEN" \
 -H "content-type: application/json" \
 -d '{"repo":"root","runId":1}'
```

TypeScript

```typescript
import { sandbox } from "@intentic/sandbox-client";

const result = await sandbox.ci.rerun({
 "repo": "root",
 "runId": 1
});
```

**POST`/ci/runs/cancel` Cancel a pipeline run**

Asks the forge to stop a run in progress.

### What you send

| Field | Type | Where |
| --- | --- | --- |
| `repo` required Which workspace repository | string | body |
| `runId` required Which run, by the forge's own… | number | body |

### What comes back

| Field | Type |
| --- | --- |
| `ok` Always true | true |

Try it answered in this tab

curl

```bash
curl -X POST "$SANDBOX/ci/runs/cancel" \
 -H "x-intentic-control: $INTENTIC_TOKEN" \
 -H "content-type: application/json" \
 -d '{"repo":"root","runId":1}'
```

TypeScript

```typescript
import { sandbox } from "@intentic/sandbox-client";

const result = await sandbox.ci.cancel({
 "repo": "root",
 "runId": 1
});
```

**POST`/ci/runs/jobs` The steps inside one pipeline run**

Each job in a run with its outcome, which is where you look to find out what actually broke.

### What you send

| Field | Type | Where |
| --- | --- | --- |
| `repo` required Which workspace repository | string | body |
| `runId` required Which run, by the forge's own… | number | body |

### What comes back

| Field | Type |
| --- | --- |
| `jobs` The steps inside one run | object[] |
| `name` The job's name | string |
| `status` How it went | "running" | "success" | "failed" | "canceled" … (5) |
| `stage` Which stage it belongs to, where… | string |
| `needs` Which jobs in this run it… | string[] |
| `startedAt` When it began, in milliseconds | number |
| `finishedAt` When it ended, in milliseconds | number |
| `durationSeconds` How long it took | number |
| `webUrl` Its page on the forge, which… | string |

Try it answered in this tab

curl

```bash
curl -X POST "$SANDBOX/ci/runs/jobs" \
 -H "x-intentic-control: $INTENTIC_TOKEN" \
 -H "content-type: application/json" \
 -d '{"repo":"root","runId":1}'
```

TypeScript

```typescript
import { sandbox } from "@intentic/sandbox-client";

const result = await sandbox.ci.jobs({
 "repo": "root",
 "runId": 1
});
```

**POST`/ci/fix` Put an agent on a broken pipeline**

Opens a fresh isolated conversation already holding the failure: which job, which repo, what it said. The answer names the conversation so you can open it.

### What you send

| Field | Type | Where |
| --- | --- | --- |
| `repo` required Which workspace repository | string | body |
| `runId` required Which run, by the forge's own… | number | body |
| `pick` Which model to open the conversation… | object | body |
| `agent` required Which provider | string | body |
| `model` required Which of its models | string | body |

### What comes back

| Field | Type |
| --- | --- |
| `conversationId` The conversation that was opened, already… | string |

Try it answered in this tab

curl

```bash
curl -X POST "$SANDBOX/ci/fix" \
 -H "x-intentic-control: $INTENTIC_TOKEN" \
 -H "content-type: application/json" \
 -d '{"repo":"root","runId":1,"pick":{"agent":"…","model":"claude-sonnet-4-6"}}'
```

TypeScript

```typescript
import { sandbox } from "@intentic/sandbox-client";

const result = await sandbox.ci.fix({
 "repo": "root",
 "runId": 1,
 "pick": {
 "agent": "…",
 "model": "claude-sonnet-4-6"
 }
});
```

**POST`/ci/seen` Mark the pipelines as read**

Silences the badge for breakages already looked at. Takes nothing, because the view is read as a whole, and the daemon stamps its own clock so a browser with the wrong time cannot mark future failures as already seen.

### What you send

Nothing. Call it as it is.

### What comes back

| Field | Type |
| --- | --- |
| `seenAt` The timestamp that was written, handed… | number |

Try it answered in this tab

curl

```bash
curl -X POST "$SANDBOX/ci/seen" \
 -H "x-intentic-control: $INTENTIC_TOKEN"
```

TypeScript

```typescript
import { sandbox } from "@intentic/sandbox-client";

const result = await sandbox.ci.seen();
```

More in Ship and share

[Next Pre-push check →](https://intentic.dev/api/prepush/)
