Saved AIs
The AI Readiness routes for saved ais. The other areas are listed on the AI Readiness reference.
Every route below follows the conventions in Work with the BI Pixie API. You can also download the OpenAPI document.
List the account's saved AIs #
GET /v1/aiReadiness/aiProviders
Returns the AIs the account has saved, as the portal's AI setup page lists them: the one BI Pixie writes optimizations with, the ones a benchmark can test as a generic AI agent, and the saved credentials they use. No answer carries a key. The saved AIs are an account admin's to see and change; a member is answered 403 AdminRoleRequired.
- Scope
- BIPixie.Read.All
- Plan
- Every plan
- Counts against
- Calls that read, 300 a minute
Responses
200. The saved AIs.
| Header | Description |
|---|---|
x-ms-request-id | The id of this request. Quote it to support. |
| Field | Type | Always present | Description |
|---|---|---|---|
value | array of SavedAi | Yes | |
providerId | string | Yes | The id a benchmark run's GenericAgent takes. |
name | string or null | No | The name the account gave it. |
kind | string | Yes | The service. One of openai, anthropic, azure_openai, fabric_data_agent. |
model | string or null | No | |
deployment | string or null | No | The Azure AI Foundry deployment, for azure_openai. |
credentialId | string or null | No | The saved credential it uses. None for a data agent, which needs no key. |
workspaceId | string or null | No | The Fabric workspace of a data agent. |
dataAgentId | string or null | No | The data agent's Fabric item id. |
dataAgentName | string or null | No | |
isWriter | boolean | Yes | Whether this is the AI BI Pixie writes optimizations with. |
isTested | boolean | Yes | Whether a benchmark can test it as a generic AI agent. |
reachable | boolean | Yes | Whether BI Pixie could reach it the last time it tried. |
addedAtUtc | string or null (date-time) | No | |
credentials | array of SavedAiCredential | Yes | |
credentialId | string | Yes | |
kind | string | Yes | One of openai, anthropic, azure_openai. |
authMode | string | Yes | How BI Pixie signs in to the service. entra is for Azure AI Foundry only. One of api_key, entra. |
endpoint | string or null | No | |
tenantId | string or null | No | For entra only. |
clientId | string or null | No | For entra only. |
usedBy | integer | Yes | How many saved AIs use it. |
addedAtUtc | string or null (date-time) | No | |
maxProviders | integer | Yes | The most AIs an account can save. |
Errors
Every refusal is an ErrorResponse with a stable errorCode. See Errors for what each HTTP status means and every code the API can return.
This is an example of a refusal. Every refusal has the same fields.
HTTP/1.1 404 Not Found
Content-Type: application/json
x-ms-request-id: cbf21b6d-b661-4b52-88cb-d79712e504fc
{
"errorCode": "ItemNotFound",
"message": "No item with this id is visible to the signed-in person in this workspace, or it is not of the type the route takes.",
"isRetriable": false,
"moreDetails": [],
"relatedResource": {
"resourceId": "d972b3f5-a2fa-47ec-94ff-0403a4d159fa",
"resourceType": "SemanticModel"
},
"parameters": [
{
"name": "itemId",
"value": "d972b3f5-a2fa-47ec-94ff-0403a4d159fa"
}
],
"requestId": "cbf21b6d-b661-4b52-88cb-d79712e504fc"
} Example
curl -i -X GET \
-H "Authorization: Bearer $TOKEN" \
"https://api.bipixie.com/v1/aiReadiness/aiProviders" An example of what the call answers. The values are fictional.
HTTP/1.1 200 OK
Content-Type: application/json
x-ms-request-id: cbf21b6d-b661-4b52-88cb-d79712e504fc
{
"value": [
{
"providerId": "b2df6be3-7769-4222-90ea-9fd98f4592e0",
"name": "Contoso Sales",
"kind": "openai",
"model": "Contoso Sales",
"deployment": "Contoso Sales",
"credentialId": "5aaabc9b-2de4-43a2-91b4-fb5db999ba8c",
"workspaceId": "e17c1b59-7a2e-491e-acdd-11434854bbb0",
"dataAgentId": "05dd87d1-624f-4ffa-ab88-ee231a75a904",
"dataAgentName": "Contoso Sales Agent",
"isWriter": true,
"isTested": true,
"reachable": true,
"addedAtUtc": "2026-09-14T09:30:05Z"
}
],
"credentials": [
{
"credentialId": "5aaabc9b-2de4-43a2-91b4-fb5db999ba8c",
"kind": "openai",
"authMode": "api_key",
"endpoint": "Contoso Sales",
"tenantId": "4b0e5e52-dfc8-4417-8d4a-94a8e7d7f08d",
"clientId": "ebc40edd-1874-4e14-a1e5-e21b45f6286a",
"usedBy": 12,
"addedAtUtc": "2026-09-14T09:30:05Z"
}
],
"maxProviders": 3
} Save an AI #
POST /v1/aiReadiness/aiProviders
Saves an AI, with a new key in the body or by naming a saved credential with credentialId, as the setup page does for a second Azure AI Foundry deployment on the same resource. With role optimizations it becomes the AI BI Pixie writes with, and the AI it replaces leaves the list unless it is also tested or keepReplaced is true; with role test a benchmark can test it as a generic AI agent. The first AI saved is also the one BI Pixie writes with. An AI that is already saved is given the other role rather than saved twice. An account holds at most ten saved AIs. A key is taken in the body only: a request whose address carries one is refused 400 InvalidRequest, and no answer returns it. Answers the whole list, because adding one can change another.
- Scope
- BIPixie.ReadWrite.All
- Plan
- Every plan
- Counts against
- Calls that start work, 30 a minute
Request body
JSON, AddSavedAiRequest. The body is required.
| Field | Type | Required | Description |
|---|---|---|---|
kind | string | Yes | One of openai, anthropic, azure_openai, fabric_data_agent. |
name | string | No | |
role | string | No | optimizations makes it the AI BI Pixie writes with; test lets a benchmark test it. When left out, a data agent is saved as the writer and any other AI as one to test, except that the first AI saved is also the writer. One of optimizations, test. |
keepReplaced | boolean | No | With role optimizations, keep the AI it replaces in the list as one to test. |
model | string | No | |
deployment | string | No | The Azure AI Foundry deployment, for azure_openai. |
credentialId | string | No | A saved credential of the same service, instead of a new key. |
authMode | string | No | One of api_key, entra. |
endpoint | string | No | |
apiKey | string | No | The key. Encrypted when saved and never returned. |
clientSecret | string | No | The client secret, for entra. Encrypted when saved and never returned. |
tenantId | string | No | |
clientId | string | No | |
workspaceId | string | No | The Fabric workspace of a data agent. |
dataAgentId | string | No | |
dataAgentName | string | No |
Responses
201. Saved. The body is the whole list as it now stands.
| Header | Description |
|---|---|
x-ms-request-id | The id of this request. Quote it to support. |
| Field | Type | Always present | Description |
|---|---|---|---|
value | array of SavedAi | Yes | |
providerId | string | Yes | The id a benchmark run's GenericAgent takes. |
name | string or null | No | The name the account gave it. |
kind | string | Yes | The service. One of openai, anthropic, azure_openai, fabric_data_agent. |
model | string or null | No | |
deployment | string or null | No | The Azure AI Foundry deployment, for azure_openai. |
credentialId | string or null | No | The saved credential it uses. None for a data agent, which needs no key. |
workspaceId | string or null | No | The Fabric workspace of a data agent. |
dataAgentId | string or null | No | The data agent's Fabric item id. |
dataAgentName | string or null | No | |
isWriter | boolean | Yes | Whether this is the AI BI Pixie writes optimizations with. |
isTested | boolean | Yes | Whether a benchmark can test it as a generic AI agent. |
reachable | boolean | Yes | Whether BI Pixie could reach it the last time it tried. |
addedAtUtc | string or null (date-time) | No | |
credentials | array of SavedAiCredential | Yes | |
credentialId | string | Yes | |
kind | string | Yes | One of openai, anthropic, azure_openai. |
authMode | string | Yes | How BI Pixie signs in to the service. entra is for Azure AI Foundry only. One of api_key, entra. |
endpoint | string or null | No | |
tenantId | string or null | No | For entra only. |
clientId | string or null | No | For entra only. |
usedBy | integer | Yes | How many saved AIs use it. |
addedAtUtc | string or null (date-time) | No | |
maxProviders | integer | Yes | The most AIs an account can save. |
400. The request is not well formed, and nothing was started, changed or counted. errorCode is InvalidRequest, or InvalidPreview for a preview that is not available. A body member the operation does not document is refused this way, and the message names it and the documented member closest to it.
| Header | Description |
|---|---|
x-ms-request-id | The id of this request. Quote it to support. |
| Field | Type | Always present | Description |
|---|---|---|---|
errorCode | string | Yes | Each code keeps its meaning once published. New codes can be added over time, and a code is never reused. One of InvalidRequest, InvalidPreview, PayloadTooLarge, BenchmarkQuestionsMissing, OperationNotSupportedForItem, Unauthorized, TokenExpired, InsufficientScopes, AppOnlyTokenNotSupported, UserNotRegistered, AccountNotActive, AdminRoleRequired, FeatureNotInPlan, FeatureTurnedOff, LicenseNotYours, TrackedItemLimitReached, LicenseTrackedItemLimitReached, FabricConsentRequired, FabricAccessDenied, WorkspaceNotFound, ItemNotFound, AssessmentNotFound, RunNotFound, AbTestNotFound, OperationNotFound, ScheduleNotFound, AiProviderNotFound, AiCredentialNotFound, OperationInProgress, OperationHasNoResult, ResultNotReady, ScheduleConflict, AiProviderConflict, ItemChanged, CapacityPaused, OperationExpired, RegionNotReady, CapacityRequired, CapacityUnpaid, StoreNotConnected, RequestBlocked, AssessmentDailyLimitReached, BenchmarkRunsExhausted, OptimizationApplyDailyLimitReached, FirstLookLimitReached, BenchmarkBuildLimitReached, FabricUnavailable, StoreUnavailable, ThrottleStoreUnavailable, UnknownError. |
message | string | Yes | |
isRetriable | boolean | No | |
moreDetails | array of object | No | |
relatedResource | object or null | No | |
resourceId | string | No | |
resourceType | string | No | |
parameters | array of object | No | |
name | string | Yes | |
value | string | Yes | |
requestId | string (uuid) | Yes |
Errors
Every refusal is an ErrorResponse with a stable errorCode. See Errors for what each HTTP status means and every code the API can return.
This is an example of a refusal. Every refusal has the same fields.
HTTP/1.1 404 Not Found
Content-Type: application/json
x-ms-request-id: cbf21b6d-b661-4b52-88cb-d79712e504fc
{
"errorCode": "ItemNotFound",
"message": "No item with this id is visible to the signed-in person in this workspace, or it is not of the type the route takes.",
"isRetriable": false,
"moreDetails": [],
"relatedResource": {
"resourceId": "d972b3f5-a2fa-47ec-94ff-0403a4d159fa",
"resourceType": "SemanticModel"
},
"parameters": [
{
"name": "itemId",
"value": "d972b3f5-a2fa-47ec-94ff-0403a4d159fa"
}
],
"requestId": "cbf21b6d-b661-4b52-88cb-d79712e504fc"
} Example
curl -i -X POST \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"kind": "openai"
}' \
"https://api.bipixie.com/v1/aiReadiness/aiProviders" An example of what the call answers. The values are fictional.
HTTP/1.1 201 Created
Content-Type: application/json
x-ms-request-id: cbf21b6d-b661-4b52-88cb-d79712e504fc
{
"value": [
{
"providerId": "b2df6be3-7769-4222-90ea-9fd98f4592e0",
"name": "Contoso Sales",
"kind": "openai",
"model": "Contoso Sales",
"deployment": "Contoso Sales",
"credentialId": "5aaabc9b-2de4-43a2-91b4-fb5db999ba8c",
"workspaceId": "e17c1b59-7a2e-491e-acdd-11434854bbb0",
"dataAgentId": "05dd87d1-624f-4ffa-ab88-ee231a75a904",
"dataAgentName": "Contoso Sales Agent",
"isWriter": true,
"isTested": true,
"reachable": true,
"addedAtUtc": "2026-09-14T09:30:05Z"
}
],
"credentials": [
{
"credentialId": "5aaabc9b-2de4-43a2-91b4-fb5db999ba8c",
"kind": "openai",
"authMode": "api_key",
"endpoint": "Contoso Sales",
"tenantId": "4b0e5e52-dfc8-4417-8d4a-94a8e7d7f08d",
"clientId": "ebc40edd-1874-4e14-a1e5-e21b45f6286a",
"usedBy": 12,
"addedAtUtc": "2026-09-14T09:30:05Z"
}
],
"maxProviders": 3
} Rename a saved AI, or make it the one BI Pixie writes with #
PATCH /v1/aiReadiness/aiProviders/{providerId}
Renames the saved AI with name, makes it the AI BI Pixie writes optimizations with when isWriter is true, or both. The AI it replaces leaves the list unless it is also tested. The model is not changed here: a different model is a different saved AI. Answers the whole list, because making one the writer can change another.
- Scope
- BIPixie.ReadWrite.All
- Plan
- Every plan
- Counts against
- Calls that start work, 30 a minute
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
providerId | path | string | Yes | The saved AI's id, as the saved AIs list gives it. A benchmark run's GenericAgent takes the same id. |
Request body
JSON, UpdateSavedAiRequest. The body is required.
| Field | Type | Required | Description |
|---|---|---|---|
name | string | No | |
isWriter | boolean | No | True makes it the AI BI Pixie writes with. False changes nothing. |
Responses
200. Saved. The body is the whole list as it now stands.
| Header | Description |
|---|---|
x-ms-request-id | The id of this request. Quote it to support. |
| Field | Type | Always present | Description |
|---|---|---|---|
value | array of SavedAi | Yes | |
providerId | string | Yes | The id a benchmark run's GenericAgent takes. |
name | string or null | No | The name the account gave it. |
kind | string | Yes | The service. One of openai, anthropic, azure_openai, fabric_data_agent. |
model | string or null | No | |
deployment | string or null | No | The Azure AI Foundry deployment, for azure_openai. |
credentialId | string or null | No | The saved credential it uses. None for a data agent, which needs no key. |
workspaceId | string or null | No | The Fabric workspace of a data agent. |
dataAgentId | string or null | No | The data agent's Fabric item id. |
dataAgentName | string or null | No | |
isWriter | boolean | Yes | Whether this is the AI BI Pixie writes optimizations with. |
isTested | boolean | Yes | Whether a benchmark can test it as a generic AI agent. |
reachable | boolean | Yes | Whether BI Pixie could reach it the last time it tried. |
addedAtUtc | string or null (date-time) | No | |
credentials | array of SavedAiCredential | Yes | |
credentialId | string | Yes | |
kind | string | Yes | One of openai, anthropic, azure_openai. |
authMode | string | Yes | How BI Pixie signs in to the service. entra is for Azure AI Foundry only. One of api_key, entra. |
endpoint | string or null | No | |
tenantId | string or null | No | For entra only. |
clientId | string or null | No | For entra only. |
usedBy | integer | Yes | How many saved AIs use it. |
addedAtUtc | string or null (date-time) | No | |
maxProviders | integer | Yes | The most AIs an account can save. |
400. The request is not well formed, and nothing was started, changed or counted. errorCode is InvalidRequest, or InvalidPreview for a preview that is not available. A body member the operation does not document is refused this way, and the message names it and the documented member closest to it.
| Header | Description |
|---|---|
x-ms-request-id | The id of this request. Quote it to support. |
| Field | Type | Always present | Description |
|---|---|---|---|
errorCode | string | Yes | Each code keeps its meaning once published. New codes can be added over time, and a code is never reused. One of InvalidRequest, InvalidPreview, PayloadTooLarge, BenchmarkQuestionsMissing, OperationNotSupportedForItem, Unauthorized, TokenExpired, InsufficientScopes, AppOnlyTokenNotSupported, UserNotRegistered, AccountNotActive, AdminRoleRequired, FeatureNotInPlan, FeatureTurnedOff, LicenseNotYours, TrackedItemLimitReached, LicenseTrackedItemLimitReached, FabricConsentRequired, FabricAccessDenied, WorkspaceNotFound, ItemNotFound, AssessmentNotFound, RunNotFound, AbTestNotFound, OperationNotFound, ScheduleNotFound, AiProviderNotFound, AiCredentialNotFound, OperationInProgress, OperationHasNoResult, ResultNotReady, ScheduleConflict, AiProviderConflict, ItemChanged, CapacityPaused, OperationExpired, RegionNotReady, CapacityRequired, CapacityUnpaid, StoreNotConnected, RequestBlocked, AssessmentDailyLimitReached, BenchmarkRunsExhausted, OptimizationApplyDailyLimitReached, FirstLookLimitReached, BenchmarkBuildLimitReached, FabricUnavailable, StoreUnavailable, ThrottleStoreUnavailable, UnknownError. |
message | string | Yes | |
isRetriable | boolean | No | |
moreDetails | array of object | No | |
relatedResource | object or null | No | |
resourceId | string | No | |
resourceType | string | No | |
parameters | array of object | No | |
name | string | Yes | |
value | string | Yes | |
requestId | string (uuid) | Yes |
Errors
Every refusal is an ErrorResponse with a stable errorCode. See Errors for what each HTTP status means and every code the API can return.
This is an example of a refusal. Every refusal has the same fields.
HTTP/1.1 404 Not Found
Content-Type: application/json
x-ms-request-id: cbf21b6d-b661-4b52-88cb-d79712e504fc
{
"errorCode": "ItemNotFound",
"message": "No item with this id is visible to the signed-in person in this workspace, or it is not of the type the route takes.",
"isRetriable": false,
"moreDetails": [],
"relatedResource": {
"resourceId": "d972b3f5-a2fa-47ec-94ff-0403a4d159fa",
"resourceType": "SemanticModel"
},
"parameters": [
{
"name": "itemId",
"value": "d972b3f5-a2fa-47ec-94ff-0403a4d159fa"
}
],
"requestId": "cbf21b6d-b661-4b52-88cb-d79712e504fc"
} Example
curl -i -X PATCH \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "<string>",
"isWriter": false
}' \
"https://api.bipixie.com/v1/aiReadiness/aiProviders/$PROVIDER_ID" An example of what the call answers. The values are fictional.
HTTP/1.1 200 OK
Content-Type: application/json
x-ms-request-id: cbf21b6d-b661-4b52-88cb-d79712e504fc
{
"value": [
{
"providerId": "b2df6be3-7769-4222-90ea-9fd98f4592e0",
"name": "Contoso Sales",
"kind": "openai",
"model": "Contoso Sales",
"deployment": "Contoso Sales",
"credentialId": "5aaabc9b-2de4-43a2-91b4-fb5db999ba8c",
"workspaceId": "e17c1b59-7a2e-491e-acdd-11434854bbb0",
"dataAgentId": "05dd87d1-624f-4ffa-ab88-ee231a75a904",
"dataAgentName": "Contoso Sales Agent",
"isWriter": true,
"isTested": true,
"reachable": true,
"addedAtUtc": "2026-09-14T09:30:05Z"
}
],
"credentials": [
{
"credentialId": "5aaabc9b-2de4-43a2-91b4-fb5db999ba8c",
"kind": "openai",
"authMode": "api_key",
"endpoint": "Contoso Sales",
"tenantId": "4b0e5e52-dfc8-4417-8d4a-94a8e7d7f08d",
"clientId": "ebc40edd-1874-4e14-a1e5-e21b45f6286a",
"usedBy": 12,
"addedAtUtc": "2026-09-14T09:30:05Z"
}
],
"maxProviders": 3
} Remove a saved AI #
DELETE /v1/aiReadiness/aiProviders/{providerId}
Removes the saved AI. With role test it is only taken out of the AIs a benchmark can test, and stays the AI BI Pixie writes with if it is that; with role optimizations it is removed only if it is the AI BI Pixie writes with. The AI BI Pixie writes with is changed rather than removed while another AI is saved (409 AiProviderConflict, reason IsTheWriter); the last saved AI can be removed, which leaves the account with none. A credential no saved AI uses any more is removed with it. Answers the whole list.
- Scope
- BIPixie.ReadWrite.All
- Plan
- Every plan
- Counts against
- Calls that start work, 30 a minute
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
providerId | path | string | Yes | The saved AI's id, as the saved AIs list gives it. A benchmark run's GenericAgent takes the same id. |
role | query | string | No | Take the AI out of this one section only. Both, when left out. One of optimizations, test. |
Responses
200. Removed. The body is the whole list as it now stands.
| Header | Description |
|---|---|
x-ms-request-id | The id of this request. Quote it to support. |
| Field | Type | Always present | Description |
|---|---|---|---|
value | array of SavedAi | Yes | |
providerId | string | Yes | The id a benchmark run's GenericAgent takes. |
name | string or null | No | The name the account gave it. |
kind | string | Yes | The service. One of openai, anthropic, azure_openai, fabric_data_agent. |
model | string or null | No | |
deployment | string or null | No | The Azure AI Foundry deployment, for azure_openai. |
credentialId | string or null | No | The saved credential it uses. None for a data agent, which needs no key. |
workspaceId | string or null | No | The Fabric workspace of a data agent. |
dataAgentId | string or null | No | The data agent's Fabric item id. |
dataAgentName | string or null | No | |
isWriter | boolean | Yes | Whether this is the AI BI Pixie writes optimizations with. |
isTested | boolean | Yes | Whether a benchmark can test it as a generic AI agent. |
reachable | boolean | Yes | Whether BI Pixie could reach it the last time it tried. |
addedAtUtc | string or null (date-time) | No | |
credentials | array of SavedAiCredential | Yes | |
credentialId | string | Yes | |
kind | string | Yes | One of openai, anthropic, azure_openai. |
authMode | string | Yes | How BI Pixie signs in to the service. entra is for Azure AI Foundry only. One of api_key, entra. |
endpoint | string or null | No | |
tenantId | string or null | No | For entra only. |
clientId | string or null | No | For entra only. |
usedBy | integer | Yes | How many saved AIs use it. |
addedAtUtc | string or null (date-time) | No | |
maxProviders | integer | Yes | The most AIs an account can save. |
400. The request is not well formed, and nothing was started, changed or counted. errorCode is InvalidRequest, or InvalidPreview for a preview that is not available. A body member the operation does not document is refused this way, and the message names it and the documented member closest to it.
| Header | Description |
|---|---|
x-ms-request-id | The id of this request. Quote it to support. |
| Field | Type | Always present | Description |
|---|---|---|---|
errorCode | string | Yes | Each code keeps its meaning once published. New codes can be added over time, and a code is never reused. One of InvalidRequest, InvalidPreview, PayloadTooLarge, BenchmarkQuestionsMissing, OperationNotSupportedForItem, Unauthorized, TokenExpired, InsufficientScopes, AppOnlyTokenNotSupported, UserNotRegistered, AccountNotActive, AdminRoleRequired, FeatureNotInPlan, FeatureTurnedOff, LicenseNotYours, TrackedItemLimitReached, LicenseTrackedItemLimitReached, FabricConsentRequired, FabricAccessDenied, WorkspaceNotFound, ItemNotFound, AssessmentNotFound, RunNotFound, AbTestNotFound, OperationNotFound, ScheduleNotFound, AiProviderNotFound, AiCredentialNotFound, OperationInProgress, OperationHasNoResult, ResultNotReady, ScheduleConflict, AiProviderConflict, ItemChanged, CapacityPaused, OperationExpired, RegionNotReady, CapacityRequired, CapacityUnpaid, StoreNotConnected, RequestBlocked, AssessmentDailyLimitReached, BenchmarkRunsExhausted, OptimizationApplyDailyLimitReached, FirstLookLimitReached, BenchmarkBuildLimitReached, FabricUnavailable, StoreUnavailable, ThrottleStoreUnavailable, UnknownError. |
message | string | Yes | |
isRetriable | boolean | No | |
moreDetails | array of object | No | |
relatedResource | object or null | No | |
resourceId | string | No | |
resourceType | string | No | |
parameters | array of object | No | |
name | string | Yes | |
value | string | Yes | |
requestId | string (uuid) | Yes |
Errors
Every refusal is an ErrorResponse with a stable errorCode. See Errors for what each HTTP status means and every code the API can return.
This is an example of a refusal. Every refusal has the same fields.
HTTP/1.1 404 Not Found
Content-Type: application/json
x-ms-request-id: cbf21b6d-b661-4b52-88cb-d79712e504fc
{
"errorCode": "ItemNotFound",
"message": "No item with this id is visible to the signed-in person in this workspace, or it is not of the type the route takes.",
"isRetriable": false,
"moreDetails": [],
"relatedResource": {
"resourceId": "d972b3f5-a2fa-47ec-94ff-0403a4d159fa",
"resourceType": "SemanticModel"
},
"parameters": [
{
"name": "itemId",
"value": "d972b3f5-a2fa-47ec-94ff-0403a4d159fa"
}
],
"requestId": "cbf21b6d-b661-4b52-88cb-d79712e504fc"
} Example
curl -i -X DELETE \
-H "Authorization: Bearer $TOKEN" \
"https://api.bipixie.com/v1/aiReadiness/aiProviders/$PROVIDER_ID" An example of what the call answers. The values are fictional.
HTTP/1.1 200 OK
Content-Type: application/json
x-ms-request-id: cbf21b6d-b661-4b52-88cb-d79712e504fc
{
"value": [
{
"providerId": "b2df6be3-7769-4222-90ea-9fd98f4592e0",
"name": "Contoso Sales",
"kind": "openai",
"model": "Contoso Sales",
"deployment": "Contoso Sales",
"credentialId": "5aaabc9b-2de4-43a2-91b4-fb5db999ba8c",
"workspaceId": "e17c1b59-7a2e-491e-acdd-11434854bbb0",
"dataAgentId": "05dd87d1-624f-4ffa-ab88-ee231a75a904",
"dataAgentName": "Contoso Sales Agent",
"isWriter": true,
"isTested": true,
"reachable": true,
"addedAtUtc": "2026-09-14T09:30:05Z"
}
],
"credentials": [
{
"credentialId": "5aaabc9b-2de4-43a2-91b4-fb5db999ba8c",
"kind": "openai",
"authMode": "api_key",
"endpoint": "Contoso Sales",
"tenantId": "4b0e5e52-dfc8-4417-8d4a-94a8e7d7f08d",
"clientId": "ebc40edd-1874-4e14-a1e5-e21b45f6286a",
"usedBy": 12,
"addedAtUtc": "2026-09-14T09:30:05Z"
}
],
"maxProviders": 3
} Replace a saved credential's key #
PUT /v1/aiReadiness/aiProviderCredentials/{credentialId}
Replaces the key of a saved credential, which changes every saved AI that uses it, and clears what BI Pixie last recorded about reaching them. The service, the sign-in method and the endpoint stay: a different resource is a different credential. A credential that signs in with Microsoft Entra takes a new clientSecret, and may take a new tenantId or clientId; any other takes a new apiKey. The key is taken in the body only, and no answer returns it. Answers the whole list.
- Scope
- BIPixie.ReadWrite.All
- Plan
- Every plan
- Counts against
- Calls that start work, 30 a minute
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
credentialId | path | string | Yes | The saved credential's id, as the saved AIs list gives it. |
Request body
JSON, ReplaceSavedAiKeyRequest. The body is required.
| Field | Type | Required | Description |
|---|---|---|---|
apiKey | string | No | |
clientSecret | string | No | |
tenantId | string | No | |
clientId | string | No |
Responses
200. Replaced. The body is the whole list as it now stands.
| Header | Description |
|---|---|
x-ms-request-id | The id of this request. Quote it to support. |
| Field | Type | Always present | Description |
|---|---|---|---|
value | array of SavedAi | Yes | |
providerId | string | Yes | The id a benchmark run's GenericAgent takes. |
name | string or null | No | The name the account gave it. |
kind | string | Yes | The service. One of openai, anthropic, azure_openai, fabric_data_agent. |
model | string or null | No | |
deployment | string or null | No | The Azure AI Foundry deployment, for azure_openai. |
credentialId | string or null | No | The saved credential it uses. None for a data agent, which needs no key. |
workspaceId | string or null | No | The Fabric workspace of a data agent. |
dataAgentId | string or null | No | The data agent's Fabric item id. |
dataAgentName | string or null | No | |
isWriter | boolean | Yes | Whether this is the AI BI Pixie writes optimizations with. |
isTested | boolean | Yes | Whether a benchmark can test it as a generic AI agent. |
reachable | boolean | Yes | Whether BI Pixie could reach it the last time it tried. |
addedAtUtc | string or null (date-time) | No | |
credentials | array of SavedAiCredential | Yes | |
credentialId | string | Yes | |
kind | string | Yes | One of openai, anthropic, azure_openai. |
authMode | string | Yes | How BI Pixie signs in to the service. entra is for Azure AI Foundry only. One of api_key, entra. |
endpoint | string or null | No | |
tenantId | string or null | No | For entra only. |
clientId | string or null | No | For entra only. |
usedBy | integer | Yes | How many saved AIs use it. |
addedAtUtc | string or null (date-time) | No | |
maxProviders | integer | Yes | The most AIs an account can save. |
400. The request is not well formed, and nothing was started, changed or counted. errorCode is InvalidRequest, or InvalidPreview for a preview that is not available. A body member the operation does not document is refused this way, and the message names it and the documented member closest to it.
| Header | Description |
|---|---|
x-ms-request-id | The id of this request. Quote it to support. |
| Field | Type | Always present | Description |
|---|---|---|---|
errorCode | string | Yes | Each code keeps its meaning once published. New codes can be added over time, and a code is never reused. One of InvalidRequest, InvalidPreview, PayloadTooLarge, BenchmarkQuestionsMissing, OperationNotSupportedForItem, Unauthorized, TokenExpired, InsufficientScopes, AppOnlyTokenNotSupported, UserNotRegistered, AccountNotActive, AdminRoleRequired, FeatureNotInPlan, FeatureTurnedOff, LicenseNotYours, TrackedItemLimitReached, LicenseTrackedItemLimitReached, FabricConsentRequired, FabricAccessDenied, WorkspaceNotFound, ItemNotFound, AssessmentNotFound, RunNotFound, AbTestNotFound, OperationNotFound, ScheduleNotFound, AiProviderNotFound, AiCredentialNotFound, OperationInProgress, OperationHasNoResult, ResultNotReady, ScheduleConflict, AiProviderConflict, ItemChanged, CapacityPaused, OperationExpired, RegionNotReady, CapacityRequired, CapacityUnpaid, StoreNotConnected, RequestBlocked, AssessmentDailyLimitReached, BenchmarkRunsExhausted, OptimizationApplyDailyLimitReached, FirstLookLimitReached, BenchmarkBuildLimitReached, FabricUnavailable, StoreUnavailable, ThrottleStoreUnavailable, UnknownError. |
message | string | Yes | |
isRetriable | boolean | No | |
moreDetails | array of object | No | |
relatedResource | object or null | No | |
resourceId | string | No | |
resourceType | string | No | |
parameters | array of object | No | |
name | string | Yes | |
value | string | Yes | |
requestId | string (uuid) | Yes |
Errors
Every refusal is an ErrorResponse with a stable errorCode. See Errors for what each HTTP status means and every code the API can return.
This is an example of a refusal. Every refusal has the same fields.
HTTP/1.1 404 Not Found
Content-Type: application/json
x-ms-request-id: cbf21b6d-b661-4b52-88cb-d79712e504fc
{
"errorCode": "ItemNotFound",
"message": "No item with this id is visible to the signed-in person in this workspace, or it is not of the type the route takes.",
"isRetriable": false,
"moreDetails": [],
"relatedResource": {
"resourceId": "d972b3f5-a2fa-47ec-94ff-0403a4d159fa",
"resourceType": "SemanticModel"
},
"parameters": [
{
"name": "itemId",
"value": "d972b3f5-a2fa-47ec-94ff-0403a4d159fa"
}
],
"requestId": "cbf21b6d-b661-4b52-88cb-d79712e504fc"
} Example
curl -i -X PUT \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"apiKey": "<string>",
"clientSecret": "<string>",
"tenantId": "<string>",
"clientId": "<string>"
}' \
"https://api.bipixie.com/v1/aiReadiness/aiProviderCredentials/$CREDENTIAL_ID" An example of what the call answers. The values are fictional.
HTTP/1.1 200 OK
Content-Type: application/json
x-ms-request-id: cbf21b6d-b661-4b52-88cb-d79712e504fc
{
"value": [
{
"providerId": "b2df6be3-7769-4222-90ea-9fd98f4592e0",
"name": "Contoso Sales",
"kind": "openai",
"model": "Contoso Sales",
"deployment": "Contoso Sales",
"credentialId": "5aaabc9b-2de4-43a2-91b4-fb5db999ba8c",
"workspaceId": "e17c1b59-7a2e-491e-acdd-11434854bbb0",
"dataAgentId": "05dd87d1-624f-4ffa-ab88-ee231a75a904",
"dataAgentName": "Contoso Sales Agent",
"isWriter": true,
"isTested": true,
"reachable": true,
"addedAtUtc": "2026-09-14T09:30:05Z"
}
],
"credentials": [
{
"credentialId": "5aaabc9b-2de4-43a2-91b4-fb5db999ba8c",
"kind": "openai",
"authMode": "api_key",
"endpoint": "Contoso Sales",
"tenantId": "4b0e5e52-dfc8-4417-8d4a-94a8e7d7f08d",
"clientId": "ebc40edd-1874-4e14-a1e5-e21b45f6286a",
"usedBy": 12,
"addedAtUtc": "2026-09-14T09:30:05Z"
}
],
"maxProviders": 3
}