For AI agents: markdown of this page — /docs-content-en/ai/credentials/update.md documentation index — /llms.txt
Update a provider key
PATCH /v1/ai/credentials/:id
Updates the name, the isDefault flag, and/or the key itself. If the request includes the credentials field — the new key is re-verified with the provider before saving. A key that fails the check is not saved and nothing changes in the database. The name and isDefault fields are updated without verification.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
id (path) |
string | yes | Key ID from GET /v1/ai/credentials |
Request fields (body)
| Field | Type | Required | Description |
|---|---|---|---|
name |
string | no | New key name |
isDefault |
boolean | no | Make the key the default for the provider |
credentials.apiKey |
string | no | New provider key |
credentials.baseUrl |
string | no | New baseUrl (only for custom-openai-compat) |
At least one field must be passed in the body. If credentials is passed — it is verified with the provider; on success lastError and lastErrorAt are reset.
Examples
curl — personal key
curl -X PATCH https://vibecode.bitrix24.com/v1/ai/credentials/cred_abc123def456 \
-H "X-Api-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "OpenAI (new name)",
"credentials": {
"apiKey": "sk-proj-new-key-..."
}
}'
curl — OAuth application
curl -X PATCH https://vibecode.bitrix24.com/v1/ai/credentials/cred_abc123def456 \
-H "X-Api-Key: YOUR_APP_KEY" \
-H "Authorization: Bearer USER_SESSION_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "OpenAI (new name)"
}'
JavaScript — personal key
const id = 'cred_abc123def456'
const res = await fetch(`https://vibecode.bitrix24.com/v1/ai/credentials/${id}`, {
method: 'PATCH',
headers: {
'X-Api-Key': 'YOUR_API_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({
credentials: { apiKey: 'sk-proj-new-key-...' },
}),
})
const { success, data } = await res.json()
if (success) console.log('Key updated at', data.updatedAt)
JavaScript — OAuth application
const id = 'cred_abc123def456'
const res = await fetch(`https://vibecode.bitrix24.com/v1/ai/credentials/${id}`, {
method: 'PATCH',
headers: {
'X-Api-Key': 'YOUR_APP_KEY',
'Authorization': 'Bearer USER_SESSION_TOKEN',
'Content-Type': 'application/json',
},
body: JSON.stringify({ name: 'OpenAI (production)' }),
})
const { data } = await res.json()
console.log('New name:', data.name)
Response fields
| Field | Type | Description |
|---|---|---|
success |
boolean | Always true on success |
data.id |
string | Key ID |
data.providerId |
string | Provider ID |
data.provider.slug |
string | Provider system name |
data.provider.name |
string | Provider name |
data.name |
string | Current key name |
data.isDefault |
boolean | Default-key flag |
data.lastError |
string | null | Reset to null on a successful key update |
data.lastErrorAt |
string | null | Reset to null on a successful key update |
data.createdAt |
string | Creation time in ISO 8601 |
data.updatedAt |
string | Last update time in ISO 8601 |
Response example
{
"success": true,
"data": {
"id": "cred_abc123def456",
"providerId": "openai",
"provider": {
"slug": "openai",
"name": "OpenAI"
},
"name": "OpenAI (new name)",
"isDefault": true,
"lastError": null,
"lastErrorAt": null,
"createdAt": "2026-04-15T10:00:00.000Z",
"updatedAt": "2026-04-27T11:35:00.000Z"
}
}
Error response example
422 credential_invalid — the new key failed verification with the provider:
{
"success": false,
"error": {
"code": "credential_invalid",
"message": "OpenAI API 401: Incorrect API key provided"
}
}
Errors
| HTTP | Code | Description |
|---|---|---|
| 400 | invalid_request |
The body schema is violated |
| 400 | no_key |
credentials has no apiKey field |
| 400 | base_url_invalid |
The new baseUrl uses a scheme other than http/https |
| 400 | base_url_private |
The new baseUrl points at a private network |
| 404 | not_found |
A key with this id was not found or does not belong to you |
| 404 | provider_not_found |
The key's provider was deleted |
| 422 | credential_invalid |
The new key failed verification with the provider |
| 422 | provider_geoblocked |
The provider rejected the key check based on our server's region. Connect your own proxy or switch to OpenRouter. The response carries a suggestions field |
| 403 | scope_missing |
The API key lacks the vibe:ai scope |
Full list of common API errors — Errors.
Known specifics
Verification only when credentials changes. If the request has no credentials field (only name or isDefault are updated) — the provider is not called, and the lastError/lastErrorAt fields are not reset.
Empty request body is allowed. A PATCH with an empty body ({}) returns the current state of the key unchanged — behavior inherited from the Zod schema. Use it to check key availability without touching the data.
Access to your own keys only. The endpoint works only with the current user's USER keys. An attempt to update another user's key or a PORTAL key returns 404.