AI API reference
Access all Quant AI features programmatically via the v3 REST API. This page provides an overview of available endpoints organised by category.
Base URL
Section titled “Base URL”All AI endpoints share the following base URL, on the dashboard host of your platform.
https://dashboard.quantcdn.io/api/v3/organizations/{org}/ai # QuantCDNhttps://dash.quantgov.cloud/api/v3/organizations/{org}/ai # QuantGovReplace {org} with your organisation machine name. The path accepts both organizations and
organisations. The AI API is not served from the content API host (api.quantcdn.io).
Authentication
Section titled “Authentication”Send a dashboard API token as a Bearer token in the Authorization header. Create the token in
the dashboard under your profile, API Tokens. A project token from the Integrations page
(the Quant-Token used by the content API) does not work here and returns 401.
curl -H "Authorization: Bearer YOUR_API_TOKEN" \ https://dashboard.quantcdn.io/api/v3/organizations/{org}/ai/modelsModels
Section titled “Models”| Method | Endpoint | Description |
|---|---|---|
GET |
/models |
List available AI models |
GET |
/models/{modelId} |
Get model details and capabilities |
Filter models by capability with the feature query parameter: chat, embeddings, vision, streaming, or all (for example /models?feature=chat). Use a model ID from this list in your requests. On QuantGov the list contains Australian-resident models only.
Chat inference
Section titled “Chat inference”| Method | Endpoint | Description |
|---|---|---|
POST |
/chat |
Send a chat message (buffered response) |
POST |
/chat/stream |
Send a chat message (streaming SSE response) |
GET |
/chat/executions/{id} |
Poll for async execution result |
POST |
/chat/callback |
Submit client tool results to a durable execution in waiting_callback |
Example chat request:
curl -X POST https://dashboard.quantcdn.io/api/v3/organizations/{org}/ai/chat \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "modelId": "MODEL_ID_FROM_MODELS_LIST", "messages": [{"role": "user", "content": "Hello"}], "maxTokens": 1024 }'There is no public WebSocket endpoint. Use /chat/stream for streaming.
| Field | Description |
|---|---|
modelId |
Required. A model ID from GET /models |
messages |
Required. Each message has a role (user, assistant, system) and content (a string, or text, image, video, and document blocks with base64 data; 25 MB per request) |
systemPrompt, maxTokens, temperature, topP, stopSequences |
Optional generation settings |
responseFormat |
{"type": "json", "jsonSchema": {...}} for structured JSON output on models that support it |
toolConfig |
Tool calling: tools[].toolSpec with name, description, and inputSchema.json (a JSON Schema). When the model asks for a tool, the response contains response.toolUse with toolUseId, name, and input. Set autoExecute: true with an allowedTools list to let the platform run built-in tools |
sessionId |
Continue a session; omit for a stateless call |
async |
true for durable execution |
Embeddings
Section titled “Embeddings”| Method | Endpoint | Description |
|---|---|---|
POST |
/embeddings |
Generate text embeddings. input is a string or an array of up to 100 strings |
Image generation
Section titled “Image generation”Image generation is not available.
Sessions
Section titled “Sessions”| Method | Endpoint | Description |
|---|---|---|
GET |
/sessions |
List sessions |
POST |
/sessions |
Create a session |
GET |
/sessions/{id} |
Get session details |
PUT |
/sessions/{id} |
Update a session |
DELETE |
/sessions/{id} |
Delete a session |
PUT |
/sessions/{id}/extend |
Extend session TTL |
A session keeps the conversation on the server. Create it with a required userId and optional sessionGroup, metadata, and expirationMinutes (default 60, 5 to 1440), then pass its sessionId in chat requests. Extend it with additionalMinutes (up to 1440). List sessions by userId or sessionGroup.
Agents
Section titled “Agents”| Method | Endpoint | Description |
|---|---|---|
GET |
/agents |
List agents |
POST |
/agents |
Create an agent |
GET |
/agents/{id} |
Get agent details |
PUT |
/agents/{id} |
Update an agent |
DELETE |
/agents/{id} |
Delete an agent |
POST |
/agents/{id}/chat |
Chat with an agent |
GET / PUT / DELETE |
/agents/{id}/overlay |
Organisation overlay on a pre-built agent. PUT replaces the whole overlay |
Agent chat takes message and optional sessionId, userId, stream (SSE), and async. Without a sessionId a new session is created. The agent runs its own tools.
Skills
Section titled “Skills”| Method | Endpoint | Description |
|---|---|---|
GET / POST |
/skills |
List or create skills |
GET / PUT / DELETE |
/skills/{id} |
Read, update, or delete a skill |
POST |
/skills/import |
Import a skill from GitHub |
POST |
/skills/{id}/sync |
Sync a skill from its source |
GET |
/skills/collections |
List skill collections |
POST |
/skills/import-collection |
Import a directory of skills as a namespaced collection |
POST |
/skills/collections/{namespace}/sync |
Sync a collection |
DELETE |
/skills/collections/{namespace} |
Delete a collection and its skills |
Governance
Section titled “Governance”| Method | Endpoint | Description |
|---|---|---|
GET / PUT |
/governance |
Read or replace the governance configuration |
GET |
/governance/spend |
Current spend |
GET / POST |
/filter-policies |
List or create filter policies |
GET / PUT / DELETE |
/filter-policies/{id} |
Read, update, or delete a filter policy |
Custom tools
Section titled “Custom tools”| Method | Endpoint | Description |
|---|---|---|
GET |
/custom-tools |
List custom tools |
POST |
/custom-tools |
Register a custom tool |
DELETE |
/custom-tools/{id} |
Delete a custom tool |
GET |
/tools/executions/{id} |
Get tool execution status |
Vector database
Section titled “Vector database”| Method | Endpoint | Description |
|---|---|---|
GET |
/vector-db/collections |
List collections |
POST |
/vector-db/collections |
Create a collection |
DELETE |
/vector-db/collections/{id} |
Delete a collection |
POST |
/vector-db/collections/{id}/documents |
Upload documents |
DELETE |
/vector-db/collections/{id}/documents |
Delete documents |
POST |
/vector-db/collections/{id}/query |
Search a collection |
| Method | Endpoint | Description |
|---|---|---|
GET |
/tasks |
List tasks |
POST |
/tasks |
Create a task |
GET |
/tasks/{id} |
Get task details |
PUT |
/tasks/{id} |
Update a task |
DELETE |
/tasks/{id} |
Delete a task |
GET |
/tasks/{id}/dependency-graph |
Get task dependency graph |
Orchestrations
Section titled “Orchestrations”| Method | Endpoint | Description |
|---|---|---|
GET |
/orchestrations |
List orchestrations |
POST |
/orchestrations |
Create an orchestration |
DELETE |
/orchestrations/{id} |
Delete an orchestration |
POST |
/orchestrations/{id}/start |
Start an orchestration |
POST |
/orchestrations/{id}/pause |
Pause an orchestration |
POST |
/orchestrations/{id}/resume |
Resume an orchestration |
POST |
/orchestrations/{id}/cancel |
Cancel an orchestration |
GET |
/orchestrations/{id}/batches |
List orchestration batches |
| Method | Endpoint | Description |
|---|---|---|
GET |
/files |
List files |
POST |
/files |
Upload a file |
DELETE |
/files/{id} |
Delete a file |
| Method | Endpoint | Description |
|---|---|---|
GET |
/usage |
Organisation usage breakdown (needs the subscription permission) |
GET |
/usage/me |
Your own usage |
Streaming responses
Section titled “Streaming responses”The /chat/stream endpoint returns Server-Sent Events (SSE). A start event opens the stream, each content event carries a piece of text in delta, and a done event closes it with token usage.
id: chunk-0event: startdata: {"requestId":"abc123","model":"...","streaming":true}
id: chunk-1event: contentdata: {"delta":"Hello","complete":false}
id: chunk-2event: contentdata: {"delta":" there!","complete":false}
id: chunk-3event: donedata: {"complete":true,"usage":{"inputTokens":8,"outputTokens":15,"totalTokens":23}}An error that happens after the stream has started (for example a spend limit) arrives as an event: error with a JSON data object that has an error message. The HTTP status of the response stays 200, so read the event type of every event. Treat a stream that ends without a done event as failed.
Durable execution
Section titled “Durable execution”For long-running operations, set async: true in your chat request. The response is 202 with a requestId and a pollUrl. Poll GET /chat/executions/{requestId} until the status is complete (other statuses: pending, running, waiting_callback, failed), then read the result. Start polling at 1 second and back off to 30 seconds.
# Start an async chat requestcurl -X POST https://dashboard.quantcdn.io/api/v3/organizations/{org}/ai/chat \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "modelId": "MODEL_ID_FROM_MODELS_LIST", "messages": [{"role": "user", "content": "Analyse this dataset..."}], "async": true }'
# Poll for the resultcurl https://dashboard.quantcdn.io/api/v3/organizations/{org}/ai/chat/executions/{requestId} \ -H "Authorization: Bearer YOUR_API_TOKEN"When the status is waiting_callback, the response lists pendingTools and a callbackId. Run those tools in your application and send the results to POST /chat/callback with {"callbackId": "...", "toolResults": [{"toolUseId": "...", "result": {...}}]}. Each callbackId can be used once.
Error responses
Section titled “Error responses”| Status | Meaning |
|---|---|
401 |
Missing or invalid token, or a project token instead of a dashboard API token |
403 |
The token’s user lacks permission; AI services are disabled for the organisation; the model is not approved by your governance policy; or (QuantGov) the model is not available, with the error model_not_available_in_region |
429 |
A spend limit was reached |
Workflows
Section titled “Workflows”Workflows have no REST endpoints. Build them in the dashboard and start them with a webhook or schedule trigger.
