From bbd051e22fa4094d948b6e525609210b8ccb6a64 Mon Sep 17 00:00:00 2001 From: Rani Gangwar Date: Thu, 11 Jun 2026 14:57:06 +0530 Subject: [PATCH 1/8] style apis --- modules/ROOT/pages/customize-style-api.adoc | 157 ++++++++++++++++++++ modules/ROOT/pages/style-customization.adoc | 6 +- 2 files changed, 162 insertions(+), 1 deletion(-) create mode 100644 modules/ROOT/pages/customize-style-api.adoc diff --git a/modules/ROOT/pages/customize-style-api.adoc b/modules/ROOT/pages/customize-style-api.adoc new file mode 100644 index 000000000..27080a603 --- /dev/null +++ b/modules/ROOT/pages/customize-style-api.adoc @@ -0,0 +1,157 @@ += Customize UI layout and styles through REST APIs +:toc: true +:toclevels: 1 + +:page-title: Customize styles and layout through REST APIs +:page-pageid: style-customization-apis +:page-description: Customize styles, design, and layout of embedded ThoughtSpot app using REST APIs + +ThoughtSpot introduces a new set of REST API v2.0 endpoints to manage style customization settings programmatically. +These endpoints expose all branding and theming controls available in the *Develop* > *Customizations* > *Styles* page in the ThoughtSpot UI, enabling developers and administrators to automate branding and white-labeling — including across multiple Orgs on a multi-tenant cluster — without logging in to the ThoughtSpot UI. + +== Style customization REST APIs + +// SOURCE: SCAL-293070, SCAL-293071 + +//[earlyAccess eaBackground]#Early Access# + +ThoughtSpot provides REST API v2.0 endpoints to manage style customization settings programmatically. These APIs expose the same branding and theming controls available in the *Develop* > *Customizations* > *Styles* page, enabling you to automate branding and white-labeling — including across multiple Orgs — without logging in to the ThoughtSpot UI. + +[NOTE] +==== +All style customization API endpoints require administrator privileges. API calls from non-administrator users return `403 Forbidden`. +==== + +=== Style configuration + +Use the following endpoints to search and update style settings at the cluster or Org scope. + +Search style configuration:: +`POST /api/rest/2.0/customization/styles/search` + +Returns the current style configuration for the cluster and the active Org. + +When called from the Primary Org (Org 0), the response returns one record with `"scope": "CLUSTER"` and one with `"scope": "ORG"`. + +Update style configuration:: +`POST /api/rest/2.0/customization/styles/update` + +Updates one or more style settings. Supports the following parameters: + +[cols="2,1,4"] +|===== +|Parameter|Required|Description +|`scope`|Yes|`CLUSTER` or `ORG`. +|`org_identifier`|Conditional|Required when `scope` is `ORG`. +|`operation`|Yes|`REPLACE` overwrites existing settings. `MERGE` applies only the specified fields. +|`navigation_panel`|No|Top navigation panel color. Use `"theme": "CUSTOM"` with a valid hex value in `"base_color"`. +|`chart_color_palette`|No|Array of hex color values for charts. +|`embedded_footer_text`|No|Footer text for embedded content. +|`visualization_fonts`|No|Font assignments for visualization elements. +|`default_logo`|No|Binary image file for the square application logo. +|`wide_logo`|No|Binary image file for the wide logo (email and PDF exports). +|`reset_options`|No|Resets specified settings to ThoughtSpot defaults. +|===== + +=== Custom fonts + +Upload a custom font:: +`POST /api/rest/2.0/customization/styles/fonts/upload` + +Uploads a font file (multipart/form-data). + +Required: `name`, `file_content`. + +Optional: `weight`, `style`, `color`. + +Search custom fonts:: +`POST /api/rest/2.0/customization/styles/fonts/search` + +Returns custom fonts uploaded to the instance. + +Optional filters: `font_identifier`, `name_pattern`, `include_font_assignments`. + +Update a custom font:: +`PUT /api/rest/2.0/customization/styles/fonts/{font_identifier}` + +Updates an existing font's display name, weight, style, or color. + +Delete custom fonts:: +`POST /api/rest/2.0/customization/styles/fonts/delete` + +Deletes one or more custom fonts from the font library. Supply one or more font GUIDs or display names in `font_identifiers`. + ++ +[IMPORTANT] +==== +`dry_run` defaults to `true`. In dry-run mode, the API computes and returns all affected visualization assignments but does *not* delete the fonts. Set `dry_run: false` to commit the deletion. +==== ++ +When a font is deleted, all visualization areas that used it are automatically reset to the system default font. The response body lists these affected assignments grouped by Org. + +=== Logo export + +Export logos:: +`POST /api/rest/2.0/customization/styles/logos/export` + +Exports the configured logo files as a ZIP archive containing the default and wide logo images. + +=== Example: Update navigation panel color + +The following example updates the top navigation panel to a custom color at the cluster scope: + +[source,JSON] +---- +POST /api/rest/2.0/customization/styles/update + +{ + "scope": "CLUSTER", + "operation": "REPLACE", + "navigation_panel": { + "theme": "CUSTOM", + "base_color": "#1A2B3C" + } +} +---- + +=== Example: Update chart color palette for an Org + +[source,JSON] +---- +POST /api/rest/2.0/customization/styles/update + +{ + "scope": "ORG", + "org_identifier": "", + "operation": "MERGE", + "chart_color_palette": { + "colors": ["#FF6B35", "#004E89", "#1A936F", "#C6D8D3", "#F18F01"] + } +} +---- + +=== Example: Dry-run delete to preview affected assignments + +Use `dry_run: true` (the default) to preview which visualization areas will be affected before committing a font deletion: + +// SOURCE: entity/FontDeleteRequest.java (dev/scaligent, master) +[source,JSON] +---- +POST /api/rest/2.0/customization/styles/fonts/delete + +{ + "scope": "CLUSTER", + "font_identifiers": ["", ""], + "dry_run": true +} +---- + +Example response: + +[source,JSON] +---- +{ + "affected_assignments": [ + { + "visualization_areas": ["CHART_LABEL", "CHART_AXIS"] + }, + { + "org": { "id": 3, "name": "Sales Org" }, + "visualization_areas": ["TABLE_HEADER"] + } + ] +} +---- + +To commit the deletion, repeat the request with `"dry_run": false`. + + +For a full list of REST API v2.0 style customization endpoints and their parameters, see xref:rest-apiv2-changelog.adoc[REST API v2.0 changelog]. \ No newline at end of file diff --git a/modules/ROOT/pages/style-customization.adoc b/modules/ROOT/pages/style-customization.adoc index 0816f9ac1..2f59afd9b 100644 --- a/modules/ROOT/pages/style-customization.adoc +++ b/modules/ROOT/pages/style-customization.adoc @@ -25,9 +25,13 @@ Custom CSS allows developers to override the default styles and UI element speci + To customize themes and variables in the CSS file, developers must know the basics of HTML and CSS framework and how to build custom themes. For more information, see xref:css-customization.adoc[Advanced customization with custom CSS]. - A xref:style-customization_tutorial.adoc[hands-on tutorial] is also available to learn how to test style customization capabilities using Visual Embed Playground. +Style customization through the REST APIs:: +You can manage style customization settings programmatically by using the ThoughtSpot REST APIs. +These endpoints expose all branding and theming controls available in the ThoughtSpot UI. For more information, see xref:xref:customize-style-api.adoc[Customize UI layout and styles through REST APIs] + + == Scope of customization The following table lists the customizable elements: From 9007ec06e2f6b909b5bd06cfc246144f1dc78430 Mon Sep 17 00:00:00 2001 From: Rani Gangwar Date: Wed, 17 Jun 2026 10:21:25 +0530 Subject: [PATCH 2/8] style apis --- modules/ROOT/pages/common/nav-embedding.adoc | 1 + modules/ROOT/pages/customize-style-api.adoc | 374 ++++++++++++++----- modules/ROOT/pages/rest-apiv2-changelog.adoc | 53 +++ modules/ROOT/pages/style-customization.adoc | 9 +- modules/ROOT/pages/whats-new.adoc | 19 + 5 files changed, 357 insertions(+), 99 deletions(-) diff --git a/modules/ROOT/pages/common/nav-embedding.adoc b/modules/ROOT/pages/common/nav-embedding.adoc index c5a64bbb4..a09b4ca96 100644 --- a/modules/ROOT/pages/common/nav-embedding.adoc +++ b/modules/ROOT/pages/common/nav-embedding.adoc @@ -46,6 +46,7 @@ Customize and integrate * link:{{navprefix}}/style-customization[Customize UI layout and styles] ** link:{{navprefix}}/customize-style[Customize basic styles] +** link:{{navprefix}}/style-customization-apis[Customize styles through APIs] ** link:{{navprefix}}/custom-css[CSS customization framework] ** link:{{navprefix}}/theme-builder-doc[Theme builder] ** link:{{navprefix}}/customize-icons[Customize icons] diff --git a/modules/ROOT/pages/customize-style-api.adoc b/modules/ROOT/pages/customize-style-api.adoc index 27080a603..dc7a6bf18 100644 --- a/modules/ROOT/pages/customize-style-api.adoc +++ b/modules/ROOT/pages/customize-style-api.adoc @@ -1,16 +1,11 @@ = Customize UI layout and styles through REST APIs :toc: true -:toclevels: 1 +:toclevels: 2 :page-title: Customize styles and layout through REST APIs :page-pageid: style-customization-apis :page-description: Customize styles, design, and layout of embedded ThoughtSpot app using REST APIs -ThoughtSpot introduces a new set of REST API v2.0 endpoints to manage style customization settings programmatically. -These endpoints expose all branding and theming controls available in the *Develop* > *Customizations* > *Styles* page in the ThoughtSpot UI, enabling developers and administrators to automate branding and white-labeling — including across multiple Orgs on a multi-tenant cluster — without logging in to the ThoughtSpot UI. - -== Style customization REST APIs - // SOURCE: SCAL-293070, SCAL-293071 //[earlyAccess eaBackground]#Early Access# @@ -19,139 +14,330 @@ ThoughtSpot provides REST API v2.0 endpoints to manage style customization setti [NOTE] ==== -All style customization API endpoints require administrator privileges. API calls from non-administrator users return `403 Forbidden`. +All style customization API endpoints require administrator or developer privileges. ==== === Style configuration Use the following endpoints to search and update style settings at the cluster or Org scope. -Search style configuration:: -`POST /api/rest/2.0/customization/styles/search` + -Returns the current style configuration for the cluster and the active Org. + +==== Search style configuration +To get the current style configuration for the cluster and the active Org send an API request to `POST /api/rest/2.0/customization/styles/search` endpoint. When called from the Primary Org (Org 0), the response returns one record with `"scope": "CLUSTER"` and one with `"scope": "ORG"`. -Update style configuration:: -`POST /api/rest/2.0/customization/styles/update` + -Updates one or more style settings. Supports the following parameters: +==== Update style configuration +To update the style settings send an API request to `POST /api/rest/2.0/customization/styles/update` endpoint. +Request parameters:: [cols="2,1,4"] |===== |Parameter|Required|Description |`scope`|Yes|`CLUSTER` or `ORG`. -|`org_identifier`|Conditional|Required when `scope` is `ORG`. -|`operation`|Yes|`REPLACE` overwrites existing settings. `MERGE` applies only the specified fields. +//|`org_identifier`|Conditional|Required when `scope` is `ORG`. +|`operation`|Yes|`REPLACE` overwrites existing settings. `RESET` reverts specific fields to defaults. |`navigation_panel`|No|Top navigation panel color. Use `"theme": "CUSTOM"` with a valid hex value in `"base_color"`. -|`chart_color_palette`|No|Array of hex color values for charts. +|`chart_color_palette`|No|Array of hex color values for charts. When provided with `REPLACE`, exactly 8 color entries must be specified in colors. |`embedded_footer_text`|No|Footer text for embedded content. -|`visualization_fonts`|No|Font assignments for visualization elements. +|`visualization_fonts`|No|Font assignments for visualization elements. Provide only the areas to update; omitted areas remain unchanged. |`default_logo`|No|Binary image file for the square application logo. |`wide_logo`|No|Binary image file for the wide logo (email and PDF exports). |`reset_options`|No|Resets specified settings to ThoughtSpot defaults. |===== +Example request:: To set a custom navigation panel color at cluster scope + + +[source,cURL] +---- +curl -X POST \ + --url 'https://{ThoughtSpot-Host}/api/rest/2.0/customization/styles/update' \ + -H 'Authorization: Bearer {access-token}'\ + -H 'Accept: application/json'\ + -H 'Content-Type: application/json' \ + --data-raw '{ + "scope": "CLUSTER", + "operation": "REPLACE", + "navigation_panel": { + "theme": "CUSTOM", + "base_color": "#2359B6" + } +} +---- + +Example request:: To update chart color palette for a specific Org (MERGE) + +[source,cURL] +---- +curl -X POST \ + --url 'https://{ThoughtSpot-Host}/api/rest/2.0/customization/styles/update' \ + -H 'Authorization: Bearer {access-token}'\ + -H 'Accept: application/json'\ + -H 'Content-Type: application/json' \ + --data-raw '{ + "scope": "ORG", + "org_identifier": "Sales Org", + "operation": "REPLACE", + "chart_color_palette": { + "colors": [ + {"color": "#FF6B35"}, + {"color": "#004E89"}, + {"color": "#1A936F"}, + {"color": "#C6D8D3"}, + {"color": "#F18F01"}, + {"color": "#8B4513"}, + {"color": "#6A0572"}, + {"color": "#2E8B57"} + ], + "disable_color_rotation": false + } +} +---- + === Custom fonts -Upload a custom font:: -`POST /api/rest/2.0/customization/styles/fonts/upload` + -Uploads a font file (multipart/form-data). + -Required: `name`, `file_content`. + -Optional: `weight`, `style`, `color`. - -Search custom fonts:: -`POST /api/rest/2.0/customization/styles/fonts/search` + -Returns custom fonts uploaded to the instance. + -Optional filters: `font_identifier`, `name_pattern`, `include_font_assignments`. - -Update a custom font:: -`PUT /api/rest/2.0/customization/styles/fonts/{font_identifier}` + -Updates an existing font's display name, weight, style, or color. - -Delete custom fonts:: -`POST /api/rest/2.0/customization/styles/fonts/delete` + -Deletes one or more custom fonts from the font library. Supply one or more font GUIDs or display names in `font_identifiers`. + -+ -[IMPORTANT] -==== -`dry_run` defaults to `true`. In dry-run mode, the API computes and returns all affected visualization assignments but does *not* delete the fonts. Set `dry_run: false` to commit the deletion. -==== -+ -When a font is deleted, all visualization areas that used it are automatically reset to the system default font. The response body lists these affected assignments grouped by Org. +==== Upload a custom font +To upload a font file (multipart/form-data) send an API request to `POST /api/rest/2.0/customization/styles/fonts/upload` endpoint. -=== Logo export +Request parameters:: + +[cols="2,1,4"] +|===== +|Parameter|Required|Description + +|`scope` +|No +|Scope of the font library. Valid values: `CLUSTER`, `ORG`. +Defaults to `ORG` when Orgs are enabled; defaults to `CLUSTER` when Orgs are disabled. + +|`org_identifier` +|Conditional +|Unique ID or name of the Org. Applicable only when `scope` is `ORG`. +Defaults to the currently logged-in user's Org if omitted. + +|`name` +|Yes +|Display name for the font. Must be unique within the target scope. -Export logos:: -`POST /api/rest/2.0/customization/styles/logos/export` + -Exports the configured logo files as a ZIP archive containing the default and wide logo images. +|`file_content` +|Yes +|Binary font file. Accepted formats: WOFF and WOFF2 only. -=== Example: Update navigation panel color +|`weight` +|No +|Font weight. Valid values: `NORMAL`, `LIGHT`, `BOLD`. -The following example updates the top navigation panel to a custom color at the cluster scope: +|`style` +|No +|Font style. Valid values: `NORMAL`, `ITALIC`, `OBLIQUE`. -[source,JSON] +|`color` +|No +|Default color for the font as a 6-digit hex string. Example: `#333333`. + +|===== + +Example Request:: +[source,cURL] ---- -POST /api/rest/2.0/customization/styles/update - -{ - "scope": "CLUSTER", - "operation": "REPLACE", - "navigation_panel": { - "theme": "CUSTOM", - "base_color": "#1A2B3C" - } -} +curl -X POST 'https://{your-thoughtspot-host}/api/rest/2.0/customization/styles/fonts/upload' \ +-H 'Authorization: Bearer {token}' \ +-H 'Accept: application/json' \ +-F 'name=Acme Sans' \ +-F 'weight=BOLD' \ +-F 'style=NORMAL' \ +-F 'color=#333333' \ +-F 'file_content=@/path/to/acme-sans-bold.woff2' ---- -=== Example: Update chart color palette for an Org -[source,JSON] +==== Search style fonts +To get custom fonts uploaded to the instance or the Org, send an API request to the `POST /api/rest/2.0/customization/styles/fonts/search` endpoint. + +Request parameter:: +[cols="2,1,4"] +|===== +|Parameter|Required|Description + +|`scope` +|Yes +|Scope of the font library. Valid values: `CLUSTER`, `ORG`. + + +//// +|`org_identifier` +|Conditional +|Unique ID or name of the Org. Applicable only when `scope` is `ORG`. +Defaults to the caller's active Org if omitted. +//// + + +|`font_identifier` +|No +|Filter by exact font GUID or exact display name (case-insensitive). +Cannot be used together with `name_pattern`. + +|`name_pattern` +|No +|Filter by partial, case-insensitive substring match on font display name. +Cannot be used together with `font_identifier`. + +|`include_font_assignments` +|No +|If `true`, each font in the response includes the visualization areas it is assigned to. +Default: `false`. + +|===== + +Example API request:: +Return all fonts with their visualization assignments + +[source,cURL] ---- -POST /api/rest/2.0/customization/styles/update - -{ - "scope": "ORG", - "org_identifier": "", - "operation": "MERGE", - "chart_color_palette": { - "colors": ["#FF6B35", "#004E89", "#1A936F", "#C6D8D3", "#F18F01"] - } +curl -X POST \ + --url 'https://{ThoughtSpot-Host}/api/rest/2.0/customization/styles/fonts/search' \ + -H 'Authorization: Bearer {access-token}'\ + -H 'Accept: application/json'\ + -H 'Content-Type: application/json' \ + --data-raw '{ + "scope": "CLUSTER", + "include_font_assignments": true } ---- +Example API request:: Filter by name pattern +[source,cURL] +---- +curl -X POST \ + --url 'https://{ThoughtSpot-Host}/api/rest/2.0/customization/styles/fonts/search' \ + -H 'Authorization: Bearer {access-token}'\ + -H 'Accept: application/json'\ + -H 'Content-Type: application/json' \ + --data-raw '{ + "scope": "ORG", + "org_identifier": "Sales Org", + "name_pattern": "acme", + "include_font_assignments": false +} +---- + +==== Update a custom font +To update an existing font's display name, weight, style, or color send an API request to the `POST /api/rest/2.0/customization/styles/fonts/{font_identifier}/update` endpoint. -=== Example: Dry-run delete to preview affected assignments +Request parameters:: -Use `dry_run: true` (the default) to preview which visualization areas will be affected before committing a font deletion: +[cols="2,1,4"] +|===== +|Parameter|Required|Description + +|`font_identifier` +|Yes +|GUID or display name of the font to update. Passed as a path parameter. + +|`scope` +|Yes +|Scope of the font library. Valid values: `CLUSTER`, `ORG`. -// SOURCE: entity/FontDeleteRequest.java (dev/scaligent, master) -[source,JSON] +|`name` +|No +|New display name for the font. Omit to leave unchanged. + +|`weight` +|No +|Updated font weight. Valid values: `NORMAL`, `LIGHT`, `BOLD`. +Omit to leave unchanged. + +|`style` +|No +|Updated font style. Valid values: `NORMAL`, `ITALIC`, `OBLIQUE`. +Omit to leave unchanged. + +|`color` +|No +|Updated default color as a 6-digit hex string. Example: `#333333`. +Omit to leave unchanged. + +|===== + +Example API request:: Filter by name pattern +[source,cURL] ---- -POST /api/rest/2.0/customization/styles/fonts/delete +curl -X POST \ + --url 'https://{ThoughtSpot-Host}/api/rest/2.0/customization/styles/fonts/a1b2c3d4-e5f6-7890-abcd-ef1234567890/update' \ + -H 'Authorization: Bearer {access-token}'\ + -H 'Accept: application/json'\ + -H 'Content-Type: application/json' \ + --data-raw '{ + "scope": "CLUSTER", + "name": "Acme Sans Revised", + "weight": "SEMI_BOLD", + "color": "#111111" + } -{ - "scope": "CLUSTER", - "font_identifiers": ["", ""], - "dry_run": true -} ---- -Example response: +==== Delete custom fonts +To delete one or more custom fonts from the font library send an API request to the `POST /api/rest/2.0/customization/styles/fonts/delete` endpoint. + +Request parameter:: +[cols="2,1,4"] +|===== +|Parameter|Required|Description + +|`scope` +|Yes +|Scope of the font library. Valid values: `CLUSTER`, `ORG`. + + +//// +|`org_identifier` +|Conditional +|Unique ID or name of the Org. Applicable only when `scope` is `ORG`. +Defaults to the caller's active Org if omitted. +//// -[source,JSON] + +|`font_identifiers` +|Yes +|List of font GUIDs or display names to delete. +Duplicate values are deduplicated automatically. + +|`dry_run` +|No +|If `true`, returns the list of affected visualization assignments without deleting any fonts. When a font is deleted, all visualization areas that used it are automatically reset to the system default font. +Default: `true`. Set to `false` to commit the deletion. + +|===== +Example API request:: + +[source,cURL] ---- -{ - "affected_assignments": [ - { - "visualization_areas": ["CHART_LABEL", "CHART_AXIS"] - }, - { - "org": { "id": 3, "name": "Sales Org" }, - "visualization_areas": ["TABLE_HEADER"] - } - ] +curl -X POST \ + --url 'https://{ThoughtSpot-Host}/api/rest/2.0/customization/styles/fonts/delete' \ + -H 'Authorization: Bearer {access-token}'\ + -H 'Accept: application/json'\ + -H 'Content-Type: application/json' \ + --data-raw '{ + "scope": "CLUSTER", + "font_identifiers": [ + "a1b2c3d4-e5f6-7890-abcd-ef1234567890", + "b2c3d4e5-f6a7-8901-bcde-f12345678901" + ], + "dry_run": true } ---- -To commit the deletion, repeat the request with `"dry_run": false`. +=== Logo export +To get the configured logos at the requested scope as a ZIP archive containing the default and wide logo images, send an API request to the `POST /api/rest/2.0/customization/styles/logos/export` endpoint. +Example API request:: -For a full list of REST API v2.0 style customization endpoints and their parameters, see xref:rest-apiv2-changelog.adoc[REST API v2.0 changelog]. \ No newline at end of file +[source,cURL] +---- +curl -X POST \ + --url 'https://{ThoughtSpot-Host}/api/rest/2.0/customization/styles/fonts/delete' \ + -H 'Authorization: Bearer {access-token}'\ + -H 'Accept: application/json'\ + -H 'Content-Type: application/json' \ + --data-raw '{ + "scope": "CLUSTER" +} +---- \ No newline at end of file diff --git a/modules/ROOT/pages/rest-apiv2-changelog.adoc b/modules/ROOT/pages/rest-apiv2-changelog.adoc index 7c9ecbe95..42687cb35 100644 --- a/modules/ROOT/pages/rest-apiv2-changelog.adoc +++ b/modules/ROOT/pages/rest-apiv2-changelog.adoc @@ -8,6 +8,59 @@ This changelog lists the features and enhancements introduced in REST API v2.0. For information about new features and enhancements available for embedded analytics, see xref:whats-new.adoc[What's New]. +== Version 26.7.0.cl, July 2026 + +=== Style customization APIs + +// SOURCE: SCAL-293070, SCAL-293071 + +ThoughtSpot introduces REST API v2.0 endpoints to manage style customization settings programmatically. + +Style configuration:: + +* `POST /api/rest/2.0/customization/styles/search` + +Returns the current style configuration at the `CLUSTER` or active `ORG` scope. + +* `POST /api/rest/2.0/customization/styles/update` + +Updates style settings at the `CLUSTER` or `ORG` scope. + +//// +Supports updating the navigation panel color, chart color palette, logos, embedded footer text, and visualization font assignments. +Use `operation: REPLACE` to overwrite existing settings, or `operation: MERGE` to apply only the fields specified in the request. +//// + +Custom fonts:: + +* `POST /api/rest/2.0/customization/styles/fonts/upload` + +Uploads a custom font file to ThoughtSpot. + +* `POST /api/rest/2.0/customization/styles/fonts/search` + +Returns custom fonts uploaded to the instance. +//Use the `include_font_assignments` parameter to include information about which visualization elements each font is assigned to. + +* `PUT /api/rest/2.0/customization/styles/fonts/{font_identifier}` + +Updates the display name, weight, style, or color of an existing custom font. + +* `POST /api/rest/2.0/customization/styles/fonts/delete` + +Deletes one or more custom fonts from the font library. + +//// +When a deleted font is assigned to visualization areas, those assignments are automatically reset to the system default font. +The response lists all affected assignments, grouped by Org. ++ +[IMPORTANT] +==== +The `dry_run` parameter defaults to `true`. In dry-run mode, the API returns the list of affected assignments but does *not* delete the fonts. Set `dry_run: false` to commit the deletion. +==== +//// + +Logo export:: + +* `POST /api/rest/2.0/customization/styles/logos/export` + +Exports the current logo files as a ZIP archive containing the default logo and the wide logo. + +For more information, see xref:style-customization.adoc[Customize UI layout and styles]. + == Version 26.6.0.cl, June 2026 === Spotter AI APIs diff --git a/modules/ROOT/pages/style-customization.adoc b/modules/ROOT/pages/style-customization.adoc index 2f59afd9b..6fd53a71e 100644 --- a/modules/ROOT/pages/style-customization.adoc +++ b/modules/ROOT/pages/style-customization.adoc @@ -20,6 +20,10 @@ You can customize key UI components, such as your application logo, favicon, fon Custom CSS changes take precedence and override the style customization settings applied via UI. ==== +Style customization through the REST APIs:: +You can manage style customization settings programmatically by using the ThoughtSpot REST APIs. +These endpoints expose all branding and theming controls available in the ThoughtSpot UI. For more information, see xref:xref:customize-style-api.adoc[Customize UI layout and styles through REST APIs] + Advanced style customization with custom CSS:: Custom CSS allows developers to override the default styles and UI element specifications in their deployments. Custom CSS provides granular control over the UI appearance and allows you to modify design elements such as buttons, labels, text styles, and typography. This feature is available only with the ThoughtSpot Embedded Edition license. + @@ -27,11 +31,6 @@ To customize themes and variables in the CSS file, developers must know the basi A xref:style-customization_tutorial.adoc[hands-on tutorial] is also available to learn how to test style customization capabilities using Visual Embed Playground. -Style customization through the REST APIs:: -You can manage style customization settings programmatically by using the ThoughtSpot REST APIs. -These endpoints expose all branding and theming controls available in the ThoughtSpot UI. For more information, see xref:xref:customize-style-api.adoc[Customize UI layout and styles through REST APIs] - - == Scope of customization The following table lists the customizable elements: diff --git a/modules/ROOT/pages/whats-new.adoc b/modules/ROOT/pages/whats-new.adoc index 6320f0913..a2d067bac 100644 --- a/modules/ROOT/pages/whats-new.adoc +++ b/modules/ROOT/pages/whats-new.adoc @@ -23,6 +23,25 @@ This page lists new features, enhancements, and deprecated functionality introdu // *Affects:* Developers, Administrators, End Users // ============================================================ +== July 2026 + +**Release version**: ThoughtSpot Cloud 26.7.0.cl + +*Upgrade notes*: No breaking changes. + +*Recommended SDK versions*: Visual Embed SDK v1.50.0 and later + +[.cl-table, cols="2,4", frame=none, grid=none] +|===== +a| +[.cl-label] +*Version 26.7.0.cl* + +[discrete] +==== REST API v2 +This release introduces new API endpoints for style customization. For information about REST API v2 enhancements, see the xref:rest-apiv2-changelog.adoc[REST API v2.0 changelog]. +--- + +|===== + == June 2026 **Release version**: ThoughtSpot Cloud 26.6.0.cl + From c9217f369bfdbc77c4bfce210cfb2cc2f87cf67f Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Wed, 17 Jun 2026 11:42:44 +0530 Subject: [PATCH 3/8] nav edits --- modules/ROOT/pages/common/nav-embedding.adoc | 1 - modules/ROOT/pages/common/nav-rest-api.adoc | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ROOT/pages/common/nav-embedding.adoc b/modules/ROOT/pages/common/nav-embedding.adoc index a09b4ca96..c5a64bbb4 100644 --- a/modules/ROOT/pages/common/nav-embedding.adoc +++ b/modules/ROOT/pages/common/nav-embedding.adoc @@ -46,7 +46,6 @@ Customize and integrate * link:{{navprefix}}/style-customization[Customize UI layout and styles] ** link:{{navprefix}}/customize-style[Customize basic styles] -** link:{{navprefix}}/style-customization-apis[Customize styles through APIs] ** link:{{navprefix}}/custom-css[CSS customization framework] ** link:{{navprefix}}/theme-builder-doc[Theme builder] ** link:{{navprefix}}/customize-icons[Customize icons] diff --git a/modules/ROOT/pages/common/nav-rest-api.adoc b/modules/ROOT/pages/common/nav-rest-api.adoc index a9fec3165..7f2eb985e 100644 --- a/modules/ROOT/pages/common/nav-rest-api.adoc +++ b/modules/ROOT/pages/common/nav-rest-api.adoc @@ -24,6 +24,7 @@ REST APIs *** link:{{navprefix}}/spotter-agent-apis[AI APIs (Spotter Agent and Spotter 3)] *** link:{{navprefix}}/spotter-apis-classic[AI APIs (Spotter Classic) ^BETA^] *** link:{{navprefix}}/spotter-coaching-apis[Spotter coaching APIs ^BETA^] +** link:{{navprefix}}/style-customization-apis[Customize styles using APIs] ** link:{{navprefix}}/audit-logs[Audit logs] ** link:{{navprefix}}/tml[TML] ** link:{{navprefix}}/collections[Collections ^BETA^] From 20b9dcd4615a0b24a99c3f04f75a3159840d5b99 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Wed, 17 Jun 2026 11:47:39 +0530 Subject: [PATCH 4/8] commented text in tables --- modules/ROOT/pages/customize-style-api.adoc | 33 +++++++++++---------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/modules/ROOT/pages/customize-style-api.adoc b/modules/ROOT/pages/customize-style-api.adoc index dc7a6bf18..ce56b295a 100644 --- a/modules/ROOT/pages/customize-style-api.adoc +++ b/modules/ROOT/pages/customize-style-api.adoc @@ -163,14 +163,6 @@ Request parameter:: |Scope of the font library. Valid values: `CLUSTER`, `ORG`. -//// -|`org_identifier` -|Conditional -|Unique ID or name of the Org. Applicable only when `scope` is `ORG`. -Defaults to the caller's active Org if omitted. -//// - - |`font_identifier` |No |Filter by exact font GUID or exact display name (case-insensitive). @@ -188,6 +180,14 @@ Default: `false`. |===== +//// +|`org_identifier` +|Conditional +|Unique ID or name of the Org. Applicable only when `scope` is `ORG`. +Defaults to the caller's active Org if omitted. +//// + + Example API request:: Return all fonts with their visualization assignments @@ -287,14 +287,6 @@ Request parameter:: |Scope of the font library. Valid values: `CLUSTER`, `ORG`. -//// -|`org_identifier` -|Conditional -|Unique ID or name of the Org. Applicable only when `scope` is `ORG`. -Defaults to the caller's active Org if omitted. -//// - - |`font_identifiers` |Yes |List of font GUIDs or display names to delete. @@ -306,6 +298,15 @@ Duplicate values are deduplicated automatically. Default: `true`. Set to `false` to commit the deletion. |===== + +//// +|`org_identifier` +|Conditional +|Unique ID or name of the Org. Applicable only when `scope` is `ORG`. +Defaults to the caller's active Org if omitted. +//// + + Example API request:: [source,cURL] From f075e064213ebf66190cb1865adebc8e52e25759 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Wed, 17 Jun 2026 12:51:44 +0530 Subject: [PATCH 5/8] table issue fix --- modules/ROOT/pages/whats-new.adoc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/ROOT/pages/whats-new.adoc b/modules/ROOT/pages/whats-new.adoc index a2d067bac..b18e195b1 100644 --- a/modules/ROOT/pages/whats-new.adoc +++ b/modules/ROOT/pages/whats-new.adoc @@ -35,9 +35,11 @@ a| [.cl-label] *Version 26.7.0.cl* +a| [discrete] ==== REST API v2 This release introduces new API endpoints for style customization. For information about REST API v2 enhancements, see the xref:rest-apiv2-changelog.adoc[REST API v2.0 changelog]. + --- |===== From 331ff9b86af808a59acdb18a9af4436c579be2f3 Mon Sep 17 00:00:00 2001 From: Rani Gangwar Date: Wed, 17 Jun 2026 13:50:59 +0530 Subject: [PATCH 6/8] edits to style apis --- modules/ROOT/pages/common/nav-rest-api.adoc | 2 +- modules/ROOT/pages/customize-style-api.adoc | 27 +++++++++------------ 2 files changed, 12 insertions(+), 17 deletions(-) diff --git a/modules/ROOT/pages/common/nav-rest-api.adoc b/modules/ROOT/pages/common/nav-rest-api.adoc index 7f2eb985e..a0220ffb6 100644 --- a/modules/ROOT/pages/common/nav-rest-api.adoc +++ b/modules/ROOT/pages/common/nav-rest-api.adoc @@ -24,7 +24,7 @@ REST APIs *** link:{{navprefix}}/spotter-agent-apis[AI APIs (Spotter Agent and Spotter 3)] *** link:{{navprefix}}/spotter-apis-classic[AI APIs (Spotter Classic) ^BETA^] *** link:{{navprefix}}/spotter-coaching-apis[Spotter coaching APIs ^BETA^] -** link:{{navprefix}}/style-customization-apis[Customize styles using APIs] +** link:{{navprefix}}/style-customization-apis[Style customization APIs] ** link:{{navprefix}}/audit-logs[Audit logs] ** link:{{navprefix}}/tml[TML] ** link:{{navprefix}}/collections[Collections ^BETA^] diff --git a/modules/ROOT/pages/customize-style-api.adoc b/modules/ROOT/pages/customize-style-api.adoc index ce56b295a..80c485cf3 100644 --- a/modules/ROOT/pages/customize-style-api.adoc +++ b/modules/ROOT/pages/customize-style-api.adoc @@ -1,4 +1,4 @@ -= Customize UI layout and styles through REST APIs += Style customization APIs :toc: true :toclevels: 2 @@ -8,7 +8,6 @@ // SOURCE: SCAL-293070, SCAL-293071 -//[earlyAccess eaBackground]#Early Access# ThoughtSpot provides REST API v2.0 endpoints to manage style customization settings programmatically. These APIs expose the same branding and theming controls available in the *Develop* > *Customizations* > *Styles* page, enabling you to automate branding and white-labeling — including across multiple Orgs — without logging in to the ThoughtSpot UI. @@ -27,6 +26,7 @@ When called from the Primary Org (Org 0), the response returns one record with ` ==== Update style configuration To update the style settings send an API request to `POST /api/rest/2.0/customization/styles/update` endpoint. + Request parameters:: [cols="2,1,4"] @@ -44,7 +44,7 @@ Request parameters:: |`reset_options`|No|Resets specified settings to ThoughtSpot defaults. |===== -Example request:: To set a custom navigation panel color at cluster scope +Example API request:: To set a custom navigation panel color at cluster scope [source,cURL] @@ -64,7 +64,7 @@ curl -X POST \ } ---- -Example request:: To update chart color palette for a specific Org (MERGE) +Example API request:: To update chart color palette for a specific Org (MERGE) [source,cURL] ---- @@ -104,16 +104,6 @@ Request parameters:: |===== |Parameter|Required|Description -|`scope` -|No -|Scope of the font library. Valid values: `CLUSTER`, `ORG`. -Defaults to `ORG` when Orgs are enabled; defaults to `CLUSTER` when Orgs are disabled. - -|`org_identifier` -|Conditional -|Unique ID or name of the Org. Applicable only when `scope` is `ORG`. -Defaults to the currently logged-in user's Org if omitted. - |`name` |Yes |Display name for the font. Must be unique within the target scope. @@ -122,6 +112,11 @@ Defaults to the currently logged-in user's Org if omitted. |Yes |Binary font file. Accepted formats: WOFF and WOFF2 only. +|`scope` +|No +|Scope of the font library. Valid values: `CLUSTER`, `ORG`. +Defaults to `ORG` when Orgs are enabled; defaults to `CLUSTER` when Orgs are disabled. + |`weight` |No |Font weight. Valid values: `NORMAL`, `LIGHT`, `BOLD`. @@ -136,7 +131,7 @@ Defaults to the currently logged-in user's Org if omitted. |===== -Example Request:: +Example API request:: [source,cURL] ---- curl -X POST 'https://{your-thoughtspot-host}/api/rest/2.0/customization/styles/fonts/upload' \ @@ -334,7 +329,7 @@ Example API request:: [source,cURL] ---- curl -X POST \ - --url 'https://{ThoughtSpot-Host}/api/rest/2.0/customization/styles/fonts/delete' \ + --url 'https://{ThoughtSpot-Host}/api/rest/2.0/customization/styles/logos/export' \ -H 'Authorization: Bearer {access-token}'\ -H 'Accept: application/json'\ -H 'Content-Type: application/json' \ From ab2e87fcc3b9e3226df9ef1409d3ee7e3d9774c4 Mon Sep 17 00:00:00 2001 From: Rani Gangwar Date: Wed, 17 Jun 2026 14:21:09 +0530 Subject: [PATCH 7/8] edits to style apis1 --- modules/ROOT/pages/customize-style-api.adoc | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/modules/ROOT/pages/customize-style-api.adoc b/modules/ROOT/pages/customize-style-api.adoc index 80c485cf3..1298a6028 100644 --- a/modules/ROOT/pages/customize-style-api.adoc +++ b/modules/ROOT/pages/customize-style-api.adoc @@ -21,7 +21,7 @@ All style customization API endpoints require administrator or developer privile Use the following endpoints to search and update style settings at the cluster or Org scope. ==== Search style configuration -To get the current style configuration for the cluster and the active Org send an API request to `POST /api/rest/2.0/customization/styles/search` endpoint. +To get the current style configuration for the cluster and the active Org send an API request to `POST /api/rest/2.0/customization/styles/search` endpoint. When called from the Primary Org (Org 0), the response returns one record with `"scope": "CLUSTER"` and one with `"scope": "ORG"`. ==== Update style configuration @@ -64,7 +64,7 @@ curl -X POST \ } ---- -Example API request:: To update chart color palette for a specific Org (MERGE) +Example API request:: To update chart color palette for a specific Org (REPLACE) [source,cURL] ---- @@ -134,7 +134,7 @@ Defaults to `ORG` when Orgs are enabled; defaults to `CLUSTER` when Orgs are dis Example API request:: [source,cURL] ---- -curl -X POST 'https://{your-thoughtspot-host}/api/rest/2.0/customization/styles/fonts/upload' \ +curl -X POST 'https://{ThoughtSpot-Host}/api/rest/2.0/customization/styles/fonts/upload' \ -H 'Authorization: Bearer {token}' \ -H 'Accept: application/json' \ -F 'name=Acme Sans' \ @@ -145,7 +145,7 @@ curl -X POST 'https://{your-thoughtspot-host}/api/rest/2.0/customization/styles/ ---- -==== Search style fonts +==== Search custom fonts To get custom fonts uploaded to the instance or the Org, send an API request to the `POST /api/rest/2.0/customization/styles/fonts/search` endpoint. Request parameter:: @@ -252,7 +252,8 @@ Omit to leave unchanged. |===== -Example API request:: Filter by name pattern +Example API request:: + [source,cURL] ---- curl -X POST \ @@ -263,7 +264,7 @@ curl -X POST \ --data-raw '{ "scope": "CLUSTER", "name": "Acme Sans Revised", - "weight": "SEMI_BOLD", + "weight": "BOLD", "color": "#111111" } @@ -289,8 +290,8 @@ Duplicate values are deduplicated automatically. |`dry_run` |No -|If `true`, returns the list of affected visualization assignments without deleting any fonts. When a font is deleted, all visualization areas that used it are automatically reset to the system default font. -Default: `true`. Set to `false` to commit the deletion. +|If `true`, returns the list of affected visualization assignments without deleting any fonts. When a font is deleted, all visualization areas that used it are automatically reset to the system default font. Set to `false` to commit the deletion. +Default: `true`. |===== From 1fe798d1863a533a322201e6a81e3b64f09fcde7 Mon Sep 17 00:00:00 2001 From: Rani Gangwar Date: Wed, 17 Jun 2026 14:35:54 +0530 Subject: [PATCH 8/8] edits to changelog --- modules/ROOT/pages/rest-apiv2-changelog.adoc | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/modules/ROOT/pages/rest-apiv2-changelog.adoc b/modules/ROOT/pages/rest-apiv2-changelog.adoc index 42687cb35..c3208d880 100644 --- a/modules/ROOT/pages/rest-apiv2-changelog.adoc +++ b/modules/ROOT/pages/rest-apiv2-changelog.adoc @@ -38,28 +38,19 @@ Uploads a custom font file to ThoughtSpot. Returns custom fonts uploaded to the instance. //Use the `include_font_assignments` parameter to include information about which visualization elements each font is assigned to. -* `PUT /api/rest/2.0/customization/styles/fonts/{font_identifier}` + +* `PUT /api/rest/2.0/customization/styles/fonts/{font_identifier}/update` + Updates the display name, weight, style, or color of an existing custom font. * `POST /api/rest/2.0/customization/styles/fonts/delete` + Deletes one or more custom fonts from the font library. -//// -When a deleted font is assigned to visualization areas, those assignments are automatically reset to the system default font. -The response lists all affected assignments, grouped by Org. -+ -[IMPORTANT] -==== -The `dry_run` parameter defaults to `true`. In dry-run mode, the API returns the list of affected assignments but does *not* delete the fonts. Set `dry_run: false` to commit the deletion. -==== -//// Logo export:: * `POST /api/rest/2.0/customization/styles/logos/export` + Exports the current logo files as a ZIP archive containing the default logo and the wide logo. -For more information, see xref:style-customization.adoc[Customize UI layout and styles]. +For more information, see xref:customize-style-api.adoc[Style customization APIs]. == Version 26.6.0.cl, June 2026