# Change owner of authorized_keys file to Retool
chown retool:retool /home/retool/.ssh/authorized_keys
```

If you want to minimize access to your servers, add Retool's [IP addresses to your allowlist](../../reference/ip-allowlist-cloud-orgs.mdx).

5. Once that has been successfully configured, you can now use your database's private IP address within the rest of the connection form.

### SSH tunneling with OpenSSH 8.7 and newer

Retool's public key is generated using `ssh-rsa`. This was deprecated in [OpenSSH 8.8](https://www.openssh.com/txt/release-8.8), but OpenSSH 8.7 can also be affected. If you are using this or a newer version of OpenSSH, add the following line to your `sshd_config` file to allow this type of key:

```
PubkeyAcceptedKeyTypes +ssh-rsa
```

Ensure that you restart your SSH server once you save your changes.

### Self-hosted Retool deployments

The above steps should also work in most on-premise deployments - Retool in most cases will auto-provision your environment with a keypair.

Self-hosted Retool also supports the use of custom SSH keys and usernames. To configure these, create a volume mount for the `/retool_backend/keys` directory in the Retool container, and add any private key you wish to use from within Retool into this directory. For example, if you want to use `myprivatekey.pem`, the SSH tunnel configuration for the resource would resemble the following:

:::note

Refer to the [rotate SSH keys](../../../self-hosted/guides/rotate-ssh-keys.mdx) guide for instructions on key rotation. After you download the public key, follow the steps in **Configure SSH tunneling** to add it to `authorized_keys`.

:::

### Debug common connection errors

```
All configured authentication methods failed.
```

This error usually means Retool is able to reach the SSH host, but can't authenticate. Confirm that you have created a _retool_ user and the Retool public key has been added to your authorized keys.

```
Channel open failure: Connection refused
```

This error occurs when the SSH tunneling config is working but the host/port you tried to connect to has refused the connection.

```
Could not establish a connection. Try checking your database firewall configuration and whitelisting Retool's IP address.
```

This error usually occurs when you run into a firewall or other configurations aren't properly setup. For example, trying to connect Postgres to an HTTP port, incorrect SSH tunnel configs or the database host/port are wrong. Try going through the steps below to identify the specific error:

1. Did you create a _retool_ user on your SSH host and add the public key?
2. If you have access to the SSH host, try connecting Retool while monitoring the auth logs (`tail -f /var/log/auth.log`). if you're not seeing any connection attempts, then you may not have whitelisted Retool's IP.
3. While debugging, use the proper SSH tunnel configs, but set the database configs to something bogus, e.g. localhost:5555. If the SSH tunnel is fine, you should see the "Connection refused" error, and you'll know that your database configs are the problem, not the SSH tunnel configs.

#### Slow queries or timeouts

Connections between Retool and the bastion host may be throttled. If queries are timing out or slow to resolve, add the following line to your `sshd_config` file.

```
MaxStartups 1000:1000:1000
```

---

## Configure SSL connections for data sources

Retool supports SSL and TLS connections to database resources as long as the database server is configured to support it.

The following resource types have options for SSL/TLS encryption in their configuration settings:

- [AlloyDB](../integrations/database/alloydb.mdx)
- [Cassandra](../integrations/database/cassandra.mdx)
- [CouchDB](../integrations/database/couchdb.mdx)
- [ElasticSearch](../integrations/analytics/elasticsearch.mdx)
- [GraphQL](../integrations/api/graphql.mdx)
- [gRPC](../integrations/development/grpc.mdx)
- [Microsoft SQL](../integrations/database/microsoft-sql-server.mdx)
- [MongoDB](../integrations/database/mongodb.mdx)
- [MySQL](../integrations/database/mysql.mdx)
- [Postgres](../integrations/database/postgresql.mdx)
- [Redshift](../integrations/database/amazon-redshift.mdx)
- [Redis](../integrations/database/redis.mdx)
- [REST API](../integrations/api/rest.mdx)
- [RethinkDB](../integrations/database/rethinkdb.mdx)

## Connect using SSL/TLS

To connect with SSL, on the **Create resource** or **Edit resource** form, select the **Use SSL/TLS** checkbox. Depending on the resource, additional fields are shown once the checkbox is clicked. The standard options are **CA Certificate**, **Client Key**, **Client Certifcate**, and **Verification mode**.

For **API Resources**, specify an **HTTPS** base URL before clicking the **Use self-signed certificates** checkbox to add TLS options.

**CA Certificate** is a certificate signed by a trusted, third-party certificate authority (CA). The client, which is Retool in this case, uses the certificate to verify that they are talking to the correct server. **Client Key** and **Client Certificate** are additional fields that identify the client to the server.

### Verification modes

The following table lists the available **Verification mode** options:

| Verification mode                    | `psql` equivalent | Description                                                                                               |
| ------------------------------------ | ----------------- | --------------------------------------------------------------------------------------------------------- |
| **Full verification**                | `verify-full`     | Verifies the server host matches the name stored in the server certificate and checks the CA certificate. |
| **Verify CA Certificate**            | `verify-ca`       | Verifies the server by checking the certificate chain up to the root certificate stored on the client.    |
| **Skip CA Certificate verification** | `require`         | Establishes an encrypted connection without CA certificate verification.                                  |

Retool uses Node drivers to power our resources, and occasionally, the drivers are limited in their functionality. As a result, not all resources support all modes. For example, MySQL only supports **Verify CA Certificate** and **Skip CA Certificate verification**.

---

## Connect to Amazon Bedrock

import Intro from "./_intro.mdx";

## Supported models

import Support from './_support.mdx';

Amazon Bedrock is a managed service that can be configured for different AI models, such as Anthropic or Cohere models. The models available for use with Retool AI depend on the models you configure for Bedrock.

## Set up your Amazon Bedrock credentials

import Configure from '../_partials/_ai-configure.mdx';

Amazon Bedrock requires the following credentials:

- **AWS IAM access key ID**.
- **AWS IAM secret access key**.
- **AWS Region**.

You can also provide an optional **AWS IAM Session Token**, if required. Log in to the [AWS IAM dashboard](https://us-east-1.console.aws.amazon.com/iamv2/home?) to obtain your IAM credentials.

:::note

Retool recommends using an AWS-managed policy instead of building one from scratch. Refer to the [AWS managed policies for Amazon Bedrock](https://docs.aws.amazon.com/bedrock/latest/userguide/security-iam-awsmanpol.html) documentation for more information.

:::

---

## Connect to Amazon Knowledge Base

Retool supports [Amazon Knowledge Bases](https://docs.aws.amazon.com/bedrock/latest/userguide/kb-how-it-works.html) as a [vector store](../../../quickstarts/retool-vectors.mdx) for Retool AI. Once configured, you can use an Amazon knowledge base as an alternative to Retool Vectors.

## Prerequisites

To import an Amazon knowledge base for use with Retool AI, you need:

- The knowledge base name.
- The knowledge base ID.
- To [connect to Amazon Bedrock](./amazon-bedrock.mdx) in Retool AI.

Refer to the [Amazon Knowledge Bases documentation](https://docs.aws.amazon.com/bedrock/latest/userguide/knowledge-base-create.html) to learn more about creating a knowledge base and obtaining these credentials.

## Add the Amazon knowledge base to Retool

To import the Amazon knowledge base:

1. Sign in to Retool and navigate to the **Resources** tab, then select **Retool Vectors**.
2. Click **Create new** and select **Import from Amazon Knowledge Bases**.
3. Provide the knowledge base name and ID. 

Once configured, the knowledge base appears in the list of vectors. You can then select the knowledge base from an AI action in which you want to provide vector data.

Retool does not directly import any data from the knowledge base. When you select the knowledge base, Retool communicates directly with the knowledge base which functions in the same way as Retool Vectors to provide additional context for the AI model.

---

## Connect to Anthropic

import Intro from "./_intro.mdx";

## Supported models

import Support from "./_support.mdx";

import Models from '../../../../_partials/_ai/_models/_anthropic.mdx';

## Set up your Anthropic credentials

import Configure from "../_partials/_ai-configure.mdx";

You can retrieve your Anthropic API key from your [Account settings](https://console.anthropic.com/account/keys).

---

## Connect to Azure OpenAI

import Intro from './_intro.mdx';

## Supported models

import Support from './_support.mdx';

## Set up your Azure OpenAI credentials

import Configure from '../_partials/_ai-configure.mdx';

Azure OpenAI requires the following credentials:

- API key.
- Azure endpoint URL.
- Deployment name (AI model).

You can retrieve your Azure OpenAI credentials from the [Azure Portal](https://portal.azure.com).

When using Azure OpenAI, all AI Actions use the model specified in this configuration.

---

## Connect to Cohere

import Intro from './_intro.mdx';

import Support from './_support.mdx';

## Set up your Cohere credentials

import Configure from "../_partials/_ai-configure.mdx";

You can retrieve your Cohere API key from either the Cohere [dashboard](https://os.cohere.ai) or [CLI tool](https://docs.cohere.ai/cli-key).

---

## Connect a custom AI provider

import Intro from "./_intro.mdx";

Connecting a custom AI provider is helpful when:

- You want to use a third-party AI provider like Mistral, Fireworks AI, Together AI, or OpenRouter.
- You want to connect a custom LLM.
- You have increased security and compliance requirements and need to route traffic through your own proxies.

## Supported models

import Support from "./_support.mdx";

## Set up your AI platform credentials

To configure a custom AI provider in Retool:

1. Navigate to the **Resources** tab and select **Retool AI**.
2. Scroll down to the **Custom providers** section and click **Add**.
3. Supply the requested information about your custom provider.
4. Click **Add**.

:::warning Create separate API credentials for Retool

Where possible, create API credentials for each service you use to interact with your chosen AI platform. This allows you to best manage and revoke access without disruption. All API credentials used with Retool are encrypted and stored securely.

:::

---

## Connect to Google Gemini

import Intro from "./_intro.mdx";

## Supported models

import Support from './_support.mdx';

import Models from '../../../../_partials/_ai/_models/_gemini.mdx';

## Set up your Google Gemini credentials

import Configure from "../_partials/_ai-configure.mdx";

You can retrieve your Google API key from either the [Google AI Studio dashboard](https://makersuite.google.com/app/apikey).

---

## AI integration guides

You can get started with Retool [AI actions](../../../../queries/concepts/actions.mdx) and agents using one of the Retool-managed [AI models](../../../concepts/models.mdx). This enables you to build and test AI functionality before using them in production. When they're ready for production use, configure one of the supported AI providers with your own API credentials.

:::info

Support for individual models may differ depending on whether you're using [AI actions](../../../../queries/concepts/actions.mdx) or [agents](../../../../agents/quickstart.mdx). Refer to the provider's integration page or the [AI models](../../../concepts/models.mdx) guide to learn more.
:::

---

## Connect to OpenAI

import Intro from "./_intro.mdx";

## Supported models

import Support from "./_support.mdx";

import Models from '../../../../_partials/_ai/_models/_openai.mdx';

## Set up your AI platform credentials

To configure an AI platform with your API key, navigate to the **Resources** tab and select **Retool AI**. Select the AI model below for configuration instructions.

import Configure from "../_partials/_ai-configure.mdx";

:::info

Configuring your own OpenAI API key disables the Retool-managed OpenAI connection. All existing AI Action queries using OpenAI automatically start using your connection.

:::

You can retrieve your OpenAI API key from the [API Keys](https://platform.openai.com/account/api-keys) page in your OpenAI account.

---

## Connect to Amazon Athena

import * as Partials from '../_partials/ResourcesPartials';
import Requirements from '../_partials/_requirements.mdx';
import Configure from '../_partials/_configure.mdx';
import Auth from '../_partials/_auth/_auth-settings.mdx';
import Ssl from '../_partials/_settings/_ssl.mdx';
import Test from '../_partials/_test-connection.mdx';
import Save from '../_partials/_save.mdx';
import Wrapup from '../_partials/_wrapup.mdx';

  

  

  
  

  

  

import Related from '../_partials/_related-docs.mdx';

---

## Connect to Databricks

import * as Partials from "../_partials/ResourcesPartials";
import Requirements from "../_partials/_requirements.mdx";
import Configure from "../_partials/_configure.mdx";
import Auth from "../_partials/_auth/_auth-settings.mdx";
import Ssl from "../_partials/_settings/_ssl.mdx";
import Test from "../_partials/_test-connection.mdx";
import Save from "../_partials/_save.mdx";
import Wrapup from "../_partials/_wrapup.mdx";
import JavaDBConnector from "../_partials/_java-dbconnector.mdx";

  
  
  
  
  

import Related from "../_partials/_related-docs.mdx";

---

## Connect to Datadog

import * as Partials from '../_partials/ResourcesPartials';
import Requirements from '../_partials/_requirements.mdx';
import Configure from '../_partials/_configure.mdx';
import Auth from '../_partials/_auth/_auth-settings.mdx';
import Ssl from '../_partials/_settings/_ssl.mdx';
import Test from '../_partials/_test-connection.mdx';
import Save from '../_partials/_save.mdx';
import Wrapup from '../_partials/_wrapup.mdx';

---

## Connect to Elasticsearch

import * as Partials from '../_partials/ResourcesPartials';
import Requirements from '../_partials/_requirements.mdx';
import Configure from '../_partials/_configure.mdx';
import Auth from '../_partials/_auth/_auth-settings.mdx';
import Ssl from '../_partials/_settings/_ssl.mdx';
import Test from '../_partials/_test-connection.mdx';
import Save from '../_partials/_save.mdx';
import Wrapup from '../_partials/_wrapup.mdx';

  

  
  

  

import Related from '../_partials/_related-docs.mdx';

---

## Analytics integration guides



---

## Connect a GraphQL API

import * as Partials from '../_partials/ResourcesPartials';
import Requirements from '../_partials/_requirements.mdx';
import Configure from '../_partials/_configure.mdx';
import Auth from '../_partials/_auth/_auth-settings.mdx';
import Ssl from '../_partials/_settings/_ssl.mdx';
import Test from '../_partials/_test-connection.mdx';
import Save from '../_partials/_save.mdx';
import Wrapup from '../_partials/_wrapup.mdx';

---

## API integration guides



---

## Connect to OpenAPI

import * as Partials from '../_partials/ResourcesPartials';
import Requirements from '../_partials/_requirements.mdx';
import Configure from '../_partials/_configure.mdx';
import Auth from '../_partials/_auth/_auth-settings.mdx';
import Ssl from '../_partials/_settings/_ssl.mdx';
import Test from '../_partials/_test-connection.mdx';
import Save from '../_partials/_save.mdx';
import Wrapup from '../_partials/_wrapup.mdx';

:::note
Retool supports OpenAPI versions 2.0, 3.0.x, and 3.1.0.
:::

---

## Connect a REST API

import * as Partials from '../_partials/ResourcesPartials';
import Requirements from '../_partials/_requirements.mdx';
import Configure from '../_partials/_configure.mdx';
import Auth from '../_partials/_auth/_auth-settings.mdx';
import Ssl from '../_partials/_settings/_ssl.mdx';
import Test from '../_partials/_test-connection.mdx';
import Save from '../_partials/_save.mdx';
import Wrapup from '../_partials/_wrapup.mdx';

---

## Connect to the Retool API

import * as Partials from '../_partials/ResourcesPartials';
import Requirements from '../_partials/_requirements.mdx';
import Configure from '../_partials/_configure.mdx';
import Auth from '../_partials/_auth/_auth-settings.mdx';
import Ssl from '../_partials/_settings/_ssl.mdx';
import Test from '../_partials/_test-connection.mdx';
import Save from '../_partials/_save.mdx';
import Wrapup from '../_partials/_wrapup.mdx';

You can use the [OpenAPI](openapi.mdx) integration to create a Retool API resource and make it available in Retool. Once complete, your users can write queries that interact with your organization using the Retool API.

  

  
  

  

Authentication is performed using [Bearer HTTP authentication](https://developer.mozilla.org/en-US/docs/Web/HTTP/Authentication#basic) with an API key. You must first create an API key with the required permission scopes. Refer to the [Retool API authentication](../../../../org-users/guides/retool-api/authentication.mdx) guide for instructions.

Use `https://api.retool.com/api/v2/spec` for cloud-hosted organizations.

