ThoughtSpot Embedded · SpotGuide

Deliver embedded experiences to your customers

Everything your product, engineering, and data teams need — SDK setup, authentication, architecture, security, and CI/CD — from kickoff to production in one place.

👉 Start with Step 01: Align →
🔬 Open Playground 📖 SDK Quickstart ⚡ REST API v2.0
✦ Before you begin
You have a provisioned ThoughtSpot clusterConfirm with your CSM if unsure
You have admin access to your ThoughtSpot instance
You have access to your Cloud Data Warehouse credentials
Your app domain is knownRequired for CSP / CORS allowlist setup
Recommended rollout · 8–16 weeks
01
Align
Week 1–2
Start here →
02
Foundation
Week 2–4
03
Build
Week 4–10
04
Validate
Week 10–14
05
Launch
Week 14–16
Personalise this guide for your role

Select your role to highlight what's most relevant for you.

⏱ Week 1–2 👥 All roles 📌 Define MVP scope, embed pattern, and who owns what ⚡ ~2–4 hours of team alignment

01 — Align

Before writing a single line of code, align your team on why you're embedding, what you'll embed first, and who is responsible for each layer.

Why embed analytics?

Embedded analytics brings insights into the place your users already work — your product — making analytics part of the workflow rather than a separate destination.

Business outcomeWhat users experienceSo what?
Higher adoptionAnalytics is one click away inside your appReduce friction, increase usage without habit change
Faster decisionsUsers ask and answer questions without ticketsLess backlog for your data team
Scalable governanceCentral semantic layer + permissionsAdd users safely without permissions chaos
Differentiated productAnalytics feels native and brandedCompete on experience, not just charts
Choose your embed pattern

Pick the pattern that matches your desired UX control and engineering capacity. You can start focused and expand later.

Full App Embed
Full ThoughtSpot App
Embed the complete ThoughtSpot application inside your product — users get full analytics capability immediately.
Strengths
  • Maximum capability, fastest to broad access
  • Best for internal analytics portals
Trade-offs
  • More ThoughtSpot-native UX, less brand control
Decision rubric Ask: Are users casual consumers or analysts? Must analytics feel 100% native? Do you need a 30–60 day MVP? Do you require strict tenant isolation?
Start Focused for speed and a clean, controlled UX. Full App Embed if users need maximum capability out of the box — but factor in the added complexity of managing custom actions and navigation.
Who does what

Embedded analytics succeeds when product, engineering, and data teams run in parallel. Align ownership before you build.

🗂️ Product
  • Define use cases and user personas
  • Set MVP scope and success metrics
  • Own wireframes and adoption targets
  • Prioritise Liveboard content roadmap
🏗️ Engineering
  • SDK integration + auth service
  • Reusable embed component
  • CI/CD deployment pipeline
  • Runtime filter + event handling
🔬 Data / Analytics
  • Semantic model (Model / TML)
  • RLS rules and CLS tagging
  • Liveboard and Answer creation
  • Data quality validation
🔧 Admin / IT
  • User groups and permissions
  • CSP and CORS allowlists
  • Identity/IdP configuration
  • Deprovisioning workflow
⏱ Week 2–4 🔧 Admin / IT · 🔬 Data 📌 Data connectivity, security architecture, CSP/CORS, auth approach ⚡ ~2–3 days of engineering + data setup

02 — Foundation

Establish the technical building blocks before a single embed is rendered. Rushing this phase is the #1 cause of painful late-stage bugs.

⚠️ Enable Object IDs before you build. Object IDs are required for environment migration (Dev → QA → Prod) and any CI/CD workflow. Once content is created without them, retrofitting is painful. Raise a support ticket to have Object IDs enabled on your cluster before your team starts creating Models, Liveboards, or Answers.
Connect your Cloud Data Warehouse

ThoughtSpot connects live to your CDW. Start with one "golden" dataset for the MVP — model for analytics (star schema) rather than mirroring OLTP complexity.

1

Create a dedicated service role: CREATE ROLE thoughtspot_role;

2

Grant USAGE on warehouse, database, and schema, plus SELECT on the target tables/schema to the service role. Also grant future table privileges so new tables are automatically accessible.

3

Create a service user and assign the role: CREATE USER thoughtspot_svc DEFAULT_ROLE = thoughtspot_role;

