 .. Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you under the Apache License, Version 2.0 (the
    "License"); you may not use this file except in compliance
    with the License.  You may obtain a copy of the License at

 ..   http://www.apache.org/licenses/LICENSE-2.0

 .. Unless required by applicable law or agreed to in writing,
    software distributed under the License is distributed on an
    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    KIND, either express or implied.  See the License for the
    specific language governing permissions and limitations
    under the License.



.. _howto/connection:dbt-cloud:

Connecting to dbt Cloud
=======================

After installing the dbt Cloud provider in your Airflow environment, the corresponding connection type of
``dbt_cloud`` will be made available. The following describes how to configure an API token and optionally
provide an Account ID and/or a Tenant name for your dbt Cloud connection.

Default Connection ID
~~~~~~~~~~~~~~~~~~~~~

All hooks and operators related to dbt Cloud use ``dbt_cloud_default`` by default.


Authenticating to the dbt Cloud API
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

To interact with the dbt Cloud API in Airflow, either a
`User API Token <https://docs.getdbt.com/docs/dbt-cloud/dbt-cloud-api/user-tokens>`__ or a
`Service Account API Token <https://docs.getdbt.com/docs/dbt-cloud/dbt-cloud-api/service-tokens>`__ is
required.


Configuring the connection
~~~~~~~~~~~~~~~~~~~~~~~~~~

Password (required)
    The API token to use when authenticating to the dbt Cloud API.

    If using the Connection form in the Airflow UI, the token can also be stored in the "API Token" field.

Login (optional)
    The Account ID to be used as the default Account ID for dbt Cloud operators or
    :class:`~airflow.providers.dbt.cloud.hooks.dbt.DbtCloudHook` methods. If an Account ID is provided in the
    connection, you are not required to pass ``account_id`` to operators or hook methods. The ``account_id``
    value will be retrieved from the Airflow connection instead. If needed, the ``account_id`` can still be
    explicitly passed to an operator or hook method as an override the default value configured in the
    connection.

    If using the Connection form in the Airflow UI, the Account ID can also be stored in the "Account ID"
    field.

    .. note::

      If an Account ID is not provided in an Airflow connection, ``account_id`` *must* be explicitly passed to
      an operator or hook method.

Schema (optional)
    The Tenant name for your dbt Cloud environment (i.e. https://my-tenant.getdbt.com). This is particularly
    useful when using a single-tenant dbt Cloud instance. If a Tenant name is not provided, "cloud"
    will be used as the default value (i.e. https://cloud.getdbt.com) assuming a multi-tenant instance.

When specifying the connection as an environment variable, you should specify it following the standard syntax
of a database connection. Note that all components of the URI should be URL-encoded.


For example, to add a connection with the connection ID of "dbt_cloud_default":

    When specifying an Account ID:

    .. code-block:: bash

        export AIRFLOW_CONN_DBT_CLOUD_DEFAULT='dbt-cloud://account_id:api_token@'

    When *not* specifying an Account ID:

    .. code-block:: bash

        export AIRFLOW_CONN_DBT_CLOUD_DEFAULT='dbt-cloud://:api_token@'

    When specifying Tenant name:

    .. code-block:: bash

        export AIRFLOW_CONN_DBT_CLOUD_DEFAULT='dbt-cloud://:api_token@:/my-tenant'

You can refer to the documentation on
:ref:`creating connections via environment variables <environment_variables_secrets_backend>` for more
information.
