Skip to content

Model Registry API

The Model Registry API provides CRUD operations and auto-discovery for the LLM model inventory. The registry supports OCC SR 11-7 model risk management by maintaining a formal catalog of all models in use, their risk tiers, and validation status.

All endpoints require admin authentication (Authorization: Bearer <admin-token>) and are served from the platform base URL.


MethodPathDescription
GET/api/admin/modelsList registered models
POST/api/admin/modelsRegister a new model
POST/api/admin/models/discoverAuto-discover unregistered models from audit log
GET/api/admin/models/{id}Get a single model entry
PUT/api/admin/models/{id}Update a model entry
DELETE/api/admin/models/{id}Delete a model entry
GET/api/admin/model-inventory-exportExport full inventory as CSV or JSON

List all registered models with optional filtering and pagination.

ParameterTypeDescription
risk_tierstringFilter by risk tier: tier_1, tier_2, tier_3, tier_4, unclassified
validation_statusstringFilter by status: draft, pending_validation, in_validation, needs_remediation, validated, deprecated, unclassified
providerstringFilter by provider name (e.g., openai, anthropic, cohere)
searchstringFull-text search across model_id, display_name, and description
limitintegerPage size (default: 50, max: 500)
offsetintegerPagination offset (default: 0)
{
"items": [
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"model_id": "gpt-4o",
"provider": "openai",
"display_name": "GPT-4o",
"risk_tier": "tier_2",
"validation_status": "validated",
"owner": "ml-platform-team",
"description": "OpenAI GPT-4o — primary production model",
"tags": ["production", "general-purpose"],
"request_count_30d": 142857,
"first_seen_at": "2026-01-15T09:30:00Z",
"created_at": "2026-01-15T10:00:00Z",
"updated_at": "2026-03-01T14:22:00Z"
}
],
"total": 23,
"limit": 50,
"offset": 0
}
Terminal window
# List all tier_1 models
curl "https://your-platform/api/admin/models?risk_tier=tier_1" \
-H "Authorization: Bearer $ADMIN_TOKEN"
# Search for Claude models, paginated
curl "https://your-platform/api/admin/models?search=claude&limit=10&offset=0" \
-H "Authorization: Bearer $ADMIN_TOKEN"

Register a new model in the inventory.

{
"model_id": "claude-opus-4-6",
"provider": "anthropic",
"display_name": "Claude Opus 4.6",
"risk_tier": "tier_2",
"validation_status": "draft",
"owner": "ml-platform-team",
"description": "Anthropic Claude Opus 4.6 — high-capability reasoning model",
"tags": ["production", "reasoning"]
}
FieldTypeRequiredDescription
model_idstringYesCanonical model identifier (e.g., gpt-4o, claude-opus-4-6)
providerstringYesModel provider (e.g., openai, anthropic, cohere, google)
display_namestringNoHuman-readable name
risk_tierstringNoOCC SR 11-7 tier: tier_1tier_4 or unclassified (default)
validation_statusstringNoLifecycle status (default: draft)
ownerstringNoTeam or individual responsible for model governance
descriptionstringNoFree-text description
tagsarray[string]NoSearchable tags

201 Created — returns the created model entry:

{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"model_id": "claude-opus-4-6",
"provider": "anthropic",
"display_name": "Claude Opus 4.6",
"risk_tier": "unclassified",
"validation_status": "draft",
"owner": "ml-platform-team",
"description": "Anthropic Claude Opus 4.6 — high-capability reasoning model",
"tags": ["production", "reasoning"],
"created_at": "2026-03-13T10:00:00Z",
"updated_at": "2026-03-13T10:00:00Z"
}
CodeErrorDescription
409 Conflictmodel_already_existsA model with the same (model_id, provider) combination already exists
422 Unprocessablevalidation_errorInvalid field values (e.g., unknown risk_tier value)

Scan the audit log for model IDs that have been used but are not yet registered in the inventory. Creates draft entries for all discovered unregistered models.

This endpoint supports OCC SR 11-7 Section III.B requirement to maintain a comprehensive model inventory.

{
"lookback_days": 30,
"auto_assign_tier": false,
"dry_run": false
}
FieldTypeRequiredDescription
lookback_daysintegerNoHow many days of audit log to scan (default: 30, max: 365)
auto_assign_tierbooleanNoAutomatically assign risk tiers based on provider inference (default: false)
dry_runbooleanNoIf true, returns what would be created without persisting (default: false)
{
"discovered": 5,
"created": 3,
"existing": 2,
"models": [
{
"model_id": "gpt-4o-mini",
"provider": "openai",
"status": "created",
"risk_tier": "unclassified",
"validation_status": "unclassified",
"request_count_30d": 8432,
"first_seen_at": "2026-02-28T14:00:00Z"
},
{
"model_id": "claude-haiku-4-5",
"provider": "anthropic",
"status": "existing",
"risk_tier": "tier_3",
"validation_status": "validated",
"request_count_30d": 21150,
"first_seen_at": "2026-01-10T09:00:00Z"
}
]
}
FieldDescription
discoveredTotal number of distinct model IDs found in the audit log
createdNumber of new registry entries created
existingNumber of model IDs already in the registry
models[].statuscreated (new entry) or existing (already registered)
models[].request_count_30dRequest count in the last 30 days from the audit log
models[].first_seen_atEarliest audit log entry for this model ID

