---
title: "Apply llm-providers by stable key"
method: PUT
path: "/v1/llm-providers/by-key/{externalKey}"
tags: ["LLM Providers"]
---

# Apply llm-providers by stable key

`PUT /v1/llm-providers/by-key/{externalKey}`

Creates or replaces an organization-scoped resource. Names do not identify resources; existing unkeyed resources are never adopted automatically. Assignments are replaced. Omitted write-only secrets are preserved. Concurrent writes are last-write-wins; conditional headers are not supported on this route.

## Path parameters

- `externalKey` string, required

## Request body

- object
  - `name` string, required
  - `source` 'models_dev' | 'custom', required
  - `providerId` string
  - `modelIds` string[]
  - `customConfigText` string
  - `customConfig` unknown
  - `credentialMode` 'shared' | 'per_member'
  - `apiKey` string
  - `apiKeys` object
  - `memberIds` string[]
  - `teamIds` string[]
  - `allMembers` boolean

## Response `200`

The existing resource was replaced.

- LlmProviderResponse
  - `llmProvider` object, required
    - `memberCredential` object
      - `state` 'missing' | 'active' | 'blocked' | 'stale' | 'error', required

## Other responses

- `201` — The resource was created.
- `400` — Invalid declarative request.
- `401` — Authentication required.
- `403` — Resource management permission required.
- `404` — A referenced resource was not found.
- `409` — A name or identity conflict requires reconciliation.

## Changes

- **2026-09-05** `cb34559d4b4d` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/openworklabs/apis/den-api/changes/v1/llm-providers/by-key/:externalKey/put.md)

---

[API](https://skmtc.dev/openworklabs/apis/den-api.md) · [All operations](https://skmtc.dev/openworklabs/apis/den-api/llms.txt) · [OpenAPI document](https://skmtc.dev/openworklabs/apis/den-api/revisions/ac1bfb7140f6?raw)
