---
title: "Legacy BYOK upsert"
method: POST
path: "/api/v1/user/config/keys"
tags: ["Legacy"]
deprecated: true
---

# Legacy BYOK upsert

`POST /api/v1/user/config/keys`

## Request

- Base URL: `https://www.devspeak.dev`
- URL: `https://www.devspeak.dev/api/v1/user/config/keys`
- Auth: HTTP bearer

> **Deprecated.**

Deprecated legacy BYOK route retained for older macOS clients. The inventory flags this route as a security concern because it bypasses the customProvider entitlement gate.

## Request body

- LegacyCredentialRequest
  - `providerType` 'gemini' | 'openai' | 'anthropic' | 'openai-compatible', required
  - `apiKey` string, required
  - `apiEndpoint` string, uri
  - `model` string
  - `label` string
  - `metadata` object

## Response `200`

Legacy provider response

- ProviderConfigurationEnvelope
  - `success` true, required
  - `data` ProviderConfiguration, required
    - `providerType` 'gemini' | 'openai' | 'anthropic' | 'openai-compatible', required
    - `providerName` string, required
    - `apiEndpoint` string, nullable, required
    - `metadata` object, required
      - `model` string, nullable, required
      - `label` string, nullable, required
      - `keyPreview` string, nullable, required
      - `endpointHost` string, nullable, required
    - `enabled` boolean, required
    - `updatedAt` string, nullable, required
    - `lastValidatedAt` string, nullable, required
    - `status` 'unconfigured' | 'invalid' | 'active', required
    - `validationMessage` string, nullable, required

## Other responses

- `400`: Validation error
- `401`: Missing or invalid credentials
- `422`: Provider validation failed
- `429`: Rate limit exceeded
- `500`: Internal server error
- `504`: Upstream timeout

---

[API](https://skmtc.dev/devspeak/apis/devspeak-api-v1.md) · [All operations](https://skmtc.dev/devspeak/apis/devspeak-api-v1/llms.txt) · [OpenAPI document](https://skmtc.dev/devspeak/apis/devspeak-api-v1/revisions/7000833a5bbf?raw)