4

Use username/password or key-pair auth in ThoughtSpot. Set DEFAULT_WAREHOUSE on the service user to avoid connection errors.

5

Allowlist ThoughtSpot's IP ranges in your Snowflake network policy. → Snowflake connection docs

1

Create a dedicated GCP Service Account in IAM (e.g. thoughtspot-svc@your-project.iam.gserviceaccount.com).

2

Grant BigQuery Data Viewer + BigQuery Job User roles to the service account.

3

Download the JSON key: IAM → Service Accounts → Keys → Add Key → JSON.

4

In ThoughtSpot: upload the JSON key. BigQuery connections are project-scoped — ensure the service account has access to the correct project.

1

Create a dedicated DB user (e.g. thoughtspot_svc) with a strong password, and grant SELECT on the target schema and tables.

2

Add ThoughtSpot's IP ranges to your Redshift security group inbound rules (port 5439).

3

Use native auth (username/password). IAM auth is not currently supported by ThoughtSpot.

4

For Redshift Serverless: use the serverless endpoint URL format workgroup.account.region.redshift-serverless.amazonaws.com.

1

Generate a personal access token in Databricks (User Settings → Developer → Access Tokens) or use service principal OAuth for production.

2

Use the SQL Warehouse HTTP path (not an all-purpose cluster). Find it: SQL Warehouses → your warehouse → Connection Details.

3

Ensure the token/principal has CAN USE permission on the target SQL Warehouse.

4

Grant SELECT on the target catalog/schema to the service principal.


Build the semantic layer (Model)

The semantic layer is not optional — it is what makes ThoughtSpot Search and AI work reliably for your users. It turns raw tables into a trusted, business-friendly analytics surface.

⚠ Don't skip this step A Model without business-friendly column names, synonyms, and correct aggregations will produce poor search results and confuse users. Invest here upfront — it pays dividends in every embed you ship.
1

Join tables and model in a Model (TML)

Use a star schema where possible. Avoid mirroring OLTP complexity. Define your joins in ThoughtSpot's semantic layer, not in SQL.

2

Use business-friendly column names

Rename ord_rev_usdRevenue. Users search in natural language — your column names are the vocabulary.

3

Define synonyms for common terms

Add synonyms: "sales" → Revenue, "client" → Customer. The more synonyms, the better search results Spotter delivers.

4

Configure default aggregations

Set SUM on measures (Revenue, Quantity), COUNT on IDs. Wrong defaults cause misleading AI answers.

5

Tag sensitive columns for CLS

Apply Column-Level Security tags to PII, cost, salary, and margin columns. Restrict via group-based permissions.

6

Test end-to-end with real questions

Before embedding, ask 5–10 representative business questions in the Playground. Fix any surprising results before users see them.


Configure CSP and CORS allowlists

Before any embed renders, your application domain must be registered in ThoughtSpot. This is the most common cause of blank iFrames.

🚨 Do this before any embed code Navigate to Develop → Customizations → Security Settings in your ThoughtSpot instance. Both CSP Visual Embed Hosts and CORS allowlist must include your app domain. Without this, every embed renders as a blank box.
CSP

Visual Embed Hosts

Add your app's domain (e.g. https://app.yourcompany.com) to the CSP allowlist. This permits ThoughtSpot to be framed in your app. Scope as tightly as possible — avoid wildcards in production.

CORS

CORS Allowlist

Add the same domain to the CORS allowlist so your frontend can make REST API calls. Use .* patterns to match subdomains where needed. → CORS docs

Validation

Test in non-prod first

Add your staging/dev domain first, validate fully, then add production. Check the browser console for Refused to frame or CORS errors after each change.

⏱ Week 4–10 🏗️ Engineering · 🔬 Data 📌 SDK setup, authentication, embed components, events, and customization ⚡ ~3–6 weeks of iterative development

03 — Build

Install the SDK, wire up authentication, build reusable embed components, and customize the look and feel to match your product.

