Data agents
The AI Readiness routes for data agents. 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 data agents the account has assessed #
GET /v1/aiReadiness/dataAgents
Returns one row for each data agent the account has assessed, with its latest score, the change since the assessment before it, what it is grounded on and whether the latest assessment could read each item, and its latest benchmark. The lowest score comes first by default. The list is paged.
- Scope
- BIPixie.Read.All
- Plan
- Every plan
- Counts against
- Calls that read, 300 a minute
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
q | query | string | No | Return only data agents whose name, workspace name or id contains this text. |
workspaceId | query | string (uuid) | No | Return only data agents in this workspace. |
sort | query | string | No | The order of the list. The lowest score comes first by default. One of ScoreAscending, ScoreDescending, BenchmarkAscending, BenchmarkDescending, AssessedNewest, AssessedOldest, BenchmarkNewest, BenchmarkOldest, NameAscending, NameDescending. |
maxResults | query | integer | No | The largest number of rows to return in one page. |
continuationToken | query | string | No | The token the previous page answered with. |
Responses
200. One page of data agents.
| Header | Description |
|---|---|
x-ms-request-id | The id of this request. Quote it to support. |
| Field | Type | Always present | Description |
|---|---|---|---|
value | array of DataAgent | Yes | |
dataAgentId | string or null | Yes | |
displayName | string or null | No | |
workspaceId | string or null | No | |
workspaceName | string or null | No | |
score | number or null | No | The latest AI Readiness score, from 0 to 100. |
previousScore | number or null | No | The score of the assessment before the latest one. |
scoreChange | number or null | No | score less previousScore, as the portal prints it: between the two newest assessments whatever scoring rules produced them. Null when there is no previous score. |
regimeId | string | Yes | The scoring rules that produced score. |
scoredRounds | integer | Yes | 1 when only the deterministic round scored; 2 when an AI round did too. One of 1, 2. |
findingsCount | integer | No | |
publishState | string or null | No | |
previewRuntime | boolean | No | Whether the data agent runs on the preview runtime. |
assessmentCount | integer | Yes | |
lastAssessedAtUtc | string or null (date-time) | No | |
latestAssessmentId | string or null | No | |
groundedOn | array of GroundingSource | Yes | The items the data agent is grounded on, as its latest assessment found them. |
itemId | string or null | No | |
itemType | string or null | No | Fabric's item type where one exists (SemanticModel, Lakehouse, Warehouse, KQLDatabase, MirroredDatabase, SQLDatabase, MirroredAzureDatabricksCatalog), else BI Pixie's own name for the source. |
displayName | string or null | No | |
workspaceId | string or null | No | |
assessed | boolean | Yes | Whether the latest assessment could read this item. A warehouse or a mirrored database is read only with the storage permission. |
optimization | object | Yes | |
count | integer | Yes | How many applies BI Pixie has made to this data agent toward readiness, INCLUDING ones later put back. A revert is not counted, so this number never falls; read standing to learn whether the latest one still stands. |
lastAtUtc | string or null (date-time) | No | When the latest apply landed. Unchanged by a revert. |
standing | string or null | No | Whether the latest recorded apply still stands. Reverted when it was put back and nothing was applied since; Applied otherwise. Null when no apply was ever recorded, which is not the same as one that was undone. A data agent whose change was reverted before 2026-10-06 reads Applied, because reverts were recorded nowhere until then. One of Applied, Reverted, null. |
lastRevertedAtUtc | string or null (date-time) | No | When an apply to this data agent was last put back. Null when none was, and null on a revert made before 2026-10-06. |
benchmark | object | Yes | |
runCount | integer | Yes | |
passRate | number or null | No | The latest run's correct answers out of all its questions, from 0 to 1. A question that was not scored counts as not answered correctly, so read it with scored and notScored. |
scored | integer or null | No | How many of the latest run's questions reached a verdict. Null when the run's counts were not recorded. |
notScored | integer or null | No | How many of the latest run's questions were not scored. Null when the run's counts were not recorded. |
passRateChange | number or null | No | The change against the run before, present only when that run asked about the same semantic model. |
semanticModelId | string or null | No | The semantic model the latest run asked about. |
semanticModelName | string or null | No | |
lastRunAtUtc | string or null (date-time) | No | |
continuationToken | string | No | |
continuationUri | string (uri) | No |
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/dataAgents" 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": [
{
"dataAgentId": "05dd87d1-624f-4ffa-ab88-ee231a75a904",
"displayName": "Contoso Sales",
"workspaceId": "e17c1b59-7a2e-491e-acdd-11434854bbb0",
"workspaceName": "Contoso Sales Analytics",
"score": 78,
"previousScore": 74,
"scoreChange": 4,
"regimeId": "aa6d9e39-ee9e-46d8-a9d4-089f050ea78e",
"scoredRounds": 1,
"findingsCount": 12,
"publishState": "Published",
"previewRuntime": true,
"assessmentCount": 12,
"lastAssessedAtUtc": "2026-09-14T09:42:17Z",
"latestAssessmentId": "8c801b5b-a3d8-4166-9dfe-ceb1a3ecf1f4",
"groundedOn": [
{
"itemId": "d972b3f5-a2fa-47ec-94ff-0403a4d159fa",
"itemType": "SemanticModel",
"displayName": "Contoso Sales",
"workspaceId": "e17c1b59-7a2e-491e-acdd-11434854bbb0",
"assessed": true
}
],
"optimization": {
"count": 12,
"lastAtUtc": "2026-09-14T09:42:17Z",
"standing": "Applied",
"lastRevertedAtUtc": "2026-09-14T09:42:17Z"
},
"benchmark": {
"runCount": 12,
"passRate": 0.75,
"scored": 12,
"notScored": 78,
"passRateChange": 0.05,
"semanticModelId": "f1fdc461-3ca1-4702-ae48-afc3522409fc",
"semanticModelName": "Contoso Sales",
"lastRunAtUtc": "2026-09-14T09:42:17Z"
}
}
],
"continuationToken": "eyJza2lwIjoxMDB9",
"continuationUri": "https://api.bipixie.com/v1/aiReadiness/dataAgents?continuationToken=eyJza2lwIjoxMDB9"
} Get a data agent's AI Readiness in one call #
GET /v1/workspaces/{workspaceId}/dataAgents/{dataAgentId}/aiReadiness
Returns what the portal's data agent page shows, in one call: the registry's row for the data agent, which names what it is grounded on and its latest assessment, the AI provider BI Pixie would write for it with, and where its assessments are. A data agent BI Pixie has no record of in this account, neither assessed nor created through BI Pixie, answers 404; one created but never assessed answers with a null score.
- Scope
- BIPixie.Read.All
- Plan
- Every plan
- Counts against
- Calls that read, 300 a minute
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
workspaceId | path | string (uuid) | Yes | The id of the Fabric workspace. |
dataAgentId | path | string (uuid) | Yes | The id of the data agent in that workspace. |
Responses
200. The data agent's AI Readiness.
| Header | Description |
|---|---|
x-ms-request-id | The id of this request. Quote it to support. |
| Field | Type | Always present | Description |
|---|---|---|---|
dataAgentId | string or null | Yes | |
displayName | string or null | No | |
workspaceId | string or null | No | |
workspaceName | string or null | No | |
score | number or null | No | The latest AI Readiness score, from 0 to 100. |
previousScore | number or null | No | The score of the assessment before the latest one. |
scoreChange | number or null | No | score less previousScore, as the portal prints it: between the two newest assessments whatever scoring rules produced them. Null when there is no previous score. |
regimeId | string | Yes | The scoring rules that produced score. |
scoredRounds | integer | Yes | 1 when only the deterministic round scored; 2 when an AI round did too. One of 1, 2. |
findingsCount | integer | No | |
publishState | string or null | No | |
previewRuntime | boolean | No | Whether the data agent runs on the preview runtime. |
assessmentCount | integer | Yes | |
lastAssessedAtUtc | string or null (date-time) | No | |
latestAssessmentId | string or null | No | |
groundedOn | array of GroundingSource | Yes | The items the data agent is grounded on, as its latest assessment found them. |
itemId | string or null | No | |
itemType | string or null | No | Fabric's item type where one exists (SemanticModel, Lakehouse, Warehouse, KQLDatabase, MirroredDatabase, SQLDatabase, MirroredAzureDatabricksCatalog), else BI Pixie's own name for the source. |
displayName | string or null | No | |
workspaceId | string or null | No | |
assessed | boolean | Yes | Whether the latest assessment could read this item. A warehouse or a mirrored database is read only with the storage permission. |
optimization | object | Yes | |
count | integer | Yes | How many applies BI Pixie has made to this data agent toward readiness, INCLUDING ones later put back. A revert is not counted, so this number never falls; read standing to learn whether the latest one still stands. |
lastAtUtc | string or null (date-time) | No | When the latest apply landed. Unchanged by a revert. |
standing | string or null | No | Whether the latest recorded apply still stands. Reverted when it was put back and nothing was applied since; Applied otherwise. Null when no apply was ever recorded, which is not the same as one that was undone. A data agent whose change was reverted before 2026-10-06 reads Applied, because reverts were recorded nowhere until then. One of Applied, Reverted, null. |
lastRevertedAtUtc | string or null (date-time) | No | When an apply to this data agent was last put back. Null when none was, and null on a revert made before 2026-10-06. |
benchmark | object | Yes | |
runCount | integer | Yes | |
passRate | number or null | No | The latest run's correct answers out of all its questions, from 0 to 1. A question that was not scored counts as not answered correctly, so read it with scored and notScored. |
scored | integer or null | No | How many of the latest run's questions reached a verdict. Null when the run's counts were not recorded. |
notScored | integer or null | No | How many of the latest run's questions were not scored. Null when the run's counts were not recorded. |
passRateChange | number or null | No | The change against the run before, present only when that run asked about the same semantic model. |
semanticModelId | string or null | No | The semantic model the latest run asked about. |
semanticModelName | string or null | No | |
lastRunAtUtc | string or null (date-time) | No | |
aiProvider | one of AiProvider, null | No | |
links | ReadinessLinks | Yes | |
assessments | string (uri) | Yes | Where the item's assessments are listed. |
assess | string (uri) | Yes | Where an assessment of the item is started, with POST. |
abTests | string (uri) | Yes | Where the A/B tests the item is a side of are listed. |
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/workspaces/$WORKSPACE_ID/dataAgents/$DATA_AGENT_ID/aiReadiness" 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
{
"dataAgentId": "05dd87d1-624f-4ffa-ab88-ee231a75a904",
"displayName": "Contoso Sales",
"workspaceId": "e17c1b59-7a2e-491e-acdd-11434854bbb0",
"workspaceName": "Contoso Sales Analytics",
"score": 78,
"previousScore": 74,
"scoreChange": 4,
"regimeId": "aa6d9e39-ee9e-46d8-a9d4-089f050ea78e",
"scoredRounds": 1,
"findingsCount": 12,
"publishState": "Published",
"previewRuntime": true,
"assessmentCount": 12,
"lastAssessedAtUtc": "2026-09-14T09:42:17Z",
"latestAssessmentId": "8c801b5b-a3d8-4166-9dfe-ceb1a3ecf1f4",
"groundedOn": [
{
"itemId": "d972b3f5-a2fa-47ec-94ff-0403a4d159fa",
"itemType": "SemanticModel",
"displayName": "Contoso Sales",
"workspaceId": "e17c1b59-7a2e-491e-acdd-11434854bbb0",
"assessed": true
}
],
"optimization": {
"count": 12,
"lastAtUtc": "2026-09-14T09:42:17Z",
"standing": "Applied",
"lastRevertedAtUtc": "2026-09-14T09:42:17Z"
},
"benchmark": {
"runCount": 12,
"passRate": 0.75,
"scored": 12,
"notScored": 78,
"passRateChange": 0.05,
"semanticModelId": "f1fdc461-3ca1-4702-ae48-afc3522409fc",
"semanticModelName": "Contoso Sales",
"lastRunAtUtc": "2026-09-14T09:42:17Z"
},
"aiProvider": null,
"links": {
"assessments": "https://api.bipixie.com/v1/workspaces/e17c1b59-7a2e-491e-acdd-11434854bbb0/dataAgents/05dd87d1-624f-4ffa-ab88-ee231a75a904/aiReadiness/assessments",
"assess": "https://api.bipixie.com/v1/workspaces/e17c1b59-7a2e-491e-acdd-11434854bbb0/dataAgents/05dd87d1-624f-4ffa-ab88-ee231a75a904/aiReadiness/assess",
"abTests": "https://api.bipixie.com/v1/workspaces/e17c1b59-7a2e-491e-acdd-11434854bbb0/dataAgents/05dd87d1-624f-4ffa-ab88-ee231a75a904/abTests"
}
} List the assessments of a data agent #
GET /v1/workspaces/{workspaceId}/dataAgents/{dataAgentId}/aiReadiness/assessments
Returns the stored assessments of a data agent, newest first. Each one says whether it can be compared with the assessment before it. A data agent with no stored assessment answers an empty list.
- Scope
- BIPixie.Read.All
- Plan
- Every plan
- Counts against
- Calls that read, 300 a minute
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
workspaceId | path | string (uuid) | Yes | The id of the Fabric workspace. |
dataAgentId | path | string (uuid) | Yes | The id of the data agent in that workspace. |
maxResults | query | integer | No | The largest number of rows to return in one page. |
continuationToken | query | string | No | The token the previous page answered with. |
Responses
200. One page of assessments.
| Header | Description |
|---|---|
x-ms-request-id | The id of this request. Quote it to support. |
| Field | Type | Always present | Description |
|---|---|---|---|
value | array of DataAgentAssessmentSummary | Yes | |
assessmentId | string | Yes | |
assessedAtUtc | string or null (date-time) | No | |
score | number or null | No | |
findingsCount | integer or null | No | |
sourcesCount | integer or null | No | How many items the assessment found the data agent grounded on. |
publishState | string or null | No | |
regimeId | string | Yes | |
comparableWithPrevious | boolean | No | Whether this assessment and the one before it were produced by the same scoring rules. False for the first assessment. |
continuationToken | string | No | |
continuationUri | string (uri) | No |
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/workspaces/$WORKSPACE_ID/dataAgents/$DATA_AGENT_ID/aiReadiness/assessments" 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": [
{
"assessmentId": "63654520-134e-4565-8a3f-030a1ae0eba7",
"assessedAtUtc": "2026-09-14T09:30:05Z",
"score": 78,
"findingsCount": 12,
"sourcesCount": 12,
"publishState": "Published",
"regimeId": "aa6d9e39-ee9e-46d8-a9d4-089f050ea78e",
"comparableWithPrevious": true
}
],
"continuationToken": "eyJza2lwIjoxMDB9",
"continuationUri": "https://api.bipixie.com/v1/workspaces/e17c1b59-7a2e-491e-acdd-11434854bbb0/dataAgents/05dd87d1-624f-4ffa-ab88-ee231a75a904/aiReadiness/assessments?continuationToken=eyJza2lwIjoxMDB9"
} Get an assessment of a data agent #
GET /v1/workspaces/{workspaceId}/dataAgents/{dataAgentId}/aiReadiness/assessments/{assessmentId}
Returns one stored assessment of a data agent, whole. The assessment is read from where the account keeps its results, which does not record the permissions it ran with, so usage.access and storage.access say NotRecorded; the document's sources say which were read. An id that is not an assessment of this data agent in this account answers 404.
- Scope
- BIPixie.Read.All
- Plan
- Every plan
- Counts against
- Calls that read, 300 a minute
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
workspaceId | path | string (uuid) | Yes | The id of the Fabric workspace. |
dataAgentId | path | string (uuid) | Yes | The id of the data agent in that workspace. |
assessmentId | path | string | Yes | The assessmentId from a list of assessments or from a result. |
Responses
200. The assessment.
| Header | Description |
|---|---|
x-ms-request-id | The id of this request. Quote it to support. |
| Field | Type | Always present | Description |
|---|---|---|---|
assessmentId | string or null | Yes | The id of the stored assessment. Null when the assessment was not stored. |
dataAgentId | string or null | Yes | |
displayName | string or null | No | |
workspaceId | string or null | No | |
workspaceName | string or null | No | |
assessedAtUtc | string or null (date-time) | No | |
score | number or null | Yes | The data agent's AI Readiness score, from 0 to 100. |
scoreBasic | number or null | No | The score of the deterministic round alone. Equal to score unless an AI round moved it. |
scoredRounds | integer | Yes | 1 when only the deterministic round scored; 2 when an AI round did too. One of 1, 2. |
findingsCount | integer or null | No | |
checksCount | integer or null | No | |
publishState | string or null | No | |
usage | PermissionNote | Yes | Whether BI Pixie could act on the signed-in person's behalf for one permission: Granted, ConsentRequired when the person has not granted it, or Unavailable when Microsoft did not answer. Known on the result of an operation. An assessment read later from where it is stored does not record the permissions it ran with, and says NotRecorded; its document says which sources were read. |
access | string | Yes | One of Granted, ConsentRequired, Unavailable, NotRecorded. |
permission | string | No | The permission by name: Dataset.Read.All for usage, Azure Storage user_impersonation for storage, DataAgent.Execute.All for agent. Present with ConsentRequired and Unavailable. |
message | string | No | What BI Pixie could not do without the permission, what the result is missing because of it, and what to do. Present with ConsentRequired and Unavailable. |
consentUrl | string (uri) | No | Where the permission is granted. Present with ConsentRequired. Its grant query parameter names the permission: usage, storage or dataAgent. |
storage | PermissionNote | Yes | Whether BI Pixie could act on the signed-in person's behalf for one permission: Granted, ConsentRequired when the person has not granted it, or Unavailable when Microsoft did not answer. Known on the result of an operation. An assessment read later from where it is stored does not record the permissions it ran with, and says NotRecorded; its document says which sources were read. |
access | string | Yes | One of Granted, ConsentRequired, Unavailable, NotRecorded. |
permission | string | No | The permission by name: Dataset.Read.All for usage, Azure Storage user_impersonation for storage, DataAgent.Execute.All for agent. Present with ConsentRequired and Unavailable. |
message | string | No | What BI Pixie could not do without the permission, what the result is missing because of it, and what to do. Present with ConsentRequired and Unavailable. |
consentUrl | string (uri) | No | Where the permission is granted. Present with ConsentRequired. Its grant query parameter names the permission: usage, storage or dataAgent. |
agent | object | No | Whether BI Pixie could ask a Fabric data agent questions on the signed-in person's behalf, which the AI round needs when the account's AI provider is a data agent. Present only on the result of an operation started with aiChecks; without the permission the round ran and its checks say they could not. |
access | string | Yes | One of Granted, ConsentRequired, Unavailable, NotRecorded. |
permission | string | No | The permission by name: Dataset.Read.All for usage, Azure Storage user_impersonation for storage, DataAgent.Execute.All for agent. Present with ConsentRequired and Unavailable. |
message | string | No | What BI Pixie could not do without the permission, what the result is missing because of it, and what to do. Present with ConsentRequired and Unavailable. |
consentUrl | string (uri) | No | Where the permission is granted. Present with ConsentRequired. Its grant query parameter names the permission: usage, storage or dataAgent. |
regime | object | Yes | |
id | string | Yes | |
stored | object | Yes | |
location | string | Yes | One of BIPixie, CustomerOneLake, CustomerStorage, Unknown, None. |
reason | string or null | No | |
deliveryPending | boolean | Yes | |
document | object | Yes | |
schemaVersion | integer | 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 GET \
-H "Authorization: Bearer $TOKEN" \
"https://api.bipixie.com/v1/workspaces/$WORKSPACE_ID/dataAgents/$DATA_AGENT_ID/aiReadiness/assessments/$ASSESSMENT_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
{
"assessmentId": "63654520-134e-4565-8a3f-030a1ae0eba7",
"dataAgentId": "05dd87d1-624f-4ffa-ab88-ee231a75a904",
"displayName": "Contoso Sales",
"workspaceId": "e17c1b59-7a2e-491e-acdd-11434854bbb0",
"workspaceName": "Contoso Sales Analytics",
"assessedAtUtc": "2026-09-14T09:30:05Z",
"score": 78,
"scoreBasic": 78,
"scoredRounds": 1,
"findingsCount": 12,
"checksCount": 12,
"publishState": "Published",
"usage": {
"access": "Granted",
"permission": "ConsentRequired",
"message": "ConsentRequired",
"consentUrl": "https://login.microsoftonline.com/organizations/oauth2/v2.0/authorize?client_id=ebc40edd-1874-4e14-a1e5-e21b45f6286a&response_type=code"
},
"storage": {
"access": "Granted",
"permission": "ConsentRequired",
"message": "ConsentRequired",
"consentUrl": "https://login.microsoftonline.com/organizations/oauth2/v2.0/authorize?client_id=ebc40edd-1874-4e14-a1e5-e21b45f6286a&response_type=code"
},
"agent": {
"access": "Granted",
"permission": "ConsentRequired",
"message": "ConsentRequired",
"consentUrl": "https://login.microsoftonline.com/organizations/oauth2/v2.0/authorize?client_id=ebc40edd-1874-4e14-a1e5-e21b45f6286a&response_type=code"
},
"regime": {
"id": "3f4bc9c2-b27e-49df-9de1-a78801b93655"
},
"stored": {
"location": "BIPixie",
"reason": "Not available for this item.",
"deliveryPending": true
},
"document": {
"schemaVersion": 3
}
} Assess a data agent #
POST /v1/workspaces/{workspaceId}/dataAgents/{dataAgentId}/aiReadiness/assess
Starts an assessment of a data agent and answers with the operation to ask about. The assessment is the one the BI Pixie portal runs: it is counted against the day's assessments, it is stored where the account keeps its results, and it appears in the portal with every other assessment. The first assessment of a data agent is a first look; a later assessment makes it a tracked item.
With no body this is the deterministic round. A body of {"aiChecks": true} also asks the account's AI provider the questions the deterministic checks cannot answer, after them, in the same operation; the result then says scoredRounds: 2. When the provider is a Fabric data agent, the round asks it as the signed-in person, which needs a permission they grant; without it the round runs and those checks come back unchecked, as in the portal. An account with no provider is not refused: the checks say why they could not run.
A data agent grounded on a warehouse or a mirrored database can be read fully only with a storage permission the signed-in person grants. Without it the assessment still runs, those sources report unread, and storage.access in the result says ConsentRequired with the page where the permission is granted. The usage permission works the same way, as for a semantic model.
- Scope
- BIPixie.ReadWrite.All
- Plan
- Every plan
- Counts against
- Calls that start work, 30 a minute
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
workspaceId | path | string (uuid) | Yes | The id of the Fabric workspace. |
dataAgentId | path | string (uuid) | Yes | The id of the data agent in that workspace. |
Request body
JSON, DataAgentAssessRequest. The body is optional.
| Field | Type | Required | Description |
|---|---|---|---|
aiChecks | boolean | No | Also run the round that asks the account's AI provider. |
Responses
202. The assessment was started. The body carries the operation's id and address.
| Header | Description |
|---|---|
x-ms-request-id | The id of this request. Quote it to support. |
x-ms-operation-id | The id of the operation. |
Location | The address of the operation's state. |
Retry-After | Seconds to wait before asking for the operation's state. |
To follow the work this call started, see Follow a long-running operation.
| Field | Type | Always present | Description |
|---|---|---|---|
operationId | string (uuid) | Yes | The operation's id, which the operation's state and result take. |
location | string (uri) | Yes | Where to ask about the operation. |
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" \
"https://api.bipixie.com/v1/workspaces/$WORKSPACE_ID/dataAgents/$DATA_AGENT_ID/aiReadiness/assess" An example of what the call answers. The values are fictional.
HTTP/1.1 202 Accepted
Content-Type: application/json
x-ms-request-id: cbf21b6d-b661-4b52-88cb-d79712e504fc
x-ms-operation-id: cd57b041-e44a-4dda-a4ff-02935ffb8c04
Location: https://api.bipixie.com/v1/operations/cd57b041-e44a-4dda-a4ff-02935ffb8c04
Retry-After: 5
{
"operationId": "cd57b041-e44a-4dda-a4ff-02935ffb8c04",
"location": "https://api.bipixie.com/v1/workspaces/e17c1b59-7a2e-491e-acdd-11434854bbb0/dataAgents/05dd87d1-624f-4ffa-ab88-ee231a75a904/aiReadiness/assess"
} Preview or write a data agent's optimization #
POST /v1/workspaces/{workspaceId}/dataAgents/{dataAgentId}/aiReadiness/optimize
Offers what the BI Pixie portal's Optimize card offers on a data agent, from its latest assessment: the AI instructions the account's AI provider wrote for it, the published description, and grounding each semantic model source on what that semantic model now holds. A data agent that was never assessed answers 404 AssessmentNotFound.
approval: required answers a preview and writes nothing; its result is a DataAgentOptimizationPreview, kept 24 hours. The body may carry the caller's own instructions, which replace the proposal, and description, which is the only way a description is offered. A later call with the preview's previewId writes it, whole or by keys.
approval: none proposes and writes in one operation, and writes only what a revert can put back: AI instructions and the description. Grounding is rebuilt from the semantic model when it is written, so it has no previous value to restore; it is listed under skipped as NotRestorable and is written only by an apply of a reviewed preview. A proposal with nothing a revert could put back is 400 InvalidRequest before anything is written.
Each change is written, published and assessed again, as in the portal, so each one counts as one of the day's assessments. An apply of several changes writes them one after another: the next starts when a poll of the operation by the person who started it sees the previous one finish, because the write runs as whoever's token starts it. Another member of the account polling reads Running and starts nothing.
Before anything is written, BI Pixie records the previous value and the written value of every change, from the assessment and never from a fresh read, and keeps the record 30 days. If the data agent changed in Fabric since that assessment, the write is refused and the operation fails with ItemChanged. When a later change fails after earlier ones were written, the operation fails and its record keeps what was written, with the rest listed as NotApplied, so revert can still put the written ones back.
- Scope
- BIPixie.ReadWrite.All
- Plan
- Every plan
- Counts against
- Calls that start work, 30 a minute
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
workspaceId | path | string (uuid) | Yes | The id of the Fabric workspace. |
dataAgentId | path | string (uuid) | Yes | The id of the data agent in that workspace. |
Request body
JSON, one of value, value. The body is required.
| Field | Type | Required | Description |
|---|---|---|---|
approval | string | No | required answers a preview and writes nothing. none proposes and writes what a revert can put back in one operation. Never the default, and audited as such. One of required, none. |
instructions | string | No | With approval: AI instructions to propose instead of the ones the account's AI provider wrote. |
description | string | No | With approval: the description to propose for the data agent. |
previewId | string | No | The preview whose changes are written. From the preview's result. |
keys | array of string | No | With previewId: the keys of the preview's changes to write. Left out, every change is written. A key the preview does not have is 400 InvalidRequest. |
Responses
202. The preview was made, or the change was started. The body carries the operation's id and address.
| Header | Description |
|---|---|
x-ms-request-id | The id of this request. Quote it to support. |
x-ms-operation-id | The id of the operation. |
Location | The address of the operation's state. |
Retry-After | Seconds to wait before asking for the operation's state. |
To follow the work this call started, see Follow a long-running operation.
| Field | Type | Always present | Description |
|---|---|---|---|
operationId | string (uuid) | Yes | The operation's id, which the operation's state and result take. |
location | string (uri) | Yes | Where to ask about the operation. |
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 '{
"approval": "required"
}' \
"https://api.bipixie.com/v1/workspaces/$WORKSPACE_ID/dataAgents/$DATA_AGENT_ID/aiReadiness/optimize" An example of what the call answers. The values are fictional.
HTTP/1.1 202 Accepted
Content-Type: application/json
x-ms-request-id: cbf21b6d-b661-4b52-88cb-d79712e504fc
x-ms-operation-id: cd57b041-e44a-4dda-a4ff-02935ffb8c04
Location: https://api.bipixie.com/v1/operations/cd57b041-e44a-4dda-a4ff-02935ffb8c04
Retry-After: 5
{
"operationId": "cd57b041-e44a-4dda-a4ff-02935ffb8c04",
"location": "https://api.bipixie.com/v1/workspaces/e17c1b59-7a2e-491e-acdd-11434854bbb0/dataAgents/05dd87d1-624f-4ffa-ab88-ee231a75a904/aiReadiness/optimize"
} Put back what a data agent apply changed #
POST /v1/workspaces/{workspaceId}/dataAgents/{dataAgentId}/aiReadiness/revert
Writes back the previous AI instructions and description an apply to this data agent replaced, and nothing else. Grounding the apply aligned is listed under skipped as NotRestorable, because it has no previous value; an apply that aligned only grounding is 400 InvalidRequest. The revert counts as one of the day's assessments for each change it writes, like the apply, and its result is the same record shape with reverts naming the apply it put back.
It is refused before anything is written when a later apply made through this API still stands on one of the same changes (409 ItemChanged), for an apply that has not finished (409 OperationInProgress), wrote nothing, or was already reverted (400 InvalidRequest), and for an id that is not an apply of this data agent by this account (404 OperationNotFound). If the data agent changed in Fabric since the apply, the write is refused and the operation fails with ItemChanged.
- Scope
- BIPixie.ReadWrite.All
- Plan
- Every plan
- Counts against
- Calls that start work, 30 a minute
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
workspaceId | path | string (uuid) | Yes | The id of the Fabric workspace. |
dataAgentId | path | string (uuid) | Yes | The id of the data agent in that workspace. |
Request body
JSON, object. The body is required.
| Field | Type | Required | Description |
|---|---|---|---|
operationId | string | Yes | The id the apply answered, also its result's revertOperationId. |
Responses
202. The restore was started. The body carries the operation's id and address.
| Header | Description |
|---|---|
x-ms-request-id | The id of this request. Quote it to support. |
x-ms-operation-id | The id of the operation. |
Location | The address of the operation's state. |
Retry-After | Seconds to wait before asking for the operation's state. |
To follow the work this call started, see Follow a long-running operation.
| Field | Type | Always present | Description |
|---|---|---|---|
operationId | string (uuid) | Yes | The operation's id, which the operation's state and result take. |
location | string (uri) | Yes | Where to ask about the operation. |
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 '{
"operationId": "<string>"
}' \
"https://api.bipixie.com/v1/workspaces/$WORKSPACE_ID/dataAgents/$DATA_AGENT_ID/aiReadiness/revert" An example of what the call answers. The values are fictional.
HTTP/1.1 202 Accepted
Content-Type: application/json
x-ms-request-id: cbf21b6d-b661-4b52-88cb-d79712e504fc
x-ms-operation-id: cd57b041-e44a-4dda-a4ff-02935ffb8c04
Location: https://api.bipixie.com/v1/operations/cd57b041-e44a-4dda-a4ff-02935ffb8c04
Retry-After: 5
{
"operationId": "cd57b041-e44a-4dda-a4ff-02935ffb8c04",
"location": "https://api.bipixie.com/v1/workspaces/e17c1b59-7a2e-491e-acdd-11434854bbb0/dataAgents/05dd87d1-624f-4ffa-ab88-ee231a75a904/aiReadiness/revert"
}