Use `https://[your-instance-url].com/api/v2/spec` for a self-hosted deployment instance.

Refer to the [Retool API authentication](../../../../org-users/guides/retool-api/authentication.mdx) guide for instructions on creating an API token.

By default, responses include up to 100 items. When there are more items, the `has_more` field in the response is set to `true` and the `next_token` field has a pagination token.

```json
{
  "data": [
    {...},
  ],
  "has_more": true,
  "next_token": "opaque-pagination-token"
}
```

To request the next page of results, include the token in the URL parameters of the request:

```
curl -H "Authorization: Bearer {token}" https://api.retool.com/api/v2/resources?next_token=opaque-pagination-token
```

---

## Connect a SOAP API

import * as Partials from '../_partials/ResourcesPartials';
import Rest from './rest.mdx';
import Configure from '../_partials/_configure.mdx';
import Requirements from '../_partials/_configure.mdx';
import Auth from '../_partials/_auth/_auth-settings.mdx';
import Ssl from '../_partials/_settings/_ssl.mdx';
import Test from '../_partials/_test-connection.mdx';
import Save from '../_partials/_save.mdx';
import Wrapup from '../_partials/_wrapup.mdx';

  

  
  

     

  

:::caution Set the correct headers for SOAP requests

SOAP requests must also include the following key-value header values.

