Update Model Catalog Entry
Endpoint
PUT /apiops/projects/{projectName}/llm-models/{modelName}/
Authentication
Requires a Personal API Access Token.
Header
Authorization: Bearer YOUR_TOKEN
Request
Headers
| Header | Value | Required |
|---|---|---|
| Authorization | Bearer {token} | Yes |
| Content-Type | application/json | Yes |
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| projectName | string | Yes | Project name |
| modelName | string | Yes | Model catalog entry name. If the body name is blank it falls back to this value; otherwise the two must match (case-insensitive) |
Query Parameters
None
Request Body
Full JSON Body Example
{
"name": "openai/gpt-5-mini",
"providerDefinitionId": "6640aa12c2e4b8000000ef01",
"providerCode": "openai",
"modelId": "gpt-5-mini",
"displayName": "GPT-5 Mini",
"contextWindow": 128000,
"maxOutputTokens": 32768,
"pricePerMillionInput": 0.20,
"pricePerMillionOutput": 1.80,
"pricePerMillionCached": 0.020,
"pricePerImage": null,
"pricePerAudioMinute": null,
"pricePerCharacterTts": null,
"capabilities": ["chat", "function_calling", "json_mode", "reasoning"],
"modality": "TEXT",
"isDeprecated": false,
"deprecatedAt": null,
"sunsetAt": null,
"builtIn": false
}
Request Body Fields
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
| name | string | No | path value | Catalog name in \{providerCode\}/\{modelId\} form. If blank, the modelName path parameter is used; otherwise it must match the path |
| providerDefinitionId | string | No | - | Reference to the owning LLM provider definition |
| providerCode | string | Yes | - | Provider code (e.g. openai). Required for custom entries |
| modelId | string | Yes | - | Provider-facing model identifier (e.g. gpt-5-mini). Required for custom entries |
| displayName | string | No | - | Human-readable label |
| contextWindow | integer | No | - | Context window size in tokens |
| maxOutputTokens | integer | No | - | Maximum output tokens; omit to use the provider default |
| pricePerMillionInput | number | No | - | USD per 1M input tokens |
| pricePerMillionOutput | number | No | - | USD per 1M output tokens |
| pricePerMillionCached | number | No | - | USD per 1M cached input tokens |
| pricePerImage | number | No | - | USD per generated image |
| pricePerAudioMinute | number | No | - | USD per minute of audio (STT) |
| pricePerCharacterTts | number | No | - | USD per input character (TTS) |
| capabilities | array[string] | No | - | Capability tags (e.g. chat, function_calling, vision, embedding, json_mode, reasoning) |
| modality | string | No | - | Model modality: TEXT, VISION, AUDIO, EMBEDDING, RERANK, MULTIMODAL, IMAGE |
| isDeprecated | boolean | No | false | Whether the model is deprecated |
| deprecatedAt | string | No | - | Deprecation announcement time (ISO-8601) |
| sunsetAt | string | No | - | Planned removal time (ISO-8601) |
| builtIn | boolean | No | false | See the built-in note below. |
Notes
- Entry must exist: Unlike
POST(upsert),PUTrequires the named entry to already exist in the project, otherwise a400is returned. - Name fallback: If
nameis blank in the body, themodelNamepath parameter is used. If both are present they must match (case-insensitive). id/projectIdare server-managed: The existing entry's id is reused and the entry stays scoped to the path project — aprojectIdchange in the body is rejected (cross-project transfer guard).- Built-in entries (
builtIn=true): Only the price fields (pricePerMillionInput/Output/Cached,pricePerImage,pricePerAudioMinute,pricePerCharacterTts) are applied; all other fields (name, limits, capabilities, modality) are preserved from the seed.
Response
Success Response (200 OK)
{
"status": "SUCCESS",
"deploymentResult": {
"success": true
}
}
Response Fields
| Field | Type | Description |
|---|---|---|
| status | string | Response status: SUCCESS or FAILURE |
| deploymentResult | object | Result of the update operation |
| deploymentResult.success | boolean | Whether the operation completed successfully |
Error Response (400 Bad Request)
{
"status": "FAILURE",
"resultMessage": "Model catalog entry (name: openai/gpt-5-mini) was not found!"
}
or
{
"status": "FAILURE",
"resultMessage": "Model catalog entry name in path (openai/gpt-5-mini) does not match name in body (openai/gpt-5)!"
}
Error Response (401 Unauthorized)
{
"status": "FAILURE",
"resultMessage": "Token is not valid!"
}
cURL Example
curl -X PUT \
"https://demo.apinizer.com/apiops/projects/MyProject/llm-models/openai%2Fgpt-5-mini/" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "openai/gpt-5-mini",
"providerCode": "openai",
"modelId": "gpt-5-mini",
"displayName": "GPT-5 Mini",
"contextWindow": 128000,
"maxOutputTokens": 32768,
"pricePerMillionInput": 0.20,
"pricePerMillionOutput": 1.80,
"pricePerMillionCached": 0.020,
"capabilities": ["chat", "function_calling", "json_mode", "reasoning"],
"modality": "TEXT",
"builtIn": false
}'
Notes and Warnings
- Create vs update: Use Create Model Catalog Entry
(
POST) if you want create-or-update (upsert) semantics;PUTfails when the entry does not exist. - Built-in price-only edit: For
builtIn=trueentries, editing anything other than the price fields has no effect — the seed values are authoritative for structure and capabilities. - Name form: The catalog name uses the
{providerCode}/{modelId}format. URL-encode the/as%2Fin the path. - No secret fields: The catalog carries no
@SecretDatafields and no_classdiscriminator — nothing is masked, and there is no blank-secret-preservation behaviour.
Related Documentation
- Create Model Catalog Entry - Create or upsert an entry
- Delete Model Catalog Entry - Delete a custom entry
- Model Catalog API - Resource overview
- Authentication Guide - How to obtain and use API tokens
- Error Handling - Error response formats