---
title: "Capabilities · intentic sandbox API"
description: "The outside systems this sandbox is wired into, and connecting a new one. Every route in the capabilities group of the intentic sandbox API, with its input, its answer and a playground."
url: "https://intentic.dev/api/capabilities/"
---

Connected systems

# Capabilities

The outside systems this sandbox is wired into, and connecting a new one

**On this page (11 sections)**

- [Everything this sandbox is connected to](#capabilities-list)
- [Connect something, or change a connection](#capabilities-add)
- [Disconnect something](#capabilities-remove)
- [Rename a connection](#capabilities-rename)
- [Replace a stored credential](#capabilities-setSecret)
- [Re-check one connection](#capabilities-status)
- [A connection's settings, credentials included](#capabilities-connection)
- [Read a plugin marketplace](#capabilities-marketplace)
- [Stop suggesting this connection](#capabilities-dismiss)
- [Sign in to a connection by hand](#capabilities-login)
- [Mint a one-time code](#capabilities-otp)

A capability is a system the agent can reach: a forge account, a chat server, a database, one of your own machines. These routes connect and disconnect them, carry the credential each needs, report whether a connection is live, and drive the interactive parts of a sign-in, including a one-time code.

11 calls. Pick one to open it, or use the list on the right.

**GET`/capabilities` Everything this sandbox is connected to**

Each connection with its live state, the settings that are safe to show, and the names of the credentials it holds. The values of those credentials are never in the answer, on any route but one.

### What you send

Nothing. Call it as it is.

### What comes back

| Field | Type |
| --- | --- |
| `capabilities` What this sandbox is connected to | object[] |
| `id` The connection's id | string |
| `kind` What sort of thing it is | "devops" | "monorepo" | "mcp" | "service" … (19) |
| `status` Whether it is working | object |
| `state` Whether it is live, still coming… | "active" | "pending" | "error" | "inactive" |
| `detail` What is wrong, in words a… | string |
| `code` A short marker for that reason,… | string |
| `config` Its settings, minus anything secret | object |
| `secrets` Which credentials it holds, by name | string[] |
| `recommendations` Things worth connecting, worked out from… | object[] |
| `card` Which connection is being suggested | string |
| `evidence` What was seen that prompted it:… | string |
| `reason` The same claim in words, without… | string |
| `prefill` Settings the scan could read, to… | object |

Try it answered in this tab

curl

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

TypeScript

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

const result = await sandbox.capabilities.list();
```

**POST`/capabilities` Connect something, or change a connection stream**

Writes a connection and streams the work of applying it, because some kinds provision real infrastructure and take a while. Sending an id that already exists edits that connection: this is the edit as well as the create. Since a caller is never shown stored credentials, it marks the ones it is leaving alone and the daemon fills them in, which is the only way to change one setting without retyping a key.

### What you send

| Field | Type | Where |
| --- | --- | --- |
| `when kind is "devops"` | shape | body |
| `id` required | string | body |
| `config` required | object | body |
| `when kind is "monorepo"` | shape | body |
| `id` required | string | body |
| `config` required | object | body |
| `when kind is "mcp"` | shape | body |
| `id` required | string | body |
| `config` required | object | body |
| `url` required Where the tool server answers | string | body |
| `token` The credential it needs, if any | string | body |
| `when kind is "service"` | shape | body |
| `id` required | string | body |
| `config` required | object | body |
| `service` required Which service to provision | "signoz" | "outline" | "paperless" | "openproject" … (6) | body |
| `domain` required The address it should answer on | string | body |
| `on` required Which machine to put it on | string | body |
| `expose` required How it should be reachable | string | body |
| `when kind is "integration"` | shape | body |
| `id` required | string | body |
| `config` required | object | body |
| `provider` required Which outside service's credential to make… | "stripe" | body |
| `when kind is "cli"` | shape | body |
| `id` required | string | body |
| `config` required | object | body |
| `provider` required Which tool to give the agent | string | body |
| `when kind is "plugin"` | shape | body |
| `id` required | string | body |
| `config` required | object | body |
| `url` required The repository to take the plugin… | string | body |
| `ref` A branch, tag or commit to… | string | body |
| `path` Where inside the repository the plugin… | string | body |
| `token` A credential for a private repository | string | body |
| `when kind is "extension"` | shape | body |
| `id` required | string | body |
| `config` required | object | body |
| `url` required The repository to take the extension… | string | body |
| `ref` required The exact commit to install, in… | string | body |
| `path` Where inside the repository the extension… | string | body |
| `token` A credential for a private repository | string | body |
| `tier` Whether installing this donates credits to… | "free" | "premium" | body |
| `registry` Which registry this install came from,… | string | body |
| `when kind is "ssh"` | shape | body |
| `id` required | string | body |
| `config` required | object | body |
| `when auth is "key"` | shape | body |
| `host` required The machine's address | string | body |
| `port` Which port it listens on | number | body |
| `user` required Which user to connect as | string | body |
| `privateKey` required The private key, whole | string | body |
| `when auth is "password"` | shape | body |
| `host` required The machine's address | string | body |
| `port` Which port it listens on | number | body |
| `user` required Which user to connect as | string | body |
| `password` required The password | string | body |
| `when kind is "vpn"` | shape | body |
| `id` required | string | body |
| `config` required | object | body |
| `when provider is "wireguard"` | shape | body |
| `config` required | string | body |
| `autoConnect` | "on" | "off" | body |
| `when provider is "fortinet"` | shape | body |
| `server` required | string | body |
| `port` | integer | body |
| `username` required | string | body |
| `password` required | string | body |
| `trustedCert` | string | body |
| `realm` | string | body |
| `autoConnect` | "on" | "off" | body |
| `when provider is "ipsec"` | shape | body |
| `server` required | string | body |
| `presharedKey` required | string | body |
| `localId` | string | body |
| `remoteId` | string | body |
| `username` | string | body |
| `password` | string | body |
| `ikeVersion` | "1" | "2" | body |
| `pfs` | "on" | "off" | body |
| `dhGroup` | "2" | "5" | "14" | "15" … (7) | body |
| `aggressive` | "on" | "off" | body |
| `routedNetworks` | string | body |
| `autoConnect` | "on" | "off" | body |
| `when kind is "exit"` | shape | body |
| `id` required | string | body |
| `config` required | object | body |
| `when provider is "tor"` | shape | body |
| `country` | string | body |
| `autoStart` | "on" | "off" | body |
| `when provider is "vpngate"` | shape | body |
| `country` | string | body |
| `autoStart` | "on" | "off" | body |
| `when provider is "wireguard"` | shape | body |
| `config` required | string | body |
| `country` | string | body |
| `autoStart` | "on" | "off" | body |
| `when kind is "docker"` | shape | body |
| `id` required | string | body |
| `config` required | object | body |
| `gpu` | "on" | "off" | body |
| `registryMirror` | string | body |
| `insecureRegistries` | string | body |
| `addressPool` | string | body |
| `when kind is "browser"` | shape | body |
| `id` required | string | body |
| `config` required | object | body |
| `platform` required | string | body |
| `username` | string | body |
| `password` | string | body |
| `identity` | string | body |
| `purpose` | string | body |
| `openedAt` | string | body |
| `exit` | string | body |
| `when kind is "identity"` | shape | body |
| `id` required | string | body |
| `config` required | object | body |
| `email` required | string | body |
| `password` | string | body |
| `mailbox` | string | body |
| `loginUrl` | string | body |
| `openAccounts` | "on" | "off" | body |
| `exit` | string | body |
| `when kind is "host"` | shape | body |
| `id` required | string | body |
| `config` required | object | body |
| `shell` | "on" | "off" | body |
| `write` | "on" | "off" | body |
| `screen` | "on" | "off" | body |
| `control` | "on" | "off" | body |
| `sandboxes` | "on" | "off" | body |
| `sandboxRemove` | "on" | "off" | body |
| `roots` | string | body |
| `platform` required | string | body |
| `when kind is "agent"` | shape | body |
| `id` required | string | body |
| `config` required | object | body |
| `command` required | string | body |
| `name` | string | body |
| `env` | string | body |
| `loginCommand` | string | body |
| `when kind is "endpoint"` | shape | body |
| `id` required | string | body |
| `config` required | object | body |
| `baseUrl` required | string | body |
| `protocol` | "openai" | "anthropic" | body |
| `apiKey` | string | body |
| `headers` | string | body |
| `when kind is "localmodel"` | shape | body |
| `id` required | string | body |
| `config` required | object | body |
| `model` required | string | body |
| `gpu` | "on" | "off" | body |
| `url` | string | body |
| `context` | "16384" | "32768" | "65536" | "131072" | "custom" | body |
| `contextTokens` | integer | body |
| `when kind is "wallet"` | shape | body |
| `id` required | string | body |
| `config` required | object | body |
| `network` | "eip155:8453" | "eip155:84532" | body |
| `address` | string | body |
| `perPaymentMaxUsd` | string | body |
| `autoApproveUnderUsd` | string | body |
| `dailyCapUsd` | string | body |
| `allow` | string | body |
| `deny` | string | body |

### What comes back

| Field | Type |
| --- | --- |
| `when event is "message"` | shape |
| `data` | object |
| `kind` | string |
| `id` | string |
| `retry` | number |
| `when event is "done"` | shape |
| `data` | unknown |
| `id` | string |
| `retry` | number |
| `when event is "error"` | shape |
| `data` | unknown |
| `id` | string |
| `retry` | number |

Try it answered in this tab

curl

```bash
curl -N -X POST "$SANDBOX/capabilities" \
 -H "x-intentic-control: $INTENTIC_TOKEN" \
 -H "content-type: application/json" \
 -d '{"id":"a1b2c3d4","kind":"devops","config":{}}'
```

TypeScript

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

const result = await sandbox.capabilities.add({
 "id": "a1b2c3d4",
 "kind": "devops",
 "config": {}
});
```

**DELETE`/capabilities/{id}` Disconnect something**

Tears a connection down. The kinds that own real infrastructure refuse, because deleting those would be losing data rather than losing a connection.

### What you send

| Field | Type | Where |
| --- | --- | --- |
| `id` required Which connection | string | address |

### What comes back

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

Try it answered in this tab

curl

```bash
curl -X DELETE "$SANDBOX/capabilities/a1b2c3d4" \
 -H "x-intentic-control: $INTENTIC_TOKEN"
```

TypeScript

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

const result = await sandbox.capabilities.remove({
 "id": "a1b2c3d4"
});
```

**POST`/capabilities/{id}/rename` Rename a connection**

Carries everything the old name keyed across with it: a browser profile and its logins, an enrolled machine, an extension's copy of its source. Removing and re-adding would lose exactly the state that made the connection worth keeping. Kinds whose name is part of what they are refuse.

### What you send

| Field | Type | Where |
| --- | --- | --- |
| `id` required | string | address |
| `to` required | string | body |

### What comes back

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

Try it answered in this tab

curl

```bash
curl -X POST "$SANDBOX/capabilities/a1b2c3d4/rename" \
 -H "x-intentic-control: $INTENTIC_TOKEN" \
 -H "content-type: application/json" \
 -d '{"to":"src/server.ts"}'
```

TypeScript

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

const result = await sandbox.capabilities.rename({
 "id": "a1b2c3d4",
 "to": "src/server.ts"
});
```

**POST`/capabilities/{id}/secret` Replace a stored credential**

Swaps one connection's key or token for a new one and re-applies it, without touching any of its other settings.

### What you send

| Field | Type | Where |
| --- | --- | --- |
| `id` required Which connection | string | address |
| `value` required The new credential | string | body |

### What comes back

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

Try it answered in this tab

curl

```bash
curl -X POST "$SANDBOX/capabilities/a1b2c3d4/secret" \
 -H "x-intentic-control: $INTENTIC_TOKEN" \
 -H "content-type: application/json" \
 -d '{"value":"…"}'
```

TypeScript

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

const result = await sandbox.capabilities.setSecret({
 "id": "a1b2c3d4",
 "value": "…"
});
```

**GET`/capabilities/{id}/status` Re-check one connection**

Probes a single connection right now, for a screen that wants to refresh one row rather than the whole list.

### What you send

| Field | Type | Where |
| --- | --- | --- |
| `id` required Which connection | string | address |

### What comes back

| Field | Type |
| --- | --- |
| `state` Whether it is live, still coming… | "active" | "pending" | "error" | "inactive" |
| `detail` What is wrong, in words a… | string |
| `code` A short marker for that reason,… | string |

Try it answered in this tab

curl

```bash
curl "$SANDBOX/capabilities/a1b2c3d4/status" \
 -H "x-intentic-control: $INTENTIC_TOKEN"
```

TypeScript

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

const result = await sandbox.capabilities.status({
 "id": "a1b2c3d4"
});
```

**GET`/capabilities/{id}/connection` A connection's settings, credentials included**

The one call that hands back stored secrets, so an extension's own backend can dial the service behind a connection. Never answered for a signed-in person: only a machine credential reaches it, and an extension's only if its manifest asked for this route out loud at install time.

### What you send

| Field | Type | Where |
| --- | --- | --- |
| `id` required Which connection | string | address |

### What comes back

| Field | Type |
| --- | --- |
| `id` The connection's id | string |
| `kind` What sort of thing it is | string |
| `config` Its settings exactly as stored, credentials… | object |

Try it answered in this tab

curl

```bash
curl "$SANDBOX/capabilities/a1b2c3d4/connection" \
 -H "x-intentic-control: $INTENTIC_TOKEN"
```

TypeScript

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

const result = await sandbox.capabilities.connection({
 "id": "a1b2c3d4"
});
```

**POST`/capabilities/marketplace` Read a plugin marketplace**

Resolves a plugin marketplace source into the list of connections you could install from it.

### What you send

| Field | Type | Where |
| --- | --- | --- |
| `url` required The registry to read | string | body |
| `token` A credential for a private one | string | body |

### What comes back

| Field | Type |
| --- | --- |
| `name` What the registry calls itself | string |
| `plugins` What it lists, each with the… | object[] |
| `name` | string |
| `description` | string |
| `version` | string |
| `kind` | "plugin" | "extension" |
| `trust` | "verified" | "listed" | "blocked" |
| `trustReason` | string |
| `securityReview` | object |
| `sha` | string |
| `url` | string |
| `path` | string |
| `policy` | string |
| `reviewer` | string |
| `reviewedAt` | string |
| `runId` | string |
| `deterministic` | object |
| `policy` | string |
| `scanner` | string |
| `version` | string |
| `runId` | string |
| `admitted` | boolean |
| `securityFix` | boolean |
| `tier` | "free" | "premium" |
| `category` | string |
| `art` | string |
| `logo` | string |
| `icon` | string |
| `homepage` | string |
| `install` | object |
| `url` | string |
| `ref` | string |
| `path` | string |
| `stars` | integer |
| `pushedAt` | string |
| `checks` | object |
| `sha` | string |
| `manifest` | string |
| `bundle` | string |
| `engines` | string |

Try it answered in this tab

curl

```bash
curl -X POST "$SANDBOX/capabilities/marketplace" \
 -H "x-intentic-control: $INTENTIC_TOKEN" \
 -H "content-type: application/json" \
 -d '{"url":"https://sandbox-a1b2c3d4e5f6.intentic.dev","token":"ict_9wQ4rTz8kLmN3pXbV7hJ"}'
```

TypeScript

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

const result = await sandbox.capabilities.marketplace({
 "url": "https://sandbox-a1b2c3d4e5f6.intentic.dev",
 "token": "ict_9wQ4rTz8kLmN3pXbV7hJ"
});
```

**DELETE`/capabilities/recommendations/{card}` Stop suggesting this connection**

Not needed, for now. Nothing is torn down. The suggestion comes back if what prompted it in the workspace changes, because what is remembered is the evidence, not the refusal.

### What you send

| Field | Type | Where |
| --- | --- | --- |
| `card` required Which suggestion to stop making | string | address |

### What comes back

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

Try it answered in this tab

curl

```bash
curl -X DELETE "$SANDBOX/capabilities/recommendations/%E2%80%A6" \
 -H "x-intentic-control: $INTENTIC_TOKEN"
```

TypeScript

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

const result = await sandbox.capabilities.dismiss({
 "card": "…"
});
```

**POST`/capabilities/{id}/login` Sign in to a connection by hand**

Opens the connection's own sign-in in a terminal a person can type into, for the flows that need a code pasted or a device confirmed. The answer names the terminal to attach to.

### What you send

| Field | Type | Where |
| --- | --- | --- |
| `id` required Which connection | string | address |

### What comes back

| Field | Type |
| --- | --- |
| `session` The terminal the sign-in is happening… | string |

Try it answered in this tab

curl

```bash
curl -X POST "$SANDBOX/capabilities/a1b2c3d4/login" \
 -H "x-intentic-control: $INTENTIC_TOKEN"
```

TypeScript

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

const result = await sandbox.capabilities.login({
 "id": "a1b2c3d4"
});
```

**GET`/capabilities/{id}/otp` Mint a one-time code**

Generates a single two-factor code from a stored seed. The one credential-adjacent read an agent is allowed, and it is safe because a code expires in seconds and never reveals the seed, so an agent can answer a prompt without ever holding the factor.

### What you send

| Field | Type | Where |
| --- | --- | --- |
| `id` required Which connection | string | address |

### What comes back

| Field | Type |
| --- | --- |
| `code` The code | string |
| `secondsRemaining` How long it lasts | number |

Try it answered in this tab

curl

```bash
curl "$SANDBOX/capabilities/a1b2c3d4/otp" \
 -H "x-intentic-control: $INTENTIC_TOKEN"
```

TypeScript

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

const result = await sandbox.capabilities.otp({
 "id": "a1b2c3d4"
});
```

More in Connected systems

[Next Secrets →](https://intentic.dev/api/secrets/)
