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

Ship and share

# Pipelines

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

**On this page (5 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)

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 |
| `hookRecipe` What to paste into the repository's… | 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 |
| `workflow` Which workflow it is a run… | string |
| `branch` Which branch | string |
| `sha` Which commit | string |
| `status` How it is going | "queued" | "running" | "success" | "failed" … (6) |
| `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[] |
| `failures` Every main-line branch failing right now,… | object[] |
| `repo` Which workspace repository | string |
| `branch` Which main-line branch | string |
| `since` When its first job failed, in… | number |
| `runId` The newest run that failed on… | number |
| `jobs` The jobs failing on it now,… | string[] |
| `fixer` The one conversation working on it,… | string |
| `decision` The latest thing decided about it:… | object |
| `kind` What was decided | "fix-up" | "reported" | "spent" |
| `reason` Why the fix agent handed it… | "turns" | "no-change" | "stopped" | "interrupted" … (7) |
| `conversationId` The conversation working on it, when… | string |
| `at` When that was decided, in milliseconds | number |
| `detail` One short sentence on why, in… | string |

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 | "queued" | "running" | "success" | "failed" … (6) |
| `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 |
| `account` Which connected account of that provider… | string | body |
| `harness` Which agentic loop runs it | "native" | "claude-code" | body |
| `effort` How hard that model should think,… | string | body |
| `thinking` Whether this model reasons before it… | boolean | body |
| `fast` Ask for this model's work at… | boolean | body |
| `fallback` The model a new chat opens… | object | body |
| `agent` required Which provider | string | body |
| `model` required Which of its models | string | body |
| `account` Which connected account of that provider… | string | body |
| `harness` Which agentic loop runs it | "native" | "claude-code" | body |
| `effort` How hard that model should think,… | string | body |
| `thinking` Whether this model reasons before it… | boolean | body |
| `fast` Ask for this model's work at… | boolean | body |
| `mode` What to do about the attempt… | "continue" | "start-over" | body |
| `force` Open the conversation even when every… | boolean | 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","account":"work","harness":"native","effort":"…","thinking":true,"fast":true},"fallback":{"agent":"…","model":"claude-sonnet-4-6","account":"work","harness":"native","effort":"…","thinking":true,"fast":true},"mode":"continue","force":false}'
```

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",
 "account": "work",
 "harness": "native",
 "effort": "…",
 "thinking": true,
 "fast": true
 },
 "fallback": {
 "agent": "…",
 "model": "claude-sonnet-4-6",
 "account": "work",
 "harness": "native",
 "effort": "…",
 "thinking": true,
 "fast": true
 },
 "mode": "continue",
 "force": false
});
```

More in Ship and share

[Next Offloaded work →](https://intentic.dev/api/offload/)
