From 1c1df501c6e384502999faa11549a528fd9cf8cd Mon Sep 17 00:00:00 2001 From: swarnika-gupta Date: Wed, 5 Aug 2026 19:02:52 +0530 Subject: [PATCH 1/2] [SCAL-283418] Update REST v2 OpenAPI spec: org-awareness + refresh Regenerate api-spec/openapiSpecv3-2_0.json from the current backend via `generate-restapi-v2-spec` (ENABLE_ORG_SELECTOR_HEADER=true). Org-awareness (SCAL-283418): - X-Org-Selector per-request header parameter referenced on 162 Callosum-backed operations (auth/token lifecycle endpoints excluded) - token org_scope / org_identifiers on POST /auth/token and POST /auth/token/access-control Also refreshes other endpoints the SDK spec was behind on (AI-agent conversation share/answers, configurations/features, semantic-integrations, security column rules). Co-Authored-By: Claude Opus 4.8 --- api-spec/openapiSpecv3-2_0.json | 3266 ++++++++++++++++++++++++++++--- 1 file changed, 2956 insertions(+), 310 deletions(-) diff --git a/api-spec/openapiSpecv3-2_0.json b/api-spec/openapiSpecv3-2_0.json index 041f20191..543c8a980 100644 --- a/api-spec/openapiSpecv3-2_0.json +++ b/api-spec/openapiSpecv3-2_0.json @@ -61,6 +61,14 @@ ], "description": "Roles for version 10.13.0.cl" }, + { + "name": "26.9.0.cl", + "id": "26.9.0.cl", + "tags": [ + "26.9.0.cl" + ], + "description": "Roles for version 26.9.0.cl" + }, { "name": "10.7.0.cl", "id": "10.7.0.cl", @@ -1088,120 +1096,88 @@ } } }, - "/api/rest/2.0/ai/memory/import": { - "post": { - "operationId": "importMemory", - "description": "\nImports memory entries (rules, recipes, and always-apply rules) from\na YAML payload, typically a payload produced by `exportMemory` and\nedited locally. The imported entries replace the existing memory for\nthe data-models referenced in the payload.\n`dry_run` is required. Pass `true` first to validate the payload and\nreview the preview counts and any row-level failures without making\nchanges, then re-run with `dry_run = false` to apply the import. An\nimport is not applied if any row fails validation.\nRequires Spotter access (use/manage) and either edit or memory\naccess on corresponding data model sources.
Beta Version: 26.8.0.cl or later\n\nThis API allows users to import data-model memories using a given yaml file. This yaml file can be obtained from the export memory API in source env and can be modified and used as input to the import API in target env.\n\nThis API enables customers to migrate memories from a source env to a target env. This improves memory adoption for Spotter by giving the users a chance to develop their memories in one env and replicate the same in another env.\n\n#### Usage guidelines\n\nTo import memory, the request must include:\n- `content`: The full serialized memory payload to import (YAML). Typically the `content` value returned by the `exportMemory` API, edited locally and re-submitted. The payload itself identifies which data-models the memory applies to, so no separate identifier list is required.\n- `dry_run`: Required. When `true`, validate the payload and return preview counts without writing anything; when `false`, apply the import. Always run with `dry_run = true` first, then re-run with `dry_run = false` once you are satisfied with the preview.\n\nThe import replaces the existing global memories on the data-models referenced in the payload with the entries supplied in the payload.\n\nThe API returns a response object with:\n- `status`: The terminal status of the import (`SUCCESS`, `VALIDATION_FAILED`, or `FAILED`).\n- `summary`: Per `(memory_type, source)` counts. In a dry run the `deleted_record_count`/`inserted_record_count` are previews; in a real import they are actuals. On `VALIDATION_FAILED`, `summary` is `null` when validation fails before any item is processed (e.g. an unresolved or inaccessible data-model source) and an empty list otherwise — treat both as \"no counts available\".\n- `validation_failures`: Per-item validation failures, each with `line_number`, `reason`, `field_name`, and `message` for click-to-locate and inline highlighting.\n- `diagnostics`: Groups of diagnostic messages, each with a `sub_status` (`WARNING`, `FAILURE`, `ROLLED_BACK`, or `UNKNOWN`) and a `messages` list. This is the single channel for both non-fatal warnings (under `WARNING`, e.g. when some older memory entries could not be fully cleaned up) and fatal causes (e.g. the failure reason under `FAILURE`, or a `ROLLED_BACK` group when new entries were undone).\n- `operation_id`: A server-generated identifier for this import operation; include it when contacting support to help correlate server-side logs. Populated once the server registers the import operation; `null` when the request fails earlier (e.g. while parsing the payload or resolving its data-model sources).\n\n#### File format\n\nThe payload is a YAML document with a single top-level `memories` key holding a list of memory items. Each item is self-contained: a `type`, a typed `content` block, a `datamodel_sources` list, and optional `tags`. Typically you don't hand-author this file — you obtain it from `exportMemory`, edit it, and submit it back through `importMemory`.\n\n```yaml\nmemories:\n- type: RULE\n content:\n rule_definition: \"Always filter revenue to closed-won deals.\"\n datamodel_sources:\n - guid: 11111111-1111-1111-1111-111111111111\n obj_id: sales_data_model\n tags:\n - finance\n- type: RULE\n content:\n rule_definition: \"Exclude internal test accounts from all results.\"\n datamodel_sources:\n - obj_id: sales_data_model\n- type: RECIPE\n content:\n user_query: \"top accounts by revenue\"\n recipe: |\n {\"steps\": [...serialized recipe blob...]}\n datamodel_sources:\n - obj_id: sales_data_model\n- type: RECIPE\n content:\n user_query: \"monthly new customer count\"\n recipe: |\n {\"steps\": [...serialized recipe blob...]}\n datamodel_sources:\n - obj_id: sales_data_model\n- type: ALWAYS_APPLY_RULES\n content:\n rules:\n - \"Never show internal test accounts.\"\n - \"Round currency to whole dollars.\"\n datamodel_sources:\n - guid: 22222222-2222-2222-2222-222222222222\n```\n\nA file can contain multiple `RULE` and multiple `RECIPE` items for a data-model, but at most one `ALWAYS_APPLY_RULES` item per data-model.\n\n##### Memory item fields\n\n| Field | Required | Type | Description |\n|-------|----------|------|-------------|\n| `type` | Yes | String enum | One of `RULE`, `RECIPE`, or `ALWAYS_APPLY_RULES`. |\n| `content` | Yes | Mapping | Type-specific content block (see below). |\n| `datamodel_sources` | Yes | Non-empty list | The data-model(s) the memory attaches to. |\n| `tags` | No | List of strings | Free-form labels. |\n\n##### Memory types and content\n\n| `type` | Content fields | Notes |\n|--------|----------------|-------|\n| `RULE` | `rule_definition` — required, non-empty string | A single semantic rule. |\n| `RECIPE` | `recipe` and `user_query` — both required, non-empty strings | `recipe` is an opaque serialized blob; `user_query` is the natural-language query it answers. |\n| `ALWAYS_APPLY_RULES` | `rules` — required, non-empty list of non-empty strings | Data-model-wide always-apply rules. At most one `ALWAYS_APPLY_RULES` item per data-model. |\n\n##### Identifying data-models (`datamodel_sources`)\n\nEach item must list at least one source. Each entry identifies a data-model by at least one of:\n- `guid` — the data-model GUID.\n- `obj_id` — a stable object ID, resolved to a GUID server-side.\n\nIf both are supplied, `obj_id` takes precedence and `guid` is ignored entirely; `guid` takes effect only when `obj_id` is absent. Exported files populate `guid` and, if present, `obj_id` as well.\n\n> ⚠️ **Cross-environment import:** When `obj_id` is present it is\n> authoritative — the accompanying `guid` is **not** used as a fallback.\n> If an `obj_id` does not exist in the target environment, that item\n> fails with `UNRESOLVED_SOURCE`. Remove or correct stale `obj_id`\n> values before importing across environments.\n\n#### Validations reference\n\nThe payload is fully validated before anything is written. This applies to `dry_run = true` and `dry_run = false` alike: if any item fails validation, the entire import is rejected — no partial writes — and all failures are returned together so you can fix them in one pass.\n\n##### Limits\n\nDefault limits (may be adjusted in future if the need arises):\n\n| Limit | Default |\n|-------|---------|\n| Uploaded file size | 10 MiB |\n| Total memory items | 10,000 |\n| `rule_definition` length | 1,000 characters |\n| `user_query` length | 1,000 characters |\n| `recipe` length | 2,000 characters |\n| `rules` combined length (`ALWAYS_APPLY_RULES`) | 2,000 characters |\n| Tags per item | 10 |\n| Characters per tag | 50 |\n\nThe `rules` limit in `ALWAYS_APPLY_RULES` is a combined budget across all entries in the list, not per entry.\n\n##### Structural rules\n\n- The document must be a mapping with a `memories` key whose value is a list.\n- Unknown keys — at the top level, within an item, or under `content` — are rejected.\n- Each item's `type` must be one of the three supported values, and `content` must match that type's shape.\n- Null, empty-string, or wrong-typed values in a required field are treated as missing.\n- Non-string or empty `tags` entries are dropped silently; certain tags reserved for internal use are stripped automatically before the item is stored.\n\n##### Cross-item rules\n\n- A data-model referenced by more than one `ALWAYS_APPLY_RULES` item is rejected — combine them into a single item's `rules` list.\n\n##### Failure reasons\n\nEach entry in `validation_failures` carries one of:\n\n| Reason | Meaning |\n|--------|---------|\n| `SCHEMA` | YAML structure is invalid or unsupported. |\n| `VALIDATION` | A required field is missing/empty, a count exceeds a limit, or a GUID is malformed. |\n| `CHAR_LIMIT` | A content field or tag exceeds its size limit. |\n| `UNRESOLVED_SOURCE` | A `guid` or `obj_id` could not be resolved to an existing data-model. |\n| `ACCESS_DENIED` | The caller lacks sufficient access on the referenced data-model. |\n\n#### Dry run\n\n`dry_run` is required and has no default, so the import is always a deliberate two-step flow:\n\n1. **First, call with `dry_run = true`.** This validates the payload and previews what would happen — the counts in `summary` and any `validation_failures` — without writing anything.\n2. **Then, after reviewing a clean preview, call again with `dry_run = false`** (same `content`). This applies the import. It refuses to write when any item fails validation, so fix the reported `validation_failures` and resubmit.\n\n> ###### Important:\n> Never call `dry_run = false` without first inspecting a `dry_run = true` preview. A real import deletes and replaces existing global memories on the referenced data-models.\n\n#### Error responses\n\n| Code | Description |\n|------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| 401 | Unauthorized — authentication token is missing, expired, or invalid. |\n| 403 | Forbidden — the authenticated user does not have the necessary Spotter permissions, or the bearer token does not correspond to the data-model's org. Per-data-model access failures do not use this code — they surface as `ACCESS_DENIED` validation failures with HTTP `200` (see Logical failures below). |\n\n#### Logical failures\n\nValidation and write failures are not returned in the error envelope. The call returns `200` with a terminal `status` of `VALIDATION_FAILED` or `FAILED`, and the details live in `validation_failures` / `diagnostics`:\n\n- **VALIDATION_FAILED** — one or more items failed schema/semantic validation; nothing was written. Inspect `validation_failures`, fix the items, and resubmit.\n- **FAILED** — the import did not complete. Inspect `diagnostics`: a `ROLLED_BACK` group means writing the new entries failed and any entries written before the failure were undone (existing memory is intact, no destructive change), while a `FAILURE` group carries another non-validation cause.\n\nSample `VALIDATION_FAILED` responses (HTTP 200):\n\n**Invalid data-model (unresolved source):**\n\n```json\n{\n \"status\": \"VALIDATION_FAILED\",\n \"summary\": null,\n \"validation_failures\": [\n {\n \"line_number\": 2,\n \"reason\": \"UNRESOLVED_SOURCE\",\n \"field_name\": \"datamodel_sources[0].guid\",\n \"message\": \"unknown datamodel guid: 55555555-5555-5555-5555-555555555555\"\n }\n ],\n \"diagnostics\": [\n {\n \"sub_status\": \"FAILURE\",\n \"messages\": [\n \"unknown datamodel guid: 55555555-5555-5555-5555-555555555555\"\n ]\n }\n ],\n \"operation_id\": null\n}\n```\n\n**Inaccessible data-models:**\n\n```json\n{\n \"status\": \"VALIDATION_FAILED\",\n \"summary\": null,\n \"validation_failures\": [\n {\n \"line_number\": 2,\n \"reason\": \"ACCESS_DENIED\",\n \"field_name\": \"datamodel_sources[0]\",\n \"message\": \"Insufficient permissions on datamodel '44444444-4444-4444-4444-444444444444'\"\n },\n {\n \"line_number\": 8,\n \"reason\": \"ACCESS_DENIED\",\n \"field_name\": \"datamodel_sources[0]\",\n \"message\": \"Insufficient permissions on datamodel '33333333-3333-3333-3333-333333333333'\"\n }\n ],\n \"diagnostics\": [\n {\n \"sub_status\": \"FAILURE\",\n \"messages\": [\n \"Memory import validation failed with 2 error(s): Insufficient permissions on datamodel '44444444-4444-4444-4444-444444444444'; Insufficient permissions on datamodel '33333333-3333-3333-3333-333333333333'\"\n ]\n }\n ],\n \"operation_id\": null\n}\n```\n\n**Character-limit validations:**\n\n```json\n{\n \"status\": \"VALIDATION_FAILED\",\n \"summary\": [],\n \"validation_failures\": [\n {\n \"line_number\": 3,\n \"reason\": \"CHAR_LIMIT\",\n \"field_name\": \"content.rule_definition\",\n \"message\": \"content.rule_definition is 1073 characters; max allowed is 1000\"\n },\n {\n \"line_number\": 49,\n \"reason\": \"CHAR_LIMIT\",\n \"field_name\": \"content.user_query\",\n \"message\": \"content.user_query is 1150 characters; max allowed is 1000\"\n },\n {\n \"line_number\": 49,\n \"reason\": \"CHAR_LIMIT\",\n \"field_name\": \"content.recipe\",\n \"message\": \"content.recipe is 3574 characters; max allowed is 2000\"\n }\n ],\n \"diagnostics\": [\n {\n \"sub_status\": \"FAILURE\",\n \"messages\": [\n \"Validation failures present; fix them and re-run to see the DRY_RUN preview.\"\n ]\n }\n ],\n \"operation_id\": \"66666666-6666-6666-6666-666666666666\"\n}\n```\n\n> ###### Note:\n> - To use this API, the user needs Spotter access (use/manage) and either edit or memory access on the data-model and they must use corresponding org related bearerToken where the data-model exists.\n> - This endpoint is currently in Beta. Breaking changes may be introduced before the endpoint is made Generally Available.\n> - Available from version 26.8.0.cl and later.\n> - This endpoint requires Spotter — please contact ThoughtSpot Support to enable Spotter on your cluster.\n\n\n\n\n#### Endpoint URL\n", + "/api/rest/2.0/ai/agent/conversations/{conversation_identifier}/get-shared-content": { + "get": { + "operationId": "getSharedContent", + "description": "\nReturns the full read-only view of a shared conversation, including ordered\nmessages and data source metadata. Accessible by the conversation owner and\nany principal (user or group) that has been granted access.\nRequires `CAN_USE_SPOTTER` privilege.
Version: 26.9.0.cl or later\n\nReturns the full read-only view of a shared conversation, including ordered messages and data source metadata. Accessible by the conversation owner and any principal (user or group) that has been granted access via `shareConversation`.\n\nUse this endpoint to render a shared conversation in a UI or to retrieve its content for post-processing. The full answer payload is not embedded in messages — fetch it separately via `loadAnswer` using the `shared_conversation_id` from this response as the `conversation_identifier` parameter, along with the `answer_id` from each `answer` response item.\n\n> **Important**: `shared_conversation_id` is not the same as `conversation_id`. It identifies the shared snapshot, which is a separate internal object from the source conversation. You must use the `shared_conversation_id` value — not `conversation_id` — as the `conversation_identifier` parameter when calling `loadAnswer` to hydrate answers from a shared view.\n\n#### Usage guidelines\n\nThe request must include:\n\n- `conversation_identifier` _(query parameter)_: the unique ID of the source conversation.\n\n#### Response fields\n\n| Field | Type | Description |\n| --- | --- | --- |\n| `conversation_id` | `String` | Echoes the request parameter. |\n| `shared_conversation_id` | `String` | Identifier for the shared snapshot. **This is not the same as `conversation_id`.** Pass this value as the `conversation_identifier` parameter in `loadAnswer` calls. It changes each time the snapshot is refreshed via `shareConversation` with `refresh_shared_content: true` — re-fetch this response to get the current value before calling `loadAnswer`. |\n| `conversation_title` | `String` | Display title of the conversation. `null` if no title was set. |\n| `data_sources` | `DataSourceEntry[]` | Data sources used by the conversation, each with an `id` and display `name`. |\n| `messages` | `ConversationMessage[]` | Ordered conversation messages, oldest to newest. Same structure as returned by `getConversation`. Empty when the conversation has no messages. |\n| `code_execution_files` | `CodeExecutionFileMetadata[]` | Sanitized metadata for files generated by the code-execution tool. Empty when there are none. |\n\n#### DataSourceEntry fields\n\n| Field | Type | Description |\n| --- | --- | --- |\n| `id` | `String` | Unique identifier of the data source. |\n| `name` | `String` | Display name of the data source. |\n\n#### CodeExecutionFileMetadata fields\n\nEach entry in the `code_execution_files` array contains:\n\n| Field | Type | Description |\n| --- | --- | --- |\n| `file_id` | `String` | Unique identifier of the file. |\n| `display_name` | `String` | Human-readable file name. |\n| `file_type` | `String` | File type such as `csv`, `pdf`, or `png`. |\n| `created_time_in_millis` | `Long` | Milliseconds since Unix epoch when the file was created. |\n| `expired` | `Boolean` | When `true`, the underlying file is no longer retrievable from code-execution storage; UIs should disable download and preview. |\n\n#### Loading answer payloads\n\nEach `answer` response item in `messages[].response_items` contains an `answer_id` field. To retrieve the full answer payload (TML tokens, visualization metadata, chart config), call `loadAnswer` with:\n\n- `conversation_identifier`: the `shared_conversation_id` from **this** response (not `conversation_id`)\n- `answer_identifier`: the `answer_id` from the `answer` item\n\nIf the snapshot has been refreshed since you last called `getSharedContent`, the `shared_conversation_id` will have changed. Always use the `shared_conversation_id` from the most recent `getSharedContent` response; stale values return 404.\n\n#### Example request\n\n```bash\nGET /api/rest/2.0/ai/agent/conversations/{conversation_identifier}/get-shared-content\n```\n\n#### Example response\n\n```json\n{\n \"conversation_id\": \"conv-abc-123\",\n \"shared_conversation_id\": \"snap-xyz-456\",\n \"conversation_title\": \"Sales by Region Q1\",\n \"data_sources\": [{ \"id\": \"ds-001\", \"name\": \"Retail Sales\" }],\n \"messages\": [\n {\n \"message_id\": \"node-u-01\",\n \"timestamp_in_millis\": 1744000000000,\n \"user_prompt\": {\n \"message\": {\n \"message_id\": \"msg-u-01\",\n \"content\": \"Show me revenue by region.\"\n },\n \"attachments\": []\n },\n \"response_items\": [\n {\n \"type\": \"tool_call\",\n \"tool_call_id\": \"toolu-01\",\n \"tool_name\": \"search_datasets\",\n \"step_title\": \"Searching datasets\",\n \"arguments\": { \"query\": \"revenue by region\" },\n \"timestamp_in_millis\": 1744000001000,\n \"is_thinking\": false\n },\n {\n \"type\": \"answer\",\n \"answer_id\": \"ans-01\",\n \"tool_call_id\": \"toolu-02\",\n \"tool_name\": \"fetch_and_visualize\",\n \"step_title\": \"Visualizing\",\n \"timestamp_in_millis\": 1744000004000,\n \"is_thinking\": false\n },\n {\n \"type\": \"text\",\n \"content\": \"Revenue is highest in APAC.\",\n \"content_type\": \"TEXT_MARKDOWN\",\n \"timestamp_in_millis\": 1744000005000,\n \"is_thinking\": false,\n \"step_title\": null,\n \"file_reference\": null\n }\n ]\n }\n ],\n \"code_execution_files\": [\n {\n \"file_id\": \"revenue_by_region.csv\",\n \"display_name\": \"revenue_by_region.csv\",\n \"file_type\": \"csv\",\n \"created_time_in_millis\": 1744027200000,\n \"expired\": false\n }\n ]\n}\n```\n\nFor the `ConversationMessage` field structure, see `getConversation`.\n\n#### Error responses\n\n| Code | Description |\n| --- | --- |\n| 401 | Unauthorized — authentication token is missing, expired, or invalid. |\n| 403 | Forbidden — the caller is neither the conversation owner nor a principal with access, or does not have `CAN_USE_SPOTTER` privilege. |\n| 404 | Not Found — no active shared view exists for the given conversation identifier. |\n\n> ###### Note:\n>\n> - The shared view is a point-in-time copy of the conversation. It may not reflect edits made after sharing. Check `is_shared_content_outdated` via `getShareInfo` and use `shareConversation` with `refresh_shared_content: true` to update.\n> - This endpoint requires Spotter — please contact ThoughtSpot Support to enable Spotter on your cluster.\nVersion: 26.9.0.cl or later\n\n\n\n\n#### Endpoint URL\n", "tags": [ "AI", - "26.8.0.cl" + "26.9.0.cl" + ], + "parameters": [ + { + "in": "path", + "name": "conversation_identifier", + "required": true, + "schema": { + "type": "string" + }, + "description": "Unique identifier of the source conversation." + } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ImportMemoryRequest" - } - } - }, - "required": true - }, - "parameters": [], "responses": { "200": { "description": "Common successful response", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ImportMemoryResponse" + "$ref": "#/components/schemas/SharedConversationResponse" }, "examples": { "example_1": { - "summary": "Successful dry-run preview", + "summary": "Shared conversation with one message and an answer", "value": { - "status": "SUCCESS", - "summary": [ + "conversation_id": "conv-abc-123", + "shared_conversation_id": "snap-xyz-456", + "conversation_title": "Sales by Region Q1", + "data_sources": [ { - "memory_type": "RULES", - "source": { - "identifier": "33333333-3333-3333-3333-333333333333", - "type": "DATA_MODEL" - }, - "existing_record_count": 3, - "deleted_record_count": 3, - "inserted_record_count": 2, - "failed_record_count": 0 - }, - { - "memory_type": "RECIPES", - "source": { - "identifier": "33333333-3333-3333-3333-333333333333", - "type": "DATA_MODEL" - }, - "existing_record_count": 7, - "deleted_record_count": 7, - "inserted_record_count": 4, - "failed_record_count": 0 - }, - { - "memory_type": "ALWAYS_APPLY_RULES", - "source": { - "identifier": "33333333-3333-3333-3333-333333333333", - "type": "DATA_MODEL" - }, - "existing_record_count": 0, - "deleted_record_count": 0, - "inserted_record_count": 1, - "failed_record_count": 0 + "id": "ds-001", + "name": "Retail Sales" } ], - "validation_failures": [], - "diagnostics": [], - "operation_id": "77777777-7777-7777-7777-777777777777" - } - }, - "example_2": { - "summary": "Successful import (dry_run=false)", - "value": { - "status": "SUCCESS", - "summary": [ - { - "memory_type": "RULES", - "source": { - "identifier": "33333333-3333-3333-3333-333333333333", - "type": "DATA_MODEL" - }, - "existing_record_count": 3, - "deleted_record_count": 3, - "inserted_record_count": 2, - "failed_record_count": 0 - }, - { - "memory_type": "RECIPES", - "source": { - "identifier": "33333333-3333-3333-3333-333333333333", - "type": "DATA_MODEL" - }, - "existing_record_count": 7, - "deleted_record_count": 7, - "inserted_record_count": 4, - "failed_record_count": 0 - }, + "messages": [ { - "memory_type": "ALWAYS_APPLY_RULES", - "source": { - "identifier": "33333333-3333-3333-3333-333333333333", - "type": "DATA_MODEL" + "message_id": "node-u-01", + "timestamp_in_millis": 1744000000000, + "user_prompt": { + "message": { + "message_id": "msg-u-01", + "content": "Show me revenue by region." + }, + "attachments": [] }, - "existing_record_count": 0, - "deleted_record_count": 0, - "inserted_record_count": 1, - "failed_record_count": 0 + "response_items": [ + { + "type": "answer", + "answer_id": "ans-01", + "tool_call_id": "toolu-01", + "tool_name": "fetch_and_visualize", + "step_title": "Visualizing", + "timestamp_in_millis": 1744000004000, + "is_thinking": false + }, + { + "type": "text", + "content": "Revenue is highest in APAC at $4.2M.", + "content_type": "TEXT_MARKDOWN", + "timestamp_in_millis": 1744000005000, + "is_thinking": false, + "step_title": null, + "file_reference": null + } + ] } ], - "validation_failures": [], - "diagnostics": [], - "operation_id": "88888888-8888-8888-8888-888888888888" + "code_execution_files": [ + { + "file_id": "revenue_by_region.csv", + "display_name": "revenue_by_region.csv", + "file_type": "csv", + "created_time_in_millis": 1744027200000, + "expired": false + } + ] } } } @@ -1213,7 +1189,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ImportMemoryResponse" + "$ref": "#/components/schemas/SharedConversationResponse" } } } @@ -1261,13 +1237,13 @@ } } }, - "/api/rest/2.0/ai/agent/conversations/{conversation_identifier}/answers/{answer_identifier}/details": { + "/api/rest/2.0/ai/agent/conversations/{conversation_identifier}/get-share-info": { "get": { - "operationId": "loadAnswer", - "description": "\nLoads the full answer payload for a specific answer item in an agent\nconversation. Returns structured answer data including the TML query, token\nbreakdown, visualization metadata, and agent context state.\nPass the `answer_id` from an `AnswerResponseItem` in the `getConversation`\nresponse as the `answer_identifier` parameter.\nRequires `CAN_USE_SPOTTER` privilege and access to the specified conversation.
Version: 26.7.0.cl or later\n\nLoads the answer details for a specific answer item in an agent conversation. Returns structured answer data including the TML token list, visualization metadata, and agent context state. Use this endpoint to retrieve the full answer representation for an answer item — for example, to re-render a chart, export a query, or inspect the generated TML.\n\nRequires `CAN_USE_SPOTTER` privilege and access to the specified conversation.\n\n#### Usage guidelines\n\nThe request must include:\n\n- `conversation_identifier` *(path parameter)*: the unique ID of the conversation, as returned by `createAgentConversation`\n- `answer_identifier` *(path parameter)*: the `answer_id` field from an `AnswerResponseItem` in the `getConversation` response\n\nIf the request is successful, the response contains an `answer` object with the following fields:\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `title` | `String` | Display title of the generated answer (e.g., `\"sales by month\"`). |\n| `description` | `String` | Optional description of the answer. |\n| `session_identifier` | `String` | Unique identifier of the session in which this answer was generated. |\n| `generation_number` | `Int` | Generation sequence number of this answer within the session. |\n| `tokens` | `[String]` | Ordered list of TML token strings that make up the answer query (e.g., `[\"[sales]\", \"[date].'monthly'\"]`). |\n| `visualization_type` | `VizType` | Suggested visualization type: `Chart`, `Table`, or `Undefined`. `null` if no suggestion is available. |\n| `formulas` | `[String]` | List of formula names referenced in the answer. Empty if none are used. |\n| `parameters` | `[String]` | List of parameter names applied to the answer. Empty if none are used. |\n| `sub_queries` | `[JSON]` | List of sub-query objects used in the answer. Empty if none are present. |\n| `ac_state` | `ACState` | Agent context state, including `transaction_identifier` and `generation_number`, used to correlate this answer with a specific agent turn. |\n\n#### ACState fields\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `transaction_identifier` | `String` | Unique identifier of the agent transaction that produced this answer. |\n| `generation_number` | `Int` | Generation number within the transaction. |\n\n#### Example request\n\n```bash\nGET /api/rest/2.0/ai/agent/conversations/{conversation_identifier}/answers/{answer_identifier}/details\n```\n\n#### Example response\n\n```json\n{\n \"answer\": {\n \"title\": \"sales by month\",\n \"description\": \"\",\n \"session_identifier\": \"7b00b801-73f4-4639-af5e-e775584ceba6\",\n \"generation_number\": 1,\n \"tokens\": [\"[sales]\", \"[date].'monthly'\"],\n \"visualization_type\": null,\n \"formulas\": [],\n \"parameters\": [],\n \"sub_queries\": [],\n \"ac_state\": {\n \"transaction_identifier\": \"7f6c9948-b4c7-4098-bb1f-6c67bc0e5699\",\n \"generation_number\": 1\n }\n }\n}\n```\n\n#### Typical usage scenario\n\n1. Call `getConversation` to retrieve the full conversation history.\n2. Locate an `AnswerResponseItem` in `response_items` — note its `answer_id` field.\n3. Call `loadAnswer` with the `conversation_identifier` and `answer_id` as `answer_identifier`.\n4. The returned `tokens` array can be used to open the answer in the ThoughtSpot search interface or rendered as pill chips in the UI.\n\n#### Error responses\n\n| Code | Description |\n|------|-------------|\n| 401 | Unauthorized — authentication token is missing, expired, or invalid. |\n| 403 | Forbidden — the authenticated user does not have `CAN_USE_SPOTTER` privilege or lacks access to the specified conversation. |\n| 404 | Not Found — no conversation or message exists with the given identifiers for the authenticated user. |\n| 422 | Unprocessable Entity — the message does not contain an answer of the expected type. |\n\n> ###### Note:\n>\n> - This endpoint only loads answer-type messages. Other message types are not supported.\n> - `visualization_type` may be `null` if the agent did not produce a visualization suggestion for this answer.\n> - `formulas`, `parameters`, and `sub_queries` are returned as empty arrays when not applicable — they are never `null`.\n> - Available from version 26.7.0.cl and later.\n> - This endpoint requires Spotter — please contact ThoughtSpot Support to enable Spotter on your cluster.\n\n\n\n\n#### Endpoint URL\n", + "operationId": "getShareInfo", + "description": "\nReturns the current share state for a conversation the caller owns: whether\nthe shared view is outdated relative to the latest conversation content, and\nthe list of principals that currently have access.\nRequires `CAN_USE_SPOTTER` privilege and ownership of the specified conversation.
Version: 26.9.0.cl or later\n\nReturns the current share state for a conversation the caller owns: whether the shared view reflects the latest conversation content, and the list of principals that currently have access.\n\nUse this endpoint to render a share management UI, audit who has access to a conversation, or determine whether the shared view needs to be refreshed before sending a link.\n\nRequires ownership of the specified conversation.\n\n#### Usage guidelines\n\nThe request must include:\n\n- `conversation_identifier` _(query parameter)_: the unique ID of the conversation, as returned by `createAgentConversation` or `getConversationList`.\n\n#### Response fields\n\n| Field | Type | Description |\n| --- | --- | --- |\n| `conversation_id` | `String` | Echoes the request parameter. |\n| `is_shared_content_outdated` | `Boolean` | `true` when the shared view was generated before the last edit to the conversation and does not reflect the latest content. `false` when the shared view is current. `null` when the conversation has never been shared. |\n| `principals` | `ConversationPrincipalInfo[]` | List of principals with access. Empty when no access has been granted. The conversation owner is never included. |\n\n#### ConversationPrincipalInfo fields\n\n| Field | Type | Description |\n| --- | --- | --- |\n| `id` | `String` | Unique identifier of the user or group. |\n| `type` | `Principals` | `USER` for individual users, `USER_GROUP` for groups. |\n| `display_name` | `String` | Display name as shown in the ThoughtSpot UI. |\n| `name` | `String` | Internal name of the user or group. |\n| `permission` | `String` | Access level. Always `READ_ONLY` for shared conversations. |\n\n#### Example request\n\n```bash\nGET /api/rest/2.0/ai/agent/conversations/{conversation_identifier}/get-share-info\n```\n\n#### Example response — conversation shared and current\n\n```json\n{\n \"conversation_id\": \"conv-abc-123\",\n \"is_shared_content_outdated\": false,\n \"principals\": [\n {\n \"id\": \"user-001\",\n \"type\": \"USER\",\n \"display_name\": \"Alice Example\",\n \"name\": \"alice.example\",\n \"permission\": \"READ_ONLY\"\n },\n {\n \"id\": \"group-001\",\n \"type\": \"USER_GROUP\",\n \"display_name\": \"Sales Team\",\n \"name\": \"sales-team\",\n \"permission\": \"READ_ONLY\"\n }\n ]\n}\n```\n\n#### Example response — conversation never shared\n\n```json\n{\n \"conversation_id\": \"conv-abc-123\",\n \"is_shared_content_outdated\": null,\n \"principals\": []\n}\n```\n\n#### Example response — shared view outdated\n\n```json\n{\n \"conversation_id\": \"conv-abc-123\",\n \"is_shared_content_outdated\": true,\n \"principals\": [\n {\n \"id\": \"user-001\",\n \"type\": \"USER\",\n \"display_name\": \"Alice Example\",\n \"name\": \"alice.example\",\n \"permission\": \"READ_ONLY\"\n }\n ]\n}\n```\n\nWhen `is_shared_content_outdated` is `true`, call `shareConversation` with `refresh_shared_content: true` to update the shared view with the latest conversation content.\n\n#### Error responses\n\n| Code | Description |\n| --- | --- |\n| 401 | Unauthorized — authentication token is missing, expired, or invalid. |\n| 403 | Forbidden — the caller does not own the specified conversation, or does not have `CAN_USE_SPOTTER` privilege. |\n| 404 | Not Found — no conversation exists with the given identifier for the authenticated user. |\n\n> ###### Note:\n>\n> - This endpoint requires Spotter — please contact ThoughtSpot Support to enable Spotter on your cluster.\nVersion: 26.9.0.cl or later\n\n\n\n\n#### Endpoint URL\n", "tags": [ "AI", - "26.7.0.cl" + "26.9.0.cl" ], "parameters": [ { @@ -1278,15 +1254,6 @@ "type": "string" }, "description": "Unique identifier of the conversation." - }, - { - "in": "path", - "name": "answer_identifier", - "required": true, - "schema": { - "type": "string" - }, - "description": "Unique identifier of the answer to load. Use the `answer_id` field from an\n`AnswerResponseItem` returned by `getConversation`." } ], "responses": { @@ -1295,7 +1262,56 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/LoadAnswerResponse" + "$ref": "#/components/schemas/ConversationShareStatusResponse" + }, + "examples": { + "example_1": { + "summary": "Conversation shared with two principals, content is current", + "value": { + "conversation_id": "conv-abc-123", + "is_shared_content_outdated": false, + "principals": [ + { + "id": "user-001", + "type": "USER", + "display_name": "Alice Example", + "name": "alice.example", + "permission": "READ_ONLY" + }, + { + "id": "group-001", + "type": "USER_GROUP", + "display_name": "Sales Team", + "name": "sales-team", + "permission": "READ_ONLY" + } + ] + } + }, + "example_2": { + "summary": "Conversation never shared", + "value": { + "conversation_id": "conv-abc-123", + "is_shared_content_outdated": null, + "principals": [] + } + }, + "example_3": { + "summary": "Shared view is outdated — conversation was edited after sharing", + "value": { + "conversation_id": "conv-abc-123", + "is_shared_content_outdated": true, + "principals": [ + { + "id": "user-001", + "type": "USER", + "display_name": "Alice Example", + "name": "alice.example", + "permission": "READ_ONLY" + } + ] + } + } } } } @@ -1305,7 +1321,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/LoadAnswerResponse" + "$ref": "#/components/schemas/ConversationShareStatusResponse" } } } @@ -1353,20 +1369,19 @@ } } }, - "/api/rest/2.0/ai/analytical-questions": { + "/api/rest/2.0/ai/memory/import": { "post": { - "operationId": "queryGetDecomposedQuery", - "description": "\nBeta Version: 10.7.0.cl or later\n\nVersion: 10.7.0.cl or later\n\n**Deprecated** — Use `getRelevantQuestions` instead (available from 10.13.0.cl).\n\nBreaks down a topical or goal-oriented natural language question into smaller, actionable analytical sub-questions, each mapped to a relevant data source for independent execution.\n\nRequires `CAN_USE_SPOTTER` privilege and at least view-level access to the referenced metadata objects.\n\n#### Usage guidelines\n\nThe request accepts the following parameters:\n\n- `nlsRequest`: contains the user `query` to decompose, along with optional `instructions` and `bypassCache` flag\n- `worksheetIds`: list of data source identifiers to scope the decomposition\n- `answerIds`: list of Answer GUIDs whose data guides the response\n- `liveboardIds`: list of Liveboard GUIDs whose data guides the response\n- `conversationId`: an existing conversation session ID for context continuity\n- `content`: supplementary text or CSV data to improve response quality\n- `maxDecomposedQueries`: maximum number of sub-questions to return (default: `5`)\n\nIf the request is successful, the API returns a `decomposedQueryResponse` containing a list of `decomposedQueries`, each with:\n- `query`: the generated analytical sub-question\n- `worksheetId`: the unique ID of the data source the question targets\n- `worksheetName`: the display name of the corresponding data source\n\n#### Error responses\n\n| Code | Description |\n|------|---------------------------------------------------------------------------------------------------------------------------------------|\n| 401 | Unauthorized — authentication token is missing, expired, or invalid. |\n| 403 | Forbidden — the authenticated user does not have `CAN_USE_SPOTTER` privilege or lacks view access to the referenced metadata objects. |\n\n> ###### Note:\n> * This endpoint is deprecated since 10.13.0.cl. Use `getRelevantQuestions` for new integrations.\n> * This endpoint is currently in Beta. Breaking changes may be introduced before the endpoint is made Generally Available.\n> * This endpoint requires Spotter — please contact ThoughtSpot support to enable Spotter on your cluster.\n\n\n\n\n#### Endpoint URL\n", - "deprecated": true, + "operationId": "importMemory", + "description": "\nImports memory entries (rules, recipes, and always-apply rules) from\na YAML payload, typically a payload produced by `exportMemory` and\nedited locally. The imported entries replace the existing memory for\nthe data-models referenced in the payload.\n`dry_run` is required. Pass `true` first to validate the payload and\nreview the preview counts and any row-level failures without making\nchanges, then re-run with `dry_run = false` to apply the import. An\nimport is not applied if any row fails validation.\nRequires Spotter access (use/manage) and either edit or memory\naccess on corresponding data model sources.
Beta Version: 26.8.0.cl or later\n\nThis API allows users to import data-model memories using a given yaml file. This yaml file can be obtained from the export memory API in source env and can be modified and used as input to the import API in target env.\n\nThis API enables customers to migrate memories from a source env to a target env. This improves memory adoption for Spotter by giving the users a chance to develop their memories in one env and replicate the same in another env.\n\n#### Usage guidelines\n\nTo import memory, the request must include:\n- `content`: The full serialized memory payload to import (YAML). Typically the `content` value returned by the `exportMemory` API, edited locally and re-submitted. The payload itself identifies which data-models the memory applies to, so no separate identifier list is required.\n- `dry_run`: Required. When `true`, validate the payload and return preview counts without writing anything; when `false`, apply the import. Always run with `dry_run = true` first, then re-run with `dry_run = false` once you are satisfied with the preview.\n\nThe import replaces the existing global memories on the data-models referenced in the payload with the entries supplied in the payload.\n\nThe API returns a response object with:\n- `status`: The terminal status of the import (`SUCCESS`, `VALIDATION_FAILED`, or `FAILED`).\n- `summary`: Per `(memory_type, source)` counts. In a dry run the `deleted_record_count`/`inserted_record_count` are previews; in a real import they are actuals. On `VALIDATION_FAILED`, `summary` is `null` when validation fails before any item is processed (e.g. an unresolved or inaccessible data-model source) and an empty list otherwise — treat both as \"no counts available\".\n- `validation_failures`: Per-item validation failures, each with `line_number`, `reason`, `field_name`, and `message` for click-to-locate and inline highlighting.\n- `diagnostics`: Groups of diagnostic messages, each with a `sub_status` (`WARNING`, `FAILURE`, `ROLLED_BACK`, or `UNKNOWN`) and a `messages` list. This is the single channel for both non-fatal warnings (under `WARNING`, e.g. when some older memory entries could not be fully cleaned up) and fatal causes (e.g. the failure reason under `FAILURE`, or a `ROLLED_BACK` group when new entries were undone).\n- `operation_id`: A server-generated identifier for this import operation; include it when contacting support to help correlate server-side logs. Populated once the server registers the import operation; `null` when the request fails earlier (e.g. while parsing the payload or resolving its data-model sources).\n\n#### File format\n\nThe payload is a YAML document with a single top-level `memories` key holding a list of memory items. Each item is self-contained: a `type`, a typed `content` block, a `datamodel_sources` list, and optional `tags`. Typically you don't hand-author this file — you obtain it from `exportMemory`, edit it, and submit it back through `importMemory`.\n\n```yaml\nmemories:\n- type: RULE\n content:\n rule_definition: \"Always filter revenue to closed-won deals.\"\n datamodel_sources:\n - guid: 11111111-1111-1111-1111-111111111111\n obj_id: sales_data_model\n tags:\n - finance\n- type: RULE\n content:\n rule_definition: \"Exclude internal test accounts from all results.\"\n datamodel_sources:\n - obj_id: sales_data_model\n- type: RECIPE\n content:\n user_query: \"top accounts by revenue\"\n recipe: |\n {\"steps\": [...serialized recipe blob...]}\n datamodel_sources:\n - obj_id: sales_data_model\n- type: RECIPE\n content:\n user_query: \"monthly new customer count\"\n recipe: |\n {\"steps\": [...serialized recipe blob...]}\n datamodel_sources:\n - obj_id: sales_data_model\n- type: ALWAYS_APPLY_RULES\n content:\n rules:\n - \"Never show internal test accounts.\"\n - \"Round currency to whole dollars.\"\n datamodel_sources:\n - guid: 22222222-2222-2222-2222-222222222222\n```\n\nA file can contain multiple `RULE` and multiple `RECIPE` items for a data-model, but at most one `ALWAYS_APPLY_RULES` item per data-model.\n\n##### Memory item fields\n\n| Field | Required | Type | Description |\n|-------|----------|------|-------------|\n| `type` | Yes | String enum | One of `RULE`, `RECIPE`, or `ALWAYS_APPLY_RULES`. |\n| `content` | Yes | Mapping | Type-specific content block (see below). |\n| `datamodel_sources` | Yes | Non-empty list | The data-model(s) the memory attaches to. |\n| `tags` | No | List of strings | Free-form labels. |\n\n##### Memory types and content\n\n| `type` | Content fields | Notes |\n|--------|----------------|-------|\n| `RULE` | `rule_definition` — required, non-empty string | A single semantic rule. |\n| `RECIPE` | `recipe` and `user_query` — both required, non-empty strings | `recipe` is an opaque serialized blob; `user_query` is the natural-language query it answers. |\n| `ALWAYS_APPLY_RULES` | `rules` — required, non-empty list of non-empty strings | Data-model-wide always-apply rules. At most one `ALWAYS_APPLY_RULES` item per data-model. |\n\n##### Identifying data-models (`datamodel_sources`)\n\nEach item must list at least one source. Each entry identifies a data-model by at least one of:\n- `guid` — the data-model GUID.\n- `obj_id` — a stable object ID, resolved to a GUID server-side.\n\nIf both are supplied, `obj_id` takes precedence and `guid` is ignored entirely; `guid` takes effect only when `obj_id` is absent. Exported files populate `guid` and, if present, `obj_id` as well.\n\n> ⚠️ **Cross-environment import:** When `obj_id` is present it is\n> authoritative — the accompanying `guid` is **not** used as a fallback.\n> If an `obj_id` does not exist in the target environment, that item\n> fails with `UNRESOLVED_SOURCE`. Remove or correct stale `obj_id`\n> values before importing across environments.\n\n#### Validations reference\n\nThe payload is fully validated before anything is written. This applies to `dry_run = true` and `dry_run = false` alike: if any item fails validation, the entire import is rejected — no partial writes — and all failures are returned together so you can fix them in one pass.\n\n##### Limits\n\nDefault limits (may be adjusted in future if the need arises):\n\n| Limit | Default |\n|-------|---------|\n| Uploaded file size | 10 MiB |\n| Total memory items | 10,000 |\n| `rule_definition` length | 1,000 characters |\n| `user_query` length | 1,000 characters |\n| `recipe` length | 2,000 characters |\n| `rules` combined length (`ALWAYS_APPLY_RULES`) | 2,000 characters |\n| Tags per item | 10 |\n| Characters per tag | 50 |\n\nThe `rules` limit in `ALWAYS_APPLY_RULES` is a combined budget across all entries in the list, not per entry.\n\n##### Structural rules\n\n- The document must be a mapping with a `memories` key whose value is a list.\n- Unknown keys — at the top level, within an item, or under `content` — are rejected.\n- Each item's `type` must be one of the three supported values, and `content` must match that type's shape.\n- Null, empty-string, or wrong-typed values in a required field are treated as missing.\n- Non-string or empty `tags` entries are dropped silently; certain tags reserved for internal use are stripped automatically before the item is stored.\n\n##### Cross-item rules\n\n- A data-model referenced by more than one `ALWAYS_APPLY_RULES` item is rejected — combine them into a single item's `rules` list.\n\n##### Failure reasons\n\nEach entry in `validation_failures` carries one of:\n\n| Reason | Meaning |\n|--------|---------|\n| `SCHEMA` | YAML structure is invalid or unsupported. |\n| `VALIDATION` | A required field is missing/empty, a count exceeds a limit, or a GUID is malformed. |\n| `CHAR_LIMIT` | A content field or tag exceeds its size limit. |\n| `UNRESOLVED_SOURCE` | A `guid` or `obj_id` could not be resolved to an existing data-model. |\n| `ACCESS_DENIED` | The caller lacks sufficient access on the referenced data-model. |\n\n#### Dry run\n\n`dry_run` is required and has no default, so the import is always a deliberate two-step flow:\n\n1. **First, call with `dry_run = true`.** This validates the payload and previews what would happen — the counts in `summary` and any `validation_failures` — without writing anything.\n2. **Then, after reviewing a clean preview, call again with `dry_run = false`** (same `content`). This applies the import. It refuses to write when any item fails validation, so fix the reported `validation_failures` and resubmit.\n\n> ###### Important:\n> Never call `dry_run = false` without first inspecting a `dry_run = true` preview. A real import deletes and replaces existing global memories on the referenced data-models.\n\n#### Error responses\n\n| Code | Description |\n|------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| 401 | Unauthorized — authentication token is missing, expired, or invalid. |\n| 403 | Forbidden — the authenticated user does not have the necessary Spotter permissions, or the bearer token does not correspond to the data-model's org. Per-data-model access failures do not use this code — they surface as `ACCESS_DENIED` validation failures with HTTP `200` (see Logical failures below). |\n\n#### Logical failures\n\nValidation and write failures are not returned in the error envelope. The call returns `200` with a terminal `status` of `VALIDATION_FAILED` or `FAILED`, and the details live in `validation_failures` / `diagnostics`:\n\n- **VALIDATION_FAILED** — one or more items failed schema/semantic validation; nothing was written. Inspect `validation_failures`, fix the items, and resubmit.\n- **FAILED** — the import did not complete. Inspect `diagnostics`: a `ROLLED_BACK` group means writing the new entries failed and any entries written before the failure were undone (existing memory is intact, no destructive change), while a `FAILURE` group carries another non-validation cause.\n\nSample `VALIDATION_FAILED` responses (HTTP 200):\n\n**Invalid data-model (unresolved source):**\n\n```json\n{\n \"status\": \"VALIDATION_FAILED\",\n \"summary\": null,\n \"validation_failures\": [\n {\n \"line_number\": 2,\n \"reason\": \"UNRESOLVED_SOURCE\",\n \"field_name\": \"datamodel_sources[0].guid\",\n \"message\": \"unknown datamodel guid: 55555555-5555-5555-5555-555555555555\"\n }\n ],\n \"diagnostics\": [\n {\n \"sub_status\": \"FAILURE\",\n \"messages\": [\n \"unknown datamodel guid: 55555555-5555-5555-5555-555555555555\"\n ]\n }\n ],\n \"operation_id\": null\n}\n```\n\n**Inaccessible data-models:**\n\n```json\n{\n \"status\": \"VALIDATION_FAILED\",\n \"summary\": null,\n \"validation_failures\": [\n {\n \"line_number\": 2,\n \"reason\": \"ACCESS_DENIED\",\n \"field_name\": \"datamodel_sources[0]\",\n \"message\": \"Insufficient permissions on datamodel '44444444-4444-4444-4444-444444444444'\"\n },\n {\n \"line_number\": 8,\n \"reason\": \"ACCESS_DENIED\",\n \"field_name\": \"datamodel_sources[0]\",\n \"message\": \"Insufficient permissions on datamodel '33333333-3333-3333-3333-333333333333'\"\n }\n ],\n \"diagnostics\": [\n {\n \"sub_status\": \"FAILURE\",\n \"messages\": [\n \"Memory import validation failed with 2 error(s): Insufficient permissions on datamodel '44444444-4444-4444-4444-444444444444'; Insufficient permissions on datamodel '33333333-3333-3333-3333-333333333333'\"\n ]\n }\n ],\n \"operation_id\": null\n}\n```\n\n**Character-limit validations:**\n\n```json\n{\n \"status\": \"VALIDATION_FAILED\",\n \"summary\": [],\n \"validation_failures\": [\n {\n \"line_number\": 3,\n \"reason\": \"CHAR_LIMIT\",\n \"field_name\": \"content.rule_definition\",\n \"message\": \"content.rule_definition is 1073 characters; max allowed is 1000\"\n },\n {\n \"line_number\": 49,\n \"reason\": \"CHAR_LIMIT\",\n \"field_name\": \"content.user_query\",\n \"message\": \"content.user_query is 1150 characters; max allowed is 1000\"\n },\n {\n \"line_number\": 49,\n \"reason\": \"CHAR_LIMIT\",\n \"field_name\": \"content.recipe\",\n \"message\": \"content.recipe is 3574 characters; max allowed is 2000\"\n }\n ],\n \"diagnostics\": [\n {\n \"sub_status\": \"FAILURE\",\n \"messages\": [\n \"Validation failures present; fix them and re-run to see the DRY_RUN preview.\"\n ]\n }\n ],\n \"operation_id\": \"66666666-6666-6666-6666-666666666666\"\n}\n```\n\n> ###### Note:\n> - To use this API, the user needs Spotter access (use/manage) and either edit or memory access on the data-model and they must use corresponding org related bearerToken where the data-model exists.\n> - This endpoint is currently in Beta. Breaking changes may be introduced before the endpoint is made Generally Available.\n> - Available from version 26.8.0.cl and later.\n> - This endpoint requires Spotter — please contact ThoughtSpot Support to enable Spotter on your cluster.\n\n\n\n\n#### Endpoint URL\n", "tags": [ "AI", - "10.7.0.cl" + "26.8.0.cl" ], "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/QueryGetDecomposedQueryRequest" + "$ref": "#/components/schemas/ImportMemoryRequest" } } }, @@ -1379,7 +1394,97 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/eureka_DecomposeQueryResponse" + "$ref": "#/components/schemas/ImportMemoryResponse" + }, + "examples": { + "example_1": { + "summary": "Successful dry-run preview", + "value": { + "status": "SUCCESS", + "summary": [ + { + "memory_type": "RULES", + "source": { + "identifier": "33333333-3333-3333-3333-333333333333", + "type": "DATA_MODEL" + }, + "existing_record_count": 3, + "deleted_record_count": 3, + "inserted_record_count": 2, + "failed_record_count": 0 + }, + { + "memory_type": "RECIPES", + "source": { + "identifier": "33333333-3333-3333-3333-333333333333", + "type": "DATA_MODEL" + }, + "existing_record_count": 7, + "deleted_record_count": 7, + "inserted_record_count": 4, + "failed_record_count": 0 + }, + { + "memory_type": "ALWAYS_APPLY_RULES", + "source": { + "identifier": "33333333-3333-3333-3333-333333333333", + "type": "DATA_MODEL" + }, + "existing_record_count": 0, + "deleted_record_count": 0, + "inserted_record_count": 1, + "failed_record_count": 0 + } + ], + "validation_failures": [], + "diagnostics": [], + "operation_id": "77777777-7777-7777-7777-777777777777" + } + }, + "example_2": { + "summary": "Successful import (dry_run=false)", + "value": { + "status": "SUCCESS", + "summary": [ + { + "memory_type": "RULES", + "source": { + "identifier": "33333333-3333-3333-3333-333333333333", + "type": "DATA_MODEL" + }, + "existing_record_count": 3, + "deleted_record_count": 3, + "inserted_record_count": 2, + "failed_record_count": 0 + }, + { + "memory_type": "RECIPES", + "source": { + "identifier": "33333333-3333-3333-3333-333333333333", + "type": "DATA_MODEL" + }, + "existing_record_count": 7, + "deleted_record_count": 7, + "inserted_record_count": 4, + "failed_record_count": 0 + }, + { + "memory_type": "ALWAYS_APPLY_RULES", + "source": { + "identifier": "33333333-3333-3333-3333-333333333333", + "type": "DATA_MODEL" + }, + "existing_record_count": 0, + "deleted_record_count": 0, + "inserted_record_count": 1, + "failed_record_count": 0 + } + ], + "validation_failures": [], + "diagnostics": [], + "operation_id": "88888888-8888-8888-8888-888888888888" + } + } } } } @@ -1389,7 +1494,183 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/eureka_DecomposeQueryResponse" + "$ref": "#/components/schemas/ImportMemoryResponse" + } + } + } + }, + "400": { + "description": "Operation failed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized access.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden access.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Operation failed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/rest/2.0/ai/agent/conversations/{conversation_identifier}/answers/{answer_identifier}/details": { + "get": { + "operationId": "loadAnswer", + "description": "\nLoads the full answer payload for a specific answer item in an agent\nconversation. Returns structured answer data including the TML query, token\nbreakdown, visualization metadata, and agent context state.\nPass the `answer_id` from an `AnswerResponseItem` in the `getConversation`\nresponse as the `answer_identifier` parameter.\nRequires `CAN_USE_SPOTTER` privilege and access to the specified conversation.
Version: 26.7.0.cl or later\n\nLoads the answer details for a specific answer item in an agent conversation. Returns structured answer data including the TML token list, visualization metadata, and agent context state. Use this endpoint to retrieve the full answer representation for an answer item — for example, to re-render a chart, export a query, or inspect the generated TML.\n\nRequires `CAN_USE_SPOTTER` privilege and access to the specified conversation.\n\n#### Usage guidelines\n\nThe request must include:\n\n- `conversation_identifier` *(path parameter)*: the unique ID of the conversation, as returned by `createAgentConversation`\n- `answer_identifier` *(path parameter)*: the `answer_id` field from an `AnswerResponseItem` in the `getConversation` response\n\nIf the request is successful, the response contains an `answer` object with the following fields:\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `title` | `String` | Display title of the generated answer (e.g., `\"sales by month\"`). |\n| `description` | `String` | Optional description of the answer. |\n| `session_identifier` | `String` | Unique identifier of the session in which this answer was generated. |\n| `generation_number` | `Int` | Generation sequence number of this answer within the session. |\n| `tokens` | `[String]` | Ordered list of TML token strings that make up the answer query (e.g., `[\"[sales]\", \"[date].'monthly'\"]`). |\n| `visualization_type` | `VizType` | Suggested visualization type: `Chart`, `Table`, or `Undefined`. `null` if no suggestion is available. |\n| `formulas` | `[String]` | List of formula names referenced in the answer. Empty if none are used. |\n| `parameters` | `[String]` | List of parameter names applied to the answer. Empty if none are used. |\n| `sub_queries` | `[JSON]` | List of sub-query objects used in the answer. Empty if none are present. |\n| `ac_state` | `ACState` | Agent context state, including `transaction_identifier` and `generation_number`, used to correlate this answer with a specific agent turn. |\n\n#### ACState fields\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `transaction_identifier` | `String` | Unique identifier of the agent transaction that produced this answer. |\n| `generation_number` | `Int` | Generation number within the transaction. |\n\n#### Example request\n\n```bash\nGET /api/rest/2.0/ai/agent/conversations/{conversation_identifier}/answers/{answer_identifier}/details\n```\n\n#### Example response\n\n```json\n{\n \"answer\": {\n \"title\": \"sales by month\",\n \"description\": \"\",\n \"session_identifier\": \"7b00b801-73f4-4639-af5e-e775584ceba6\",\n \"generation_number\": 1,\n \"tokens\": [\"[sales]\", \"[date].'monthly'\"],\n \"visualization_type\": null,\n \"formulas\": [],\n \"parameters\": [],\n \"sub_queries\": [],\n \"ac_state\": {\n \"transaction_identifier\": \"7f6c9948-b4c7-4098-bb1f-6c67bc0e5699\",\n \"generation_number\": 1\n }\n }\n}\n```\n\n#### Typical usage scenario\n\n1. Call `getConversation` to retrieve the full conversation history.\n2. Locate an `AnswerResponseItem` in `response_items` — note its `answer_id` field.\n3. Call `loadAnswer` with the `conversation_identifier` and `answer_id` as `answer_identifier`.\n4. The returned `tokens` array can be used to open the answer in the ThoughtSpot search interface or rendered as pill chips in the UI.\n\n#### Error responses\n\n| Code | Description |\n|------|-------------|\n| 401 | Unauthorized — authentication token is missing, expired, or invalid. |\n| 403 | Forbidden — the authenticated user does not have `CAN_USE_SPOTTER` privilege or lacks access to the specified conversation. |\n| 404 | Not Found — no conversation or message exists with the given identifiers for the authenticated user. |\n| 422 | Unprocessable Entity — the message does not contain an answer of the expected type. |\n\n> ###### Note:\n>\n> - This endpoint only loads answer-type messages. Other message types are not supported.\n> - `visualization_type` may be `null` if the agent did not produce a visualization suggestion for this answer.\n> - `formulas`, `parameters`, and `sub_queries` are returned as empty arrays when not applicable — they are never `null`.\n> - Available from version 26.7.0.cl and later.\n> - This endpoint requires Spotter — please contact ThoughtSpot Support to enable Spotter on your cluster.\n\n\n\n\n#### Endpoint URL\n", + "tags": [ + "AI", + "26.7.0.cl" + ], + "parameters": [ + { + "in": "path", + "name": "conversation_identifier", + "required": true, + "schema": { + "type": "string" + }, + "description": "Unique identifier of the conversation." + }, + { + "in": "path", + "name": "answer_identifier", + "required": true, + "schema": { + "type": "string" + }, + "description": "Unique identifier of the answer to load. Use the `answer_id` field from an\n`AnswerResponseItem` returned by `getConversation`." + } + ], + "responses": { + "200": { + "description": "Common successful response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/LoadAnswerResponse" + } + } + } + }, + "201": { + "description": "Common error response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/LoadAnswerResponse" + } + } + } + }, + "400": { + "description": "Operation failed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized access.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden access.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Operation failed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/rest/2.0/ai/analytical-questions": { + "post": { + "operationId": "queryGetDecomposedQuery", + "description": "\nBeta Version: 10.7.0.cl or later\n\nVersion: 10.7.0.cl or later\n\n**Deprecated** — Use `getRelevantQuestions` instead (available from 10.13.0.cl).\n\nBreaks down a topical or goal-oriented natural language question into smaller, actionable analytical sub-questions, each mapped to a relevant data source for independent execution.\n\nRequires `CAN_USE_SPOTTER` privilege and at least view-level access to the referenced metadata objects.\n\n#### Usage guidelines\n\nThe request accepts the following parameters:\n\n- `nlsRequest`: contains the user `query` to decompose, along with optional `instructions` and `bypassCache` flag\n- `worksheetIds`: list of data source identifiers to scope the decomposition\n- `answerIds`: list of Answer GUIDs whose data guides the response\n- `liveboardIds`: list of Liveboard GUIDs whose data guides the response\n- `conversationId`: an existing conversation session ID for context continuity\n- `content`: supplementary text or CSV data to improve response quality\n- `maxDecomposedQueries`: maximum number of sub-questions to return (default: `5`)\n\nIf the request is successful, the API returns a `decomposedQueryResponse` containing a list of `decomposedQueries`, each with:\n- `query`: the generated analytical sub-question\n- `worksheetId`: the unique ID of the data source the question targets\n- `worksheetName`: the display name of the corresponding data source\n\n#### Error responses\n\n| Code | Description |\n|------|---------------------------------------------------------------------------------------------------------------------------------------|\n| 401 | Unauthorized — authentication token is missing, expired, or invalid. |\n| 403 | Forbidden — the authenticated user does not have `CAN_USE_SPOTTER` privilege or lacks view access to the referenced metadata objects. |\n\n> ###### Note:\n> * This endpoint is deprecated since 10.13.0.cl. Use `getRelevantQuestions` for new integrations.\n> * This endpoint is currently in Beta. Breaking changes may be introduced before the endpoint is made Generally Available.\n> * This endpoint requires Spotter — please contact ThoughtSpot support to enable Spotter on your cluster.\n\n\n\n\n#### Endpoint URL\n", + "deprecated": true, + "tags": [ + "AI", + "10.7.0.cl" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/QueryGetDecomposedQueryRequest" + } + } + }, + "required": true + }, + "parameters": [], + "responses": { + "200": { + "description": "Common successful response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/eureka_DecomposeQueryResponse" + } + } + } + }, + "201": { + "description": "Common error response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/eureka_DecomposeQueryResponse" } } } @@ -2177,45 +2458,38 @@ } } }, - "/api/rest/2.0/ai/answer/create": { + "/api/rest/2.0/ai/agent/conversations/{conversation_identifier}/share": { "post": { - "operationId": "singleAnswer", - "description": "\nBeta Version: 10.4.0.cl or later\n\nProcesses a natural language query against a specified data model and returns a single AI-generated answer without requiring a conversation session.\n\nRequires `CAN_USE_SPOTTER` privilege and at least view access to the metadata object specified in the request.\n\n#### Usage guidelines\n\nThe request must include:\n- `query`: a natural language question (e.g., \"What were total sales last quarter?\")\n- `metadata_identifier`: the unique ID of the data source to query against\n\nIf the request is successful, the API returns a response message containing:\n- `session_identifier`: the unique ID of the generated response\n- `generation_number`: the generation number of the response\n- `message_type`: the type of the response (e.g., `TSAnswer`)\n- `visualization_type`: the generated visualization type (`Chart`, `Table`, or `Undefined`)\n- `tokens` / `display_tokens`: the search tokens and user-friendly display tokens for the response\n\n#### Error responses\n\n| Code | Description |\n|------|-----------------------------------------------------------------------------------------------------------------------------------------|\n| 401 | Unauthorized — authentication token is missing, expired, or invalid. |\n| 403 | Forbidden — the authenticated user does not have `CAN_USE_SPOTTER` privilege or lacks view permission on the specified metadata object. |\n\n> ###### Note:\n> * This endpoint is currently in Beta. Breaking changes may be introduced before the endpoint is made Generally Available.\n> * This endpoint requires Spotter - please contact ThoughtSpot support to enable Spotter on your cluster.\n\n\n\n\n#### Endpoint URL\n", + "operationId": "shareConversation", + "description": "\nGrants or revokes access to a shared conversation for one or more principals\n(users or groups). When principals are added, a read-only shared view of the\nconversation is created from its current state. Use `refresh_shared_content`\nto regenerate the shared view with the latest conversation content.\nRequires `CAN_USE_SPOTTER` privilege and ownership of the specified conversation.
Version: 26.9.0.cl or later\n\nGrants or revokes access to a shared conversation for one or more principals (users or groups). When principals are added, a read-only shared view of the conversation is created from its current state. The shared view is a point-in-time copy — use `refresh_shared_content` to regenerate it with the latest conversation content.\n\nRequires ownership of the specified conversation. Only the user who created the conversation can manage its share access.\n\n#### Usage guidelines\n\nThe conversation to share is identified by the `{conversation_identifier}` URL path parameter. At least one of the following must be true: `grant` is non-empty, `revoke` is non-empty, or `refresh_shared_content` is `true`. A principal cannot appear in both lists in the same request.\n\n| Field | Type | Default | Description |\n| --- | --- | --- | --- |\n| `refresh_shared_content` | `Boolean` | `false` | When `true`, always regenerates the shared view from the latest conversation state, even if a shared view already exists. When `false`, reuses the existing shared view. |\n| `grant` | `PrincipalRefInput[]` | `[]` | Principals to grant read-only access. |\n| `revoke` | `PrincipalRefInput[]` | `[]` | Principals to revoke access from. |\n| `notify_on_share` | `Boolean` | `true` | *(available from 26.10.0.cl)* When `true`, newly granted principals are notified of the share. When `false`, access is granted without sending a notification. Has no effect on principals passed in `revoke`, and does not re-notify a principal who already had access. |\n\n#### PrincipalRefInput fields\n\n| Field | Type | Description |\n| --- | --- | --- |\n| `principal_identifier` | `String` | Unique identifier of the user or group. |\n| `principal_type` | `Principals` | `USER` for individual users, `USER_GROUP` for groups. |\n\n#### Example request — granting access\n\n```bash\nPOST /api/rest/2.0/ai/agent/conversations/{conversation_identifier}/share\n```\n\n```json\n{\n \"refresh_shared_content\": false,\n \"grant\": [\n { \"principal_identifier\": \"user-001\", \"principal_type\": \"USER\" },\n { \"principal_identifier\": \"group-001\", \"principal_type\": \"USER_GROUP\" }\n ],\n \"revoke\": [],\n \"notify_on_share\": true\n}\n```\n\n#### Example request — revoking access\n\n```json\n{\n \"refresh_shared_content\": false,\n \"grant\": [],\n \"revoke\": [\n { \"principal_identifier\": \"user-001\", \"principal_type\": \"USER\" }\n ]\n}\n```\n\nSet `refresh_shared_content: true` with empty `grant` and `revoke` to regenerate the shared snapshot for existing recipients without changing access. Combine with non-empty `grant` or `revoke` to update access and refresh the snapshot in a single call.\n\n#### Error responses\n\n| Code | Description |\n| --- | --- |\n| 401 | Unauthorized — authentication token is missing, expired, or invalid. |\n| 403 | Forbidden — the caller does not own the specified conversation, or does not have `CAN_USE_SPOTTER` privilege. |\n| 404 | Not Found — no conversation exists with the given identifier for the authenticated user. |\n| 422 | Unprocessable — `refresh_shared_content` is `false` and both `grant` and `revoke` are empty, or a principal appears in both lists. |\n\n> ###### Note:\n>\n> - The shared view is a read-only snapshot of the conversation at the time of sharing. Recipients cannot send messages or modify the conversation.\n> - Use `getShareInfo` to check whether the shared view is outdated relative to the current conversation state.\n> - `notify_on_share: false` only suppresses the share notification; access is still granted.\n> - This endpoint requires Spotter — please contact ThoughtSpot Support to enable Spotter on your cluster.\nVersion: 26.9.0.cl or later\n\n\n\n\n#### Endpoint URL\n", "tags": [ "AI", - "10.4.0.cl" + "26.9.0.cl" ], "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SingleAnswerRequest" + "$ref": "#/components/schemas/ShareConversationRequest" } } }, "required": true }, - "parameters": [], + "parameters": [ + { + "in": "path", + "name": "conversation_identifier", + "required": true, + "schema": { + "type": "string" + }, + "description": "Unique identifier of the conversation to share." + } + ], "responses": { - "200": { - "description": "Common successful response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ResponseMessage" - } - } - } - }, - "201": { - "description": "Common error response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ResponseMessage" - } - } - } + "204": { + "description": "Successfully updated the share access for the conversation." }, "400": { "description": "Operation failed", @@ -2260,28 +2534,111 @@ } } }, - "/api/rest/2.0/ai/agent/conversation/{conversation_identifier}/stop-response": { + "/api/rest/2.0/ai/answer/create": { "post": { - "operationId": "stopConversation", - "description": "\nStops an in-progress agent conversation response.
Version: 26.6.0.cl or later\n\nVersion: 26.6.0.cl or later\n\nStops an in-progress agent response for the specified conversation. Use this endpoint to cancel a response that is actively being generated — for example, when the user navigates away, reformulates their question, or no longer needs the current result.\n\nRequires `CAN_USE_SPOTTER` privilege and access to the specified conversation.\n\n#### Usage guidelines\n\nThe request must include:\n\n- `conversation_identifier` *(path parameter)*: the unique ID of the conversation whose active response should be stopped, as returned by `createAgentConversation`\n\nA successful request returns an empty `204 No Content` response. If there is no active response in progress at the time of the call, the request is still treated as successful.\n\nAfter stopping a response, the conversation session remains active. You can continue sending messages using `sendAgentConversationMessage` or `sendAgentConversationMessageStreaming`.\n\n#### Example request\n\n```bash\nPOST /api/rest/2.0/ai/agent/conversation/{conversation_identifier}/stop-response\n```\n\n#### Typical usage scenario\n\nThis endpoint is useful when integrating Spotter into a chat UI where users can cancel a long-running query. For example:\n\n1. User sends a message via `sendAgentConversationMessageStreaming`.\n2. User clicks a \"Stop generating\" button while the response is streaming.\n3. Your client calls `stopConversation` with the active `conversation_identifier`.\n4. The stream is terminated and the user can ask a new question.\n\n#### Error responses\n\n| Code | Description |\n|------|-------------|\n| 401 | Unauthorized — authentication token is missing, expired, or invalid. |\n| 403 | Forbidden — the authenticated user does not have `CAN_USE_SPOTTER` privilege or lacks access to the specified conversation. |\n\n> ###### Note:\n>\n> - Calling this endpoint when no response is in progress does not return an error.\n> - The conversation context is preserved after stopping — previous messages and answers remain accessible.\n> - Available from version 26.6.0.cl and later.\n> - This endpoint requires Spotter — please contact ThoughtSpot Support to enable Spotter on your cluster.\n> - This feature is available only for **Spotter 3** (`SPOTTER3`) version.\n\n\n\n\n#### Endpoint URL\n", + "operationId": "singleAnswer", + "description": "\nBeta Version: 10.4.0.cl or later\n\nProcesses a natural language query against a specified data model and returns a single AI-generated answer without requiring a conversation session.\n\nRequires `CAN_USE_SPOTTER` privilege and at least view access to the metadata object specified in the request.\n\n#### Usage guidelines\n\nThe request must include:\n- `query`: a natural language question (e.g., \"What were total sales last quarter?\")\n- `metadata_identifier`: the unique ID of the data source to query against\n\nIf the request is successful, the API returns a response message containing:\n- `session_identifier`: the unique ID of the generated response\n- `generation_number`: the generation number of the response\n- `message_type`: the type of the response (e.g., `TSAnswer`)\n- `visualization_type`: the generated visualization type (`Chart`, `Table`, or `Undefined`)\n- `tokens` / `display_tokens`: the search tokens and user-friendly display tokens for the response\n\n#### Error responses\n\n| Code | Description |\n|------|-----------------------------------------------------------------------------------------------------------------------------------------|\n| 401 | Unauthorized — authentication token is missing, expired, or invalid. |\n| 403 | Forbidden — the authenticated user does not have `CAN_USE_SPOTTER` privilege or lacks view permission on the specified metadata object. |\n\n> ###### Note:\n> * This endpoint is currently in Beta. Breaking changes may be introduced before the endpoint is made Generally Available.\n> * This endpoint requires Spotter - please contact ThoughtSpot support to enable Spotter on your cluster.\n\n\n\n\n#### Endpoint URL\n", "tags": [ "AI", - "26.6.0.cl" - ], - "parameters": [ - { - "in": "path", - "name": "conversation_identifier", - "required": true, - "schema": { - "type": "string" - }, - "description": "Unique identifier of the conversation to stop." - } + "10.4.0.cl" ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SingleAnswerRequest" + } + } + }, + "required": true + }, + "parameters": [], "responses": { - "204": { - "description": "Successfully stopped the in-progress agent conversation response for the given." + "200": { + "description": "Common successful response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ResponseMessage" + } + } + } + }, + "201": { + "description": "Common error response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ResponseMessage" + } + } + } + }, + "400": { + "description": "Operation failed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized access.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden access.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Operation failed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/rest/2.0/ai/agent/conversation/{conversation_identifier}/stop-response": { + "post": { + "operationId": "stopConversation", + "description": "\nStops an in-progress agent conversation response.
Version: 26.6.0.cl or later\n\nVersion: 26.6.0.cl or later\n\nStops an in-progress agent response for the specified conversation. Use this endpoint to cancel a response that is actively being generated — for example, when the user navigates away, reformulates their question, or no longer needs the current result.\n\nRequires `CAN_USE_SPOTTER` privilege and access to the specified conversation.\n\n#### Usage guidelines\n\nThe request must include:\n\n- `conversation_identifier` *(path parameter)*: the unique ID of the conversation whose active response should be stopped, as returned by `createAgentConversation`\n\nA successful request returns an empty `204 No Content` response. If there is no active response in progress at the time of the call, the request is still treated as successful.\n\nAfter stopping a response, the conversation session remains active. You can continue sending messages using `sendAgentConversationMessage` or `sendAgentConversationMessageStreaming`.\n\n#### Example request\n\n```bash\nPOST /api/rest/2.0/ai/agent/conversation/{conversation_identifier}/stop-response\n```\n\n#### Typical usage scenario\n\nThis endpoint is useful when integrating Spotter into a chat UI where users can cancel a long-running query. For example:\n\n1. User sends a message via `sendAgentConversationMessageStreaming`.\n2. User clicks a \"Stop generating\" button while the response is streaming.\n3. Your client calls `stopConversation` with the active `conversation_identifier`.\n4. The stream is terminated and the user can ask a new question.\n\n#### Error responses\n\n| Code | Description |\n|------|-------------|\n| 401 | Unauthorized — authentication token is missing, expired, or invalid. |\n| 403 | Forbidden — the authenticated user does not have `CAN_USE_SPOTTER` privilege or lacks access to the specified conversation. |\n\n> ###### Note:\n>\n> - Calling this endpoint when no response is in progress does not return an error.\n> - The conversation context is preserved after stopping — previous messages and answers remain accessible.\n> - Available from version 26.6.0.cl and later.\n> - This endpoint requires Spotter — please contact ThoughtSpot Support to enable Spotter on your cluster.\n> - This feature is available only for **Spotter 3** (`SPOTTER3`) version.\n\n\n\n\n#### Endpoint URL\n", + "tags": [ + "AI", + "26.6.0.cl" + ], + "parameters": [ + { + "in": "path", + "name": "conversation_identifier", + "required": true, + "schema": { + "type": "string" + }, + "description": "Unique identifier of the conversation to stop." + } + ], + "responses": { + "204": { + "description": "Successfully stopped the in-progress agent conversation response for the given." }, "400": { "description": "Operation failed", @@ -2420,7 +2777,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "204": { "description": "Trusted authentication settings configured successfully." @@ -2536,7 +2897,11 @@ "Authentication", "9.0.0.cl" ], - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "200": { "description": "Fetch current session user detail successful.", @@ -2923,6 +3288,16 @@ } } }, + "409": { + "description": "Conflict. A concurrent update to the same template variable was detected and the request could not be applied. Retry the request after serializing concurrent variable updates.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "An unexpected error occurred on the server.", "content": { @@ -3300,7 +3675,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "204": { "description": "User login successful." @@ -3416,7 +3795,11 @@ "Authentication", "9.0.0.cl" ], - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "204": { "description": "User logout successful." @@ -3638,7 +4021,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "200": { "description": "Authentication settings retrieved successfully.", @@ -3962,7 +4349,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "200": { "description": "Collection created successfully", @@ -4035,7 +4426,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "200": { "description": "Collections deleted successfully.", @@ -4118,7 +4513,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "200": { "description": "Successfully retrieved list of collections", @@ -4200,6 +4599,9 @@ "type": "string" }, "description": "Unique GUID of the collection. Note: Collection names cannot be used as\nidentifiers since duplicate names are allowed." + }, + { + "$ref": "#/components/parameters/OrgSelector" } ], "responses": { @@ -4277,7 +4679,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "200": { "description": "Configuration fetched successfully.", @@ -4353,7 +4759,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "200": { "description": "Connection configuration successfully created.", @@ -4426,7 +4836,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "204": { "description": "Connection Configurations successfully deleted." @@ -4501,6 +4915,9 @@ "type": "string" }, "description": "Unique ID or name of the configuration." + }, + { + "$ref": "#/components/parameters/OrgSelector" } ], "responses": { @@ -4568,7 +4985,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "200": { "description": "Connection to the datasource successfully created.", @@ -4642,7 +5063,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "204": { "description": "Connection successfully deleted." @@ -4707,6 +5132,9 @@ "type": "string" }, "description": "Unique ID or name of the connection." + }, + { + "$ref": "#/components/parameters/OrgSelector" } ], "responses": { @@ -4773,6 +5201,9 @@ "type": "string" }, "description": "GUID of the connection" + }, + { + "$ref": "#/components/parameters/OrgSelector" } ], "responses": { @@ -4842,6 +5273,9 @@ "type": "string" }, "description": "GUID of the connection" + }, + { + "$ref": "#/components/parameters/OrgSelector" } ], "responses": { @@ -4925,6 +5359,9 @@ "type": "string" }, "description": "Unique ID or name of the connection whose refresh tokens need to be revoked. All the users associated with the connection will have their refresh tokens revoked except the author." + }, + { + "$ref": "#/components/parameters/OrgSelector" } ], "responses": { @@ -5019,7 +5456,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "200": { "description": "List of connections to the datasource.", @@ -5104,6 +5545,9 @@ "type": "string" }, "description": "Unique ID or name of the connection." + }, + { + "$ref": "#/components/parameters/OrgSelector" } ], "responses": { @@ -5189,7 +5633,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "204": { "description": "Connection successfully updated." @@ -5264,6 +5712,9 @@ "type": "string" }, "description": "Unique ID or name of the connection." + }, + { + "$ref": "#/components/parameters/OrgSelector" } ], "responses": { @@ -5350,6 +5801,9 @@ "type": "string" }, "description": "Unique ID or name of the connection." + }, + { + "$ref": "#/components/parameters/OrgSelector" } ], "responses": { @@ -5417,7 +5871,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "200": { "description": "Custom action created successfully.", @@ -5567,6 +6025,9 @@ "type": "string" }, "description": "Unique ID or name of the custom action." + }, + { + "$ref": "#/components/parameters/OrgSelector" } ], "responses": { @@ -5694,7 +6155,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "200": { "description": "Custom action search is successful.", @@ -5842,6 +6307,9 @@ "type": "string" }, "description": "Unique ID or name of the custom action." + }, + { + "$ref": "#/components/parameters/OrgSelector" } ], "responses": { @@ -5969,7 +6437,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "200": { "description": "Custom calendar created successfully.", @@ -6041,6 +6513,9 @@ "type": "string" }, "description": "Unique ID or name of the Calendar." + }, + { + "$ref": "#/components/parameters/OrgSelector" } ], "responses": { @@ -6108,7 +6583,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "200": { "description": "Generate custom calendar data based on specifications, as a CSV file.", @@ -6181,7 +6660,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "200": { "description": "Custom calendar fetched successfully.", @@ -6266,6 +6749,9 @@ "type": "string" }, "description": "Unique Id or name of the calendar." + }, + { + "$ref": "#/components/parameters/OrgSelector" } ], "responses": { @@ -6333,7 +6819,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "200": { "description": "Fetching data of specified metadata object is successful.", @@ -6406,7 +6896,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "200": { "description": "Fetching data of specified metadata object is successful.", @@ -6479,7 +6973,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "200": { "description": "Fetching data of specified metadata object is successful.", @@ -6604,7 +7102,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "200": { "description": "Succesfully created DBT Connection.", @@ -6696,7 +7198,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "200": { "description": "Sync Table and Worksheet TML's are successfully generated.", @@ -6809,7 +7315,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "200": { "description": "Required Table and Worksheet TML's are successfully generated.", @@ -6872,7 +7382,11 @@ "DBT", "9.9.0.cl" ], - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "200": { "description": "Retrieved list of DBT connections successfully.", @@ -6947,6 +7461,9 @@ "type": "string" }, "description": "Unique ID of the DBT Connection." + }, + { + "$ref": "#/components/parameters/OrgSelector" } ], "responses": { @@ -7069,7 +7586,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "200": { "description": "DBT Connection successfully updated.", @@ -7142,7 +7663,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "200": { "description": "OK", @@ -7205,6 +7730,9 @@ "type": "string" }, "description": "Unique ID or name of the email customization." + }, + { + "$ref": "#/components/parameters/OrgSelector" } ], "responses": { @@ -7262,7 +7790,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "204": { "description": "Email Customization configuration successfully deleted." @@ -7328,7 +7860,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "200": { "description": "OK", @@ -7394,7 +7930,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "204": { "description": "Email Customization configuration successfully updated." @@ -7450,7 +7990,11 @@ "Email Customization", "10.10.0.cl" ], - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "204": { "description": "Triggered test email for customization configuration" @@ -7488,6 +8032,499 @@ } } }, + "/api/rest/2.0/configurations/features/search": { + "post": { + "operationId": "searchFeatures", + "description": "\n Version: 26.10.0.cl or later\n\nVersion: 26.10.0.cl or later\n\nReturns the feature configurations available on the ThoughtSpot system, grouped by feature group.\n\n#### Pre-requisites\n\nRequires `ADMINISTRATION` (**Can administer ThoughtSpot**) privilege.\nIf [Role-Based Access Control (RBAC)](https://developers.thoughtspot.com/docs/rbac) is enabled on your instance, the `ADMINISTRATION` (**Can administer ThoughtSpot**) privilege is required.\n\n#### Usage guidelines\n\nTo retrieve feature configurations, pass these parameters in your API request:\n\n- `scope` — Determines the administrative view. Use `CLUSTER` for the cluster-admin view (returns the Orgs assigned to each feature); use `ORG` for the org-admin view (returns the current value of each feature for a single Org).\n- `org_identifier` — Numeric ID of the Org. Required when `scope` is `ORG`; ignored when `scope` is `CLUSTER`.\n- `category` — Availability category of the features to return. `GENERAL_ACCESS` returns generally available features; `EARLY_ACCESS` returns features still in early access. Defaults to `GENERAL_ACCESS`.\n\nThe response fields populated depend on the requested scope. In the cluster-admin view (`scope=CLUSTER`), each feature includes `assigned_orgs`, `is_org_aware`, and (for non-org-aware features) `feature_value`. In the org-admin view (`scope=ORG`), each feature includes `element_type`, `element_config`, and `element_value`.\n\nThe following example retrieves the general-access features for the cluster-admin view:\n\n```\n{\n \"scope\": \"CLUSTER\",\n \"category\": \"GENERAL_ACCESS\"\n}\n```\n\nFor the org-admin view, set `scope` to `ORG` and pass the `org_identifier` of the Org to scope the search to (`org_identifier` is required when `scope` is `ORG`; omitting it returns a 400 error):\n\n```\n{\n \"scope\": \"ORG\",\n \"org_identifier\": 1,\n \"category\": \"GENERAL_ACCESS\"\n}\n```\n\n\n\n\n#### Endpoint URL\n", + "tags": [ + "Feature Management", + "26.10.0.cl" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SearchFeaturesRequest" + } + } + }, + "required": true + }, + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], + "responses": { + "200": { + "description": "Feature groups returned.", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/FeatureGroup" + } + }, + "examples": { + "example_1": { + "description": "Cluster-admin view (scope=CLUSTER) — org-aware feature with assignments", + "value": [ + { + "feature_group": "search", + "docs_url": null, + "features": [ + { + "feature_id": "orion.embraceConfig.doIndexing", + "feature_name": "index_columns", + "assigned_orgs": [ + { + "org_id": 0, + "org_name": "Primary" + } + ], + "is_org_aware": true, + "feature_value": null, + "docs_url": null + } + ] + } + ] + }, + "example_2": { + "description": "Org-admin view (scope=ORG) — element type, config, and current value for the org", + "value": [ + { + "feature_group": "search", + "docs_url": null, + "features": [ + { + "feature_id": "orion.embraceConfig.doIndexing", + "feature_name": "index_columns", + "element_type": "toggle", + "element_config": { + "label": "Index columns" + }, + "element_value": "true", + "docs_url": null + } + ] + } + ] + }, + "example_3": { + "description": "Empty result — no features match the requested category", + "value": [] + } + } + } + } + }, + "400": { + "description": "Invalid request.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + }, + "examples": { + "missing_org_identifier": { + "summary": "Bad Request — org_identifier is required when scope is ORG", + "value": { + "error": { + "message": { + "code": 10000, + "incident_id_guid": "0d2f9f6e-0000-0000-0000-000000000000", + "trace_id_guid": "0d2f9f6e-0000-0000-0000-000000000000", + "debug": "org_identifier is required when scope=ORG." + } + } + } + } + } + } + } + }, + "401": { + "description": "Unauthorized access.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Insufficient privileges.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + }, + "examples": { + "forbidden_access": { + "summary": "Forbidden — ADMINISTRATION privilege required", + "value": { + "error": { + "message": { + "code": 10023, + "incident_id_guid": "0d2f9f6e-0000-0000-0000-000000000000", + "trace_id_guid": "0d2f9f6e-0000-0000-0000-000000000000", + "debug": "Insufficient privileges." + } + } + } + } + } + } + } + }, + "404": { + "description": "Feature management not enabled.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Unexpected error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/rest/2.0/configurations/features/assignments/update": { + "post": { + "operationId": "updateFeatureAssignments", + "description": "\n Version: 26.10.0.cl or later\n\nVersion: 26.10.0.cl or later\n\nUpdates the Org assignments for a feature. Available to cluster admins only.\n\n#### Pre-requisites\n\nRequires the `ADMINISTRATION` (**Can administer ThoughtSpot**) privilege in the cluster-admin (All-Org / default-org) context. This endpoint manages Org assignments across the cluster, so it must be called by a cluster admin; org-scoped admins cannot call it.\nIf [Role-Based Access Control (RBAC)](https://developers.thoughtspot.com/docs/rbac) is enabled on your instance, the `ADMINISTRATION` (**Can administer ThoughtSpot**) privilege is required.\n\n#### Usage guidelines\n\nTo update the Org assignments for a feature, pass these parameters in your API request:\n\n- `feature_identifier` — User-friendly feature name (`feature_name`) or the underlying feature ID (`feature_id`) of the feature to update.\n- `org_identifiers` — Numeric IDs of the Orgs to assign. Send an empty array with `operation` set to `REPLACE` to clear all Org assignments for this feature.\n- `operation` — Type of update to apply. `ADD` assigns the given Orgs in addition to the existing ones; `REMOVE` unassigns the given Orgs; `REPLACE` sets the assignment to exactly the given Orgs. Defaults to `REPLACE`.\n\nThe following example assigns Orgs `1` and `2` to a feature, in addition to any Orgs already assigned:\n\n```\n{\n \"feature_identifier\": \"index_columns\",\n \"org_identifiers\": [1, 2],\n \"operation\": \"ADD\"\n}\n```\n\nClear all Org assignments for a feature by sending an empty array with `operation` set to `REPLACE` (this is the only way to unassign every Org at once):\n\n```\n{\n \"feature_identifier\": \"index_columns\",\n \"org_identifiers\": [],\n \"operation\": \"REPLACE\"\n}\n```\n\n\n\n\n#### Endpoint URL\n", + "tags": [ + "Feature Management", + "26.10.0.cl" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateFeatureAssignmentsRequest" + } + } + }, + "required": true + }, + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], + "responses": { + "200": { + "description": "Assignments updated.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FeatureAssignmentResponse" + }, + "examples": { + "example_1": { + "description": "Assign Orgs 1 and 2 to the feature (operation ADD)", + "value": { + "feature_id": "orion.embraceConfig.doIndexing", + "feature_name": "index_columns", + "assigned_orgs": [ + { + "org_id": 1, + "org_name": "Acme" + }, + { + "org_id": 2, + "org_name": "Beta" + } + ] + } + }, + "example_2": { + "description": "Clear all Org assignments (operation REPLACE with an empty org_identifiers array); assigned_orgs comes back empty", + "value": { + "feature_id": "orion.embraceConfig.doIndexing", + "feature_name": "index_columns", + "assigned_orgs": [] + } + } + } + } + } + }, + "400": { + "description": "Invalid request parameters.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + }, + "examples": { + "missing_org_identifiers": { + "summary": "Bad Request — org_identifiers is required", + "value": { + "error": { + "message": { + "code": 10000, + "incident_id_guid": "0d2f9f6e-0000-0000-0000-000000000000", + "trace_id_guid": "0d2f9f6e-0000-0000-0000-000000000000", + "debug": "org_identifiers is required." + } + } + } + } + } + } + } + }, + "401": { + "description": "Unauthorized access.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Insufficient privileges.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + }, + "examples": { + "forbidden_access": { + "summary": "Forbidden — ADMINISTRATION privilege required", + "value": { + "error": { + "message": { + "code": 10023, + "incident_id_guid": "0d2f9f6e-0000-0000-0000-000000000000", + "trace_id_guid": "0d2f9f6e-0000-0000-0000-000000000000", + "debug": "Insufficient privileges." + } + } + } + } + } + } + } + }, + "404": { + "description": "Feature not found or feature management not enabled.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + }, + "examples": { + "feature_not_found": { + "summary": "Not Found — feature_identifier does not match any known feature", + "value": { + "error": { + "message": { + "code": 10000, + "incident_id_guid": "0d2f9f6e-0000-0000-0000-000000000000", + "trace_id_guid": "0d2f9f6e-0000-0000-0000-000000000000", + "debug": "Feature 'orion.__does_not_exist__' not found in config." + } + } + } + } + } + } + } + }, + "500": { + "description": "Unexpected error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/rest/2.0/configurations/features/values/update": { + "post": { + "operationId": "updateFeatureValue", + "description": "\n Version: 26.10.0.cl or later\n\nVersion: 26.10.0.cl or later\n\nSets the value of a feature at the cluster or Org scope.\n\n#### Pre-requisites\n\nRequires `ADMINISTRATION` (**Can administer ThoughtSpot**) privilege.\nIf [Role-Based Access Control (RBAC)](https://developers.thoughtspot.com/docs/rbac) is enabled on your instance, the `ADMINISTRATION` (**Can administer ThoughtSpot**) privilege is required.\n\n#### Usage guidelines\n\nTo set a feature value, pass these parameters in your API request:\n\n- `scope` — Determines the scope at which the value is set. Use `CLUSTER` to set the cluster-level value; use `ORG` to set a per-Org value override.\n- `org_identifier` — Numeric ID of the Org for which to set the value. Required when `scope` is `ORG`; ignored when `scope` is `CLUSTER`.\n- `feature_identifier` — User-friendly feature name (`feature_name`) or the underlying feature ID (`feature_id`) of the feature whose value should be set.\n- `feature_value` — New value to set for the feature.\n- `reset_org_overrides` — Applicable only when `scope` is `CLUSTER`. When `true`, any existing per-Org value overrides for this feature are also removed so that all Orgs inherit the new cluster-level value. Required when `scope` is `CLUSTER` for an org-aware feature. Must be omitted when `scope` is `ORG`; passing it at `ORG` scope returns a 400 error.\n\nThe following example sets a per-Org value override for Org `1`:\n\n```\n{\n \"scope\": \"ORG\",\n \"org_identifier\": 1,\n \"feature_identifier\": \"index_columns\",\n \"feature_value\": \"true\"\n}\n```\n\nSet the cluster-level value and clear all per-Org overrides so every Org inherits the new value (CLUSTER scope). `reset_org_overrides: true` is destructive — it strips existing per-Org overrides cluster-wide:\n\n```\n{\n \"scope\": \"CLUSTER\",\n \"feature_identifier\": \"index_columns\",\n \"feature_value\": \"true\",\n \"reset_org_overrides\": true\n}\n```\n\n\n\n\n#### Endpoint URL\n", + "tags": [ + "Feature Management", + "26.10.0.cl" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateFeatureValueRequest" + } + } + }, + "required": true + }, + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], + "responses": { + "200": { + "description": "Value updated.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FeatureValueResponse" + }, + "examples": { + "example_1": { + "description": "Set a per-Org value override (scope=ORG)", + "value": { + "feature_id": "orion.embraceConfig.doIndexing", + "feature_name": "index_columns", + "feature_value": "true" + } + }, + "example_2": { + "description": "Set the cluster-level value and clear per-Org overrides (scope=CLUSTER, reset_org_overrides=true)", + "value": { + "feature_id": "orion.embraceConfig.doIndexing", + "feature_name": "index_columns", + "feature_value": "true" + } + } + } + } + } + }, + "400": { + "description": "Invalid request.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + }, + "examples": { + "invalid_reset_org_overrides": { + "summary": "Bad Request — reset_org_overrides is not allowed when scope is ORG", + "value": { + "error": { + "message": { + "code": 10000, + "incident_id_guid": "0d2f9f6e-0000-0000-0000-000000000000", + "trace_id_guid": "0d2f9f6e-0000-0000-0000-000000000000", + "debug": "reset_org_overrides is only valid for scope=CLUSTER." + } + } + } + }, + "missing_org_identifier": { + "summary": "Bad Request — org_identifier is required when scope is ORG", + "value": { + "error": { + "message": { + "code": 10000, + "incident_id_guid": "0d2f9f6e-0000-0000-0000-000000000000", + "trace_id_guid": "0d2f9f6e-0000-0000-0000-000000000000", + "debug": "org_identifier is required when scope=ORG." + } + } + } + } + } + } + } + }, + "401": { + "description": "Unauthorized access.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Insufficient privileges or org not assigned to feature.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + }, + "examples": { + "forbidden_access": { + "summary": "Forbidden — ADMINISTRATION privilege required", + "value": { + "error": { + "message": { + "code": 10023, + "incident_id_guid": "0d2f9f6e-0000-0000-0000-000000000000", + "trace_id_guid": "0d2f9f6e-0000-0000-0000-000000000000", + "debug": "Insufficient privileges." + } + } + } + } + } + } + } + }, + "404": { + "description": "Feature not found or feature management not enabled.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + }, + "examples": { + "feature_not_found": { + "summary": "Not Found — feature_identifier does not match any known feature", + "value": { + "error": { + "message": { + "code": 10000, + "incident_id_guid": "0d2f9f6e-0000-0000-0000-000000000000", + "trace_id_guid": "0d2f9f6e-0000-0000-0000-000000000000", + "debug": "Feature 'orion.__does_not_exist__' not found in config." + } + } + } + } + } + } + } + }, + "500": { + "description": "Unexpected error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, "/api/rest/2.0/groups/create": { "post": { "operationId": "createUserGroup", @@ -7506,7 +8543,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "200": { "description": "User group successfully created.", @@ -7578,6 +8619,9 @@ "type": "string" }, "description": "GUID or name of the group." + }, + { + "$ref": "#/components/parameters/OrgSelector" } ], "responses": { @@ -7645,7 +8689,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "200": { "description": "Import user groups operation successful.", @@ -7718,7 +8766,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "200": { "description": "User group search result.", @@ -7803,6 +8855,9 @@ "type": "string" }, "description": "GUID or name of the group." + }, + { + "$ref": "#/components/parameters/OrgSelector" } ], "responses": { @@ -7870,7 +8925,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "200": { "description": "Input table created successfully.", @@ -7960,6 +9019,9 @@ "type": "string" }, "description": "Unique ID of the input table to delete." + }, + { + "$ref": "#/components/parameters/OrgSelector" } ], "responses": { @@ -8036,6 +9098,9 @@ "type": "string" }, "description": "Unique ID of the input table to update." + }, + { + "$ref": "#/components/parameters/OrgSelector" } ], "responses": { @@ -8128,7 +9193,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "200": { "description": "Channel status logs retrieved successfully.", @@ -8340,7 +9409,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "200": { "description": "Log fetched successfully.", @@ -8416,7 +9489,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "204": { "description": "Successfully deleted manual translations." @@ -8482,7 +9559,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "200": { "description": "CSV file downloaded successfully.", @@ -8560,6 +9641,9 @@ "type": "string" }, "description": "Locale code for which to retrieve translations. For example, `fr-fr`, `de-de`, `JA-JP`." + }, + { + "$ref": "#/components/parameters/OrgSelector" } ], "responses": { @@ -8663,7 +9747,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "204": { "description": "Successfully imported manual translations." @@ -8729,7 +9817,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "200": { "description": "Conversion of worksheets to model done successfully.", @@ -8802,7 +9894,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "200": { "description": "Successfully created a copy of the object", @@ -8885,7 +9981,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "204": { "description": "Metadata objects successfully deleted." @@ -8951,7 +10051,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "200": { "description": "Export TMLs of specified metadata objects is successful.", @@ -9027,7 +10131,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "200": { "description": "Export TMLs of specified metadata objects is successful.", @@ -9100,7 +10208,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "200": { "description": "Fetching SQL query of specified metadata object is successful.", @@ -9173,7 +10285,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "200": { "description": "Async TML Import Task statuses fetched successfully.", @@ -9246,7 +10362,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "200": { "description": "Fetching SQL query of specified metadata object is successful.", @@ -9319,7 +10439,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "200": { "description": "Import metadata objects using specified TMLs is successful.", @@ -9395,7 +10519,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "200": { "description": "Async TML Import Task submitted successfully.", @@ -9469,7 +10597,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "204": { "description": "Parameterize successful." @@ -9535,7 +10667,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "204": { "description": "Parameterize successful." @@ -9601,7 +10737,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "200": { "description": "Metadata objects search result.", @@ -9677,7 +10817,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "204": { "description": "Successfuly removed parameters." @@ -9743,7 +10887,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "204": { "description": "Headers update was successful." @@ -9809,7 +10957,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "204": { "description": "Headers update was successful." @@ -9875,7 +11027,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "200": { "description": "Organization successfully created.", @@ -9958,6 +11114,9 @@ "type": "string" }, "description": "ID or name of the Org" + }, + { + "$ref": "#/components/parameters/OrgSelector" } ], "responses": { @@ -10025,7 +11184,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "200": { "description": "Organization search result.", @@ -10130,6 +11293,9 @@ "type": "string" }, "description": "ID or name of the Org" + }, + { + "$ref": "#/components/parameters/OrgSelector" } ], "responses": { @@ -10197,7 +11363,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "200": { "description": "Export report file of specified metadata object is successful.", @@ -10266,7 +11436,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "200": { "description": "Export report file of specified metadata object is successful.", @@ -10335,7 +11509,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "200": { "description": "Role successfully created.", @@ -10407,6 +11585,9 @@ "type": "string" }, "description": "Unique ID or name of the Role. ReadOnly roles cannot be deleted." + }, + { + "$ref": "#/components/parameters/OrgSelector" } ], "responses": { @@ -10474,7 +11655,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "200": { "description": "Roles search result.", @@ -10559,6 +11744,9 @@ "type": "string" }, "description": "Unique ID or name of the Role." + }, + { + "$ref": "#/components/parameters/OrgSelector" } ], "responses": { @@ -10633,7 +11821,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "200": { "description": "Schedule successfully created.", @@ -10705,6 +11897,9 @@ "type": "string" }, "description": "Unique ID or name of the scheduled job." + }, + { + "$ref": "#/components/parameters/OrgSelector" } ], "responses": { @@ -10772,7 +11967,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "200": { "description": "Schedule search result.", @@ -10857,6 +12056,9 @@ "type": "string" }, "description": "Unique ID or name of the schedule." + }, + { + "$ref": "#/components/parameters/OrgSelector" } ], "responses": { @@ -10924,7 +12126,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "204": { "description": "Author assignment for given metadata objects is successful." @@ -10990,7 +12196,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "200": { "description": "Successfully fetched column security rules", @@ -11066,7 +12276,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "200": { "description": "Fetching defined object privileges of metadata objects is successful.", @@ -11139,7 +12353,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "200": { "description": "Fetching permissions of principals is successful.", @@ -11248,7 +12466,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "200": { "description": "Fetching permissions of metadata objects is successful.", @@ -11377,7 +12599,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "204": { "description": "Object privileges added/removed successfully" @@ -11443,7 +12669,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "204": { "description": "Publishing metadata objects is successful." @@ -11509,7 +12739,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "204": { "description": "Sharing metadata objects is successful." @@ -11575,7 +12809,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "204": { "description": "Unpublishing metadata objects is successful." @@ -11623,31 +12861,367 @@ } } }, - "/api/rest/2.0/security/column/rules/update": { + "/api/rest/2.0/security/column/rules/update": { + "post": { + "operationId": "updateColumnSecurityRules", + "description": "\nBeta Version: 10.12.0.cl or later\n\nCreates, updates, or deletes column security rules for specified tables.\n\nThis API endpoint allows you to create, update, or delete column-level security rules on columns of a table. The operation follows an \"all or none\" policy: if defining security rules for any of the provided columns fails, the entire operation will be rolled back, and no rules will be created.\n\n#### Usage guidelines\n\n- Provide table identifier using either `identifier` (GUID or name) or `obj_identifier` (object ID)\n- Use `clear_csr: true` to remove all column security rules from the table\n- For each column, specify the security rule using `column_security_rules` array\n- Use `is_unsecured: true` to mark a specific column as unprotected\n- Use `group_access` operations to manage group associations:\n - `ADD`: Add groups to the column's access list\n - `REMOVE`: Remove groups from the column's access list\n - `REPLACE`: Replace all existing groups with the specified groups\n\n#### Required permissions\n\n- `ADMINISTRATION` - Can administer ThoughtSpot\n- `DATAMANAGEMENT` - Can manage data (if RBAC is disabled)\n- `CAN_MANAGE_WORKSHEET_VIEWS_TABLES` - Can manage worksheet views and tables (if RBAC is enabled)\n\n#### Example request\n\n```json\n{\n \"identifier\": \"table-guid\",\n \"obj_identifier\": \"table-object-id\",\n \"clear_csr\": false,\n \"column_security_rules\": [\n {\n \"column_identifier\": \"col id or col name\",\n \"is_unsecured\": false,\n \"group_access\": [\n {\n \"operation\": \"ADD\",\n \"group_identifiers\": [\"hr_group_id\", \"hr_group_name\", \"finance_group_id\"]\n }\n ]\n },\n {\n \"column_identifier\": \"col id or col name\",\n \"is_unsecured\": true\n },\n {\n \"column_identifier\": \"col id or col name\",\n \"is_unsecured\": false,\n \"group_access\": [\n {\n \"operation\": \"REPLACE\",\n \"group_identifiers\": [\"management_group_id\", \"management_group_name\"]\n }\n ]\n }\n ]\n}\n```\n\n#### Request Body Schema\n\n- `identifier` (string, optional): GUID or name of the table for which we want to create column security rules\n- `obj_identifier` (string, optional): The object ID of the table\n- `clear_csr` (boolean, optional): If true, then all the secured columns will be marked as unprotected, and all the group associations will be removed\n- `column_security_rules` (array of objects, required): An array where each object defines the security rule for a specific column\n\nEach column security rule object contains:\n- `column_identifier` (string, required): Column identifier (col_id or name)\n- `is_unsecured` (boolean, optional): If true, the column will be marked as unprotected and all groups associated with it will be removed\n- `group_access` (array of objects, optional): Array of group operation objects\n\nEach group operation object contains:\n- `operation` (string, required): Operation type - ADD, REMOVE, or REPLACE\n- `group_identifiers` (array of strings, required): Array of group identifiers (name or GUID) on which the operation will be performed\n\n#### Response\n\nThis API does not return any response body. A successful operation returns HTTP 200 status code.\n\n#### Operation Types\n\n- **ADD**: Adds the specified groups to the column's access list\n- **REMOVE**: Removes the specified groups from the column's access list \n- **REPLACE**: Replaces all existing groups with the specified groups \n\n\n\n#### Endpoint URL\n", + "tags": [ + "Security", + "10.12.0.cl" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateColumnSecurityRulesRequest" + } + } + }, + "required": true + }, + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], + "responses": { + "204": { + "description": "Successfully updated column security rules" + }, + "400": { + "description": "Bad request - Invalid parameters or table not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized access.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden - User doesn't have permission to modify security rules for this table", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/rest/2.0/semantic-integrations/create": { + "post": { + "operationId": "createSemanticIntegration", + "description": "\n Version: 26.9.0.cl or later\n\nCreates a new semantic integration in ThoughtSpot from a CDW semantic view.\n\nRequires `ADMINISTRATION` (**Can administer ThoughtSpot**) privilege or `DATAMANAGEMENT` (**Can manage data**) privilege.\nIf [Role-Based Access Control (RBAC)](https://developers.thoughtspot.com/docs/rbac) is enabled on your instance, the following Data control privileges may be required:\n\n- `CAN_CREATE_OR_EDIT_CONNECTIONS` (**Can create/edit Connections**)\n- **Can manage data models**\n\n#### About create semantic integration\n\nA semantic integration imports an externally defined semantic view from a Cloud Data Warehouse (CDW) into ThoughtSpot. The API resolves the source semantic view from the specified `connection_identifier`, `database_name`, `schema_name`, and `semantic_view_name`, generates a ThoughtSpot model from it, and returns the model GUID along with a per-formula import report (`semantic_report`) summarizing how many formulas were successfully imported, failed, or skipped.\n\n- `connection_identifier`, `name`, `database_name`, `schema_name`, `semantic_view_name`, and `type` are required.\n- `name` must be unique across the user's organization. The integration's display name is also used as the generated model name.\n- Supported `type` values are listed in the `SemanticIntegrationType` enum (currently `RDBMS_SNOWFLAKE`).\n- The response includes a `semantic_report.summary` with `total`, `imported`, `failed`, and `skipped` counts, and a `formulas` array with the per-formula translation details.\n\n> **Note:** Creating a semantic integration using a YAML file upload is not supported through the public API.\n\n\n\n\n#### Endpoint URL\n", + "tags": [ + "Semantic Integrations", + "26.9.0.cl" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateSemanticIntegrationRequest" + } + } + }, + "required": true + }, + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], + "responses": { + "200": { + "description": "Semantic integration created successfully.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SemanticIntegrationResponse" + } + } + } + }, + "400": { + "description": "Invalid request.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized access.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden access.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Connection not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Duplicate integration name.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Unexpected error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/rest/2.0/semantic-integrations/{semantic_integration_identifier}/delete": { + "post": { + "operationId": "deleteSemanticIntegration", + "description": "\n Version: 26.9.0.cl or later\n\nDeletes a semantic integration and its associated ThoughtSpot model.\n\nRequires `ADMINISTRATION` (**Can administer ThoughtSpot**) privilege or `DATAMANAGEMENT` (**Can manage data**) privilege.\nIf [Role-Based Access Control (RBAC)](https://developers.thoughtspot.com/docs/rbac) is enabled on your instance, the following Data control privileges may be required:\n\n- `CAN_CREATE_OR_EDIT_CONNECTIONS` (**Can create/edit Connections**)\n- **Can manage data models**\n\n#### About delete semantic integration\n\nRemoves the specified semantic integration and its generated ThoughtSpot model from the system.\n\n- `semantic_integration_identifier` is the GUID or name of the integration to delete.\n- Deletions cannot be undone. Re-import the integration with `createSemanticIntegration` if needed.\n\n\n\n\n#### Endpoint URL\n", + "tags": [ + "Semantic Integrations", + "26.9.0.cl" + ], + "parameters": [ + { + "in": "path", + "name": "semantic_integration_identifier", + "required": true, + "schema": { + "type": "string" + }, + "description": "ID or name of the semantic integration to delete." + }, + { + "$ref": "#/components/parameters/OrgSelector" + } + ], + "responses": { + "204": { + "description": "Semantic integration deleted successfully." + }, + "400": { + "description": "Invalid request.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized access.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden access.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Unexpected error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/rest/2.0/semantic-integrations/{semantic_integration_identifier}/import": { + "post": { + "operationId": "importSemanticIntegration", + "description": "\n Version: 26.9.0.cl or later\n\nImports semantic updates for an existing semantic integration from its CDW source and refreshes the associated ThoughtSpot model.\n\nRequires `ADMINISTRATION` (**Can administer ThoughtSpot**) privilege or `DATAMANAGEMENT` (**Can manage data**) privilege.\nIf [Role-Based Access Control (RBAC)](https://developers.thoughtspot.com/docs/rbac) is enabled on your instance, the following Data control privileges may be required:\n\n- `CAN_CREATE_OR_EDIT_CONNECTIONS` (**Can create/edit Connections**)\n- **Can manage data models**\n\n#### About import semantic integration\n\nRe-imports the semantic view from the CDW for the specified integration and rebuilds the corresponding ThoughtSpot model. Use this after the source semantic view has been updated in the CDW (added, removed, or modified formulas, dimensions, or measures) to bring the ThoughtSpot model back in line.\n\n- `semantic_integration_identifier` is the GUID or name of the integration to import updates for.\n- Import preserves the integration's GUID, name, and `model_id`; only the underlying formula set is refreshed.\n- The response includes the same `semantic_report` as create, with an additional `change_status` per formula indicating whether each formula is `NEW`, `UPDATED`, or `UNCHANGED` since the previous import.\n\n> **Note:** Importing updates for a semantic integration that was created using the file upload option in the ThoughtSpot UI is not supported. To refresh a file-upload-based integration, use the ThoughtSpot UI.\n\n\n\n\n#### Endpoint URL\n", + "tags": [ + "Semantic Integrations", + "26.9.0.cl" + ], + "parameters": [ + { + "in": "path", + "name": "semantic_integration_identifier", + "required": true, + "schema": { + "type": "string" + }, + "description": "ID or name of the semantic integration to import updates for." + }, + { + "$ref": "#/components/parameters/OrgSelector" + } + ], + "responses": { + "200": { + "description": "Semantic integration imported successfully.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SemanticIntegrationResponse" + } + } + } + }, + "400": { + "description": "Invalid request.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized access.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden access.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Semantic integration not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Unexpected error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/rest/2.0/semantic-integrations/search": { "post": { - "operationId": "updateColumnSecurityRules", - "description": "\nBeta Version: 10.12.0.cl or later\n\nCreates, updates, or deletes column security rules for specified tables.\n\nThis API endpoint allows you to create, update, or delete column-level security rules on columns of a table. The operation follows an \"all or none\" policy: if defining security rules for any of the provided columns fails, the entire operation will be rolled back, and no rules will be created.\n\n#### Usage guidelines\n\n- Provide table identifier using either `identifier` (GUID or name) or `obj_identifier` (object ID)\n- Use `clear_csr: true` to remove all column security rules from the table\n- For each column, specify the security rule using `column_security_rules` array\n- Use `is_unsecured: true` to mark a specific column as unprotected\n- Use `group_access` operations to manage group associations:\n - `ADD`: Add groups to the column's access list\n - `REMOVE`: Remove groups from the column's access list\n - `REPLACE`: Replace all existing groups with the specified groups\n\n#### Required permissions\n\n- `ADMINISTRATION` - Can administer ThoughtSpot\n- `DATAMANAGEMENT` - Can manage data (if RBAC is disabled)\n- `CAN_MANAGE_WORKSHEET_VIEWS_TABLES` - Can manage worksheet views and tables (if RBAC is enabled)\n\n#### Example request\n\n```json\n{\n \"identifier\": \"table-guid\",\n \"obj_identifier\": \"table-object-id\",\n \"clear_csr\": false,\n \"column_security_rules\": [\n {\n \"column_identifier\": \"col id or col name\",\n \"is_unsecured\": false,\n \"group_access\": [\n {\n \"operation\": \"ADD\",\n \"group_identifiers\": [\"hr_group_id\", \"hr_group_name\", \"finance_group_id\"]\n }\n ]\n },\n {\n \"column_identifier\": \"col id or col name\",\n \"is_unsecured\": true\n },\n {\n \"column_identifier\": \"col id or col name\",\n \"is_unsecured\": false,\n \"group_access\": [\n {\n \"operation\": \"REPLACE\",\n \"group_identifiers\": [\"management_group_id\", \"management_group_name\"]\n }\n ]\n }\n ]\n}\n```\n\n#### Request Body Schema\n\n- `identifier` (string, optional): GUID or name of the table for which we want to create column security rules\n- `obj_identifier` (string, optional): The object ID of the table\n- `clear_csr` (boolean, optional): If true, then all the secured columns will be marked as unprotected, and all the group associations will be removed\n- `column_security_rules` (array of objects, required): An array where each object defines the security rule for a specific column\n\nEach column security rule object contains:\n- `column_identifier` (string, required): Column identifier (col_id or name)\n- `is_unsecured` (boolean, optional): If true, the column will be marked as unprotected and all groups associated with it will be removed\n- `group_access` (array of objects, optional): Array of group operation objects\n\nEach group operation object contains:\n- `operation` (string, required): Operation type - ADD, REMOVE, or REPLACE\n- `group_identifiers` (array of strings, required): Array of group identifiers (name or GUID) on which the operation will be performed\n\n#### Response\n\nThis API does not return any response body. A successful operation returns HTTP 200 status code.\n\n#### Operation Types\n\n- **ADD**: Adds the specified groups to the column's access list\n- **REMOVE**: Removes the specified groups from the column's access list \n- **REPLACE**: Replaces all existing groups with the specified groups \n\n\n\n#### Endpoint URL\n", + "operationId": "searchSemanticIntegrations", + "description": "\n Version: 26.9.0.cl or later\n\nSearches and lists semantic integrations available to the authenticated user in the current organization, with optional filters, sort, and pagination.\n\nRequires `ADMINISTRATION` (**Can administer ThoughtSpot**) privilege or `DATAMANAGEMENT` (**Can manage data**) privilege.\nIf [Role-Based Access Control (RBAC)](https://developers.thoughtspot.com/docs/rbac) is enabled on your instance, the following Data control privileges may be required:\n\n- `CAN_CREATE_OR_EDIT_CONNECTIONS` (**Can create/edit Connections**)\n- **Can manage data models**\n\n#### About search semantic integrations\n\nReturns a paginated batch of semantic integrations, each with its identifier, name, description, source connection, generated model identifier, author, creation/modification timestamps, and associated tags. Use the filters to narrow results by author, connection, tag, or name pattern.\n\n- `pattern` matches the integration name as a case-insensitive substring.\n- `author_identifiers` and `connection_identifiers` accept either GUIDs or names.\n- `sort_options.field_name` defaults to `MODIFIED_TIME`; set `sort_options.order` to `ASC` or `DESC` to control sort direction.\n- `record_offset` and `record_size` control pagination. Use `record_size: 0` to return all matching records in a single response.\n\n\n\n\n#### Endpoint URL\n", "tags": [ - "Security", - "10.12.0.cl" + "Semantic Integrations", + "26.9.0.cl" ], "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UpdateColumnSecurityRulesRequest" + "$ref": "#/components/schemas/SearchSemanticIntegrationsRequest" } } }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { - "204": { - "description": "Successfully updated column security rules" + "200": { + "description": "Semantic integrations retrieved successfully.", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SemanticIntegrationSearchResponse" + } + } + } + } }, "400": { - "description": "Bad request - Invalid parameters or table not found", + "description": "Invalid request.", "content": { "application/json": { "schema": { @@ -11667,7 +13241,7 @@ } }, "403": { - "description": "Forbidden - User doesn't have permission to modify security rules for this table", + "description": "Forbidden access.", "content": { "application/json": { "schema": { @@ -11677,7 +13251,7 @@ } }, "500": { - "description": "Internal server error", + "description": "Unexpected error", "content": { "application/json": { "schema": { @@ -11707,7 +13281,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "200": { "description": "Font deleted successfully.", @@ -11876,6 +13454,9 @@ ], "default": "application/zip" } + }, + { + "$ref": "#/components/parameters/OrgSelector" } ], "responses": { @@ -11991,7 +13572,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "200": { "description": "Style preferences retrieved successfully.", @@ -12372,7 +13957,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "200": { "description": "Custom fonts retrieved successfully.", @@ -12632,7 +14221,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "204": { "description": "Style preferences updated successfully." @@ -12767,6 +14360,9 @@ "type": "string" }, "description": "UUID or name of the font to update." + }, + { + "$ref": "#/components/parameters/OrgSelector" } ], "responses": { @@ -12900,7 +14496,7 @@ ] }, "name": { - "description": "Display name for the font (e.g. \"Acme Sans\"). Must be unique within the\ntarget scope; returns an error if a font with this name already exists.", + "description": "Display name for the font (e.g. \"Acme Sans\").", "type": "string" }, "weight": { @@ -12942,7 +14538,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "200": { "description": "Font uploaded successfully.", @@ -13083,7 +14683,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "204": { "description": "Communication channel preferences successfully updated." @@ -13209,7 +14813,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "204": { "description": "Successfully configured the security settings." @@ -13325,7 +14933,11 @@ "System", "9.0.0.cl" ], - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "200": { "description": "Cluster config information.", @@ -13442,7 +15054,11 @@ "System", "9.0.0.cl" ], - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "200": { "description": "Cluster information.", @@ -13579,7 +15195,11 @@ "System", "9.2.0.cl" ], - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "200": { "description": "Cluster configuration which can be overridden.", @@ -13716,7 +15336,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "200": { "description": "Communication channel preferences retrieved successfully.", @@ -13879,7 +15503,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "200": { "description": "Successfully retrieved the list of security settings.", @@ -14076,7 +15704,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "204": { "description": "Configuration successfully updated." @@ -14202,7 +15834,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "200": { "description": "communication channel configuration validated successfully.", @@ -14415,7 +16051,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "204": { "description": "Tags successfully assigned." @@ -14481,7 +16121,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "200": { "description": "Tag successfully created.", @@ -14571,6 +16215,9 @@ "type": "string" }, "description": "Tag identifier Tag name or Tag id." + }, + { + "$ref": "#/components/parameters/OrgSelector" } ], "responses": { @@ -14638,7 +16285,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "200": { "description": "Tags search result.", @@ -14748,7 +16399,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "204": { "description": "Tags successfully unassigned." @@ -14823,6 +16478,9 @@ "type": "string" }, "description": "Name or Id of the tag." + }, + { + "$ref": "#/components/parameters/OrgSelector" } ], "responses": { @@ -14890,7 +16548,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "200": { "description": "User activated successfully.", @@ -14963,7 +16625,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "204": { "description": "User password change operation successful." @@ -15029,7 +16695,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "200": { "description": "User successfully created.", @@ -15102,7 +16772,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "200": { "description": "User deactivated successfully.", @@ -15174,6 +16848,9 @@ "type": "string" }, "description": "GUID / name of the user" + }, + { + "$ref": "#/components/parameters/OrgSelector" } ], "responses": { @@ -15241,7 +16918,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "204": { "description": "Force logging out of users operation successful." @@ -15307,7 +16988,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "200": { "description": "Import users operation successful.", @@ -15380,7 +17065,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "204": { "description": "User password reset operation successful." @@ -15446,7 +17135,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "200": { "description": "User search result.", @@ -15531,6 +17224,9 @@ "type": "string" }, "description": "GUID / name of the user" + }, + { + "$ref": "#/components/parameters/OrgSelector" } ], "responses": { @@ -15598,7 +17294,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "200": { "description": "Create variable is successful.", @@ -15671,6 +17371,9 @@ "type": "string" }, "description": "Unique id or name of the variable" + }, + { + "$ref": "#/components/parameters/OrgSelector" } ], "responses": { @@ -15738,7 +17441,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "204": { "description": "Deletion of variable(s) is successful." @@ -15813,6 +17520,9 @@ "type": "string" }, "description": "Unique ID or name of the variable" + }, + { + "$ref": "#/components/parameters/OrgSelector" } ], "responses": { @@ -15880,7 +17590,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "200": { "description": "List of variables is successful.", @@ -15965,6 +17679,9 @@ "type": "string" }, "description": "Unique id or name of the variable to update." + }, + { + "$ref": "#/components/parameters/OrgSelector" } ], "responses": { @@ -16033,7 +17750,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "204": { "description": "Variable values updated successfully." @@ -16099,7 +17820,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "200": { "description": "Successfully committed the metadata objects", @@ -16172,7 +17897,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "200": { "description": "Successfully configured local repository", @@ -16245,7 +17974,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "204": { "description": "Successfully deleted local repository configuration" @@ -16311,7 +18044,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "200": { "description": "Successfully deployed the changes", @@ -16396,6 +18133,9 @@ "type": "string" }, "description": "Commit id to which the object should be reverted" + }, + { + "$ref": "#/components/parameters/OrgSelector" } ], "responses": { @@ -16470,7 +18210,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "200": { "description": "Commit history of the metadata object", @@ -16546,7 +18290,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "200": { "description": "Details of local repository configuration", @@ -16622,7 +18370,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "200": { "description": "Successfully updated local repository configuration", @@ -16695,7 +18447,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "200": { "description": "validation done successfully", @@ -16771,7 +18527,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "200": { "description": "Webhook configuration created successfully", @@ -17020,7 +18780,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "200": { "description": "Webhook configurations deleted successfully", @@ -17240,7 +19004,11 @@ "Webhooks", "26.7.0.cl" ], - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "200": { "description": "Storage setup information retrieved successfully", @@ -17492,7 +19260,11 @@ }, "required": true }, - "parameters": [], + "parameters": [ + { + "$ref": "#/components/parameters/OrgSelector" + } + ], "responses": { "200": { "description": "Webhook configurations retrieved successfully", @@ -17731,6 +19503,9 @@ "type": "string" }, "description": "Unique ID or name of the webhook configuration." + }, + { + "$ref": "#/components/parameters/OrgSelector" } ], "responses": { @@ -19021,6 +20796,11 @@ "visibility" ], "properties": { + "obj_id": { + "type": "string", + "description": "Custom object ID (obj_id) of the group, if one is set.
Version: 26.9.0.cl or later", + "nullable": true + }, "author_id": { "type": "string", "description": "The unique identifier of the object", @@ -20729,6 +22509,11 @@ "type": "string", "description": "Name of the connection." }, + "obj_id": { + "type": "string", + "description": "Custom object ID (obj_id) of the connection, if one is set.
Version: 26.9.0.cl or later", + "nullable": true + }, "description": { "type": "string", "description": "Description of the connection.", @@ -20948,6 +22733,11 @@ "type": "string", "description": "Name of the role" }, + "obj_id": { + "type": "string", + "description": "Custom object ID (obj_id) of the role, if one is set.
Version: 26.9.0.cl or later", + "nullable": true + }, "description": { "type": "string", "description": "Description of the role" @@ -21033,7 +22823,12 @@ "CAN_DOWNLOAD_VISUALS", "CAN_DOWNLOAD_DETAILED_DATA", "CAN_USE_SPOTTER", - "CAN_MANAGE_SPOTTER" + "CAN_MANAGE_SPOTTER", + "CAN_CREATE_LIVEBOARD", + "CAN_CREATE_ANSWERS", + "CAN_ANALYZE_DATA", + "CAN_ADMINISTER_SCHEDULES", + "CAN_CREATE_KPI_ALERTS" ] }, "description": "Privileges granted to the role." @@ -21128,6 +22923,11 @@ "type": "string", "description": "Unique Id of the custom action." }, + "obj_id": { + "type": "string", + "description": "Custom object ID (obj_id) of the custom action, if one is set.
Version: 26.9.0.cl or later", + "nullable": true + }, "metadata_association": { "type": "array", "items": { @@ -22484,6 +24284,121 @@ } } }, + "ConversationShareStatusResponse": { + "type": "object", + "required": [ + "conversation_id", + "principals" + ], + "properties": { + "conversation_id": { + "type": "string", + "description": "Unique identifier of the source conversation." + }, + "is_shared_content_outdated": { + "type": "boolean", + "description": "`true` when the shared view was generated before the last edit to the\nconversation and does not reflect the latest content. `null` when the\nconversation has never been shared.", + "nullable": true + }, + "principals": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ConversationPrincipalInfo" + }, + "description": "List of principals that currently have access to this shared conversation.\nEmpty when no principals have been granted access." + } + }, + "description": "Response returned by getShareInfo." + }, + "ConversationPrincipalInfo": { + "type": "object", + "required": [ + "id", + "type", + "display_name", + "name", + "permission" + ], + "properties": { + "id": { + "type": "string", + "description": "Unique identifier of the user or group." + }, + "type": { + "type": "string", + "enum": [ + "USER", + "USER_GROUP" + ], + "description": "Whether the principal is an individual user or a group." + }, + "display_name": { + "type": "string", + "description": "Display name of the principal as shown in the UI." + }, + "name": { + "type": "string", + "description": "Internal name of the principal." + }, + "permission": { + "type": "string", + "enum": [ + "READ_ONLY", + "MODIFY", + "NO_ACCESS" + ], + "description": "Access level granted to the principal. Always `READ_ONLY` for shared conversations." + } + }, + "description": "A principal that has been granted access to a shared conversation." + }, + "SharedConversationResponse": { + "type": "object", + "required": [ + "conversation_id", + "shared_conversation_id", + "data_sources", + "messages", + "code_execution_files" + ], + "properties": { + "conversation_id": { + "type": "string", + "description": "Unique identifier of the source conversation (echoes the request parameter)." + }, + "shared_conversation_id": { + "type": "string", + "description": "Identifier for the shared view. Use this as `conversation_identifier` in\nfollow-up `loadAnswer` calls to hydrate answer items in the messages." + }, + "conversation_title": { + "type": "string", + "description": "Display title of the conversation.", + "nullable": true + }, + "data_sources": { + "type": "array", + "items": { + "$ref": "#/components/schemas/DataSourceEntry" + }, + "description": "Data sources used by the conversation, each with an identifier and display name." + }, + "messages": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ConversationMessage" + }, + "description": "Ordered conversation messages, oldest to newest. Same structure as the\n`messages` field returned by `getConversation`. Empty array when the\nconversation has no messages; never null." + }, + "code_execution_files": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CodeExecutionFileMetadata" + }, + "description": "Sanitized metadata for files generated by the code-execution tool during\nthis conversation. Empty when there are no such files." + } + }, + "description": "Response returned by getSharedContent. Contains the full read-only view\nof the shared conversation including messages and data source metadata." + }, "RiseGQLArgWrapper": { "type": "object", "required": [ @@ -22809,7 +24724,8 @@ "type": "string", "enum": [ "SAGE_INDEXING", - "ROW_COUNT_STATS" + "ROW_COUNT_STATS", + "SCHEDULED_LIVEBOARDS" ] }, "nullable": true @@ -23481,6 +25397,11 @@ "type": "string", "description": "Name of the collection." }, + "obj_id": { + "type": "string", + "description": "Custom object ID (obj_id) of the collection, if one is set.
Version: 26.9.0.cl or later", + "nullable": true + }, "description": { "type": "string", "description": "Description of the collection.", @@ -24122,6 +26043,237 @@ }, "description": "Visualization areas assigned to a font, grouped by org context." }, + "SemanticIntegrationSortOptions": { + "type": "object", + "properties": { + "field_name": { + "type": "string", + "enum": [ + "NAME", + "AUTHOR", + "CREATED_TIME", + "MODIFIED_TIME" + ], + "description": "Name of the field to apply the sort on.", + "nullable": true + }, + "order": { + "type": "string", + "enum": [ + "ASC", + "DESC" + ], + "description": "Sort order: `ASC` for ascending, `DESC` for descending.", + "nullable": true + } + }, + "description": "Sort options for semantic integration search." + }, + "SemanticIntegrationSearchResponse": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Unique identifier of the semantic integration.", + "nullable": true + }, + "name": { + "type": "string", + "description": "Name of the semantic integration.", + "nullable": true + }, + "description": { + "type": "string", + "description": "Optional description of the semantic integration.", + "nullable": true + }, + "model_id": { + "type": "string", + "description": "GUID of the associated ThoughtSpot model generated for this integration.", + "nullable": true + }, + "model_name": { + "type": "string", + "description": "Name of the associated ThoughtSpot model.", + "nullable": true + }, + "import_type": { + "type": "string", + "enum": [ + "CDW", + "FILE" + ], + "description": "How the semantic definition was sourced.", + "nullable": true + }, + "type": { + "type": "string", + "enum": [ + "RDBMS_SNOWFLAKE" + ], + "description": "CDW connector type.", + "nullable": true + }, + "connection_id": { + "type": "string", + "description": "GUID of the CDW connection backing the integration.", + "nullable": true + }, + "connection_name": { + "type": "string", + "description": "Display name of the CDW connection backing the integration.", + "nullable": true + }, + "author_id": { + "type": "string", + "description": "GUID of the user who created the integration.", + "nullable": true + }, + "author_name": { + "type": "string", + "description": "Username of the user who created the integration.", + "nullable": true + }, + "creation_time_in_millis": { + "type": "number", + "format": "float", + "description": "Creation time in Unix epoch milliseconds.", + "nullable": true + }, + "modification_time_in_millis": { + "type": "number", + "format": "float", + "description": "Last modification time in Unix epoch milliseconds.", + "nullable": true + }, + "tags": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SemanticIntegrationTagReference" + }, + "description": "Tags associated with the integration.", + "nullable": true + } + }, + "description": "Single semantic integration entry returned by search." + }, + "SemanticIntegrationTagReference": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Unique identifier of the tag.", + "nullable": true + }, + "name": { + "type": "string", + "description": "Name of the tag.", + "nullable": true + } + }, + "description": "Tag reference associated with a semantic integration." + }, + "FeatureGroup": { + "type": "object", + "required": [ + "features" + ], + "properties": { + "feature_group": { + "type": "string", + "description": "Display name of the feature group.", + "nullable": true + }, + "docs_url": { + "type": "string", + "description": "Documentation URL for the feature group, when available.", + "nullable": true + }, + "features": { + "type": "array", + "items": { + "$ref": "#/components/schemas/FeatureDetail" + }, + "description": "Feature details within this group. Each entry contains the fields relevant to\nthe requested scope; org-admin-only and cluster-admin-only fields are null in\nthe other view." + } + }, + "description": "A named group of related features. Returned by searchFeatures; the contents of\nfeatures depend on the requested scope (cluster-admin vs. org-admin view)." + }, + "FeatureDetail": { + "type": "object", + "required": [ + "feature_id" + ], + "properties": { + "feature_id": { + "type": "string", + "description": "Underlying unique feature ID. The dotted-path format (for example,\n`orion.embraceConfig.doIndexing`) is internal and subject to change without\nnotice; use `feature_name` as the stable display identifier where possible." + }, + "feature_name": { + "type": "string", + "description": "User-friendly feature name. Present when the feature declares one.", + "nullable": true + }, + "assigned_orgs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/FeatureOrgInfo" + }, + "description": "Orgs currently assigned to this feature. Populated in the cluster-admin view.", + "nullable": true + }, + "is_org_aware": { + "type": "boolean", + "description": "Whether the feature is Org-aware. Org-aware features are managed via per-Org\nassignment; non-org-aware features are cluster-level toggles. Populated in the\ncluster-admin view.", + "nullable": true + }, + "feature_value": { + "type": "string", + "description": "Current cluster-level value of the feature. Populated in the cluster-admin\nview for non-org-aware features; null for Org-aware features. Values are\nalways returned as strings; for boolean toggles this is `\"true\"` or\n`\"false\"`.", + "nullable": true + }, + "element_type": { + "type": "string", + "description": "UI element type hint for the feature. Populated in the org-admin view.", + "nullable": true + }, + "element_config": { + "type": "object", + "description": "UI element configuration for the feature. Populated in the org-admin view.\nAn opaque blob whose structure varies by `element_type`; a `label` string is\nthe common envelope field.", + "nullable": true + }, + "element_value": { + "type": "string", + "description": "Current value of the feature for the requested Org. Populated in the\norg-admin view.", + "nullable": true + }, + "docs_url": { + "type": "string", + "description": "Per-feature documentation URL, when available.", + "nullable": true + } + }, + "description": "Detail for a single feature. Fields are populated according to the scope of the\nsearch: cluster-admin (CLUSTER) responses populate assigned_orgs, is_org_aware,\nand (for non-org-aware features) feature_value; org-admin (ORG) responses\npopulate element_type, element_config, and element_value." + }, + "FeatureOrgInfo": { + "type": "object", + "required": [ + "org_id", + "org_name" + ], + "properties": { + "org_id": { + "type": "integer", + "format": "int32", + "description": "Numeric ID of the Org." + }, + "org_name": { + "type": "string", + "description": "Display name of the Org." + } + }, + "description": "Lightweight Org identifier and display name, as returned in feature\nassignment responses.\nThe field names org_id / org_name intentionally deviate from the bare id /\nname used by the shared Org type: they are the literal wire keys emitted by\nthe Callosum backend, so they are load-bearing for Prism's response field\nmapping and cannot be renamed without a backend change." + }, "GenericInfo": { "type": "object", "properties": { @@ -25451,7 +27603,12 @@ "CAN_DOWNLOAD_VISUALS", "CAN_DOWNLOAD_DETAILED_DATA", "CAN_USE_SPOTTER", - "CAN_MANAGE_SPOTTER" + "CAN_MANAGE_SPOTTER", + "CAN_CREATE_LIVEBOARD", + "CAN_CREATE_ANSWERS", + "CAN_ANALYZE_DATA", + "CAN_ADMINISTER_SCHEDULES", + "CAN_CREATE_KPI_ALERTS" ] }, "description": "Privileges that will be assigned to the group. Note: AUTHORING is a no-op — always inherited via ALL_GROUP, assigning it has no effect.", @@ -25897,7 +28054,8 @@ "USER_GROUP", "ROLE", "FEEDBACK", - "COLLECTION" + "COLLECTION", + "TEMPLATE_VARIABLE" ], "description": " Type of metadata.\n \n\nRequired if the name of the object is set as the identifier. This attribute is optional when the object GUID is specified as the identifier.", "nullable": true @@ -26519,7 +28677,12 @@ "CAN_DOWNLOAD_VISUALS", "CAN_DOWNLOAD_DETAILED_DATA", "CAN_USE_SPOTTER", - "CAN_MANAGE_SPOTTER" + "CAN_MANAGE_SPOTTER", + "CAN_CREATE_LIVEBOARD", + "CAN_CREATE_ANSWERS", + "CAN_ANALYZE_DATA", + "CAN_ADMINISTER_SCHEDULES", + "CAN_CREATE_KPI_ALERTS" ] }, "description": "Privileges granted to the role." @@ -27686,6 +29849,28 @@ } } }, + "PrincipalRefInput": { + "type": "object", + "required": [ + "principal_identifier", + "principal_type" + ], + "properties": { + "principal_identifier": { + "type": "string", + "description": "Unique identifier of the user or group." + }, + "principal_type": { + "type": "string", + "enum": [ + "USER", + "USER_GROUP" + ], + "description": "Whether the principal is an individual user or a group." + } + }, + "description": "Input reference to a principal (user or group) used when granting or revoking\naccess to a shared resource." + }, "ImportMemoryResponse": { "type": "object", "required": [ @@ -28236,6 +30421,14 @@ "MEASURE" ], "description": "Semantic role of the column in ThoughtSpot. Use ATTRIBUTE for\ndimensional data such as text, dates, and identifiers, and\nMEASURE for numeric or aggregatable values." + }, + "allowed_values": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Optional list of permitted values for the column. When provided,\ndata written to this column is restricted to these values. Omit\nor leave empty to allow any value supported by the data type.
Version: 26.9.0.cl or later", + "nullable": true } }, "description": "Schema definition for a single input column." @@ -28896,6 +31089,186 @@ }, "description": "A visualization area assignment affected by a font deletion." }, + "SemanticIntegrationResponse": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Unique identifier of the semantic integration.", + "nullable": true + }, + "name": { + "type": "string", + "description": "Name of the semantic integration.", + "nullable": true + }, + "model_id": { + "type": "string", + "description": "Model GUID generated for this integration.", + "nullable": true + }, + "model_name": { + "type": "string", + "description": "Model name generated for this integration.", + "nullable": true + }, + "semantic_report": { + "$ref": "#/components/schemas/SemanticIntegrationReport", + "description": "Per-formula import report.", + "nullable": true + } + }, + "description": "Response object for a semantic integration." + }, + "SemanticIntegrationReport": { + "type": "object", + "properties": { + "summary": { + "$ref": "#/components/schemas/SemanticIntegrationReportSummary", + "description": "Summary of formula import counts.", + "nullable": true + }, + "formulas": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SemanticIntegrationFormulaReport" + }, + "description": "Formula import details.", + "nullable": true + } + }, + "description": "Per-formula import report for a semantic integration." + }, + "SemanticIntegrationReportSummary": { + "type": "object", + "properties": { + "total": { + "type": "integer", + "format": "int32", + "description": "Total number of formulas.", + "nullable": true + }, + "imported": { + "type": "integer", + "format": "int32", + "description": "Number of successfully imported formulas.", + "nullable": true + }, + "failed": { + "type": "integer", + "format": "int32", + "description": "Number of failed formula imports.", + "nullable": true + }, + "skipped": { + "type": "integer", + "format": "int32", + "description": "Number of skipped formulas.", + "nullable": true + } + }, + "description": "Formula import counts summary." + }, + "SemanticIntegrationFormulaReport": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Formula ID in the model.", + "nullable": true + }, + "name": { + "type": "string", + "description": "Formula name.", + "nullable": true + }, + "description": { + "type": "string", + "description": "Formula description.", + "nullable": true + }, + "source_expression": { + "type": "string", + "description": "CDW source expression.", + "nullable": true + }, + "translated_formula": { + "type": "string", + "description": "ThoughtSpot formula equivalent.", + "nullable": true + }, + "import_status": { + "type": "string", + "enum": [ + "IMPORTED", + "FAILED", + "SKIPPED" + ], + "description": "Import status.", + "nullable": true + }, + "change_status": { + "type": "string", + "enum": [ + "NEW", + "UPDATED", + "UNCHANGED" + ], + "description": "Change status since last import. Null on initial create.", + "nullable": true + } + }, + "description": "Import details for a single formula." + }, + "FeatureAssignmentResponse": { + "type": "object", + "required": [ + "feature_id", + "assigned_orgs" + ], + "properties": { + "feature_id": { + "type": "string", + "description": "Underlying unique feature ID. The dotted-path format (for example,\n`orion.embraceConfig.doIndexing`) is internal and subject to change without\nnotice; use `feature_name` as the stable display identifier where possible." + }, + "feature_name": { + "type": "string", + "description": "User-friendly feature name. Present when the feature declares one.", + "nullable": true + }, + "assigned_orgs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/FeatureOrgInfo" + }, + "description": "Updated set of Orgs assigned to the feature." + } + }, + "description": "Response returned when a feature's Org assignments are updated." + }, + "FeatureValueResponse": { + "type": "object", + "required": [ + "feature_id", + "feature_value" + ], + "properties": { + "feature_id": { + "type": "string", + "description": "Underlying unique feature ID. The dotted-path format (for example,\n`orion.embraceConfig.doIndexing`) is internal and subject to change without\nnotice; use `feature_name` as the stable display identifier where possible." + }, + "feature_name": { + "type": "string", + "description": "User-friendly feature name. Present when the feature declares one.", + "nullable": true + }, + "feature_value": { + "type": "string", + "description": "The value that was written." + } + }, + "description": "Response returned when a feature's value is set." + }, "Runtime_Filter": { "type": "object", "properties": { @@ -29226,6 +31599,43 @@ "nl_instructions_info" ] }, + "ShareConversationRequest": { + "type": "object", + "properties": { + "refresh_shared_content": { + "description": "When `true`, always regenerates the shared view from the latest conversation\nstate, even if one already exists. When `false` (default), reuses the\nexisting shared view.", + "default": false, + "type": "boolean", + "nullable": true + }, + "grant": { + "description": "Principals to grant read-only access to the conversation.", + "default": [], + "type": "array", + "items": { + "$ref": "#/components/schemas/PrincipalRefInput" + } + }, + "revoke": { + "description": "Principals to revoke access from the conversation.", + "default": [], + "type": "array", + "items": { + "$ref": "#/components/schemas/PrincipalRefInput" + } + }, + "notify_on_share": { + "description": "
Version: 26.10.0.cl or later
\n\nWhen `true` (default), newly granted principals are notified of the share. When `false`, access is granted without sending a notification. Has no effect on principals passed in `revoke`. Does not re-notify a principal who already had access.", + "default": true, + "type": "boolean", + "nullable": true + } + }, + "required": [ + "grant", + "revoke" + ] + }, "SingleAnswerRequest": { "type": "object", "properties": { @@ -29762,7 +32172,8 @@ "KEY_PAIR", "PERSONAL_ACCESS_TOKEN", "OAUTH_WITH_SERVICE_PRINCIPAL", - "OAUTH_CLIENT_CREDENTIALS" + "OAUTH_CLIENT_CREDENTIALS", + "OAUTH_CLIENT_CREDENTIALS_WITH_X509" ] }, "configuration": { @@ -29787,13 +32198,14 @@ } }, "policy_processes": { - "description": "Action that the query performed on the data warehouse, such as SAGE_INDEXING and ROW_COUNT_STATS.", + "description": "Action that the query performed on the data warehouse, such as SAGE_INDEXING, ROW_COUNT_STATS, and SCHEDULED_LIVEBOARDS.", "type": "array", "items": { "type": "string", "enum": [ "SAGE_INDEXING", - "ROW_COUNT_STATS" + "ROW_COUNT_STATS", + "SCHEDULED_LIVEBOARDS" ] } } @@ -29862,7 +32274,8 @@ "EXTOAUTH_WITH_PKCE", "OAUTH_WITH_PKCE", "PERSONAL_ACCESS_TOKEN", - "OAUTH_CLIENT_CREDENTIALS" + "OAUTH_CLIENT_CREDENTIALS", + "OAUTH_CLIENT_CREDENTIALS_WITH_X509" ] }, "configuration": { @@ -29886,13 +32299,14 @@ } }, "policy_processes": { - "description": "Action that the query performed on the data warehouse, such as SAGE_INDEXING and ROW_COUNT_STATS.", + "description": "Action that the query performed on the data warehouse, such as SAGE_INDEXING, ROW_COUNT_STATS, and SCHEDULED_LIVEBOARDS.", "type": "array", "items": { "type": "string", "enum": [ "SAGE_INDEXING", - "ROW_COUNT_STATS" + "ROW_COUNT_STATS", + "SCHEDULED_LIVEBOARDS" ] } }, @@ -30127,7 +32541,8 @@ "OAUTH_WITH_PKCE", "EXTOAUTH_WITH_PKCE", "OAUTH_WITH_PEZ", - "OAUTH_CLIENT_CREDENTIALS" + "OAUTH_CLIENT_CREDENTIALS", + "OAUTH_CLIENT_CREDENTIALS_WITH_X509" ] }, "show_resolved_parameters": { @@ -30862,6 +33277,103 @@ "template_properties" ] }, + "SearchFeaturesRequest": { + "type": "object", + "properties": { + "scope": { + "description": "Determines the administrative view for the search.\nUse CLUSTER for the cluster-admin view (returns org assignments per feature);\nuse ORG for the org-admin view (returns the current value of each feature\nassigned to the org).", + "type": "string", + "enum": [ + "CLUSTER", + "ORG" + ] + }, + "org_identifier": { + "description": "Numeric ID of the Org to scope the search to. Required when scope is ORG;\nignored when scope is CLUSTER.", + "type": "integer", + "format": "int32" + }, + "category": { + "description": "Category of features to return. GENERAL_ACCESS returns features that are\ngenerally available; EARLY_ACCESS returns features still in early access.\nDefaults to GENERAL_ACCESS.", + "default": "GENERAL_ACCESS", + "type": "string", + "enum": [ + "GENERAL_ACCESS", + "EARLY_ACCESS" + ] + } + }, + "required": [ + "scope" + ] + }, + "UpdateFeatureAssignmentsRequest": { + "type": "object", + "properties": { + "feature_identifier": { + "description": "User-friendly feature name (feature_name) or the underlying feature ID\n(feature_id) of the feature whose Org assignments should be updated.", + "type": "string" + }, + "org_identifiers": { + "description": "Numeric IDs of the Orgs to assign to the feature. Send an empty array with\noperation REPLACE to clear all Org assignments for this feature.", + "type": "array", + "items": { + "type": "integer", + "format": "int32" + } + }, + "operation": { + "description": "Type of update to apply to the Org assignments. ADD assigns the given Orgs\nin addition to existing ones; REMOVE unassigns the given Orgs; REPLACE sets\nthe assignment to exactly the given Orgs. Defaults to REPLACE.", + "default": "REPLACE", + "type": "string", + "enum": [ + "ADD", + "REMOVE", + "REPLACE" + ] + } + }, + "required": [ + "feature_identifier", + "org_identifiers" + ] + }, + "UpdateFeatureValueRequest": { + "type": "object", + "properties": { + "scope": { + "description": "Determines the scope at which the value is set. Use CLUSTER to set the\ncluster-level value; use ORG to set a per-Org value override.", + "type": "string", + "enum": [ + "CLUSTER", + "ORG" + ] + }, + "org_identifier": { + "description": "Numeric ID of the Org for which to set the value. Required when scope is\nORG; ignored when scope is CLUSTER.", + "type": "integer", + "format": "int32" + }, + "feature_identifier": { + "description": "User-friendly feature name (feature_name) or the underlying feature ID\n(feature_id) of the feature whose value should be set.", + "type": "string" + }, + "feature_value": { + "description": "New value to set for the feature.", + "type": "string" + }, + "reset_org_overrides": { + "description": "Applicable only when `scope` is `CLUSTER`. When `true`, any existing per-Org value overrides for this feature are removed so that all Orgs inherit the new cluster-level value. Required when `scope` is `CLUSTER` for an org-aware feature. Must be omitted when `scope` is `ORG`; passing it at `ORG` scope returns a 400 error.", + "type": "boolean", + "nullable": true + } + }, + "required": [ + "scope", + "feature_identifier", + "feature_value" + ] + }, "CreateUserGroupRequest": { "type": "object", "properties": { @@ -30925,7 +33437,12 @@ "CAN_DOWNLOAD_VISUALS", "CAN_DOWNLOAD_DETAILED_DATA", "CAN_USE_SPOTTER", - "CAN_MANAGE_SPOTTER" + "CAN_MANAGE_SPOTTER", + "CAN_CREATE_LIVEBOARD", + "CAN_CREATE_ANSWERS", + "CAN_ANALYZE_DATA", + "CAN_ADMINISTER_SCHEDULES", + "CAN_CREATE_KPI_ALERTS" ] } }, @@ -31084,7 +33601,12 @@ "CAN_DOWNLOAD_VISUALS", "CAN_DOWNLOAD_DETAILED_DATA", "CAN_USE_SPOTTER", - "CAN_MANAGE_SPOTTER" + "CAN_MANAGE_SPOTTER", + "CAN_CREATE_LIVEBOARD", + "CAN_CREATE_ANSWERS", + "CAN_ANALYZE_DATA", + "CAN_ADMINISTER_SCHEDULES", + "CAN_CREATE_KPI_ALERTS" ] } }, @@ -31224,7 +33746,12 @@ "CAN_DOWNLOAD_VISUALS", "CAN_DOWNLOAD_DETAILED_DATA", "CAN_USE_SPOTTER", - "CAN_MANAGE_SPOTTER" + "CAN_MANAGE_SPOTTER", + "CAN_CREATE_LIVEBOARD", + "CAN_CREATE_ANSWERS", + "CAN_ANALYZE_DATA", + "CAN_ADMINISTER_SCHEDULES", + "CAN_CREATE_KPI_ALERTS" ] } }, @@ -32474,7 +35001,12 @@ "CAN_DOWNLOAD_VISUALS", "CAN_DOWNLOAD_DETAILED_DATA", "CAN_USE_SPOTTER", - "CAN_MANAGE_SPOTTER" + "CAN_MANAGE_SPOTTER", + "CAN_CREATE_LIVEBOARD", + "CAN_CREATE_ANSWERS", + "CAN_ANALYZE_DATA", + "CAN_ADMINISTER_SCHEDULES", + "CAN_CREATE_KPI_ALERTS" ] } }, @@ -32573,7 +35105,12 @@ "CAN_DOWNLOAD_VISUALS", "CAN_DOWNLOAD_DETAILED_DATA", "CAN_USE_SPOTTER", - "CAN_MANAGE_SPOTTER" + "CAN_MANAGE_SPOTTER", + "CAN_CREATE_LIVEBOARD", + "CAN_CREATE_ANSWERS", + "CAN_ANALYZE_DATA", + "CAN_ADMINISTER_SCHEDULES", + "CAN_CREATE_KPI_ALERTS" ] } }, @@ -32667,7 +35204,12 @@ "CAN_DOWNLOAD_VISUALS", "CAN_DOWNLOAD_DETAILED_DATA", "CAN_USE_SPOTTER", - "CAN_MANAGE_SPOTTER" + "CAN_MANAGE_SPOTTER", + "CAN_CREATE_LIVEBOARD", + "CAN_CREATE_ANSWERS", + "CAN_ANALYZE_DATA", + "CAN_ADMINISTER_SCHEDULES", + "CAN_CREATE_KPI_ALERTS" ] } } @@ -34532,6 +37074,93 @@ "column_security_rules" ] }, + "CreateSemanticIntegrationRequest": { + "type": "object", + "properties": { + "connection_identifier": { + "description": "ID or name of the CDW connection.", + "type": "string" + }, + "name": { + "description": "Name of the semantic integration. Must be unique.", + "type": "string" + }, + "database_name": { + "description": "Database name in the CDW.", + "type": "string" + }, + "schema_name": { + "description": "Schema name in the CDW.", + "type": "string" + }, + "semantic_view_name": { + "description": "Semantic view name in the CDW.", + "type": "string" + }, + "type": { + "description": "CDW connector type.", + "type": "string", + "enum": [ + "RDBMS_SNOWFLAKE" + ] + }, + "description": { + "description": "Optional description of the semantic integration.", + "type": "string" + } + }, + "required": [ + "connection_identifier", + "name", + "database_name", + "schema_name", + "semantic_view_name", + "type" + ] + }, + "SearchSemanticIntegrationsRequest": { + "type": "object", + "properties": { + "sort_options": { + "description": "Sort options for the search results.", + "allOf": [ + { + "$ref": "#/components/schemas/SemanticIntegrationSortOptions" + } + ] + }, + "record_offset": { + "description": "Number of records to skip for pagination. Minimum value is 0.", + "default": 0, + "type": "integer", + "format": "int32" + }, + "record_size": { + "description": "Maximum number of records to return. Use 0 to return all records (no pagination).", + "default": 10, + "type": "integer", + "format": "int32" + }, + "pattern": { + "description": "Name filter substring to narrow search results.", + "type": "string" + }, + "author_identifiers": { + "description": "Filter by author IDs or names who created the integrations.", + "type": "array", + "items": { + "type": "string" + } + }, + "connection_identifiers": { + "description": "Filter by connection IDs or names associated with the integrations.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, "DeleteStyleFontsRequest": { "type": "object", "properties": { @@ -34629,7 +37258,7 @@ ] }, "name": { - "description": "New display name for the font. Must be unique within the target scope.", + "description": "New display name for the font.", "type": "string" }, "weight": { @@ -35231,7 +37860,12 @@ "CAN_DOWNLOAD_VISUALS", "CAN_DOWNLOAD_DETAILED_DATA", "CAN_USE_SPOTTER", - "CAN_MANAGE_SPOTTER" + "CAN_MANAGE_SPOTTER", + "CAN_CREATE_LIVEBOARD", + "CAN_CREATE_ANSWERS", + "CAN_ANALYZE_DATA", + "CAN_ADMINISTER_SCHEDULES", + "CAN_CREATE_KPI_ALERTS" ] } }, @@ -36107,6 +38741,18 @@ "type": "http", "scheme": "bearer" } + }, + "parameters": { + "OrgSelector": { + "name": "X-Org-Selector", + "in": "header", + "required": false, + "description": "Per-request target Org selector (Org id or name) within the calling token's scope. Selects one Org from the token's authorized set for this request. Optional; not an authentication credential.", + "schema": { + "type": "string", + "example": "sales" + } + } } }, "security": [ From b26b9763edf020bbd92068f12cef484dba1c8e70 Mon Sep 17 00:00:00 2001 From: swarnika-gupta Date: Thu, 6 Aug 2026 13:17:36 +0530 Subject: [PATCH 2/2] [SCAL-283418] Drop X-Org-Selector example from spec The X-Org-Selector header must not carry a default/example value; it should only be sent when the caller specifies one. Remove "example": "sales" from the OrgSelector parameter, matching the generator change (SCAL-330088). Co-Authored-By: Claude Opus 4.8 --- api-spec/openapiSpecv3-2_0.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/api-spec/openapiSpecv3-2_0.json b/api-spec/openapiSpecv3-2_0.json index 543c8a980..8b2e18c59 100644 --- a/api-spec/openapiSpecv3-2_0.json +++ b/api-spec/openapiSpecv3-2_0.json @@ -38749,8 +38749,7 @@ "required": false, "description": "Per-request target Org selector (Org id or name) within the calling token's scope. Selects one Org from the token's authorized set for this request. Optional; not an authentication credential.", "schema": { - "type": "string", - "example": "sales" + "type": "string" } } }