Skip to main content

Ace

Providers, usage and the assistant’s own surface.

These paths are global — they are not tied to a plugin instance.

31 endpoints. Every one needs Authorization: Bearer <access token>; see Getting Started.

Permissions

The server authorises every call against the signed-in user's permission keys — the same keys the client is held to. For this module they are the AiProvidersManage, AI Usage View and AI Commercial Manage key families. See the Permission Keys reference.

Ai user instruction set​

MethodPathWhat it does
POSTai/ai-user-instruction-setAi user instruction set

POST ai/ai-user-instruction-set​

Ai user instruction set.

Payload

Request body

{
"instructionText": "string"
}

Availability​

MethodPathWhat it does
GETai/availabilityAi get availability

Chats​

MethodPathWhat it does
GETai/chatsAi chat session get all
POSTai/chatsAi chat session create
DELETEai/chats/{aiChatSessionId}Ai chat session delete
PUTai/chats/{aiChatSessionId}Ai chat session rename
GETai/chats/{aiChatSessionId}/messagesAi chat session get messages
PUTai/chats/{aiChatSessionId}/providerAi chat session set provider
POSTai/chats/streamStreams one assistant turn. Emits AiChatStreamItemTypes items; tool requests park the loop awaiting AiChatToolResultPost.
POSTai/chats/tool-resultsAi chat tool result post

POST ai/chats​

Ai chat session create.

ParameterInRequiredType
titlequerynostring
Payload

Response

{
"aiChatSessionId": "3b7f5c2e-9a41-4d8b-bb0e-7c1a2d3e4f50",
"title": "string",
"createdUtc": "2026-10-02T21:14:05Z",
"updatedUtc": "2026-10-02T21:14:05Z",
"lastProvider": "string",
"lastModel": "string",
"lastSelectedProvider": "string",
"lastSelectedModel": "string"
}

PUT ai/chats/{aiChatSessionId}​

Ai chat session rename.

ParameterInRequiredType
aiChatSessionIdpathyesuuid
titlequerynostring
Payload

PUT ai/chats/{aiChatSessionId}/provider​

Ai chat session set provider.

ParameterInRequiredType
aiChatSessionIdpathyesuuid
providerquerynostring
modelquerynostring
Payload

POST ai/chats/stream​

Streams one assistant turn. Emits AiChatStreamItemTypes items; tool requests park the loop awaiting AiChatToolResultPost..

Payload

Request body

{
"aiChatSessionId": "3b7f5c2e-9a41-4d8b-bb0e-7c1a2d3e4f50",
"userMessage": "string",
"modelOverride": "string",
"providerId": "3b7f5c2e-9a41-4d8b-bb0e-7c1a2d3e4f50",
"toolManifestJson": "string",
"toolManifestRevision": 42,
"clientContextJson": "string",
"correlationId": "3b7f5c2e-9a41-4d8b-bb0e-7c1a2d3e4f50",
"attachments": [
{
"kind": "string",
"mimeType": "string",
"fileName": "Example",
"dataBase64": "string"
}
]
}

Response

[
{
"type": "string",
"text": "string",
"toolUseId": "string",
"toolName": "Example",
"argumentsJson": "string",
"execution": "string",
"notice": "string",
"tokensIn": 42,
"tokensOut": 42,
"tokensCached": 42,
"errorMessage": "string",
"failureCode": 42,
"messageIds": [
42
]
}
]

POST ai/chats/tool-results​

Ai chat tool result post.

Payload

Request body

{
"correlationId": "3b7f5c2e-9a41-4d8b-bb0e-7c1a2d3e4f50",
"toolUseId": "string",
"contentJson": "string",
"isError": true
}

Feedback​

MethodPathWhat it does
PUTai/feedbackAi feedback post

PUT ai/feedback​

Ai feedback post.

Payload

Request body

{
"aiChatSessionMessageId": 42,
"isPositive": true,
"reasonCode": "ABC123",
"comment": "string"
}

Instructions​

