# Manage Organizations Source: https://docs.wisdom.ai/access-management/manage-organizations This guide explains how to use the Organizations manager to create and maintain isolated environments within your tenant. Organizations ensure full data separation, meaning that connections, domains, users, dashboards, and agents are kept entirely independent across different environments. ## Before you start To perform these tasks, you must have **Site Administrator** permissions. Regular users or organization-level admins cannot access the global Organizations manager. Read the [Access Management](/manage-account/access-management) guide to learn more about roles and permissions. ## Create a new organization New organizations are provisioned by Site Administrators through the platform. To do this, follow the steps below: 1. Sign in to WisdomAI as a Site Administrator. 2. Click the **Organizations** icon in the left-hand navigation menu. 3. Click the **Add Organization** option. Create New Organization UI 4. In the modal that opens, under **Organization Details**: a. Enter the **Organization Name** (e.g., "Finance-Dept"). b. Define the **URI** (e.g., `finance`). This creates a unique access point: `https://try.askwisdom.ai/organizations/finance`. c. Add **Organization Admins** by entering their email addresses. d. (Optional) Expand **Advanced Options** to define **Allowed email domains**. The **Allowed email domains** setting acts as a security gate. By specifying a domain (e.g., `company.com`), you ensure that only users with official company emails can be added to the organization, preventing accidental access by external or personal accounts. 5. Click **Create Organization**. If you encounter any issues during provisioning, please contact [the WisdomAI support team](/manage-account/contact-support) for assistance. ## Manage existing organizations Once created, you can manage organizations directly from the dashboard using quick-access icons. ### Modify settings and access * **Edit Details**: Click the **three-dot menu (...)** on an organization tile and select **Edit** to update the name, URI, or administrative owners. Edit Organizations modal * **Access Domains**: Click the **monitor icon** to configure AI domains specific to that organization. * **Manage Connections**: Click the \*\*sync/connections \*\*(arrows)**icon** to set up or modify data source integrations for that environment. Manage Organization Icons Manage Organization Icons ### User administration Click the **person icon** to open the user management view: * **Invite Users**: Click **Invite Users** to grant access to the specific organization. * **Export List**: Click **Export to CSV** to download a record of all users assigned to the organization. Manage Organization Icons ### Archive an organization If an environment is no longer needed, you can deactivate it to prevent further access. 1. Click the **three-dot menu (...)** on the organization tile. 2. Select **Archive organization**. 3. Confirm the action in the dialog box. Archive Organization Archiving deactivates the organization immediately, meaning users will no longer be able to log in. However, your data is **not deleted**; it remains securely stored in case you need to reactivate the environment in the future. ## Next steps Learn how to restrict data access at the row level for specific users or roles. Control user permissions and manage access to platform features and data. Explore the full list of databases and platforms you can connect to the system. Understand the core concepts and architecture behind the platform's data analysis capabilities. Walk through the initial setup to connect a data source and run your first query. Configure how WisdomAI accesses data, understands your business context, and evaluates response accuracy. # Use the Deep Analysis Functionality Source: https://docs.wisdom.ai/advanced-features/deep-analysis Use the Deep Analysis feature to investigate complex, open-ended questions, such as "Why did our revenue spike last quarter?". The feature automates the investigation by creating a multi-step analysis plan, executing it, and generating a comprehensive report with its findings. This tutorial teaches you how to investigate a data anomaly, refine the analysis plan, and interpret the final report to understand its root cause. The Deep Analysis feature is currently in beta and is available to all Admin users. ## Perform a Deep Analysis Follow the steps below to run a complete investigation, from enabling the feature to exploring the final report. ### Step 1: Enable Deep Analysis mode Before asking a question, enable Deep Analysis mode in the chat interface. 1. In a new or existing chat, locate the **Deep Analysis** toggle. 2. Click the toggle to enable it. Once enabled, all subsequent questions you ask in this chat will use Deep Analysis until you disable it. Screenshot showing the Deep Analysis feature enabled ### Step 2: Ask an open-ended question With Deep Analysis enabled, ask a question that requires investigation rather than a simple answer. These questions often start with "Why," "Investigate," or "What are the main drivers of...". For example, you could ask: `Investigate why there was a spike in Q4 2023 revenue compared to Q3 2023`. Screenshot showing the question sent ### Step 3: Review and refine the Analysis plan After you submit your question, Deep Analysis will not immediately run the full investigation. Instead, it generates a proposed plan outlining the steps it will take to answer your question. This is your opportunity to guide the analysis: * **Review the steps**: Read through the proposed plan to ensure it aligns with your goals. * **Modify the plan**: You can ask the system to change the plan using natural language. For example, you can remove steps ("don't do these last five steps") or add new ones ("also do a competitive analysis"). * **Approve the plan**: If the plan looks correct, type `continue with the investigations` to begin the analysis. GIF showing how you can modify the plan before running the analysis ### Step 4: Monitor the investigation Once you approve the plan, the system begins executing the investigation. This process can take several minutes. A sidebar will appear, showing the real-time progress of each step in the analysis plan. You can navigate away from the chat, start a new one, or continue with other work; the analysis will continue running in the background. Closing the browser tab will not interrupt the process. You can always return to the chat to check the progress. The analysis status is saved in a persistent card that you can click to reopen the progress view. Screenshot showing the report ### Step 5: Explore the final report When the investigation is complete, Deep Analysis compiles the findings into a detailed report. You can open the report from the chat, and it will be displayed in the side panel. The report typically includes: * **An executive summary**: A high-level overview of the main findings. * **Key findings**: Detailed points explaining the results of the investigation. * **Detailed Analysis:** This section presents the in-depth results of the investigation, which can be broken down into various sub-topics like time trends, deal volume, or lead source effectiveness. * **Visualizations**: Charts and tables embedded within the report to support the findings. * **Conclusions and Actionable Insights:** This section synthesizes the key findings into a clear conclusion and provides practical takeaways. * **Follow-up data analysis:** The report suggests new questions to guide your next steps. You can continue the conversation by asking follow-up questions about the report, such as `generate a shorter one page version of the report`, to refine the insights further. GIF showing a request to generate a one-page report ## Use case examples Deep Analysis is ideal for situations where a single data point isn't enough to understand the full picture. ### Investigating a performance spike This is a primary use case for conducting root cause analysis when a key metric changes unexpectedly. * **Scenario**: You notice a sudden increase in user engagement for a specific feature and need to understand the cause. * **Question**: `Investigate the key drivers for the spike in user engagement for the 'new dashboard' feature last month.` * **Outcome**: Deep Analysis generates a report identifying the primary causes, such as a recent marketing campaign, a new integration partner driving traffic, or a specific segment of users heavily adopting the feature. The report would include charts breaking down engagement by user segment and traffic source. ### Understanding complex business trends Use Deep Analysis for exploratory analysis when the factors influencing a trend are not immediately apparent. * **Scenario**: Your quarterly report shows an increase in customer churn, but the high-level numbers don't explain why it's happening. * **Question**: `What are the primary factors contributing to customer churn in Q2?` * **Outcome**: The system creates a plan to segment churned customers by subscription plan, region, product usage, and signup date. The final report reveals that customers on a specific plan who do not adopt a key feature within their first 30 days are the most likely to churn, providing actionable insight for the product team. ## Next steps Automate data monitoring and receive proactive alerts when specific conditions are met. Improve analysis by providing custom business definitions, synonyms, and other contextual information. # Python Interpreter Tool Source: https://docs.wisdom.ai/advanced-features/python-interpreter-tool Use the Python Interpreter tool to go beyond SQL and perform advanced data science operations such as forecasting, regression, clustering, and mathematical calculations directly from natural language in Chat. When you ask a question that requires computation beyond what SQL can answer, WisdomAI automatically generates Python code, executes it securely, and visualizes the result. This guide explains how to enable the tool, what types of analysis it supports, and how to get the best results. ## How it works When you ask a question that requires advanced computation, WisdomAI follows this process: 1. **Retrieves data**: If the analysis needs data from your database, WisdomAI first queries it using SQL. 2. **Generates Python code**: WisdomAI translates your natural-language instruction into Python code. 3. **Visualizes the result**: The result is automatically visualized as a chart or table—you do not need to write any plotting code. ## Enable or disable the tool Before asking a question, make sure the Python Interpreter tool is enabled in the chat interface. 1. Open a **Chat** in WisdomAI. 2. Locate the **experimental tools** selector in the chat input area. 3. Toggle **Python Interpreter** on or off. Image Your preference is saved and persists across sessions. When enabled, WisdomAI will use the tool automatically when your question requires Python-level analysis. When disabled, only SQL-based analysis is available. ## What you can do Perform the following data science tasks and advanced transformations directly within your chat sessions: ### Mathematical calculations Ask any arithmetic or mathematical question, and WisdomAI will compute it with Python rather than relying on approximations. * `What is the compound annual growth rate of revenue from 2020 to 2024?` * `Calculate the standard deviation of deal sizes across all closed-won opportunities.` ### Time-series forecasting Forecast future values using statistical models. WisdomAI selects the appropriate method based on your data. **Example questions:** * `Forecast monthly revenue for the next 12 months.` * `Predict weekly active users for Q3 based on historical trends.` Image The result automatically includes both original and forecasted values in a single visualization, so you can compare them side by side. ### Regression Analysis Fit regression models to understand relationships between variables or extrapolate trends. **Example questions:** * `What is the relationship between marketing spend and revenue?` * `If we increase headcount from 50 to 100 in steps of 5, what is the projected output?` Image ### Clustering Group data points into clusters to discover natural segments in your data. Image Image ### Data manipulation and transformation Perform pandas-style operations that SQL cannot express, such as pivoting, rolling windows, or custom row-level logic. **Example questions:** * `Calculate the 7-day rolling average of daily signups.` * `Merge the sales and returns tables on order_id and compute net revenue per product.` * `Pivot the data so each region becomes a column with total sales as values.` ## Available Python libraries Code generated by WisdomAI runs in a secure, sandboxed environment. Only a curated set of Python libraries is available for import. Any attempt to import a module outside of this list will be blocked. The following libraries are allowed: `collections` `csv` `datetime` `functools` `itertools` `json` `math` `numpy` `pandas` `prophet` `random` `re` `scipy` `sklearn` `statsmodels` `string` If you need a module that is not listed above, contact [the WisdomAI support team](/manage-account/contact-support) for assistance. ## Tips for best results * **Be specific about the analysis you want.** Instead of "analyze sales," ask "forecast monthly sales for the next 6 months using the last 2 years of data." Specificity helps WisdomAI choose the right method and parameters. * **Fetch data first, then analyze.** For data science tasks, WisdomAI follows a two-step process: first, query data via SQL, then analyze it with Python. If you notice missing data, ask for a follow-up to retrieve the full dataset before re-running the analysis. * **Ask to adjust parameters.** After a forecasting or regression result, you can ask WisdomAI to change the method or tune parameters. For example: "Redo the forecast using ETS with multiplicative seasonality" or "Try Ridge regression with alpha=0.5." * **Use follow-up questions.** The result persists in your conversation. You can ask follow-up questions like "Now filter this to only show Q4" or "Add a trend line to the existing data." ## Use case examples ### Forecasting revenue * **Scenario**: You need to forecast next quarter's revenue using historical monthly data. * **Question**: `Forecast monthly revenue for the next 3 months based on the last 2 years of data.` * **Outcome**: WisdomAI first queries your revenue data, then runs a SARIMAX or ETS forecast, and presents both the historical and forecasted values in a single line chart. ### Segmenting customers * **Scenario**: You want to identify natural customer segments for a marketing campaign. * **Question**: `Cluster our customers into groups based on total spend and order frequency. Suggest the best number of clusters.` * **Outcome**: WisdomAI queries customer metrics, runs K-Means with silhouette scoring to determine the optimal number of groups, and presents a scatter plot with color-coded clusters. ### What-if analysis * **Scenario**: You want to understand how increasing ad spend might affect conversions. * **Question**: `Based on historical data, if we increase ad spend from $10K to $50K in $5K steps, what are the projected conversions?` * **Outcome**: WisdomAI fits a linear regression on historical ad spend vs. conversions, extrapolates over the specified range, and shows both the original data and projected values. ## Next steps Investigate complex, multi-step questions with automated research plans and detailed reports. Explore all available chart types and how to customize your data presentation. Learn how to phrase questions for the best and most accurate results. Pin analysis results to dashboards for ongoing monitoring and sharing. # Visualization Types and Properties Source: https://docs.wisdom.ai/advanced-features/visualization-types-and-properties This guide covers the visualization features within WisdomAI's **Dashboards and Chats**. It explains how to analyze trends, compare categories, and adjust data display settings. The following sections describe: * The catalog of available **chart types** to represent your data visually. * Options for **switchable encodings** that allow you to adjust axis assignments, filters, and aggregations. * Built-in **interaction options** to customize queries and validate results. * Key **accessibility features** designed to make Dashboards approachable for all users. ## Graph / Chart Catalog WisdomAI's Dashboards support a variety of chart types to represent data insights effectively. Users can select the desired chart type through a dropdown menu in the **Editor** tab. Image showing the editor tab charts list ### Available chart types | Chart Type | Feature | | :------------------------------ | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Table** | Displays raw data in a structured format, ideal for precise values and detailed comparisons. | | **Pie Chart** | Best for showing proportions within a whole, where each slice represents a percentage of the total. (Consider using for 5-7 slices maximum.) | | **Funnel Chart** | Illustrates how values progress through different stages of a sequential process, often used to visualize conversion or attrition rates. | | **Bar Chart** | Useful for comparing quantities across discrete categories, with the length of the bars representing the values. | | **Bar Chart (stacked)** | Displays multiple data series in a single bar, where segments within the bar show the contribution of each part to the whole. Useful for comparing sub-categories and their cumulative totals. | | **Bar Chart (100% stacked)** | Similar to a stacked bar chart, but each bar represents 100% of a category, with segments showing the percentage contribution of subcategories. Ideal for showing part-to-whole relationships and how proportions change over time. (Be cautious as overall totals are not explicitly shown.) | | **Column Chart** | Visually represents numerical values using vertical columns. Ideal for comparing discrete categories, often with the height of the column corresponding to the value. | | **Column Chart (stacked)** | Presents multiple data series as vertical bars, with segments stacked to show their cumulative sum. Aids in comparisons between categories over time or across different groups. | | **Column Chart (100% stacked)** | Compares multiple measures by stacking bars vertically, where each segment represents the percentage of the overall category total. Useful for showing the distribution of components within a whole at a specific point in time or across time. | | **Area Chart (stacked)** | Shows data as an area under a line that connects data points, with multiple series stacked on top of each other. Useful for displaying the contribution of different components to a whole while showing overall patterns and cumulative trends over time. | | **Area Chart** | Visualizes quantitative data and shows how values change over time, with the area between the line and the baseline filled with color. Ideal for emphasizing trends and the magnitude of change. | | **Line Chart** | Ideal for displaying trends over time or across continuous measurements, showing how data changes and identifying patterns. (Excellent for time-series data.) | | **Map** | Transforms geographic data into visual insights by displaying information across different regions, countries, or territories. Useful for visualizing spatial patterns and distributions. | These visualization options enable users to tailor the presentation of data to their specific analytical needs. Therefore, selecting the optimal chart depends on your data, the message you want to convey, and your audience. Always consider what insights you want to highlight before picking a chart type. ## Switchable encodings Within the **Editor** tab, users can customize data encodings to refine their visualizations, for example: * **Axis Assignment** – Drag and drop data columns to assign them to the X and Y axes\ *(e.g., "Region" on X-axis, "Total Revenue SUM" on Y-axis)*. * **Data Filtering** – Apply filters to focus on specific data subsets\ *(e.g., "Stage Label: Closed Won")*. * **Aggregation Functions** – Use SUM, AVG, etc., to aggregate numerical data as needed. These features allow for dynamic adjustment of visualizations to highlight the most relevant insights. Image showing encoding options ## Interaction options WisdomAI provides interactive elements to enhance user engagement and data exploration: * **Editable SQL** – Modify the generated SQL queries in the **SQL** tab to correct or fine-tune results. * **Feedback Mechanism** – Give a thumbs up or down to improve future AI responses. * **Review & Validation** – Mark queries as reviewed to confirm accuracy in team workflows. These interaction options support iterative refinement and validation of data analyses. Image showing the SQL code edition window ## Accessibility notes WisdomAI emphasizes accessibility to ensure a wide range of users can effectively engage with Dashboards: * **Natural Language Interface:** Ask questions using plain English to generate data queries. * **Visual Configuration Tools:** Use drag-and-drop components in the Widget Editor to configure visuals without writing code. * **Collaborative Integrations:** Access insights directly from platforms like Slack or Teams, supporting seamless workflows. * **Color Accessibility:** WisdomAI Dashboards meet WCAG 2.1 AA contrast requirements, ensuring chart colors are distinguishable for users with color vision deficiencies. You can also prompt the AI to adjust chart colors to better suit your needs. These features aim to make data exploration more inclusive and user-friendly for both technical and non-technical users. ## Next steps Plot two metrics with different scales on the same chart. Compile your favorite charts and visualizations into a shareable dashboard. # Chat 2.0 Source: https://docs.wisdom.ai/chat/overview The new and improved WisdomAI chat experience: ask in plain language, pick a reasoning mode, follow the work, and turn answers into reports, dashboards, and agents. Chat is where you ask questions about your data in plain language. You pick a domain, type a question, and WisdomAI plans the analysis, runs it against your governed data, and answers with tables, charts, and explanations you can inspect step by step. This page describes **Chat V2**, the new chat experience that is now the default for everyone. It replaces the Classic and Deep Analysis modes: Classic chats still open, but new conversations use the experience described here. ## Ask a question 1. **Start a new chat.** Click **New chat** in the sidebar and pick the domain that owns the data you're asking about. 2. **Type your question.** Ask the way you'd ask a colleague: "What was revenue by region last quarter?" For phrasing that gets better answers, see [Ask Better Questions](/using-wisdom-ai-everyday/ask-better-questions). 3. **Follow the work.** The answer streams in along with what the AI is doing. For multi-step questions you'll see its plan as a to-do list that checks off as it progresses. While an answer is running you can press the **stop** button to cancel it, or keep typing: messages you send mid-answer are queued and handled next. You can also **edit** a question you already asked, or **retry** the last one. ## Choose a mode The mode selector under the chat input controls how much reasoning your question gets: | Mode | What it's for | | ---------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- | | **Thinking** (default) | Dynamic reasoning. Best for most questions. | | **Lite** | Lightweight mode for easy queries and quick answers. | | **Expert** | Highest reasoning, for the hardest questions and complex analysis. Expect it to take longer, go deeper, and often produce a full report. | Image showing the choose mode dropdown Image showing the choose mode dropdown A conversation's mode is fixed after the first message, so start a new chat to switch modes. The earlier **Deep Analysis** and **Classic** modes are deprecated. For the long-running, open-ended investigations you used Deep Analysis for, use **Expert** — it runs inside the normal chat flow, so you can watch the plan progress and answer clarifying questions along the way. ## When WisdomAI asks you a question If your question is ambiguous, the AI asks instead of guessing. A clarification appears just above the chat input with the likely interpretations as clickable options. Click one and the analysis continues immediately, or type your own answer if none of the options fit. ## See how an answer was produced Every answer shows its work. Click the activity indicator on a message to open the **AI Workstream** panel: a step-by-step list of what ran. Click any step to see its detail, including the exact **SQL** or **Python** that executed, the context it used, and the output table it produced. If web search is enabled for the domain, searches and fetched pages show up here too. This is the fastest way to verify a number before you rely on it. ## Work with answers and artifacts Results open as tabs in a side panel next to the conversation: * **Charts** can be opened, restyled, and exported. * **Tables** support instant [filters](/dashboards/instant-filters), so you can narrow a result in place without re-asking. * **Files** referenced in the analysis, including PDFs and images, preview in place. Tables and charts carry thumbs up/down buttons. Rating an answer, especially explaining a thumbs-down, helps your admins improve the domain's context. ## Reports For questions that deserve more than a table, the AI writes a report. An **Open report** card appears in the conversation; click it to watch the report stream in, section by section, in its own panel. From the report's **Share** menu you can: * **Export as PDF** or **Word (DOCX)** * **Share via link**, so teammates can open the report directly Expert mode produces reports most often, but any mode can generate one when the question calls for it. ## Bring your own context * **Attach files** from the **+** button: spreadsheets and CSVs, PDFs, images, and most text formats. Ask questions across them together with your connected data. See [Use File Attachments in Chat](/improve-wisdom-ai-responses/attach-files-to-chat). * **Reference a domain file** from the same menu to pull an existing dataset or document into the conversation without re-uploading it. * **Paste** images or code straight into the input. ## Type less * Type **/** to insert a [skill](/setting-up-wisdom-ai/manage-domains/skills) your team has defined for recurring analysis patterns. * Gray **ghost text** suggests a completion as you type; press **Tab** to accept it. * Click the microphone to **dictate** your question instead of typing it. ## Long-running questions Deep questions take time. When a turn runs long, a **Notify me when complete** option appears above the input; enable it and your browser alerts you when the answer is ready, so you can work elsewhere in the meantime. ## Manage a conversation * **Share** the conversation from the top bar and control who can open it. * **In this chat** lists every question asked, so you can jump around long conversations. * From a message you can **copy a direct link** to it or **fork the chat** from that point to explore a different direction. * Rename, pin, duplicate, or delete the chat from its options menu. ## Turn answers into assets A good answer shouldn't stay buried in a conversation: * **Add to dashboard** pins the result where your team will see it refreshed. See [Turn Answers into Dashboards](/using-wisdom-ai-everyday/turn-answers-into-dashboards). * When a question implies a recurring cadence ("every Monday", "each month"), chat offers to create an **Agent** that runs it on schedule and delivers the result. * When the AI learns something about your business worth keeping, it can propose saving it as domain **knowledge** for users with domain edit access to approve. ## Next steps Build sharper natural-language questions to get more accurate answers. Compile key insights and visualizations into a shareable, narrative-driven report. # Instant Filters Source: https://docs.wisdom.ai/dashboards/instant-filters Narrow any results table in place. Filters apply in your browser, last for your session, and never change the underlying query. Results tables in WisdomAI have built-in filters. Pick the values you want to keep in a column, and the table narrows immediately. Nothing is re-queried, and nothing you have shared changes: the filters apply only to your view and reset when you leave the page. Reach for them when the answer is right but the table is too broad, like when you want one region out of the twenty in the result. ## Filter a column 1. **Open the column menu.** Hover over a column header and click the menu icon. 2. **Choose Filter values.** A checklist opens with every value in the column and a count of rows for each. Use the search box to find values in long lists. `(Blank)` matches empty cells. 3. **Tick the values to keep.** The table updates as you select. **Select all** and **Select none** flip the whole list at once. A funnel icon marks each filtered column, and a summary bar above the table shows how many filters are active. **Reset** on the summary bar clears everything at once. ## Hide a column The same column menu has a **Hide column** option. At least one other column must be visible before you can hide one. ## What these filters never touch * The underlying query, the saved answer, and the dashboard stay exactly as they were. * Nobody else sees your filters. Two people can look at the same table and each keep their own view. * Nothing persists. Refresh the page and the table returns to its full state. This makes instant filters safe to use aggressively. There is no way to break a shared dashboard or a saved answer with them. ## Limits * Filters work on the rows loaded in your browser, up to 10,000. ## Next steps Arrange widgets, add summaries, and prepare a dashboard for sharing. Ask questions about your data, and WisdomAI analyzes your governed data to provide answers. # Organize a Dashboard with Tabs Source: https://docs.wisdom.ai/dashboards/tabs Split a dashboard into named tabs, move widgets between them, and share links that open on a specific tab. Tabs split a single dashboard into named views. Instead of one long page of widgets, or several near-copies of the same dashboard, you can give each audience or topic its own tab, say an overview for leadership and a pipeline deep dive for sales ops. Everyone who can open the dashboard can switch between its tabs. Adding, renaming, reordering, and deleting tabs requires editor access to the dashboard. ## Add a tab 1. **Open a dashboard you can edit.** Click **Dashboards** in the sidebar and select the dashboard. 2. **Click + next to the tab bar.** The first time you add a tab, the widgets already on the dashboard are collected into an **Overview** tab, and your new tab appears beside it. After that, each click adds one empty tab. 3. **Name the tab.** Click the tab's name and type over it. You can rename a tab at any time the same way. The tab bar appears once a dashboard has two or more tabs. A dashboard with a single tab looks the same as it always did. ## Put widgets on tabs New widgets are added to the tab you are currently viewing. To rearrange existing widgets, open a widget's menu and choose: * **Move to tab** to place the widget on another tab. * **Clone to tab** to copy it, which is useful when two audiences want the same chart alongside different neighbors. ## Reorder or delete tabs Drag a tab left or right to reorder it. To delete a tab, click the **×** on the tab and confirm. Deleting a tab removes the widgets on that tab from the dashboard draft, so move any widgets you want to keep first. A dashboard always keeps at least one tab, so the delete option is only available while more than one exists. ## Share a link to a specific tab The active tab is part of the page URL. Copy the URL while viewing a tab, and anyone who opens the link lands on that exact tab. They still need access to the dashboard to see it. ## Good to know * Existing dashboards are unchanged until the first time someone edits tabs on them. * Dashboard filters are shared across the whole dashboard. A filter you set applies on every tab, not only the tab where you set it. ## Next steps Arrange widgets, add summaries, and prepare a dashboard for sharing. Control who can view or edit each dashboard. # Deployment Models Source: https://docs.wisdom.ai/deployment/deployment-models This guide details WisdomAI's three deployment models, helping you select the best path based on your organization's security, data residency, and infrastructure requirements. Managed service, deployed inside your own cloud account (AWS, GCP, or Azure). Full stack deployed on infrastructure you own, not a hyperscaler. WisdomAI-managed cloud service. The fastest time-to-value, with zero infrastructure to run. ## Cloud-Prem **Model:** Managed service, deployed inside your own cloud account **Best for:** Teams that need data residency and cloud-account isolation while still letting WisdomAI operate the platform. ### Overview In the Cloud-Prem model, your WisdomAI tenant is deployed as a managed service, isolated within your own cloud account on AWS, GCP, or Azure. Your data stays inside your cloud boundary; WisdomAI retains remote access to deliver updates and patches. Operating this model is a shared responsibility: WisdomAI operates the platform itself, while provisioning of the underlying cloud resources within your account remains governed by you. ### Advantages * **Strict data residency:** Data never leaves your organizational boundaries or your chosen cloud account. * **Cloud spend utilization:** Apply your existing AWS, GCP, or Azure spend commitments to offset hosting costs. * **Full operational visibility:** Retain access to all raw logs for compliance and security auditing. ### Supported cloud environments | Cloud | Isolation | | :---- | :------------------------------------------------------------------------- | | AWS | Deployed inside your VPC; compatible with Service Control Policies (SCPs). | | GCP | Deployed within your project; compatible with VPC Service Controls. | | Azure | Deployed within your VNet; integrated with Azure Policy. | ### Infrastructure layer Cloud-Prem runs on a cloud provider and uses that cloud's managed primitives: * **Object store:** the cloud's managed object storage (e.g. S3, GCS, Azure Blob). * **PostgreSQL:** the cloud's managed Postgres (e.g. RDS, Cloud SQL, Azure Database for PostgreSQL). This is the defining difference from Customer On-Prem, which runs on infrastructure you own rather than a hyperscaler. ### Red Hat OpenShift WisdomAI runs natively on Red Hat OpenShift Container Platform for enterprises that standardize on OpenShift and require every application to conform to its hardened security model. OpenShift is a platform choice rather than a separate deployment model: on Cloud-Prem, it's supported via managed OpenShift (Amazon ROSA, Azure ARO) in your cloud account. ### Access & identity These are two separate layers: a load balancer handles network traffic, and the identity provider handles authentication and authorization: * **Network ingress:** traffic enters through a customer-controlled load balancer, kept local to your cloud environment. * **Identity & access:** BYO IdP (Okta / Entra ID) enforces enterprise SSO and RBAC. ## Customer On-Prem **Model:** Full stack deployed on infrastructure you own **Best for:** Strategic enterprise deals with a hard requirement to run entirely on customer-owned infrastructure. ### Overview In the Customer On-Prem model, the complete WisdomAI stack runs on your own infrastructure, not a hyperscaler, and not WisdomAI's own infrastructure. You control upgrade timing, and nothing is stored outside your environment. This option is reserved for strategic enterprise deals. ### Infrastructure layer The defining difference from Cloud-Prem is the infrastructure layer. Customer On-Prem does not run on AWS, GCP, or Azure. Because there are no cloud-managed primitives to rely on, you provide your own: * **Object store:** your own object storage. * **PostgreSQL:** your own Postgres instance for metadata and audit logs. ### Compute Kubernetes-based infrastructure running the Core Engine, Context Engine, Metadata Extractor, and Chunker/Indexer. ### Upgrades Updates are delivered over-the-air, but you control when they are applied, upgrade timing is in your hands rather than WisdomAI's. ### Red Hat OpenShift WisdomAI runs natively on Red Hat OpenShift Container Platform for enterprises that standardize on OpenShift and require every application to conform to its hardened security model. OpenShift is a platform choice rather than a separate deployment model, set up on your on-prem datacenter. ### Access & identity These are two separate layers: a load balancer handles network traffic, and the identity provider handles authentication and authorization: * **Network ingress:** traffic enters through a customer-controlled load balancer, kept local to your environment. * **Identity & access:** BYO IdP (Okta / Entra ID) enforces enterprise SSO and RBAC. ### Data handling Nothing is stored outside the customer environment. WisdomAI operates under Zero Data Retention (ZDR) agreements with model providers (e.g. OpenAI, Anthropic). ## Cloud-Prem & Customer On-Prem Shared Capabilities These capabilities apply equally to Cloud-Prem and Customer On-Prem: * **Bring Your Own Identity Provider (BYO IdP):** enterprise SSO and RBAC via your Okta or Entra ID. * **Bring Your Own LLM (BYO-LLM):** on-prem or private-cloud model endpoints, with no hard dependency on any single model provider. * **OpenSearch:** a single system providing both the lexical index and vector search. It is the vector store, not a separate component. * **PostgreSQL:** metadata and audit logs. * **Data residency:** no customer data leaves their controlled environment. * **Encryption:** AES-256 at rest, TLS 1.2+ in transit. ## SaaS Hosted **Model:** WisdomAI-managed cloud service **Best for:** Teams that want the fastest time-to-value with zero infrastructure to run. ### Overview In the SaaS Hosted model, WisdomAI runs and operates the entire platform for you. There is no infrastructure for your team to provision, patch, or monitor. WisdomAI handles upgrades, scaling, and operations. This is the fastest path to production and the lowest operational burden of the three deployment options. ### What WisdomAI manages * All compute, storage, and networking * Upgrades and patching (delivered continuously) * Scaling and availability * Monitoring and operations ### Security * **Encryption:** AES-256 at rest, TLS 1.2+ in transit. * **Model access:** WisdomAI operates under Zero Data Retention (ZDR) agreements with model providers (e.g. OpenAI, Anthropic), so prompts and completions are not retained by those providers. ### When to choose SaaS Hosted Choose SaaS Hosted when you want to evaluate or adopt WisdomAI quickly and do not have a requirement to keep the deployment inside your own cloud account or infrastructure. If data residency or infrastructure ownership is a hard requirement, see [Cloud-Prem](#cloud-prem) or [Customer On-Prem](#customer-on-prem). ## Deployment models at a glance | | Cloud-Prem | Customer On-Prem | SaaS Hosted | | :----------------------------- | :---------------------------------------------------------------------------------- | :------------------------------------------ | :---------------- | | Where it runs | Your hyperscaler account (AWS/GCP/Azure) | Your own infrastructure (not a hyperscaler) | WisdomAI's cloud | | Who operates it | Shared (WisdomAI operates the platform; you govern provisioning of cloud resources) | You | WisdomAI | | Object store & Postgres | Cloud provider managed primitives | You provide your own | WisdomAI-provided | | BYO Identity Provider | ✓ | ✓ | ✓ | | BYO LLM | ✓ | ✓ | ✓ | | Data stays in your environment | ✓ | ✓ | — | | Setup complexity | Medium | High | Low | ## FAQs The following questions cover common concerns about data handling across WisdomAI's deployment models. Yes, across all three deployment models. WisdomAI uses AES-256 at rest and TLS 1.2+ in transit. No. For Customer On-Prem deployments, nothing is stored outside of the customer environment. The WisdomAI Customer Success team works jointly with the customer application admin to help set up the WisdomAI SDK and the embeddings database (for RAG) metadata. WisdomAI does not store any personal data, across any of its deployment models. The WisdomAI Platform connects to the customer's data warehouse via native and third-party integrations, and uses functionality provided by OpenAI and Anthropic to convert natural language into database queries and generate business intelligence from the data returned. Zero Data Retention (ZDR) agreements are in place with OpenAI and Anthropic. The customer can also choose to provide their own API key and host the WisdomAI Platform as a private SaaS instance within their environment. ## Related articles Integrate WisdomAI using the iframe embedding path. Use the React SDK for a native component approach. # Provide Feedback to the System Source: https://docs.wisdom.ai/explorers-feedback/provide-feedback-to-the-system Your feedback is essential for improving WisdomAI's accuracy and reliability. By rating answers and providing corrections, you help the system learn and refine its responses. This guide walks you through the feedback process for all users. * [Rate an Answer](#1-rate-an-answer) * [Provide a Correction](#2-provide-a-correction) * [Refine Your Question](#3-refine-your-question) ## 1. Rate an answer After WisdomAI provides an answer, you will see thumbs-up (👍) and thumbs-down (👎) icons. * **Click Thumbs Up (👍):** Use this if the answer is accurate, relevant, and helpful. This positive reinforcement helps the system understand what a good response looks like. * **Click Thumbs Down (👎):** Use this if the answer is incorrect, incomplete, or unhelpful. This flags the response for review. ## 2. Provide a correction When you click **Thumbs Down (👎)**, you will be prompted to provide more details. This is the most direct way to teach the system. * **If the answer was incorrect:** Provide the correct answer in the text field. * **If the answer was incomplete:** Add the missing context or information. Image showing the Thumb Down action in chat Currently, feedback icons (thumbs-up and thumbs-down) appear only for responses containing charts or structured data. Feedback for text-only responses is not yet supported, but will be available in a future update. ## 3. Refine your question You can also provide feedback by rephrasing your original question. If an initial query does not provide the desired result, refining it with more specific details helps WisdomAI learn to interpret your intent more accurately. ## Next steps Walk through the initial setup to connect a data source and run your first query. Test and validate both natural language responses and SQL query results directly within the chat interface. # Chat with a Dashboard Source: https://docs.wisdom.ai/explorers/chat-dashboard Chat with a Dashboard embeds a conversational AI copilot directly into dashboard pages. You can ask natural-language questions about your dashboard data, get AI-generated executive summaries, see what changed since your last visit, and add new widgets to the dashboard, all without leaving the page. ## Before you start To use this feature, make sure you have a dashboard to chat with. If you haven't created one yet, see [Turn Answers into Dashboards](/using-wisdom-ai-everyday/turn-answers-into-dashboards) or [Build Dashboards](/improve-wisdom-ai-responses/build-dashboards). ## Ask a question about your dashboard data When you open a dashboard, the chat sidebar opens on the right side of the page, and two AI-generated tiles appear at the top: * **Executive Summary**: A streaming narrative summary of all data in the current dashboard. The Executive Summary can be customized to focus on the metrics and dimensions most relevant to you and your team. Use the customization options on the tile to tailor the narrative to your audience. Executive Summary tile  customization options * **With changes since**: A comparison highlighting differences since your last visit or a specific date. You can select what suits you best. Executive Summary tile  customization options These tiles load automatically. No action is required to generate them. dashboard-tiles To start a chat with a dashboard: 1. Click **Dashboards** on the sidebar. 2. Select the dashboard you want to chat with. select-dashboard-image 3. Click the chat input at the bottom of the sidebar and type a natural-language question about the data shown on the dashboard. 4. Press **Enter** or click the send button. dashboard-input The AI agent responds with data, tables, or charts scoped to the dashboard's domain. Chat with a question typed in, and an AI response ## Add tiles to the dashboard You can add new tiles to the dashboard directly from a chat response. Three tile types are available: * **Visualization**: Wisdom queries your connected data source and returns an answer to your input. You can review the result, and once you're happy, click **Add latest visualization as a Tile** to lock it onto your dashboard. From then on, that metric is always visible without having to ask the question again. tile-visualization * **SQL query**: A tile that runs a custom SQL query directly against your data source. When you add a SQL tile, WisdomAI automatically generates the query based on your question. You can review and edit the query in the built-in SQL editor, give the tile a title, then click **Execute SQL** to preview the result. Once confirmed, click Add as Tile to pin it to your dashboard. * **Summary**: A narrative text tile generated by WisdomAI that interprets and explains your dashboard data. When you add a summary tile, you can give it a title, write custom instructions to guide the format and focus of the summary. tile-summary ## Next steps Set up automated notifications to keep stakeholders updated with the latest dashboard insights. Learn how to share your dashboards with others and manage who can view or edit them. # Getting Started for Explorers Source: https://docs.wisdom.ai/explorers/getting-started-explorers Welcome to WisdomAI. As an Explorer, you are the engine of data-driven decision-making. Your role is to transform raw data into meaningful business reports by asking questions in plain English, analyzing trends, and sharing those insights with your team. This guide will help you navigate the platform and start uncovering insights in minutes. ## Power your analysis Whether you need a quick answer or a deep dive, WisdomAI scales with you. You can easily query your data, fine-tune the logic for precision using SQL, and build insightful dashboards to share with your team: Query your data using natural-language, just like you're talking to a colleague. Compile findings into dynamic, narrative-driven reports. Export or email your findings to keep your stakeholders informed. ## Get started in 3 steps Follow this path to go from your first login to expert analysis. Navigate to **New Chat** in the left sidebar. Type a specific question about your business, such as: > "What was our total revenue by region last quarter?" For complex queries, you can use [**Deep Analysis**](/advanced-features/deep-analysis). Simply propose your question, and the AI will outline an investigation plan for you. Once you confirm it, WisdomAI carries it out in the same chat window. Once WisdomAI provides an answer, use the **Filters** option to narrow your focus. You can filter by dates, specific table data, or product categories to get the exact data you need. Don't let your answers sit in the chat. Use the **Add to Dashboard** feature to combine multiple visualizations and your own commentary into a shareable report. ## Essential guides for Explorers Master the platform by exploring these detailed resources. Learn how to phrase queries using specific terms and timeframes for the most accurate results. Master the art of building interactive reports and diagrams to communicate insights. Help WisdomAI learn your company's unique terminology and logic by rating responses. Understand how to integrate and analyze your own data stored in CSV, TSV, or Excel formats. # Connect via AWS VPC Peering Source: https://docs.wisdom.ai/getting-started/connect-data-sources/connect-aws-vpc-peering This method establishes a private, secure connection between WisdomAI's AWS environment and your Amazon VPC. This process is managed with the help of the WisdomAI support team. VPC Peering cannot be configured directly in the UI. You must contact the WisdomAI support team to initiate this process. ## Prerequisites Before you begin, ensure you have the following: * An active WisdomAI account. * A supported data source (e.g., Redshift, Databricks) that is already deployed and running within an AWS VPC. * Access to an AWS IAM user or role with permissions to manage your VPC. Specifically, you will need to be able to: * View VPC details (like VPC ID and CIDR blocks). * Accept VPC peering requests. * Modify VPC route tables and security groups. ## Supported data sources This connection method is applicable to any supported data source you have deployed within an AWS VPC, including but not limited to: * Amazon Redshift * Databricks (when deployed on AWS) * ClickHouse (when deployed on AWS) ## Configuration steps 1. Collect the following details from your AWS account: * AWS Account ID and Region of the VPC * VPC ID * VPC CIDR block(s) (both primary and any secondary) 2. Email the information gathered in the previous step to the WisdomAI support team at `support@askwisdom.ai` to request a VPC peering connection. 3. The WisdomAI team will initiate a VPC peering request. You will receive an email with the request details and instructions to accept it within your AWS Management Console. 4. After accepting the request, you must update your VPC's route tables to direct traffic destined for the WisdomAI VPC through the peering connection. You also need to configure your security group rules to allow inbound traffic from WisdomAI's VPC CIDR. The support team will provide all necessary information for these steps. ## Next steps Connect to Amazon Redshift using three methods: Direct Connection, SSH Tunnel, or VPC Peering, according to your network architecture. Connect to Databricks using a Client ID and Client Secret for authentication, enabling secure and controlled access to your data. Connect to Google BigQuery using a Google Cloud Platform Service Account for secure and granular access to your data. # Connect to an MCP Server Source: https://docs.wisdom.ai/getting-started/connect-data-sources/connect-mcp-server WisdomAI allows you to connect to any server that implements the [Model Knowledge Protocol (MCP)](https://modelcontextprotocol.io/docs/getting-started/intro). This integration enables WisdomAI to scan metadata, build a knowledge graph, and fetch real-time data to generate visualizations when users ask natural-language questions. ## Prerequisites * [Admin access](/manage-account/access-management) to your WisdomAI Organization. * The Server URL (for HTTP/SSE) or Command (for STDIO) of your MCP server. * Authentication credentials (API Key or OAuth configuration), if required by your server. ## Connect an MCP Server Follow these steps to register your MCP server as a data source in WisdomAI. 1. Navigate to **Connections** > **Add Connection**. 2. In the **Data source** dropdown, select **MCP Server**. 3. Enter a unique **Connection name** (e.g., "Linear MCP Server"). 4. Select the **Transport Type** supported by your server: * **Streamable HTTP**: Uses standard HTTP streaming for communication. * **SSE**: Uses Server-Sent Events. * **STDIO**: Runs the server as a local process via standard input/output. 5. Enter the **Server URL** (for HTTP/SSE) or connection details. 6. Select the **Authentication Type**: * **None**: For public or internal servers without auth. * **API Key**: Uses a static key for all requests. * **OAuth**: Uses user-based authentication. 7. (Optional) Click **+ Add Header** to include custom headers required by your environment. Mcp 01 Mcp 01 8. Click **Connect**. You may be prompted to authorize the connection to validate the setup. Chat interface prompting the user to authenticate with the MCP tool Chat interface prompting the user to authenticate with the MCP tool **User-based authentication** If you select **OAuth**, authentication happens on a user-by-user basis. WisdomAI does not store a global credential. Instead, when a user asks a question that requires data from this server, WisdomAI will prompt them to authenticate via a secure pop-up during the chat session. ## Validate the connection Once connected, you can verify the integration by asking a natural language question in the chat interface. 1. Start a **Chat**. 2. Ask a question relevant to the connected tool (e.g., "Show me my issues"). 3. If using OAuth, and you haven't authenticated yet, WisdomAI will detect the need for authentication. Click **Connect** in the chat response and Authorize the request in the pop-up window. \ WisdomAI will pull the requested data and generate the appropriate visualization or text response. Mcp 02 Mcp 02 ## Next steps Connect to Databricks using a Client ID and Client Secret for authentication, enabling secure and controlled access to your data. Connect to Google BigQuery using a Google Cloud Platform Service Account for secure and granular access to your data. Connect to Amazon Redshift using three methods: Direct Connection, SSH Tunnel, or VPC Peering, according to your network architecture. # Connect to Amazon Redshift Source: https://docs.wisdom.ai/getting-started/connect-data-sources/connect-to-amazon-redshift WisdomAI allows you to connect to Amazon Redshift by choosing one of three methods: 1. [Direct Connection](#option-1-direct-connection) 2. [Connect via an SSH Tunnel](#option-2-connect-via-an-ssh-tunnel) 3. [Connect via VPC Peering](#option-3-connect-via-vpc-peering) This flexibility ensures you can establish a secure connection that matches your specific network architecture. ## Prerequisites Before you begin, make sure you have the following: * Your Amazon Redshift cluster endpoint, port, database name, and user credentials. * Network access that allows WisdomAI to connect to your Redshift cluster. This may require configuring your firewall or AWS security groups. * If using an SSH tunnel, you need the credentials for your bastion host. * If using VPC peering, you need permissions to manage VPC settings in your AWS account. ## Option 1: Direct connection Use this method if your Redshift cluster is publicly accessible or if you have allowlisted WisdomAI's CIDR blocks (`35.238.115.103/32` and `34.82.248.105/32`) in your security group. 1. In WisdomAl, navigate to the **Connections** section and click **Add Connection**. 2. Select **Redshift** as the data source type. 3. Fill in the connection details in the **Redshift connection details** section: | Requirement | Description | | :--------------- | :----------------------------------------------- | | Host | Redshift cluster endpoint | | Port | Typically `5439` | | Username | Database user with read access | | Password | User password | | Database Filters | Optionally restrict which databases are crawled. | 4. Click **Save and Sync metadata.** WisdomAl will use the provided credentials to connect to your Redshift account and scan the metadata of the specified databases and tables. Snippet displaying the Add Connection page Snippet displaying the Add Connection page Snippet displaying the Add Connection page ## Option 2: Connect via an SSH tunnel Use this method to securely connect to a Redshift cluster that is not publicly accessible by routing traffic through a bastion host. 1. On the **Add Connection** page, fill in the direct connection details and expand the **SSH Tunnel Configuration** section. 2. Complete the **SSH Tunnel configuration fields**. | Requirement | Description | | :----------------------- | :------------------------------------------------------------ | | SSH Host | Hostname or IP address of the bastion host | | SSH Port | Port number on the SSH host (e.g., `22`) | | SSH Username | The username required to log in to the bastion host | | Authentication Method | Authenticate using either a **Private Key** or a **Password** | | SSH Private Key/Password | The Private Key or Password for the SSH authentication | 3. Click **Save and Sync metadata.** Snippet displaying the Add Connection page with the SSH Tunnel Configuration section displayed Snippet displaying the Add Connection page with the SSH Tunnel Configuration section displayed ## Option 3: Connect via VPC peering This method establishes a private and secure network connection between WisdomAI's AWS environment and your Amazon VPC, preventing exposure to the public internet. This is a standardized procedure for all supported data sources hosted on AWS. For the complete, step-by-step instructions, please refer to our comprehensive guide: [Connect via AWS VPC Peering](/getting-started/connect-data-sources/connect-aws-vpc-peering). ## Next steps Connect to Databricks using a Client ID and Client Secret for authentication, enabling secure and controlled access to your data. Connect to Google BigQuery using a Google Cloud Platform Service Account for secure and granular access to your data. Walk through the initial setup to connect a data source and run your first query. # Connect to Databricks Source: https://docs.wisdom.ai/getting-started/connect-data-sources/connect-to-databricks WisdomAI connects to Databricks using a **Client ID** and **Client Secret** for authentication. This method ensures secure and granular control over the data WisdomAI can access. ## Prerequisites Before you begin, make sure you have the following: * An active Databricks workspace. * Permissions to create and manage **Service Principals** within your Databricks account or workspace. * A Databricks **SQL Warehouse** set up and running. ## 1. Obtain Databricks connection details You will need the following four pieces of information from your Databricks environment: 1. **Host**: The URL of your Databricks workspace, which typically looks like `https://.cloud.databricks.com/`. You can find this in your SQL Warehouse connection details. 2. **HTTP Path**: The specific path to your SQL Warehouse, usually starting with `/sql/1.0/warehouses/`. You can find this in the "Connection Details" tab of your SQL Warehouse. 3. **Client ID**: The Application ID of your Databricks Service Principal. 4. **Client Secret**: The secret key generated for your Databricks Service Principal. ### How to find your connection details Follow these steps to find the necessary credentials. #### Host and HTTP path 1. Navigate to your Databricks Workspace. 2. Go to **SQL Warehouses** (or SQL Endpoints). 3. Select the warehouse you want to connect to. 4. Click on the **Connection Details** tab. Here you will find the **Server Hostname** (your Host) and the **HTTP Path**. #### Client ID and client secret (using a Databricks-managed Service Principal) You'll first need to create a Service Principal in Databricks. **Step 1: Create a Service Principal** 1. Log in to your Databricks environment. * **A) account-level permissions:** Log in to your Databricks **account console**. * **B) administrator-level permissions:** Log in to your Databricks **workspace** as an administrator. 2. Navigate to the Service Principals section. * **A) From Account Console:** Navigate to **User management > Service principals**. * **B) From Workspace:** Navigate to **Admin Settings** (click your username in the top right, then Admin Settings) > **Identity and access > Service principals**. 3. Click **Add service principal**. 4. Select **Databricks managed**. 5. Provide a descriptive **Name** for the service principal (e.g., WisdomAI-ServicePrincipal). 6. Click **Add service principal**. 7. Once created, you will see the **Application ID** for this service principal. This is your **Client ID**. Copy this value. **Step 2: Generate a Client Secret for the Service Principal** 1. From the service principal's page, go to the **Secrets** tab. 2. Under OAuth secrets, click **Generate secret**. 3. Set a lifetime for the secret (up to 730 days) and click **Generate**. Choose an expiration that balances security and operational convenience. 4. Immediately copy the displayed secret. This is your **Client Secret**. The Client Secret is only shown once and cannot be retrieved later. Please store it in a secure location immediately. ## 2. Assign permissions in Databricks The Service Principal needs specific permissions to access the required data that WisdomAI needs. * **SQL Warehouse/Cluster Permissions**: Grant **CAN USE** permission to the Service Principal on the SQL Warehouse you are connecting to. You can do this from the **Permissions** tab of the SQL Warehouse. * **Data Privileges**: The service principal requires the following privileges in Unity Catalog (or Hive Metastore): * `USE CATALOG` on the target catalog. * `USE SCHEMA` on the target schema. * `SELECT` on the tables and views you want WisdomAI to access. You can grant these permissions using SQL commands. Here are some examples: ```sql theme={null} -- Grant permission to use a specific catalog GRANT USAGE ON CATALOG TO ``; -- Grant permission to use a specific schema GRANT USAGE ON SCHEMA . TO ``; -- Grant select permission on table GRANT SELECT ON TABLE .. TO ``; -- Grant select permission on all tables in a schema GRANT SELECT ON SCHEMA . TO ``; ``` Replace `` with the Application ID of your service principal, and ``,``, and `` with your specific values. ## 3. Connect WisdomAI to Databricks Once you have gathered the required information, you can configure the connection in WisdomAI: 1. In WisdomAI, navigate to the **Connections** section and click **Add Connection**. 2. Select **Databricks** as the data source type. 3. Fill in the connection details in the "Databricks connection details" section. * **Connection Name**: Choose a descriptive name for your connection (e.g., "Databricks Prod"). * **Host**: Paste the Server Hostname you obtained from Databricks. * **HTTP Path**: Paste the HTTP Path for your SQL Warehouse. * **Client ID**: Enter your Client ID (Application ID). This field is mandatory. * **Client Secret**: Enter your Client Secret (the value copied immediately after creation). This field is mandatory. * **Catalog Filters (Optional)**: Specify any Catalog Filters if you want to further restrict the catalogs/schemas WisdomAI crawls. 4. Click **Save and Sync metadata**. WisdomAI will use the provided credentials to connect to Databricks and scan the metadata of the specified catalogs and tables. image.png image.png ## Security considerations and best practices * **Least Privilege**: Always follow the principle of least privilege. Only grant the necessary permissions to the Service Principal. * **Secure Key Management**: Treat your Client ID and Client Secret like passwords. Avoid sharing them via insecure channels, such as unencrypted email. Use secure methods, such as LastPass or other secure file-sharing services. * **Credential Rotation**: Regularly rotate your Client Secrets to enhance security, especially before their expiration. ## Troubleshooting common issues Having trouble? Here are solutions to some frequently encountered problems. ### Authentication failed or invalid credentials * Ensure the Host, HTTP Path, Client ID, and Client Secret are complete and correct. No extra characters, spaces, or missing lines. * Verify that the Client Secret has not expired or been revoked in Databricks. * Confirm that the Service Principal exists and is enabled in Databricks. ### Permission denied errors * Double-check that the Service Principal has the necessary `CAN USE` permission on the SQL Warehouse. * Verify that the Service Principal has the correct `USE CATALOG`, `USE SCHEMA`, and `SELECT` privileges on the Databricks catalogs, schemas, and tables you are trying to access. * Confirm that the SQL Warehouse is running and accessible. ### Catalog not found or table not found * Verify the spelling of the catalog or table names. * If using catalog filters in WisdomAl, ensure the catalog is included in the filter. * Confirm that the Service Principal has permissions on the specific catalog you are trying to access. ### Connection timeout or network errors * Verify that WisdomAI's CIDR blocks (`35.238.115.103/32` and `34.82.248.105/32`) are allowlisted in your Databricks network policies or any corporate firewalls. ## Next steps Connect to Snowflake directly or via a proxy using key-pair authentication and a Snowflake virtual warehouse. Connect to Google BigQuery using a Google Cloud Platform Service Account for secure and granular access to your data. Walk through the initial setup to connect a data source and run your first query. # Connect to Google BigQuery Source: https://docs.wisdom.ai/getting-started/connect-data-sources/connect-to-google-bigquery WisdomAI connects to Google BigQuery using a service account for background operations such as metadata crawling. To run end-user queries, you can either continue using that same service account or enable Google OAuth so each user authenticates with their own Google account for finer-grained access control and per-user audit trails. ## Prerequisites * A GCP service account created with the required BigQuery roles. See [Set up a GCP service account for WisdomAI](/getting-started/connect-data-sources/set-up-gcp-service-account). * The JSON key file for that service account, downloaded to your computer. * Your Google Cloud project ID, available on the GCP Console dashboard. ## Create the connection These steps create the connection in WisdomAI and authenticate the service account. Complete them whether you plan to use service account authentication only or enable OAuth on top. 1. In WisdomAI, go to **Connections** and click **Add Connection**. 2. Select **BigQuery** as the data source type. Add Connection screen showing BigQuery selected as the data source type 3. Enter a **Connection name**, for example `BigQuery Prod`. 4. Under **Account Information**, paste the contents of your service account JSON into **Service Account Info JSON**. This field is required for crawling and metadata discovery. 5. (**Optional**) Enter **Authorization scopes** to restrict the OAuth permission scopes granted to the connection. 6. (**Optional**) Enter a **Billing Project ID** to specify which project to bill for queries. Leave this field empty to use your service account's default project. 7. Under **Projects**, configure at least one BigQuery project: * In the **Project 1** card, enter your Google Cloud **Project ID**. * (**Optional**) Enter **Dataset filters** to restrict which datasets WisdomAI crawls for that project. * To connect additional projects, click **+ Add Project** and repeat these sub-steps for each one. Connection Details At this point, you have two options: * To use the service account for all queries, click **Save and Sync metadata**. WisdomAI connects to BigQuery, scans metadata for the specified datasets and tables, and your connection is ready. * To authenticate end-user queries with individual Google accounts, leave the form open and continue to the next section before saving. ## Enable OAuth for user queries OAuth lets each WisdomAI user run BigQuery queries under their own Google identity. The service account still handles crawl jobs and metadata discovery in the background. Enabling OAuth requires you to work across two systems. You will create an OAuth client in the Google Cloud Console, then return to WisdomAI to paste the credentials and authenticate. ### Start the OAuth setup in WisdomAI Begin in the connection form you already filled out in the previous section. 1. Select **Enable OAuth for user queries (optional)**. The **Google OAuth Client ID** and **Google OAuth Client Secret** fields appear. 2. Leave the form open. You will return here after creating the OAuth client in Google Cloud. Enable OAuth for user queries checkbox ### Create an OAuth client in Google Cloud The OAuth client lets WisdomAI request access tokens on behalf of your users. 1. In the Google Cloud Console, open the **Google Auth Platform**. 2. Go to **Clients** and access **Create OAuth client ID**. 3. Set **Application type** to **Web application**. 4. Enter a **name** for the client, for example `WisdomAI`. 5. Leave **Authorized JavaScript origins** empty. 6. Under **Authorized redirect URIs**, add: ```text theme={null} https://api.descope.com/v1/outbound/oauth/callback ``` 7. Click **Create**. Google Cloud Console OAuth client creation 8. Google Cloud displays a confirmation dialog with the new credentials. Copy the **Client ID** and **Client Secret**, and optionally click **Download JSON** to save them locally for reference. Oauth Step8 ### Authenticate in WisdomAI Return to the WisdomAI connection form to finish the OAuth setup. 1. Paste the **Client ID** and **Client Secret** into the corresponding fields. 2. Click **Connect with Google**. 3. In the Google sign-in popup, select the Google account you want to use for authentication. O Auth Signin Google Account 4. After successful authentication, you are redirected back to WisdomAI. Verify that the OAuth connection status shows as connected. 5. Click **Save** to complete the connection setup. ## Security considerations Follow these practices to keep your BigQuery connection secure: * **Least privilege.** Grant only the roles WisdomAI needs. If dataset-level access is sufficient, avoid assigning project-level roles. * **Secure key management.** Treat the service account JSON key like a password. Store it in a secrets manager and share it only through secure channels such as a password manager. * **OAuth for audit trails.** When you need per-user accountability for query activity, enable OAuth so each query runs under an individual Google identity. ## Troubleshooting Common issues you might run into when setting up the connection. * Confirm the JSON key you pasted is complete, with no missing lines or extra characters. * Verify that the `project_id` value in the JSON key matches the project ID you entered in the connection form. * Check that the service account has all three required roles: **BigQuery Data Viewer**, **BigQuery Job User**, and **BigQuery Read Session User**. * Confirm those roles are assigned at the right level — either project-wide, or on every dataset WisdomAI needs to read. * Confirm the BigQuery API is enabled in your Google Cloud project. * Verify the spelling of the dataset and table names. * If you set **Dataset Filters** in the connection, confirm the dataset is included in the filter. * Confirm the service account has access to the specific dataset you are querying. ## Next steps Connect to Snowflake directly or via a proxy using key-pair authentication and a Snowflake virtual warehouse. Connect WisdomAI to any server implementing the Model Context Protocol (MCP) to scan metadata, build a knowledge graph, and retrieve real-time data for natural language queries. Walk through the initial setup to connect a data source and run your first query. # SharePoint Source: https://docs.wisdom.ai/getting-started/connect-data-sources/connect-to-sharepoint WisdomAI supports connecting to Microsoft SharePoint as an unstructured data source. The SharePoint connector crawls files from your SharePoint sites and enables multi-site ingestion of diverse file formats, including PDFs, spreadsheets, and images, while providing granular filtering to ensure that only new or modified content is processed after the initial crawl. ## Get started Before you begin, ensure you have the following: * **SharePoint Online:** The connector works with SharePoint Online (part of Microsoft 365). On-premises SharePoint Server is not supported. * **SharePoint Site URLs:** The full URLs of the sites you want to connect (e.g., `https://contoso.sharepoint.com/sites/teamsite`). * **Azure AD permissions**: The connector requires the following Microsoft Graph API application permissions granted on your Azure AD tenant: * `Sites.Read.All`: Read items in all site collections. * `Files.Read.All`: Read all files that the app has access to. * **Authentication Methods:** You must have one of the authentication methods configured: * An Azure AD app registration with a client secret (Service Principal). * Your Azure AD Tenant ID for the WisdomAI-managed app (Dedicated Multitenant App). ## Authentication methods Choose the authentication method that best fits your organization's security requirements. Use your own Azure AD app registration to authenticate. This gives you full control over the app and its permissions. 1. In the [**Azure Portal**](https://portal.azure.com), navigate to **Azure Active Directory** > **App registrations** > **New registration**. 2. Register a new application (e.g., "WisdomAI SharePoint Connector"). 3. Note the **Application (client) ID** and **Directory (tenant) ID** from the **Overview** page. 4. Navigate to **Certificates & secrets** > **New client secret**. 5. Create a secret and copy the **Value** immediately; it will not be shown again. 6. Navigate to **API permissions** > **Add a permission** > **Microsoft Graph** > **Application permissions**. 7. Add the following permissions: * `Sites.Read.All` * `Files.Read.All` 8. Click **Grant admin consent** to approve the permissions for your tenant. You will need the following values when configuring the connection in WisdomAI: | Field | Description | | :------------ | :----------------------------------------------------- | | Client ID | The Application (client) ID from your app registration | | Tenant ID | The Directory (tenant) ID of your Azure AD tenant | | Client Secret | The client secret value you generated | WisdomAI creates and manages the Azure AD app on your behalf. You only need to provide your Tenant ID and grant admin consent. 1. Locate your **Azure AD Tenant ID** in the [Azure Portal](https://portal.azure.com) under **Azure Active Directory** > **Overview**. 2. During the WisdomAI connection setup, enter your **Tenant ID**. 3. Click **Grant Admin Consent** when prompted. 4. A Microsoft consent dialog will open. You must approve the permissions (`Sites.Read.All` and `Files.Read.All`) for the WisdomAI-managed app. 5. The status in WisdomAI will update to **Granted** once approved. Granting admin consent for these permissions requires a user with the **Global Administrator** or **Privileged Role Administrator** role in your Azure AD tenant. *** ## Setting up the connection Follow these steps to establish the connection within WisdomAI: 1. Navigate to the **Overview** tab in your WisdomAI domain and click **Add Data Source**. 2. Select **Connect another source** from the **Add** **Data Source** selector and click **Add Data Source**. sharepoint-add-data 3. Select **Connect to Data store or MCP server**. 4. Enter a descriptive **Connection name** (e.g., "Marketing SharePoint") and select **SharePoint** as the data source. sharepoint-connect-source 5. **Configure Authentication:** Choose your preferred method (Service Principal or Dedicated Multitenant App) and enter the required credentials. Sharepoint Cd 6. **Configure SharePoint Sites:** * Click **Add Site** and enter the full **Site URL** (e.g., `https://contoso.sharepoint.com/sites/teamsite`). You can add multiple sites to a single connection. * (Optional) Click **Add Library** to restrict crawling to specific document libraries. If left blank, all libraries on the site are crawled. * (Optional) Click **Add Path** to restrict crawling to specific folders within a library. Enter the path prefix (e.g., `Marketing/2024`) without a leading `/`. 7. Click **Save**. WisdomAI will validate the credentials before saving. sharepoint-sites 8. After the connection is created, add it as a data source to your domain. WisdomAI will begin crawling the configured SharePoint sites. ## Configuration reference This section details the parameters used to define the scope of your data connection. ### Sites Each connection can include one or more SharePoint sites. At least one site is required. | Field | Required | Description | | :--------------------- | :------- | :------------------------------------------------------------------------------------------- | | **Site URL** | Yes | The full URL of the SharePoint site (e.g., `https://contoso.sharepoint.com/sites/teamsite`). | | **Document Libraries** | No | Optionally restrict which document libraries within the site are crawled. | ### Document libraries Within each site, you can optionally specify which document libraries to crawl. If none are specified, all document libraries in the site are included. | Field | Required | Description | | :---------------------- | :------- | :---------------------------------------------------------------- | | **Library Name** | Yes | The name of the document library (e.g., `Documents`). | | **Path Prefix Filters** | No | Optionally restrict which folders within the library are crawled. | ### Path prefix filters Within each document library, you can optionally specify folder path prefixes to scope the crawl. If none are specified, all files in the library are included. * **Formatting:** Do **not** include a leading `/`. Use `Reports/Q1`, not `/Reports/Q1`. * **Case-Sensitivity:** Filters are case-insensitive (e.g., `Marketing` matches `MARKETING`). * **Matching:** Filters match on prefix. `Marketing` will match `Marketing/file.pdf` and `Marketing/2024/report.pdf`. * **Multiple Filters:** You can add multiple filters per library. A file is included if it matches **any** configured filter. **Example configuration**: ```txt theme={null} Site: Library: Shared Documents Path Filter: Campaigns/2024 Path Filter: Brand Guidelines Library: Reports (no path filters — all files in this library are crawled) ``` ## Troubleshooting * Verify that the **Client ID**, **Tenant ID**, and **Client Secret** are correct and have not expired. * For the Dedicated Multitenant App method, confirm that admin consent has been granted (the status should show "Granted" in WisdomAI). * Confirm the Site URL is correct and accessible. Ensure the **Site URL** points to a specific site, not the root SharePoint domain. * Verify the **Library Name** matches the SharePoint library exactly. * If using path prefix filters, verify the paths exist and do not start with `/`. * Ensure the Azure AD app's permissions (`Sites.Read.All`, `Files.Read.All`) have been granted admin consent. * The app may authenticate successfully but lack access to certain sites. Verify that your Azure AD app permissions are tenant-wide (admin-consented), not scoped to specific sites only. * The user granting consent must have the **Global Administrator** or **Privileged Role Administrator** role in Azure AD. * If your organization restricts app consent, contact your Azure AD administrator. ## Next steps Learn how to connect WisdomAI to GoogleSheets. Learn how to connect WisdomAI to Slack. # Connect to Snowflake Source: https://docs.wisdom.ai/getting-started/connect-data-sources/connect-to-snowflake WisdomAl supports connecting to Snowflake directly or via a Proxy. This document outlines the process for direct connections. ## Prerequisites Before connecting WisdomAl to Snowflake, be sure to have: * An active Snowflake account and workspace. * A Snowflake virtual warehouse with appropriate compute resources. * A Snowflake user with the necessary permissions to create or assign roles and manage private keys. * Network access configured to allow connections from WisdomAl to your Snowflake instance. ## 1. Information required for direct connection setup: To connect WisdomAl to Snowflake directly, you will need the following information: * **Account**: Your Snowflake account identifier. This consists of the name of the account prefixed by its organization (e.g., myorg-account123). Refer to [the Account identifiers page on the Snowflake documentation](https://docs.snowflake.com/en/user-guide/admin-account-identifier) for details on finding your account identifier. * **Warehouse**: The name of the virtual warehouse to use for compute (e.g., "COMPUTE\_WH"). * **User**: The Snowflake username that WisdomAl will use for access. * **Private Key**: The private key associated with the Snowflake user. Ensure the key is in PEM format, including the `----BEGIN...PRIVATE KEY` and `-END...PRIVATE KEY` headers and footers. Refer to the [Key-pair authentication page on the Snowflake documentation](https://docs.snowflake.com/en/user-guide/key-pair-auth) for details on generating a private key. * **Private Key Passphrase**: This is required if your private key is encrypted. * **Role**: The Snowflake role to use for access privileges (e.g., ACCOUNTADMIN). See the Using a Custom Role section below for details. * **\[Optional] Database Filters**: See the Database Filters section below for more details. * **\[Optional] Allowlist**: You may need to allowlist WisdomAI's CIDR blocks in your Snowflake network policies or firewalls to allow incoming connections: `35.238.115.103/32` and `34.82.248.105/32`. ## 2. Using a custom role: To create a custom role and use it for WisdomAl communication, ensure the role has: * USAGE privilege on the warehouse and on the required databases/schemas. * SELECT privilege on all tables that you want to connect with WisdomAl. Refer to the following SQL statements to grant appropriate privileges: * `grant usage on warehouse to role ;` * For each database: * `grant usage on database to role ;` * `grant usage on all schemas in database to role ;` * `grant select on all tables in database to role ;` * To grant access to all future schemas and tables added in this database: * `grant usage on future schemas in database to role ;` * `grant select on future tables in database to role ;` See [this page of the Snowflake documentation](https://docs.snowflake.com/en/sql-reference/sql/grant-privilege) for more details on granting privileges to your role. ## 3. Connect WisdomAI to Snowflake: Once you have gathered the required information, you can configure the connection in WisdomAI: 1. In WisdomAl, navigate to the **Connections** section and click **Add Connection**. 2. Select **Snowflake** as the data source type. 3. Fill in the connection details in the **Snowflake connection details** section: * **Connection Name**: Choose a descriptive name for your connection (e.g., "Snowflake Prod"). * **Account**: Enter your Snowflake account identifier (e.g., XMSPMYE-PAB51256). * **Warehouse**: Enter the name of your virtual warehouse (e.g., COMPUTE WH). * **User**: Enter the Snowflake username (e.g., user01). * **Private Key**: Paste the content of your private key, including the `BEGIN ENCRYPTED PRIVATE KEY` and `END PRIVATE KEY` headers and footers. * **Private Key Passphrase**: Enter the passphrase if your private key is encrypted. * **Role**: Enter the Snowflake role (e.g., ACCOUNTADMIN). * **Database Filters (Optional)**: Specify any Database Filters if you want to restrict the databases WisdomAl crawls further. 4. Click **Save and Sync metadata.** WisdomAl will use the provided credentials to connect to your Snowflake account and scan the metadata of the specified databases and tables. image.png image.png ## Security considerations and best practices * **Least Privilege**: Always follow the principle of least privilege. Only grant the necessary permissions (USAGE, SELECT) to the Snowflake user that WisdomAl will use, and restrict it to specific warehouses, databases, and schemas. * **Secure Credential Management**: Treat your private key file (rsa\_key.p8) as extremely sensitive. Store it in a secure, encrypted location (e.g., a secrets manager or secure file system). Never hardcode private keys in application code or share them via insecure channels. * **Credential Rotation**: Regularly rotate private keys used for WisdomAl's Snowflake connection. * **Auditing**: Enable and regularly review Snowflake audit logs to monitor access and activity performed by the WisdomAl connection. ## Troubleshooting common issues Having trouble? Here are solutions to some frequently encountered problems. ### Authentication failed or invalid private key * Ensure the private key content is copied exactly, including the `BEGIN` and `END` headers and footers, without any extra spaces or line breaks. * If your private key is encrypted, verify that the Private Key Passphrase is entered correctly. * Confirm that the Snowflake username matches the user associated with the private key. ### Warehouse not found or database not found * Double-check the spelling of the warehouse and database names in the WisdomAl connection details. * Ensure the Snowflake user/role has USAGE privilege on the specified warehouse and database. ### Insufficient privileges * Verify that the Snowflake role assigned to WisdomAl has all the necessary USAGE and SELECT privileges as detailed in the Using a Custom Role section above. * If you're using database filters, ensure the role has privileges on the filtered databases. ### Connection timeout or network errors * Verify that WisdomAl's CIDR block (`35.238.115.103/32` and `34.82.248.105/32`) is allowlisted in your Snowflake network policies or any corporate firewalls. ## Next steps Connect to Databricks using a Client ID and Client Secret for authentication, enabling secure and controlled access to your data. Connect WisdomAI to any server implementing the Model Context Protocol (MCP) to scan metadata, build a knowledge graph, and retrieve real-time data for natural language queries. Walk through the initial setup to connect a data source and run your first query. # Search the Web Source: https://docs.wisdom.ai/getting-started/connect-data-sources/search-the-web WisdomAI can search the internet and fetch content from public web pages when answering user questions. When enabled on a domain, the AI automatically supplements its database-driven analysis with real-time information from the web, such as industry benchmarks, market trends, competitor data, or publicly available reference material. ## Prerequisites * [Admin access](/manage-account/access-management) to your WisdomAI Organization. * An existing [Domain](/setting-up-wisdom-ai/manage-domains/understand-domains) to enable Web Search on. ## 1. Enable web search on a Domain You can enable Web Search when creating a new domain or by adding it as a data source to an existing domain. ### Add web search to an existing Domain 1. Navigate to your **Domain** and open the **Overview** tab. 2. Click **Add Data Source**. 3. In the data source picker, select **Web Search**. 4. Click **Submit**. A confirmation message will appear indicating that Web Search has been enabled. Image ### Enable web search during Domain creation 1. Navigate to **Domains** and click **Add Domain**. 2. Enter a **Domain name**. 3. In the data source selection, choose **Web Search**. 4. Complete the domain creation process. Once enabled, a **Web Search** card will appear on the Domain Overview tab, and a **Web Search** sub-tab will be available under the **Data Sources** tab. Image Image ## 2. Configure the source policy After enabling Web Search, you can control which websites WisdomAI is allowed to search. This is configured through the **Source Policy** on the Web Search configuration page. 1. Go to your **Domain** > **Data Sources** tab > **Web Search** sub-tab. 2. Under **Source Policy**, select one of the three options: | Policy | Description | | :-------------------------------- | :-------------------------------------------------------------------------------- | | **Include all domains** | WisdomAI can search any website. This is the default. | | **Include only specific domains** | WisdomAI will only return results from the listed domains (allowlist). | | **Exclude specific domains** | WisdomAI will return results from all domains except the listed ones (blocklist). | **Include only specific domains** and **Exclude specific domains** are mutually exclusive — you can only use one at a time. 3. If you selected **Include only specific domains** or **Exclude specific domains**, add the domains you want to include or exclude: * Click **Add domain** to add a new entry. * Enter the domain in apex form (e.g., `example.com`). * You can add up to **10 domains**, one per entry. 4. Click **Save Configuration**. Image Image ### Domain format guidelines When entering domains in the source policy, follow these rules: * Use apex domain form: `example.com`, `wikipedia.org` * Subdomains are supported: `subdomain.example.gov` * Bare domain extensions starting with a period are allowed: `.gov`, `.edu`, `.co.uk` * Do **not** include URL schemes (`http://`, `https://`) * Do **not** include `www.` prefixes * Paths are **not** supported (e.g., `example.com/blog` is invalid) ## How web search works in chat WisdomAI uses two tools behind the scenes: * **Web Search**: Searches the web for information relevant to a user's question, returning results with titles, URLs, and content excerpts. * **Web Fetch**: Fetches and extracts content from specific web page URLs. Web Search is an AI-driven tool. WisdomAI decides **when** to invoke web search or fetch based on the user's question. You do not need to explicitly request a web search — if the question benefits from external information, WisdomAI will automatically search the web. When WisdomAI decides to use the web: 1. It calls the **web search** tool with a search objective and optional keyword queries. 2. Results are returned with titles, URLs, publish dates, and content excerpts. 3. If it needs more detail from a specific page, it calls the **web fetch** tool to extract the page content. 4. It synthesizes the web results into a response with **inline citations** and a **Sources** section listing all referenced URLs. Web Fetch can only access publicly available pages. It **cannot** access content behind login walls, authentication gates, or private documents (e.g., private Google Docs). ## Next steps Integrate unstructured data sources, such as documents or knowledge bases, to enrich your analysis. Walk through the initial setup to connect a data source and run your first query. Define relationships and context in your data to enable more powerful analysis. # Set up a GCP service account for WisdomAI Source: https://docs.wisdom.ai/getting-started/connect-data-sources/set-up-gcp-service-account WisdomAI uses a Google Cloud Platform (GCP) service account to authenticate with BigQuery for background operations such as metadata crawling and data discovery. This guide walks you through creating the service account, assigning the required IAM roles, and generating the JSON key that WisdomAI needs to connect. ## Prerequisites * An active Google Cloud project * The BigQuery API enabled in that project * Permission to create service accounts and assign IAM roles in your GCP project ## Create the service account A service account is a Google account that an application uses to make authorized API calls on its own behalf. 1. Open the GCP Console and go to **IAM & Admin** > **Service Accounts**. 2. Click **+ CREATE SERVICE ACCOUNT**. 3. Enter a descriptive **Service account name**, for example `Wisdom-bigquery`. The **Service account ID** is generated automatically from the name. 4. Optionally, add a **Service account description** such as `Service account for WisdomAI BigQuery connectivity`. 5. Click **CREATE AND CONTINUE**. ## Assign IAM roles WisdomAI needs three roles to read metadata, run queries, and stream results efficiently from BigQuery: * **BigQuery Data Viewer**: view BigQuery data and metadata * **BigQuery Job User**: run BigQuery jobs, including queries * **BigQuery Read Session User**: retrieve data efficiently through the BigQuery Storage API Assign these roles at the project level for broad access: 1. On the **Grant this service account access to project** step, open the **Select a role** dropdown. 2. Add **BigQuery Data Viewer**, **BigQuery Job User**, and **BigQuery Read Session User**. 3. Click **DONE**. ### Restrict access to specific datasets If you want WisdomAI to access only certain datasets in your project, grant data roles at the dataset level instead of the project level. 1. Open BigQuery in the GCP Console and select the dataset you want to share. 2. Click **SHARE DATASET**. 3. In the **Add principals** field, enter the email address of the service account. 4. Assign **BigQuery Data Viewer** and **BigQuery Read Session User** to the service account for this dataset. 5. Repeat for every dataset WisdomAI needs to access. 6. Assign **BigQuery Job User** once at the project level. This role cannot be granted at the dataset level. ## Generate a JSON key WisdomAI authenticates with BigQuery using a JSON key file associated with the service account. 1. Go back to **IAM & Admin** > **Service Accounts** and click the service account you created. 2. Open the **KEYS** tab. 3. Click **ADD KEY** > **Create new key**. 4. Select **JSON** as the key type and click **CREATE**. The key file downloads to your computer. The JSON key file contains sensitive credentials. Treat it like a password: store it in a secrets manager or secure file-sharing tool, and never send it over unencrypted email or chat. ## Next steps Use the service account to create a BigQuery connection in WisdomAI. Connect to Snowflake directly or via a proxy using key-pair authentication. # Supported Data Sources Source: https://docs.wisdom.ai/getting-started/connect-data-sources/supported-data-sources This page covers the data sources that can be connected to WisdomAI, including databases, data warehouses, and Files (PDFs, PPTs, Docs). It outlines the connection requirements, necessary configurations, and troubleshooting tips for seamless integration. WisdomAI works with the following data sources: ## Warehouse & Database sources * PostgreSQL * Microsoft SQL Server * MySQL * Oracle * Databricks * Snowflake * Google BigQuery * Google Cloud Spanner * Amazon Redshift * Amazon Athena * Teradata * Azure Synapse & Synapse Serverless * ClickHouse (Beta) * Trino (Beta) * CSV files **Note on Syncing**: After successfully adding a connection, the initial sync may take a few minutes to complete before data is available for analysis. ## File & Repository sources * Amazon S3 * Google Cloud Storage (GCS) * Azure Blob Storage * SharePoint * Direct upload * GitHub Supported file types: PDFs, DOC/DOCX files, PowerPoint files, txt files, and images. To learn how to connect to your Data Sources, read the [Basic Tutorial: Connect and Test](/setting-up-wisdom-ai/basic-tutorial-connect-and-test). ### Connection requirements This section outlines common prerequisites for connecting to data sources. Specific requirements are detailed under each data source. * **Network Access:** Ensure WisdomAI has network access to your database or data warehouse host. This may involve configuring firewall rules or security groups. * **Authentication Details:** You will need the correct credentials (username, password, keys, etc.) for your chosen data source. * **SSL/TLS Configuration:** For secure connections, ensure your database/data warehouse is configured to accept SSL/TLS connections, and configure WisdomAI accordingly (e.g., `SSL Mode: require` for PostgreSQL). * **Service Accounts (Google BigQuery):** A Google Cloud service account with appropriate BigQuery permissions is required. For PostgreSQL and Amazon Redshift, you can optionally configure an SSH Tunnel to connect through a bastion host. The following table lists the requirements you must provide when connecting to PostgreSQL. If your database is protected by a firewall or network access policies, allowlist both of WisdomAI's CIDR blocks (35.238.115.103/32 and 34.82.248.105/32). SSH settings are optional. | Requirement | Description | | :----------------------- | :----------------------------------------------------------------------- | | Host | Server address or IP | | Port | Typically `5432` | | Database | Name of the database | | Username | Database user with read access | | Password | User's password | | SSH Host | Hostname or IP address of the bastion host (Optional) | | SSH Port | Port number on the SSH host (Optional) | | SSH Username | The username required to log in to the bastion host (Optional) | | Authentication Method | You can authenticate using either a Private Key or a Password (Optional) | | SSH Private Key/Password | The Private Key or Password used for the SSH authentication (Optional) | Find below an example connection: ```txt theme={null} Host: postgres.example.com Port: 5432 Database: analytics Username: wisdom_reader Password: ******** SSL Mode: require ``` The following table lists the requirements you must provide when connecting to Microsoft SQL Server. If your database is protected by a firewall or network access policies, allowlist both of WisdomAI's CIDR blocks (35.238.115.103/32 and 34.82.248.105/32). | Requirement | Description | | :----------------------- | :-------------------------------------------- | | Server | SQL Server address or instance name | | Port | Typically `1433` | | Database | Name of the database | | Authentication | SQL Server or Windows Authentication | | Username | SQL Server login with read access | | Password | Login password | | Trust Server Certificate | Whether to trust the server's SSL certificate | Here's an example connection: ```txt theme={null} Server: sqlserver.example.com Port: 1433 Database: business_data Authentication: SQL Server Username: wisdom_reader Password: ******** Trust Server Certificate: True ``` The following table lists the requirements you must provide when connecting to Databricks. If your database is protected by a firewall or network access policies, allowlist both of WisdomAI's CIDR blocks (35.238.115.103/32 and 34.82.248.105/32). | Requirement | Description | | :-------------- | :------------------------------- | | Server Hostname | Databricks SQL endpoint hostname | | HTTP Path | HTTP path for the SQL endpoint | | Username | Databricks username | | Password | Databricks password | | Catalog | Optional Databricks catalog name | | Schema | Optional schema name | Below is an example key pair connection: ```txt theme={null} Server Hostname: dbc-xxxx-yyyy.cloud.databricks.com HTTP Path: /sql/1.0/warehouses/abcdef123456 Username: wisdom_user Password: ******** Catalog: main Schema: default ``` The following table lists the requirements you must provide when connecting to Snowflake. If your database is protected by a firewall or network access policies, allowlist both of WisdomAI's CIDR blocks (35.238.115.103/32 and 34.82.248.105/32). | Requirement | Description | | :--------------- | :------------------------------------ | | Account | Snowflake account identifier | | Username | Snowflake user with access privileges | | Private Key File | Private Key File | | Warehouse | Compute warehouse to use | | Database | Database name | | Schema | Schema name (optional) | | Role | User role (optional) | To set up key pair authentication for Snowflake: 1. Generate an RSA key pair (2048-bit minimum length). 2. Register the public key with your Snowflake user. 3. Use the private key (PEM format) when creating a WisdomAI connection. Here's an example key pair connection: ```txt theme={null} Account: xy12345.us-east-1 Username: wisdom_analytics Private Key File: Upload your private key file (.p8 or .pem format) Warehouse: ANALYTICS_WH Database: BUSINESS_DATA Schema: PUBLIC Role: ANALYST_ROLE ``` Access the [Snowflake Docs](https://docs.snowflake.com/en/user-guide/key-pair-auth.html) to get more information about Key Pair Authentication. The following table lists the requirements you must provide when connecting to Google BigQuery. | Requirement | Description | | :------------- | :-------------------------------- | | Project ID | Google Cloud project identifier | | Authentication | Service account key (JSON format) | | Dataset | Default dataset (optional) | Find below an example connection: ```txt theme={null} Project ID: my-analytics-project-123 Authentication: Upload service account key JSON file Dataset: analytics_data ``` You'll need to create a service account in Google Cloud with appropriate permissions on the BigQuery datasets you want to access. The following table lists the requirements you must provide when connecting to Amazon Redshift. If your database is protected by a firewall or network access policies, allowlist both of WisdomAI's CIDR blocks (35.238.115.103/32 and 34.82.248.105/32). SSH settings are optional. | Requirement | Description | | :----------------------- | :----------------------------------------------------------------------- | | Host | Redshift cluster endpoint | | Port | Typically `5439` | | Database | Database name | | Username | Database user with read access | | Password | User password | | Schema | Schema name (Optional) | | SSH Host | Hostname or IP address of the bastion host (Optional) | | SSH Port | Port number on the SSH host (Optional) | | SSH Username | The username required to log in to the bastion host (Optional) | | Authentication Method | You can authenticate using either a Private Key or a Password (Optional) | | SSH Private Key/Password | The Private Key or Password used for the SSH authentication (Optional) | You can also upload CSV files to a Domain. Here are the requirements for these files: * File must be in a valid CSV format * Maximum file size: 100MB * UTF-8 encoding recommended * Headers should be in the first row To learn how to upload them, read [Upload CSV files](/setting-up-wisdom-ai/basic-tutorial-connect-and-test#3-upload-csv-files-optional). The following table lists the requirements you must provide when connecting to Amazon Athena. | Requirement | Description | | :-------------------- | :------------------------------------------------------------------------------------------ | | AWS Access Key ID | The access key for an IAM user with permissions to access Athena and the underlying S3 data | | AWS Secret Access Key | The secret access key associated with the AWS Access Key ID | | Region Name | The AWS region where your Athena service is hosted | | S3 Staging Directory | The S3 bucket path where Athena stores query results | | Work Group | The specific Athena workgroup used to run queries | Here's an example connection: ```txt theme={null} AWS Access Key ID: AKIAIOSFODNN7EXAMPLE AWS Secret Access Key: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY Region Name: us-west-2 S3 Staging Directory: s3://wisdomai-athena-results-bucket/ Work Group: primary ``` The following table lists the requirements you must provide when connecting to Azure Synapse. If your database is protected by a firewall or network access policies, allowlist both of WisdomAI's CIDR blocks (35.238.115.103/32 and 34.82.248.105/32). | Requirement | Description | | :--------------------- | :-------------------------------------------------------------------------- | | Workspace SQL endpoint | The SQL endpoint URL for your workspace | | Subscription ID | The ID of your Azure subscription | | Resource Group ID | The name of the Azure resource group where the Synapse workspace is located | | Workspace ID | The ID for the Synapse Analytics workspace | | Client ID | The Application ID of the Azure Service Principal used for authentication | | Tenant ID | The Directory ID of your Azure Active Directory | | Client Secret | The secret value generated for the Service Principal | Here's an example connection: ```txt theme={null} Workspace SQL endpoint: synapse-prod-ondemand.sql.azuresynapse.net Subscription ID: a1b2c3d4-e5f6-g7h8-i9j0-k1l2m3n4o5p6 Resource Group ID: rg-analytics-prod Workspace ID: synapse-workspace-01 Client ID: 00000000-0000-0000-0000-000000000000 Tenant ID: ffffffff-ffff-ffff-ffff-ffffffffffff Client Secret: ******** ``` The following table lists the requirements you must provide when connecting to Azure Synapse Serverless. If your database is protected by a firewall or network access policies, allowlist both of WisdomAI's CIDR blocks (35.238.115.103/32 and 34.82.248.105/32). | Requirement | Description | | :---------------------- | :------------------------------------------------------------------------ | | Serverless SQL endpoint | The on-demand SQL endpoint for your Synapse workspace | | Client ID | The Application ID of the Azure Service Principal used for authentication | | Tenant ID | The Directory ID of your Azure Active Directory | | Client Secret | The client secret value generated for the Service Principal | Here's an example connection: ```txt theme={null} Serverless SQL endpoint: my-workspace-ondemand.sql.azuresynapse.net Client ID: 00000000-0000-0000-0000-000000000000 Tenant ID: ffffffff-ffff-ffff-ffff-ffffffffffff Client Secret: ******** ``` The following table lists the requirements you must provide when connecting to Azure Blob Storage. | Requirement | Description | | :------------------- | :---------------------------------------------------------- | | Storage Account Name | The name of your Azure Storage account | | Container Name | The specific blob container where your data is stored | | Connection String | The Azure Storage connection string used for authentication | Here's an example connection: ```txt theme={null} Storage Account Name: wisdomstorageaccount Container Name: customer-data Connection String: DefaultEndpointsProtocol=https;AccountName=wisdomstorageaccount;AccountKey=xxxxxx...xxxxxx;EndpointSuffix=core.windows.net ``` The following table lists the requirements you must provide when connecting to ClickHouse. If your database is protected by a firewall or network access policies, allowlist both of WisdomAI's CIDR blocks (35.238.115.103/32 and 34.82.248.105/32). | Requirement | Description | | :---------- | :--------------------------------------------------------- | | Host | The hostname or IP address of your ClickHouse server | | Port | The port number used for the connection | | Username | The database user account with read access to the metadata | | Password | The password for the specified database user | Database filters are optional, but it is recommended to specify only the databases that you want to expose to Wisdom. Here's an example connection: ```txt theme={null} Host: ch-cluster.example.com Port: 8123 Username: wisdom_scanner Password: ******** Database filters: sales_data, inventory_records ``` The following table lists the requirements you must provide when connecting to Trino. If your database is protected by a firewall or network access policies, allowlist both of WisdomAI's CIDR blocks (35.238.115.103/32 and 34.82.248.105/32). | Requirement | Description | | :-------------------------------- | :---------------------------------------------------------------------------------------- | | Host | The hostname or IP address of your Trino coordinator node | | Port | The port number used for the connection | | Username | The user account with appropriate permissions to access the catalogs | | Password | The password for the specified user account | | Use SSL (HTTPS) | Toggle to enable secure communication via SSL | | Skip SSL Certificate Verification | If enabled, WisdomAI will not validate the SSL certificate (common for self-signed certs) | | Force HTTPS | Forces the connection to use HTTPS even if the endpoint suggests otherwise | Catalog filters are optional, but it is recommended to specify only the catalogs and their schemas that you want to expose to Wisdom. Here's an example connection: ```txt theme={null} Host: trino.internal.company.com Port: 8443 Username: query_service Password: ******** Use SSL (HTTPS): True Skip SSL Certificate Verification: False Force HTTPS: True Catalog Filters: snowflake_prod, glue_catalog ``` The following table lists the requirements you must provide when connecting to SharePoint. | Requirement | Description | | :------------ | :------------------------------------------------------------------ | | Client ID | The client ID of the Azure App registration used for authentication | | Tenant ID | The Directory ID of your Azure Active Directory | | Client Secret | The client secret value generated for the Azure App registration | | Site URL | The full URL of the SharePoint site you want to crawl | By default, all document libraries are crawled. It is recommended to specify only the libraries that you want to expose to Wisdom in the **Document Libraries** field. Here's an example connection: ```txt theme={null} Client ID: 00000000-0000-0000-0000-000000000000 Tenant ID: ffffffff-ffff-ffff-ffff-ffffffffffff Client Secret: ******** Site URL: https://website.sharepoint.com/sites/internal-knowledge Document Libraries: Policies, Procedures ``` The following table lists the requirements you must provide when connecting to Google Cloud Spanner. | Requirement | Description | | :------------------------ | :-------------------------------------------------------------- | | Project ID | The unique identifier for your Google Cloud Project | | Instance ID | The ID of the Cloud Spanner instance | | Database ID | The ID of the specific database within the Spanner instance | | Service Account Info JSON | The complete contents of your GCP service account JSON key file | Here's an example connection: ```txt theme={null} Project ID: majestic-project-12345 Instance ID: spanner-instance-main Database ID: inventory_db Service Account Info JSON: { "type": "service_account", "project_id": "majestic-project-12345", ... } ``` The following table lists the requirements you must provide when connecting to Teradata. | Requirement | Description | | :---------- | :---------------------------------------------------------- | | Host | The hostname or IP address of your Teradata server | | Port | The port number used for the connection, typically `1025` | | Username | The database user account with appropriate read permissions | | Password | The password for the specified database user | **Database filters** are optional, but it is recommended to specify only the databases that you want to expose to Wisdom. Here's an example connection: ```txt theme={null} Host: td-prod.example.com Port: 1025 Username: wisdom_read_only Password: ******** Database filters: sales_v, marketing_v ``` The following table lists the requirements you must provide when connecting to GitHub. | Requirement | Description | | :-------------------- | :------------------------------------------------------------------ | | Connection name | A name to identify this connection | | Repository URL | The URL of the repository you want WisdomAI to extract context from | | Personal access token | Required for private repositories | | Branch | The branch WisdomAI should crawl | A personal access token is required for private repositories. Here's an example connection: ```txt theme={null} Connection name: product-docs-repo Repository URL: https://github.com/your-org/your-repo Personal access token: ******** Branch: main ``` *** ## Protocol-based source: MCP server Connect to any server that implements the [Model Knowledge Protocol](https://modelcontextprotocol.io). MCP enables WisdomAI to fetch real-time data and scan metadata from external systems through a standardized protocol. ### MCP server requirements To connect an MCP server, you must provide: | Requirement | Description | | :--------------------- | :-------------------------------------------------- | | **Transport Type** | Streamable HTTP, Server-Sent Events (SSE), or STDIO | | **Server URL/Command** | The endpoint or command used to run the MCP server | | **Auth Type** | API Key, OAuth, or None | For detailed setup instructions, see [Connect an MCP Server](/getting-started/connect-data-sources/connect-mcp-server). ## Web search WisdomAI can search the internet and fetch content from public web pages as a data source. When enabled on a domain, the AI automatically supplements its answers with real-time web information — such as industry benchmarks, market trends, or publicly available reference material. Web Search is configured per domain with an optional **source policy** that controls which websites WisdomAI can search (allowlist or blocklist up to 10 domains). For detailed setup instructions, see [Search the Web](/getting-started/connect-data-sources/search-the-web). ## Integrations Connect WisdomAI to your essential business applications and services to unlock deeper insights from all your data. ### ETL integration for SaaS applications WisdomAI works with leading (Extract, Transform, and Load) ETL partners to provide data integration from various SaaS applications. WisdomAI leverages **Fivetran** or **Airbyte** to ETL data from SaaS applications into a customer-owned data warehouse or, alternatively, into a WisdomAI-managed **BigQuery**-based analytics environment. ### Supported SaaS data sources A non-exhaustive list of SaaS Sources includes: * CRM tools (Salesforce, Hubspot) * Financial systems (NetSuite) * Ticketing systems (Jira, Zendesk) * Marketing platforms (Google Analytics, Facebook Ads) ### Setting up SaaS integration To integrate data from SaaS applications, please contact WisdomAI support at `support@askwisdom.ai`. Our team will work with you to set up the appropriate ETL pipelines using our partner technologies. ## Limits This section details any known limitations or restrictions when connecting to data sources. * **File Size:** The Maximum file size for direct upload is 100MB. For larger files or datasets, consider uploading them to a data warehouse or cloud storage (e.g., Amazon S3, Google Cloud Storage) and connecting WisdomAI to the warehouse/storage. * **Query Limits:** Be aware of any rate limits or query concurrency limits imposed by your database or data warehouse provider. WisdomAI's queries will contribute to these limits. * **Data Type Support:** While WisdomAI strives to support a wide range of data types, some highly specialized or proprietary data types might require specific handling or may not be fully supported. Contact us if you request any assistance. ## Troubleshooting Understand common problems and systematic troubleshooting techniques that can help you quickly identify and resolve connectivity issues. ### Common connection issues | **Issue** | **Possible Causes** | **Resolution** | | --------------------- | ----------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------- | | Connection Timeout | - Network latency
- Firewall blocking
- Server overload | - Check network connectivity
- Verify firewall rules
- Increase connection timeout setting | | Authentication Failed | - Incorrect credentials
- Expired API keys/tokens
- Account lockout | - Verify username/password
- Regenerate API keys
- Check account status | | Permission Denied | - Insufficient privileges
- IP restriction
- Resource access limits | - Update user permissions
- Whitelist IP addresses
- Check resource quotas | For persistent connection issues, contact WisdomAI support at `support@askwisdom.ai` with the connection ID and error logs for assistance. ## Next steps Integrate unstructured data sources, such as documents or knowledge bases, to enrich your analysis. Walk through the initial setup to connect a data source and run your first query. Define relationships and context in your data to enable more powerful analysis. # Glossary Source: https://docs.wisdom.ai/getting-started/glossary Find here a list of key terms used throughout the Wisdom AI product and documentation. Use it as a quick reference to ensure a shared vocabulary across Admins, Data Admins and Explorers. ## A **Administrator / Admin**: Highest-privilege user role with full access to connect data sources, configure domains, manage security, and govern the rollout of WisdomAI. Also responsible for foundational setup and governance, including user, domain, data source, data model, and knowledge management, as well as accessing dashboards and reports, monitoring, and auditing. **Agentic Analytics**: A multi-step analytic workflow executed by an internal planning agent that decomposes complex questions into sub-queries and composes the final answer automatically. **Analysis Plan**: The intermediate set of steps (SQL, transformations, visualisations) generated by WisdomAI when executing Agentic Analytics. **Answer Accuracy Score**: A system metric that tracks the percentage of answers receiving positive feedback (👍) versus total answers served, used to judge readiness for roll-out. **Audit Logs**: Records of events within the WisdomAI system, used to track usage and monitor platform health. ## B **Build Dashboards (Dashboards)**: The capability to create and maintain Dashboards (WisdomAI's term for dashboards), including dashboards and domain-specific assets. ## C **Chat Analytics**: Conversational, natural-language interaction mode where users ask questions and receive answers in real time. **Column-Level Security**: A granular access control mechanism that restricts user access to specific columns within a data table. **Connector**: Reusable integration module that handles authentication and data extraction for a specific database, warehouse, or SaaS application. **Continuous Learning**: WisdomAI’s process of improving answer quality over time based on feedback, reviewed queries, and added context. **Knowledge Enhancement**: The act of supplying extra business logic, synonyms, or documentation so the NLQ engine produces domain-specific answers. ## D **Data Administrator**: A role with privileges focused on domain and data-model maintenance but without full system-wide admin rights. They can connect domain-level data, model business context, manage content, apply data policies, and collaborate with Explorers. **Data Dictionary**: Human-readable catalogue of domain tables, columns, metrics, and their business definitions. **Data Model Augmentation**: Enhancing the semantic model with derived fields, entities, or metrics to create richer answers. **Data Source**: Any origin from which WisdomAI ingests data (database, warehouse, CSV, SaaS API, etc.). **Data Warehouse**: Centralised analytical database (e.g., Snowflake, BigQuery) commonly used as a primary data source. **Derived Column**: A calculated column added to a table or view within a domain, not present in the raw source. **Derived Table**: A table produced from transformations or joins on raw tables, materialised or virtual, and added to the semantic model. **Domain**: A dedicated, configurable space within the platform designed to represent a specific business area or dataset. It functions as the core container for your data sources, business knowledge (including context, metrics, and entities), and settings, enabling you to connect data, apply business logic, and fine-tune the AI for accurate and relevant data analysis responses. **Domain Management**: The capability to configure and maintain organizational domains within WisdomAI. **Domain-Level Permissions**: Fine-grained access rules that determine who can query or edit each domain. ## E **Embedded Analytics**: Mechanism for embedding WisdomAI Dashboards or charts into external applications via iframe or public link. **Entity**: A business object represented in the semantic model (e.g., *Customer*, *Order*); usually maps to a primary-key table. **Explorer**: End-user role focused on asking questions, creating Dashboards, and sharing insights; cannot access admin configuration. They can ask questions, explore stories, share insights, save views, and utilize knowledge management, including access to dashboards and reports. ## F **Feedback Loop**: Cycle in which user feedback (👍/👎, edits, reviewed queries) trains WisdomAI to improve future answers. **Fork (Chats)**: Create an independent copy of a chat or Dashboard so it can be modified without affecting the original. ## G **Go/No-Go Demo**: Validation checkpoint where Admins present curated dashboards to stakeholders to decide if WisdomAI is ready for wider release. **Governance**: Set of policies and controls that maintain data integrity, security, and compliance within WisdomAI. ## L **Limits & Quotas**: System-enforced maximums on rows processed, file sizes, API calls, or concurrent queries. ## M **Metric**: Quantitative measure (e.g., *total revenue*, *active users*) defined in the semantic model and calculated by WisdomAI. **Monitoring Dashboard**: Admin-only Dashboard that surfaces operational KPIs such as sync latency and answer accuracy. ## N **Natural-Language Query (NLQ)**: An end-user question expressed in everyday language, parsed and converted to SQL by WisdomAI. ## P **Python Intepreter Tool**: Feature that uses AI-generated Python code to perform advanced data science operations—such as forecasting, regression, clustering, and mathematical calculations—directly from natural-language questions in Chat. **Phased Roll-out**: Controlled deployment approach that starts with a pilot domain and gradually expands to more data and users. **Prompt Template**: Preset wording used to influence the NLQ engine’s tone, terminology, or calculation logic. ## Q **Query Pattern**: Reusable example or phrasing that teaches users how to ask effective questions (e.g., “Show *metric* by *dimension* for last *n* days”). ## R **Reports**: Formal presentations of data and analysis, accessible by various roles. **Reviewed Query**: An NLQ that has been checked by an Admin, corrected if necessary, and saved as a trusted reference. **Role-Based Access Control (RBAC)**: A security model where permissions are organized around roles, and users are assigned to roles, ensuring appropriate access based on responsibilities. **Row-Level Access Control (RLAC)**: Rules that restrict data visibility at the row level based on user attributes (e.g., region). ## S **Scheduled Dashboard**: Dashboard or chart automatically sent at a defined cadence via email or Slack. **Schemas**: The structure of tables and relationships within a database or data source. **Semantic Model**: Layer that abstracts raw tables into business-friendly entities, metrics, relationships, and dimensions. **Sharing Model**: Framework that governs who can view, edit, fork, or subscribe to content within WisdomAI. **Dashboards**: WisdomAI’s term for a dashboard: a collection of answer cards and visualisations saved with a title and description. **Subscription**: User opt-in to receive scheduled Dashboard deliveries or notifications. **Sync Latency**: Elapsed time between the source data change and its availability in WisdomAI after the latest sync. ## T **Tenant / Environment**: Isolated instance of WisdomAI (with its own domains, users, and settings) provisioned for a single customer or business unit. **Thumbs-Up / Thumbs-Down**: Simple feedback buttons that signal whether an answer was helpful and drive the Continuous Learning process. ## U **Usage Metrics**: Data points that measure how the WisdomAI platform is being used, contributing to monitoring system health. ## W **Webhook**: HTTP callback that triggers an external system when certain events occur in WisdomAI (e.g., Dashboard published, data sync complete). # How WisdomAI Works Source: https://docs.wisdom.ai/getting-started/how-wisdom-ai-works WisdomAI is a platform that helps businesses analyze their data and make informed decisions. It allows users to ask questions in plain English and receive clear, data-driven answers and visualizations, without the need for coding or manual dashboard creation. ## What does WisdomAI do? WisdomAI transforms your company's raw data into actionable insights through several key capabilities: You can ask questions in everyday language, like "What was our revenue last quarter?" or "Which products are selling best?" WisdomAI uses advanced Natural-Language Query (NLQ) to understand what you're asking. It seamlessly connects to various data sources your business uses, such as databases like PostgreSQL and SQL Server, or data warehouses like Snowflake and Google BigQuery. WisdomAI helps you organize your data into domains that represent different parts of your business, like Sales or Marketing. This makes your data more relevant and easier for everyone to use. Instead of just giving you numbers, WisdomAI can create interactive Dashboards with charts and text. They are automatically updated as your data changes, making it easy to share insights across your team. You can set up Agents to automate everyday analytical tasks, from recurring analyses to threshold-based alerts, so your team gets answers without having to ask. WisdomAI continually improves its capabilities based on user feedback. When you provide corrections or refine questions, the system learns to give even better answers in the future. This means WisdomAI helps you quickly get the information you need from your data, making data-driven decisions simpler and faster for everyone. ## Who uses WisdomAI? WisdomAI is designed for businesses of all sizes, from small startups to large corporations, across various industries. It's intended to be useful for different roles within your organization: These are typically IT or BI directors who set up WisdomAI, connect it to your data sources, manage user access, and define the overall data structure on the platform. This group comprises business users, executives, and other stakeholders who utilize WisdomAI to ask questions in natural language, create and view Dashboards, share insights with their team, and subscribe to scheduled updates. Software engineers and technical teams who build on top of WisdomAI — embedding dashboards into products, managing users via the API, or connecting WisdomAI to AI tools. This documentation is organized to help you focus on what matters most in your role. For more information on each role, visit the [Where to Start](/getting-started/overview#where-to-start) section. ## WisdomAI vs generic RAG systems Unlike generic Retrieval-Augmented Generation (RAG) solutions that rely purely on embedding search over documents, WisdomAI builds a structured understanding of your data through semantic modeling, curated context, and validated logic. | **Feature** | **WisdomAI** | **Generic RAG** | | --------------------------------- | ------------ | --------------- | | Understands data relationships | ✅ | ❌ | | Requires semantic modeling | ✅ | ❌ | | Validated, testable logic | ✅ | ❌ | | Dynamic, auto-updating dashboards | ✅ | ❌ | | Tailored for business data | ✅ | ❌ | WisdomAI is purpose-built for enterprise analytics, not just document Q\&A. ## Data flow & architecture overview WisdomAI transforms your business data into actionable insights using a multi-layered pipeline. The following components work together to deliver accurate, contextualized answers and auto-updating Dashboards. Data Sources Flow Connect Pn Data Sources Flow Connect Pn WisdomAI integrates with your data platforms (such as Snowflake, BigQuery, or Redshift), serving as the entry point for all information flowing through the system. Admins and data owners enrich the data by documenting tables, columns, and domains. They also define relationships (e.g., one-to-many, many-to-many) to create a business-friendly context for natural language understanding. Users ask questions in plain language. The NLQ engine parses these questions and translates them into SQL queries using the underlying semantic model. Responses are generated and formatted into interactive Dashboards — data-driven narratives that combine visualizations, text, and insights. These can be scheduled and shared. Dashboards and answers can be delivered via email or embedded into external applications, helping teams stay informed with minimal effort. Users can give feedback on dashboard accuracy, suggest corrections, or add clarifying context to improve future results. Admins and Data Admins review user feedback and update the semantic layer accordingly, closing the loop and continuously improving answer quality and domain understanding. ## Next steps Explore the full list of databases and platforms you can connect to the system. Walk through the initial setup to connect a data source and run your first query. Define relationships and context in your data to enable more powerful analysis. Help improve model accuracy by rating answers and providing corrections. Compile key insights and visualizations into a shareable, narrative-driven report. # Overview Source: https://docs.wisdom.ai/getting-started/overview Welcome to the WisdomAI documentation site. These guides provide all the essential information you need to effectively utilize the platform’s features, from querying data using natural language to setting up granular access controls. Whether you are an Admin, an Explorer, or a Developer building on top of the platform, you will find detailed instructions for your role. ## Where to start? WisdomAI caters to diverse user roles. Follow the path that aligns with your responsibilities: **Objective**: Set up and configure WisdomAI for your organization. **Start Here:** **Key Actions:** * Connect data sources and define Domains. * Document tables and columns for clarity. * Add contextual information and reviewed queries. * Configure access controls and security settings. * Define table relationships (1:1, 1:M, M:M) to model data associations and enable efficient querying. * Connect your AI coding assistant to WisdomAI data using the MCP Server. **Objective:** Use WisdomAI's tools and capabilities to extract meaningful insights from your data and effectively communicate them to others. **Start Here:** **Key Actions:** * Pose natural language questions to explore data. * Create and customize interactive Dashboards. * Share insights with team members and stakeholders. * Set up notifications to stay updated on key metrics. **Objective:** Integrate WisdomAI into your product or connect it to your AI coding tools. **Start Here:** **Key Actions:** * Embed dashboards and chat into your web app using the iframe or React SDK. * Create and manage users programmatically via the GraphQL API. * Control data access at the user level with attributes and parameterized connections. ## Next steps Embed, query, and extend WisdomAI from your own stack. Explore the full list of databases and platforms you can connect to the system. Walk through the initial setup to connect a data source and run your first query. Define relationships and context in your data to enable more powerful analysis. Help improve model accuracy by rating answers and providing corrections. Compile key insights and visualizations into a shareable, narrative-driven report. # Using File Attachments in Chat Source: https://docs.wisdom.ai/improve-wisdom-ai-responses/attach-files-to-chat You can attach a file to your WisdomAI chat to provide additional context for the session. This feature enables WisdomAI to use the information in the file to better understand and respond to your queries, serving as a temporary knowledge base throughout your conversation. ## How it works To attach a file to your chat session, follow these steps: 1. In your chat session, click the **Upload File** icon. 2. Select your file, and ensure it is a supported file type. 3. Add your query in the chat, and click **Send**. WisdomAI will then process the file's content and use it as a reference for your questions. This allows for a more fluid and intuitive interaction, especially when dealing with complex data tasks. For example, you could upload a screenshot of a bar chart and ask WisdomAI to generate a similar chart using the dataset of the Domain you are using. ## Supported file types WisdomAI currently supports a variety of file types, including images, documents, and different text formats. See the following list: * **Images** * .png * .jpeg * .webp * **Documents** * .pdf * **Text Files** * Any file with a text/MIME type * .json * .lkml * .md (Markdown) * .log * .yml * .yaml - The maximum file size you can upload is 20MB. - These files can also be used as data sources. To learn how to upload files to a Domain, read [**Basic Tutorial: Connect and Test > Upload CSV files**](/setting-up-wisdom-ai/basic-tutorial-connect-and-test)**.** ## Next steps Manage and customize your data domains to refine context and improve query results. Organize insights by tagging chats, navigating history, and sharing vetted answers with your team. Walk through the initial setup to connect a data source and run your first query. Define relationships and context in your data to enable more powerful analysis. # Build Dashboards Source: https://docs.wisdom.ai/improve-wisdom-ai-responses/build-dashboards What you may know as dashboards, in WisdomAI are called **Dashboards**. Dashboards allow you to present curated insights in a clear, structured, and visually appealing format that you can arrange and share. If you are looking for help on how to turn chat answers into Dashboards, read the article [Turn Answers into Dashboards](/using-wisdom-ai-everyday/turn-answers-into-dashboards). This guide will walk you through the following steps after your answers are ready to be showcased, including: * [Explore the Dashboards Editor](#explore-the-dashboards-editor) * [Arrange Dashboard Layout](#arrange-dashboard-layout) * [Get Stakeholders Sign-Off](#get-stakeholders-sign-off) * [Export your Dashboard](#export-your-dashboard) ## Explore the Dashboards Editor Once your analysis is complete and you have turned answers into cards (see the [Turn Answers into Dashboards](/using-wisdom-ai-everyday/turn-answers-into-dashboards) article), the **Dashboards** section becomes your central workspace. Here, you can refine the presentation of your insights, build out full dashboards, and prepare content for sharing. The Dashboards Editor includes features such as: 1. A collapsible **Overview** section that includes: * An **Executive Summary** for setting context at the top of your Dashboard. * A data summary for **what's changed since** a specific date, such as yesterday, last week, etc. 2. An option to **add** a **widget** directly from the Dashboard interface. Create **Visualization** or **Text** widgets that communicate key takeaways. The **Visualization** option opens a chat interface that helps you generate visual content based on your data. In contrast, the **Text** option opens an MDX editor to add narrative or explanatory content. 3. A **Filters** pane for interactive data exploration. 4. An option to **share** your Dashboard effectively. Dashboards Editor showing the Overview section with summary widgets and filters for refining insights ## Arrange Dashboard layout Make your Dashboard both visually compelling and logically structured: * **Move Dashboards cards around the workspace** to arrange them in order by importance, logical flow, or stakeholder preference. * **Group related cards** to create thematic Dashboards (e.g., “Monthly Revenue Trends,” “Top Performing Reps,” “Churn Metrics”). * [**Edit the answers to Dashboards cards**](/improve-wisdom-ai-responses/validate-and-test-answers) to emphasize key metrics and insights, ensuring your visuals match the narrative flow. A well-structured layout helps stakeholders grasp patterns faster and ask more meaningful follow-up questions. All changes are saved automatically as you work. You can always return to the Dashboard later to iterate. Animated GIF showing how to arrange and organize cards in a Dashboard dashboard workspace ## Get stakeholders sign-off Before finalizing your Dashboard for broader distribution or operational use, it is essential to obtain approval from key stakeholders. This ensures the information is accurate, aligned with business goals, and ready to guide decisions. Here is a suggested flow: 1. [**Share the Dashboard link**](/using-wisdom-ai-everyday/share-dashboards-and-set-access-control) with stakeholders. 2. **Add context**: summarize what the Dashboard includes and the decisions it is intended to support. 3. **Collect feedback** directly within the platform or through async tools (Slack, email). 4. **Incorporate edits** based on feedback, then tag the Dashboard as final or rename it for future iterations. Keeping track of who has reviewed and approved the Dashboard helps streamline communication and build trust in the data. Example of a Dashboard ready for stakeholder sign-off with options to share and review feedback ## Export your Dashboard Once you are satisfied with your layout and stakeholders have approved it, you may want to **share** it or **schedule notifications** to keep stakeholders and explorers informed. Both topics are covered in related articles. * To learn how to share your Dashboard and manage access permissions, see the [**Share Dashboards and Set Access Control**](/using-wisdom-ai-everyday/share-dashboards-and-set-access-control) article. Share options panel in a Dashboard, showing settings to manage access and sharing links * If you would like to schedule Dashboard updates and receive notifications, check out the [**Schedule Dashboard Notifications**](/using-wisdom-ai-everyday/schedule-dashboards-notifications) guide. Scheduling options in a Dashboard for setting automated updates and notifications ## Next steps Compile key insights and visualizations into a shareable, narrative-driven report. Set up automated notifications to keep stakeholders updated with the latest dashboard insights. Learn how to share your dashboards with others and manage who can view or edit them. # Connect Unstructured Repositories or Datasets Source: https://docs.wisdom.ai/improve-wisdom-ai-responses/connect-unstructed-repositories-datasets WisdomAI allows you to connect your domain to an unstructured repository or dataset from an **Amazon S3 bucket**, thereby enhancing your chatbot responses and ensuring the AI understands the underlying structure of your information. ## Connect an Amazon S3 dataset Follow the steps below to connect your Amazon S3 bucket as a data source. 1. Access your domain and, in the **Overview** tab, click **Add Data Source**. 2. In the modal that opens, select **Connect another source** from the **Data Source** selector. 3. Click **Add Data Source** to continue. Domain Add Data Source Domain Add Data Source 4. Select **Connect to Data store or MCP server**, then provide the following **Connection Details**: * **Connection name** * **Data source**: Select **Amazon S3** 5. Fill in the **Amazon S3 connection details**: * **Bucket Name**: The bucket where your files are stored. * **Authentication Method**: Choose one of the following: * **Access Key & Secret Key**: Provide the **Region**, **AWS Access Key ID**, and **AWS Secret Access Key**. * **Cross-Account Role**: Provide the **AWS Account ID** that has access to the bucket and the **AWS Role Name**. 6. Click **Select Data** to continue. Domain Add Data Source Select Data 7. In the data selection screen, browse the contents of the S3 bucket and select the files or paths you want to include. 8. Confirm your selection to add the dataset as a data source. ## Next steps Manage and customize your data domains to refine context and improve query results. Organize insights by tagging chats, navigating history, and sharing vetted answers with your team. Walk through the initial setup to connect a data source and run your first query. Define relationships and context in your data to enable more powerful analysis. # Enhancing Data Analysis with Custom Business Knowledge Source: https://docs.wisdom.ai/improve-wisdom-ai-responses/enhancing-data-analysis-with-custom-business-context WisdomAI is engineered to perform a wide range of queries directly on your dataset. If you are seeking to conduct more advanced, customized analysis, the custom business Knowledge feature allows the system to be aligned with your specific operational logic and proprietary terminology. This document outlines an example procedure for leveraging this feature to generate strategic insights. ## 1. Foundational data interrogation The system is designed to process queries that reference explicit data points within your tables. For example, it can accurately count, group, or filter based on existing columns and values. When a query includes business-specific terminology not explicitly defined in the dataset, such as "Strategic Account" or "At-Risk", the system, by design, will prompt for clarification. This ensures that all subsequent analysis is precise and perfectly aligned with the user's intent. Gif showing the first query and the answer without context ## 2. Implementing custom logic with business Knowledge The Knowledge feature enables the system to execute complex queries autonomously. This is achieved by providing the tool with a set of rules that define your organization's internal logic. As an example, let's consider that you want to empower the system to identify "At-Risk Strategic Accounts". To accomplish this, you need to provide the following definitions via the Knowledge feature: ``` 1. Geographical Sales Territories: - NA-West (North America West): Includes [Account Names] _ NA-East (North America East): Includes [Account Names] - EMEA (Europe, Middle East, and Africa): Includes [Account Names] 2. Account Tier Definitions: - A "Strategic Account" is any customer with a contract duration of 3 years or more. - An "At-Risk Strategic Account" is a Strategic Account where Auto Renewal is set to False. - A "Secure Strategic Account" is a Strategic Account where Auto Renewal is set to True. ``` Snippet showing the Knowledge page completed with business-specific data ## 3. Executing multi-layered strategic analysis With the business Knowledge supplied, the system no longer needs to prompt for clarification. It is now configured to perform the multi-layered analysis directly. When presented with the same query: ``` Generate a list of all 'At-Risk Strategic Accounts' and show me which sales region they belong to. ``` The system executes the request. It cross-references contract duration, renewal status, and account-to-territory mapping to produce the precise, targeted list required. This demonstrates the successful application of custom context to yield high-value, strategic business insights. Gif showing the same query and the answer with context ## 4. Granular analysis using JSON parsing Knowledge A key challenge in data analysis is extracting information from fields containing semi-structured text. For example, a single `Skus` column might contain multiple products, tiers, and quantities in one text string, making direct calculations difficult. The Knowledge feature resolves this by allowing users to define parsing logic with a JSON input. Without this logic, the system cannot perform calculations on data embedded within text. The following code snippet shows an example of using JSON context \~\~was provided \~\~to teach the system how to parse the `Skus` column: ``` { "example_for_skus_column": { "comment": "Parse the 'Skus' column into a structured list.", "original_skus_column_value": "Sales Ultimate 15 licenses, Marketing Professional 50 users", "expected_parsed_structure": [ { "product_family": "Sales", "tier": "Ultimate", "quantity": 15, "unit": "licenses" }, { "product_family": "Marketing", "tier": "Professional", "quantity": 50, "unit": "users" } ] } } ``` Gif showing an example JSON Knowledge With this parsing logic supplied, it is now possible to execute precise queries, like the following example: ``` What is the total quantity of 'Ultimate' tier licenses sold for the 'Sales' product line? ``` The system can now deconstruct the `Skus` field for every contract in real-time. It filters for the "Sales" product, identifies the "Ultimate" tier, extracts the corresponding quantity, and aggregates the total, providing a precise numerical answer that was previously impossible to calculate. A gif showing the result calculated successfully after using a JSON context to parse unstructured text ## Next steps Define relationships and context in your data to enable more powerful analysis. Understand the methods for verifying the correctness and reliability of generated answers. Learn how to rate answers and provide corrections to improve the system's accuracy. Compile key insights and visualizations into a shareable, narrative-driven report. # How to Create Metrics Source: https://docs.wisdom.ai/improve-wisdom-ai-responses/how-to-create-metrics Metrics are numeric, quantitative values that can be measured to assess and track business performance. They help you identify trends to make informed decisions. This guide will walk you through creating and using metrics effectively in WisdomAI. ## Types of Metrics You can have different kinds of Metrics. Here's a breakdown of the most common types: * **Simple Metrics:** These are direct calculations from existing data. Think of something straightforward, such as the sum of your total revenue. * **Calculated Metrics:** These metrics combine other metrics using formulas. For example, Profit could be a calculated metric derived from subtracting "Cost" from "Revenue." * **Ratios:** Ratios involve dividing one metric by another. A classic example is Conversion Rate, calculated as "Orders" divided by "Visits." * **Time-based Metrics:** These metrics incorporate time into their calculation, allowing you to analyze trends over periods. Examples include year-over-year growth or rolling averages. ## Create a Metric The process of creating a metric in WisdomAI is managed within each specific Domain. Here's a step-by-step guide: 1. Navigate to the **Metrics** Tab within a **Domain**. * Select the relevant **Domain** (e.g., "B2B Sales") > go to the **Context** tab > click **Metrics**. 2. Click the **Add Metric** button. Image showing te Add Metric option 3. In the Add a Metric modal window that opens, provide your metric with a clear, concise **name** that accurately describes what it measures. 4. Input your **SQL expression** in the corresponding area. 5. Toggle the **Advanced Options** switch to access additional configurations: * **Associated date column:** (Optional) This allows you to specify a date column in your data that is relevant to this metric. This is particularly useful for time-based analyses, filtering by date, or for metrics that inherently track changes over time. * **Associated group-by columns:** (Optional) Here, you can pre-define columns that are commonly used for grouping or segmenting this metric. (e.g., account State, customer ID) 6. Once you have configured your metric, click **Save** to add it to your Domain's metrics list. Snippet of the Add a Metric modal showing the name, SQL expression, and Advanced options. ## Sales Metrics examples When you create metrics, you define the SQL expression that dictates how the metric is calculated from your raw data. This allows for precise data analysis. Once defined, they will appear in your Metrics list with their descriptions and display formats. Here are some practical examples of sales metrics and how they might be configured. | Metric Name | Description | SQL Expression | Display Format | | :---------------------- | :------------------------------------------------------------------------------------------------------------------------------ | :---------------------------------------------------------- | :------------------------------- | | **Revenue** | Total revenue before discounts and returns | `SUM(total_amount)` | Currency (USD, 2 decimal places) | | **Average Order Value** | Average amount spent per order | `AVG(total_amount)` | Currency (USD, 2 decimal places) | | **Profit Margin** | The percentage of revenue that is profit | `(SUM(total_amount) - SUM(cost)) / SUM(total_amount) * 100` | Percentage (1 decimal place) | | **Items Per Order** | Average number of items in each order | `SUM(item_count) / COUNT(DISTINCT order_id)` | Number (1 decimal place) | | **Days to Ship** | Average time between order and shipment | `AVG(EXTRACT(DAY FROM ship_date - order_date))` | Number (1 decimal place) | | **AverageSalesPerRep** | Average Sales Per Rep | *(Specific SQL would be defined in the system)* | Automatic | | **Total Revenue** | Total revenue from closed-won opportunities | `SUM(total_amount)` *(example)* | Automatic | | **Win\_Rate** | Ratio of the sum of amounts for closed won opportunities to the sum of quantities for closed won and closed loss opportunities. | *(Specific SQL would be defined in the system)* | Automatic | By effectively defining and utilizing metrics within your chosen Domains, you can gain deeper insights into your operations and make data-driven decisions that propel your business forward. ## Next steps Manage and customize your data domains to refine context and improve query results. Organize insights by tagging chats, navigating history, and sharing vetted answers with your team. Walk through the initial setup to connect a data source and run your first query. Define relationships and context in your data to enable more powerful analysis. # Use Evaluations Sets and Runs Source: https://docs.wisdom.ai/improve-wisdom-ai-responses/use-evaluations-sets-and-runs This article describes the concepts of Evaluation Sets and Evaluation Runs, which are tools used to test and validate your AI's domain performance. ## Evaluation Sets In the Evaluation Sets tab, you can create specific sets of prompts that simulate user interactions and provide expected SQL outputs alongside these prompts. This allows for a direct comparison to see how accurately the AI converts natural language into database queries. To create an Evaluation Set: 1. Open a Domain and click on the **Evaluation** tab. 2. Navigate to the **Evaluation Sets** Sub-tab. 3. Click **Add Evaluation**. Image showing the Evaluations tab Image showing the Evaluations tab 4. Fill out the **Create Evaluation Set** Form, providing a set **Name** and presenting a natural language query. Optionally, you can import CSV and also ground truth SQL. 5. Click on **Create Evaluation Set**. The new Evaluation set will appear listed. Image showing the Add Evaluations form Image showing the Add Evaluations form ## Evaluation Runs Evaluation Runs are where the AI processes your defined Evaluation Sets. After running these evaluations, you can review the results to identify areas for improvement. To run an Evaluation, go to the **Evaluations Set** tab, select an evaluation, and click on the **run icon**. You will see the results in the Evaluation Runs tab. Run Evaluation Pn Run Evaluation Pn ### Evaluation Run indicators Evaluation Run Indicators provide a concise overview of the Run's progress and outcome. These indicators offer immediate feedback on the Evaluation's status and score, detailing how well the AI's generated responses matched the expected results. They are: * **Status:** Signals its progress or completion. * Running: The evaluation run is currently in progress. * Completed: The evaluation run has finished successfully. * **Score:** Reflects the result of the completed Evaluation. It tells you how many conversations passed based on the predefined **evaluation criteria** (i.e., Prompt + Expected SQL result added in the Evaluation set modal). The Score evaluation criteria refer to how much the generated answer matches the expected SQL result defined previously. Evaluation Runs Indicatorsv2 Pn Evaluation Runs Indicatorsv2 Pn ### Evaluation Run report When you click the **View Report** option, you will see comprehensive details about how the evaluation run performed. Here's a breakdown of the information you'll find: * **View Domain:** A link that allows you to navigate to the specific domain that was evaluated. * **Soft Match:** This **Score** indicates the overall performance of the Evaluation. It shows how many of the evaluation criteria were successfully met out of the total. It is named as Soft Match since results may be considered a match even if they are not the same as the expected (provided) SQL. * **Individual Session Details**: The report organizes the evaluation results by individual sessions or queries (e.g., Session 1, Session 2). View Report 01v2 Gi View Report 01v2 Gi For each session, the report is broken down into several components, allowing you to analyze the AI's performance thoroughly. * **Session Title:** This states the query or task that was evaluated for that particular session (e.g., "Calculate total revenue for closed won opportunities using ACV."). * **Evaluation Details:** This expandable section provides specific insights into the session's outcome. The core components are detailed in the table below. | Component | Description | | :------------------- | :-------------------------------------------------------------------------------------------------------------- | | **Prompt** | The specific input prompt that was used for the session. | | **Manual Score** | An option for you to manually score the Evaluation (✅ or ❌), which overrides the automated score. | | **Automated Score** | The system automatically assigns the score. This corresponds to the **Soft Match**. | | **Ground Truth** | The expected or correct outcome, typically the ideal SQL query (`SELECT SUM(amount) FROM Opportunity`). | | **Generated Result** | The output produced by the system, including the generated SQL query and the final result (e.g., `"$137.55M"`). | Gif showing the Session Details Gif showing the Session Details Providing an incorrect SQL code will lead to a syntax or semantic error. The system will display a red message detailing the nature of the error, often including the location within the query where the problem occurred, to aid in correction. Example showing an Incorrect Sql in Red Example showing an Incorrect Sql in Red * **Conversation:** You can expand this section to review the entire conversational exchange related to that specific session. This includes: * **AI Workstream:** Offers a look into the AI's process, showing the tool it selected, the examples it referenced, and the step-by-step plan it followed to generate the response. * **Reviewed Status**: Confirms whether the response has been reviewed and summarizes the outcome (e.g., "The user received a complete response... so no further action or information is needed."). Show Chat V2 Show Chat V2 Navigating the report helps you understand the system's processing, verify generated results, and review the underlying conversational logic. ## Next steps Manage and customize your data domains to refine context and improve query results. Organize insights by tagging chats, navigating history, and sharing vetted answers with your team. Walk through the initial setup to connect a data source and run your first query. Define relationships and context in your data to enable more powerful analysis. # Validate and Test Answers Source: https://docs.wisdom.ai/improve-wisdom-ai-responses/validate-and-test-answers This guide is for Administrators responsible for ensuring the accuracy of WisdomAI responses. This workflow typically begins after an end-user [provides negative feedback on an answer](/setting-up-wisdom-ai/feedback-mechanisms/provide-feedback-to-the-system). Here, you will learn how to edit, test, and validate responses to build confidence and improve the system's knowledge base. ## Prerequisites * You must have **Administrator** permissions. For details, see [Access Management](/manage-account/access-management). ## 1. Edit the SQL query When an answer is incorrect, you can directly edit the underlying SQL query. 1. Click the **Edit** button on the answer card in the chat interface. Chat workstream showing the edit button 2. The **Editor** window will open. Go to the **SQL Code** tab. 3. Modify the SQL statement to fix inaccuracies, add joins, or correct filters. 4. Click **Update response** to run the revised query and refresh the data. 5. (Optional) Switch back to the **Editor** tab to configure chart types, add filters, or drag-and-drop columns for visualization. Update response option ## 2. Test the updated answer After editing the query, you must test the new response. * **Retry with Adjustments:** Use the **Retry** option in the chat window to have the system regenerate the response using your new SQL. * **Cross-Reference:** Validate the new result by cross-referencing it with a known value or an external report. * **Test for Accuracy:** Try rephrasing the original question in a few different ways (e.g., "revenue by region" vs. "how much did each territory earn?"). If the system doesn't return the correct answer, you may need to [Add Context](#3-add-context-knowledge) to help it with precise queries. ## 3. Add Context (knowledge) If the system consistently misunderstands terms, you can add explicit context. This helps the system formulate more precise queries. 1. Navigate to **Domains** > (Select your Domain) 2. Navigate to the **Context** tab. 3. Select the **Knowledge** tab inside the Context section. 4. Click the **+ Add Knowledge** button to begin a new entry and add natural language context. Add natural language sentences to define business terms. * *Example 1:* `Regions are the same as Territories.` * *Example 2:* `My sales stages are: Prospect, Negotiation, Closed.` 5. Click **SAVE**. NEW Add Knowledge Steps To learn more about adding context to a domain, refer to the [**Add Domain-Specific Knowledge**](/setting-up-wisdom-ai/add-domain-specific-knowledge) guide. ## 4. Mark the answer as reviewed Once you have confirmed the SQL is correct and the answer is accurate, save it to the system's knowledge base. 1. From the **SQL Code** tab in the **Editor** window, click **Mark as reviewed**. 2. In the **Review Question** window, add a clear title for the question (e.g., "Official Quarterly Revenue by Region"). 3. Click **Confirm**. Review question option This action saves the question and its validated SQL as a [Validated Query](/setting-up-wisdom-ai/feedback-mechanisms/reviewed-queries), which serves as a trusted reference for similar future questions. To ensure that the information provided in the answer is accurate, relevant, and reliable, you can: * Test and validate both natural language responses and SQL query results directly within the chat interface. * Review the generated output by providing feedback. * Edit or vet the SQL query when necessary. These features help you iterate efficiently and build confidence in the outputs you receive. Reviewed queries are displayed ## Next steps Organize insights by tagging chats, navigating history, and sharing vetted answers with your team. Define relationships and Knowledge in your data to enable more powerful analysis. # WisdomAI Docs Source: https://docs.wisdom.ai/index # Slack Source: https://docs.wisdom.ai/integrations/connect-to-slack Integrate WisdomAI with your Slack workspace to query your business data directly from your channels and direct messages. This allows you to get insights without switching contexts. ## Before you begin Make sure you have the following: * An active WisdomAI account. * Administrative permissions to install apps in your Slack workspace. ## Connect to your Slack workspace Follow these steps to connect your WisdomAI account to Slack: 1. In the left-hand navigation of WisdomAI, click the **Settings** icon, then select **Slack Integration**. You can also navigate directly to `https://.askwisdom.ai/settings/slack`, replacing `` with your account name. Image 2. The **Slack Integration** page introduces what the WisdomAI Slack app can do. Click **Connect to Slack** to start the install. Image 3. Authorize the application on the Slack page you are redirected to. After reviewing the permissions WisdomAI is requesting, click **Allow** to grant access and install the app in your workspace. Image 4. After authorization, you are returned to the **Slack Integration** page. The page now shows that the WisdomAI app is connected to your Slack workspace, with a green **Connected** indicator. Image 5. Look for the **@WisdomAI** app in your Slack workspace and start using it. When you open a direct message with the app, you'll see a welcome message and some suggested questions. You can now ask questions in natural language to get insights from your data directly within Slack. WisdomAI app welcome message in Slack ## Disconnect the Slack app To disconnect the WisdomAI app from your Slack workspace: 1. Open **Settings** > **Slack Integration**. 2. Click the **Connected** chip in the upper right of the connection card. 3. Select **Disconnect Slack workspace** from the menu. 4. In the confirmation dialog, click **Disconnect**. Image Disconnecting does not uninstall the app from your Slack workspace. The app stops responding to questions and scheduled Slack notifications stop working until you reconnect. ## Permissions When you connect WisdomAI to Slack, you will be asked to grant a set of permissions. These allow the WisdomAI app to receive your questions and post answers back into your workspace. Here is a detailed breakdown of what each permission allows WisdomAI to do: | Permission | Description | | :------------------ | :----------------------------------------------------------------------------------------------------------------- | | `app_mentions:read` | Allows the app to see messages that directly mention `@WisdomAI` in conversations where the app is in. | | `assistant:write` | Allows WisdomAI to act as an AI Assistant, enabling it to provide intelligent responses and analysis within Slack. | | `channels:history` | View messages and content in public channels that WisdomAI has been added to. | | `chat:write` | Allows WisdomAI to send messages and answers to your questions in channels and conversations. | | `chat:write.public` | Allows WisdomAI to send messages to public channels that it isn't a member of. | | `files:write` | Allows WisdomAI to upload, edit, and delete files. | | `im:history` | View messages and content in direct messages with the WisdomAI app. | | `reactions:write` | Allows WisdomAI to add emoji reactions to messages, for example, to acknowledge a command. | | `users:read` | Allows WisdomAI to view basic information about users in your workspace, such as their names and user IDs. | | `users:read.email` | View email addresses of people in the workspace. | ## Query your data in Slack After connecting the app, you can interact with WisdomAI directly from your Slack workspace. 1. **Ask a Question**: You can start a direct message with the WisdomAI app or mention it in a channel to ask a question in natural language. The app will confirm that it is processing your request. 2. **Receive an Answer**: WisdomAI delivers an interactive response directly in Slack. A typical answer includes: * A chart visualizing the data, such as a bar chart of AWS usage by service. * A set of suggested follow-up questions to guide your analysis. * Buttons to **Show data**, **Show SQL**, change the chart type, or **Export CSV**. Snippet showing questions and answers in Slack 3. **Interact with Results**: You can modify the visualization and explore the data without leaving Slack. For example, you can change the chart to an Area chart or expand the data table to see the specific values for each service. See the example below: Slack Example Pn You can also select **View in WisdomAI** to continue your analysis in the main web application. ## Next steps Discover how to embed conversational AI chat interfaces Learn how to embed interactive dashboards and visualizations Detailed documentation for the authentication API # Developers Source: https://docs.wisdom.ai/integrations/developers WisdomAI gives your team several ways to build on top of the platform. Whether you're embedding analytics into a product, managing users programmatically, or connecting WisdomAI to your AI toolchain, this section covers everything you need. Embed WisdomAI dashboards and chat into your product using the iframe or SDK paths. Manage users, attributes, and sessions programmatically. Reference for all mutations, queries, objects, and subscriptions. ## Choose your path If you're not sure where to start, pick the question that fits your goal. Use the [Embedding](/integrations/embeddings/embedding) path. Start with the [iframe overview](/integrations/embeddings/embedding-modes) for a quick integration, or the [SDK](/integrations/embeddings/sdk/sdk-overview) for a native React component approach. Use the [GraphQL API](/integrations/graphql-api/GraphQL-API). The [User Management](/integrations/user-management/user-lifecycle) section covers `createUsers`, `setUserAttributes`, `impersonateUser`, and related mutations with cURL examples. Read [User Attributes](/integrations/user-management/user-attributes) first. Attributes are the mechanism behind parameterized connections and row-level authorization. ## Before you start Here are a few things that apply across all integration paths. * All paths require a bearer token. Each section covers how to obtain one. * Your base URL for all API calls is `https://.wisdom.ai/graphql`. Use the same domain you use to log in to WisdomAI. Both `wisdom.ai` and `askwisdom.ai` are valid tenant domains depending on your deployment. If you see a `getaddrinfo ENOTFOUND` error, confirm your tenant URL with your WisdomAI account team. ## Start building Start here if you're integrating WisdomAI into a product. Install, wire up auth, and render your first dashboard. Create users, set attributes, and manage workspace access via API. # Overview Source: https://docs.wisdom.ai/integrations/embeddings/embedding Embed a streamlined, white-label version of WisdomAI's chat and dashboards directly into your application. Embedded pages intentionally omit WisdomAI branding and navigation. All core capabilities (natural-language Q\&A, table generation, and chart rendering) remain intact. The section below describes the steps to configure and test your embedded chat and dashboards. All API and embed URL examples use `{ACCOUNT}.wisdom.ai` as a placeholder. Replace it with the base URL of your WisdomAI tenant — the same domain you use to log in. Both `wisdom.ai` and `askwisdom.ai` are valid depending on your deployment. ## Before start This overview walks through iframe embedding, the fastest path to a working embed. Depending on your use case, you may also want to reference: Build a fully custom, API-based integration. Covers authentication, mutations, queries, and error handling for developers who need more control than an iframe provides. Create and manage end users on the WisdomAI platform, including role assignment, user attributes, and impersonation. Applies to every integration path. User management is shared across all integration paths: whether you embed via iframe, call the GraphQL API directly, or use the SDK, end users must first be provisioned in WisdomAI before they can be impersonated into a session. ## Embedding flow Every embedded session follows this five-step flow: Contact `support@wisdom.ai` to receive your Access Key. This is a permanent credential, not a JWT or session token. It authenticates your server to the WisdomAI API and grants impersonation permissions. It does not expire and must be kept secret. Every WisdomAI user can create and manage their own API keys. To obtain your dedicated access key, follow the steps in [this article](/settings/api-keys). This is a permanent credential, not a JWT or session token. It authenticates your server to the WisdomAI API and grants impersonation permissions. Never expose your access key in client-side code. It provides long-term impersonation capabilities and must be kept secret. Store it only in secure server-side environment variables or a secret management system. If compromised, an attacker could impersonate any user in your organization. Call `createUsers` to provision the user in WisdomAI: **Authentication:** This management mutation requires a valid Bearer JWT with `iam:write` permissions. Typically, your backend obtains this by exchanging your Access Key via your auth system. Example Request: ```bash theme={null} curl -s -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $JWT" \ -d '{ "query": "mutation CreateUsers($input: CreateUsersInput!) { createUsers(input: $input) { status { code message } } }", "variables": { "input": { "emails": ["alice@yourcompany.com"], "workspaceID": "{{WORKSPACE_ID}}", "roleAssignments": [{ "roleId": "00000000-0000-0000-0000-000000000003", "scopes": ["{{DOMAIN_ID}}"] }], "sendWelcomeEmail": false } } }' \ https://{ACCOUNT}.wisdom.ai/graphql ``` **Key considerations:** * **Email uniqueness:** User matching is email-based. If your users share emails across tenants, append a unique identifier (e.g., `alice+123@company.com`) to the email prefix to prevent session collisions. * **Role overwrites:** If a user already exists, `createUsers` succeeds but re-applies the provided roles, overwriting manual changes. Use `listUsers` to check status first if you wish to avoid resets. User attributes are key-value pairs used for row-level authorization and personalized data access. * **Sources:** Attributes can be stored in the Wisdom **DATABASE** (via API) or derived from **JWT** SSO claims (read-only). * **Creation/Update:** Set them at creation time via `userAttributes` in `CreateUsersInput`, or update them later via `setUserAttributes`. The `setUserAttributes` mutation replaces **all** DATABASE-sourced attributes for that user. You must provide the complete set of attributes you wish to persist, not just the changes. See [User Attributes](/integrations/user-management/user-attributes) for details on how attributes work and how to set them. Call `impersonateUser` from your server to generate a 1-hour JWT for the user. This mutation is a public API member that uses your permanent Descope Access Key as an argument (`accessToken`) rather than a standard Authorization header. This step must always be performed server-side. Never expose your permanent access token in client-side code. It provides long-term impersonation capabilities and must be protected on your backend. If compromised, an attacker could impersonate any user in your organization. Store it only in secure server-side environment variables or a secret management system. Example Request: ```bash theme={null} curl -s -X POST \ -H "Content-Type: application/json" \ -d '{ "query": "mutation ImpersonateUser($accessToken: String!, $userEmail: String!) { impersonateUser(accessToken: $accessToken, userEmail: $userEmail) }", "variables": { "accessToken": "", "userEmail": "alice@yourcompany.com" } }' \ https://{ACCOUNT}.wisdom.ai/graphql ``` The API responds with a JWT that authenticates as the impersonated user. This token expires in **1 hour**. WisdomAI will notify your page via a `postMessage` event when the token is about to expire. See [Session Management](/integrations/embeddings/session-management) for the full refresh flow. See [Impersonate User](/integrations/graphql-api/mutations/auth/impersonate-user) for the full API reference, including information on passing transient attributes. Call `impersonateUser` from your server to generate a 1-hour JWT for the user. This mutation is a public API member that uses your permanent Descope Access Key as an argument (`accessToken`) rather than a standard Authorization header. This step must always be performed server-side. Example Request: ```bash theme={null} curl -s -X POST \ -H "Content-Type: application/json" \ -d '{ "query": "mutation ImpersonateUser($accessToken: String!, $userEmail: String!) { impersonateUser(accessToken: $accessToken, userEmail: $userEmail) }", "variables": { "accessToken": "", "userEmail": "alice@yourcompany.com" } }' \ https://{ACCOUNT}.wisdom.ai/graphql ``` The API responds with a JWT that authenticates as the impersonated user. This token expires in **1 hour**. WisdomAI will notify your page via a `postMessage` event when the token is about to expire. See [Session Management](/integrations/embeddings/session-management) for the full refresh flow. See [Impersonate User](/integrations/graphql-api/mutations/auth/impersonate-user) for the full API reference, including information on passing transient attributes. Append the JWT as a `token` query parameter to the embed URL and set it as the `src` of your embed. If your embed uses voice input or camera features, add `allow="microphone; camera"` to the ` ``` ### Dashboards list view `/embed/dashboards` renders the list of all dashboards the impersonated user has access to. ```html theme={null} ``` ### Specific dashboard `/embed/dashboards/[id]` renders a single dashboard by ID. ```html theme={null} ``` ### Specific chat `/embed/chat/[conversationId]` renders a specific chat conversation. You can optionally pass a `messageid` parameter to automatically scroll to a specific response. ```html theme={null} ``` ## iframe requirements All embed paths require the `allow="microphone; camera; clipboard-write"` attribute on the iframe element. Omitting it disables voice input, camera, and clipboard features within the embedded interface. ## Related articles Full server-side embedding flow including authentication Step-by-step guide for embedding a specific dashboard Step-by-step guide for embedding a chat interface Token expiry, refresh flow, and switching users # Error Handling Source: https://docs.wisdom.ai/integrations/embeddings/error-handling The WisdomAI GraphQL API always returns HTTP 200, even when a request fails. You must inspect the response body to determine whether an operation succeeded. ## HTTP 200 on failure Do not use the HTTP status code to detect errors. A failed GraphQL response returns HTTP 200 with either an `errors` array (for request-level failures) or a `status` object with a non-OK `code` (for mutation-level failures). **Request-level error (HTTP 200)** ```json theme={null} { "errors": [ { "message": "Unauthorized", "locations": [{ "line": 1, "column": 1 }] } ], "data": null } ``` **Mutation failure (HTTP 200)** ```json theme={null} { "data": { "createUsers": { "status": { "code": "ERROR", "message": "User with email already exists" } } } } ``` ## Mutation response status Mutations that affect users or resources return a `ResponseStatus` object: ```graphql theme={null} type ResponseStatus { code: StatusCode! message: String! } enum StatusCode { NONE OK ERROR NOT_FOUND } ``` Always request `status { code message }` in your mutation selection set: ```graphql theme={null} mutation CreateUsers($input: CreateUsersInput!) { createUsers(input: $input) { status { code message } } } ``` | Code | Meaning | | ----------- | -------------------------------------------- | | `OK` | Operation succeeded | | `ERROR` | Operation failed (see `message` for details) | | `NOT_FOUND` | The requested resource does not exist | | `NONE` | No status available | ## Transport-level HTTP errors HTTP errors other than 200 indicate a transport or authentication problem, not an application failure: | HTTP status | Message | Cause | | ----------- | --------------------- | --------------------------------------- | | `401` | Unauthorized | Invalid or missing authentication token | | `400` | Bad Request | Malformed request payload | | `500` | Internal Server Error | Unexpected API failure | All application-level errors and mutation failures return **HTTP 200 OK**. Refer to the response body for error details. ## Related articles Authentication and endpoint reference Full reference for the ResponseStatus object # Embed a Dashboard Source: https://docs.wisdom.ai/integrations/embeddings/iframe/embed-a-dashboard This guide outlines the process for embedding a WisdomAI Dashboard into your application. Before proceeding, make sure you've reviewed the [Embeddings Overview](/integrations/embeddings/embedding) for authentication setup and security requirements. The API and embed URL examples use `.wisdom.ai` as a placeholder. Replace it with the base URL of your WisdomAI tenant — the same domain you use to log in. Both `wisdom.ai` and `askwisdom.ai` are valid depending on your deployment. ## Construct the embed URL Construct the special embed URL for your Dashboard and append the newly generated JWT in the authentication stage. 1. Take your original Dashboard URL and insert `/embed/` before the Dashboard's name and ID. 2. Append the JWT as a `token` query parameter. The URL should look like the following: * **Original URL**: `https://.wisdom.ai/dashboards/name-id` * **Final Embed URL**: `https://.wisdom.ai/dashboards/embed/name-id?token=` 3. You can now use this URL as the `src` for an ` ``` ### Implementation notes * WisdomAI sends the request with `'*'` as the target origin. You must validate `event.origin` on your side before handling the message. * If your host does not respond within 10 seconds, the request times out and retries on the next render cycle. * Only one refresh request is in-flight at a time. Duplicate requests are suppressed automatically. * The `?token=` URL param always takes priority over any cached token in `localStorage`. ## Switching users The WisdomAI frontend stores the active session token in `localStorage` as `wisdom.jwt`. To switch the impersonated user in the same iframe, reload the iframe with a new JWT in the `?token=` URL param rather than attempting to swap the token in place. ```js theme={null} // Switch to a different user by reloading the iframe src iframe.src = `https://{ACCOUNT}.wisdom.ai/embed/search?token=${newJWT}`; ``` There is no explicit logout mutation for embedded sessions. ## Expired or invalid tokens When an expired or invalid JWT is passed in the embed URL, users may be redirected to the login page instead of seeing a clear error. To prevent this, implement the `postMessage` refresh listener described above so that tokens are refreshed before expiry. ## Related articles Generate a session JWT for an embedded user Full server-side embedding flow Create, update, and remove embedded users # Google Sheets Source: https://docs.wisdom.ai/integrations/google-sheets The WisdomAI integration for Google Sheets allows you to pull live data from your WisdomAI dashboards directly into Google Sheets. You can import any widget from your dashboards and chats using custom formulas or a visual dialog, and extract the latest version of data, everything with a single click. ## Get started Before you begin, ensure you have the **API Credentials**: Email [support@askwisdom.ai](mailto:support@askwisdom.ai) to request API keys for the Google Sheets integration, along with the use case. The WisdomAI team will reply with **your API token** and **the wrapper script**. ## Set up the integration Follow these steps to integrate your Google Sheets with WisdomAI: 1. Open your Google Sheet and go to **Extensions** > **Apps Script**. 2. In the script editor, click the **+** icon next to Libraries. Snippet showing the Add Extension Selector 3. Enter the Script ID: `1fx_yQncdXWvARZH0TuBpy7-XECy5VWi2gJ3JPPa2kCfCVp9elsyHPZK8` and click **Look up**. 4. Select the latest version. 5. Set the identifier as **WisdomGoogleSheets**. 6. Click **Add**. Add Library 7. Paste the wrapper script shared by [support@askwisdom.ai](mailto:support@askwisdom.ai) into Code.gs, replacing any existing code. 8. Save and reload your spreadsheet. Once synced, a WisdomAI menu will appear in the menu bar. ## Set up your account To configure your account, follow these steps: 1. In your Google Sheet, go to **Wisdom AI** > **Configure Account** from the menu bar. 2. Enter your Account URL and the API Token you received. 3. Click **Save Configuration**. Snippet showing the account configuration option and the credentials modal 4. Go to **Wisdom AI** > **Test Connection** to verify that everything works. ## Visual widget To insert a visual widget, follow these steps: 1. Go to **Wisdom AI** > **Insert Widget**. insert-widget 2. Paste the widget URL from your Wisdom dashboard 3. On any widget, click the menu and select **Copy link to visualization**. You can choose which rows and columns to import and whether to include headers. ## Custom formulas You can also use these formulas directly in cells: | Formula | What it does | | :------------------------------------------- | :------------------------- | | `=WISDOM_WIDGET`(dashboardId, widgetId) | Fetches data from a widget | | `=WISDOM_COLUMN`(dashboardId, widgetId, col) | Fetches a single column | ## Refreshing data To update everything, go to **Wisdom AI** > **Refresh All Data**. This re-fetches every WisdomAI formula in the active sheet. refresh-data ## Next Steps Discover how to embed conversational AI chat interfaces Learn how to connect WisdomAI to Slack. # GraphQL API Source: https://docs.wisdom.ai/integrations/graphql-api/GraphQL-API Create seamless integrations with WisdomAI using our comprehensive GraphQL API. Access domains, tables, and analytics data programmatically to build custom applications and workflows. The GraphQL API is designed for external integrations. All operations require proper authentication and respect your organization's access controls. ## Get started The WisdomAI GraphQL API provides a single endpoint for all operations: ```text theme={null} https://{ACCOUNT}.askwisdom.ai/graphql ``` Replace `{ACCOUNT}.askwisdom.ai` with the base URL of your WisdomAI tenant, the same domain you use to log in. Both `askwisdom.ai` and `wisdom.ai` are valid depending on your deployment. The API supports queries, mutations, and real-time subscriptions. Subscriptions use a WebSocket-based model that lets users ask questions related to business intelligence and receive structured responses, including tabular data and SQL queries. ## WebSocket connection For real-time subscriptions, use the following WebSocket endpoint: ```text theme={null} wss://{ACCOUNT}.askwisdom.ai/graphql ``` ## Authentication WisdomAI supports two authentication flows depending on your use case: ### API authentication For direct API access, authenticate using a JWT session token obtained via the Descope authentication system. Every WisdomAI user can create and manage their own API keys. To obtain your dedicated access key, follow the steps in [this article](/settings/api-keys). Use WisdomAI's GraphQL API `exchangeAccessToken` query to exchange your access key for a JWT token. ```graphql theme={null} query ExchangeAccessToken($accessToken: String!) { exchangeAccessToken(accessToken: $accessToken) } ``` Include the session token in all API requests and WebSocket connection payloads. ```text theme={null} Authorization: Bearer YOUR_SESSION_TOKEN ``` ### Embedded user authentication For embedding scenarios, the flow is different. Instead of `exchangeAccessToken`, you call `impersonateUser` with your Descope access key to obtain a short-lived JWT for the embedded user. That JWT is passed as the `token` query parameter in the iframe URL, not in an `Authorization` header. See the [Embedding overview](/integrations/embeddings/embedding) for the full end-to-end flow. ## Error handling The WisdomAI GraphQL API returns **HTTP 200 even when an operation fails**. Always inspect the response body, not the HTTP status code. See [Error handling](/integrations/embeddings/error-handling) for the full reference including response shapes and status codes. For any queries or support, contact our API team at [**support@askwisdom.ai**](mailto:support@askwisdom.ai). ## Related articles New to GraphQL? Start here for a REST developer's introduction Authenticate with the GraphQL API using access keys Learn about available queries for fetching data Discover mutations for creating and updating resources Real-time data subscriptions and live updates How to handle HTTP 200 failures and mutation status codes # GraphQL Primer for REST Developers Source: https://docs.wisdom.ai/integrations/graphql-api/graphql-primer If you're used to REST APIs, GraphQL has a few key differences worth knowing before you start. This page covers the essentials so you can make your first request quickly. ## One endpoint, one method Unlike REST, which uses many endpoints (`GET /users`, `POST /dashboards`, etc.), GraphQL uses a **single endpoint** for all operations: ```text theme={null} https://{ACCOUNT}.askwisdom.ai/graphql ``` Every request is a **POST** with a JSON body containing two fields: | Field | Description | | ----------- | ------------------------------------------------------- | | `query` | The GraphQL operation (query or mutation) as a string | | `variables` | A JSON object with input values referenced in the query | ```bash theme={null} curl -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer " \ -d '{ "query": "query ListUsers($workspaceId: ID) { listUsers(workspaceId: $workspaceId) { id email } }", "variables": { "workspaceId": "workspace_123" } }' \ https://{ACCOUNT}.askwisdom.ai/graphql ``` ## HTTP 200 does not mean success This is the most important difference from REST. **GraphQL can return HTTP 200**, even **when the operation fails**. Do not check the HTTP status code to determine success, always inspect the response body. Errors appear in an `errors` array: ```json theme={null} { "errors": [ { "message": "Unauthorized", "locations": [{ "line": 1, "column": 1 }] } ], "data": null } ``` For mutations, also check the `status.code` field in the response data: ```json theme={null} { "data": { "createUsers": { "status": { "code": "ERROR", "message": "User already exists" } } } } ``` See [Error handling](/integrations/embeddings/error-handling) for details. ## Postman setup To call the WisdomAI GraphQL API from Postman: 1. Set method to **POST** 2. URL: `https://{ACCOUNT}.askwisdom.ai/graphql` 3. Headers: * `Content-Type: application/json` * `Authorization: Bearer ` 4. Body → **raw** → **JSON**: ```json theme={null} { "query": "query ListUsers($workspaceId: ID) { listUsers(workspaceId: $workspaceId) { id email } }", "variables": { "workspaceId": "workspace_123" } } ``` ## Common mistakes | Mistake | Fix | | ----------------------------------------- | ---------------------------------------------------------------------------------------------- | | Missing `Content-Type: application/json` | Always include this header — without it, the server can't parse the body | | Sending the query as a URL parameter | GraphQL queries go in the POST body, not the URL | | Not requesting return fields on mutations | Include `status { code message }` (or other fields) in your mutation or they won't be returned | | Checking HTTP status for errors | Always read the response body. GraphQL returns HTTP 200 even on failure | ## Related articles Endpoint, authentication, and error handling Create, update, and manage users via API Available read operations Available write operations # Trigger Agent Source: https://docs.wisdom.ai/integrations/graphql-api/mutations/agent/trigger-agent The `triggerSchedule` mutation allows you to manually trigger an existing agent to run immediately. Refer to the [Agents documentation](/setting-up-wisdom-ai/agents/agents) to learn more about how to configure and use them. ## Signature ```graphql theme={null} triggerSchedule(id: String!): Boolean! ``` This mutation can only be executed if you have view access for the agent. ## Arguments The unique identifier of the agent to trigger. You can find it in the URL of the agent edit page. ## Response Returns a `Boolean` indicating whether the trigger was successful. ## Usage example Trigger an existing agent schedule: ```graphql theme={null} mutation TriggerAgent($scheduleId: String!) { success: triggerSchedule(id: $scheduleId) } ``` ```bash Request theme={null} curl -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer your_api_key" \ -d '{ "query": "mutation TriggerAgent($scheduleId: String!) { success: triggerSchedule(id: $scheduleId) }", "variables": { "scheduleId": "schedule_987654321" } }' \ https://{ACCOUNT}.askwisdom.ai/graphql ``` ```json Response theme={null} { "data": { "triggerSchedule": true } } ``` ## Related operation Send a message to the conversation # Impersonate User Source: https://docs.wisdom.ai/integrations/graphql-api/mutations/auth/impersonate-user The `impersonateUser` mutation exchanges a permanent access key for a short-lived JWT token that authenticates subsequent requests as a specific user. This is the core of the embedded session flow — the returned JWT is passed as the `token` query parameter in iframe embed URLs. This mutation is public and unauthenticated — no `Authorization` header is required. ## Signature ```graphql theme={null} impersonateUser(accessToken: String!, userEmail: String!, attributes: [UserAttributeInput!]): String! ``` ## Parameters Your permanent Descope access key. This is not a JWT or a prior session token — it is the long-lived key obtained from `support@askwisdom.ai`. Must be kept secret and only used server-side. The email address of the user to impersonate. The user must already exist in Wisdom — call [`createUsers`](/integrations/graphql-api/mutations/user/create-users) first if needed. Optional key-value pairs applied **only for this session**. These override DATABASE-sourced attributes for the duration of the session and are not persisted. Useful for passing context that should not be stored on the user (e.g., a specific report context or request-scoped filter). The `impersonated_user_id` claim cannot be overridden via attributes. See [User Attributes](/integrations/user-management/user-attributes) for how attribute sources are prioritized. ## Response Returns a raw `String!` — the short-lived JWT to use as the `token` query parameter in iframe embed URLs. The token expires after **1 hour**. Never expose your permanent access key in client-side code. Always call this mutation from your server. See [Embed a Chat and Dashboards](/integrations/embeddings/embedding) for the secure server-side flow. ## Usage example ```graphql theme={null} mutation ImpersonateUser($accessToken: String!, $userEmail: String!) { impersonateUser(accessToken: $accessToken, userEmail: $userEmail) } ``` ```bash Without attributes theme={null} curl -X POST \ -H "Content-Type: application/json" \ -d '{ "query": "mutation ImpersonateUser($accessToken: String!, $userEmail: String!) { impersonateUser(accessToken: $accessToken, userEmail: $userEmail) }", "variables": { "accessToken": "", "userEmail": "alice@yourcompany.com" } }' \ https://{ACCOUNT}.askwisdom.ai/graphql ``` ```bash With transient attributes theme={null} curl -X POST \ -H "Content-Type: application/json" \ -d '{ "query": "mutation ImpersonateUser($accessToken: String!, $userEmail: String!, $attributes: [UserAttributeInput!]) { impersonateUser(accessToken: $accessToken, userEmail: $userEmail, attributes: $attributes) }", "variables": { "accessToken": "", "userEmail": "alice@yourcompany.com", "attributes": [ { "key": "report_id", "value": "q3-sales-summary" }, { "key": "customer_id", "value": "cust_789" } ] } }' \ https://{ACCOUNT}.askwisdom.ai/graphql ``` ```json Response theme={null} { "data": { "impersonateUser": "eyJhbGciOiJSUzI1NiIsInR5..." } } ``` Attributes that are stable for a given user (such as `account_id`) should be set permanently via [`createUsers`](/integrations/graphql-api/mutations/user/create-users) or [`setUserAttributes`](/integrations/graphql-api/mutations/user/set-user-attributes). Attributes that change per session (such as a selected view or context) can be passed transiently via `attributes` here. ## Token lifecycle and refresh | Property | Value | | -------- | ----------------------------------------------------------------- | | Lifetime | 1 hour | | Refresh | Via `postMessage` (see below) | | Priority | `?token=` URL param always takes precedence over any cached token | ### Built-in refresh via `postMessage` WisdomAI sends a `REQUEST_JWT_TOKEN` event to the parent window approximately 10 seconds before the embedded token expires. It is the **embedder's responsibility** to listen for this event, regenerate the token by calling `impersonateUser` from their backend, and post it back. WisdomAI then picks up the new token and continues the session seamlessly. **Flow:** 1. WisdomAI iframe detects the token is about to expire 2. WisdomAI sends `window.parent.postMessage({ type: 'REQUEST_JWT_TOKEN' }, '*')` to the host 3. Host receives the event and validates `event.origin` matches the WisdomAI domain 4. Host calls `impersonateUser` via its own backend to get a fresh JWT 5. Host posts back `iframe.contentWindow.postMessage({ type: 'JWT_TOKEN_RESPONSE', token }, WISDOM_ORIGIN)` 6. WisdomAI receives the new token and refreshes the session ```html theme={null} ``` **Implementation notes:** * WisdomAI sends with `'*'` as target origin — the host **must** validate `event.origin` on its side * If the host does not respond within **10 seconds**, the request times out and retries on the next render cycle * Only one refresh request is in-flight at a time (duplicate requests are suppressed) * The `?token=` URL param always takes priority over any cached token ## Related articles Use the token in an iframe embed URL Use the token for embedded chat Create users before impersonating them Understand transient vs persistent attributes Full token lifecycle reference, including switching users # Create Conversation Source: https://docs.wisdom.ai/integrations/graphql-api/mutations/chat/create-conversation The `createConversation` mutation creates a new conversation in a specified domain for conducting AI-powered data analysis sessions. ## Signature ```graphql theme={null} createConversation(domainId: String!, hidden: Boolean!): ID! ``` ## Arguments The unique identifier of the domain where the conversation will be created. Whether the conversation should be hidden from the user interface. ## Response Returns an `ID` representing the unique identifier of the newly created conversation. ## Usage example Create a new conversation for data analysis: ```graphql theme={null} mutation CreateConversation( $domainId: String! $hidden: Boolean! ) { id: createConversation( domainId: $domainId hidden: $hidden ) } ``` ```bash Request theme={null} curl -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer " \ -d '{ "query": "mutation CreateConversation($domainId: String!, $hidden: Boolean!) { id: createConversation(domainId: $domainId, hidden: $hidden) }", "variables": { "domainId": "domain_123456789", "hidden": false } }' \ https://{ACCOUNT}.askwisdom.ai/graphql ``` ```json Response theme={null} { "data": { "id": "conv_987654321" } } ``` ## Related operation Send a message to the conversation # Send User Message Source: https://docs.wisdom.ai/integrations/graphql-api/mutations/chat/send-user-message The `sendUserMessage` mutation sends a user's message or question to an existing conversation, triggering AI-powered analysis and response generation. ## Signature ```graphql theme={null} sendUserMessage( conversationId: String! domainId: String! query: DeltaInput! createHiddenConversation: Boolean toolSelection: ToolSelection selectedModelName: String isUserOnboarding: Boolean editArtifactMode: Boolean chatThinkingEffort: ChatThinkingEffort disableClarifications: Boolean enableDeepAnalysis: Boolean isEvaluatingTrigger: Boolean ): ResponseStatus! ``` ## Arguments The unique identifier of the conversation to send the message to. The unique identifier of the domain containing the conversation. The user's message content. See [DeltaInput](/integrations/graphql-api/objects/delta-input). Whether to create a hidden conversation if needed. Defaults to false. Specific tools to use for processing the message. * Use `TABULAR_DATA` to enable querying databases. * Use `TEXTUAL_DATA` to enable querying unstructured documents. ``` "toolSelection": { "optInToolNames": [ "TABULAR_DATA", "TEXTUAL_DATA" ] } ``` See [ToolSelection](/integrations/graphql-api/objects/tool-selection). The name of the AI model to use for response generation. Whether this message is part of user onboarding. Defaults to false. Whether to enable artifact editing mode. Defaults to false. The level of thinking effort to apply. See [ChatThinkingEffort](/integrations/graphql-api/objects/chat-thinking-effort). Whether to disable clarification questions. Defaults to false. Whether to enable deep analysis mode. Defaults to false. Whether this is an evaluation trigger. Defaults to false. ## Response Returns a `ResponseStatus` object indicating the success or failure of the operation. See [ResponseStatus](/integrations/graphql-api/objects/response-status) for the schema. ## Usage example Send a question about sales data to a conversation: ```graphql theme={null} mutation SendUserMessage( $conversationId: String! $domainId: String! $query: DeltaInput! ) { sendUserMessage( conversationId: $conversationId domainId: $domainId query: $query ) { code message } } ``` ```bash Request theme={null} curl -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer " \ -d '{ "query": "mutation SendUserMessage($conversationId: String!, $domainId: String!, $query: DeltaInput!) { sendUserMessage(conversationId: $conversationId, domainId: $domainId, query: $query) { code message } }", "variables": { "conversationId": "conv_123456789", "domainId": "domain_987654321", "query": { "ops": [ { "insert": { "text": "What were our total sales last quarter?" } } ] } } }' \ https://{ACCOUNT}.askwisdom.ai/graphql ``` ```json Response theme={null} { "data": { "sendUserMessage": { "code": "OK", "message": "User message sent" } } } ``` ## Related operation Listen for real-time response updates # Refresh Connection Source: https://docs.wisdom.ai/integrations/graphql-api/mutations/connection/refresh-connection The `connectionRefresh` mutation triggers an asynchronous job that refreshes the metadata for a data warehouse connection. Specifically, it refreshes the list of databases, tables, and columns for the given connection. This operation starts a background job and returns immediately without waiting for completion. The refresh process will discover new tables, updated schemas, and column changes in your data warehouse. ## Signature ```graphql theme={null} connectionRefresh(id: ID!): Boolean! ``` This mutation can only be executed by an administrator or a data administrator of the specific connection ID. The refresh cannot be triggered when a connection is already in `QUEUED` or `RUNNING` status. Wait for the current sync to complete before starting a new one. ## Arguments The unique identifier of the connection to refresh ## Response The response returns a `Boolean` indicating whether the refresh job was successfully triggered: * `true` - Refresh job was successfully started On failure, the mutation throws a GraphQL error rather than returning `false`. ## Usage example To refresh a connection's metadata, provide the connection ID to the mutation. Here's an example of how this mutation could be used: ```graphql theme={null} mutation RefreshConnection($id: ID!) { connectionRefresh(id: $id) } ``` ```bash Request theme={null} curl -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer " \ -d '{ "query": "mutation RefreshConnection($id: ID!) { connectionRefresh(id: $id) }", "variables": { "id": "et-connection-id-here" } }' \ https://{ACCOUNT}.askwisdom.ai/graphql ``` ```json Response theme={null} { "data": { "connectionRefresh": true } } ``` ## Next steps Monitor refresh progress with connection query Create domains after refresh completion # Add Scope Role Assignments for Sharing Source: https://docs.wisdom.ai/integrations/graphql-api/mutations/dashboard/add-scope-role-assignments-for-sharing The `addScopeRoleAssignmentsForSharing` mutation grants access to a specific resource (like a Dashboard) by assigning roles to users. This allows you to share Dashboards with individual team members or groups. ## Signature ```graphql theme={null} addScopeRoleAssignmentsForSharing( scopeId: ID! scopeRoleAssignments: [ScopeRoleAssignmentInput!]! scopeType: ScopeType! message: String ): ResponseStatus! ``` ## Arguments The unique identifier of the resource you want to share (e.g., a Dashboard ID). Array of user-role assignments defining who gets access and what level of access they receive. See [ScopeRoleAssignmentInput](/integrations/graphql-api/objects/scope-role-assignment-input) for the input structure. The type of resource being shared. For Dashboards, this should be `DASHBOARD`. Optional personal message to include in the sharing notification email sent to recipients. ## Response Returns a `ResponseStatus` object indicating the success or failure of the operation: ```json theme={null} { "code": "OK", "message": "Role added successfully" } ``` ## Usage example The following example shows how to share a Dashboard with a colleague: ```graphql theme={null} mutation AddScopeRoleAssignments($scopeId: ID!, $scopeRoleAssignments: [ScopeRoleAssignmentInput!]!, $scopeType: ScopeType!, $message: String) { addScopeRoleAssignmentsForSharing( scopeId: $scopeId scopeRoleAssignments: $scopeRoleAssignments scopeType: $scopeType message: $message ) { code message } } ``` ```bash Request theme={null} curl -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer " \ -d '{ "query": "mutation AddScopeRoleAssignments($scopeId: ID!, $scopeRoleAssignments: [ScopeRoleAssignmentInput!]!, $scopeType: ScopeType!, $message: String) { addScopeRoleAssignmentsForSharing(scopeId: $scopeId, scopeRoleAssignments: $scopeRoleAssignments, scopeType: $scopeType, message: $message) { code message } }", "variables": { "scopeId": "story_123456789", "scopeRoleAssignments": [ { "roleId": "00000000-0000-0000-0000-000000000009", "principalId": "user_987654321" } ], "scopeType": "DASHBOARD", "message": "Please review and edit this sales dashboard" } }' \ https://{ACCOUNT}.askwisdom.ai/graphql ``` ```json Response theme={null} { "data": { "addScopeRoleAssignmentsForSharing": { "code": "OK", "message": "Role added successfully" } } } ``` ## Next steps Remove sharing access from users Create a new Dashboard to share Dashboard object schema and properties # Add Widget to Dashboard Source: https://docs.wisdom.ai/integrations/graphql-api/mutations/dashboard/add-widget-to-dashboard The `addWidgetToDashboard` mutation adds a new widget to an existing dashboard. ## Signature ```graphql theme={null} addWidgetToDashboard(id: String!, widget: DashboardWidgetInput!): Dashboard! ``` ## Arguments The unique identifier of the dashboard to add the widget to. Widget configuration for the new widget. See [DashboardWidgetInput](/integrations/graphql-api/objects/dashboard-widget-input). ## Response Returns the updated `Dashboard` object with the new widget included. See [Dashboard](/integrations/graphql-api/objects/dashboard) for the schema. ## Usage example The following example shows how to add a new widget to an existing dashboard: ```graphql theme={null} mutation AddWidgetToDashboard($id: String!, $widget: DashboardWidgetInput!) { addWidgetToDashboard(id: $id, widget: $widget) { id widgets { id title layout { top left width height } } } } ``` ```bash Request theme={null} curl -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer " \ -d '{ "query": "mutation AddWidgetToDashboard($id: String!, $widget: DashboardWidgetInput!) { addWidgetToDashboard(id: $id, widget: $widget) { id widgets { id title layout { top left width height } } } }", "variables": { "id": "dashboard_123456789", "widget": { "title": "Revenue Trend", "nlQuery": "Show revenue trend over time", "layout": { "top": 4, "left": 0, "width": 6, "height": 4 } } } }' \ https://{ACCOUNT}.askwisdom.ai/graphql ``` ```json Response theme={null} { "data": { "addWidgetToDashboard": { "id": "dashboard_123456789", "widgets": [ { "id": "widget_987654321", "title": "Revenue Trend", "layout": { "top": 4, "left": 0, "width": 6, "height": 4 } } ] } } } ``` ## Next steps Update existing widgets Remove widgets from dashboard Widget creation input schema # Create Dashboard Source: https://docs.wisdom.ai/integrations/graphql-api/mutations/dashboard/create-dashboard The `createDashboard` mutation creates a new dashboard with the specified configuration and initial widgets. ## Signature ```graphql theme={null} createDashboard(dashboard: DashboardInput!, widgets: [DashboardWidgetInput!]!): Dashboard! ``` ## Arguments Input object containing the dashboard configuration. See [DashboardInput](/integrations/graphql-api/objects/dashboard-input). Array of widget configurations to include in the new dashboard. See [DashboardWidgetInput](/integrations/graphql-api/objects/dashboard-widget-input). ## Response Returns the newly created `Dashboard` object with all properties populated. See [Dashboard](/integrations/graphql-api/objects/dashboard) for the schema. ## Usage example The following example shows how to create a new dashboard with initial widgets: ```graphql theme={null} mutation CreateDashboard($dashboard: DashboardInput!, $widgets: [DashboardWidgetInput!]!) { createDashboard(dashboard: $dashboard, widgets: $widgets) { id name description widgets { id title layout { top left width height } } accessLevel } } ``` ```bash Request theme={null} curl -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer " \ -d '{ "query": "mutation CreateDashboard($dashboard: DashboardInput!, $widgets: [DashboardWidgetInput!]!) { createDashboard(dashboard: $dashboard, widgets: $widgets) { id name widgets { id title layout { top left width height } } } }", "variables": { "dashboard": { "name": "Sales Performance Dashboard", "description": "Monthly sales metrics and KPIs", "domainId": "domain_987654321" }, "widgets": [ { "title": "Total Sales", "nlQuery": "What are the total sales?", "layout": { "top": 0, "left": 0, "width": 6, "height": 4 } } ] } }' \ https://{ACCOUNT}.askwisdom.ai/graphql ``` ```json Response theme={null} { "data": { "createDashboard": { "id": "dashboard_123456789", "name": "Sales Performance Dashboard", "widgets": [ { "id": "widget_987654321", "title": "Total Sales", "layout": { "top": 0, "left": 0, "width": 6, "height": 4 } } ] } } } ``` ## Next steps Modify dashboard properties Add widgets to existing dashboard Dashboard creation input schema # Delete Dashboard Source: https://docs.wisdom.ai/integrations/graphql-api/mutations/dashboard/delete-dashboard The `deleteDashboard` mutation permanently removes a dashboard and all its associated data. ## Signature ```graphql theme={null} deleteDashboard(id: String!): Boolean! ``` ## Arguments The unique identifier of the dashboard to delete. ## Response Returns `true` if the dashboard was successfully deleted, `false` otherwise. ## Usage example The following example shows how to delete a dashboard: ```graphql theme={null} mutation DeleteDashboard($id: String!) { deleteDashboard(id: $id) } ``` ```bash Request theme={null} curl -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer " \ -d '{ "query": "mutation DeleteDashboard($id: String!) { deleteDashboard(id: $id) }", "variables": { "id": "dashboard_123456789" } }' \ https://{ACCOUNT}.askwisdom.ai/graphql ``` ```json Response theme={null} { "data": { "deleteDashboard": true } } ``` ## Next steps List available dashboards # Delete Widget from Dashboard Source: https://docs.wisdom.ai/integrations/graphql-api/mutations/dashboard/delete-widget-from-dashboard The `deleteWidgetFromDashboard` mutation removes a specific widget from a dashboard. ## Signature ```graphql theme={null} deleteWidgetFromDashboard(id: String!, widgetId: String!): Dashboard! ``` ## Arguments The unique identifier of the dashboard containing the widget. The unique identifier of the widget to remove from the dashboard. ## Response Returns the updated `Dashboard` object with the widget removed. See [Dashboard](/integrations/graphql-api/objects/dashboard) for the schema. ## Usage example The following example shows how to remove a widget from a dashboard: ```graphql theme={null} mutation DeleteWidgetFromDashboard($id: String!, $widgetId: String!) { deleteWidgetFromDashboard(id: $id, widgetId: $widgetId) { id widgets { id title } } } ``` ```bash Request theme={null} curl -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer " \ -d '{ "query": "mutation DeleteWidgetFromDashboard($id: String!, $widgetId: String!) { deleteWidgetFromDashboard(id: $id, widgetId: $widgetId) { id widgets { id title } } }", "variables": { "id": "dashboard_123456789", "widgetId": "widget_987654321" } }' \ https://{ACCOUNT}.askwisdom.ai/graphql ``` ```json Response theme={null} { "data": { "deleteWidgetFromDashboard": { "id": "dashboard_123456789", "widgets": [ { "id": "widget_remaining", "title": "Remaining Widget" } ] } } } ``` ## Next steps Add widgets to dashboard Update existing widgets # Refresh Dashboard Source: https://docs.wisdom.ai/integrations/graphql-api/mutations/dashboard/refresh-dashboard The `refreshDashboard` mutation refreshes all data in a dashboard's widgets to show the latest information. ## Signature ```graphql theme={null} refreshDashboard(id: String!, version: String): Dashboard! ``` ## Arguments The unique identifier of the dashboard to refresh. ## Response Returns the refreshed `Dashboard` object with updated widget data. See [Dashboard](/integrations/graphql-api/objects/dashboard) for the schema. ## Usage example The following example shows how to refresh all dashboard data: ```graphql theme={null} mutation RefreshDashboard($id: String!) { refreshDashboard(id: $id) { id widgets { id title dataRefreshedAt } } } ``` ```bash Request theme={null} curl -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer " \ -d '{ "query": "mutation RefreshDashboard($id: String!) { refreshDashboard(id: $id) { id widgets { id title dataRefreshedAt } } }", "variables": { "id": "dashboard_123456789" } }' \ https://{ACCOUNT}.askwisdom.ai/graphql ``` ```json Response theme={null} { "data": { "refreshDashboard": { "id": "dashboard_123456789", "widgets": [ { "id": "widget_987654321", "title": "Sales Chart", "dataRefreshedAt": "2024-01-15T10:30:00Z" } ] } } } ``` ## Next steps Retrieve refreshed dashboard data # Remove Scope Role Assignments for Sharing Source: https://docs.wisdom.ai/integrations/graphql-api/mutations/dashboard/remove-scope-role-assignments-for-sharing The `removeScopeRoleAssignmentsForSharing` mutation removes access to a specific resource (like a Dashboard) by revoking roles from users. This allows you to stop sharing Dashboards with individuals or groups. ## Signature ```graphql theme={null} removeScopeRoleAssignmentsForSharing( scopeId: ID! scopeRoleAssignments: [ScopeRoleAssignmentInput!]! scopeType: ScopeType! ): ResponseStatus! ``` ## Arguments The unique identifier of the resource you want to remove sharing from (e.g., a Dashboard ID). Array of user-role assignments to remove. See [ScopeRoleAssignmentInput](/integrations/graphql-api/objects/scope-role-assignment-input) for the input structure. The type of resource being unshared. For Dashboards, this should be `DASHBOARD`. ## Response Returns a `ResponseStatus` object indicating the success or failure of the operation: ```json theme={null} { "code": "OK", "message": "Role removed successfully" } ``` ## Usage example The following example shows how to remove sharing access from a colleague: ```graphql theme={null} mutation RemoveScopeRoleAssignments($scopeId: ID!, $scopeRoleAssignments: [ScopeRoleAssignmentInput!]!, $scopeType: ScopeType!) { removeScopeRoleAssignmentsForSharing( scopeId: $scopeId scopeRoleAssignments: $scopeRoleAssignments scopeType: $scopeType ) { code message } } ``` ```bash Request theme={null} curl -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer " \ -d '{ "query": "mutation RemoveScopeRoleAssignments($scopeId: ID!, $scopeRoleAssignments: [ScopeRoleAssignmentInput!]!, $scopeType: ScopeType!) { removeScopeRoleAssignmentsForSharing(scopeId: $scopeId, scopeRoleAssignments: $scopeRoleAssignments, scopeType: $scopeType) { code message } }", "variables": { "scopeId": "story_123456789", "scopeRoleAssignments": [ { "roleId": "00000000-0000-0000-0000-000000000009", "principalId": "user_987654321" } ], "scopeType": "DASHBOARD" } }' \ https://{ACCOUNT}.askwisdom.ai/graphql ``` ```json Response theme={null} { "data": { "removeScopeRoleAssignmentsForSharing": { "code": "OK", "message": "Role removed successfully" } } } ``` ## Next steps Grant sharing access to users Permanently delete a Dashboard Dashboard object schema and properties # Update Dashboard Source: https://docs.wisdom.ai/integrations/graphql-api/mutations/dashboard/update-dashboard The `updateDashboard` mutation modifies the properties of an existing dashboard. ## Signature ```graphql theme={null} updateDashboard(id: String!, dashboard: DashboardInput): Dashboard! ``` ## Arguments The unique identifier of the dashboard to update. Input object containing the updated dashboard properties. See [DashboardInput](/integrations/graphql-api/objects/dashboard-input). ## Response Returns the updated `Dashboard` object with all properties populated. See [Dashboard](/integrations/graphql-api/objects/dashboard) for the schema. ## Usage example The following example shows how to update a dashboard's name and description: ```graphql theme={null} mutation UpdateDashboard($id: String!, $dashboard: DashboardInput!) { updateDashboard(id: $id, dashboard: $dashboard) { id name description widgets { id title } } } ``` ```bash Request theme={null} curl -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer " \ -d '{ "query": "mutation UpdateDashboard($id: String!, $dashboard: DashboardInput!) { updateDashboard(id: $id, dashboard: $dashboard) { id name description } }", "variables": { "id": "dashboard_123456789", "dashboard": { "name": "Updated Sales Dashboard", "description": "Updated monthly sales metrics and KPIs" } } }' \ https://{ACCOUNT}.askwisdom.ai/graphql ``` ```json Response theme={null} { "data": { "updateDashboard": { "id": "dashboard_123456789", "name": "Updated Sales Dashboard", "description": "Updated monthly sales metrics and KPIs" } } } ``` ## Next steps Create a new dashboard Update dashboard widgets Dashboard update input schema # Update Dashboard Filters Source: https://docs.wisdom.ai/integrations/graphql-api/mutations/dashboard/update-dashboard-filters The `updateDashboardFilters` mutation applies filter changes to a dashboard and updates all affected widgets. ## Signature ```graphql theme={null} updateDashboardFilters(id: String!, version: String, filterMutations: FilterMutationInput!): Dashboard! ``` ## Arguments The unique identifier of the dashboard to update filters for. Filter mutation configuration specifying the changes to apply (`FilterMutationInput`). ## Response Returns the updated `Dashboard` object with refreshed filter definitions. See [Dashboard](/integrations/graphql-api/objects/dashboard) for the schema. ## Usage example The following example shows how to apply filter changes to a dashboard: ```graphql theme={null} mutation UpdateDashboardFilters($id: String!, $filterMutations: FilterMutationInput!) { updateDashboardFilters(id: $id, filterMutations: $filterMutations) { id filters { id parsedFilter { column value } appliedState { widgetId filterIdOnWidget } } } } ``` ```bash Request theme={null} curl -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer " \ -d '{ "query": "mutation UpdateDashboardFilters($id: String!, $filterMutations: FilterMutationInput!) { updateDashboardFilters(id: $id, filterMutations: $filterMutations) { id filters { id parsedFilter { column value } } } }", "variables": { "id": "dashboard_123456789", "filterMutations": { "addFilters": [ { "column": "region", "value": "North America" } ] } } }' \ https://{ACCOUNT}.askwisdom.ai/graphql ``` ```json Response theme={null} { "data": { "updateDashboardFilters": { "id": "dashboard_123456789", "filters": [ { "id": "filter_987654321", "parsedFilter": { "column": "region", "value": "North America" } } ] } } } ``` ## Next steps Retrieve dashboard with updated filters Filter definition schema # Update Dashboard Widgets Source: https://docs.wisdom.ai/integrations/graphql-api/mutations/dashboard/update-dashboard-widgets The `updateDashboardWidgets` mutation updates multiple existing widgets on a dashboard in a single operation. This allows for bulk updates to widget properties such as titles, layouts, and other configurations. ## Signature ```graphql theme={null} updateDashboardWidgets(widgets: [DashboardWidgetInput!]): Dashboard! ``` ## Arguments Array of widget input objects containing the updates to apply. Each widget must include an `id` field to identify which widget to update. See [DashboardWidgetInput](/integrations/graphql-api/objects/dashboard-widget-input) for the complete schema. ## Response Returns the updated `Dashboard` object with all widgets populated, including the updated widget configurations. See [Dashboard](/integrations/graphql-api/objects/dashboard) for the schema. ## Usage example The following example shows how to update multiple widget properties on a dashboard: ```graphql theme={null} mutation UpdateDashboardWidgets($widgets: [DashboardWidgetInput!]) { updateDashboardWidgets(widgets: $widgets) { id version name widgets { id title nlQuery layout { top left width height } widgetType } } } ``` ```bash Request theme={null} curl -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer " \ -d '{ "query": "mutation UpdateDashboardWidgets($widgets: [DashboardWidgetInput!]) { updateDashboardWidgets(widgets: $widgets) { id version name widgets { id title nlQuery layout { top left width height } widgetType } } }", "variables": { "widgets": [ { "id": "widget_123456789", "title": "Updated Revenue Chart", "nlQuery": "Show monthly revenue by region" }, { "id": "widget_987654321", "layout": { "top": 6, "left": 4, "width": 8, "height": 6 } } ] } }' \ https://{ACCOUNT}.askwisdom.ai/graphql ``` ```json Response theme={null} { "data": { "updateDashboardWidgets": { "id": "dashboard_abcdef123456", "version": "v1.2", "name": "Sales Dashboard", "widgets": [ { "id": "widget_123456789", "title": "Updated Revenue Chart", "nlQuery": "Show monthly revenue by region", "layout": { "top": 0, "left": 0, "width": 6, "height": 4 }, "widgetType": "WIDGET_TYPE_VISUALIZATION" }, { "id": "widget_987654321", "title": "Customer Count", "nlQuery": "Total customers", "layout": { "top": 6, "left": 4, "width": 8, "height": 6 }, "widgetType": "WIDGET_TYPE_SUMMARY" } ] } } } ``` ## Next steps Add a new widget to dashboard Remove widgets from dashboard Update dashboard properties Widget input schema # Create Domain Source: https://docs.wisdom.ai/integrations/graphql-api/mutations/domain/create-domain The `createDomain` mutation creates a new domain with a name and optional description. ## Signature ```graphql theme={null} createDomain(input: CreateDomainInput!): DomainModel! ``` This mutation can only be executed by an administrator or a data administrator of the specific domain ID. ## Arguments Input object containing domain creation parameters. See [CreateDomainInput](#createdomaininput). ### CreateDomainInput The name of the domain. Must be unique within your organization. Optional description explaining the purpose and contents of the domain. The workspace ID in which to create the domain. Defaults to the current workspace if not specified. ## Response Returns a `DomainModel` object representing the newly created domain. See [DomainModel](/integrations/graphql-api/objects/domain-model) for the schema. ## Usage example Create a domain for organizing sales-related data sources: ```graphql theme={null} mutation CreateDomain($input: CreateDomainInput!) { createDomain(input: $input) { id version name description } } ``` ```bash Request theme={null} curl -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer " \ -d '{ "query": "mutation CreateDomain($input: CreateDomainInput!) { createDomain(input: $input) { id name description } }", "variables": { "input": { "name": "Sales Analytics", "description": "Customer data, transactions, and sales performance metrics" } } }' \ https://{ACCOUNT}.askwisdom.ai/graphql ``` ```json Response theme={null} { "data": { "createDomain": { "id": "ET_DOMAIN_id-here", "name": "Sales Analytics", "description": "Customer data, transactions, and sales performance metrics" } } } ``` ## Related operation Learn about domain structure and properties # Duplicate Domain Source: https://docs.wisdom.ai/integrations/graphql-api/mutations/domain/duplicate-domain The `duplicateDomain` mutation duplicates (clones) an existing domain, creating an independent copy. ## Signature ```graphql theme={null} duplicateDomain(id: ID!, workspaceID: ID): DomainModel! ``` This mutation requires write permission (`zsheet:write`) on the source domain. ## Arguments The ID of the source domain to duplicate. The target workspace ID where the duplicate domain will be created. Defaults to the current workspace if not specified. ## Response Returns a `DomainModel` object representing the newly created duplicate domain. See [DomainModel](/integrations/graphql-api/objects/domain-model) for the schema. ## Usage example Duplicate a domain into the current workspace: ```graphql theme={null} mutation DuplicateDomain($id: ID!, $workspaceID: ID) { duplicateDomain(id: $id, workspaceID: $workspaceID) { id version name description } } ``` ```bash Request theme={null} curl -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer " \ -d '{ "query": "mutation DuplicateDomain($id: ID!, $workspaceID: ID) { duplicateDomain(id: $id, workspaceID: $workspaceID) { id name description } }", "variables": { "id": "ET_DOMAIN_id-here", "workspaceID": "ET_WORKSPACE_id-here" } }' \ https://{ACCOUNT}.askwisdom.ai/graphql ``` ```json Response theme={null} { "data": { "duplicateDomain": { "id": "ET_DOMAIN_new-id-here", "name": "Sales Analytics (Copy)", "description": "Customer data, transactions, and sales performance metrics" } } } ``` ## Related operation Learn about domain structure and properties Create a new domain from scratch # Update Data Sources Source: https://docs.wisdom.ai/integrations/graphql-api/mutations/domain/update-data-sources The `dataSourcesUpdate` mutation updates the data sources configuration for an existing domain by specifying tables and their relationships. This operation allows you to modify which tables are included in a domain and how they are connected through joins. The input will overwrite any existing data sources that already existed. Treat the input as what the updated state of data sources should look like. ## Signature ```graphql theme={null} dataSourcesUpdate(input: DataSourcesUpdateInput!): DataSourcesUpdatePayload! ``` This mutation can only be executed by an administrator or a data administrator of the specific connection ID. ## Arguments Input object containing data sources update parameters. See [DataSourcesUpdateInput](#datasourcesupdateinput). ### DataSourcesUpdateInput The unique identifier of the domain to update. List of tables to include in the domain. See [TableInput](/integrations/graphql-api/objects/table-input). List of join relationships between tables. See [JoinInput](/integrations/graphql-api/objects/join-input). ## Response Returns a `DataSourcesUpdatePayload` object containing: Error, if any occurred. `null` indicates success. Whether the update operation completed successfully. ## Usage example Update a domain's data sources with tables and their relationships: ```graphql theme={null} mutation UpdateDataSources($input: DataSourcesUpdateInput!) { dataSourcesUpdate(input: $input) { success error } } ``` ```bash Request theme={null} curl -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer " \ -d '{ "query": "mutation UpdateDataSources($input: DataSourcesUpdateInput!) { dataSourcesUpdate(input: $input) { success error } }", "variables": { "input": { "domainId": "ET_DOMAIN_id-here", "tables": [ { "connection_id": "et-connection-id-here", "database_name": "analytics_warehouse", "schema_name": "customer_intelligence", "table_name": "user_accounts" }, { "connection_id": "et-connection-id2-here", "database_name": "analytics_warehouse", "schema_name": "business_metrics", "table_name": "subscription_events" } ], "joins": [ { "leftTable": "user_accounts", "rightTable": "subscription_events", "relationshipType": "ONE_TO_MANY", "joinConditions": [ { "leftColumnName": "account_id", "rightColumnName": "account_id" } ] } ] } } }' \ https://{ACCOUNT}.askwisdom.ai/graphql ``` ```json Response theme={null} { "data": { "dataSourcesUpdate": { "success": true, "error": null } } } ``` ## Next steps Create new domains for organizing data sources Learn about table input structure and validation Understand join configuration and relationship types Explore domain structure and properties # Create Users Source: https://docs.wisdom.ai/integrations/graphql-api/mutations/user/create-users The `createUsers` mutation provisions one or more users in a workspace. Call this before impersonating a user in the embedded flow — a user must exist before they can be impersonated. ## Signature ```graphql theme={null} createUsers(input: CreateUsersInput!): CreateUsersResponse! ``` ## Arguments Input object containing the details for the users to create. ### CreateUsersInput fields One or more email addresses to provision. User matching is email-based — each email must be unique within the workspace. If your embedded users may share email addresses across tenants (e.g., the same person is a customer of multiple clients), append a unique identifier to the email prefix: `alice+tenant123@yourcompany.com`. This prevents cross-tenant session collisions. The workspace to create the users in. Required for multi-workspace deployments. Role assignments for the new users. Each entry specifies a `roleId` and `scopes` (`RoleAssignmentInput`). For embedded dashboards, assign the Viewer role to hide edit controls: ```json theme={null} [{ "roleId": "00000000-0000-0000-0000-000000000003", "scopes": ["{{DOMAIN_ID}}"] }] ``` Whether to send a welcome email to the new users. Default: `false`. Set to `false` for programmatically provisioned embedded users. Key-value pairs for parameterized connections and row-level data access. These are stored as DATABASE-sourced attributes. See [User attributes](/integrations/user-management/user-attributes). Optional group IDs to assign the users to on creation. `CreateUsersInput` does not include a display name field. Users provisioned via this mutation appear as their email address in the WisdomAI admin screen. If a display name is needed, pass it as a `userAttributes` entry (for example, `{ "key": "display_name", "value": "Alice Smith" }`). ## Response Indicates whether the operation succeeded. See [ResponseStatus](/integrations/graphql-api/objects/response-status). The `status` field here returns a `ResponseStatus` object (with `code` and `message`). This is distinct from the `UserStatus` enum (e.g., `ACTIVE`) found on the `User` object. ## Usage example ```graphql theme={null} mutation CreateUsers($input: CreateUsersInput!) { createUsers(input: $input) { status { code message } } } ``` ```bash Single user theme={null} curl -s -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer " \ -d '{ "query": "mutation CreateUsers($input: CreateUsersInput!) { createUsers(input: $input) { status { code message } } }", "variables": { "input": { "emails": ["alice@yourcompany.com"], "workspaceID": "workspace_123", "roleAssignments": [{ "roleId": "00000000-0000-0000-0000-000000000003", "scopes": ["{{DOMAIN_ID}}"] }], "sendWelcomeEmail": false } } }' \ https://{ACCOUNT}.askwisdom.ai/graphql ``` ```bash Multiple users theme={null} curl -s -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer " \ -d '{ "query": "mutation CreateUsers($input: CreateUsersInput!) { createUsers(input: $input) { status { code message } } }", "variables": { "input": { "emails": ["alice@yourcompany.com", "bob@yourcompany.com"], "workspaceID": "workspace_123", "roleAssignments": [{ "roleId": "00000000-0000-0000-0000-000000000003", "scopes": ["{{DOMAIN_ID}}"] }], "sendWelcomeEmail": false } } }' \ https://{ACCOUNT}.askwisdom.ai/graphql ``` ```bash With user attributes theme={null} curl -s -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer " \ -d '{ "query": "mutation CreateUsers($input: CreateUsersInput!) { createUsers(input: $input) { status { code message } } }", "variables": { "input": { "emails": ["alice@yourcompany.com"], "workspaceID": "workspace_123", "roleAssignments": [{ "roleId": "00000000-0000-0000-0000-000000000003", "scopes": ["{{DOMAIN_ID}}"] }], "sendWelcomeEmail": false, "userAttributes": [ { "key": "account_id", "value": "acct_456" }, { "key": "region", "value": "us-east" } ] } } }' \ https://{ACCOUNT}.askwisdom.ai/graphql ``` ```json Success theme={null} { "data": { "createUsers": { "status": { "code": "OK", "message": "Users created successfully" } } } } ``` If a user with the same email already exists, the call succeeds but re-applies the role assignments you pass in, overwriting any manually assigned roles. To avoid resetting roles on existing users, check [`listUsers`](/integrations/graphql-api/queries/user/list-users) first and skip `createUsers` for users already provisioned. ## Related articles Update attributes on existing users Generate a session JWT for the created user How attributes control data access Full server-side embedding flow # Delete Users From Workspace Source: https://docs.wisdom.ai/integrations/graphql-api/mutations/user/delete-users-from-workspace The `deleteUsersFromWorkspace` mutation removes one or more users from a workspace. This action is **irreversible**. Deleted users lose all role assignments, attributes, and access to the workspace. Make sure you have the correct user IDs before calling this mutation. ## Signature ```graphql theme={null} deleteUsersFromWorkspace(ids: [ID!]!, workspaceID: ID!): DeleteUsersFromWorkspaceResponse! ``` ## Arguments The IDs of the users to delete. Use [listUsers](/integrations/graphql-api/queries/user/list-users) to find user IDs. The workspace to remove the users from. ## Permissions Requires `iam:delete` scoped to the target workspace. ## Response Indicates whether the operation succeeded. See [ResponseStatus](/integrations/graphql-api/objects/response-status). ## Usage example ```graphql theme={null} mutation DeleteUsersFromWorkspace($ids: [ID!]!, $workspaceID: ID!) { deleteUsersFromWorkspace(ids: $ids, workspaceID: $workspaceID) { status { code message } } } ``` ```bash Request theme={null} curl -s -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer " \ -d '{ "query": "mutation DeleteUsersFromWorkspace($ids: [ID!]!, $workspaceID: ID!) { deleteUsersFromWorkspace(ids: $ids, workspaceID: $workspaceID) { status { code message } } }", "variables": { "ids": ["user_abc123", "user_def456"], "workspaceID": "workspace_123" } }' \ https://{ACCOUNT}.askwisdom.ai/graphql ``` ```json Success theme={null} { "data": { "deleteUsersFromWorkspace": { "status": { "code": "OK", "message": "Users deleted successfully" } } } } ``` ## Related articles Query users before deleting them Provision new users in a workspace # Set User Attributes Source: https://docs.wisdom.ai/integrations/graphql-api/mutations/user/set-user-attributes The `setUserAttributes` mutation updates the DATABASE-sourced attributes for an existing user. Use this to update persistent key-value pairs that control parameterized connections and row-level data access. This mutation **replaces all DATABASE-sourced attributes** on the user. Any attributes not included in the new list will be removed. JWT-sourced attributes (from SSO claims) are not affected. See [User attributes](/integrations/user-management/user-attributes) for the difference between attribute sources. ## Signature ```graphql theme={null} setUserAttributes(input: SetUserAttributesInput!): SetUserAttributesResponse! ``` ## Arguments Input object identifying the user and the new attribute set. ### SetUserAttributesInput fields The ID of the user whose attributes should be updated. Use [listUsers](/integrations/graphql-api/queries/user/list-users) to find user IDs. The complete new set of DATABASE-sourced attributes. This replaces all existing DATABASE-sourced attributes — include every attribute you want the user to have after the call, not just the ones you're changing. ## Response Indicates whether the operation succeeded. See [ResponseStatus](/integrations/graphql-api/objects/response-status). ## Usage example ```graphql theme={null} mutation SetUserAttributes($input: SetUserAttributesInput!) { setUserAttributes(input: $input) { status { code message } } } ``` ```bash Request theme={null} curl -s -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer " \ -d '{ "query": "mutation SetUserAttributes($input: SetUserAttributesInput!) { setUserAttributes(input: $input) { status { code message } } }", "variables": { "input": { "userId": "user_abc123", "userAttributes": [ { "key": "account_id", "value": "acct_456" }, { "key": "region", "value": "us-west" } ] } } }' \ https://{ACCOUNT}.askwisdom.ai/graphql ``` ```json Success theme={null} { "data": { "setUserAttributes": { "status": { "code": "OK", "message": "User attributes updated successfully" } } } } ``` For attributes that are stable (e.g., `account_id`), set them once at creation via `userAttributes` in [createUsers](/integrations/graphql-api/mutations/user/create-users). For session-scoped overrides that should not be persisted, use `attributes` in [impersonateUser](/integrations/graphql-api/mutations/auth/impersonate-user) instead. ## Related articles Understand attribute sources and how they interact Pass transient attributes at session time Query users and inspect their current attributes # AIWorkstream Source: https://docs.wisdom.ai/integrations/graphql-api/objects/ai-workstream This page describes the information and status fields available for AI workflows. ## AIWorkstream Unique identifier for the AI workstream. Current status of the AI workflow. Progress percentage of the workflow (0-100). Array of workflow steps and their status. Additional metadata about the workflow. ## Related operation Container for AI workstreams # Attributes Source: https://docs.wisdom.ai/integrations/graphql-api/objects/attributes This page describes the formatting options and metadata attributes you can use when defining operations. ## Attributes Whether the content should be formatted as code. Whether the content ends with a line break. Whether the content represents an error state. Whether the content shows progress information. Whether the content is subtext or secondary information. SQL dialect for code formatting. Container identifier for grouping content. Query being generated (for progress indication). Timestamp of the last update. Stream identifier for real-time content. Name of derived table (for SQL content). Tool that generated this content. Whether the content represents an insight. Whether the content is a domain modeling suggestion. Report-specific attributes for content. ## ReportAttributes Identifier for the associated report. Whether this is an intermediate step in report generation. Whether this is a report element. Whether this is a report title. ## Related operation Operations using attributes # CanvasConfig Source: https://docs.wisdom.ai/integrations/graphql-api/objects/canvas-config This page describes the CanvasConfig object that represents the schema for domain canvas configuration. ## CanvasConfig Whether to disable suggested questions on the canvas. Whether to enable admin V2 access for this domain. Whether to force insights generation for queries. ## Related operations Parent domain structure # ChatMessage Source: https://docs.wisdom.ai/integrations/graphql-api/objects/chat-message This page describes the complete message structure used in conversations. ## ChatMessage Unique identifier for the chat message. The content of the message. See [Delta](/integrations/graphql-api/objects/delta). The unique identifier of the conversation this message belongs to. The unique identifier of the domain associated with this message. Whether the message has been edited. Array of error messages if any errors occurred during message processing. Optional message identifier for internal tracking. The sender of the message. See [ChatMessageSender](/integrations/graphql-api/objects/chat-message-sender). The date and time when the message was created. The date and time when the message was last updated. The date and time when the message data was last refreshed. Null if never refreshed. The unique identifier of the user who sent the message. The date and time when message generation was cancelled. Null if not cancelled. ## Related operations Learn about message content structure Message sender types Listen for message updates # ChatMessageDiff Source: https://docs.wisdom.ai/integrations/graphql-api/objects/chat-message-diff This page describes the differences in streaming messages when working with real-time updates. ## ChatMessageDiff The incremental content changes for the message. See [Delta](/integrations/graphql-api/objects/delta). The unique identifier of the conversation this diff belongs to. Optional message identifier for internal tracking. The sender of the message. See [ChatMessageSender](/integrations/graphql-api/objects/chat-message-sender). The date and time when the diff was created. The date and time when the diff was last updated. The date and time when the diff data was refreshed. Null if not refreshed. The date and time when message generation was cancelled. Null if not cancelled. Indicates whether the message generation is still in progress on the server. The unique identifier of the domain associated with this diff. The unique identifier of the user associated with this diff. Array of error messages if any errors occurred during processing. The index of the diff in the stream for idempotent reconnects. ## Related operations Learn about content diff structure Message sender types Receive real-time message diffs # ChatMessageSender Source: https://docs.wisdom.ai/integrations/graphql-api/objects/chat-message-sender This page describes the available message sender types and what each represents. ## ChatMessageSender The sender of a chat message. Here are the values and their description: | Value | Description | | ----------- | -------------------------------- | | `USER` | Message sent by a user | | `ASSISTANT` | Message sent by the AI assistant | | `SYSTEM` | System-generated message | ## Related operations Messages with sender information Message diffs with sender information # ChatThinkingEffort Source: https://docs.wisdom.ai/integrations/graphql-api/objects/chat-thinking-effort This page describes the `ChatThinkingEffort` parameter, which allows you to control the computational effort the AI applies when generating a response. Adjusting this level lets you balance response speed against the depth and quality of the analysis. ## ChatThinkingEffort The level of thinking effort to apply during AI response generation. This parameter accepts the following values: | **Value** | **Description** | | ------------------ | ----------------------------------------------- | | `UNKNOWN_THINKING` | Effort level not specified | | `LOW` | Minimal thinking effort for quick responses | | `MEDIUM` | Moderate thinking effort for balanced responses | | `HIGH` | Maximum thinking effort for complex analysis | ## Related operation Configure thinking effort for messages # CodegenConfig Source: https://docs.wisdom.ai/integrations/graphql-api/objects/codegen-config This page describes the CodegenConfig object that represents the schema for domain code generation configuration. ## CodegenConfig Level of thinking effort for AI code generation. See [ChatThinkingEffort](/integrations/graphql-api/objects/chat-thinking-effort). Whether to include today's date as a reference in generated queries. ## Related operations Parent domain structure AI thinking effort levels # Connection Source: https://docs.wisdom.ai/integrations/graphql-api/objects/connection This page describes the schema used for data source connections, including all fields, types, and enums. ## Connection Unique identifier for the connection. Configuration and metadata for the connection. See [ConnectionDetails](#connectiondetails). Job execution history for connection operations like metadata refresh. See [JobStatus](/integrations/graphql-api/objects/job-status). Timestamp when the connection was created. ## ConnectionDetails Human-readable name for the connection. Description of the connection and its purpose. The category of data source. See [DataSourceType](#datasourcetype). The specific type of data source connection. See [ConnectionType](#connectiontype). The SQL dialect used by this connection. ## Enums ### DataSourceType The category of data source. It accepts the following values: | Data Source Type | Description | | ------------------------------ | ----------------------------------------------------- | | `DATA_SOURCE_TYPE_UNSPECIFIED` | Type not specified | | `WAREHOUSE` | Data warehouse (Snowflake, BigQuery, Redshift, etc.) | | `BI_TOOL` | Business intelligence tool (Tableau, etc.) | | `FILE` | File-based data source (S3, Azure Blob Storage, etc.) | | `DATA_SOURCE_MCP_SERVER` | MCP server data source | ### ConnectionType The specific type of data source connection. It accepts the following values: | Connection Type | Description | | :---------------------------- | :------------------------------------- | | `CONNECTION_TYPE_UNSPECIFIED` | Type not specified | | `REDSHIFT` | Amazon Redshift data warehouse | | `SNOWFLAKE` | Snowflake data warehouse | | `TABLEAU` | Tableau business intelligence platform | | `BIGQUERY` | Google BigQuery data warehouse | | `POSTGRES` | PostgreSQL database | | `SQL_SERVER` | Microsoft SQL Server database | | `DATABRICKS` | Databricks analytics platform | | `MYSQL` | MySQL database | | `CLICKHOUSE` | ClickHouse database | | `ATHENA` | Amazon Athena query service | | `S3` | Amazon S3 file storage | | `MCP_SERVER` | MCP server connection | | `AZURE_SYNAPSE` | Azure Synapse Analytics | | `AZURE_BLOB_STORAGE` | Azure Blob Storage | | `TRINO` | Trino distributed SQL query engine | | `AZURE_SYNAPSE_SERVERLESS` | Azure Synapse Analytics Serverless | | `SHAREPOINT` | Microsoft SharePoint | | `SPANNER` | Google Cloud Spanner | | `TERADATA` | Teradata database | | `DUCKDB` | DuckDB embedded database | ## Related operations Query connection information and status Learn about job execution status tracking Trigger connection metadata refresh Understand domain and table management # ConversationUpdateOneOf Source: https://docs.wisdom.ai/integrations/graphql-api/objects/conversation-update-one-of This page outlines the union type for real-time conversation updates and the object types it can include. ## ConversationUpdateOneOf A complete message sent by the assistant. See [ChatMessage](/integrations/graphql-api/objects/chat-message). A streaming diff update for an assistant's response in progress. See [ChatMessageDiff](/integrations/graphql-api/objects/chat-message-diff). Indicates whether the assistant's response was cancelled. ## Related operations Subscribe to conversation updates Learn about the complete message structure Understand streaming message updates # Dashboard Source: https://docs.wisdom.ai/integrations/graphql-api/objects/dashboard This page describes the Dashboard object that represents a collection of widgets and visualizations. ## Dashboard Unique identifier for the dashboard. Display name of the dashboard. Optional description explaining the dashboard's purpose and contents. User who created the dashboard. Null for system-generated dashboards. Deprecated: Use `domains` field instead. Primary domain associated with the dashboard. List of domains associated with this dashboard. Array of widgets contained in this dashboard. See [DashboardWidget](/integrations/graphql-api/objects/dashboard-widget). Global filter definitions applied to the dashboard. See [DashboardFilterDefinition](/integrations/graphql-api/objects/dashboard-filter-definition). Timestamp when the dashboard was created. Current user's access level to this dashboard. See [DashboardScope](/integrations/graphql-api/objects/dashboard-scope). Version identifier for dashboard snapshots. Null if dashboard hasn't been modified. List of user and group role assignments for this dashboard. ## Related operations Retrieve dashboard by ID Retrieve multiple dashboards Widget structure and properties Access level definitions # Dashboard Filter Definition Source: https://docs.wisdom.ai/integrations/graphql-api/objects/dashboard-filter-definition This page describes the DashboardFilterDefinition object that defines global filters for dashboards. ## DashboardFilterDefinition Unique identifier for the filter definition. The parsed filter configuration. Array of widget-specific filter application states. See [FilterAppliedState](#filterappliedstate). ## FilterAppliedState ID of the widget this filter state applies to. ID of the filter as it exists on the specific widget. ## Related operations Dashboard containing filter definitions Apply filter changes to dashboard # Dashboard Input Source: https://docs.wisdom.ai/integrations/graphql-api/objects/dashboard-input This page describes the DashboardInput object used for creating and updating dashboards. ## DashboardInput Optional dashboard ID for update operations. Omit for creation. Display name for the dashboard. Optional description of the dashboard's purpose and contents. Optional domain ID to associate with the dashboard. ## Related operations Mutation using DashboardInput Update mutation using DashboardInput Resulting dashboard structure # Dashboard Scope Source: https://docs.wisdom.ai/integrations/graphql-api/objects/dashboard-scope This page describes the DashboardScope enum that defines access levels for dashboard operations. ## DashboardScope The access level for dashboard operations. The possible values are: | Value | Description | | ----------- | ------------------------------------ | | `NO_ACCESS` | User has no access to the dashboard | | `VIEWER` | User can view the dashboard | | `EDITOR` | User can view and edit the dashboard | ## Related operations Dashboard with access level information Query requiring scope parameter # DashboardSummaryDiff Source: https://docs.wisdom.ai/integrations/graphql-api/objects/dashboard-summary-diff This page describes the differences in streaming summary when working with real-time updates. ## DashboardSummaryDiff The incremental content changes for the summary. ## Related operation Subscription requiring dashboard summary diff # Dashboard Summary Type Source: https://docs.wisdom.ai/integrations/graphql-api/objects/dashboard-summary-type This page describes the DashboardSummaryType enum that defines types of dashboard summaries. ## DashboardScope The types of dashboard summaries. The possible values are: | Value | Description | | ---------------- | ----------------------- | | `SIMPLE_SUMMARY` | Summarise the dashboard | ## Related operation Subscription requiring dashboard summary type # Dashboard Widget Source: https://docs.wisdom.ai/integrations/graphql-api/objects/dashboard-widget This page describes the DashboardWidget object that represents individual visualizations and content blocks within a dashboard. ## DashboardWidget Unique identifier for the widget. Domain associated with this widget. May be null if the domain was deleted after widget creation. Display title for the widget. Natural language query that generated this widget's content. Chart or table visualization data. Null if there was an error generating the visualization. See [Visualization](/integrations/graphql-api/objects/visualization). Type of visualization (chart, table, etc.). See [VisualizationType](/integrations/graphql-api/objects/visualization-type). Positioning and sizing information for the widget. See [WidgetLayout](/integrations/graphql-api/objects/widget-layout). Timestamp when the widget data was last refreshed. ID of the conversation that generated this widget. Null if not sourced from a conversation. ID of the message that generated this widget. Null if not sourced from a conversation. Whether the current user can ask follow-up questions about this widget. Whether the current user can view the original conversation message that generated this widget. Type of widget content. See [WidgetType](#widgettype). Markdown content for text/markdown widgets. ## WidgetType The type of content displayed in the widget. The possible values are: | Value | Description | | --------------------------- | ----------------------------- | | `WIDGET_TYPE_UNKNOWN` | Unknown widget type | | `WIDGET_TYPE_VISUALIZATION` | Chart or table visualization | | `WIDGET_TYPE_MARKDOWN` | Rich text content | | `WIDGET_TYPE_SUMMARY` | Summary or aggregated content | ## Related operations Parent dashboard structure Widget positioning and sizing Chart and table data structure Modify widget properties # Dashboard Widget Input Source: https://docs.wisdom.ai/integrations/graphql-api/objects/dashboard-widget-input This page describes the DashboardWidgetInput object used for creating and updating dashboard widgets. ## DashboardWidgetInput Optional widget ID for update operations. Omit for creation. Optional domain ID associated with the widget. Optional display title. If null, the natural language query will be used as title. Natural language query for generating the widget content. Optional ID of an existing visualization to use for the widget. Optional visualization type. If null, will be determined from the natural language query. See [VisualizationType](/integrations/graphql-api/objects/visualization-type). Positioning and sizing information for the widget. See [WidgetLayoutInput](/integrations/graphql-api/objects/widget-layout-input). Optional ID of the conversation that generated this widget. Optional ID of the message that generated this widget. Optional timestamp for when data was last refreshed. Optional message body for chat-based widget updates. Type of widget content. See [WidgetType](/integrations/graphql-api/objects/dashboard-widget#widgettype). Markdown content for text/markdown widgets. ## Related operations Resulting widget structure Mutation using DashboardWidgetInput Update mutation using DashboardWidgetInput # Dashboards Response Source: https://docs.wisdom.ai/integrations/graphql-api/objects/dashboards-response This page describes the DashboardsResponse object returned by dashboard listing queries. ## DashboardsResponse Array of dashboard objects matching the query criteria. See [Dashboard](/integrations/graphql-api/objects/dashboard). Pagination information for the result set. ## Related operations Query that returns this response Individual dashboard structure # DataLabelMode Source: https://docs.wisdom.ai/integrations/graphql-api/objects/data-label-mode This page describes the DataLabelMode enum that controls how data labels appear on visualizations. ## DataLabelMode The mode for displaying data labels on visualizations. The possible values are: | Value | Description | | --------------------------- | ---------------------------------------------- | | `DATA_LABEL_MODE_AUTOMATIC` | Labels shown automatically based on chart type | | `DATA_LABEL_MODE_ALWAYS` | Labels always displayed | | `DATA_LABEL_MODE_NONE` | Labels never displayed | ## Related operations Visualization configuration Parent domain structure # DatabaseModel Source: https://docs.wisdom.ai/integrations/graphql-api/objects/database-model This page describes the DatabaseModel object that represents the schema for database objects within a domain. ## DatabaseModel Unique identifier for the database. The type of database. See [DatabaseType](/integrations/graphql-api/objects/database-type). Version number of the database for change tracking. Name of the database. Optional display name for the database. Identifier of the domain this database belongs to. Connection details for accessing this database. See [Connection](/integrations/graphql-api/objects/connection). List of tables in this database. Whether this database was created from user-uploaded CSV files. ## Related operations Parent domain structure Database connection details Database type definitions # DatabaseType Source: https://docs.wisdom.ai/integrations/graphql-api/objects/database-type This page describes the DatabaseType enum that defines the type of database connection. ## DatabaseType The type of database connection. The possible values are: | Value | Description | | --------------------------- | ------------------------- | | `DATABASE_TYPE_UNSPECIFIED` | Type not specified | | `DATABASE_TYPE_WAREHOUSE` | Data warehouse connection | | `DATABASE_TYPE_FILESYSTEM` | File-based data source | ## Related operations Database object structure Parent domain structure # Delta Source: https://docs.wisdom.ai/integrations/graphql-api/objects/delta This page describes the input structure used for message content operations. ## Delta Array of operations that define the message content. See [Operation](/integrations/graphql-api/objects/operation). ## Related operations Learn about individual operations Input version for sending messages Messages containing Delta content # DeltaElement Source: https://docs.wisdom.ai/integrations/graphql-api/objects/delta-element This page describes the content elements that can be inserted in operations. ## DeltaElement Plain text content to insert. Chart, table, or other data visualization. See [Visualization](/integrations/graphql-api/objects/visualization). Data expression or formula reference. Reference to another message by ID. Reference to external resources or entities. Reference to a visualization element. Rich text content with references and metadata. See [TextArtifact](/integrations/graphql-api/objects/text-artifact). AI function calls made by the assistant. See [LLMToolCalls](/integrations/graphql-api/objects/llm-tool-calls). Results from AI function calls. See [LLMToolCallResults](/integrations/graphql-api/objects/llm-tool-call-results). AI workflow information and status. See [AIWorkstream](/integrations/graphql-api/objects/ai-workstream). Content section with title and body. See [Section](/integrations/graphql-api/objects/section). ## Related operations Operations containing DeltaElement Chart and table visualizations Rich text content with references AI function calls # DeltaInput Source: https://docs.wisdom.ai/integrations/graphql-api/objects/delta-input ## DeltaInput Array of operation inputs that define the message content. ## Related operations Use DeltaInput to send messages Output version of Delta # DomainModel Source: https://docs.wisdom.ai/integrations/graphql-api/objects/domain-model This page describes the schema for domain objects that organize related data sources. ## DomainModel Unique identifier for the domain. Version number of the domain for change tracking. Human-readable name for the domain. Optional description explaining the purpose and contents of the domain. List of databases included in this domain. See [DatabaseModel](/integrations/graphql-api/objects/database-model). Datasets (file-based data sources) associated with this domain, including S3, Azure Blob Storage, SharePoint, and Wisdom-managed datasets. Domain-specific knowledge entries. See [Knowledge](/integrations/graphql-api/objects/knowledge). Custom system instructions for AI interactions within this domain. Fiscal year start month (1-12) for financial calculations. Timezone used for date and time calculations in this domain. Visualization configuration settings. See [VizConfig](/integrations/graphql-api/objects/viz-config). Code generation configuration settings. See [CodegenConfig](/integrations/graphql-api/objects/codegen-config). List of join relationships between tables in this domain. Web search configuration for this domain. See [DomainWebSearchConfig](/integrations/graphql-api/objects/domain-web-search-config). Canvas configuration settings. See [CanvasConfig](/integrations/graphql-api/objects/canvas-config). Row-level security configuration for this domain. See [DomainRLSConfig](/integrations/graphql-api/objects/domain-rls-config). ISO timestamp when the domain was last modified. Full name of the user who created this domain. Whether this domain was automatically generated by the system. ## Related operations Create new domains for organizing data sources Duplicate an existing domain Database structure within a domain Domain knowledge entries Visualization configuration Code generation configuration Connection schema and properties # DomainRLSConfig Source: https://docs.wisdom.ai/integrations/graphql-api/objects/domain-rls-config This page describes the DomainRLSConfig object that represents the schema for domain row-level security configuration. ## DomainRLSConfig Whether row-level security is enforced for admin users. ## Related operations Parent domain structure # DomainWebSearchConfig Source: https://docs.wisdom.ai/integrations/graphql-api/objects/domain-web-search-config This page describes the DomainWebSearchConfig object that represents the schema for domain web search configuration. ## DomainWebSearchConfig Whether web search is enabled for this domain. List of web domains to include in search results. List of web domains to exclude from search results. ## Related operations Parent domain structure # Filter Applied State Source: https://docs.wisdom.ai/integrations/graphql-api/objects/filter-applied-state This page describes the FilterAppliedState object that tracks how filters are applied to individual widgets. ## FilterAppliedState Unique identifier of the widget this filter state applies to. Identifier of the filter as it exists on the specific widget. ## Related operations Parent filter definition Widget that filter applies to # JobStatus Source: https://docs.wisdom.ai/integrations/graphql-api/objects/job-status This page describes the schema for Job Status. ## JobStatus Information about the most recent job execution attempt. See [JobRun](#jobrun). Information about the most recent successful job execution. See [JobRun](#jobrun). ## JobRun Unique identifier for this specific job execution. Identifier for the job definition that was executed. The type of job that was executed (e.g., `CRAWL_METADATA` for connection refresh operations). Identifier of the user who initiated the job execution. The current status of the job execution. See [JobRunStatus](#jobrunstatus). ISO 8601 timestamp when the job execution started. ISO 8601 timestamp when the job execution completed (successfully or with failure). Human-readable summary of the job execution result. Brief error message if the job failed, null if successful. ISO 8601 timestamp when the job execution record was created. ## JobRunStatus The status of a job execution. This parameter can have one of the following values: | Status | Description | | :----------------------- | :--------------------------------------- | | `JOB_RUN_STATUS_UNKNOWN` | Status is unknown or not set | | `JOB_RUN_STATUS_QUEUED` | Job is queued and waiting to be executed | | `JOB_RUN_STATUS_RUNNING` | Job is currently executing | | `JOB_RUN_STATUS_SUCCESS` | Job completed successfully | | `JOB_RUN_STATUS_FAILED` | Job failed with errors | | `JOB_RUN_STATUS_SKIPPED` | Job was skipped | ## Related operations Query connection status and metadata Trigger connection metadata refresh # JoinInput Source: https://docs.wisdom.ai/integrations/graphql-api/objects/join-input This page describes the schema for join input objects used to define table relationships. ## JoinInput Input type for specifying join relationships between tables when updating data sources in a domain. The left table in the join relationship. See [TableInput](/integrations/graphql-api/objects/table-input). The right table in the join relationship. See [TableInput](/integrations/graphql-api/objects/table-input). The type of relationship between the tables. See [RelationshipType](#relationshiptype). List of join conditions that define how the tables are connected. See [JoinConditionInput](#joinconditioninput). ## JoinConditionInput Defines a single join condition between two table columns. The name of the column in the left table to join on. The name of the column in the right table to join on. ## RelationshipType The `RelationshipType` enum defines the cardinality between joined tables and can be set to one of the following values: | Relationship Type | Description | | :-------------------------- | :-------------------------------------------------------------------------------- | | `RELATIONSHIP_TYPE_UNKNOWN` | Relationship type is not specified or unclear. | | `ONE_TO_ONE` | Each record in the left table matches exactly one record in the right table. | | `ONE_TO_MANY` | Each record in the left table can match multiple records in the right table. | | `MANY_TO_ONE` | Multiple records in the left table can match one record in the right table. | | `MANY_TO_MANY` | Multiple records in the left table can match multiple records in the right table. | ## Related operations Use JoinInput to define table relationships Configure tables that participate in joins Understand how joins fit within domain structure Start with domain creation before adding joins # Knowledge Source: https://docs.wisdom.ai/integrations/graphql-api/objects/knowledge This page describes the Knowledge object that represents the schema for domain knowledge entries. ## Knowledge Name or label for this knowledge entry. The knowledge content or description. Timestamp when this knowledge entry was last updated. The user who last updated this knowledge entry. See [User](/integrations/graphql-api/objects/user). ## Related operations Parent domain structure User who updated this entry # LLMToolCallResults Source: https://docs.wisdom.ai/integrations/graphql-api/objects/llm-tool-call-results This page describes the results returned from AI function calls, grouped together and including details for each individual function invocation. ## LLMToolCallResults Unique identifier for the result group. Array of individual function call results. ## LLMFunctionCallResult Unique identifier for the function call result. Name of the function that was called. The result returned by the function call. Identifier linking this result to its original call. ## Related operations Original tool calls Container for tool call results # LLMToolCalls Source: https://docs.wisdom.ai/integrations/graphql-api/objects/llm-tool-calls This page describes the AI function calls made by the assistant, including details for each individual call and their associated arguments. ## LLMToolCalls Unique identifier for the tool call group. Array of individual function calls made by the AI. ## LLMFunctionCall Unique identifier for the function call. Name of the function being called. JSON object containing the function arguments. Identifier linking this call to its result. ## Related operations Results from tool calls Container for tool calls # Operation Source: https://docs.wisdom.ai/integrations/graphql-api/objects/operation This page describes individual operations within Delta content. ## Operation Content to insert at the current position. See [DeltaElement](/integrations/graphql-api/objects/delta-element). Number of characters to delete from the current position. Number of characters to retain from the current position. Formatting and metadata attributes for the operation. See [Attributes](/integrations/graphql-api/objects/attributes). ## Related operations Content elements for insert operations Operation formatting and metadata Container for operations # ResponseStatus Source: https://docs.wisdom.ai/integrations/graphql-api/objects/response-status `ResponseStatus` is returned by mutations to indicate whether the operation succeeded. It is a distinct type from the `UserStatus` enum — mutation responses use this object, not the enum. ## Fields A code indicating the result of the operation. `OK` means the operation succeeded; any other value indicates failure. A human-readable message describing the result. On failure, this field contains the error details. ## StatusCode enum ```graphql theme={null} enum StatusCode { NONE OK ERROR NOT_FOUND } ``` ## Example values ```json Success theme={null} { "status": { "code": "OK", "message": "Operation completed successfully" } } ``` ```json Failure theme={null} { "status": { "code": "ERROR", "message": "User with email alice@yourcompany.com already exists" } } ``` ```json Not found theme={null} { "status": { "code": "NOT_FOUND", "message": "User not found" } } ``` GraphQL returns HTTP 200 even when `status.code` is not `"OK"`. Always check the `code` field in the response body to determine success or failure. See [Error handling](/integrations/graphql-api/GraphQL-API#error-handling). When querying mutations, you must explicitly request `{ status { code message } }` — requesting just `{ status }` returns nothing. ## Operations that return ResponseStatus Returns ResponseStatus Returns ResponseStatus Returns ResponseStatus # Scope Role Assignment Input Source: https://docs.wisdom.ai/integrations/graphql-api/objects/scope-role-assignment-input This page describes the `ScopeRoleAssignmentInput` object used for managing user access to shared resources like Dashboards. ## ScopeRoleAssignmentInput The identifier of the role to assign. For Dashboards, use: * `00000000-0000-0000-0000-000000000008` for viewer access (read-only) * `00000000-0000-0000-0000-000000000009` for editor access (read and write) The unique identifier of the user who will receive the specified role and access to the shared resource. ## Related operations Grant access using ScopeRoleAssignmentInput Remove access using ScopeRoleAssignmentInput # Section Source: https://docs.wisdom.ai/integrations/graphql-api/objects/section This page describes the content section structure, including title and body. ## Section The title or heading of the section. The main content body of the section. ## Related operations Container for sections # SubscriptionAuthInput Source: https://docs.wisdom.ai/integrations/graphql-api/objects/subscription-auth-input This page describes the authentication input used for GraphQL subscriptions. ## SubscriptionAuthInput JWT authentication token for subscription access. ## Related operation Use authentication with subscriptions # TableInput Source: https://docs.wisdom.ai/integrations/graphql-api/objects/table-input This page describes the schema for table input objects used in data source operations. ## TableInput The unique identifier of the connection that provides access to this table. The name of the database containing this table. Use the following as `database_name` for: * **BigQuery**: Use the Project ID (e.g., `"my-project-123"`) * **Databricks**: Use the Catalog name (e.g., `"main"`) Schema name within the database. Optional for data sources which don't have the notion of a schema. Use the following as `schema_name` for: * **BigQuery**: Use the Dataset name (e.g., `"sales_data"`) * **Databricks**: Use the Schema name (e.g., `"default"`) * **MySQL, ClickHouse**: Do not pass or leave empty (`""`) The name of the table within the specified database and schema. ## Related operations Use TableInput to update domain data sources Configure relationships between tables Learn about connection configuration Understand domain structure and table organization # TextArtifact Source: https://docs.wisdom.ai/integrations/graphql-api/objects/text-artifact This page describes rich text content that includes references and metadata. ## TextArtifact Unique identifier for the text artifact. The main text content of the artifact. Array of references to external resources or entities. Number of search hits or matches found. Array of filter strings applied to the content. Optional reference to a related ZSheet. Optional reference to a related dataset. ## Related operation Container for text artifacts # ToolSelection Source: https://docs.wisdom.ai/integrations/graphql-api/objects/tool-selection This page describes the tool selection configuration used for message processing. ## ToolSelection Array of specific tools to enable for message processing. Supported values: * `TABULAR_DATA`: Enables querying databases. * `TEXTUAL_DATA`: Enables querying unstructured documents. ``` "toolSelection": { "optInToolNames": [ "TABULAR_DATA", "TEXTUAL_DATA" ] } ``` ## Related operation Use ToolSelection with messages # User Source: https://docs.wisdom.ai/integrations/graphql-api/objects/user This page describes the User object that represents a user account in WisdomAI. ## User A unique identifier for the user. The user's email address. The user's display name. URL to the user's profile picture. Timestamp when the user account was created. Timestamp of the user's last active session. Null if the user has never logged in. List of role assignments granted to this user. User attributes from the authentication token. Whether this user account is managed via SCIM provisioning. ## Related operations Query the current authenticated user # Visualization Source: https://docs.wisdom.ai/integrations/graphql-api/objects/visualization This page describes chart, table, and data visualization objects. ## Visualization Unique identifier for the visualization. The type of visualization. See [VisualizationType](/integrations/graphql-api/objects/visualization-type). Display title for the visualization. Original type before user modifications. Two-dimensional array of data cells representing the visualization data. Subtotal aggregations for drilled-down data. Whether additional data is available beyond the current page. Pagination information for the data. Total number of rows in the complete dataset. Column definitions in display order. Display formatting for each column. Preferred column order for table views. Dimension columns for grouping data. Unique dimension values. Measure columns for numeric analysis. Grouped measures with formatting information. Geographic dimension pairs for map visualizations. Column used for color coding in map visualizations. Columns displayed in map tooltips. Applied filter operations. Human-readable filter representations. Raw filter operations not yet processed. Applied sorting configuration. Available update operations for the visualization. Sequence of drill-down operations applied. Generated SQL or code for the visualization. Confidence level information for generated code. LLM-generated visualization specification. Highcharts configuration object for rendering charts. It contains the actual data as well the chart spec. See the [Highcharts API Reference](https://api.highcharts.com/highcharts/) for complete documentation on available options. ## Related operations Available visualization types Container for visualizations # VisualizationType Source: https://docs.wisdom.ai/integrations/graphql-api/objects/visualization-type This page describes the types of visualizations used for displaying data. The following table lists the available visualization types along with their corresponding descriptions. | **Value** | **Description** | | -------------------------- | ------------------------------------- | | `BAR_CHART` | Horizontal bar chart | | `STACKED_BAR_CHART` | Stacked horizontal bar chart | | `STACKED_100_BAR_CHART` | 100% stacked horizontal bar chart | | `COLUMN_CHART` | Vertical column chart | | `STACKED_COLUMN_CHART` | Stacked vertical column chart | | `STACKED_100_COLUMN_CHART` | 100% stacked vertical column chart | | `LINE_CHART` | Line chart for trends over time | | `AREA_CHART` | Area chart with filled regions | | `STACKED_AREA_CHART` | Stacked area chart | | `SCATTER_CHART` | Scatter plot for correlation analysis | | `FUNNEL_CHART` | Funnel chart for conversion analysis | | `PIE_CHART` | Pie chart for proportional data | | `FORECAST_CHART` | Chart with forecasting capabilities | | `POLAR_CHART` | Polar coordinate chart | | `SPIDER_CHART` | Spider/radar chart | | `HEATMAP_CHART` | Heatmap for density visualization | | `TABLE` | Tabular data display | | `TEXT` | Plain text display | | `UNKNOWN_VISUALIZATION` | Unknown or unspecified type | | `MAP` | Geographic map visualization | | `LLM_GENERATED_CHART` | AI-generated custom chart | ## Related operations Full visualization object structure # VizConfig Source: https://docs.wisdom.ai/integrations/graphql-api/objects/viz-config This page describes the VizConfig object that represents the schema for domain visualization configuration. ## VizConfig Whether to always use compact number formatting in visualizations. Whether to show the data panel by default in visualizations. Whether to show the domain description on the search page. Whether to disable data previews for explorer users. Whether to enable file download for explorer users. Whether to always show full number text instead of abbreviated values. Default data label mode for visualizations. See [DataLabelMode](/integrations/graphql-api/objects/data-label-mode). ## Related operations Parent domain structure Data label display modes # Widget Layout Source: https://docs.wisdom.ai/integrations/graphql-api/objects/widget-layout This page describes the WidgetLayout object that defines the positioning and sizing of dashboard widgets. ## WidgetLayout Height of the widget in grid units. Width of the widget in grid units. Top position of the widget in grid coordinates. Left position of the widget in grid coordinates. ## Related operations Widget that uses this layout Input version for creating/updating layouts # Widget Layout Input Source: https://docs.wisdom.ai/integrations/graphql-api/objects/widget-layout-input This page describes the WidgetLayoutInput object used for creating and updating widget layouts. ## WidgetLayoutInput Height of the widget in grid units. Width of the widget in grid units. Top position of the widget in grid coordinates. Left position of the widget in grid coordinates. ## Related operations Output version of layout Input object that uses WidgetLayoutInput # Widget Type Source: https://docs.wisdom.ai/integrations/graphql-api/objects/widget-type This page describes the WidgetType enum that defines the type of content in a dashboard widget. ## WidgetType | Value | Description | | --------------------------- | ----------------------------- | | `WIDGET_TYPE_UNKNOWN` | Unknown widget type | | `WIDGET_TYPE_VISUALIZATION` | Chart or table visualization | | `WIDGET_TYPE_MARKDOWN` | Rich text content | | `WIDGET_TYPE_SUMMARY` | Summary or aggregated content | ## Related operations Widget with type field Input object with widget type # Exchange Access Token Source: https://docs.wisdom.ai/integrations/graphql-api/queries/auth/exchange-access-token The `exchangeAccessToken` query exchanges a dedicated access key for a JWT token that can be used to authenticate subsequent GraphQL API requests. **Deprecation Notice**\ For embedding use cases, use the [Impersonate User](/integrations/graphql-api/mutations/auth/impersonate-user) API instead, which provides better security and user context. ## Signature ```graphql theme={null} exchangeAccessToken(accessToken: String!): String! ``` ## Parameters The dedicated access key provided by WisdomAI for your organization. Contact `support@askwisdom.ai` to obtain your access key. ## Response Returns a JWT token as a string that should be used in the `Authorization` header for subsequent API requests. ## Usage example ```graphql theme={null} query ExchangeAccessToken($accessToken: String!) { exchangeAccessToken(accessToken: $accessToken) } ``` ```bash theme={null} curl -X POST https://{ACCOUNT}.askwisdom.ai/graphql \ -H "Content-Type: application/json" \ -d '{ "query": "query ExchangeAccessToken($accessToken: String!) { exchangeAccessToken(accessToken: $accessToken) }", "variables": { "accessToken": "your-access-key-here" } }' ``` JWT tokens have a limited lifetime. You will need to exchange your access key for a new JWT token periodically. ## Next steps Complete GraphQL API authentication guide Recommended API for embedding use cases # Connection Source: https://docs.wisdom.ai/integrations/graphql-api/queries/connection/connection Retrieve detailed information about a specific data source connection, including its last job run and last successful job run. ## Signature ```graphql theme={null} connection(id: ID!): Connection! ``` This query can only be executed by an administrator or a data administrator of the specific connection ID. ## Arguments The unique identifier of the connection to retrieve. ## Response Returns a `Connection` object containing connection details and status information. See [Connection](/integrations/graphql-api/objects/connection) schema. ## Usage example ```graphql theme={null} query GetConnectionRefreshStatus($id: ID!) { connection(id: $id) { id status { lastRun { status startedAt endedAt conciseErrorMessage } lastSuccessfulRun { status endedAt } } } } ``` ```bash Request theme={null} curl -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer " \ -d '{ "query": "query GetConnection($id: ID!) { connection(id: $id) { id details { name connectionType } status { lastRun { status endedAt } } } }", "variables": { "id": "et-connection-id-here" } }' \ https://{ACCOUNT}.askwisdom.ai/graphql ``` ```json Response theme={null} { "data": { "connection": { "id": "et-connection-id-here", "details": { "name": "Snowflake Jan07", "connectionType": "SNOWFLAKE" }, "status": { "lastRun": { "status": "JOB_RUN_STATUS_SUCCESS", "endedAt": "2025-07-21T21:45:54.931+00:00" } } } } } ``` ## Next steps Trigger metadata refresh for connections Learn about connection object structure Understand job execution status tracking # Dashboard Source: https://docs.wisdom.ai/integrations/graphql-api/queries/dashboard/dashboard The `dashboard` query retrieves detailed information about a specific dashboard by its unique identifier. ## Signature ```graphql theme={null} dashboard(id: String!, scope: DashboardScope!, version: String): Dashboard! ``` ## Arguments The unique identifier of the dashboard to retrieve. The access level required for the dashboard. See [DashboardScope](/integrations/graphql-api/objects/dashboard-scope). Optional version identifier for retrieving a specific historical snapshot of the dashboard. ## Response Returns a `Dashboard` object containing the complete dashboard configuration and metadata. See [Dashboard](/integrations/graphql-api/objects/dashboard) for the schema. ## Usage example This example shows how to retrieve a dashboard with editor access: ```graphql theme={null} query GetDashboard($id: String!, $scope: DashboardScope!) { dashboard(id: $id, scope: $scope) { id name description widgets { id title nlQuery widgetType layout { top left width height } visualization { id title type } summaryWidgetConfig{ customInstructions } } filters { id parsedFilter { filterId operator lhs { displayName } rhs { literal { flattened { literal { value } } } } } } accessLevel } } ``` ```bash Request theme={null} curl -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer " \ -d '{ "query": "query GetDashboard($id: String!, $scope: DashboardScope!) { dashboard(id: $id, scope: $scope) { id name description widgets { id title layout { top left width height } } accessLevel } }", "variables": { "id": "dashboard_123456789", "scope": "EDITOR" } }' \ https://{ACCOUNT}.askwisdom.ai/graphql ``` ```json Response theme={null} { "data": { "dashboard": { "id": "dashboard_123456789", "name": "Sales Performance Dashboard", "description": "Monthly sales metrics and KPIs", "widgets": [ { "id": "widget_987654321", "title": "Total Sales", "layout": { "top": 0, "left": 0, "width": 6, "height": 4 } }, { "id": "widget_96f27a852f55", "title": " ", "nlQuery": "", "widgetType": "WIDGET_TYPE_SUMMARY", "layout": { "top": 1, "left": 0, "width": 12, "height": 3, }, "visualization": null, "summaryWidgetConfig": { "customInstructions": "User guidelines:Generate Short Summary", }, }, ], "filters": [ { "id": "dashboard_123456789-filter_1234", "parsedFilter": { "filterId": "filter_1234", "operator": "FUNC_ILIKE", "lhs": { "displayName": "acc.ACCOUNT_NAME", "__typename": "LHS" }, "rhs": { "literal": { "flattened": [ { "literal": { "value": "\"%Account%\"", }, } ], }, }, }, } ], "accessLevel": "EDITOR" } } } ``` ## Next steps Retrieve multiple dashboards Modify dashboard properties Complete dashboard schema # Dashboards Source: https://docs.wisdom.ai/integrations/graphql-api/queries/dashboard/dashboards The `dashboards` query retrieves a list of dashboards accessible to the current user, with optional filtering by domain and owner. ## Signature ```graphql theme={null} dashboards(scope: DashboardScope!, domainId: String, ownerId: String): DashboardsResponse! ``` ## Arguments The access level to filter dashboards by. See [DashboardScope](/integrations/graphql-api/objects/dashboard-scope). Optional filter to retrieve only dashboards associated with a specific domain. Optional filter to retrieve only dashboards owned by a specific user. ## Response Returns a `DashboardsResponse` object containing a list of accessible dashboards. See [DashboardsResponse](/integrations/graphql-api/objects/dashboards-response) for the schema. ## Usage example This example shows how to retrieve all dashboards with viewer access: ```graphql theme={null} query GetDashboards($scope: DashboardScope!) { dashboards(scope: $scope) { nodes { id name createdAt domains { id name } owner { id displayName } accessLevel } } } ``` ```bash Request theme={null} curl -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer " \ -d '{ "query": "query GetDashboards($scope: DashboardScope!) { dashboards(scope: $scope) { nodes { id name createdAt domains { id name } owner { id displayName } accessLevel } } }", "variables": { "scope": "VIEWER" } }' \ https://{ACCOUNT}.askwisdom.ai/graphql ``` ```json Response theme={null} { "data": { "dashboards": { "nodes": [ { "id": "dashboard_123456789", "name": "Sales Performance Dashboard", "createdAt": "2024-01-15T10:30:00Z", "domains": [ { "id": "domain_987654321", "name": "Sales Analytics" } ], "owner": { "id": "user_456789123", "displayName": "John Doe" }, "accessLevel": "EDITOR" } ] } } } ``` ## Next steps Retrieve a specific dashboard Create a new dashboard Complete response schema # Current User Source: https://docs.wisdom.ai/integrations/graphql-api/queries/user/current-user Retrieve information about the currently authenticated user and their account details. ## currentUser Retrieves detailed information about the currently authenticated user, including profile data, preferences, and permissions. ### Signature ```graphql theme={null} currentUser: User! ``` ### Parameters This query takes no parameters and returns information for the currently authenticated user based on the provided bearer token. ### Response type Returns a `User` object containing comprehensive user information. See the [User Objects](/integrations/graphql-api/objects/user) documentation for complete field definitions. ## Authentication User queries require authentication via bearer token. Include your API token in the Authorization header: ``` Authorization: Bearer YOUR_API_TOKEN ``` ## Next steps Complete reference for user-related objects # List Users Source: https://docs.wisdom.ai/integrations/graphql-api/queries/user/list-users The `listUsers` query returns users in a workspace along with their attributes and role assignments. Use it to look up user IDs before calling [impersonateUser](/integrations/graphql-api/mutations/auth/impersonate-user) or [setUserAttributes](/integrations/graphql-api/mutations/user/set-user-attributes). ## Signature ```graphql theme={null} listUsers(workspaceId: ID): [User!]! ``` ## Parameters Filters results to a specific workspace. Required for multi-workspace deployments. ## Response Returns an array of `User` objects. See [User](/integrations/graphql-api/objects/user) for the full schema. The fields most relevant to user management are: The user's unique ID. Pass this to `impersonateUser`, `setUserAttributes`, or `deleteUsersFromWorkspace`. The user's email address. Key-value pairs associated with the user. Each entry includes: * `key` — attribute name * `value` — attribute value * `source` — either `DATABASE` (set via API) or `JWT` (from SSO claims, read-only) See [User attributes](/integrations/user-management/user-attributes) for how these sources differ. The roles assigned to the user and their scope. ## Usage example ```graphql theme={null} query ListUsers($workspaceId: ID) { listUsers(workspaceId: $workspaceId) { id email userAttributes { key value source } roleAssignments { roleId scopes } } } ``` ```bash Request theme={null} curl -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer " \ -d '{ "query": "query ListUsers($workspaceId: ID) { listUsers(workspaceId: $workspaceId) { id email userAttributes { key value source } roleAssignments { roleId scopes } } }", "variables": { "workspaceId": "workspace_123" } }' \ https://{ACCOUNT}.askwisdom.ai/graphql ``` ```json Response theme={null} { "data": { "listUsers": [ { "id": "user_abc123", "email": "alice@yourcompany.com", "userAttributes": [ { "key": "account_id", "value": "acct_456", "source": "DATABASE" }, { "key": "department", "value": "finance", "source": "JWT" } ], "roleAssignments": [ { "roleId": "00000000-0000-0000-0000-000000000003", "scopes": ["{{DOMAIN_ID}}"] } ] } ] } } ``` ## Related articles Use the user ID to start an embedded session Update DATABASE-sourced attributes on a user Remove users from a workspace # Dashboard Summary Source: https://docs.wisdom.ai/integrations/graphql-api/subscriptions/dashboard-summary The `dashboardSummary` subscription allows you to generate summary of a dashboard, based on the instructions provided to it ## Signature ```graphql theme={null} dashboardSummary( auth: SubscriptionAuthInput! id: String! idempotencyKey: String! customInstructions: String summaryType: DashboardSummaryType ): DashboardSummaryDiff! ``` ## Arguments Authentication credentials for the subscription. See [SubscriptionAuthInput](/integrations/graphql-api/objects/subscription-auth-input). The unique identifier of the dashboard whose summary is to be generated. The random string to be passed to avoid duplicate calls to the server. The instructions to be followed while generating summary. The type of summary to be generated. See [DashboardSummaryType](/integrations/graphql-api/objects/dashboard-summary-type). ## Response Returns an array of `DashboardSummaryDiff` objects representing conversation updates. See [DashboardSummaryDiff](/integrations/graphql-api/objects/dashboard-summary-diff) for the schema. ## Usage example A very simple example to get you started is to do the following: ```graphql theme={null} subscription DashboardSummary( $auth: SubscriptionAuthInput!, $id: String!, $idempotencyKey: String!, $customInstructions: String, $summaryType: DashboardSummaryType, ) { dashboardSummary( auth: $auth, id: $id, idempotencyKey: $idempotencyKey, customInstructions: $customInstructions, summaryType: $summaryType, ) { chunk } } ``` ```bash Request theme={null} wscat -c wss://{ACCOUNT}.askwisdom.ai/graphql \ -H "Authorization: Bearer " \ -s graphql-ws \ --execute '{ "type": "start", "payload": { "query": "subscription DashboardSummary($auth: SubscriptionAuthInput!,$id: String!,$idempotencyKey: String!, $customInstructions: String,$summaryType: DashboardSummaryType) { dashboardSummary(auth: $auth, id: $id, idempotencyKey: $idempotencyKey, customInstructions: $customInstructions, summaryType: $summaryType) { chunk }", "variables": { "auth": { "token": "" }, "id": "dash_1234", "idempotencyKey": "abc", "customInstructions": "User guidelines: ....", } } }' ``` ```json Response theme={null} { "data": { "dashboardSummary": [ { "chunk": "The summary of", } ] } } ``` ## Related operation Learn about dashboard summary diff # Subscribe Conversation Source: https://docs.wisdom.ai/integrations/graphql-api/subscriptions/subscribe-conversation The `subscribeConversation` subscription allows you to listen for real-time updates to a conversation, including new messages and response streams, via a WebSocket-based subscription model. ## Signature ```graphql theme={null} subscribeConversation( auth: SubscriptionAuthInput! conversationId: String! ): [ConversationUpdateOneOf!]! ``` ## Arguments Authentication credentials for the subscription. See [SubscriptionAuthInput](/integrations/graphql-api/objects/subscription-auth-input). The unique identifier of the conversation to subscribe to. ## Response Returns an array of `ConversationUpdateOneOf` objects representing conversation updates. See [ConversationUpdateOneOf](/integrations/graphql-api/objects/conversation-update-one-of) for the schema. ## Usage example A very simple example to get you started is to do the following: ```graphql theme={null} subscription SubscribeConversation( $auth: SubscriptionAuthInput! $conversationId: String! ) { subscribeConversation( auth: $auth conversationId: $conversationId ) { assistantMessageSent { id body { ops { insert { text visualization { id title type highchartsOptions } } } } sender createdAt } assistantResponseDiff { bodyDiff { ops { insert { text } visualization { id title type highchartsOptions } } } sender inProgress } assistantResponseCancelled } } ``` ```bash Request theme={null} wscat -c wss://{ACCOUNT}.askwisdom.ai/graphql \ -H "Authorization: Bearer " \ -s graphql-ws \ --execute '{ "type": "start", "payload": { "query": "subscription SubscribeConversation($auth: SubscriptionAuthInput!, $conversationId: String!) { subscribeConversation(auth: $auth, conversationId: $conversationId) { assistantMessageSent { id body { ops { insert { text } } } sender createdAt } assistantResponseDiff { bodyDiff { ops { insert { text } } } sender inProgress } assistantResponseCancelled } }", "variables": { "auth": { "token": "" }, "conversationId": "conv_123456789" } } }' ``` ```json Response theme={null} { "data": { "subscribeConversation": [ { "assistantMessageSent": { "id": "msg_987654321", "body": { "ops": [ { "insert": { "text": "Here's the analysis you requested:" } } ] }, "sender": "ASSISTANT", "createdAt": "2024-01-15T10:30:00Z" }, "assistantResponseDiff": null, "assistantResponseCancelled": null } ] } } ``` ## Related operation Learn about conversation update types # MCP Server Source: https://docs.wisdom.ai/integrations/mcp-server/MCP-Server WisdomAI provides a hosted [Model Context Protocol (MCP)](https://modelcontextprotocol.io) server that lets you connect AI tools, such as Claude, Cursor, VS Code, and ChatGPT, directly to your WisdomAI domains. Once connected, you can ask natural language questions about your data and receive structured responses including text, tables, and interactive charts. ## MCP Endpoint The WisdomAI MCP Server is available at a single endpoint: ```text theme={null} https://{ACCOUNT}.wisdom.ai/mcp ``` Replace `{ACCOUNT}` with your WisdomAI account subdomain. The MCP endpoint must match the domain you use to log in. * If you log in via `{account}.wisdom.ai`, use `https://{ACCOUNT}.wisdom.ai/mcp` * If you log in via `{account}.askwisdom.ai`, use `https://{ACCOUNT}.askwisdom.ai/mcp` ## Connect Wisdom's MCP server to your client Add the WisdomAI MCP Server to your preferred AI client using the configuration below. Run this command in your terminal: ```bash theme={null} claude mcp add --transport http wisdomai https://{ACCOUNT}.wisdom.ai/mcp ``` Then authenticate by running `/mcp` in Claude Code and following the OAuth flow. Add the following to your `~/.cursor/mcp.json` file: ```json theme={null} { "mcpServers": { "wisdomai": { "url": "https://{ACCOUNT}.wisdom.ai/mcp" } } } ``` Add the following to your VS Code MCP settings (`.vscode/mcp.json`): ```json theme={null} { "servers": { "wisdomai": { "type": "http", "url": "https://{ACCOUNT}.wisdom.ai/mcp" } } } ``` For any MCP-compatible client, use the following configuration: | Transport | URL | | :-------------------------------- | :-------------------------------- | | **Streamable HTTP** (recommended) | `https://{ACCOUNT}.wisdom.ai/mcp` | Most clients accept a JSON configuration in this format: ```json theme={null} { "mcpServers": { "wisdomai": { "url": "https://{ACCOUNT}.wisdom.ai/mcp" } } } ``` If your client does not support remote HTTP connections directly, use the `mcp-remote` proxy: ```json theme={null} { "mcpServers": { "wisdomai": { "command": "npx", "args": ["-y", "mcp-remote", "https://{ACCOUNT}.wisdom.ai/mcp"] } } } ``` Replace `{ACCOUNT}` with your WisdomAI account url above. ## Authentication When you first connect, your client will prompt you to: 1. Log in with your WisdomAI account. 2. Accept the OAuth authorization. 3. Grant access to the necessary permissions. The server implements **OAuth 2.1** with **Dynamic Client Registration (DCR)** and **Proof Key for Code Exchange (PKCE)**, following the [MCP Authorization specification](https://modelcontextprotocol.io/specification/2025-06-18/basic/authorization). This means: * **No manual setup required**: clients register automatically. * **Secure token binding**: tokens are scoped to your MCP session. * **Session continuity**: each session maintains its own context and can handle multiple requests with the same token. The server exposes standard OAuth discovery endpoints for clients that need them: * **Protected Resource Metadata**: `/.well-known/oauth-protected-resource` * **Authorization Server Metadata**: `/.well-known/oauth-authorization-server` The authorization server metadata endpoint returns the locations of additional endpoints, including: * **DCR**: `/register` (obtained from `registration_endpoint`) * **Authorization Endpoint**: `/authorize` (obtained from `authorization_endpoint`) * **Token Endpoint**: `/token` (obtained from `token_endpoint`) MCP clients should query the `/.well-known/oauth-authorization-server` endpoint to discover the actual URLs rather than assuming fixed paths. ## Available tools Once connected, the following tools are available: | Tool | Description | | :-------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------ | | [**chat**](/integrations/mcp-server/tools/chat) | Ask natural-language questions about your data domains. Returns text, tables, and chart visualizations. | | [**list-domains**](/integrations/mcp-server/tools/list-domains) | Discover available domains and their IDs before making queries. | | [**echo**](/integrations/mcp-server/tools/echo) | Test connectivity and verify the request/response flow is working. | ## Example prompts Once connected, try these prompts to start using WisdomAI from your AI client: * `What domains are available in WisdomAI?` * `Show me total revenue by region as a table` * `What are the top 5 products by sales this quarter?` * `Visualize monthly active users over the last 12 months` * `What can I ask about the Sales domain?` ## Test with the Inspector You can test the WisdomAI MCP Server using the [MCP Inspector](https://modelcontextprotocol.io/docs/tools/inspector): 1. Install and launch the MCP Inspector: ```bash theme={null} npx @modelcontextprotocol/inspector ``` 2. In the Inspector, enter your MCP server URL: ```text theme={null} https://{ACCOUNT}.wisdom.ai/mcp ``` 3. Click **Connect**. The Inspector will automatically handle the OAuth authorization flow. 4. Once connected, click **List Tools** to see the available tools. 5. Select a tool (for example, **list-domains**) and click **Call** to test it. The Inspector provides an interactive interface to test tool calls, inspect responses, and debug authentication. ## Troubleshooting | Issue | Resolution | | :------------------------- | :-------------------------------------------------------------------------------------------------------------------------------- | | OAuth authentication fails | Ensure your client supports OAuth. Try reauthenticating using your client's MCP management flow. | | Tools not appearing | Verify that authentication completed successfully and that you have access to at least one WisdomAI domain. | | Connection timeout | Check that the server URL is correct (`https://{ACCOUNT}.wisdom.ai/mcp`) and that your network allows outbound HTTPS connections. | | Empty responses from chat | Make sure you are providing a valid `domainId`. Use the **list-domains** tool first to find available domain IDs. | ## Next steps Sign in to OAuth-secured MCP server connections an admin has added. Create personal bearer tokens for programmatic access. For any queries or support, contact our team at [**support@askwisdom.ai**](mailto:support@askwisdom.ai). # Chat Tool Source: https://docs.wisdom.ai/integrations/mcp-server/tools/chat The `chat` tool is the primary interface for interacting with WisdomAI's powerful data analysis capabilities. It accepts natural language questions and returns structured responses including text explanations, data tables, and interactive visualizations. ## Tool signature ```json theme={null} { "name": "chat", "description": "Ask WisdomAI a question", "inputSchema": { "message": "string", "domainId": "string", "streaming": "boolean (optional, default: false)", "conversationId": "string (optional)" }, "outputSchema": { "content": "Array" } } ``` ## Parameters The query to ask to WisdomAI The unique identifier of the domain you wish to query. Whether to enable streaming responses via [MCP notifications](https://modelcontextprotocol.io/docs/concepts/transports#notifications). When enabled, partial results are sent progressively via notifications. Streaming support is currently in beta and the implementation may change in future versions. UUID for conversation continuity. Provide an existing conversation ID to continue a chat thread, or leave empty to start a new conversation. Providing an invalid conversation ID is equivalent to leaving it empty. ## Response format The chat tool returns structured content in the following format: ```typescript theme={null} { structuredContent: { content: Array; }; _meta: { conversationId: string; streamed: boolean; totalUpdates?: number; // Only present for streaming responses }; } ``` ## Content types Plain text responses and explanations ```typescript theme={null} { type: "text"; text: string; } ``` Tabular data with column headers and structured rows ```typescript theme={null} { type: "table"; title: string; columns: string[]; data: string[][]; } ``` Interactive visualizations with Highcharts configuration ```typescript theme={null} { type: "chart"; chart_type: string; title: string; highChartsOptions: string; // JSON string url: string; // Image URL for static rendering } ``` `highchartsOptions` also contain the actual data and can be sent as it is to the [highcharts](https://www.highcharts.com/) library/server to generate a visualization. Image URL is valid for 1 hour from the time of generation. ## Streaming support (Beta) When streaming is enabled, the server sends progressive updates via [MCP notifications](https://modelcontextprotocol.io/docs/concepts/transports#notifications) as content is generated. ### Notification format Streaming updates are sent using the `chat/update` notification method: ```json theme={null} { "jsonrpc": "2.0", "method": "chat/update", "params": { "conversationId": "string", "updateNumber": "number", "isPartial": "boolean", "content": "Array" } } ``` ### Update frequency The server throttles streaming updates to a maximum frequency of **once per second**. ### Notification parameters The conversation ID associated with the query Sequential number indicating the order of this update (starts at 1) Whether this is still a partial update (`true`) or the final result (`false`) The current state of the response content, **including all previous and new content items** ## Usage example ### Request ```json MCP Tool Call theme={null} { "jsonrpc": "2.0", "method": "tools/call", "params": { "name": "chat", "arguments": { "message": "show aws usage by service as table", "domainId": "ET_DOMAIN_id-here", "streaming": false } }, "id": 1 } ``` ### Response ```json Response theme={null} { "jsonrpc": "2.0", "result": { "_meta": { "conversationId": "b46e69a9-97bf-4dde-9cfe-96fe48719c07", "streamed": false }, "structuredContent": { "content": [ { "type": "table", "title": "AWS Usage by Service Table", "columns": [ "name", "total_usage" ], "data": [ [ "\"EC2\"", "3875727" ], [ "\"S3\"", "3719077" ], [ "\"RDS\"", "3581600" ], [ "\"Lambda\"", "1683598" ] ] } ] } }, "id": 1 } ``` ```json MCP Tool Call with Streaming theme={null} { "jsonrpc": "2.0", "method": "tools/call", "params": { "name": "chat", "arguments": { "message": "what can I ask", "domainId": "ET_DOMAIN_id-here", "streaming": true } }, "id": 2 } ``` ```json Progressive Notifications and Final Response theme={null} // Notification 1 (partial) { "jsonrpc": "2.0", "method": "chat/update", "params": { "conversationId": "f2a5aefb-7538-4044-9684-b68dd8256014", "updateNumber": 1, "content": [ { "type": "text", "text": "Here" } ], "isPartial": true } } // Notification 2 (partial) { "jsonrpc": "2.0", "method": "chat/update", "params": { "conversationId": "f2a5aefb-7538-4044-9684-b68dd8256014", "updateNumber": 3, "content": [ { "type": "text", "text": "Here are some ideas of questions you can ask to explore AWS service usage data:\n\n1. [Show total AWS service usage by region](#ask)\n2. [Which company used the most AWS resources last month?](#ask)\n3. [Visualize service usage by category (compute, storage, etc.)](#ask)\n4. [Top 5 AWS services by overall usage](#ask)\n5. [Which regions see the highest demand for S3?](#ask)\n6. [Compare usage between two companies](#ask)\n7. [What are the most popular services for machine learning?](#ask)\n8. [Which companies have stopped using AWS recently?](#ask)\n9." } ], "isPartial": true } } // Notification 3 (final notification) { "jsonrpc": "2.0", "method": "chat/update", "params": { "conversationId": "f2a5aefb-7538-4044-9684-b68dd8256014", "updateNumber": 5, "content": [ { "type": "text", "text": "Here are some ideas of questions you can ask to explore AWS service usage data:\n\n1. [Show total AWS service usage by region](#ask)\n2. [Which company used the most AWS resources last month?](#ask)\n3. [Visualize service usage by category (compute, storage, etc.)](#ask)\n4. [Top 5 AWS services by overall usage](#ask)\n5. [Which regions see the highest demand for S3?](#ask)\n6. [Compare usage between two companies](#ask)\n7. [What are the most popular services for machine learning?](#ask)\n8. [Which companies have stopped using AWS recently?](#ask)\n9. [Breakdown of service usage by industry](#ask)\n10. [How does EC2 usage vary across regions?](#ask)\n\nFeel free to pick any of these or ask your own custom questions!" } ], "isPartial": false } } // Final Tool Call Response { "jsonrpc": "2.0", "result": { "structuredContent": { "content": [ { "type": "text", "text": "Here are some ideas of questions you can ask to explore AWS service usage data:\n\n1. [Show total AWS service usage by region](#ask)\n2. [Which company used the most AWS resources last month?](#ask)\n3. [Visualize service usage by category (compute, storage, etc.)](#ask)\n4. [Top 5 AWS services by overall usage](#ask)\n5. [Which regions see the highest demand for S3?](#ask)\n6. [Compare usage between two companies](#ask)\n7. [What are the most popular services for machine learning?](#ask)\n8. [Which companies have stopped using AWS recently?](#ask)\n9. [Breakdown of service usage by industry](#ask)\n10. [How does EC2 usage vary across regions?](#ask)\n\nFeel free to pick any of these or ask your own custom questions!", }, ] }, "_meta": { "conversationId": "f2a5aefb-7538-4044-9684-b68dd8256014", "streamed": true, "totalUpdates": 3 } }, "id": 2 } ``` ## Next steps Discover available domains before querying Simple tool for testing connectivity before using chat # Echo Tool Source: https://docs.wisdom.ai/integrations/mcp-server/tools/echo The `echo` tool is a simple testing utility that echoes back the input message with an "Echo: " prefix. This tool is primarily used for testing MCP server connectivity and verifying that the request/response flow is working correctly. This is a sample tool included for testing your client. ## Parameters The message to echo back. This can be any text string. ## Response format Structured version of the response with a `message` array containing the echoed text ### Content structure ```typescript theme={null} { structuredContent: { message: [ { text: string } ] } } ``` ```json MCP Tool Call theme={null} { "jsonrpc": "2.0", "method": "tools/call", "params": { "name": "echo", "arguments": { "message": "Hello, WisdomAI!" } }, "id": 1 } ``` ```json Response theme={null} { "jsonrpc": "2.0", "result": { "structuredContent": { "message": [ { "text": "Echo: Hello, WisdomAI!" } ] } }, "id": 1 } ``` ## Next steps Discover available domains for querying Primary tool for data analysis and natural language querying Return to MCP server overview # List Domains Tool Source: https://docs.wisdom.ai/integrations/mcp-server/tools/list-domains The `list-domains` tool retrieves all domains accessible to the authenticated user. This tool is essential for discovering available data domains before making queries with the chat tool. ## Tool signature ```json theme={null} { "name": "list-domains", "description": "List domains accessible to the user", "inputSchema": {}, "outputSchema": { "domains": "Array" } } ``` ## Parameters This tool requires no input parameters. Authentication is handled automatically through the MCP session. ## Response format The list-domains tool returns structured content with domain information: ```typescript theme={null} { structuredContent: { domains: Array<{ id: string; name: string; description: string; }>; }; } ``` ## Domain object Unique identifier for the domain. Use this ID when making chat tool requests. Human-readable name of the domain Description of the domain's purpose and data content. May be empty for some domains. ## Usage example ### Request ```json MCP Tool Call theme={null} { "jsonrpc": "2.0", "method": "tools/call", "params": { "name": "list-domains" }, "id": 1 } ``` ### Response ```json Response theme={null} { "jsonrpc": "2.0", "result": { "structuredContent": { "domains": [ { "id": "ET_DOMAIN_aws-usage", "name": "AWS Usage Analytics", "description": "AWS service usage data across regions and companies" }, { "id": "ET_DOMAIN_sales-data", "name": "Sales Performance", "description": "Sales metrics, revenue data, and customer analytics" }, { "id": "ET_DOMAIN_hr-metrics", "name": "HR Analytics", "description": "Employee data, performance metrics, and organizational insights" } ] } }, "id": 1 } ``` ## Common use cases List all available domains with their IDs before starting a chat Verify which domains the current user can access Help new users understand available data sources ## Next steps Use domain IDs from this tool to query specific domains Learn more about the MCP server architecture # RBAC for Users Source: https://docs.wisdom.ai/integrations/user-management/rbac Embedded users inherit WisdomAI's role-based access control (RBAC) system. The role you assign when provisioning a user controls what they can see and do inside the embedded interface. There is no separate embed-specific permission layer. Custom roles are not yet supported. You must use one of the built-in roles listed below. ## How roles affect embedded views Visibility of edit controls, dashboard creation buttons, and AI workstreams is determined by the user's role assignment. To **hide edit controls in an embedded dashboard**, assign the user the **Viewer** role. This role is pure read-only and cannot create or modify any resources. For a full breakdown of what each role can access, see [Roles & permission reference](#roles--permission-reference) below. ## Assigning a role at provisioning time Pass the specific `roleId` in the `roleAssignments` array when calling `createUsers`. Role IDs are unique UUIDs. ```bash theme={null} curl -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer " \ -d '{ "query": "mutation CreateUsers($input: CreateUsersInput!) { createUsers(input: $input) { status { code message } } }", "variables": { "input": { "emails": ["alice@yourcompany.com"], "workspaceID": "workspace_123", "roleAssignments": [ { "roleId": "00000000-0000-0000-0000-000000000003", "scopes": ["domain_456"] } ] } } }' \ https://{ACCOUNT}.wisdom.ai/graphql ``` ## Role IDs Role IDs are passed in the `roleAssignments` field when provisioning or updating users. | Role | ID | | ---------------- | -------------------------------------- | | `ADMIN` | `00000000-0000-0000-0000-000000000001` | | `DATA_ADMIN` | `00000000-0000-0000-0000-000000000004` | | `EXPLORER` | `00000000-0000-0000-0000-000000000002` | | `BASIC_EXPLORER` | `00000000-0000-0000-0000-000000000015` | | `VIEWER` | `00000000-0000-0000-0000-000000000003` | | `OBSERVER` | `00000000-0000-0000-0000-000000000007` | Role IDs are used in the `roleAssignments` field of the following mutations: * [`createUsers`](/integrations/graphql-api/mutations/user/create-users) — assign a role when provisioning a new embedded user * [`setUserAttributes`](/integrations/graphql-api/mutations/user/set-user-attributes) — update the role of an existing embedded user * [`addScopeRoleAssignmentsForSharing`](/integrations/graphql-api/mutations/dashboard/add-scope-role-assignments-for-sharing) — grant a scoped role on a specific dashboard * [`removeScopeRoleAssignmentsForSharing`](/integrations/graphql-api/mutations/dashboard/remove-scope-role-assignments-for-sharing) — remove a scoped role from a specific dashboard ## Roles & permission reference The tables below show the full permission breakdown across all roles and resource types. Use these as a reference when deciding which role to assign for a given use case. For a description of what each role can do, see [Access Management](/manage-account/access-management). In the API, **Story** refers to **Dashboards**. Roles labeled **Writer** grant edit access to existing resources but do not grant permission to create new ones. | Permission | AD | DA | EX | BE | VI | OB | | ------------------------ | :-: | :-: | :-: | :-: | :-: | :-: | | `chat:create` | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | | `chat:execute-sql` | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | | `chat:edit-sql` | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | | `chat:expand-workstream` | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | | `chat:read-all` | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | | Permission | AD | DA | EX | BE | VI | OB | | ------------------ | :-: | :-: | :-: | :-: | :-: | :-: | | `dashboard:create` | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | | `dashboard:clone` | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | | `dashboard:read` | ✅ | ✅ | ❌ | ❌ | ✅ | ❌ | | `dashboard:write` | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | Users can always view, edit, and clone dashboards they created themselves or that have been shared with them. | Permission | AD | DA | EX | BE | VI | OB | | ----------------- | :-: | :-: | :-: | :-: | :-: | :-: | | `schedule:create` | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | | `schedule:read` | ✅ | ✅ | ❌ | ❌ | ✅ | ❌ | | `schedule:write` | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | Users can always view and edit schedules they created themselves or that have been shared with them. | Permission | AD | DA | EX | BE | VI | OB | | ------------- | :-: | :-: | :-: | :-: | :-: | :-: | | `agent:read` | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | | `agent:write` | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | Users can always view and edit agents they created themselves or that have been shared with them. | Permission | AD | DA | EX | BE | VI | OB | | -------------------- | :-: | :-: | :-: | :-: | :-: | :-: | | `connection:create` | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | | `connection:read` | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | | `connection:write` | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | | `connection:delete` | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | | `connection:refresh` | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | | `connection:list` | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | | Permission | AD | DA | EX | BE | VI | OB | | --------------- | :-: | :-: | :-: | :-: | :-: | :-: | | `domain:create` | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | | `domain:list` | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | | `domain:invite` | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | | Permission | AD | DA | EX | BE | VI | OB | | ----------------- | :-: | :-: | :-: | :-: | :-: | :-: | | `iam:read` | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | `iam:write` | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | | `iam:delete` | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | | `iam-scope:write` | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | | Permission | AD | DA | EX | BE | VI | OB | | ------------------ | :-: | :-: | :-: | :-: | :-: | :-: | | `workspace:read` | ✅ | ❌ | ❌ | ❌ | ✅ | ✅ | | `workspace:write` | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | | `workspace:create` | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | | `workspace:delete` | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | The table below describes what each API permission flag controls. | API permission | Feature | | ------------------------ | ----------------------------- | | `chat:create` | Ask questions | | `chat:execute-sql` | Run SQL | | `chat:edit-sql` | Edit SQL | | `chat:expand-workstream` | AI workstream | | `chat:read-all` | View chat log | | `dashboard:create` | Create dashboards | | `dashboard:read` | View dashboards | | `dashboard:write` | Edit dashboards | | `dashboard:clone` | Clone dashboards | | `schedule:create` | Create schedules | | `schedule:read` | View schedules | | `schedule:write` | Edit schedules | | `agent:read` | View agents | | `agent:write` | Edit agents | | `connection:create` | Create connections | | `connection:read` | View connections | | `connection:write` | Edit connection configuration | | `connection:delete` | Delete connections | | `connection:refresh` | Refresh metadata | | `connection:list` | List connections | | `domain:create` | Create domains | | `domain:list` | List domains | | `domain:invite` | Invite users to a domain | | `iam:read` | View users and roles | | `iam:write` | Manage users and roles | | `iam:delete` | Remove users and roles | | `iam-scope:write` | Assign scoped roles | | `workspace:read` | View workspace | | `workspace:write` | Edit workspace | ## Related articles Provision embedded users with role assignments Use roles to control edit access in embedded dashboards # User Attributes Source: https://docs.wisdom.ai/integrations/user-management/user-attributes User attributes are key-value pairs attached to a user that control how WisdomAI filters and personalizes data for their session. They are used for: * **Parameterized connections**: matching a user's attributes against `credentialMappings.attributeMatch` to resolve the right data source credentials. * **Row-level authorization**: referencing attributes in filter rules to restrict which rows a user can see. * **Personalized data access**: passing session-specific context (e.g., a selected account or region) at impersonation time. ## Attribute sources Every attribute has a `source` field that indicates where it came from. | Source | Set by | Mutable via API | Description | | ---------- | ---------------------------------------- | :-------------: | ------------------------------------------------ | | `DATABASE` | API (`createUsers`, `setUserAttributes`) | Yes | Persistent attributes stored against the user | | `JWT` | SSO identity provider (SAML/OIDC claims) | No | Read-only attributes from the user's login token | When the same key exists in both sources, the `DATABASE` value takes precedence — unless a transient (session-specific) attribute is passed at impersonation time, which overrides both for that session only. ## Setting attributes Attributes can be set at three points in a user's lifecycle: when the user is first provisioned, updated later via API, or passed at impersonation time for session-specific context. ### At creation time Pass `userAttributes` in `CreateUsersInput` when provisioning the user. This is the most efficient option when you know the attributes upfront: ```bash theme={null} curl -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer " \ -d '{ "query": "mutation CreateUsers($input: CreateUsersInput!) { createUsers(input: $input) { status { code message } } }", "variables": { "input": { "emails": ["alice@yourcompany.com"], "workspaceID": "workspace_123", "roleAssignments": [{ "roleId": "00000000-0000-0000-0000-000000000003", "scopes": ["{{DOMAIN_ID}}"] }], "sendWelcomeEmail": true, "userAttributes": [ { "key": "account_id", "value": "acct_456" }, { "key": "region", "value": "us-east" } ] } } }' \ https://{ACCOUNT}.wisdom.ai/graphql ``` Replace `{ACCOUNT}.wisdom.ai` with the base URL of your WisdomAI tenant — the same domain you use to log in. Both `wisdom.ai` and `askwisdom.ai` are valid depending on your deployment. ### Updating later Call `setUserAttributes` to replace the user's DATABASE-sourced attributes after they've been created: ```bash theme={null} curl -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer " \ -d '{ "query": "mutation SetUserAttributes($input: SetUserAttributesInput!) { setUserAttributes(input: $input) { status { code message } } }", "variables": { "input": { "userId": "user_abc123", "userAttributes": [ { "key": "account_id", "value": "acct_456" }, { "key": "region", "value": "us-west" } ] } } }' \ https://{ACCOUNT}.wisdom.ai/graphql ``` `setUserAttributes` **replaces all DATABASE-sourced attributes**. Include every attribute the user should have after the call — omitting an attribute removes it. ### At impersonation time (transient) Pass `attributes` in `impersonateUser` for session-only overrides. These are applied for the duration of the JWT only and are never persisted: ```bash theme={null} curl -X POST \ -H "Content-Type: application/json" \ -d '{ "query": "mutation ImpersonateUser($accessToken: String!, $userEmail: String!, $attributes: [UserAttributeInput!]) { impersonateUser(accessToken: $accessToken, userEmail: $userEmail, attributes: $attributes) }", "variables": { "accessToken": "", "userEmail": "alice@yourcompany.com", "attributes": [ { "key": "report_context", "value": "q3-summary" } ] } }' \ https://{ACCOUNT}.wisdom.ai/graphql ``` Transient attributes override DATABASE-sourced values for that session. They are useful for passing request-scoped context that should not be stored on the user. ## Choosing the right approach | Use case | Recommended approach | | ------------------------------------------------------------- | -------------------------------------------------------------------- | | Attributes that are stable for the user (e.g., `account_id`) | Set at creation via `createUsers`, or update via `setUserAttributes` | | Attributes that change per request or should not be persisted | Pass as Transient (Session) attributes in `impersonateUser` | | Attributes sourced from SSO claims | Read automatically from the JWT — no action needed | ## Related articles Set attributes at provisioning time Update DATABASE-sourced attributes on existing users Pass transient attributes at session time Inspect a user's current attributes and their source # User Lifecycle Source: https://docs.wisdom.ai/integrations/user-management/user-lifecycle This guide walks through the full workflow for creating and managing users via the WisdomAI GraphQL API. User attributes are key-value pairs attached to a user that drive parameterized connection resolution, row-level authorization, and personalized data access. **Workflow in short:** 1. Create one or more users with role assignments and (optionally) attributes 2. Update attributes on existing users as needed 3. Query users to look up IDs or verify attribute state 4. Remove users when offboarding 5. Impersonate a user to start an embedded session ## Prerequisites * **GraphQL endpoint:** `https://{ACCOUNT}.wisdom.ai/graphql` * **Access token:** A valid bearer token with `iam:write` permission — contact `support@askwisdom.ai` to obtain one * **Workspace ID** (optional): Required only for multi-workspace deployments Replace `{ACCOUNT}.wisdom.ai` with the base URL of your WisdomAI tenant — the same domain you use to log in. Both `wisdom.ai` and `askwisdom.ai` are valid depending on your deployment. ## Step 1: Create users Use [`createUsers`](/integrations/graphql-api/mutations/user/create-users) to provision one or more users by email. You can assign roles, set initial attributes, add them to user groups, and optionally send a welcome email — all in a single call. If the user already exists, the call succeeds but **re-applies the role assignments you pass in**, overwriting any manually assigned roles. To avoid resetting roles on existing users, check [`listUsers`](/integrations/graphql-api/queries/user/list-users) first and skip `createUsers` for users already provisioned. ```bash theme={null} curl -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer " \ -d '{ "query": "mutation CreateUsers($input: CreateUsersInput!) { createUsers(input: $input) { status { code message } } }", "variables": { "input": { "emails": ["alice@yourcompany.com"], "workspaceID": "workspace_123", "roleAssignments": [{ "roleId": "00000000-0000-0000-0000-000000000003", "scopes": ["{{DOMAIN_ID}}"] }], "sendWelcomeEmail": true, "userAttributes": [ { "key": "account_id", "value": "acct_456" }, { "key": "region", "value": "us-east" } ] } } }' \ https://{ACCOUNT}.wisdom.ai/graphql ``` You can pass multiple emails in a single call. All users receive the same roles and attributes: ```bash theme={null} curl -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer " \ -d '{ "query": "mutation CreateUsers($input: CreateUsersInput!) { createUsers(input: $input) { status { code message } } }", "variables": { "input": { "emails": ["alice@yourcompany.com", "bob@yourcompany.com", "carol@yourcompany.com"], "workspaceID": "workspace_123", "roleAssignments": [{ "roleId": "00000000-0000-0000-0000-000000000003", "scopes": ["{{DOMAIN_ID}}"] }], "sendWelcomeEmail": true, "userAttributes": [ { "key": "account_id", "value": "acct_456" } ] } } }' \ https://{ACCOUNT}.wisdom.ai/graphql ``` **Email uniqueness:** User matching is email-based. If your embedded users may share email addresses across tenants, append a unique identifier to the email prefix — for example, `alice+tenant123@yourcompany.com`. This prevents cross-tenant session collisions. For the full input schema, see [Create Users](/integrations/graphql-api/mutations/user/create-users). ## Step 2: Update user attributes Use [`setUserAttributes`](/integrations/graphql-api/mutations/user/set-user-attributes) to replace the DATABASE-sourced attributes on an existing user at any time. `setUserAttributes` **replaces all DATABASE-sourced attributes**. Always include the full desired set — omitting an attribute removes it. JWT-sourced attributes (from SSO claims) are not affected. ```bash theme={null} curl -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer " \ -d '{ "query": "mutation SetUserAttributes($input: SetUserAttributesInput!) { setUserAttributes(input: $input) { status { code message } } }", "variables": { "input": { "userId": "user_abc123", "userAttributes": [ { "key": "account_id", "value": "acct_456" }, { "key": "region", "value": "eu-west" }, { "key": "property_ids", "value": "prop_1,prop_2,prop_3" } ] } } }' \ https://{ACCOUNT}.wisdom.ai/graphql ``` ## Step 3: Query users and their attributes Use [`listUsers`](/integrations/graphql-api/queries/user/list-users) to look up user IDs or verify current attribute state. ```bash theme={null} curl -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer " \ -d '{ "query": "query ListUsers($workspaceId: ID) { listUsers(workspaceId: $workspaceId) { id email name userAttributes { key value source } roleAssignments { role scopeId } } }", "variables": { "workspaceId": "workspace_123" } }' \ https://{ACCOUNT}.wisdom.ai/graphql ``` Each attribute includes a `source` field: | Source | Set by | Mutable via API | | ---------- | ---------------------------------------- | :-------------: | | `DATABASE` | `createUsers`, `setUserAttributes` | Yes | | `JWT` | SSO identity provider (SAML/OIDC claims) | No | ## Step 4: Delete users from a workspace Use [`deleteUsersFromWorkspace`](/integrations/graphql-api/mutations/user/delete-users-from-workspace) to remove one or more users from a workspace. This action is **irreversible**. Deleted users lose all role assignments, attributes, and access to the workspace. Verify the correct user IDs before calling this mutation. ```bash theme={null} curl -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer " \ -d '{ "query": "mutation DeleteUsersFromWorkspace($input: DeleteUsersFromWorkspaceInput!) { deleteUsersFromWorkspace(input: $input) { status { code message } } }", "variables": { "input": { "ids": ["user_abc123", "user_def456"], "workspaceID": "workspace_123" } } }' \ https://{ACCOUNT}.askwisdom.ai/graphql ``` ## Step 5: Impersonate a user to start an embedded session Use [`impersonateUser`](/integrations/graphql-api/mutations/auth/impersonate-user) to generate a short-lived JWT for a user. Pass this JWT as the `token` query parameter in your iframe embed URL. This mutation is public and unauthenticated — no `Authorization` header is required. The access key is passed directly as an argument and must only be called from your server. ```bash theme={null} curl -X POST \ -H "Content-Type: application/json" \ -d '{ "query": "mutation ImpersonateUser($accessToken: String!, $userEmail: String!) { impersonateUser(accessToken: $accessToken, userEmail: $userEmail) }", "variables": { "accessToken": "", "userEmail": "alice@yourcompany.com" } }' \ https://{ACCOUNT}.wisdom.ai/graphql ``` To pass session-only attributes (transient overrides that are not persisted): ```bash theme={null} curl -X POST \ -H "Content-Type: application/json" \ -d '{ "query": "mutation ImpersonateUser($accessToken: String!, $userEmail: String!, $attributes: [UserAttributeInput!]) { impersonateUser(accessToken: $accessToken, userEmail: $userEmail, attributes: $attributes) }", "variables": { "accessToken": "", "userEmail": "alice@yourcompany.com", "attributes": [ { "key": "report_id", "value": "q3-sales-summary" } ] } }' \ https://{ACCOUNT}.wisdom.ai/graphql ``` The response is a raw JWT string: ```json theme={null} { "data": { "impersonateUser": "eyJhbGciOiJSUzI1NiIsInR5..." } } ``` The token expires after **1 hour**. Use it in your iframe `src`: ```html theme={null}