Skip to main content
Technical Preview

Overview

A client-mode connector for the Tableau REST API on Tableau Server and Tableau Cloud. Use it to refresh a dashboard’s extract as soon as a shift, batch or line event lands on the broker, instead of waiting for the next schedule, and to pull summarized view data (OEE, scrap, downtime by line) back into MQTT as CSV. Set BASE_ADDRESS to your Tableau host with no trailing slash and no /api. On Tableau Cloud the host must include the pod, for example https://prod-useast-a.online.tableau.com or https://10ax.online.tableau.com (copy it from the browser address bar). Topics use analytics/tableau/<object>/<verb>; replies land on <topic>/response. See the base guide: REST API Connectors.
Auth: sign in once with a personal access token (PAT), then send X-Tableau-Auth: {value.json.auth_token} on every other call together with site_id, the site LUID from the sign-in response (not the site name or contentUrl). A session lasts 240 minutes on Tableau Server (default) and 120 minutes on Tableau Cloud. Keep the PAT in Hub secrets (suggested names TABLEAU_PAT_NAME and TABLEAU_PAT_SECRET, and TABLEAU_AUTH_TOKEN for the current session token). Never commit them into the .lot. Signing in again with the same PAT ends that PAT’s earlier session, so give each broker or connector its own PAT.
API version. Every endpoint uses /api/3.24. That works on Tableau Cloud and on Tableau Server 2025.1 or later. For Tableau Server 2024.2 change 3.24 to 3.23 (2023.3 uses 3.21). ServerInfo returns the highest version your server supports.

Basic Syntax

MQTT examples

SignIn (analytics/tableau/auth/signin). The whole payload becomes the request body. Expect 200:
Response:
On Tableau Server, "contentUrl": "" signs in to the Default site. Tableau Cloud always needs the site’s contentUrl. RunExtractRefreshTask (analytics/tableau/tasks/extract-refreshes/run), expect 200 with a job:
Get task_id from ListExtractRefreshTasks (analytics/tableau/tasks/extract-refreshes/list, payload {"auth_token": "...", "site_id": "..."}). A second request while the refresh is still queued returns 409 (409093). RefreshDataSource (analytics/tableau/datasources/refresh) and RefreshWorkbook (analytics/tableau/workbooks/refresh) refresh an extract without a schedule. Expect 202 with a job:
GetJob (analytics/tableau/jobs/get): {"auth_token": "<token>", "site_id": "<site LUID>", "job_id": "7b6b59a8-ac3c-4d1d-2e9e-0b5b4ba8a7b6"}. Poll until completedAt is set, then check finishCode. Only site and server administrators can query jobs. GetViewData (analytics/tableau/views/data/get), expect 200 text/csv:
GetViewDataFiltered (analytics/tableau/views/data/filter) adds one view filter, vf_<filter_field>=<filter_value>. URL-encode both values (a field called Plant Line becomes Plant%20Line):
ListWorkbooks, ListViews and ListDataSources (analytics/tableau/workbooks/list, .../views/list, .../datasources/list): {"auth_token": "<token>", "site_id": "<site LUID>", "page_size": "100", "page_number": "1"}. page_size is 1 to 1000. ServerInfo (analytics/tableau/server/info): any payload, for example {}. SignOut (analytics/tableau/auth/signout): {"auth_token": "<token>"}, expect 204 with an empty body. Control fields (auth_token, site_id, ids, paging) only fill the URL and headers. Only body (and the full payload for SignIn) is sent as the request body.

Keeping the session

Each request needs the token and site LUID from the latest sign-in. A small action can store them when the sign-in reply arrives:
Sign in again before the session expires (for example every 100 minutes on Tableau Cloud), or when a call returns 401 with code 401002. Restrict who can read the analytics/tableau/# topics with a rule, because sign-in payloads carry the PAT secret and replies carry the session token.

Webhooks (companion, not packaged)

Tableau webhooks can POST to an HTTPS URL when, for example, a data source refresh succeeds or fails (DatasourceRefreshSucceeded, DatasourceRefreshFailed, WorkbookRefreshFailed). Receiving them needs a separate ENABLE_SERVER REST API connector on a publicly reachable HTTPS address. That companion connector is not part of this template. Writing .hyper extract files uses the Hyper API client library, not REST, so it is not covered either.

Notes

  • View data is summary-level, and a dashboard returns only its first sheet. Data is cached for 60 minutes by default. Lower max_age (minimum 1) when you need fresher numbers.
  • PATs expire after 15 days without use (and at the site’s maximum PAT lifetime). Sign in at least that often or rotate the PAT.
  • Tableau Cloud allows 20 concurrent long-running requests (view data, exports). Above that it returns 429; retry later.
  • Non-admin users can run refresh tasks and refresh data sources or workbooks they own. Querying jobs needs a site or server administrator. RunNow fails if an administrator has disabled it for the site.
  • Before API 3.28, RefreshDataSource always runs a full refresh. Incremental refresh bodies need /api/3.28.
  • Without Accept: application/json, Tableau answers in XML. The template sets JSON for every call except view data, which is CSV.
  • Not covered: publishing workbooks or data sources (multipart uploads), view image, PDF and crosstab exports, the Metadata API (GraphQL), and connected-app JWT or unified access token sign-in. JWT sign-in works through the same SignIn event with a different credentials body.
  • Suggested branches: feat/rest-api-route-tableau, feat/docs-rest-api-tableau (Hugo pushes).
Last modified on October 21, 2026