curl --request PATCH \
--url https://api.select.dev/v2/tableau-connections/{tableau_connection_id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'x-tenant-id: <x-tenant-id>' \
--data '
{
"name": "<string>",
"server_url": "<string>",
"site_name": "<string>",
"credentials": {
"personal_access_token_name": "<string>",
"personal_access_token_secret": "<string>"
},
"sync_enabled": true,
"query_sanitization_enabled": true
}
'import requests
url = "https://api.select.dev/v2/tableau-connections/{tableau_connection_id}"
payload = {
"name": "<string>",
"server_url": "<string>",
"site_name": "<string>",
"credentials": {
"personal_access_token_name": "<string>",
"personal_access_token_secret": "<string>"
},
"sync_enabled": True,
"query_sanitization_enabled": True
}
headers = {
"x-tenant-id": "<x-tenant-id>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {
'x-tenant-id': '<x-tenant-id>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
name: '<string>',
server_url: '<string>',
site_name: '<string>',
credentials: {
personal_access_token_name: '<string>',
personal_access_token_secret: '<string>'
},
sync_enabled: true,
query_sanitization_enabled: true
})
};
fetch('https://api.select.dev/v2/tableau-connections/{tableau_connection_id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.select.dev/v2/tableau-connections/{tableau_connection_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'name' => '<string>',
'server_url' => '<string>',
'site_name' => '<string>',
'credentials' => [
'personal_access_token_name' => '<string>',
'personal_access_token_secret' => '<string>'
],
'sync_enabled' => true,
'query_sanitization_enabled' => true
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"x-tenant-id: <x-tenant-id>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.select.dev/v2/tableau-connections/{tableau_connection_id}"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"server_url\": \"<string>\",\n \"site_name\": \"<string>\",\n \"credentials\": {\n \"personal_access_token_name\": \"<string>\",\n \"personal_access_token_secret\": \"<string>\"\n },\n \"sync_enabled\": true,\n \"query_sanitization_enabled\": true\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("x-tenant-id", "<x-tenant-id>")
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.patch("https://api.select.dev/v2/tableau-connections/{tableau_connection_id}")
.header("x-tenant-id", "<x-tenant-id>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"server_url\": \"<string>\",\n \"site_name\": \"<string>\",\n \"credentials\": {\n \"personal_access_token_name\": \"<string>\",\n \"personal_access_token_secret\": \"<string>\"\n },\n \"sync_enabled\": true,\n \"query_sanitization_enabled\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.select.dev/v2/tableau-connections/{tableau_connection_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["x-tenant-id"] = '<x-tenant-id>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"server_url\": \"<string>\",\n \"site_name\": \"<string>\",\n \"credentials\": {\n \"personal_access_token_name\": \"<string>\",\n \"personal_access_token_secret\": \"<string>\"\n },\n \"sync_enabled\": true,\n \"query_sanitization_enabled\": true\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"etag": "<string>",
"name": "<string>",
"connection_id": "<string>",
"server_url": "<string>",
"site_name": "<string>",
"site_luid": "<string>",
"sync_enabled": true,
"query_sanitization_enabled": true,
"create_time": "<string>",
"update_time": "<string>",
"added_by_email": "<string>",
"last_successful_sync_time": "<string>"
}{
"title": "<string>",
"status": 123,
"detail": "<string>",
"code": "<string>",
"retryable": true,
"type": "about:blank",
"details": [
{}
]
}{
"title": "<string>",
"status": 123,
"detail": "<string>",
"code": "<string>",
"retryable": true,
"type": "about:blank",
"details": [
{}
]
}{
"title": "<string>",
"status": 123,
"detail": "<string>",
"code": "<string>",
"retryable": true,
"type": "about:blank",
"details": [
{}
]
}{
"title": "<string>",
"status": 123,
"detail": "<string>",
"code": "<string>",
"retryable": true,
"type": "about:blank",
"details": [
{}
]
}{
"title": "<string>",
"status": 123,
"detail": "<string>",
"code": "<string>",
"retryable": true,
"type": "about:blank",
"details": [
{}
]
}{
"title": "<string>",
"status": 123,
"detail": "<string>",
"code": "<string>",
"retryable": true,
"type": "about:blank",
"details": [
{}
]
}{
"title": "<string>",
"status": 123,
"detail": "<string>",
"code": "<string>",
"retryable": true,
"type": "about:blank",
"details": [
{}
]
}{
"title": "<string>",
"status": 123,
"detail": "<string>",
"code": "<string>",
"retryable": true,
"type": "about:blank",
"details": [
{}
]
}{
"title": "<string>",
"status": 123,
"detail": "<string>",
"code": "<string>",
"retryable": true,
"type": "about:blank",
"details": [
{}
]
}{
"title": "<string>",
"status": 123,
"detail": "<string>",
"code": "<string>",
"retryable": true,
"type": "about:blank",
"details": [
{}
]
}{
"title": "<string>",
"status": 123,
"detail": "<string>",
"code": "<string>",
"retryable": true,
"type": "about:blank",
"details": [
{}
]
}{
"title": "<string>",
"status": 123,
"detail": "<string>",
"code": "<string>",
"retryable": true,
"type": "about:blank",
"details": [
{}
]
}{
"title": "<string>",
"status": 123,
"detail": "<string>",
"code": "<string>",
"retryable": true,
"type": "about:blank",
"details": [
{}
]
}Update a Tableau connection
curl --request PATCH \
--url https://api.select.dev/v2/tableau-connections/{tableau_connection_id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'x-tenant-id: <x-tenant-id>' \
--data '
{
"name": "<string>",
"server_url": "<string>",
"site_name": "<string>",
"credentials": {
"personal_access_token_name": "<string>",
"personal_access_token_secret": "<string>"
},
"sync_enabled": true,
"query_sanitization_enabled": true
}
'import requests
url = "https://api.select.dev/v2/tableau-connections/{tableau_connection_id}"
payload = {
"name": "<string>",
"server_url": "<string>",
"site_name": "<string>",
"credentials": {
"personal_access_token_name": "<string>",
"personal_access_token_secret": "<string>"
},
"sync_enabled": True,
"query_sanitization_enabled": True
}
headers = {
"x-tenant-id": "<x-tenant-id>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {
'x-tenant-id': '<x-tenant-id>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
name: '<string>',
server_url: '<string>',
site_name: '<string>',
credentials: {
personal_access_token_name: '<string>',
personal_access_token_secret: '<string>'
},
sync_enabled: true,
query_sanitization_enabled: true
})
};
fetch('https://api.select.dev/v2/tableau-connections/{tableau_connection_id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.select.dev/v2/tableau-connections/{tableau_connection_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'name' => '<string>',
'server_url' => '<string>',
'site_name' => '<string>',
'credentials' => [
'personal_access_token_name' => '<string>',
'personal_access_token_secret' => '<string>'
],
'sync_enabled' => true,
'query_sanitization_enabled' => true
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"x-tenant-id: <x-tenant-id>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.select.dev/v2/tableau-connections/{tableau_connection_id}"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"server_url\": \"<string>\",\n \"site_name\": \"<string>\",\n \"credentials\": {\n \"personal_access_token_name\": \"<string>\",\n \"personal_access_token_secret\": \"<string>\"\n },\n \"sync_enabled\": true,\n \"query_sanitization_enabled\": true\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("x-tenant-id", "<x-tenant-id>")
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.patch("https://api.select.dev/v2/tableau-connections/{tableau_connection_id}")
.header("x-tenant-id", "<x-tenant-id>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"server_url\": \"<string>\",\n \"site_name\": \"<string>\",\n \"credentials\": {\n \"personal_access_token_name\": \"<string>\",\n \"personal_access_token_secret\": \"<string>\"\n },\n \"sync_enabled\": true,\n \"query_sanitization_enabled\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.select.dev/v2/tableau-connections/{tableau_connection_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["x-tenant-id"] = '<x-tenant-id>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"server_url\": \"<string>\",\n \"site_name\": \"<string>\",\n \"credentials\": {\n \"personal_access_token_name\": \"<string>\",\n \"personal_access_token_secret\": \"<string>\"\n },\n \"sync_enabled\": true,\n \"query_sanitization_enabled\": true\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"etag": "<string>",
"name": "<string>",
"connection_id": "<string>",
"server_url": "<string>",
"site_name": "<string>",
"site_luid": "<string>",
"sync_enabled": true,
"query_sanitization_enabled": true,
"create_time": "<string>",
"update_time": "<string>",
"added_by_email": "<string>",
"last_successful_sync_time": "<string>"
}{
"title": "<string>",
"status": 123,
"detail": "<string>",
"code": "<string>",
"retryable": true,
"type": "about:blank",
"details": [
{}
]
}{
"title": "<string>",
"status": 123,
"detail": "<string>",
"code": "<string>",
"retryable": true,
"type": "about:blank",
"details": [
{}
]
}{
"title": "<string>",
"status": 123,
"detail": "<string>",
"code": "<string>",
"retryable": true,
"type": "about:blank",
"details": [
{}
]
}{
"title": "<string>",
"status": 123,
"detail": "<string>",
"code": "<string>",
"retryable": true,
"type": "about:blank",
"details": [
{}
]
}{
"title": "<string>",
"status": 123,
"detail": "<string>",
"code": "<string>",
"retryable": true,
"type": "about:blank",
"details": [
{}
]
}{
"title": "<string>",
"status": 123,
"detail": "<string>",
"code": "<string>",
"retryable": true,
"type": "about:blank",
"details": [
{}
]
}{
"title": "<string>",
"status": 123,
"detail": "<string>",
"code": "<string>",
"retryable": true,
"type": "about:blank",
"details": [
{}
]
}{
"title": "<string>",
"status": 123,
"detail": "<string>",
"code": "<string>",
"retryable": true,
"type": "about:blank",
"details": [
{}
]
}{
"title": "<string>",
"status": 123,
"detail": "<string>",
"code": "<string>",
"retryable": true,
"type": "about:blank",
"details": [
{}
]
}{
"title": "<string>",
"status": 123,
"detail": "<string>",
"code": "<string>",
"retryable": true,
"type": "about:blank",
"details": [
{}
]
}{
"title": "<string>",
"status": 123,
"detail": "<string>",
"code": "<string>",
"retryable": true,
"type": "about:blank",
"details": [
{}
]
}{
"title": "<string>",
"status": 123,
"detail": "<string>",
"code": "<string>",
"retryable": true,
"type": "about:blank",
"details": [
{}
]
}{
"title": "<string>",
"status": 123,
"detail": "<string>",
"code": "<string>",
"retryable": true,
"type": "about:blank",
"details": [
{}
]
}Authorizations
Organization API key (sl_…).
Headers
The organization ID the request is scoped to.
Path Parameters
Body
A merge-patch update to an existing connection. Omitted fields are left
unchanged; null clears a field.
Mirrors TableauConnectionCreate. Every field is required when present and
cannot be cleared with null.
A connection stays pointed at the site it was added for. server_url and
site_name may be corrected, but the change is rejected if the corrected
pair resolves to a different site — add a second connection for that site
instead.
Rotating credentials is atomic: the token name and secret move together,
since TableauCredentials requires both.
Display name for the connection, as shown throughout SELECT.
1Base URL of the Tableau deployment to connect to, including the scheme and without a site path.
The site on that deployment to read, by its URL name.
1The personal access token SELECT authenticates with. Revalidated against Tableau before it is stored.
Show child attributes
Show child attributes
Whether SELECT is currently syncing data for this connection.
Whether query text is sanitized before SELECT stores it.
Response
Successful Response
A connection to one Tableau site.
The unique identifier of the connection.
Opaque strong ETag for this connection's configuration. Matches the ETag response header, and is what If-Match requires on a write. It changes whenever a configurable field on the connection changes.
Display name for the connection, as shown throughout SELECT.
Identifier of the connection resource this Tableau connection belongs to (see GET /v2/connections/{connection_id}). Distinct from id, which identifies this Tableau connection specifically.
Base URL of the Tableau deployment SELECT connects to, without a site path — for example https://us-east-1.online.tableau.com.
The site on that deployment SELECT reads. This is the site's URL name, which is what Tableau signs in against; Default names the default site of a Tableau Server deployment.
The identifier Tableau assigns the site, resolved when the connection is added. Unlike site_name it survives a rename, so it is what SELECT keys the site's data and access rules on.
Whether SELECT is currently syncing data for this connection.
Whether query text is sanitized before SELECT stores it.
When the connection was added.
When the connection was last changed.
Email address of the person who added the connection. Null when it was not added by a person.
When SELECT last completed a sync for this connection. Null before the first one succeeds.

