---
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."
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 (14 sections)**

- [Everything this sandbox is connected to](#capabilities-list)
- [Connect something, or change a connection](#capabilities-add)
- [Test a connection's settings without saving them](#capabilities-probe)
- [Generate an SSH key for a connection](#capabilities-sshKey)
- [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)
- [The versions a repository offers](#capabilities-refs)
- [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.

14 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" | "cli" … (21) |
| `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 |
| `settling` True while something under way will… | boolean |
| `config` Its settings, minus anything secret | object |
| `secrets` Which credentials it holds, by name | string[] |
| `recommendations` Things worth connecting, worked out from… | object[] |
| `entry` Which catalog entry 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 "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 |
| `commit` The exact commit installed, in full,… | 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 |
| `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 "generated"` | 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 half of the generated… | 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 "netdisk"` | shape | body |
| `id` required | string | body |
| `config` required | object | body |
| `provider` required | "smb" | body |
| `server` required The NAS or file server: a… | string | body |
| `share` required The share name, the first path… | string | body |
| `path` A folder inside the share to… | string | body |
| `username` required The account the sandbox mounts as | string | body |
| `password` Its password | string | body |
| `domain` The Windows domain or workgroup, only… | string | body |
| `access` Whether the agent may write to… | "read" | "readwrite" | body |
| `version` The SMB dialect to insist on | "auto" | "3.1.1" | "3.0" | "2.1" … (5) | body |
| `autoMount` | "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 "device"` | 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 |
| `destructive` | "on" | "off" | body |
| `roots` | string | body |
| `platform` required | string | body |
| `when kind is "webext"` | shape | body |
| `id` required | string | body |
| `config` required | object | body |
| `read` | "on" | "off" | body |
| `act` | "on" | "off" | body |
| `screenshot` | "on" | "off" | body |
| `cookies` | "on" | "off" | body |
| `confirm` | "sensitive" | "always" | "never" | body |
| `platform` required | string | body |
| `when kind is "phone"` | shape | body |
| `id` required | string | body |
| `config` required | object | body |
| `screen` | "on" | "off" | body |
| `control` | "on" | "off" | body |
| `files` | "on" | "off" | body |
| `write` | "on" | "off" | body |
| `notifications` | "on" | "off" | body |
| `apps` | "on" | "off" | body |
| `destructive` | "on" | "off" | body |
| `confirm` | "sensitive" | "always" | "never" | 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 |
| `… and 1 more shapes` In the OpenAPI document | shape | 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": {}
});
```

**POST`/capabilities/probe` Test a connection's settings without saving them**

Dials the service the way this connection would and hands back what it said, before anything is written. The answer is the service's own confirmation or its exact refusal, so a wrong token or an unreachable host is found on the form rather than on a card afterwards.

### 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 "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 |
| `commit` The exact commit installed, in full,… | 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 |
| `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 "generated"` | 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 half of the generated… | 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 "netdisk"` | shape | body |
| `id` required | string | body |
| `config` required | object | body |
| `provider` required | "smb" | body |
| `server` required The NAS or file server: a… | string | body |
| `share` required The share name, the first path… | string | body |
| `path` A folder inside the share to… | string | body |
| `username` required The account the sandbox mounts as | string | body |
| `password` Its password | string | body |
| `domain` The Windows domain or workgroup, only… | string | body |
| `access` Whether the agent may write to… | "read" | "readwrite" | body |
| `version` The SMB dialect to insist on | "auto" | "3.1.1" | "3.0" | "2.1" … (5) | body |
| `autoMount` | "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 "device"` | 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 |
| `destructive` | "on" | "off" | body |
| `roots` | string | body |
| `platform` required | string | body |
| `when kind is "webext"` | shape | body |
| `id` required | string | body |
| `config` required | object | body |
| `read` | "on" | "off" | body |
| `act` | "on" | "off" | body |
| `screenshot` | "on" | "off" | body |
| `cookies` | "on" | "off" | body |
| `confirm` | "sensitive" | "always" | "never" | body |
| `platform` required | string | body |
| `when kind is "phone"` | shape | body |
| `id` required | string | body |
| `config` required | object | body |
| `screen` | "on" | "off" | body |
| `control` | "on" | "off" | body |
| `files` | "on" | "off" | body |
| `write` | "on" | "off" | body |
| `notifications` | "on" | "off" | body |
| `apps` | "on" | "off" | body |
| `destructive` | "on" | "off" | body |
| `confirm` | "sensitive" | "always" | "never" | 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 |
| `… and 1 more shapes` In the OpenAPI document | shape | body |

### What comes back

| Field | Type |
| --- | --- |
| `checked` Whether this connection can be tested… | boolean |
| `ok` Whether the service answered as itself | boolean |
| `message` What happened, in the words a… | string |
| `who` Who the service said the credential… | string |

Try it answered in this tab

curl

```bash
curl -X POST "$SANDBOX/capabilities/probe" \
 -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.probe({
 "id": "a1b2c3d4",
 "kind": "devops",
 "config": {}
});
```

**POST`/capabilities/ssh-key` Generate an SSH key for a connection**

Makes an ed25519 key pair inside the sandbox and answers with its public half, to authorize on the server, and a one-time token. The private half is never in the answer: it waits in the sandbox until an add sends the token where the private key goes, and lapses if none does within thirty minutes.

### What you send

Nothing. Call it as it is.

### What comes back

| Field | Type |
| --- | --- |
| `publicKey` The public half, as the one… | string |
| `token` Stands for the private half, which… | string |

Try it answered in this tab

curl

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

TypeScript

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

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

**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 |
| `settling` True while something under way will… | boolean |

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, and only for a connection of a kind that extension itself contributes.

### 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 |
| `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"
});
```

**POST`/capabilities/refs` The versions a repository offers**

Asks a git remote what it advertises and hands back every branch and tag with the commit it points at, plus which branch is its default. Nothing is cloned and nothing is written, so this is cheap enough to answer a form as someone types a repository into it.

### What you send

| Field | Type | Where |
| --- | --- | --- |
| `url` required The repository to ask | string | body |
| `token` A credential for a private one | string | body |
| `keeping` Which connection a VAULTED token belongs… | string | body |

### What comes back

| Field | Type |
| --- | --- |
| `defaultBranch` The branch the remote advertises as… | string |
| `refs` Every branch the remote advertises, then… | object[] |
| `name` The branch or tag as a… | string |
| `kind` | "branch" | "tag" |
| `sha` The commit it points at | string |

Try it answered in this tab

curl

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

TypeScript

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

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

**DELETE`/capabilities/recommendations/{entry}` 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 |
| --- | --- | --- |
| `entry` 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({
 "entry": "…"
});
```

**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 Needs →](https://intentic.dev/api/needs/)