MethodPathWhat it does
GETai/instructionsAi instruction get all
PUTai/instructionsAi instruction save
DELETEai/instructions/{aiInstructionId}Ai instruction delete

PUT ai/instructions​

Ai instruction save.

Payload

Request body

{
"aiInstructionId": "3b7f5c2e-9a41-4d8b-bb0e-7c1a2d3e4f50",
"scope": "string",
"resellerId": "3b7f5c2e-9a41-4d8b-bb0e-7c1a2d3e4f50",
"userGroupId": "3b7f5c2e-9a41-4d8b-bb0e-7c1a2d3e4f50",
"instructionText": "string",
"readOnly": true
}

Providers​

MethodPathWhat it does
GETai/providersAi provider get all
PUTai/providersAi provider save all
DELETEai/providers/{aiProviderId}Ai provider delete
POSTai/providers/discover-modelsAi provider discover models
POSTai/providers/testAi provider test

PUT ai/providers​

Ai provider save all.

Payload

Request body

[
{
"aiProviderId": "3b7f5c2e-9a41-4d8b-bb0e-7c1a2d3e4f50",
"userGroupId": "3b7f5c2e-9a41-4d8b-bb0e-7c1a2d3e4f50",
"resellerId": "3b7f5c2e-9a41-4d8b-bb0e-7c1a2d3e4f50",
"name": "Example",
"providerType": "string",
"endpoint": "string",
"hasApiKey": true,
"apiKeyMaskedTail": "string",
"newApiKey": "string",
"defaultModel": "string",
"models": [
{
"id": "string",
"enabled": true,
"capabilities": [],
"contextWindow": 125.5,
"warm": true
}
],
"priority": 42,
"enabled": true,
"maxTokens": 42,
"contextWindowTokens": 125.5,
"resolvedContextWindow": 125.5,
"resolvedContextWindowSource": "string",
"readOnly": true,
"poolKey": "string",
"maxConcurrentStreams": 42,
"keepModelsLoaded": true,
"hardwareProfileJson": "string",
"capabilityModels": [
{
"capability": "string",
"modelId": "string"
}
],
"metered": true,
"costMultiplier": 125.5,
"modelCosts": [
{
"model": "string",
"multiplier": 125.5
}
],
"canEditCommercial": true
}
]

POST ai/providers/discover-models​

Ai provider discover models.

Payload

Request body

{
"aiProviderId": "3b7f5c2e-9a41-4d8b-bb0e-7c1a2d3e4f50",
"userGroupId": "3b7f5c2e-9a41-4d8b-bb0e-7c1a2d3e4f50",
"resellerId": "3b7f5c2e-9a41-4d8b-bb0e-7c1a2d3e4f50",
"name": "Example",
"providerType": "string",
"endpoint": "string",
"hasApiKey": true,
"apiKeyMaskedTail": "string",
"newApiKey": "string",
"defaultModel": "string",
"models": [
{
"id": "string",
"enabled": true,
"capabilities": [
{}
],
"contextWindow": 125.5,
"warm": true
}
],
"priority": 42,
"enabled": true,
"maxTokens": 42,
"contextWindowTokens": 125.5,
"resolvedContextWindow": 125.5,
"resolvedContextWindowSource": "string",
"readOnly": true,
"poolKey": "string",
"maxConcurrentStreams": 42,
"keepModelsLoaded": true,
"hardwareProfileJson": "string",
"capabilityModels": [
{
"capability": "string",
"modelId": "string"
}
],
"metered": true,
"costMultiplier": 125.5,
"modelCosts": [
{
"model": "string",
"multiplier": 125.5
}
],
"canEditCommercial": true
}

Response

{
"success": true,
"error": "string",
"discoveredModels": [
"string"
],
"discoveredModelItems": [
{
"id": "string",
"enabled": true,
"capabilities": [
{}
],
"contextWindow": 125.5,
"warm": true
}
]
}

POST ai/providers/test​

Ai provider test.

Payload

Request body

