LLM gateway admin API¶
The LLM gateway is a centralized service that manages access to LLMs from external providers. It offers several key benefits:
- Policy enforcement and granular access of approved LLMs.
- Standardized interactions with multiple LLM providers.
- Security, monitoring, and cost controls across all LLM usage.
- Dynamic model selection for agents, providing access to LLMs in the gateway catalog to support task optimization.
The following endpoints let an organization administrator scope the LLM gateway functionality to their own organization:
- Default credential rule overrides: Sets which credential the gateway uses by default when routing requests to a given provider or model, for each user in the organization.
- Custom LLM catalog entries: Configures self-registered LLMs (for example, a model your organization has direct provider access to) so they appear in your tenant's LLM catalog alongside the DataRobot-managed models.
- Permission rules: Specifies user, group, and organization-level access for a given LLM, LLM family, or provider. "Family" in this API is a synonym for "Publisher" as seen in the UI.
Authentication and access¶
All endpoints on this page require the same Bearer token authentication as the rest of the DataRobot public API (an API key or OAuth token for a DataRobot user):
Authorization: Bearer YOUR_API_TOKEN
The authenticated user must also hold the organization administrator role in their tenant, and must not belong to a trial organization—these endpoints return 403 Forbidden for trial users regardless of role.
There is no request parameter for selecting a tenant or organization. Every operation reads and writes only the caller's own tenant, derived from their authentication. You cannot view or modify another tenant's credential rules or catalog entries through this API.
Base path¶
All paths below are relative to the following base path:
/api/v2/genai/llmgw/admin
Access policy for new entries¶
A catalog entry you create becomes visible in GET /catalog/ and usable in chat completions as soon as it is created, with no separate activation or registration step. Visibility and usability follow the same access policy as every other LLM—evaluation checks for a rule at the LLM level first, then the publisher level, then the provider level—and uses the first level that has one configured. In practice, a new entry automatically inherits whatever provider- or publisher-level policy your organization already has (for example, a "Default allow" on Bedrock), with no extra step required. If your organization has no policy at all for the entry's provider or publisher, and the entry is not a preview LLM, it starts out denied by default until you configure access. This is the same default-deny behavior applied to a new DataRobot-managed LLM.
Permission rules¶
Use the permission rule endpoints to configure provider-, publisher-, or LLM-level policy directly in the gateway for controlling access on a user, group, or organizational level. Rules can be set at any of the three levels; a level with no direct rule of its own falls back to the next level up, as described in Access policy for new entries.
| Verb | パス | 説明 |
|---|---|---|
GET |
/permissions/ |
Get the tree of providers and families, with the rule (if any) configured directly on each. |
GET |
/permissions/llms/ |
List LLMs, with the rule (if any) configured directly on each. |
POST |
/permissions/ |
Set the allow/deny/remove state of one or more rules. |
DELETE |
/permissions/ |
Delete every rule on one resource. |
Get the permission tree¶
GET /permissions/
Returns every provider your organization can configure permissions for (see Provider values) together with their LLM families. Not paginated—the number of providers and families is small and fixed.
Response—200 OK:
{
"providers": [
{
"name": "Amazon Bedrock",
"slug": "bedrock",
"permissions": {
"orgAllow": true,
"overrides": {
"users": [
{
"id": "65f1a2b3c4d5e6f7a8b9c0d1",
"name": "Ada Lovelace",
"username": "ada@example.com",
"allow": false
}
],
"groups": []
}
},
"families": [
{
"name": "Anthropic",
"slug": "bedrock__anthropic",
"permissions": null,
"modifiedAt": null,
"modifiedBy": null
}
],
"modifiedAt": "2026-08-01T12:00:00Z",
"modifiedBy": {
"id": "65f1a2b3c4d5e6f7a8b9c0d1",
"name": "Ada Lovelace",
"username": "ada@example.com"
}
}
]
}
Provider object
| フィールド | タイプ | 説明 |
|---|---|---|
name |
文字列 | A human-readable provider label (for example, "Amazon Bedrock"). |
slug |
文字列 | A stable identifier for this provider. See Provider values. |
permissions |
object \ | null |
families |
array of object | The provider's LLM families (see below). |
modifiedAt |
string (date-time) \ | null |
modifiedBy |
object \ | null |
Family object (nested under families)
| フィールド | タイプ | 説明 |
|---|---|---|
name |
文字列 | The family's creator label (for example, "Anthropic"). |
slug |
文字列 | |
permissions |
object \ | null |
modifiedAt / modifiedBy |
— | Same as on the provider object. |
備考
Each level of the tree only shows a rule configured directly on it—a rule on a provider is not echoed onto its families, and vice versa. See Access policy for new entries for how access is resolved when a level has no direct rule of its own.
List LLMs with permissions¶
GET /permissions/llms/
Query parameters
| パラメーター | タイプ | デフォルト | 説明 |
|---|---|---|---|
offset |
整数 | 0 |
The number of entries to skip. |
limit |
整数 | 500 |
The maximum entries to return (0–500). |
includeRetired |
ブーリアン | false |
Whether to include retired LLMs. |
model |
文字列 | — | Return only the LLM with this exact model string. |
namePart |
文字列 | — | Return only LLMs whose name contains this substring (2–64 characters). |
provider |
文字列 | — | Return only LLMs of this provider. See Provider values. |
family |
文字列 | — | Return only LLMs of this family. Use a family slug from Get the permission tree. |
If both provider and family are given, family must belong to provider.
Response—200 OK, a paginated object in the same shape as Custom LLM catalog entries:
{
"totalCount": 1,
"count": 1,
"next": null,
"previous": null,
"data": [
{
"model": "bedrock/anthropic.claude-sonnet-4-5-20250929-v1:0",
"name": "Claude Sonnet 4.5",
"permissions": null,
"creator": "Anthropic",
"retirementDate": null,
"isDeprecated": false,
"isActive": true,
"modifiedAt": null,
"modifiedBy": null
}
]
}
| フィールド | タイプ | 説明 |
|---|---|---|
model |
文字列 | The LLM's model identifier. |
name |
文字列 | The display name. |
permissions |
object \ | null |
creator |
文字列 | The organization that created the model. See Valid provider/creator pairings. |
retirementDate |
string (date) \ | null |
isDeprecated / isActive |
ブーリアン | Computed from retirementDate. |
modifiedAt / modifiedBy |
— | Same as on the provider object. |
エラー
| ステータス | 発生タイミング |
|---|---|
400 Bad Request |
provider or family is not a recognized slug; provider is datarobot or another non-public provider; or family does not belong to the given provider. |
備考
Non-public providers (DataRobot self-hosted models, and the internal mock test provider) never appear in this listing, even when enabled—they are not access-controlled at runtime.
Update permission rules¶
POST /permissions/
Sets the allow/deny/remove state of one or more (resource, subject) rules in a single request.
Request body
| フィールド | タイプ | 必須 | 説明 |
|---|---|---|---|
data |
array of object | はい | 1–100 permission items (see below). |
Each item in data:
| フィールド | タイプ | 説明 |
|---|---|---|
resourceId |
文字列 | The resource to set a rule on. See Resource types for the expected format. |
resourceType |
文字列 | One of llm, family, provider. See Resource types. |
state |
文字列 | One of allow, deny, remove. See Permission states. |
subjectId |
文字列 | The subject the rule applies to. See Subject types. |
subjectType |
文字列 | One of user, group, organization. See Subject types. |
Response—204 No Content.
エラー
| ステータス | 発生タイミング |
|---|---|
400 Bad Request |
A resourceId/resourceType pair does not resolve to a real LLM, family, or provider; the resource is datarobot or another non-public provider/family; or applying this request would leave more than 100 subjects on a single resource's rule. |
409 Conflict |
Two or more items in the same request target the same resource and subject with different state values. |
500 Internal Server Error |
The upstream access-controls service could not be reached. |
備考
The gateway applies items in batches (removals first, then new rules, then additions to existing rules), and the batches are not transactional—if a later batch fails, earlier batches have already taken effect.
Delete permission rules¶
DELETE /permissions/
Deletes every rule on one resource—both the allow-rule and the deny-rule, for every subject—resetting it to have no direct rule at all. Rules inherited from the resource's parents will then govern the resource, if any exist.
Request body
| フィールド | タイプ | 説明 |
|---|---|---|
resourceId |
文字列 | The resource to clear. See Resource types. |
resourceType |
文字列 | One of llm, family, provider. |
Response—204 No Content. Deleting a resource with no existing rules is a no-op, not an error.
エラー
| ステータス | 発生タイミング |
|---|---|
400 Bad Request |
resourceId/resourceType does not resolve to a real LLM, family, or provider. |
500 Internal Server Error |
The upstream access-controls service could not be reached. |
Permission object¶
The permissions field on a provider, family, or LLM entry is null when no rule is configured directly on that resource. それ以外の場合:
{
"orgAllow": true,
"overrides": {
"users": [
{
"id": "65f1a2b3c4d5e6f7a8b9c0d1",
"name": "Ada Lovelace",
"username": "ada@example.com",
"allow": false
}
],
"groups": [
{ "id": "65f1a2b3c4d5e6f7a8b9c0d4", "name": "Engineering", "membersCount": 12, "allow": true }
]
}
}
| フィールド | タイプ | 説明 |
|---|---|---|
orgAllow |
boolean \ | null |
overrides.users |
array of object | Per-user overrides: {"id", "name", "username", "allow"}. allow: true grants, allow: false denies, regardless of orgAllow. |
overrides.groups |
array of object | Per-group overrides: {"id", "name", "membersCount", "allow"}. |
If the gateway can no longer resolve a user or group (for example, it was removed, or it belongs to a different tenant), it still appears in overrides, with name (and username, for users) returned as null.
Resource types¶
| タイプ | ID |
|---|---|
llm |
The LLM's model string (for example, bedrock/anthropic.claude-sonnet-4-5-20250929-v1:0), including one of your own custom catalog entries. |
family |
|
provider |
A provider slug. See Provider values. |
datarobot and mock cannot be used as a provider resource—self-hosted models are not access-controlled through this API, and mock is a test-only provider that skips access evaluation entirely.
Permission states¶
| 状態 | 効果 |
|---|---|
allow |
Grants the subject access to this resource, overriding the organization default. |
deny |
Denies the subject access to this resource, overriding the organization default. |
remove |
Clears any direct allow/deny rule for this subject on this resource. The subject then falls back to the organization default, or, for a family or LLM with no direct rule of its own, to the next level up. |
Subject types¶
| タイプ | ID |
|---|---|
user |
A DataRobot user ID. |
group |
A DataRobot group ID. |
organization |
The organization's ID—sets the resource's organization-wide default (orgAllow) instead of a per-subject override. |
Credential rule overrides¶
A credential rule tells the gateway which stored credential to use, by default, for requests to a given LLM provider (optionally narrowed to one model) from anyone in your tenant. Use this to point the gateway at your organization's own provider credentials instead of DataRobot's shared default pool.
| Verb | パス | 説明 |
|---|---|---|
GET |
/credentials/ |
List the tenant's default credential rule overrides. |
POST |
/credentials/ |
Add a tenant-scoped default credential rule override. |
DELETE |
/credentials/{credential_id}/ |
Delete a tenant-scoped default credential rule override. |
List credential rule overrides¶
GET /credentials/
Returns every default credential rule configured for the tenant.
Query parameters
| パラメーター | タイプ | 説明 |
|---|---|---|
llmProvider |
文字列 | Filter to rules for this provider. See Provider values. Mutually exclusive with model. |
model |
文字列 | Filter to rules for this exact model string. Mutually exclusive with llmProvider. |
Passing both llmProvider and model returns 400 Bad Request.
Response—200 OK, a JSON array of credential rule objects.
Create a credential rule override¶
POST /credentials/
Creates a default credential rule for the tenant. You cannot set the scope explicitly—a rule created here always applies to your own tenant.
Request body
| フィールド | タイプ | 必須 | 説明 |
|---|---|---|---|
credential |
object | はい | The credential this rule points to. See Credential reference object. |
llmProvider |
文字列 | はい | The provider this rule applies to. See Provider values. |
model |
文字列 | いいえ | If set, the rule applies to this model only; otherwise it applies to every model under the provider. The string must start with the provider's model prefix (for example, bedrock/... for bedrock)—a mismatched prefix returns 422. |
Response—201 Created, a credential rule object.
エラー
| ステータス | 発生タイミング |
|---|---|
409 Conflict |
A rule already exists for this tenant, provider, and model combination. |
422 Unprocessable Entity |
model does not match the provider's model prefix. |
Delete a credential rule override¶
DELETE /credentials/{credential_id}/
Deletes one credential rule belonging to the tenant.
Path parameters
| パラメーター | タイプ | 説明 |
|---|---|---|
credential_id |
文字列 | The rule's id. |
Response—204 No Content.
エラー
| ステータス | 発生タイミング |
|---|---|
404 Not Found |
No such rule exists or the rule belongs to a different tenant. |
Credential rule object¶
{
"id": "65f1a2b3c4d5e6f7a8b9c0d1",
"scope": {
"scope": "tenant",
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
},
"credential": {
"source": "dr_secure_config",
"id": "65f1a2b3c4d5e6f7a8b9c0d2"
},
"llmProvider": "bedrock",
"model": null
}
| フィールド | タイプ | 説明 |
|---|---|---|
id |
文字列 | The rule's identifier. |
scope |
object | Always {"scope": "tenant", "id": "<your tenant id>"} for rules created through this API. |
credential |
object | See Credential reference object. |
llmProvider |
文字列 | The provider this rule applies to. |
model |
string \ | null |
Credential reference object¶
| フィールド | タイプ | 説明 |
|---|---|---|
source |
文字列 | The credential store the id refers to. Must be dr_secure_config. |
id |
文字列 | The identifier of the referenced credential in that store—a Secure Config entry ID. |
備考
The credential itself is created and managed through the existing Secure Config API, not through this endpoint. This API only records which credential the gateway should use as the tenant's default.
備考
The credential's JSON must match the field shape the gateway expects for its provider—see LLM gateway model configuration for the field list and JSON examples per provider.
If every endpoint in the credential's JSON includes "api_type": "azure" (exactly that key, lowercase with an underscore—not apiType), the gateway parses it as an Azure credential regardless of which provider this rule or the tenant entry names. This lets an Azure-backed endpoint serve a tenant entry registered under openai or another OpenAI-compatible provider. Omit api_type unless you need this.
Provider values¶
Valid provider values are: azure, bedrock, vertex_ai, anthropic, cohere, openai, togetherai, cerebras, groq, alibaba, and other.
The special value other circumvents the logic normally used to build a model string for each provider. When using other in a credential rule, the credential JSON must have the following shape, including the field api_base to provide the base URL that should receive requests.:
{
"endpoints": [
{
"region": "global",
"api_base": "<your-base-url>",
"api_key": "<your-api-key>",
}
]
}
Custom LLM catalog entries¶
A catalog entry describes one LLM to make available to your organization; it uses the same shape as DataRobot's own globally available LLMs. Entries you create here are scoped to your tenant only, and never affect or become visible to other organizations.
| Verb | パス | 説明 |
|---|---|---|
GET |
/llms/ |
List the tenant's LLM catalog entries. |
POST |
/llms/ |
Create a tenant-scoped LLM catalog entry. |
GET |
/llms/{entry_id}/ |
Get one of the tenant's LLM catalog entries. |
PATCH |
/llms/{entry_id}/ |
Update one of the tenant's LLM catalog entries. |
DELETE |
/llms/{entry_id}/ |
Delete one of the tenant's LLM catalog entries. |
List catalog entries¶
GET /llms/
Query parameters
| パラメーター | タイプ | デフォルト | 説明 |
|---|---|---|---|
offset |
整数 | 0 |
The number of entries to skip. |
limit |
整数 | 500 |
The maximum entries to return (0–500). |
Response—200 OK, a paginated object:
{
"totalCount": 1,
"count": 1,
"next": null,
"previous": null,
"data": [ /* array of catalog entry objects, see below */ ]
}
Create a catalog entry¶
POST /llms/
Request body
| フィールド | タイプ | 必須 | 説明 |
|---|---|---|---|
provider |
文字列 | はい | The LLM provider. See Provider values. |
creator |
文字列 | はい | The organization that created the model (for example, Anthropic, Meta). The string must form a valid provider/creator pairing—see Valid provider/creator pairings. |
model |
文字列 | はい | The provider-hosted model identifier. The string must start with the provider's LiteLLM prefix (for example, bedrock/anthropic.claude-...). |
name |
文字列 | はい | The display name. |
llmId |
文字列 | はい | Your chosen stable ID for this LLM. |
version |
文字列 | はい | The model version string. |
description |
文字列 | はい | The description shown to users. |
license |
文字列 | はい | The license name. |
supportedLanguages |
array of string | はい | Currently only Multilingual is a defined value. |
contextSize |
整数 | はい | The context window size, in tokens. Has no effect in the LLM Gateway itself, but other services may read it. |
maxCompletionTokens |
整数 | はい | The maximum tokens the model can generate in one completion. Has no effect in the LLM Gateway itself, but other services may read it. |
inputTypes |
array of string | はい | Any of text, image. |
outputTypes |
array of string | はい | Any of text, image. |
documentationLink |
文字列 | はい | A link to the model's own documentation. |
referenceLinks |
array of object | はい | [{"name": "...", "url": "..."}]. |
availableLitellmEndpoints |
object | はい | {"supportsChatCompletions": bool, "supportsResponses": bool}. |
capabilities |
array of string | いいえ | Any of tool_calling, reasoning. |
retirementDate |
string (date) | いいえ | A planned retirement date, if known. |
customModelDeploymentId |
文字列 | いいえ | Set only if this entry routes to a DataRobot custom model deployment rather than a direct provider endpoint. |
suggestedReplacement |
文字列 | いいえ | An llmId to suggest once this entry is retired. |
isMetered |
ブーリアン | いいえ | Opt in to metering this entry's usage against your own resource codes. Defaults to false. If true, resourceCodes must also be set. |
resourceCodes |
array of object | いいえ | Metering tiers: [{"code": "...", "minTokens": int or null, "maxTokens": int or null}]. Bounds are inclusive input-token ranges; a tier with neither bound is unconditional. Every code must start with BYO_. Required if isMetered is true. |
Response—201 Created, a catalog entry object.
エラー
| ステータス | 発生タイミング |
|---|---|
409 Conflict |
An entry for this model already exists in the tenant. |
422 Unprocessable Entity |
A server-assigned field was included; provider/creator is not a valid pairing; model does not match the provider's prefix; provider is not supported for tenant entries (see note below); or scope names anything other than the tenant. |
備考
provider: datarobot is not currently supported for tenant-created entries and is rejected with 422.
Get a catalog entry¶
GET /llms/{entry_id}/
Response—200 OK, a catalog entry object.
Errors—404 Not Found if the entry does not exist or belongs to another tenant or to the global catalog.
Update a catalog entry¶
PATCH /llms/{entry_id}/
Partial update: send only the fields you want to change, in a plain JSON object (either camelCase or snake_case field names, not a mix of both spellings of the same field in one request).
Request body—any subset of the mutable fields. All other fields listed under Create a catalog entry except provider, creator, and model are mutable; provider, creator, model, llmId, customModelDeploymentId and the identity fields below are immutable—delete and recreate the entry to change any of those.
Response—200 OK, the updated catalog entry object.
エラー
| ステータス | 発生タイミング |
|---|---|
404 Not Found |
No such entry in the tenant. |
422 Unprocessable Entity |
The patch is empty; a field is unknown, immutable, or server-assigned; or the resulting entry would fail the same validation as creation. |
Delete a catalog entry¶
DELETE /llms/{entry_id}/
Response—204 No Content.
Errors—404 Not Found if no such entry exists in your tenant.
Catalog entry object¶
{
"id": "65f1a2b3c4d5e6f7a8b9c0d3",
"scope": { "scope": "tenant", "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6" },
"provider": "bedrock",
"creator": "Anthropic",
"model": "bedrock/anthropic.claude-sonnet-4-5-20250929-v1:0",
"llmId": "my-tenant-claude-sonnet",
"name": "Claude Sonnet 4.5 (tenant BYO)",
"version": "2025-09-29",
"description": "Tenant-registered Claude Sonnet 4.5 via our own Bedrock account.",
"license": "See provider terms",
"supportedLanguages": ["Multilingual"],
"contextSize": 200000,
"maxCompletionTokens": 64000,
"inputTypes": ["text", "image"],
"outputTypes": ["text"],
"capabilities": ["tool_calling", "reasoning"],
"documentationLink": "https://...",
"referenceLinks": [],
"dateAdded": "2026-09-09",
"retirementDate": null,
"isPreview": false,
"isMetered": false,
"availableForTrial": false,
"isDeprecated": false,
"isActive": true,
"crossRegionInferenceMap": {},
"availableRegions": [],
"availableLitellmEndpoints": { "supportsChatCompletions": true, "supportsResponses": false },
"unsupportedParams": [],
"resourceCodes": [],
"permissionId": "65f1a2b3c4d5e6f7a8b9c0d3"
}
Fields not covered in Create a catalog entry:
| フィールド | タイプ | 説明 |
|---|---|---|
id |
文字列 | The entry's identifier. |
scope |
object | Always {"scope": "tenant", "id": "<your tenant id>"} for entries created through this API. |
dateAdded |
string (date) | Set by the server at creation time. |
availableForTrial |
ブーリアン | Always false for tenant entries—trial availability is a DataRobot entitlement decision, not a tenant's. |
isDeprecated / isActive |
ブーリアン | Computed from retirementDate. |
availableRegions |
array of string | Has no effect for custom LLM catalog entries. |
unsupportedParams |
array of string | Computed from the model's provider capabilities. |
permissionId |
文字列 | Internal identifier; equal to id for tenant entries. |
isMetered and resourceCodes are yours to set—see Create a catalog entry. Unlike DataRobot-billed catalog entries, your own provider usage is unmetered by default; opting in only gets you usage stats against resource codes you define, not DataRobot billing.
Server-assigned fields¶
The following fields are assigned by the server: id, permissionId, dateAdded, availableForTrial, isDeprecated, isActive, unsupportedParams. Sending any of these in a POST request body is rejected with 422.
Mutable fields¶
Every field on the entry except id, scope, permissionId, provider, creator, model, llmId, and customModelDeploymentId can be changed with PATCH. The excluded fields define what the entry is or routes to. To change them, delete and recreate the entity.
Valid provider/creator pairings¶
| プロバイダー | Valid creator values |
|---|---|
azure |
OpenAI |
bedrock |
Amazon, Anthropic, Cohere, DeepSeek, Meta, Mistral, NVIDIA, OpenAI |
vertex_ai |
Anthropic, Google, Meta, Mistral, OpenAI |
anthropic |
Anthropic |
cohere |
Cohere |
openai |
OpenAI |
togetherai |
Arcee AI, Google, Marin, Meta, Mistral |
alibaba |
Alibaba |
other |
Other |
A provider/creator combination not listed in this table is rejected with 422 Unprocessable Entity. cerebras and groq currently have no valid tenant-entry pairing.
Common error responses¶
| ステータス | Meaning |
|---|---|
400 Bad Request |
Invalid input on the permission rules endpoints—an unrecognized provider/family/LLM, or a disallowed resource. The detail field describes what and why. |
401 Unauthorized |
Missing or invalid credentials. |
403 Forbidden |
User was authenticated, but does not have organization admin permission, or the organization is a trial org. |
404 Not Found |
The resource does not exist. |
409 Conflict |
A rule or entry already exists for the same uniqueness key (tenant + provider + model), or conflicting items were given in a single permission rules request. |
422 Unprocessable Entity |
The request body failed validation on the credential or catalog entry endpoints; the detail field describes which field and why. |