| Key             | Value       |
| :-------------- | :---------- |
| `Content-Type ` | `text/xml ` |

If you use a SOAP 1.1 service, include `SOAPAction` and an appropriate value.

You may need to include additional headers, depending on your SOAP API requirements. refer to your SOAP API specification for details. The name of the SOAP method is usually provided in the SOAP body but may need to be provided in the header instead.

:::

To perform SOAP API requests:

- Use the **POST** request method.
- Use the **Raw** body type.
- If you use WSDL, provide the path to the WSDL in the endpoint URL.

---

## Connect to BigID

import * as Partials from '../_partials/ResourcesPartials';
import Requirements from '../_partials/_requirements.mdx';
import Configure from '../_partials/_configure.mdx';
import Auth from '../_partials/_auth/_auth-settings.mdx';
import Ssl from '../_partials/_settings/_ssl.mdx';
import Test from '../_partials/_test-connection.mdx';
import Save from '../_partials/_save.mdx';
import Wrapup from '../_partials/_wrapup.mdx';

---

## Connect to Close

import * as Partials from '../_partials/ResourcesPartials';
import Requirements from '../_partials/_requirements.mdx';
import Configure from '../_partials/_configure.mdx';
import Auth from '../_partials/_auth/_auth-settings.mdx';
import Ssl from '../_partials/_settings/_ssl.mdx';
import Test from '../_partials/_test-connection.mdx';
import Save from '../_partials/_save.mdx';
import Wrapup from '../_partials/_wrapup.mdx';

---

## Connect to Front

import * as Partials from '../_partials/ResourcesPartials';
import Requirements from '../_partials/_requirements.mdx';
import Configure from '../_partials/_configure.mdx';
import Auth from '../_partials/_auth/_auth-settings.mdx';
import Ssl from '../_partials/_settings/_ssl.mdx';
import Test from '../_partials/_test-connection.mdx';
import Save from '../_partials/_save.mdx';
import Wrapup from '../_partials/_wrapup.mdx';

---

## Connect to HubSpot

import * as Partials from '../_partials/ResourcesPartials';
import Requirements from '../_partials/_requirements.mdx';
import Configure from '../_partials/_configure.mdx';
import Auth from '../_partials/_auth/_auth-settings.mdx';
import Ssl from '../_partials/_settings/_ssl.mdx';
import Test from '../_partials/_test-connection.mdx';
import Save from '../_partials/_save.mdx';
import Wrapup from '../_partials/_wrapup.mdx';

  

  
  

  