{
"aiProviderId": "3b7f5c2e-9a41-4d8b-bb0e-7c1a2d3e4f50",
"userGroupId": "3b7f5c2e-9a41-4d8b-bb0e-7c1a2d3e4f50",
"resellerId": "3b7f5c2e-9a41-4d8b-bb0e-7c1a2d3e4f50",
"name": "Example",
"providerType": "string",
"endpoint": "string",
"hasApiKey": true,
"apiKeyMaskedTail": "string",
"newApiKey": "string",
"defaultModel": "string",
"models": [
{
"id": "string",
"enabled": true,
"capabilities": [
{}
],
"contextWindow": 125.5,
"warm": true
}
],
"priority": 42,
"enabled": true,
"maxTokens": 42,
"contextWindowTokens": 125.5,
"resolvedContextWindow": 125.5,
"resolvedContextWindowSource": "string",
"readOnly": true,
"poolKey": "string",
"maxConcurrentStreams": 42,
"keepModelsLoaded": true,
"hardwareProfileJson": "string",
"capabilityModels": [
{
"capability": "string",
"modelId": "string"
}
],
"metered": true,
"costMultiplier": 125.5,
"modelCosts": [
{
"model": "string",
"multiplier": 125.5
}
],
"canEditCommercial": true
}

Response

{
"success": true,
"error": "string",
"discoveredModels": [
"string"
],
"discoveredModelItems": [
{
"id": "string",
"enabled": true,
"capabilities": [
{}
],
"contextWindow": 125.5,
"warm": true
}
]
}

Scope policies​

MethodPathWhat it does
GETai/scope-policiesAi scope policy get all
PUTai/scope-policiesAi scope policy save
DELETEai/scope-policies/{aiScopePolicyId}Ai scope policy delete

PUT ai/scope-policies​

Ai scope policy save.

Payload

Request body

{
"aiScopePolicyId": "3b7f5c2e-9a41-4d8b-bb0e-7c1a2d3e4f50",
"resellerId": "3b7f5c2e-9a41-4d8b-bb0e-7c1a2d3e4f50",
"userGroupId": "3b7f5c2e-9a41-4d8b-bb0e-7c1a2d3e4f50",
"disabled": true,
"dailyTokenLimitPerUser": 42,
"monthlyTokenLimitPerUser": 42,
"showWhenUnconfigured": true,
"weeklyTokenLimitPerUser": 42,
"dailyUsageUnitPool": 42,
"weeklyUsageUnitPool": 42,
"monthlyUsageUnitPool": 42,
"poolTimeZone": "string",
"monthlyResetAnchor": 42,
"monthlyResetDay": 42,
"weeklyResetDay": 42,
"warnThresholdPercent": 42,
"allowDelegatedPools": true,
"readOnly": true,
"canEditCommercial": true
}

Server status​

MethodPathWhat it does
GETai/server-statusAi server status get

Usage​

MethodPathWhat it does
POSTai/usageAi usage get
POSTai/usage/commercial-changesAi commercial changes get
GETai/usage/meAi my usage get
POSTai/usage/tool-failuresAi tool failure samples get

POST ai/usage​

Ai usage get.

Payload

Request body

{
"fromUtc": "2026-10-02T21:14:05Z",
"toUtc": "2026-10-02T21:14:05Z",
"resellerId": "3b7f5c2e-9a41-4d8b-bb0e-7c1a2d3e4f50",
"userGroupId": "3b7f5c2e-9a41-4d8b-bb0e-7c1a2d3e4f50",
"userId": "3b7f5c2e-9a41-4d8b-bb0e-7c1a2d3e4f50",
"provider": "string",
"model": "string"
}

Response

