---
title: "connectProviderLogin"
---

> Documentation Index
> Fetch the complete documentation index at: https://agenthold.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# connectProviderLogin

Path: agenthold API › provider-logins

`PUT /me/provider-logins/{provider}`

URL: `/api/v1/me/provider-logins/{provider}`

Connect (or replace) your login for a harness. The credential is
checked, stored encrypted and never shown again. Only from a browser
session, not with an API token.

## Authentication

Requires one of the following:

- `session`, apiKey, in cookie
- `token`, http bearer, header `Authorization`

## Path parameters

- `provider` (`connectProviderLogin.path.provider`; string, required) — Harness id (claude-code, codex).

## Request body

_Required._

- `kind` (`connectProviderLogin.kind`; string, required)
- `credential` (`connectProviderLogin.credential`; string, required) — The token, key or file contents. Never returned.
  - maxLength: `65536` · minLength: `1`

## Example request

```json
{
  "kind": "string",
  "credential": "string"
}
```

## Code samples

### cURL

```bash
curl --request PUT \
  --url '<base-url>/api/v1/me/provider-logins/<provider>' \
  --header 'Content-Type: application/json' \
  --cookie 'agenthold_session=<agenthold_session>' \
  --data '
{
  "kind": "string",
  "credential": "string"
}
'
```

### TypeScript

```typescript
const url = '<base-url>/api/v1/me/provider-logins/<provider>';
const options = {
  method: 'PUT',
  headers: {
    'Content-Type': 'application/json',
    cookie: 'agenthold_session=<agenthold_session>'
  },
  body: JSON.stringify({kind: 'string', credential: 'string'})
};

fetch(url, options)
  .then(res => res.json())
  .then(json => console.log(json))
  .catch(err => console.error(err));
```

### Python

```python
import requests

url = "<base-url>/api/v1/me/provider-logins/<provider>"

payload = {
    "kind": "string",
    "credential": "string"
}
headers = {
    "cookie": "agenthold_session=<agenthold_session>",
    "Content-Type": "application/json"
}

response = requests.put(url, json=payload, headers=headers)

print(response.text)
```

## Responses

### 200

Connected.

#### Example

```json
{
  "provider": "string",
  "name": "string",
  "kinds": [
    {
      "id": "string",
      "name": "string",
      "description": "string",
      "command": "string",
      "inputLabel": "string",
      "multiline": true
    }
  ],
  "login": {
    "kind": "string",
    "label": "string",
    "status": "ok",
    "statusMessage": "string",
    "expiresAt": "2019-08-24T14:15:22Z",
    "connectedAt": "2019-08-24T14:15:22Z",
    "lastUsedAt": "2019-08-24T14:15:22Z"
  },
  "agents": [
    {
      "id": "string",
      "name": "string",
      "workspaceId": "string"
    }
  ]
}
```

- `provider` (`connectProviderLogin.response.200.provider`; string, required) — Harness id.
- `name` (`connectProviderLogin.response.200.name`; string, required)
- `kinds` (`connectProviderLogin.response.200.kinds`; array of object, required)
  - `id` (`connectProviderLogin.response.200.kinds.id`; string, required)
  - `name` (`connectProviderLogin.response.200.kinds.name`; string, required)
  - `description` (`connectProviderLogin.response.200.kinds.description`; string, required)
  - `inputLabel` (`connectProviderLogin.response.200.kinds.inputLabel`; string, required)
  - `multiline` (`connectProviderLogin.response.200.kinds.multiline`; boolean, required)
  - `command` (`connectProviderLogin.response.200.kinds.command`; string, optional) — What to run on your own computer to get the credential.
- `agents` (`connectProviderLogin.response.200.agents`; array of object, required) — Agents with this harness that use your logins.
  - `id` (`connectProviderLogin.response.200.agents.id`; string, required)
  - `name` (`connectProviderLogin.response.200.agents.name`; string, required)
  - `workspaceId` (`connectProviderLogin.response.200.agents.workspaceId`; string, required)
- `login` (`connectProviderLogin.response.200.login`; object, optional)
  - `kind` (`connectProviderLogin.response.200.login.kind`; string, required)
  - `label` (`connectProviderLogin.response.200.login.label`; string, required) — Describes the login without revealing it.
  - `status` (`connectProviderLogin.response.200.login.status`; string, required)
    - one of `"ok"`, `"error"`
  - `statusMessage` (`connectProviderLogin.response.200.login.statusMessage`; string, required)
  - `connectedAt` (`connectProviderLogin.response.200.login.connectedAt`; string, required)
    - format: `date-time`
  - `expiresAt` (`connectProviderLogin.response.200.login.expiresAt`; string, optional)
    - format: `date-time`
  - `lastUsedAt` (`connectProviderLogin.response.200.login.lastUsedAt`; string, optional)
    - format: `date-time`

### 400

Error.

#### Example

```json
{
  "error": "string"
}
```

- `error` (`connectProviderLogin.response.400.error`; string, required)

### 403

Error.

#### Example

```json
{
  "error": "string"
}
```

- `error` (`connectProviderLogin.response.403.error`; string, required)

### 404

Error.

#### Example

```json
{
  "error": "string"
}
```

- `error` (`connectProviderLogin.response.404.error`; string, required)


Source: https://agenthold.dev/api/connect-provider-login/index.md