Install the Visual Embed SDK
Tip: Start in the Developer Playground first Before writing application code, use Develop → Playground in your ThoughtSpot instance (https://<clustername>.thoughtspot.cloud/#/develop/playground/search) to experiment with embed components, generate code snippets, and validate auth — without touching your app.
Installation Run npm install @thoughtspot/visual-embed-sdk in your project, or load the ES Module CDN bundle for non-module environments — no build tooling required. Include callPrefetch: true in your init() call to prefetch resources and reduce first-render latency. → Full SDK Quickstart docs
SDK component types
LiveboardEmbed
Liveboard
Embed a full interactive Liveboard
LiveboardEmbed + vizId
Single Viz
Embed one chart or table from a Liveboard
SpotterEmbed
Spotter ⭐
Embed the conversational AI analyst — recommended for natural language queries
SearchEmbed
Search
Embed the structured search bar for direct data queries
AppEmbed
Full App
Embed the complete ThoughtSpot application
⚠️ Keep your SDK version in sync with your ThoughtSpot cluster version. Mismatched versions are a leading cause of broken embeds and hidden action regressions after platform upgrades. Pin your version and schedule a quarterly review.

Authentication: Trusted Auth (step-by-step)

Trusted Authentication is the recommended pattern for all embedded deployments. It uses a short-lived token exchange — no ThoughtSpot credentials are ever exposed to end users.

APP

1. User logs into your application

Your existing IdP/SSO authenticates the user. Your app now has a verified user identity (e.g. email).

APP

2. Frontend calls your backend token endpoint

The SDK's getAuthToken callback fires. Your frontend requests a token from your own backend — never from ThoughtSpot directly.

SVC

3. Backend calls ThoughtSpot token API

Your backend uses the secret_key (stored server-side only, never in client code) to call POST /api/rest/2.0/auth/token/custom and get a short-lived token.

TS

4. ThoughtSpot returns a short-lived auth token

Token TTL: 300–3600 seconds. The SDK automatically calls getAuthToken again on expiry — no manual refresh needed.

APP

5. SDK initialises the embedded session

The token is passed into init() via getAuthToken. ThoughtSpot authenticates the session and the embed renders.

Your App
Frontend
getAuthToken
callback →
Your Backend
Token Service
POST /auth/
token/custom →
ThoughtSpot
API
short-lived
token →
Embedded
iFrame
A

Enable Trusted Auth in ThoughtSpot

Navigate to Develop → Customizations → Security Settings. Enable Trusted Authentication and copy the secret_key. Store it in your backend secrets manager — never in client code or environment files committed to git.

B

Build a protected backend token endpoint

Create a server-side endpoint (e.g. POST /api/ts-token) that receives your verified app user's identity, calls POST /api/rest/2.0/auth/token/custom with the secret_key, and returns only the token to the frontend. Set auto_create: true for Just-in-Time user provisioning. Recommended TTL: 300–3600 seconds.

C

Configure SDK init() on the frontend

Call init() once per session before any embed renders. Set authType to TrustedAuthTokenCookieless and provide an async getAuthToken callback that calls your backend endpoint and returns the token string. Set autoLogin: true in production to ensure automatic token refreshes without user interruption — this is strongly recommended for cookieless auth deployments.

⚠️ Token caching gotcha Requesting a new token on every resource load will quickly hit API rate limits in production. Cache the token for the duration of its TTL (typically 5–15 minutes) and only refresh when it is close to expiry. Your getAuthToken callback should return the cached token unless it has expired.
Implementation reference The Trusted Authentication docs include complete server-side examples (Node.js, Python, Java) and the full list of token parameters including variable values and filter rules.
⚠ Always use TrustedAuthTokenCookieless in production Cookie-based auth (TrustedAuthToken) breaks silently in modern browsers due to SameSite=Lax enforcement. Cookieless mode eliminates this dependency entirely and supports multiple concurrent sessions per browser.

Build a reusable Analytics Component

Don't copy/paste embed code across pages. Build one parameterized component that handles initialization, auth, filters, events, and error states.

🚨 iFrame-based architecture — embrace it ThoughtSpot renders inside an iFrame. This is a feature: it provides a clean security boundary while allowing deep integration via events, filters, and styling. Plan for iFrame realities early: CSP, cookie policies, and cross-window messaging.
1

Accept parameters — never hardcode object IDs

The component should accept liveboardId, runtimeFilters, and display config as inputs. This lets you reuse one component across every page with different content.

2

Apply runtime filters at render time

Pass the current user's context (tenant ID, region, account) as runtime filter values scoping the Liveboard without rebuilding the content or creating per-user duplicates.

3

Configure hidden and disabled actions

Remove default ThoughtSpot actions that don't belong in an embedded context — typically: Download, Share, Schedule, and Edit. Configure via the hiddenActions parameter.

4

Handle Load and Error events

Subscribe to EmbedEvent.Load to measure time-to-first-render and drive UX transitions. Subscribe to EmbedEvent.Error to show a meaningful fallback state instead of a silent blank iFrame.

⚡ AI-Powered Code Generation

Fastest way to generate embed code: SpotterCode

SpotterCode connects Cursor, VS Code, or Claude Code directly to ThoughtSpot's SDK docs — your AI coding assistant can generate context-aware, deployment-ready embed code without leaving your editor.

🤖 AI-native IDEs
Works with Cursor, VS Code + Copilot, and Claude Code
📚 SDK-aware context
Pulls live SDK docs, REST API specs, and code samples into your editor
🚀 Zero config
One MCP config line — no extra setup, no switching tabs
SpotterCode docs → Developer Playground →

Actions: hide, disable, and add your own

Control what users can do inside the embed. Suppress ThoughtSpot's default actions to keep the UX clean, or add your own custom actions that fire events back into your app.

Hidden Actions

Suppress default TS actions

Remove buttons like "Download", "Share", "Schedule", and "Edit" from the embedded context. Configure via hiddenActions or disabledActions in your embed component init. Validate after every SDK upgrade — hidden actions can reappear on platform updates. → Actions reference

Custom Actions

Add your own buttons

Register callback custom actions in Develop → Customizations → Custom Actions. They appear as menu items inside ThoughtSpot content and fire EmbedEvent.CustomAction with the data payload — handle the event in your app to connect analytics to any downstream workflow. Test across all relevant Liveboards and user personas. → Custom Actions docs

Strategy

What actions to configure

Think about what operational capabilities your users need alongside the data. Custom actions let users act on insights directly — "Open in CRM", "Create a Task", "Escalate Issue" — turning analytics from passive reporting into a workflow trigger. This is one of the highest-value differentiators of an embedded deployment.


ℹ️ Spotter availability depends on your ThoughtSpot license tier. Confirm with your CSM before building Spotter into your product.
⭐ Embedded AI Analyst

Embed Spotter — Your AI Analyst

Spotter is ThoughtSpot's conversational AI interface. Embedding it turns your product from a passive viewer into a self-service AI analyst — users ask natural-language questions and get answers from your data, directly inside your app.

🤖 What It Does

Understands natural-language questions, generates charts and tables, and explains insights — all scoped to your embedded data context.

🧱 What It Needs

A well-built semantic model with business-friendly names, synonyms, and correct aggregations. Spotter is only as good as the model beneath it.

⚙️ Key Parameters

Use worksheetId to scope to a model, runtimeFilters for tenant isolation, and events for lifecycle management.

🚀 Differentiator

Users can ask "Why did revenue drop in Q3?" or "Which customers are at risk?" — no tickets, no SQL. A genuine product differentiator for embedded deployments.

✅ Integration Steps
Embedding Spotter in your app
1
Scope to your semantic model

Use worksheetId to pre-configure Spotter to the Model relevant for your embedded use case. This focuses conversations and prevents users from querying unrelated data sources.

2
Apply runtime filters for tenant scoping

Pass runtimeFilters at render time to ensure Spotter's answers are scoped to the current user's data context — critical for multi-tenant deployments.

3
Handle Load and Error events

Subscribe to EmbedEvent.Load to measure time-to-first-render and drive UX transitions. Subscribe to EmbedEvent.Error for a meaningful fallback state instead of a silent blank iFrame.

⚠️ Honest Expectations
What to know before embedding Spotter
  • Spotter's answer quality is directly proportional to model quality — business-friendly names, synonyms, and correct aggregations are not optional
  • Test Spotter thoroughly with real user questions before exposing to end-users — fix the model, not the prompt
  • Runtime filters must be validated per-tenant to avoid data leakage in multi-tenant setups
📖 SpotterEmbed Docs 🔬 Try in Playground
💡 Tip: SpotterCode MCP connects your IDE directly to ThoughtSpot docs — see Resources ↓

Framework readiness (React / Angular / Vue / Next.js)

The SDK is framework-agnostic, but framework lifecycle management determines whether your embed is stable or leaks memory and sessions.

Component Design

One reusable Analytics component

Centralise init(), auth, parameters, events, and error handling in a single component. Never scatter embed code across pages — it creates impossible-to-debug session conflicts.

Lifecycle

Mount / unmount cleanly

Destroy the embed instance on component unmount to avoid memory leaks and duplicate sessions. In React: call embed.destroy() in your useEffect cleanup return. In Angular: call it in ngOnDestroy. Re-initialize when route-level props like liveboardId or filters change. → React integration guide

Config

Environment-driven config

Never hardcode ThoughtSpot host URLs, Liveboard GUIDs, or feature flags. Use environment variables (.env / config service) so Dev, QA, and Prod differ only by config — not code changes.


Styling and branding

Make ThoughtSpot feel native to your product. CSS variables are the most stable approach — they survive SDK and platform upgrades.

✓ Use Theme Builder for visual customization ThoughtSpot's Theme Builder is the modern, no-code way to configure colors, fonts, and component styles — generate a theme config and export it directly into your init() call. Use custom CSS variables for anything beyond what Theme Builder covers.
How to apply CSS customizations Pass CSS variable overrides inside the customizations.style.customCSS.variables object within your init() call — or point to a hosted CSS file via customizations.style.customCSSUrl. For advanced overrides not covered by variables, use rules_UNSTABLE sparingly and validate after each platform upgrade. → Custom CSS docs · All CSS variables reference
ElementCSS Variable
Page background--ts-var-root-background
Text color--ts-var-root-color
Primary button--ts-var-button--primary-background
Font family--ts-var-font-family
Nav/header background--ts-var-nav-background
Custom icon setcustomizations.iconSpriteUrl
Rename UI stringscustomizations.content
⏱ Week 10–14 🏗️ Engineering · 🔬 Data · 🔧 Admin 📌 UAT, performance, multi-tenancy testing, security hardening ⚡ ~1–2 weeks of testing

04 — Validate

A technically successful embed that nobody uses — or that leaks data — is still a failure. Validate security, performance, and UX before go-live.

Multi-tenancy model: choose your isolation level

If you serve multiple customers, pick your isolation model on day one. Changing it later is expensive.

RLS-based
Fastest to scale

One ThoughtSpot environment. Tenant isolation enforced by Row-Level Security rules tied to user attributes. Best when tenants share similar schemas.

  • Lowest governance overhead
  • Any RLS misconfiguration is a leakage risk — test every persona
  • Best default for SaaS products with homogeneous data
Org-based
Safer isolation

Tenants are segmented into separate ThoughtSpot Orgs (optionally with RLS within each org). Higher isolation requirements.

  • Stronger separation for customers who ask for it
  • Requires content promotion automation across orgs
  • Right choice for strict separation requirements
Dedicated environments
Maximum isolation

Separate ThoughtSpot instances per tenant. For regulatory, contractual, or security requirements that prohibit any shared infrastructure.

  • Maximum isolation — no shared compute or storage
  • Highest cost and operational overhead
  • Requires full automation to be manageable at scale
🚨 Non-negotiable for any multi-tenant approach Every user session must carry a stable tenant_id. Fail closed: if tenant context is missing or ambiguous, do not render the embed. Test "Tenant A cannot see Tenant B" across every persona before go-live.

Performance best practices
SDK

Initialize once per session

Call init() once, not on every page navigation. Use lazy loading for embeds below the fold. Track load time with EmbedEvent.Load.

📊
Liveboards

Limit to 3–5 charts per Liveboard

Break large Liveboards (10+ charts) into focused, tabbed sub-Liveboards. Use Liveboard snapshot API to pre-warm cache before peak windows.

🗄️
Data Layer

Optimise CDW for ThoughtSpot queries

Use clustering keys, pre-aggregated tables for frequently accessed metrics, and CDW auto-scaling for peak concurrency. Review ThoughtSpot's query history in CDW.

🔥
Load Testing

Test at 50 → 100 → 250 concurrent users

Validate CDW warehouse sizing, ThoughtSpot query queue behavior, and SDK load. Stress test before go-live, not after.


Troubleshooting common errors

Check the browser console first. 90% of embed issues have a visible error message.

Root cause: Your application domain is not in ThoughtSpot's CSP Visual Embed Hosts allowlist.

FixGo to Develop → Customizations → Security Settings → CSP Visual Embed Hosts. Add your exact app domain (e.g. https://app.yourcompany.com). Avoid wildcards in production.

Root cause: Your application domain is not in the CORS allowlist.

FixAdd your origin to the CORS allowlist in Security Settings. Use .* patterns to match subdomains. See the CORS docs for full pattern syntax.

Root cause: Browser enforces SameSite=Lax by default, blocking cross-origin cookies set by ThoughtSpot inside your iFrame.

FixSwitch from AuthType.TrustedAuthToken to AuthType.TrustedAuthTokenCookieless. This eliminates the cookie dependency entirely and is the recommended production mode.

Root cause: Token expired, wrong username, or Trusted Authentication is not enabled.

FixVerify Trusted Auth is enabled in Security Settings. Check your getAuthToken function returns a valid token string. Confirm the username in the token matches an existing (or JIT-creatable) ThoughtSpot user.

Root cause: RLS rule filters out all rows for the authenticated user — often because the user attribute value doesn't match any rows.

FixUse Impersonate User in ThoughtSpot Admin to test as the affected user. Check the attribute values being passed. Verify the RLS rule column name exactly matches the data column name (case-sensitive).

Root cause: SDK init() was not called before the embed component was rendered, or the container element does not exist in the DOM yet.

FixEnsure init() is called and awaited before constructing any embed component. Confirm the container element (document.getElementById('ts-embed')) exists at the time of render.
⏱ Week 14–16 🏗️ Engineering · 🗂️ Product · 🔧 Admin 📌 Pre-launch checklist, CI/CD pipeline, and adoption planning ⚡ ~2–3 days of final checks

05 — Launch

Launch is the start line, not the finish line. Use this checklist as your final Go/No-Go gate, then build for adoption.

Master pre-launch checklist
0 / 0 complete
Foundation
Authentication
Security
Embed and UX
Performance
CI/CD and Operations
Adoption

Adoption: make it stick

A technically successful embed that nobody uses is still a failure. Launch is the start line — plan for adoption from day one.

Adoption rule of thumb If WAU (Weekly Active Users) of embedded analytics is below 30% of licensed users at Week 4 post-launch, investigate friction: Is the embed too slow? Too hard to find? Does it answer real questions? Don't wait — act early.
MetricWhere to find itWhat it tells you
Weekly Active Users (WAU)ThoughtSpot Admin → User activityOverall adoption health
Most-used LiveboardsThoughtSpot Admin → MonitoringWhat content is actually valuable
Failed / unanswered searchesThoughtSpot Admin → Search activityGaps in your Model — add synonyms or columns
Liveboard load time P95ThoughtSpot Admin → Performance + SDK EmbedEvent.LoadPerformance issues before users complain
Auth error rateYour backend logs + SDK EmbedEvent.ErrorToken issues, session problems
Tenant-level usageCustom dashboard on ThoughtSpot activity dataWhich customers are engaged vs at-risk
Enablement

Train your users, not just your team

Create a short in-app guide or "getting started" flow for end users. Link to ThoughtSpot U. The teams with the highest adoption invest in user education, not just engineering.

Feedback Loop

Build a feedback mechanism

Add a "Was this helpful?" widget or a "Report an issue" link inside your embedded product. Collect qualitative feedback weekly in the first 8 weeks post-launch.

Support

Define ownership before go-live

Assign a named owner for: embed bugs, data model issues, user provisioning failures, and performance incidents. Unclear ownership means slow resolution and churn.

REST API & Automation

ThoughtSpot's REST API v2.0 is the backbone of scalable operations — automate user provisioning, content promotion, token management, and usage reporting programmatically.

When to use the REST API Use the REST API for any operation that needs to happen programmatically at scale: onboarding new tenants, promoting TML across environments, generating auth tokens from your backend, or extracting usage data for billing and reporting.
CapabilityKey endpoint(s)Common use case
Auth token generationPOST /api/rest/2.0/auth/token/customBackend token endpoint for Trusted Auth (create user session)
Auth token with variable values (ABAC) for RLSPOST /api/rest/2.0/auth/token/customPer-user ABAC using variable values (formula variables) in JWT. Variable values are optional — used for applying row-level security rules. → ABAC via RLS variables docs
User management/api/rest/2.0/usersCreate, update, deactivate users programmatically (bulk onboarding)
Group management/api/rest/2.0/groupsMap tenant roles to ThoughtSpot groups; assign RLS rules
TML exportPOST /api/rest/2.0/metadata/tml/exportExtract Models and Liveboards for version control
TML importPOST /api/rest/2.0/metadata/tml/importDeploy content to QA/Prod in CI/CD pipeline
Search dataPOST /api/rest/2.0/searchdataProgrammatic data queries — power custom UI without an iFrame
Liveboard snapshotPOST /api/rest/2.0/report/liveboardExport Liveboard as PDF/PNG for scheduled email digests
Connection management/api/rest/2.0/connectionsCreate/update CDW connections programmatically per tenant
Per-user data scoping via token/custom

The token/custom endpoint is the standard way to pass per-user data context — use formula variables and variable values inside the JWT to scope data without managing RLS rules in ThoughtSpot.

1

Define formula variables in your Model

Create formula variables in your ThoughtSpot Model (e.g. current_tenant, fiscal_year). These become the injection points for per-user context passed via the token.

2

Pass variable values in the token payload

Use the variable_values field in your POST /api/rest/2.0/auth/token/custom request to inject runtime values for each user — e.g. their tenant ID, region, or role. ThoughtSpot applies these as filters at query time.

3

Use parameter_values for worksheet parameters

Pass dynamic parameter values (e.g. current fiscal quarter, selected currency) to pre-populate worksheet parameters without user interaction — keeping the embed context-aware on every load.

ABAC reference See the ABAC documentation for the full list of filter operators, persist options, and version requirements.
Best Practice

Use a service account for API calls

Never use a personal admin account for automated REST API calls. Create a dedicated ThoughtSpot service account with the minimum required privileges. Store credentials in a secrets manager, not environment files committed to git.

Reliability

Handle rate limits and retries

ThoughtSpot's API enforces rate limits on high-volume operations (bulk user creates, TML imports). Implement exponential backoff with retry logic for bulk operations. Review rate limit docs before automating at scale.

TML Automation

Automate content promotion

Use tml/export + tml/import in your CI/CD pipeline to promote Models and Liveboards across environments. Replace environment-specific GUIDs with portable identifiers. Validate TML syntax in the lint stage before promoting.

Resources

Everything you need bookmarked in one place.

📖

SDK Quickstart

Step-by-step guide to installing and initializing the Visual Embed SDK.

⭐ Start here developers.thoughtspot.com →
🔬

Developer Playground

Experiment with all embed types, generate code snippets, and preview CSS changes live — no account needed.

⭐ Start here Open Playground →

REST API v2.0 Explorer

Interactive API explorer for users, groups, TML import/export, auth tokens, and search data.

REST API docs →
🎓

ThoughtSpot U — TSE Training

Self-paced eLearning: Getting Started with ThoughtSpot Embedded. Free for customers.

⭐ Start here training.thoughtspot.com →
💬

Developer Community

Ask questions, share solutions, and connect with other ThoughtSpot developers.

community.thoughtspot.com →
⚙️

React Demo App

Full working React demo with LiveboardEmbed, auth flow, and runtime filters. Fork and adapt.

Open in CodeSandbox →
🎨

CSS Variables Reference

Complete list of all supported ThoughtSpot CSS variables for branding and customization.

GitHub →
📋

SDK Changelog

Track SDK version history, breaking changes, and compatibility with cluster releases. Review before every upgrade.

SDK changelog →
Community
💬

Developer Community — Discord

Join the ThoughtSpot developer community on Discord. Ask questions, share solutions, and connect with other engineers building on the platform.

Join Discord →
New

SpotterCode — AI Dev Accelerator

Connect Cursor, VS Code, or Claude Code to ThoughtSpot's MCP server for context-aware embed code generation and live SDK docs in your IDE.

SpotterCode docs →
🙋

Need Help? Contact Support

Reach your ThoughtSpot CSM or open a support ticket. New customers: your CSM is your first point of contact for licensing, access, and onboarding questions.

support.thoughtspot.com →