---
schema_version: "1"
id: ebad38b33484dafb83c96517cb2e15a3d9b1665ac59dbc9e108fc1f6109e1ee6
title: Bash Example
collection: tableau
version: next
locale: en-us
portal_url: https://docs.salesforce.com/tableau/next/en-us/api/explore-tableau/docs/example-bash.md
canonical_url: https://help.tableau.com/v0.0/api/explore-tableau/en-us/docs/example-bash.html
source_site: help.tableau.com
content_type: documentation
content_hash: be57165ff0b7be94524ef6a44c71a28e3effd14478ebe46e8efb9816ee8215c6
description: Documentation for the Explore in Tableau API
---
# Bash Example

  

## Generating the JWT

A JSON Web Token (JWT) is a standard and secure way to transmit information between parties using JSON. General information about JWTs can be found at [jwt.io](https://jwt.io/).

`generate_api_token.sh`

```
#!/bin/bash

# Check if the API key is provided as an argument
if [ -z "$1" ]; then
  echo "Usage: $0 API_KEY"
  exit 1
fi

# Define the API key and header/payload
API_KEY="$1"
HEADER='{"alg":"HS256","typ":"JWT"}'
ISSUER="example.com"
SUBJECT="Example JWT"
ISSUED_AT=$(date +%s)

# Construct the payload
PAYLOAD="{\"iss\":\"$ISSUER\",\"sub\":\"$SUBJECT\",\"iat\":$ISSUED_AT}"

# Base64 encode the header and payload
base64_url_encode() {
echo -n "$1" | openssl base64 -e | tr -d '=' | tr '/+' '_-' | tr -d '\n'
}
HEADER_BASE64=$(base64_url_encode "$HEADER")
PAYLOAD_BASE64=$(base64_url_encode "$PAYLOAD")

# Create the signature
SIGNATURE=$(echo -n "$HEADER_BASE64.$PAYLOAD_BASE64" | openssl dgst -sha256 -hmac "$API_KEY" -binary | openssl base64 -e | tr -d '=' | tr '/+' '_-' | tr -d '\n')

# Combine the header, payload, and signature to form the JWT
JWT="$HEADER_BASE64.$PAYLOAD_BASE64.$SIGNATURE"

# Output the JWT
echo "JWT: $JWT"
```

## Sending the request

The code below requires bash script above.

This code requires the API key, the data provider string, a region, and a base64 URL encoded TDS specified as arguments. The script uses these elements to build a JWT and submit a request to the API gateway.

Note that the base64 URL encoded TDS string in this example has been replaced with `<BASE64_URLENCODED_TDS>` because the encoded TDS is too long to display comfortably here.

`send_upload_request.sh`

```
#!/bin/bash

# Echo usage if the three required arguments aren't provided
if [ -z "$4" ]; then
  echo "Usage: $0 SERVER_URL DATA_PROVIDER REGION API_KEY"
  exit 1
fi

# Get variables from arguments
server_url="$1"
data_provider="$2"
region="$3"
api_key="$4"

# Generate JWT
output=$(./generate_api_token.sh "$api_key")

# Extract the JWT, and hash from the output
jwt=$(echo "$output" | grep "JWT" | awk '{ print $2 }')

# The payload is a JSON object with name "tdsContent" and value of the base64 URLencoded TDS
payload='{
  "tdsContent": "<BASE64_URLENCODED_TDS>"
}'

# Send the POST request using curl
curl -i \
  -H "x-salesforce-region: $region" \
  -H "Content-Type: application/json" \
  -H "Authorization: C2C:$jwt" \
  -d "$payload" \
  $server_url/v1/upload-tds-content/$data_provider
```