Refer to the [HubSpot developer documentation](https://developers.hubspot.com/docs/api/private-apps) to learn how to generate private app tokens.

:::caution Deprecated authentication method

API key authentication for HubSpot has been deprecated. Use an alternative authentication method, if available.

:::

Refer to the [HubSpot Knowledge Base](https://knowledge.hubspot.com/integrations/how-do-i-get-my-hubspot-api-key) to learn how to obtain an API key.

Refer to the [HubSpot developer documentation](https://developers.hubspot.com/docs/api/private-apps) to learn how to generate private app tokens.

:::caution Deprecated authentication method

API key authentication for HubSpot has been deprecated. Use an alternative authentication method, if available.

:::

Refer to the [HubSpot Knowledge Base](https://knowledge.hubspot.com/integrations/how-do-i-get-my-hubspot-api-key) to learn how to obtain an API key.

---

## CRM integration guides



---

## Connect to Salesforce

import * as Partials from '../_partials/ResourcesPartials';
import Requirements from '../_partials/_requirements.mdx';
import Configure from '../_partials/_configure.mdx';
import Auth from '../_partials/_auth/_auth-settings.mdx';
import Ssl from '../_partials/_settings/_ssl.mdx';
import Test from '../_partials/_test-connection.mdx';
import Save from '../_partials/_save.mdx';
import Wrapup from '../_partials/_wrapup.mdx';

  

  
  

  

:::note

Retool does not support the Salesforce implementation of [Proof Key for Code Exchange (PKCE)](https://help.salesforce.com/s/articleView?id=sf.remoteaccess_pkce.htm&type=5). To ensure that your Salesforce integration with Retool functions as expected, turn off the **Require Proof Key for Code Exchange (PKCE) Extension for Supported Authorization Flows** setting in your [Salesforce app settings](https://help.salesforce.com/s/articleView?id=sf.authorization_code_credentials_configure.htm&type=5).

:::

Enable **Customize Salesforce OAuth urls** to specify custom authorization and token URLs.

Enable **Customize Salesforce OAuth urls** to specify custom authorization and token URLs.

---

## Connect to AlloyDB

import * as Partials from '../_partials/ResourcesPartials';
import Requirements from '../_partials/_requirements.mdx';
import Configure from '../_partials/_configure.mdx';
import Auth from '../_partials/_auth/_auth-settings.mdx';
import Ssl from '../_partials/_settings/_ssl.mdx';
import Test from '../_partials/_test-connection.mdx';
import Save from '../_partials/_save.mdx';
import Wrapup from '../_partials/_wrapup.mdx';

  

  
  

  

import Related from '../_partials/_related-docs.mdx';

---

## Connect to Amazon DynamoDB

import * as Partials from '../_partials/ResourcesPartials';
import Requirements from '../_partials/_requirements.mdx';
import Configure from '../_partials/_configure.mdx';
import Auth from '../_partials/_auth/_auth-settings.mdx';
import Ssl from '../_partials/_settings/_ssl.mdx';
import Test from '../_partials/_test-connection.mdx';
import Save from '../_partials/_save.mdx';
import Wrapup from '../_partials/_wrapup.mdx';

  

  
  

  

import Related from '../_partials/_related-docs.mdx';

---

## Connect to Amazon Redshift

import * as Partials from '../_partials/ResourcesPartials';
import Requirements from '../_partials/_requirements.mdx';
import Configure from '../_partials/_configure.mdx';
import Auth from '../_partials/_auth/_auth-settings.mdx';
import Ssl from '../_partials/_settings/_ssl.mdx';
import Test from '../_partials/_test-connection.mdx';
import Save from '../_partials/_save.mdx';
import Wrapup from '../_partials/_wrapup.mdx';

  

  
  

  

import Related from '../_partials/_related-docs.mdx';

---

## Connect to BigQuery

import * as Partials from '../_partials/ResourcesPartials';
import Requirements from '../_partials/_requirements.mdx';
import Configure from '../_partials/_configure.mdx';
import Auth from '../_partials/_auth/_auth-settings.mdx';
import Ssl from '../_partials/_settings/_ssl.mdx';
import Test from '../_partials/_test-connection.mdx';
import Save from '../_partials/_save.mdx';
import Wrapup from '../_partials/_wrapup.mdx';

  

  
  

  

Your [dataset location](https://cloud.google.com/bigquery/docs/locations) is required so Retool can fetch the dataset's [metadata](https://cloud.google.com/bigquery/docs/information-schema-intro) to power query autocomplete. Defaults to `region-us` if no value is provided.

Your [dataset location](https://cloud.google.com/bigquery/docs/locations) is required so Retool can fetch the dataset's [metadata](https://cloud.google.com/bigquery/docs/information-schema-intro) to power query autocomplete. Defaults to `region-us` if no value is provided.

You must ensure the key is granted access to the BigQuery Data Viewer and BigQuery User [roles](https://cloud.google.com/bigquery/docs/access-control). Refer to the [Google developer documentation](https://cloud.google.com/iam/docs/service-account-overview) for details on creating a service account key.

You must ensure the key is granted access to the BigQuery Data Viewer and BigQuery User [roles](https://cloud.google.com/bigquery/docs/access-control). Refer to the [Google developer documentation](https://cloud.google.com/iam/docs/service-account-overview) for details on creating a service account key.

import Related from '../_partials/_related-docs.mdx';

---

## Connect to Cassandra

import * as Partials from '../_partials/ResourcesPartials';
import Requirements from '../_partials/_requirements.mdx';
import Configure from '../_partials/_configure.mdx';
import Auth from '../_partials/_auth/_auth-settings.mdx';
import Ssl from '../_partials/_settings/_ssl.mdx';
import Test from '../_partials/_test-connection.mdx';
import Save from '../_partials/_save.mdx';
import Wrapup from '../_partials/_wrapup.mdx';

  

  
  

  

import Related from '../_partials/_related-docs.mdx';

---

## Connect to CosmosDB

import * as Partials from '../_partials/ResourcesPartials';
import Requirements from '../_partials/_requirements.mdx';
import Configure from '../_partials/_configure.mdx';
import Auth from '../_partials/_auth/_auth-settings.mdx';
import Ssl from '../_partials/_settings/_ssl.mdx';
import Test from '../_partials/_test-connection.mdx';
import Save from '../_partials/_save.mdx';
import Wrapup from '../_partials/_wrapup.mdx';

  

  
  

  

import Related from '../_partials/_related-docs.mdx';

---

## Connect to CouchDB

import * as Partials from '../_partials/ResourcesPartials';
import Requirements from '../_partials/_requirements.mdx';
import Configure from '../_partials/_configure.mdx';
import Auth from '../_partials/_auth/_auth-settings.mdx';
import Ssl from '../_partials/_settings/_ssl.mdx';
import Test from '../_partials/_test-connection.mdx';
import Save from '../_partials/_save.mdx';
import Wrapup from '../_partials/_wrapup.mdx';

  

  
  

  

import Related from '../_partials/_related-docs.mdx';

---

## Connect to Databricks Lakebase

import * as Partials from '../_partials/ResourcesPartials';
import Requirements from '../_partials/_requirements.mdx';
import Configure from '../_partials/_configure.mdx';
import Auth from '../_partials/_auth/_auth-settings.mdx';
import Ssl from '../_partials/_settings/_ssl.mdx';
import Test from '../_partials/_test-connection.mdx';
import Save from '../_partials/_save.mdx';
import Scopes from '../_partials/_settings/_scopes.mdx';
import Wrapup from '../_partials/_wrapup.mdx';

  

  
  

  

Retool strongly recommends using SSL/TLS certificate validation whenever it's available. This ensures the connection is secure and prevents attackers from using invalid server certificates to gain access to your data.

When creating your OAuth app in Databricks Lakebase:
- **Select the "ALL APIs" scope** to grant Retool the necessary permissions
- **Unselect "Generate a client secret"** as Databricks Lakebase uses PKCE (Proof Key for Code Exchange) for enhanced security

Retool prefills this value with a placeholder. Replace `{databricksHost}` with your Databricks Lakebase host.

```url
https://{databricksHost}/oidc/v1/authorize
```

Retool prefills this value with a placeholder. Replace `{databricksHost}` with your Databricks Lakebase host.

```url
https://{databricksHost}/oidc/v1/token
```

import Related from '../_partials/_related-docs.mdx';

---

## Database integration guides



---

## Connect to JDBC

import * as Partials from '../_partials/ResourcesPartials';
import Requirements from '../_partials/_requirements.mdx';
import Configure from '../_partials/_configure.mdx';
import Auth from '../_partials/_auth/_auth-settings.mdx';
import Test from '../_partials/_test-connection.mdx';
import Save from '../_partials/_save.mdx';
import Wrapup from '../_partials/_wrapup.mdx';
import JdbcOnprem from '../_partials/_jdbc_onprem_configure.mdx';

  

  
  

  

import Related from '../_partials/_related-docs.mdx';

---

## Connect to Microsoft SQL Server

import * as Partials from '../_partials/ResourcesPartials';
import Requirements from '../_partials/_requirements.mdx';
import Configure from '../_partials/_configure.mdx';
import Auth from '../_partials/_auth/_auth-settings.mdx';
import Ssl from '../_partials/_settings/_ssl.mdx';
import Test from '../_partials/_test-connection.mdx';
import Save from '../_partials/_save.mdx';
import Wrapup from '../_partials/_wrapup.mdx';

  

  
  

  

:::tip 
You can [configure self-hosted deployments to use Kerberos authentication](../../authentication/mssql-kerberos.mdx) with Microsoft SQL Server resources.
:::

import Related from '../_partials/_related-docs.mdx';

---

## Connect to MongoDB

import * as Partials from '../_partials/ResourcesPartials';
import Requirements from '../_partials/_requirements.mdx';
import Configure from '../_partials/_configure.mdx';
import Auth from '../_partials/_auth/_auth-settings.mdx';
import Ssl from '../_partials/_settings/_ssl.mdx';
import Test from '../_partials/_test-connection.mdx';
import Save from '../_partials/_save.mdx';
import Wrapup from '../_partials/_wrapup.mdx';

  

  
  

  

Only required when using the **Standard** connection format.

Only required when using the **Standard** connection format.

import Related from '../_partials/_related-docs.mdx';

---

## Connect a MySQL database

import * as Partials from '../_partials/ResourcesPartials';
import Requirements from '../_partials/_requirements.mdx';
import Configure from '../_partials/_configure.mdx';
import Auth from '../_partials/_auth/_auth-settings.mdx';
import Ssl from '../_partials/_settings/_ssl.mdx';
import Test from '../_partials/_test-connection.mdx';
import Save from '../_partials/_save.mdx';
import Wrapup from '../_partials/_wrapup.mdx';

  

  
  

  

import Related from '../_partials/_related-docs.mdx';

---

## Connect to Oracle Database

import * as Partials from '../_partials/ResourcesPartials';
import Requirements from '../_partials/_requirements.mdx';
import Configure from '../_partials/_configure.mdx';
import Auth from '../_partials/_auth/_auth-settings.mdx';
import Ssl from '../_partials/_settings/_ssl.mdx';
import Test from '../_partials/_test-connection.mdx';
import Save from '../_partials/_save.mdx';
import Wrapup from '../_partials/_wrapup.mdx';

  

  
  

  

import Related from '../_partials/_related-docs.mdx';

---

## Connect a PostgreSQL database

import * as Partials from '../_partials/ResourcesPartials';
import Requirements from '../_partials/_requirements.mdx';
import Configure from '../_partials/_configure.mdx';
import Auth from '../_partials/_auth/_auth-settings.mdx';
import Ssl from '../_partials/_settings/_ssl.mdx';
import Test from '../_partials/_test-connection.mdx';
import Save from '../_partials/_save.mdx';
import Wrapup from '../_partials/_wrapup.mdx';

  

  
  

  

import Related from '../_partials/_related-docs.mdx';

---

## Connect to Presto

import * as Partials from '../_partials/ResourcesPartials';
import Requirements from '../_partials/_requirements.mdx';
import Configure from '../_partials/_configure.mdx';
import Auth from '../_partials/_auth/_auth-settings.mdx';
import Ssl from '../_partials/_settings/_ssl.mdx';
import Test from '../_partials/_test-connection.mdx';
import Save from '../_partials/_save.mdx';
import Wrapup from '../_partials/_wrapup.mdx';

  

  
  

  

import Related from '../_partials/_related-docs.mdx';

---

## Connect to Redis

import * as Partials from '../_partials/ResourcesPartials';
import Requirements from '../_partials/_requirements.mdx';
import Configure from '../_partials/_configure.mdx';
import Auth from '../_partials/_auth/_auth-settings.mdx';
import Ssl from '../_partials/_settings/_ssl.mdx';
import Test from '../_partials/_test-connection.mdx';
import Save from '../_partials/_save.mdx';
import Wrapup from '../_partials/_wrapup.mdx';

If you want to connect to Redis without a password, you must [disable protected mode](https://redis.io/topics/security).

import Related from '../_partials/_related-docs.mdx';

---

## Connect to RethinkDB

import * as Partials from '../_partials/ResourcesPartials';
import Requirements from '../_partials/_requirements.mdx';
import Configure from '../_partials/_configure.mdx';
import Auth from '../_partials/_auth/_auth-settings.mdx';
import Ssl from '../_partials/_settings/_ssl.mdx';
import Test from '../_partials/_test-connection.mdx';
import Save from '../_partials/_save.mdx';
import Wrapup from '../_partials/_wrapup.mdx';

  

  
  

  

import Related from '../_partials/_related-docs.mdx';

---

## Connect to SAP Hana

import * as Partials from '../_partials/ResourcesPartials';
import Requirements from '../_partials/_requirements.mdx';
import Configure from '../_partials/_configure.mdx';
import Auth from '../_partials/_auth/_auth-settings.mdx';
import Ssl from '../_partials/_settings/_ssl.mdx';
import Test from '../_partials/_test-connection.mdx';
import Save from '../_partials/_save.mdx';
import Wrapup from '../_partials/_wrapup.mdx';

  

     

  
  

  

import Related from '../_partials/_related-docs.mdx';

---

## Connect to Snowflake

import * as Partials from '../_partials/ResourcesPartials';
import Requirements from '../_partials/_requirements.mdx';
import Configure from '../_partials/_configure.mdx';
import Auth from '../_partials/_auth/_auth-settings.mdx';
import Ssl from '../_partials/_settings/_ssl.mdx';
import Test from '../_partials/_test-connection.mdx';
import Save from '../_partials/_save.mdx';
import Wrapup from '../_partials/_wrapup.mdx';

  

Retool uses **per-user authentication** to connect to Snowflake using OAuth.

  
  
     

Retool uses **per-user authentication** to connect to Snowflake using OAuth.

  

import Related from '../_partials/_related-docs.mdx';

---

## Connect to Vertica

import * as Partials from '../_partials/ResourcesPartials';
import Requirements from '../_partials/_requirements.mdx';
import Configure from '../_partials/_configure.mdx';
import Auth from '../_partials/_auth/_auth-settings.mdx';
import Ssl from '../_partials/_settings/_ssl.mdx';
import Test from '../_partials/_test-connection.mdx';
import Save from '../_partials/_save.mdx';
import Wrapup from '../_partials/_wrapup.mdx';

  

  
  

  

import Related from '../_partials/_related-docs.mdx';

---

## Connect to AWS Lambda

import * as Partials from '../_partials/ResourcesPartials';
import Requirements from '../_partials/_requirements.mdx';
import Configure from '../_partials/_configure.mdx';
import Auth from '../_partials/_auth/_auth-settings.mdx';
import Ssl from '../_partials/_settings/_ssl.mdx';
import Test from '../_partials/_test-connection.mdx';
import Save from '../_partials/_save.mdx';
import Wrapup from '../_partials/_wrapup.mdx';

---

## Connect to CircleCI

import * as Partials from '../_partials/ResourcesPartials';
import Requirements from '../_partials/_requirements.mdx';
import Configure from '../_partials/_configure.mdx';
import Auth from '../_partials/_auth/_auth-settings.mdx';
import Ssl from '../_partials/_settings/_ssl.mdx';
import Test from '../_partials/_test-connection.mdx';
import Save from '../_partials/_save.mdx';
import Wrapup from '../_partials/_wrapup.mdx';

---

## Connect to Firebase

import * as Partials from '../_partials/ResourcesPartials';
import Requirements from '../_partials/_requirements.mdx';
import Configure from '../_partials/_configure.mdx';
import Auth from '../_partials/_auth/_auth-settings.mdx';
import Ssl from '../_partials/_settings/_ssl.mdx';
import Test from '../_partials/_test-connection.mdx';
import Save from '../_partials/_save.mdx';
import Wrapup from '../_partials/_wrapup.mdx';

---

## Connect to GitHub

import * as Partials from '../_partials/ResourcesPartials';
import Requirements from '../_partials/_requirements.mdx';
import Configure from '../_partials/_configure.mdx';
import Auth from '../_partials/_auth/_auth-settings.mdx';
import Ssl from '../_partials/_settings/_ssl.mdx';
import Test from '../_partials/_test-connection.mdx';
import Save from '../_partials/_save.mdx';
import Wrapup from '../_partials/_wrapup.mdx';

---

## Connect to gRPC

import * as Partials from '../_partials/ResourcesPartials';
import Requirements from '../_partials/_requirements.mdx';
import Configure from '../_partials/_configure.mdx';
import Auth from '../_partials/_auth/_auth-settings.mdx';
import Ssl from '../_partials/_settings/_ssl.mdx';
import Test from '../_partials/_test-connection.mdx';
import Save from '../_partials/_save.mdx';
import Wrapup from '../_partials/_wrapup.mdx';

---

## Development integration guides



---

## Connect to the OpenAI Platform API

import * as Partials from "../_partials/ResourcesPartials";
import Requirements from "../_partials/_requirements.mdx";
import Configure from "../_partials/_configure.mdx";
import Auth from "../_partials/_auth/_auth-settings.mdx";
import Ssl from "../_partials/_settings/_ssl.mdx";
import Test from "../_partials/_test-connection.mdx";
import Save from "../_partials/_save.mdx";
import Wrapup from "../_partials/_wrapup.mdx";

:::warning

This resource integration is for interacting directly with Open AI's [platform API](https://platform.openai.com/docs/overview). This can be useful for OpenAI organization administrators to programmatically [manage users](https://platform.openai.com/docs/api-reference/users) and [projects](https://platform.openai.com/docs/api-reference/projects).

Refer to the [OpenAI for Retool AI documentation](../ai/openai.mdx) if you want to use OpenAI's models to power AI apps, workflows, and agents.

:::

export function CreateResource() {
  return (
    
      
    
  )
}

  

  
  

  

  
  

## Query the resource

The OpenAI Platform resource is now available for use in [resource queries](../../../../queries/tutorials/resource-query.mdx). When writing an OpenAI Platform resource query, you can select any supported API method in the **Operations** dropdown. Refer to OpenAI's platform [API reference](https://platform.openai.com/docs/api-reference/introduction) for more information about supported actions.

export function QueryResource() {
  return (
    
      
    
  )
}

---

## Finance integration guides



---

## Connect to Stripe

import * as Partials from '../_partials/ResourcesPartials';
import Requirements from '../_partials/_requirements.mdx';
import Configure from '../_partials/_configure.mdx';
import Auth from '../_partials/_auth/_auth-settings.mdx';
import Ssl from '../_partials/_settings/_ssl.mdx';
import Test from '../_partials/_test-connection.mdx';
import Save from '../_partials/_save.mdx';
import Wrapup from '../_partials/_wrapup.mdx';

---

## Connect to Google Analytics

import * as Partials from '../_partials/ResourcesPartials';
import Requirements from '../_partials/_requirements.mdx';
import Configure from '../_partials/_configure.mdx';
import Auth from '../_partials/_auth/_auth-settings.mdx';
import Ssl from '../_partials/_settings/_ssl.mdx';
import Test from '../_partials/_test-connection.mdx';
import Save from '../_partials/_save.mdx';
import Wrapup from '../_partials/_wrapup.mdx';

---

## Connect to Google Calendar

import * as Partials from '../_partials/ResourcesPartials';
import Requirements from '../_partials/_requirements.mdx';
import Configure from '../_partials/_configure.mdx';
import Auth from '../_partials/_auth/_auth-settings.mdx';
import Ssl from '../_partials/_settings/_ssl.mdx';
import Test from '../_partials/_test-connection.mdx';
import Save from '../_partials/_save.mdx';
import Wrapup from '../_partials/_wrapup.mdx';

Refer to the [Calendar guide](../../../../apps/guides/presentation-styling/calendar.mdx) for information on how to use this resource with the [Calendar component](../../../../apps/reference/components/presentation/calendar.mdx).

:::note
If you self-host Retool and are using a stable release, to enable **Google Calendar** toggle the feature flag in **Settings** > **Beta**. 
:::

export function ArcadeEmbed() {
  return (
    
      
    
  )
}

---

## Connect to Google Cloud Datastore

import * as Partials from '../_partials/ResourcesPartials';
import Requirements from '../_partials/_requirements.mdx';
import Configure from '../_partials/_configure.mdx';
import Auth from '../_partials/_auth/_auth-settings.mdx';
import Ssl from '../_partials/_settings/_ssl.mdx';
import Test from '../_partials/_test-connection.mdx';
import Save from '../_partials/_save.mdx';
import Wrapup from '../_partials/_wrapup.mdx';

  

     

  
  

  

Refer to the [Google developer documentation](https://cloud.google.com/iam/docs/service-account-overview) for details on creating a service account key.

import Related from '../_partials/_related-docs.mdx';

---

## Connect to Google Cloud Storage

import * as Partials from '../_partials/ResourcesPartials';
import Requirements from '../_partials/_requirements.mdx';
import Configure from '../_partials/_configure.mdx';
import Auth from '../_partials/_auth/_auth-settings.mdx';
import Ssl from '../_partials/_settings/_ssl.mdx';
import Test from '../_partials/_test-connection.mdx';
import Save from '../_partials/_save.mdx';
import Wrapup from '../_partials/_wrapup.mdx';
import CORS from '../_partials/_cors-google.mdx';

---

## Connect to Google Docs

import * as Partials from '../_partials/ResourcesPartials';
import Requirements from '../_partials/_requirements.mdx';
import Configure from '../_partials/_configure.mdx';
import Auth from '../_partials/_auth/_auth-settings.mdx';
import Ssl from '../_partials/_settings/_ssl.mdx';
import Test from '../_partials/_test-connection.mdx';
import Save from '../_partials/_save.mdx';
import Wrapup from '../_partials/_wrapup.mdx';

:::note
If you self-host Retool and are using a stable release, enable **Google Docs** from **Settings** > **Beta**. 
:::

export function ArcadeEmbed() {
  return (
    
      
    
  )
}

---

## Connect to Google Maps

import * as Partials from '../_partials/ResourcesPartials';
import Requirements from '../_partials/_requirements.mdx';
import Configure from '../_partials/_configure.mdx';
import Auth from '../_partials/_auth/_auth-settings.mdx';
import Ssl from '../_partials/_settings/_ssl.mdx';
import Test from '../_partials/_test-connection.mdx';
import Save from '../_partials/_save.mdx';
import Wrapup from '../_partials/_wrapup.mdx';

  

  
  

    

  

The following APIs must be enabled on the Google Cloud project associated with the API key you provide:

- [Distance Matrix API](https://developers.google.com/maps/documentation/distance-matrix)
- [Elevation API](https://developers.google.com/maps/documentation/elevation)
- [Geocoding API](https://developers.google.com/maps/documentation/geocoding)
- [Geolocation API](https://developers.google.com/maps/documentation/geolocation)
- [Roads API](https://developers.google.com/maps/documentation/roads)
- [Time Zone API](https://developers.google.com/maps/documentation/timezone)
- [Places API](https://developers.google.com/maps/documentation/places/web-service)
- [Distance Matrix API](https://developers.google.com/maps/documentation/distance-matrix/overview)
- [Street View API](https://developers.google.com/maps/documentation/streetview/overview)

---

## Connect to Google Search Console

:::tip Enable Google Search Console integration

The Google Search Console integration is an opt-in beta. To enable, navigate to **Settings > Beta** and enable **Google Search Console integration**. 

:::

import * as Partials from '../_partials/ResourcesPartials';
import Requirements from '../_partials/_requirements.mdx';
import Configure from '../_partials/_configure.mdx';
import Auth from '../_partials/_auth/_auth-settings.mdx';
import Ssl from '../_partials/_settings/_ssl.mdx';
import Test from '../_partials/_test-connection.mdx';
import Save from '../_partials/_save.mdx';
import Wrapup from '../_partials/_wrapup.mdx';

---

## Connect to Google Sheets

import * as Partials from '../_partials/ResourcesPartials';
import Requirements from '../_partials/_requirements.mdx';
import Configure from '../_partials/_configure.mdx';
import Auth from '../_partials/_auth/_auth-settings.mdx';
import Ssl from '../_partials/_settings/_ssl.mdx';
import Test from '../_partials/_test-connection.mdx';
import Save from '../_partials/_save.mdx';
import Wrapup from '../_partials/_wrapup.mdx';

  

  
  

  

When building apps on top of Google Sheets, _all users_ in a Retool organization can access and edit sheets that have been shared with the user who completed the authentication process.

---

## Connect to Google Slides

:::note

If you self-host Retool and are using a stable release, reach out to your account manager to enable Google Slides.

:::

import * as Partials from '../_partials/ResourcesPartials';
import Requirements from '../_partials/_requirements.mdx';
import Configure from '../_partials/_configure.mdx';
import Auth from '../_partials/_auth/_auth-settings.mdx';
import Ssl from '../_partials/_settings/_ssl.mdx';
import Test from '../_partials/_test-connection.mdx';
import Save from '../_partials/_save.mdx';
import Wrapup from '../_partials/_wrapup.mdx';

export function ArcadeEmbed() {
  return (
    
      
    
  )
}

  

  
  

## Next steps
Your Google Slides resource is now ready to use. You can [query](../../../queries) your resource from an app or a workflow, or use it as [core tool](../../../agents/guides/tools/use-core-tools) within an agent.

---

## Google integration guides



---

## Integration guides

Retool provides a number of pre-built integrations that enable you to connect third-party providers with Retool as resources. If there isn't a built-in integration for your desired data source, you can also connect any [REST API](./api/rest.mdx) or [GraphQL API](./api/graphql.mdx)

---

## Messaging integration guides



---

## Connect to Microsoft Teams

import * as Partials from '../_partials/ResourcesPartials';
import Requirements from '../_partials/_requirements.mdx';
import Configure from '../_partials/_configure.mdx';
import Auth from '../_partials/_auth/_auth-settings.mdx';
import Ssl from '../_partials/_settings/_ssl.mdx';
import Test from '../_partials/_test-connection.mdx';
import Save from '../_partials/_save.mdx';
import Wrapup from '../_partials/_wrapup.mdx';

---

## Connect to OneSignal

import * as Partials from '../_partials/ResourcesPartials';
import Requirements from '../_partials/_requirements.mdx';
import Configure from '../_partials/_configure.mdx';
import Auth from '../_partials/_auth/_auth-settings.mdx';
import Ssl from '../_partials/_settings/_ssl.mdx';
import Test from '../_partials/_test-connection.mdx';
import Save from '../_partials/_save.mdx';
import Wrapup from '../_partials/_wrapup.mdx';

---

## Connect to SendGrid

import * as Partials from '../_partials/ResourcesPartials';
import Requirements from '../_partials/_requirements.mdx';
import Configure from '../_partials/_configure.mdx';
import Auth from '../_partials/_auth/_auth-settings.mdx';
import Ssl from '../_partials/_settings/_ssl.mdx';
import Test from '../_partials/_test-connection.mdx';
import Save from '../_partials/_save.mdx';
import Wrapup from '../_partials/_wrapup.mdx';

---

## Connect to Slack

import * as Partials from '../_partials/ResourcesPartials';
import Requirements from '../_partials/_requirements.mdx';
import Configure from '../_partials/_configure.mdx';
import Auth from '../_partials/_auth/_auth-settings.mdx';
import Ssl from '../_partials/_settings/_ssl.mdx';
import Test from '../_partials/_test-connection.mdx';
import Save from '../_partials/_save.mdx';
import Wrapup from '../_partials/_wrapup.mdx';

---

## Connect an SMTP server

import * as Partials from '../_partials/ResourcesPartials';
import Requirements from '../_partials/_requirements.mdx';
import Configure from '../_partials/_configure.mdx';
import Auth from '../_partials/_auth/_auth-settings.mdx';
import Ssl from '../_partials/_settings/_ssl.mdx';
import Test from '../_partials/_test-connection.mdx';
import Save from '../_partials/_save.mdx';
import Wrapup from '../_partials/_wrapup.mdx';

---

## Connect to Twilio

import * as Partials from '../_partials/ResourcesPartials';
import Requirements from '../_partials/_requirements.mdx';
import Configure from '../_partials/_configure.mdx';
import Auth from '../_partials/_auth/_auth-settings.mdx';
import Ssl from '../_partials/_settings/_ssl.mdx';
import Test from '../_partials/_test-connection.mdx';
import Save from '../_partials/_save.mdx';
import Wrapup from '../_partials/_wrapup.mdx';

---

## Connect to Amazon S3 and S3-compatible services

import * as Partials from '../_partials/ResourcesPartials';
import Requirements from '../_partials/_requirements.mdx';
import Configure from '../_partials/_configure.mdx';
import Auth from '../_partials/_auth/_auth-settings.mdx';
import Ssl from '../_partials/_settings/_ssl.mdx';
import Test from '../_partials/_test-connection.mdx';
import Save from '../_partials/_save.mdx';
import Wrapup from '../_partials/_wrapup.mdx';

## Configure the CORS policy

---

## Object and file store integration guides



---

## Connect to Asana

import * as Partials from '../_partials/ResourcesPartials';
import Requirements from '../_partials/_requirements.mdx';
import Configure from '../_partials/_configure.mdx';
import Auth from '../_partials/_auth/_auth-settings.mdx';
import Ssl from '../_partials/_settings/_ssl.mdx';
import Test from '../_partials/_test-connection.mdx';
import Save from '../_partials/_save.mdx';
import Wrapup from '../_partials/_wrapup.mdx';

---

## Project management integration guides



---

## Connect to Jira

import * as Partials from '../_partials/ResourcesPartials';
import Requirements from '../_partials/_requirements.mdx';
import Configure from '../_partials/_configure.mdx';
import Auth from '../_partials/_auth/_auth-settings.mdx';
import Ssl from '../_partials/_settings/_ssl.mdx';
import Test from '../_partials/_test-connection.mdx';
import Save from '../_partials/_save.mdx';
import Wrapup from '../_partials/_wrapup.mdx';

  

  
  

  

  See [Jira documentation](https://confluence.atlassian.com/jirakb/how-to-find-cloud-site-id-1272283178.html) to learn how to find your Cloud ID for the `domain` server variable.

---

## Connect to Notion

import * as Partials from '../_partials/ResourcesPartials';
import Requirements from '../_partials/_requirements.mdx';
import Configure from '../_partials/_configure.mdx';
import Auth from '../_partials/_auth/_auth-settings.mdx';
import Ssl from '../_partials/_settings/_ssl.mdx';
import Test from '../_partials/_test-connection.mdx';
import Save from '../_partials/_save.mdx';
import Wrapup from '../_partials/_wrapup.mdx';

---

## Connect to Amazon SNS

import * as Partials from '../_partials/ResourcesPartials';
import Requirements from '../_partials/_requirements.mdx';
import Configure from '../_partials/_configure.mdx';
import Auth from '../_partials/_auth/_auth-settings.mdx';
import Test from '../_partials/_test-connection.mdx';
import Save from '../_partials/_save.mdx';
import Wrapup from '../_partials/_wrapup.mdx';
import JavaDBConnector from '../_partials/_java-dbconnector.mdx';

You can use the Amazon SNS integration in apps and workflows to publish messages to a topic. Once configured, you can [subscribe to the topic using Amazon SQS](https://docs.aws.amazon.com/sns/latest/dg/sns-sqs-as-subscriber.html), enabling you to use [Retool's SQS integration](./amazon-sqs.mdx) to respond to events in your apps and workflows.

  

Set up an Amazon SNS topic for Retool to access. Generate an [SNS policy](https://docs.aws.amazon.com/sns/latest/dg/sns-using-identity-based-policies.html) for that resource with rights to the following actions:

```
"Effect":"Allow",
"Action":[
  "sns:ListTopics",
  "sns:Publish"
]
```

  
  

Set up an Amazon SNS topic for Retool to access. Generate an [SNS policy](https://docs.aws.amazon.com/sns/latest/dg/sns-using-identity-based-policies.html) for that resource with rights to the following actions:

```
"Effect":"Allow",
"Action":[
  "sns:ListTopics",
  "sns:Publish"
]
```

  

import Related from '../_partials/_related-docs.mdx';

---

## Connect to Amazon SQS

import * as Partials from '../_partials/ResourcesPartials';
import Requirements from '../_partials/_requirements.mdx';
import Configure from '../_partials/_configure.mdx';
import Auth from '../_partials/_auth/_auth-settings.mdx';
import Test from '../_partials/_test-connection.mdx';
import Save from '../_partials/_save.mdx';
import Wrapup from '../_partials/_wrapup.mdx';
import JavaDBConnector from '../_partials/_java-dbconnector.mdx';

You can use the Amazon SQS integration in apps and workflows to send, receive, and delete messages from a queue.

  

Set up an Amazon SQS queue for Retool to access. Generate an [SQS policy](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-using-identity-based-policies.html) for that resource with rights to the following actions:

```
"Effect":"Allow",
"Action":[
  "sqs:SendMessage",
  "sqs:ReceiveMessage",
  "sqs:DeleteMessage",
  "sqs:GetQueueAttributes",
  "sqs:ListTopics"
]
```

  
  

Set up an Amazon SQS queue for Retool to access. Generate an [SQS policy](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-using-identity-based-policies.html) for that resource with rights to the following actions:

```
"Effect":"Allow",
"Action":[
  "sqs:SendMessage",
  "sqs:ReceiveMessage",
  "sqs:DeleteMessage",
  "sqs:GetQueueAttributes",
  "sqs:ListTopics"
]
```

  

The prefix that Retool appends to queues.

The prefix that Retool appends to the queue.

import Related from '../_partials/_related-docs.mdx';

---

## Streaming integration guides



---

## Connect to Kafka

import * as Partials from '../_partials/ResourcesPartials';
import Requirements from '../_partials/_requirements.mdx';
import Configure from '../_partials/_configure.mdx';
import Auth from '../_partials/_auth/_auth-settings.mdx';
import Test from '../_partials/_test-connection.mdx';
import Save from '../_partials/_save.mdx';
import Wrapup from '../_partials/_wrapup.mdx';
import JavaDBConnector from '../_partials/_java-dbconnector.mdx';

You can use the Kafka integration in Retool Apps and Retool Workflows to produce, consume, or commit messages to a topic.

  

  
  

If your Kafka implementation's SSL certificates are signed by an internal CA, your Retool deployment cannot connect until you configure it to trust your CA. You do this by setting `NODE_EXTRA_CA_CERTS` to the absolute path of your certificate files. The files need to include one or more trusted certificates in PEM format. For more information, refer to [Configure SSL and custom certificates](../../../../self-hosted/guides/certificates.mdx).

  

The Simple Authentication and Security Layer (SASL) mechanism. Options include `PLAIN`, `SCRAM-SHA-256`, and `SCRAM-SHA-512`. Defaults to `SCRAM-SHA-512`.

The security protocol. Options include `SASL_SSL`, `SSL`, `SASL_PLAINTEXT`, `PLAINTEXT`. Defaults to `SASL_SSL`.

The Kafka brokers in the cluster that you want to connect to, in a comma-separated list.

The Simple Authentication and Security Layer (SASL) mechanism. Options include `PLAIN`, `SCRAM-SHA-256`, and `SCRAM-SHA-512`. Defaults to `SCRAM-SHA-512`.

The security protocol. Options include `SASL_SSL`, `SSL`, `SASL_PLAINTEXT`, `PLAINTEXT`. Defaults to `SASL_SSL`.

The Kafka brokers in the cluster that you want to connect to, in a comma-separated list.

## Query the Kafka resource

When querying the Kafka resource, you can choose from one of three actions:

- Produce messages for a topic
- Consume messages from a topic
- Commit messages in a topic

import FxSvg from '/img/icons/fx.svg';

:::note

Consumer groups are automatically deleted after 7 days without use, unless you [edit Kafka's `offsets.retention.minutes` value](https://kafka.apache.org/documentation/#brokerconfigs_offsets.retention.minutes).

To create a new `Consumer Group` within Retool, click the  button and enter the desired value. After refreshing, the new value appears in the dropdown.

:::

import Related from '../_partials/_related-docs.mdx';

---

## Web search integration guides



---

## Connect to Tavily Web Search

import * as Partials from '../_partials/ResourcesPartials';
import Requirements from '../_partials/_requirements.mdx';
import Configure from '../_partials/_configure.mdx';
import Auth from '../_partials/_auth/_auth-settings.mdx';
import Ssl from '../_partials/_settings/_ssl.mdx';
import Test from '../_partials/_test-connection.mdx';
import Save from '../_partials/_save.mdx';
import Wrapup from '../_partials/_wrapup.mdx';

export function ArcadeEmbed() {
  return (
    
      
    
  )
}

  

  
  

  

No authentication is required to use the Tavily Web Search integration. You can choose to provide your own [Tavily API key](https://docs.tavily.com/documentation/quickstart) if you do not want to be subject to Retool's rate limits (100 calls per 24 hours) on Tavily.

To use your own key, enable the **Provide my own API key** setting, and enter your key in the **Custom API Key** setting.

You must provide your own [Tavily API key](https://docs.tavily.com/documentation/quickstart).

To use your own key, enable the **Provide my own API key** setting, and enter your key in the **Custom API Key** setting.

---

## Manage resources

You can view all resources within your organization in the **Resources** tab. The `•••` menu alongside each resource contains various actions. Some available options include:

- Rename
- Duplicate
- Move to folder
- [Protect resource](../../source-control/guides/protect/resources.mdx) (only available if you use Source Control)
- Delete

You can also access a subset of actions when editing a resource, either from the resource configuration page or when you edit a resource within the app IDE.

Duplicating a resource creates a resource with the same configuration and credentials. This includes authentication tokens used to authenticate with the resource. The duplicate resource also inherits the default permissions of the folder that the resource is created in.

---

## Export table data from Retool Database

You can export Retool Database table data in CSV format to create a backup or migrate to another database. You can also query a table if you want to export and save the data progammatically.

## Export as CSV

You can export Retool Database tables as a comma-separated `.csv` file directly from the editor. Right-click on the table's tab and select **Export CSV**. Retool generates the CSV file, which is then downloaded using your browser.

You can also click  in the toolbar and select **Export CSV**.

## Retrieve data using SQL

You write [SQL queries](../../../queries/guides/sql/queries.mdx) within Retool apps and workflows to interact with Retool Database table data. If you need to retrieve table data and store it elsewhere, write an SQL query such as:

```sql title="Retrieve table data"
select * from customers
```

:::warning
Avoid retrieving large datasets using SQL. If you need to export a table with many rows, export it as a CSV.
:::

---

## Access Retool Database tables externally

Retool provides connection strings as [PSQL commands](https://www.postgresql.org/docs/current/app-psql.html) and [PostgreSQL connection URLs](https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-CONNSTRING) for cloud-hosted organizations to access their Retool Database data externally.

## Get connection details

:::info
Only admin users can view connection string information.
:::

You can copy the PSQL command directly to the command line, or use the PostgreSQL connection URL in external applications. For example, use the connection URL in PostgreSQL clients such as [PgAdmin](https://www.pgadmin.org/), platforms such as Zapier, or any ORM which connects to PostgreSQL. Some tools may not support connection strings with role names and passwords, so you may need to enter these fields directly.

export function ArcadeEmbed() {
  return (
    
      
    
  )
}

Tables created using connection strings might not immediately appear in the Retool Database editor. You can select the table from the sidebar to open it.

---

## Customize field views in Retool Database

The Retool Database editor has a number of view options for table fields to customize the experience. Click  in the field header to display the contextual menu with additional options. You can also click  in the toolbar to view field options.

## Pin a field

Select Pin this field to keep the field visible on the left-side of the table. Pinned fields remain in view when you horizontally scroll. 

export function PinField() {
  return (
    
      
    
  )
}

## Hide and reorder fields

Select Hide this field to hide the field from view. Hidden fields are not deleted from the table and only hidden from view. You can also control the visibility of all fields, and change the order of fields in the table, from the  options in the toolbar. 

export function HideReorder() {
  return (
    
      
    
  )
}

---

## Filter and sort Retool Database table rows

You can search Retool Database table data, apply filters, and customize sort options in the editor.

## Search records

Click  or press Mod f, then enter a search term to search through all records in the current table. Any results are highlighted and you can move between results using the search box.

Search table data.

## Filter records

Click  to define filter conditions and show only records that match all of them. For example, you can show only records with a `quantity` field value less than `9000` and contain `the` in the `name` field value.

You can add multiple field filters from the **Field options** menu. Click the field name in the header and select **Filter by this field**.

Filter table data.

Click **Apply filter** to filter records. The  popup remains active while filters are applied and displays the number of filter conditions in use. To disable the filter, remove all filters and click **Apply filter** again.

## Sort records

You can sort rows by columns in either ascending or descending order, and sort by multiple columns. Click  in the field header and select the sort mode you want to use. You can also click  in the toolbar to open sorting options.

Sort table records.

---

## Retool Database how-to guides



---

## Link Retool Database tables

You can link rows between tables in the Retool Database editor to see relevant data in one place. For example, you could link a table with customer information to another table with subscriptions.

The **Foreign Key** field references a field from another table that contains unique values, such as the primary key. Once a value is set, you can view the relevant linked row. 

## Add a Foreign Key field

To add a foreign key field to a table:

1. Click  to the right of the last field.
1. Select **Foreign key** as the field type.
1. Specify the table and field on which to link. For example, the `id` field of a `subscriptions` table. You can only select fields with unique values.
1. Set a value in the new field that corresponds to a value of the field you selected. For example, a subscription ID.

## View linked table data

Once linked, you can click  within the cell to open the referenced row. You can then edit the referenced table data directly without needing to switch to another table.

The values you specify for foreign keys do not need to be unique. You can link to the same unique row on the linked table multiple times (e.g., multiple orders for the same customer).

export function ArcadeEmbed() {
  return (
    
      
    
  )
}

---

## Manage table data in Retool Database

You can manage data for your Retool Database tables using the editor. The spreadsheet-like interface enables you to add, edit, and remove rows without needing to write SQL statements.

## Add a row

Click  in the toolbar and select . You can also use the keyboard shortcut Mod Return to quickly add new rows.

## Edit row data

Double-click on a cell to edit its value. The editor presents different input options depending on the field type. For example, editing a **Checkbox** field value (i.e., the `BOOL` PostgreSQL column type) presents the choice of setting `TRUE` or `FALSE`.

Edit a cell value.

## Delete rows

To delete rows of data, select them using the checkbox and click the red **Delete** button at the bottom of the window.

:::danger
Deleting a field permanently removes it and any data it contains from the table. You should [export table data](./export-data.mdx) before making any significant changes.

:::

---

## Manage Retool Database table fields

A Retool Database field is a table column for a specific type of data. Each field maps to a supported [PostgreSQL column type](#available-fields-and-types) that specifies both the type and format of data. For example, the **Number** field is for number values, but you can specify which PostgreSQL type to use, such as `integer`, `float`, or `decimal`.

## Available fields and types

When adding or editing table fields, you must specify the correct PostgreSQL column type to ensure that only valid data is entered. It also configures additional methods of input and determines how best to filter data.

Use the app below to explore Retool Database fields and supported PostgreSQL types.

## Add a new field

To add a field, click  to the right of the last column. Specify the name and type, then click **Save**.

Add a field.

You can also add a new field to the left or right of existing fields; Click the field name to open the **Field options** menu and select either  or .

Insert a field to the left or right of an existing field.

When adding a field, you [configure its options](#configure-field-options) based on your requirements.

## Remove a field

To remove a field, click  in the field header and select **Delete** in the toolbar.

:::danger
Deleting a field permanently removes it and any data it contains from the table. You should [export table data](./export-data.mdx) before making any significant changes.

:::

Select the rows to delete.

## Configure field options

You can configure additional options to refine the values for a field to further customize the data it stores.

Configure field options.

#### Nullable

Set **Nullable** to **true** to allow empty values for the field. This is useful for optional information that isn't required. For required fields, such as an order number, set this to **false**.

#### Unique

The **UUID** and **auto-incrementing integer ID** fields require unique values by default. You can also specify whether other fields should require unique values by setting **Unique** to **true**. When enabled, each row value must be unique. This is useful for unique data, such as a customer's email address or order number.

#### Default value

You can optionally specify a _default value_ for a field if a new row is added without explicitly setting its value. Retool Database supports a manually specified default value or an SQL expression. An SQL expression is useful for default values that are dynamically set, such as a date:

```title="Default value of the current date"
CURRENT_DATE
```

Refer to [PostgreSQL's official documentation](https://www.postgresql.org/docs/9.5/datatype.html) to learn more about PostgreSQL schemas and data types.

---

## Use Retool Database with multiple environments

You can use Retool Database with [multiple environments](../../../org-users/guides/configuration/environments.mdx#configure-environment-resources) to develop apps and workflows using nonproduction data. You can then use schema migrations to sync table schema changes between environments.

The Retool Database resource is automatically configured for any additional environments in use by your organization. Each environment contains an isolated set of tables—modifications in one environment does not impact other environments.

## Select the environment

The Retool Database editor uses table data for the currently selected environment, which is _production_ by default. Use the **Environment** menu in the lower-left to select which environment data to use.

Switch environments in the Retool Database editor.

## Migrate table schema between environments

The **Retool Database** resource is automatically configured for all environments your organization uses. Using *schema migrations*, you can update Retool Database table schemas in one environment and copy these changes to another environment. This allows you to iterate on your database schema in testing environments and deploy updates to users on production apps only when changes are ready.

### Schema migration

You can create a schema migration after creating, updating, or removing any tables or fields in any environment. Click the **Environment** menu in the lower-left and select **Schema migration**.

The **History** view shows past migrations, including the executed SQL and whether the migration completed successfully. Click **New migration** to start creating a migration.

On the new migration modal, you can choose the source and destination environments using the dropdowns and view the schema differences between the two environments. For example, the following shows the addition of two fields: an integer field named `age` and a text field named `avatar_url`. Each are present in the staging environment and not in production.

You can click the checkboxes next to the modified tables or fields to exclude changes from the migration.

#### Preview and edit SQL

In the GUI view, the SQL a migration executes is generated automatically. To preview this SQL, click the **SQL** tab. You can edit this SQL to execute custom migrations, but you cannot return to the GUI view after making changes to the SQL. To return to the GUI view, click the **Undo SQL edits** button to reset the SQL changes.

### Execute migrations

To run schema migrations, select the confirmation checkbox and click **Migrate**. On the **History** modal, your migration will display as **Running** and marked as **Completed** when it's finished. You can then navigate back to your destination environment to see the changes reflected on that database.

### Failed migrations

Migrations with errors show as **Failed** in the **History** modal. When a migration fails, none of its changes apply to your database, so after fixing any errors you can run a migration containing the same changes. The detail view for these failed migrations contains the related PostgreSQL error message.

---

## Shell script resource