diff --git a/api/openapi.json b/api/openapi.json index a543c3e..565aa71 100644 --- a/api/openapi.json +++ b/api/openapi.json @@ -894,9 +894,16 @@ "properties": { "answer": { "type": "string", - "description": "A synthesized answer to the question, based on the Omni documentation.", + "description": "An answer based on the available documentation, or an explanation when the search was skipped or failed.", "example": "To create a dashboard filter, navigate to your dashboard and click the \"Add Filter\" button..." }, + "fulfillmentNotes": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Selected pages that could not be fetched, with each page URL and its HTTP status or transport error code." + }, "sources": { "type": "array", "items": { @@ -920,11 +927,23 @@ ] }, "description": "List of documentation pages that were used to synthesize the answer." + }, + "status": { + "type": "string", + "enum": [ + "complete", + "partial", + "skipped", + "failed" + ], + "description": "Search outcome: complete when all selected pages were fetched and an answer was synthesized; partial when some fetches failed but an answer was synthesized; skipped when no usable relevant pages were selected; failed when the index or all selected pages could not be fetched, or the synthesis response could not be parsed.", + "example": "complete" } }, "required": [ "answer", - "sources" + "sources", + "status" ] }, "AiSearchOmniDocsBody": { @@ -1735,7 +1754,7 @@ }, "text": { "type": "string", - "description": "Markdown content of the message. For assistant turns this is the same string returned by /api/v1/ai/jobs/{jobId}/result#message.", + "description": "Markdown content of the message. For assistant turns this is the turn's answer: the text of its final summary, or of the validation that closed a turn the AI ended in plain text. Present for web-UI turns that have no job, and not guaranteed to match the job result message byte for byte.", "example": "What were our top products last week?" } }, @@ -3788,6 +3807,14 @@ "description": "Path to dbt project root", "example": "dbt_project" }, + "publicKey": { + "type": [ + "string", + "null" + ], + "description": "SSH public key to register as a deploy key on the git repository. Reflects the new key after a PUT with rotateKeys: true. Null for non-ssh auth.", + "example": "ssh-rsa AAAA..." + }, "sshUrl": { "type": "string", "description": "Clone URL for the git repository — SSH (git@...) for ssh auth, https:// for https_token or github_app auth", @@ -3814,6 +3841,7 @@ "enableVirtualSchemas", "githubAppInstallationId", "projectRootPath", + "publicKey", "sshUrl", "supportsDbt" ], @@ -4568,6 +4596,18 @@ "DashboardsDownloadBody": { "type": "object", "properties": { + "containerPages": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + }, + "minItems": 1, + "description": "Compatible with pdf, png, csv & xlsx formats, on dashboards using the advanced layout. The instanceKeys of the pages to render, as returned in a page's \"instanceKey\". pdf renders each page in storage order; png accepts a single page; csv and xlsx include only the tiles on the selected pages. Defaults to the first page for pdf and png, and to every tile for csv and xlsx. Cannot be combined with queryIdentifierMapKey.", + "example": [ + "page_abc123" + ] + }, "enableConditionalFormatting": { "type": "boolean", "default": true, @@ -9592,6 +9632,10 @@ "type": "boolean", "default": false }, + "allowModals": { + "type": "boolean", + "default": false + }, "externalNavOpensInNewTab": { "type": "boolean", "default": true @@ -17276,7 +17320,7 @@ "properties": { "attachedQueryKey": { "type": "string", - "description": "Set by the auto-add-tile flow when this container was generated for a specific workbook tab. The server removes containers with a matching `attachedQueryKey` when that tab is deleted. The reducer clears this when the user adds unrelated content (a different query, filter, text tile, page switcher, or sub-container)." + "description": "The workbook tab this tile container belongs to. By default this is the `id` of the query content item the container renders. Both use the same numbering as the keys under `queryPresentations`, so a copy that renumbers chart ids must renumber this too; a value naming a different tab makes Explore and Edit in workbook open that other tab. The server removes containers with a matching `attachedQueryKey` when that tab is deleted." }, "generatedHeading": { "type": "boolean", @@ -25625,7 +25669,7 @@ "properties": { "attachedQueryKey": { "type": "string", - "description": "Set by the auto-add-tile flow when this container was generated for a specific workbook tab. The server removes containers with a matching `attachedQueryKey` when that tab is deleted. The reducer clears this when the user adds unrelated content (a different query, filter, text tile, page switcher, or sub-container)." + "description": "The workbook tab this tile container belongs to. By default this is the `id` of the query content item the container renders. Both use the same numbering as the keys under `queryPresentations`, so a copy that renumbers chart ids must renumber this too; a value naming a different tab makes Explore and Edit in workbook open that other tab. The server removes containers with a matching `attachedQueryKey` when that tab is deleted." }, "generatedHeading": { "type": "boolean", @@ -30734,6 +30778,9 @@ ], "description": "Document description." }, + "draftOf": { + "$ref": "#/components/schemas/DocumentsV2DraftOf" + }, "modelId": { "type": "string", "format": "uuid", @@ -32129,6 +32176,20 @@ "config" ] }, + "DocumentsV2DraftOf": { + "type": "object", + "properties": { + "identifier": { + "type": "string", + "description": "Identifier of the published document." + } + }, + "required": [ + "identifier" + ], + "additionalProperties": false, + "description": "Present only when `{identifier}` names a draft: the published document the draft belongs to, which the draft routes (`…/documents/{identifier}/draft/{draftIdentifier}`) address it under." + }, "QueryPresentationsReadExternal": { "type": "object", "properties": { @@ -35158,6 +35219,16 @@ "app": { "$ref": "#/components/schemas/DocumentsV2AppEcho" }, + "draftOf": { + "allOf": [ + { + "$ref": "#/components/schemas/DocumentsV2DraftOf" + }, + { + "description": "Read-only and accepted only so a GET of a draft round-trips through PATCH; nothing in it is written. An `identifier` other than the document this route addresses is rejected with 409." + } + ] + }, "modelId": { "type": "string", "format": "uuid", @@ -35203,7 +35274,7 @@ "items": { "type": "string" }, - "description": "Non-blocking warnings — present only when there are any. Currently: external resource hosts the app's iframe CSP will block until an org admin allows them, and a map-provider setting the organization's app policy turns off for every app. The write itself succeeded. Advisory prose, not a contract: the wording is deliberately volatile, there are no per-warning codes, and consumers must not branch on the content. The render-time CSP is the enforcement." + "description": "Non-blocking warnings — present only when there are any. Currently: external resource hosts the app's iframe CSP will block until an org admin allows them, and a map-provider or print-and-dialogs setting the organization's app policy turns off for every app. The write itself succeeded. Advisory prose, not a contract: the wording is deliberately volatile, there are no per-warning codes, and consumers must not branch on the content. The render-time CSP is the enforcement." } }, "required": [ @@ -36285,7 +36356,7 @@ "string", "null" ], - "description": "Failure reason string for prompts whose underlying job failed.", + "description": "Why the underlying job did not deliver an answer: it failed, its result could not be read, or it completed without producing a response.", "example": null }, "eval_prompt_id": { @@ -36345,7 +36416,7 @@ "number", "null" ], - "description": "Numeric judge score for this prompt result, if scoring ran.", + "description": "Numeric score for this prompt result. The judge aggregate when scoring ran; 0 with a null scoring_cost when the job completed without producing a response, which is scored without a judge.", "example": 0.9 }, "scoring_cost": { @@ -36400,7 +36471,7 @@ "null" ], "format": "uuid", - "description": "Conversation the agentic job belongs to.", + "description": "Conversation the agentic job belongs to. Pass it to GET /api/v1/ai/conversations/{conversationId} to read the full transcript of this eval result. A user-scoped token can read it only if it created the run; use an organization API key for other users' runs.", "example": "770e8400-e29b-41d4-a716-446655440002" }, "id": { @@ -39314,7 +39385,7 @@ "properties": { "dashboard_identifier": { "type": "string", - "description": "Identifier of the dashboard that generated this exposure" + "description": "Identifier of the dashboard or app that generated this exposure" }, "deduplication_name": { "type": "string", @@ -39346,7 +39417,7 @@ }, "label": { "type": "string", - "description": "Original dashboard name" + "description": "Original document name" }, "name": { "type": "string", @@ -39365,12 +39436,12 @@ "ml", "application" ], - "description": "Type of the exposure", + "description": "Type of the exposure: \"dashboard\" for a dashboard, \"application\" for an app", "example": "dashboard" }, "url": { "type": "string", - "description": "URL of the dashboard" + "description": "URL of the dashboard or app" } }, "required": [ @@ -39379,18 +39450,18 @@ "owner", "type" ], - "description": "The dbt exposure for this dashboard." + "description": "The dbt exposure for this document." }, "DbtExposureOwner": { "type": "object", "properties": { "email": { "type": "string", - "description": "Email of the dashboard owner" + "description": "Email of the document owner" }, "name": { "type": "string", - "description": "Name of the dashboard owner" + "description": "Name of the document owner" } }, "required": [ @@ -41291,7 +41362,7 @@ "string", "null" ], - "description": "Reason for system disabling: missingQuery, noAccess, orphanedFilterConfigKeys" + "description": "Reason for system disabling: contentRemoved, credentialMissing, destinationDisabled, missingQuery, noAccess, orphanedFilterConfigKeys, ownerRevoked" }, "timezone": { "type": "string", @@ -41381,7 +41452,7 @@ "example": false }, "metadata": { - "description": "Schedule metadata including format options and delivery settings. Includes `timezoneOverride` (IANA timezone applied to query execution at render time, or null when no override is set)." + "description": "Schedule metadata including format options and delivery settings. Includes `timezoneOverride` (IANA timezone applied to query execution at render time, or null when no override is set) and `containerPages` (the instanceKeys of the advanced-layout pages the delivery renders, absent when no pages were selected)." }, "name": { "type": "string", @@ -41428,7 +41499,7 @@ "string", "null" ], - "description": "Reason for system disabling: missingQuery, noAccess, orphanedFilterConfigKeys" + "description": "Reason for system disabling: contentRemoved, credentialMissing, destinationDisabled, missingQuery, noAccess, orphanedFilterConfigKeys, ownerRevoked" }, "timezone": { "type": "string", @@ -41775,7 +41846,7 @@ "format": "uuid" }, "default": [], - "description": "At least one email, userId, or userGroupId must be provided. Array of recipient user UUIDs to remove from the scheduled task. Use the List users and List embed users endpoints to retrieve user IDs.", + "description": "At least one email, userId, or userGroupId must be provided. Array of recipient user UUIDs to remove from the scheduled task. Use the List users and List embed users endpoints to retrieve user IDs. Each ID removes only that user, whereas an entry in emails removes every recipient delivered to that address.", "example": [ "987fcdeb-51a2-43d7-9b56-254415f67890" ] @@ -42775,6 +42846,13 @@ "DocumentExportResponse": { "type": "object", "properties": { + "colorPalettes": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/ColorPaletteExport" + }, + "description": "Custom color palettes referenced by vis configs, keyed by export-local key" + }, "dashboard": { "description": "Dashboard configuration and layout" }, @@ -42806,14 +42884,67 @@ "workbookModel": {} }, "required": [ + "colorPalettes", "document", "exportVersion", "queryModels" ] }, + "ColorPaletteExport": { + "type": "object", + "properties": { + "colors": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Ordered colors as stored, usually hex" + }, + "name": { + "type": "string", + "maxLength": 256, + "description": "Palette name" + }, + "type": { + "type": "string", + "enum": [ + "discrete", + "continuous" + ], + "description": "'discrete' or 'continuous'" + } + }, + "required": [ + "colors", + "name", + "type" + ] + }, "DocumentImportResponse": { "type": "object", "properties": { + "colorPalettes": { + "type": "object", + "properties": { + "created": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ImportedColorPalette" + } + }, + "reused": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ImportedColorPalette" + } + } + }, + "required": [ + "created", + "reused" + ], + "description": "Custom palettes the import created in this org or matched by name and type" + }, "documentId": { "type": "string", "format": "uuid", @@ -42829,6 +42960,36 @@ "identifier" ] }, + "ImportedColorPalette": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Palette ID in this org" + }, + "key": { + "type": "string", + "description": "Export-local key, e.g. export-palette-1" + }, + "name": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "discrete", + "continuous" + ] + } + }, + "required": [ + "id", + "key", + "name", + "type" + ] + }, "DocumentImportBody": { "type": "object", "properties": { @@ -42837,6 +42998,13 @@ "format": "uuid", "description": "Base model ID for the imported document" }, + "colorPalettes": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/ColorPaletteExport" + }, + "description": "Custom color palettes referenced by vis configs, keyed by export-local key" + }, "dashboard": { "description": "Dashboard export data" }, @@ -42980,6 +43148,317 @@ "records" ] }, + "UserAttributesCreateResponse": { + "type": "object", + "properties": { + "default_value": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + } + }, + { + "type": "null" + } + ], + "description": "Default value applied when no user-specific value is set. When multiple_values is true, this is an array. Null if no default is configured.", + "example": "us-east" + }, + "description": { + "type": [ + "string", + "null" + ], + "description": "Human-readable description of the attribute and its purpose", + "example": "User region for row-level security filtering" + }, + "id": { + "type": "string", + "description": "Unique identifier for custom attributes. Empty string for system-defined attributes.", + "example": "a1b2c3d4-e5f6-7890-abcd-ef1234567890" + }, + "label": { + "type": "string", + "description": "Display name shown in the Omni UI", + "example": "Region" + }, + "multiple_values": { + "type": "boolean", + "description": "Whether the attribute accepts an array of values. When true, default_value and user-specific values are arrays.", + "example": false + }, + "name": { + "type": "string", + "description": "Reference name used in model SQL and in embed SSO URL parameters", + "example": "region" + }, + "system": { + "type": "boolean", + "description": "System-defined attributes (e.g. omni_user_id, omni_user_email) are built-in and read-only. Custom attributes have system=false.", + "example": false + }, + "type": { + "type": "string", + "enum": [ + "String", + "Number" + ], + "description": "Data type that determines valid values. String attributes accept text, Number attributes accept numeric values stored as strings for precision.", + "example": "String" + } + }, + "required": [ + "default_value", + "description", + "id", + "label", + "multiple_values", + "name", + "system", + "type" + ] + }, + "UserAttributesCreateBody": { + "type": "object", + "properties": { + "default_value": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number", + "minimum": -1.7976931348623157e+308, + "maximum": 1.7976931348623157e+308 + }, + { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number", + "minimum": -1.7976931348623157e+308, + "maximum": 1.7976931348623157e+308 + } + ] + } + }, + { + "type": "null" + } + ], + "description": "Default value applied when no user-specific value is set. A single value when multiple_values is false, an array when it is true. Strings are trimmed. Number attributes accept numbers or numeric strings and store them as strings. Numbers are converted to strings on receipt, so send anything beyond the JSON safe integer range (2^53 - 1) as a string or it loses precision before Omni sees it. Null or a string that trims to empty means no default. An empty array clears the default of a multi-valued attribute and is rejected for a single-valued one, and a list member that trims to empty is rejected.", + "example": "us-east" + }, + "description": { + "type": [ + "string", + "null" + ], + "description": "Human-readable description of the attribute and its purpose. An empty string is stored as null.", + "example": "User region for row-level security filtering" + }, + "label": { + "type": "string", + "minLength": 1, + "description": "Display name shown in the Omni UI. Unique among the custom attributes in the organization, and may match the label of a system attribute. Must not start with \"Omni\" and must not be one of the reserved connection labels (Host, Password, Database, Port, Schema, Connection Name).", + "example": "Region" + }, + "multiple_values": { + "type": "boolean", + "default": false, + "description": "Whether the attribute accepts an array of values. Defaults to false.", + "example": false + }, + "name": { + "type": "string", + "minLength": 1, + "description": "Reference name used in model SQL and in embed SSO URL parameters. Unique within the organization. Must start with a letter, contain only letters, numbers and underscores, and must not start with \"omni_\".", + "example": "region" + }, + "type": { + "type": "string", + "enum": [ + "String", + "Number" + ], + "description": "Data type that determines valid values. String attributes accept text, Number attributes accept numeric values stored as strings for precision.", + "example": "String" + } + }, + "required": [ + "label", + "name", + "type" + ], + "additionalProperties": false + }, + "UserAttributesUpdateResponse": { + "type": "object", + "properties": { + "default_value": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + } + }, + { + "type": "null" + } + ], + "description": "Default value applied when no user-specific value is set. When multiple_values is true, this is an array. Null if no default is configured.", + "example": "us-east" + }, + "description": { + "type": [ + "string", + "null" + ], + "description": "Human-readable description of the attribute and its purpose", + "example": "User region for row-level security filtering" + }, + "id": { + "type": "string", + "description": "Unique identifier for custom attributes. Empty string for system-defined attributes.", + "example": "a1b2c3d4-e5f6-7890-abcd-ef1234567890" + }, + "label": { + "type": "string", + "description": "Display name shown in the Omni UI", + "example": "Region" + }, + "multiple_values": { + "type": "boolean", + "description": "Whether the attribute accepts an array of values. When true, default_value and user-specific values are arrays.", + "example": false + }, + "name": { + "type": "string", + "description": "Reference name used in model SQL and in embed SSO URL parameters", + "example": "region" + }, + "system": { + "type": "boolean", + "description": "System-defined attributes (e.g. omni_user_id, omni_user_email) are built-in and read-only. Custom attributes have system=false.", + "example": false + }, + "type": { + "type": "string", + "enum": [ + "String", + "Number" + ], + "description": "Data type that determines valid values. String attributes accept text, Number attributes accept numeric values stored as strings for precision.", + "example": "String" + } + }, + "required": [ + "default_value", + "description", + "id", + "label", + "multiple_values", + "name", + "system", + "type" + ] + }, + "UserAttributesUpdateBody": { + "type": "object", + "properties": { + "default_value": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number", + "minimum": -1.7976931348623157e+308, + "maximum": 1.7976931348623157e+308 + }, + { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number", + "minimum": -1.7976931348623157e+308, + "maximum": 1.7976931348623157e+308 + } + ] + } + }, + { + "type": "null" + } + ], + "description": "Default value applied when no user-specific value is set. A single value when multiple_values is false, an array when it is true. Strings are trimmed. Number attributes accept numbers or numeric strings and store them as strings. Numbers are converted to strings on receipt, so send anything beyond the JSON safe integer range (2^53 - 1) as a string or it loses precision before Omni sees it. Null or a string that trims to empty means no default. An empty array clears the default of a multi-valued attribute and is rejected for a single-valued one, and a list member that trims to empty is rejected.", + "example": "us-east" + }, + "description": { + "type": [ + "string", + "null" + ], + "description": "Human-readable description of the attribute and its purpose. An empty string is stored as null.", + "example": "User region for row-level security filtering" + }, + "label": { + "type": "string", + "minLength": 1, + "description": "Display name shown in the Omni UI. Unique among the custom attributes in the organization, and may match the label of a system attribute. Must not start with \"Omni\" and must not be one of the reserved connection labels (Host, Password, Database, Port, Schema, Connection Name).", + "example": "Region" + }, + "multiple_values": { + "type": "boolean", + "description": "Whether the attribute accepts an array of values.", + "example": false + }, + "name": { + "type": "string", + "minLength": 1, + "description": "Reference name used in model SQL and in embed SSO URL parameters. Unique within the organization. Must start with a letter, contain only letters, numbers and underscores, and must not start with \"omni_\".", + "example": "region" + } + }, + "additionalProperties": false + }, "UploadsListResponse": { "type": "object", "properties": { @@ -43623,6 +44102,115 @@ "users" ] }, + "ApiUsersEmailOnlyUsersBulkDeleteResponse": { + "type": "object", + "properties": { + "deleted": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ApiEmailOnlyUserResponse" + }, + "description": "The email-only users that were deleted" + }, + "notFound": { + "type": "object", + "properties": { + "emails": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Requested emails that do not belong to an email-only user" + }, + "userIds": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Requested IDs that do not belong to an email-only user" + } + }, + "required": [ + "emails", + "userIds" + ], + "description": "Requested identifiers that matched no email-only user in the organization" + } + }, + "required": [ + "deleted", + "notFound" + ] + }, + "ApiEmailOnlyUserResponse": { + "type": "object", + "properties": { + "email": { + "type": "string", + "format": "email", + "description": "Email address of the user", + "example": "user@example.com" + }, + "userId": { + "type": "string", + "description": "ID of the user" + } + }, + "required": [ + "email", + "userId" + ] + }, + "ApiUsersEmailOnlyUsersBulkDeleteRequest": { + "type": "object", + "properties": { + "emails": { + "type": "array", + "items": { + "type": "string", + "format": "email" + }, + "description": "Email addresses of the email-only users to delete", + "example": [ + "user@example.com" + ] + }, + "userIds": { + "type": "array", + "items": { + "type": "string", + "format": "uuid" + }, + "description": "IDs of the email-only users to delete, as returned by the list and create endpoints", + "example": [ + "9e8719d9-276a-4964-9395-a493e1ba5f64" + ] + } + }, + "additionalProperties": false, + "anyOf": [ + { + "properties": { + "emails": { + "minItems": 1 + } + }, + "required": [ + "emails" + ] + }, + { + "properties": { + "userIds": { + "minItems": 1 + } + }, + "required": [ + "userIds" + ] + } + ] + }, "UserGroupsGetModelRolesResponse": { "type": "object", "properties": { @@ -44072,7 +44660,7 @@ }, "responses": { "200": { - "description": "Documentation search completed successfully. Returns a synthesized answer with source links.", + "description": "Documentation search result. Check the status field for complete, partial, skipped, or failed outcomes.", "content": { "application/json": { "schema": { @@ -44768,7 +45356,7 @@ }, "/api/v1/ai/conversations/{conversationId}": { "get": { - "description": "Return a conversation with its full message history (alternating user / assistant turns). Used by clients (iOS app, embed widgets) to restore a prior conversation in their UI.", + "description": "Return a conversation with its full message history (alternating user / assistant turns). Used by clients (iOS app, embed widgets) to restore a prior conversation in their UI. Also serves the conversation behind an AI eval run result: pass `results[].agentic_job.conversation_id` from GET /api/v1/ai/eval/runs/{runId}. Eval conversations do not appear in GET /api/v1/ai/conversations; this endpoint is the only way to read one. For a user-scoped token the conversation must belong to the caller; for an eval run that is the user who created the run. Use an organization API key to read another user's eval transcripts. Eval conversations also require at least QUERIER on the run's model, the same gate as the eval API. Assistant text is retained for 30 days; older conversations return only their user turns.", "operationId": "aiConversationDetail", "summary": "Get AI conversation with messages", "tags": [ @@ -44807,7 +45395,7 @@ } }, "403": { - "description": "AI access is required to view chat conversations (no model in the org grants USE_AI to the caller).", + "description": "AI access is required to view chat conversations (no model in the org grants USE_AI to the caller), or the conversation belongs to an eval run whose model the caller lacks QUERIER on.", "content": { "application/json": { "schema": { @@ -45570,7 +46158,7 @@ } }, "403": { - "description": "AI routines or AI query generation are not enabled for the organization, the API key cannot act on behalf of the requested user, the acting user lacks routines access (the Use routines role permission) on the routine model, the request supplied a `condition` but conditional routines are not enabled for the organization, or the target user is an embed user in an organization that has not enabled routines for embed users.", + "description": "AI routines or AI query generation are not enabled for the organization, the API key cannot act on behalf of the requested user, or the acting user lacks routines access (the Use routines role permission) on the routine model.", "content": { "application/json": { "schema": { @@ -45600,7 +46188,7 @@ } }, "503": { - "description": "An AI or query service was temporarily unavailable while composing or verifying the delivery condition. Retryable.", + "description": "Omni was temporarily unable to compose or verify the delivery condition. Retryable.", "content": { "application/json": { "schema": { @@ -45780,7 +46368,7 @@ } }, "403": { - "description": "AI routines, AI query generation, or conditional routines are not enabled for the organization, the routine owner lacks routines access (the Use routines role permission) on the routine model, or a user-scoped API key tried to update another user's routine.", + "description": "AI routines or AI query generation are not enabled for the organization, the routine owner lacks routines access (the Use routines role permission) on the routine model, or a user-scoped API key tried to update another user's routine.", "content": { "application/json": { "schema": { @@ -45800,7 +46388,7 @@ } }, "503": { - "description": "An AI or query service was temporarily unavailable while composing or verifying the replacement condition. Retryable.", + "description": "Omni was temporarily unable to compose or verify the replacement condition. Retryable.", "content": { "application/json": { "schema": { @@ -46660,6 +47248,7 @@ "snowflake", "motherduck", "mssql", + "fabric", "databricks", "databricks_lakebase", "clickhouse", @@ -46734,7 +47323,7 @@ "string", "null" ], - "description": "Custom Snowflake host, overriding the account identifier", + "description": "Network hostname used to connect to Snowflake. When using a proxy, set `host` to the Snowflake account identifier.", "example": null }, "id": { @@ -47080,6 +47669,7 @@ "snowflake", "motherduck", "mssql", + "fabric", "databricks", "databricks_lakebase", "clickhouse", @@ -47128,7 +47718,7 @@ }, "hostOverride": { "type": "string", - "description": "Custom Snowflake host (when not using the account identifier). Mutually exclusive with `host`.", + "description": "Network hostname used to connect to Snowflake. When using a proxy, set `host` to the Snowflake account identifier.", "example": "myaccount.snowflakecomputing.com" }, "includeOtherCatalogs": { @@ -47450,6 +48040,7 @@ "snowflake", "motherduck", "mssql", + "fabric", "databricks", "databricks_lakebase", "clickhouse", @@ -47524,7 +48115,7 @@ "string", "null" ], - "description": "Custom Snowflake host, overriding the account identifier", + "description": "Network hostname used to connect to Snowflake. When using a proxy, set `host` to the Snowflake account identifier.", "example": null }, "id": { @@ -47931,7 +48522,7 @@ }, "hostOverride": { "type": "string", - "description": "Custom Snowflake host, overriding the account identifier", + "description": "Network hostname used to connect to Snowflake. When using a proxy, set `host` to the Snowflake account identifier.", "example": "myaccount.snowflakecomputing.com" }, "includeOtherCatalogs": { @@ -48296,6 +48887,14 @@ "description": "Path to dbt project root", "example": "dbt_project" }, + "publicKey": { + "type": [ + "string", + "null" + ], + "description": "SSH public key to register as a deploy key on the git repository. Reflects the new key after a PUT with rotateKeys: true. Null for non-ssh auth.", + "example": "ssh-rsa AAAA..." + }, "sshUrl": { "type": "string", "description": "Clone URL for the git repository — SSH (git@...) for ssh auth, https:// for https_token or github_app auth", @@ -48322,6 +48921,7 @@ "enableVirtualSchemas", "githubAppInstallationId", "projectRootPath", + "publicKey", "sshUrl", "supportsDbt" ], @@ -48433,8 +49033,8 @@ "string", "null" ], - "description": "dbt version to use. Supported: Auto, 1.11, 1.12", - "example": "1.11" + "description": "dbt version to use. Supported: Auto, 1.11, 1.12, 2.0", + "example": "1.12" }, "enableSemanticLayer": { "type": "boolean", @@ -48595,6 +49195,14 @@ "description": "Path to dbt project root", "example": "dbt_project" }, + "publicKey": { + "type": [ + "string", + "null" + ], + "description": "SSH public key to register as a deploy key on the git repository. Reflects the new key after a PUT with rotateKeys: true. Null for non-ssh auth.", + "example": "ssh-rsa AAAA..." + }, "sshUrl": { "type": "string", "description": "Clone URL for the git repository — SSH (git@...) for ssh auth, https:// for https_token or github_app auth", @@ -48621,6 +49229,7 @@ "enableVirtualSchemas", "githubAppInstallationId", "projectRootPath", + "publicKey", "sshUrl", "supportsDbt" ], @@ -48711,6 +49320,14 @@ "description": "Path to dbt project root", "example": "dbt_project" }, + "publicKey": { + "type": [ + "string", + "null" + ], + "description": "SSH public key to register as a deploy key on the git repository. Reflects the new key after a PUT with rotateKeys: true. Null for non-ssh auth.", + "example": "ssh-rsa AAAA..." + }, "sshUrl": { "type": "string", "description": "Clone URL for the git repository — SSH (git@...) for ssh auth, https:// for https_token or github_app auth", @@ -48737,6 +49354,7 @@ "enableVirtualSchemas", "githubAppInstallationId", "projectRootPath", + "publicKey", "sshUrl", "supportsDbt" ], @@ -50453,6 +51071,8 @@ }, "/api/v1/dashboards/{identifier}/filters": { "get": { + "deprecated": true, + "description": "Deprecated. Read a dashboard's filters and controls from `controls` on `GET /api/v2/documents/{identifier}`, or on `GET /api/v2/documents/{identifier}/draft/{draftIdentifier}` for a draft.", "operationId": "dashboardsGetFilters", "summary": "Get dashboard filters", "tags": [ @@ -50505,6 +51125,8 @@ } }, "patch": { + "deprecated": true, + "description": "Deprecated. Update filters and controls with a `controls` patch on `PATCH /api/v2/documents/{identifier}/draft`, then publish with `POST /api/v2/documents/{identifier}/draft/publish`. A `config` in `controls.data` replaces that filter or control's stored config whole.", "operationId": "dashboardsUpdateFilters", "summary": "Update dashboard filters", "tags": [ @@ -52080,7 +52702,7 @@ }, "/api/v2/documents/{identifier}": { "get": { - "description": "Read the document's published state — draft edits are never surfaced here. When a draft exists, read it via `GET /api/v2/documents/{identifier}/draft/{draftIdentifier}` before round-tripping the response into a draft PATCH, so you patch the draft's own content rather than published content over it. Returns the full `DocumentsV2ReadResponse` shape.\n\nThe response is structured so a caller can take it verbatim and submit it as the body of the draft PATCH routes. Tiles in `queryPresentations.data` are keyed by a stable record key (e.g. `\"1\"`, `\"2\"`) — the server uses that key to identify existing tiles for updates, so callers do not need to track or send any other identifier. Control IDs and container `instanceKey` / `referenceKey` values also round-trip unchanged.", + "description": "For a published identifier, read the document's published state — draft edits are never surfaced under it. When a draft exists, read it via `GET /api/v2/documents/{identifier}/draft/{draftIdentifier}` before round-tripping the response into a draft PATCH, so you patch the draft's own content rather than published content over it. Returns the full `DocumentsV2ReadResponse` shape.\n\nA draft's own identifier reads that draft's state instead. The response then carries `draftOf`, naming the published document the draft belongs to — use it to build the `…/documents/{identifier}/draft/{draftIdentifier}` routes when only the draft identifier is known.\n\nThe response is structured so a caller can take it verbatim and submit it as the body of the draft PATCH routes. Tiles in `queryPresentations.data` are keyed by a stable record key (e.g. `\"1\"`, `\"2\"`) — the server uses that key to identify existing tiles for updates, so callers do not need to track or send any other identifier. Control IDs and container `instanceKey` / `referenceKey` values also round-trip unchanged.", "operationId": "documentsV2Get", "summary": "Read document state", "tags": [ @@ -52198,7 +52820,7 @@ "description": "Method not allowed." }, "409": { - "description": "The target is not a published document (drafts only attach to published documents), a concurrent request just created the layout for this document (retry), or a supplied `app` does not round-trip: its `url` does not address this document’s app, or the document has no app (`app` is read-only — omit it, or send it as a GET returned it)." + "description": "A concurrent request just created the layout for this document (retry), or a supplied `app` does not round-trip: its `url` does not address this document’s app, or the document has no app (`app` is read-only — omit it, or send it as a GET returned it)." }, "422": { "description": "The document cannot satisfy the patch: a classic-layout dashboard (upgrade to the advanced layout first), a workbook-only document patched with dashboard-scoped fields but no `containers` payload (or an empty one), or an app document patched with dashboard-scoped fields (a document carries at most one of a dashboard or an app — never both)." @@ -52346,7 +52968,7 @@ "description": "Method not allowed." }, "409": { - "description": "The target is not a published document (drafts only attach to published documents), a concurrent request just created the layout for this document (retry), or a supplied `app` does not round-trip: its `url` does not address this document’s app, or the document has no app (`app` is read-only — omit it, or send it as a GET returned it)." + "description": "A concurrent request just created the layout for this document (retry), or a supplied `app` does not round-trip: its `url` does not address this document’s app, or the document has no app (`app` is read-only — omit it, or send it as a GET returned it)." }, "422": { "description": "The draft cannot satisfy the patch: a classic-layout dashboard (upgrade to the advanced layout first), a workbook-only draft patched with dashboard-scoped fields but no `containers` payload (or an empty one), or an app draft patched with dashboard-scoped fields (a document carries at most one of a dashboard or an app — never both)." @@ -52409,9 +53031,6 @@ "405": { "description": "Method not allowed." }, - "409": { - "description": "The target is not a published document." - }, "422": { "description": "The document is an app, not a dashboard." } @@ -52421,7 +53040,7 @@ "/api/v2/documents/{identifier}/app": { "get": { "description": "**Alpha.** The app sub-resource may change shape without a deprecation cycle while apps mature. The document routes are stable.\n\nRead the published app content: the full HTML plus `settings`. This is the only endpoint that returns the HTML body; the document GET carries only the `app` slice. Writes cap the HTML at 2 MiB — apps saved before the cap may read back larger. This reads the published app; an existing draft may have diverged, so read the draft state before building a draft write from this response.\n\nA document carries at most one of a dashboard or an app — never both; workbook-only is valid. The app HTML and settings live only at the app sub-resource routes; the document read carries an `app` slice pointing here, and the whole-document PATCH accepts that slice back only as it was read.", - "operationId": "documentsV2GetApp", + "operationId": "documentsGetApp", "summary": "Read app content", "tags": [ "Documents" @@ -52485,7 +53104,7 @@ "/api/v2/documents/{identifier}/draft/{draftIdentifier}/app": { "get": { "description": "**Alpha.** The app sub-resource may change shape without a deprecation cycle while apps mature. The document routes are stable.\n\nRead the app content on a named draft — the draft-side counterpart of `GET …/app`, and the read half of the draft write loop: app writes are last-write-wins whole-document replaces, so fetch the draft’s latest HTML here before building the next `PUT …/draft/{draftIdentifier}/app` body. Same response shape as the published read. Writes cap the HTML at 2 MiB — apps saved before the cap may read back larger, and a body over the cap is rejected on the way back in. The published document’s content is unaffected by draft edits — read it via `GET …/app`.\n\nA draft with no app is a 404 — including a draft that carries a dashboard, which can never carry an app.\n\nA document carries at most one of a dashboard or an app — never both; workbook-only is valid. The app HTML and settings live only at the app sub-resource routes; the document read carries an `app` slice pointing here, and the whole-document PATCH accepts that slice back only as it was read.", - "operationId": "documentsV2GetDraftApp", + "operationId": "documentsGetDraftApp", "summary": "Read app content on a draft", "tags": [ "Documents" @@ -52557,8 +53176,8 @@ } }, "put": { - "description": "**Alpha.** The app sub-resource may change shape without a deprecation cycle while apps mature. The document routes are stable.\n\nReplace the app HTML on an existing draft — creating the app when the draft is workbook-only — optionally replacing the app `settings` in the same call. Operates only on the draft named by `draftIdentifier`, which the caller creates first via `PATCH …/draft`; a published app is never addressable for writing, so every edit is draft-then-publish by construction. No auto-publish — publish via `POST …/draft/publish`.\n\nLast-write-wins, like every app write in the UI: the body is applied as given, with no expected-version precondition. Every write appends an immutable `app_history` revision, so nothing is lost — only the head moves.\n\nWrites never reject on app policy. External `