When auto_assign_tier=true, the discovery endpoint infers risk tiers from the model ID format:

PatternInferred providerDefault tier
gpt-*openaitier_2
claude-*anthropictier_2
gemini-*googletier_2
command-*coheretier_3
Unrecognizedunknownunclassified

Automatically assigned tiers are starting points only. Review and update them through your formal model validation process before considering inventory complete for SR 11-7 compliance.

Use dry_run: true to preview discovery results without modifying the registry:

Terminal window
curl -X POST https://your-platform/api/admin/models/discover \
-H "Authorization: Bearer $ADMIN_TOKEN" \
-H "Content-Type: application/json" \
-d '{"lookback_days": 90, "dry_run": true}'

Dry run response is identical to a live run but no entries are created (created will always be 0 in the response when dry_run=true).


Retrieve a single model registry entry by UUID.

ParameterTypeDescription
idUUIDModel registry entry UUID

200 OK — full model entry object (same schema as list items).

CodeErrorDescription
404 Not Foundmodel_not_foundNo entry with the given UUID

Update a model registry entry. All fields are optional — only provided fields are updated (partial update semantics).

{
"risk_tier": "tier_1",
"validation_status": "validated",
"owner": "platform-security-team",
"tags": ["production", "critical", "high-risk"]
}

All fields from the create schema are accepted. model_id and provider cannot be changed after creation.

Tag semantics: tags is a replace operation — the provided array completely replaces the existing tag list. To add a tag, include all existing tags plus the new one.

200 OK — updated model entry.

CodeErrorDescription
404 Not Foundmodel_not_foundNo entry with the given UUID
422 Unprocessableinvalid_status_transitionThe requested validation_status transition is not permitted

The validation lifecycle follows a defined state machine. Invalid transitions return 422 invalid_status_transition.

draft
→ pending_validation
→ in_validation
→ validated
→ deprecated
in_validation
→ needs_remediation
→ validated
needs_remediation
→ in_validation
→ deprecated
validated
→ deprecated
deprecated
(terminal — no transitions)

Every status update generates an audit event recording the previous status, new status, and the admin user who made the change.


Remove a model registry entry.

ParameterTypeDescription
idUUIDModel registry entry UUID

204 No Content — deletion successful.

Deleting a registry entry does not cascade to audit log records — historical audit log entries that reference this model_id are preserved. Audit log records use the model_id string directly, not a foreign key to the registry.

After deletion, the model ID is treated as unregistered by the policy engine. The model_risk_tier condition in policy rules evaluates unregistered models using the unregistered_model_tier default (configured in org settings, default tier_4).

CodeErrorDescription
404 Not Foundmodel_not_foundNo entry with the given UUID

Export the full model registry as a downloadable file.

ParameterTypeDescription
formatstringExport format: csv or json (default: json)
risk_tierstringFilter by risk tier (optional)
validation_statusstringFilter by validation status (optional)
providerstringFilter by provider (optional)

JSON format (Content-Type: application/json):

[
{
"id": "3fa85f64-...",
"model_id": "gpt-4o",
"provider": "openai",
"display_name": "GPT-4o",
"risk_tier": "tier_2",
"validation_status": "validated",
"owner": "ml-platform-team",
"description": "...",
"tags": ["production"],
"request_count_30d": 142857,
"first_seen_at": "2026-01-15T09:30:00Z",
"created_at": "2026-01-15T10:00:00Z",
"updated_at": "2026-03-01T14:22:00Z"
}
]

CSV format (Content-Type: text/csv, Content-Disposition: attachment; filename="model-inventory.csv"):

ColumnDescription
idUUID
model_idCanonical model identifier
providerProvider name
display_nameHuman-readable name
risk_tierOCC SR 11-7 risk tier
validation_statusLifecycle validation status
ownerResponsible team
descriptionFree-text description
tagsPipe-separated tag list
request_count_30dRequest count (30-day rolling)
first_seen_atISO 8601 timestamp
created_atISO 8601 timestamp
updated_atISO 8601 timestamp
Terminal window
# Export all models as CSV for SR 11-7 model inventory documentation
curl "https://your-platform/api/admin/model-inventory-export?format=csv" \
-H "Authorization: Bearer $ADMIN_TOKEN" \
-o model-inventory.csv
# Export only unvalidated models as JSON for remediation tracking
curl "https://your-platform/api/admin/model-inventory-export?format=json&validation_status=needs_remediation" \
-H "Authorization: Bearer $ADMIN_TOKEN"

ValueDescription
tier_1Critical — systemic or enterprise-wide decision making
tier_2High — significant business decisions, customer-facing
tier_3Moderate — operational support, limited scope
tier_4Low — informational, human-reviewed output
unclassifiedNot yet assessed (default for new/discovered models)
ValueDescription
draftInitial entry, not yet submitted for validation
pending_validationSubmitted — awaiting validator assignment
in_validationActively under review
validatedApproved for use
needs_remediationValidation failed — requires fixes before re-review
deprecatedRetired from use — terminal state
unclassifiedStatus unknown (auto-discovery default)