# List connection choices

GET

/v1/connection-choices

```sh
curl --request GET \
  --url 'https://example.com/v1/connection-choices?projectId=2489E9AD-2EE2-8E00-8EC9-32D5F69181C0&owner=me&includeRemoved=false&limit=25' \
  --header 'Authorization: Bearer <token>'
```

The project’s live choices in this server’s environment: which connection each agent or flow, or one of its tools, uses for an app. The project’s members may read them (`read` on the project): the company’s, and their own. A tenant admin reads every person’s too; with `owner=me`, anyone reads their own alone. Removed choices, a choice’s history, are listed only with `includeRemoved=true`. A choice of a connection that’s since been disconnected stays listed until it’s set again or removed.

## Authorizations

- **[bearerAuth](https://docs.kindgi.com/reference/api.md#bearerauth)**

## Parameters

### Query Parameters

**projectId**

required

string format: uuid

The project.

**agentId**

string

Only this agent’s.

**flowId**

string

Only this flow’s.

**app**

string

Only this app’s (its entry id).

**toolId**

string

Only this tool’s own choices.

**owner**

string

Allowed values: me

`me`: only the caller’s own, even for a tenant admin.

**includeRemoved**

boolean

`true` lists removed choices too.

**limit**

integer

default: 25 >= 1 <= 100

1..100. Default 25.

**cursor**

string

Where the previous page ended: its `nextCursor`, as it came. A runtime that seals cursors takes one only for the same list, filters and caller, within a day; otherwise `400 bad-input`, and the list starts again without it. Absent → first page.

## Responses

### 200

Page of choices.

application/json

object

**data**

required

Array\<object>

Which connection an agent or a flow uses for an app in a project, in one env: `agentId` or `flowId`, one of them. The company’s, or a person’s own (`person`), for their runs. With `toolId`, it’s that tool’s, which comes before the agent’s or flow’s. A choice is never changed: changing it removes it and makes a new one at the next version.

object

**choiceId**

required

string format: uuid

**projectId**

required

string format: uuid

**envName**

required

string

**agentId**

string

**flowId**

string

**app**

required

The app’s entry id (`google`): the connection’s.

string

**toolId**

The tool it’s for, with `need`. Absent: the agent’s or flow’s choice, for every tool’s need of the app.

string

**need**

The tool’s name for the connection (`calendar`), with `toolId`.

string

**connectionId**

required

The chosen connection, and a set’s default. A choice of a connection that’s since been disconnected stays until it’s set again or removed.

string format: uuid

**connectionIds**

A set: the connections a call of the tool may name one of (by its name), `connectionId` among them. A call that names none uses `connectionId`. Only a tool’s choice, for a tool that changes nothing. Absent for one connection.

Array\<string>

\>= 2 items <= 10 items

**person**

Whose choice it is, for a person’s connection: theirs alone to make, change or remove. Absent: the company’s.

object

**userId**

required

string

\>= 1 characters

**version**

required

From 1, per project, env, agent or flow, app, tool and need, and person.

integer

\>= 1

**createdAt**

required

string format: date-time

**createdBy**

required

string

**removedAt**

When it was removed, or replaced by a new choice. Only a removed choice has it.

string format: date-time

**removedBy**

string

**nextCursor**

string

**hasMore**

required

boolean

##### Examplegenerated

```json
{
  "data": [
    {
      "choiceId": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0",
      "projectId": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0",
      "envName": "example",
      "agentId": "example",
      "flowId": "example",
      "app": "example",
      "toolId": "example",
      "need": "example",
      "connectionId": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0",
      "connectionIds": [
        "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0"
      ],
      "person": {
        "userId": "example"
      },
      "version": 1,
      "createdAt": "2026-04-15T12:00:00Z",
      "createdBy": "example",
      "removedAt": "2026-04-15T12:00:00Z",
      "removedBy": "example"
    }
  ],
  "nextCursor": "example",
  "hasMore": true
}
```

### 400

No `projectId`, or one that is not a UUID; an `app` that is not an entry id; both `agentId` and `flowId`; an `owner` other than `me`; or an `includeRemoved` other than `true` or `false` (`bad-input`).

application/json

object

**error**

required

object

**code**

required

Stable machine-readable discriminant. Values match domain error codes (see `docs/API-ROUTE-CONVENTIONS.md` §4.3).

string

**message**

required

string

**details**

Optional, kind-specific.

object

**_key_**

additional properties

any

**requestId**

required

Server-assigned request id; also echoed via `X-Request-Id` header.

string

##### Examplegenerated

```json
{
  "error": {
    "code": "example",
    "message": "example",
    "details": {},
    "requestId": "example"
  }
}
```

### 401

Missing / malformed / expired / revoked bearer token.

application/json

object

**error**

required

object

**code**

required

Stable machine-readable discriminant. Values match domain error codes (see `docs/API-ROUTE-CONVENTIONS.md` §4.3).

string

**message**

required

string

**details**

Optional, kind-specific.

object

**_key_**

additional properties

any

**requestId**

required

Server-assigned request id; also echoed via `X-Request-Id` header.

string

##### Examplegenerated

```json
{
  "error": {
    "code": "example",
    "message": "example",
    "details": {},
    "requestId": "example"
  }
}
```

### 403

Not a member of the project (`permission-denied`).

application/json

object

**error**

required

object

**code**

required

Stable machine-readable discriminant. Values match domain error codes (see `docs/API-ROUTE-CONVENTIONS.md` §4.3).

string

**message**

required

string

**details**

Optional, kind-specific.

object

**_key_**

additional properties

any

**requestId**

required

Server-assigned request id; also echoed via `X-Request-Id` header.

string

##### Examplegenerated

```json
{
  "error": {
    "code": "example",
    "message": "example",
    "details": {},
    "requestId": "example"
  }
}
```

### 503

The database was too busy to answer in time (`database-busy`); `Retry-After` (whole seconds) says when to try again.

application/json

object

**error**

required

object

**code**

required

Stable machine-readable discriminant. Values match domain error codes (see `docs/API-ROUTE-CONVENTIONS.md` §4.3).

string

**message**

required

string

**details**

Optional, kind-specific.

object

**_key_**

additional properties

any

**requestId**

required

Server-assigned request id; also echoed via `X-Request-Id` header.

string

##### Examplegenerated

```json
{
  "error": {
    "code": "example",
    "message": "example",
    "details": {},
    "requestId": "example"
  }
}
```

## See also

- [`PUT /v1/connection-choices`: Choose a connection](https://docs.kindgi.com/reference/api/operations/connectionchoicesset.md)
- [Choose a connection](https://docs.kindgi.com/guides/connections/choose-a-connection.md)
- [Kindgi 0.5.0](https://docs.kindgi.com/releases/0.5.0.md)
- [Error code `bad-input`](https://docs.kindgi.com/reference/errors.md#bad-input)
- [Error code `database-busy`](https://docs.kindgi.com/reference/errors.md#database-busy)
- [Error code `permission-denied`](https://docs.kindgi.com/reference/errors.md#permission-denied)
- [Every error code](https://docs.kindgi.com/reference/errors.md)