{
"tokensIn": 42,
"tokensOut": 42,
"turns": 42,
"activeUsers": 42,
"stops": 42,
"truncations": 42,
"queueWaits": 42,
"queueTimeouts": 42,
"firstTokenMsSum": 42,
"firstTokenCount": 3,
"meteredTokens": 42,
"cachedTokens": 42,
"usageUnits": 42,
"allowances": [
{
"scope": "string",
"scopeId": "3b7f5c2e-9a41-4d8b-bb0e-7c1a2d3e4f50",
"scopeName": "Example",
"window": "string",
"used": 42,
"limit": 42,
"percent": 42,
"resetUtc": "2026-10-02T21:14:05Z"
}
],
"warnThresholdPercent": 42,
"rows": [
{
"bucketUtc": "2026-10-02T21:14:05Z",
"userGroupId": "3b7f5c2e-9a41-4d8b-bb0e-7c1a2d3e4f50",
"userId": "3b7f5c2e-9a41-4d8b-bb0e-7c1a2d3e4f50",
"provider": "string",
"model": "string",
"tokensIn": 42,
"tokensOut": 42,
"turns": 42,
"stops": 42,
"truncations": 42,
"firstTokenMsSum": 42,
"firstTokenCount": 3,
"turnDurationMsSum": 42,
"queueWaits": 42,
"queueWaitMsSum": 42,
"queueTimeouts": 42,
"meteredTokens": 42,
"cachedTokens": 42,
"usageUnits": 42,
"costOwnerTier": 42
}
],
"toolRows": [
{
"bucketUtc": "2026-10-02T21:14:05Z",
"userGroupId": "3b7f5c2e-9a41-4d8b-bb0e-7c1a2d3e4f50",
"toolName": "Example",
"calls": 42,
"errors": 42,
"durationMsSum": 42
}
]
}

POST ai/usage/commercial-changes​

Ai commercial changes get.

Payload

Request body

{
"fromUtc": "2026-10-02T21:14:05Z",
"toUtc": "2026-10-02T21:14:05Z",
"resellerId": "3b7f5c2e-9a41-4d8b-bb0e-7c1a2d3e4f50",
"userGroupId": "3b7f5c2e-9a41-4d8b-bb0e-7c1a2d3e4f50",
"userId": "3b7f5c2e-9a41-4d8b-bb0e-7c1a2d3e4f50",
"provider": "string",
"model": "string"
}

Response

[
{
"dataOwnerId": 42,
"dataTimeStamp": "2026-10-02T21:14:05Z",
"description": "Example description",
"historyTypeId": 42,
"referenceId": "string",
"pluginInstalledId": "3b7f5c2e-9a41-4d8b-bb0e-7c1a2d3e4f50",
"serviceUser": true,
"sessionHistoryId": 42,
"userGroupID": "3b7f5c2e-9a41-4d8b-bb0e-7c1a2d3e4f50",
"userID": "3b7f5c2e-9a41-4d8b-bb0e-7c1a2d3e4f50",
"userName": "Example",
"utcOffset": 42
}
]

POST ai/usage/tool-failures​

Ai tool failure samples get.

ParameterInRequiredType
toolNamequerynostring
Payload

Response

[
{
"id": 1042,
"timestampUtc": "2026-10-02T21:14:05Z",
"userGroupId": "3b7f5c2e-9a41-4d8b-bb0e-7c1a2d3e4f50",
"userId": "3b7f5c2e-9a41-4d8b-bb0e-7c1a2d3e4f50",
"provider": "string",
"model": "string",
"toolName": "Example",
"argumentsJson": "string",
"errorText": "string",
"durationMs": 42,
"aiChatSessionId": "3b7f5c2e-9a41-4d8b-bb0e-7c1a2d3e4f50"
}
]

User instruction​

MethodPathWhat it does
GETai/user-instructionAi user instruction get

User memories​

MethodPathWhat it does
GETai/user-memoriesAi user memory get all
POSTai/user-memoriesAi user memory save
DELETEai/user-memories/{aiUserMemoryId}Ai user memory delete

POST ai/user-memories​

Ai user memory save.

ParameterInRequiredType
memoryTextquerynostring
Payload

Response

{
"aiUserMemoryId": "3b7f5c2e-9a41-4d8b-bb0e-7c1a2d3e4f50",
"memoryText": "string",
"createdUtc": "2026-10-02T21:14:05Z"
}