<!--
 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.
 -->

# Apache Airflow Python Client

# Overview

To facilitate management, Apache Airflow supports a range of REST API endpoints across its
objects.
This section provides an overview of the API design, methods, and supported use cases.

Most of the endpoints accept `JSON` as input and return `JSON` responses.
This means that you must usually add the following headers to your request:

```
Content-type: application/json
Accept: application/json
```

## Resources

The term `resource` refers to a single type of object in the Airflow metadata. An API is broken up by its
endpoint's corresponding resource.
The name of a resource is typically plural and expressed in camelCase. Example: `dagRuns`.

Resource names are used as part of endpoint URLs, as well as in API parameters and responses.

## CRUD Operations

The platform supports **Create**, **Read**, **Update**, and **Delete** operations on most resources.
You can review the standards for these operations and their standard parameters below.

Some endpoints have special behavior as exceptions.

### Create

To create a resource, you typically submit an HTTP `POST` request with the resource's required metadata
in the request body.
The response returns a `201 Created` response code upon success with the resource's metadata, including
its internal `id`, in the response body.

### Read

The HTTP `GET` request can be used to read a resource or to list a number of resources.

A resource's `id` can be submitted in the request parameters to read a specific resource.
The response usually returns a `200 OK` response code upon success, with the resource's metadata in
the response body.

If a `GET` request does not include a specific resource `id`, it is treated as a list request.
The response usually returns a `200 OK` response code upon success, with an object containing a list
of resources' metadata in the response body.

When reading resources, some common query parameters are usually available. e.g.:

```
/api/v2/connections?limit=25&offset=25
```

|Query Parameter|Type|Description|
|---------------|----|-----------|
|limit|integer|Maximum number of objects to fetch. Usually 25 by default|
|offset|integer|Offset after which to start returning objects. For use with limit query parameter.|

### Update

Updating a resource requires the resource `id`, and is typically done using an HTTP `PATCH` request,
with the fields to modify in the request body.
The response usually returns a `200 OK` response code upon success, with information about the modified
resource in the response body.

### Delete

Deleting a resource requires the resource `id` and is typically executing via an HTTP `DELETE` request.
The response usually returns a `204 No Content` response code upon success.

## Conventions

- Resource names are plural and expressed in camelCase.
- Names are consistent between URL parameter name and field name.

- Field names are in snake_case.

```json
{
    \"name\": \"string\",
    \"slots\": 0,
    \"occupied_slots\": 0,
    \"used_slots\": 0,
    \"queued_slots\": 0,
    \"open_slots\": 0
}
```

### Update Mask

Update mask is available as a query parameter in patch endpoints. It is used to notify the
API which fields you want to update. Using `update_mask` makes it easier to update objects
by helping the server know which fields to update in an object instead of updating all fields.
The update request ignores any fields that aren't specified in the field mask, leaving them with
their current values.

Example:

```python
import requests

resource = requests.get("/resource/my-id").json()
resource["my_field"] = "new-value"
requests.patch("/resource/my-id?update_mask=my_field", data=json.dumps(resource))
```

## Versioning and Endpoint Lifecycle

- API versioning is not synchronized to specific releases of the Apache Airflow.
- APIs are designed to be backward compatible.
- Any changes to the API will first go through a deprecation phase.

# Trying the API

You can use a third party client, such as [curl](https://curl.haxx.se/), [HTTPie](https://httpie.org/),
[Postman](https://www.postman.com/) or [the Insomnia rest client](https://insomnia.rest/) to test
the Apache Airflow API.

Note that you will need to pass authentication credentials. If your Airflow deployment supports
**Bearer token authentication**, you can use the following example:

For example, here is how to pause a DAG with `curl`, using a Bearer token:

```bash
curl -X PATCH 'https://example.com/api/v2/dags/{dag_id}?update_mask=is_paused' \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer YOUR_ACCESS_TOKEN' \
  -d '{
      \"is_paused\": true
  }'
```

Using a graphical tool such as [Postman](https://www.postman.com/) or [Insomnia](https://insomnia.rest/),
it is possible to import the API specifications directly:

1. Download the API specification by clicking the **Download** button at top of this document.
2. Import the JSON specification in the graphical tool of your choice.

  - In *Postman*, you can click the **import** button at the top
  - With *Insomnia*, you can just drag-and-drop the file on the UI

Note that with *Postman*, you can also generate code snippets by selecting a request and clicking on
the **Code** button.

## Enabling CORS

[Cross-origin resource sharing (CORS)](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS)
is a browser security feature that restricts HTTP requests that are
initiated from scripts running in the browser.

For details on enabling/configuring CORS, see
[Enabling CORS](https://airflow.apache.org/docs/apache-airflow/stable/security/api.html).

# Authentication

To be able to meet the requirements of many organizations, Airflow supports many authentication methods,
and it is even possible to add your own method.

The default is to deny all requests.

For details on configuring the authentication, see
[API Authorization](https://airflow.apache.org/docs/apache-airflow/stable/security/api.html).

# Errors

We follow the error response format proposed in [RFC 7807](https://tools.ietf.org/html/rfc7807)
also known as Problem Details for HTTP APIs. As with our normal API responses,
your client must be prepared to gracefully handle additional members of the response.

## Unauthenticated

This indicates that the request has not been applied because it lacks valid authentication
credentials for the target resource. Please check that you have valid credentials.

## PermissionDenied

This response means that the server understood the request but refuses to authorize
it because it lacks sufficient rights to the resource. It happens when you do not have the
necessary permission to execute the action you performed. You need to get the appropriate
permissions in other to resolve this error.

## BadRequest

This response means that the server cannot or will not process the request due to something
that is perceived to be a client error (e.g., malformed request syntax, invalid request message
framing, or deceptive request routing). To resolve this, please ensure that your syntax is correct.

## NotFound

This client error response indicates that the server cannot find the requested resource.

## MethodNotAllowed

Indicates that the request method is known by the server but is not supported by the target resource.

## NotAcceptable

The target resource does not have a current representation that would be acceptable to the user
agent, according to the proactive negotiation header fields received in the request, and the
server is unwilling to supply a default representation.

## AlreadyExists

The request could not be completed due to a conflict with the current state of the target
resource, e.g. the resource it tries to create already exists.

## Unknown

This means that the server encountered an unexpected condition that prevented it from
fulfilling the request.

This Python package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project:

- API version: 2.9.0
- Package version: 2.9.0
- Build package: org.openapitools.codegen.languages.PythonClientCodegen

For more information, please visit [https://airflow.apache.org](https://airflow.apache.org)

## Requirements.

Python >=3.9

## Installation & Usage

### pip install

You can install the client using standard Python installation tools. It is hosted
in PyPI with `apache-airflow-client` package id so the easiest way to get the latest
version is to run:

```bash
pip install apache-airflow-client
```

If the python package is hosted on a repository, you can install directly using:

```bash
pip install git+https://github.com/apache/airflow-client-python.git
```

### Import check

Then import the package:

```python
import airflow_client.client
```

## Getting Started

Before attempting the following examples ensure you have an account with API access.
As an example you can create an account for usage with the API as follows using the Airflow CLI.

```bash
airflow users create -u admin-api -e admin-api@example.com -f admin-api -l admin-api -p $PASSWORD -r Admin
```

Please follow the [installation procedure](#installation--usage) and then run the following:

```python
import airflow_client.client
import requests
from airflow_client.client.rest import ApiException
from pprint import pprint
from pydantic import BaseModel


# What we expect back from auth/token
class AirflowAccessTokenResponse(BaseModel):
    access_token: str


# An optional helper function to retrieve an access token
def get_airflow_client_access_token(
    host: str,
    username: str,
    password: str,
) -> str:
    url = f"{host}/auth/token"
    payload = {
        "username": username,
        "password": password,
    }
    headers = {"Content-Type": "application/json"}
    response = requests.post(url, json=payload, headers=headers)
    if response.status_code != 201:
        raise RuntimeError(f"Failed to get access token: {response.status_code} {response.text}")
    response_success = AirflowAccessTokenResponse(**response.json())
    return response_success.access_token


# Defining the host is optional and defaults to http://localhost
# See configuration.py for a list of all supported configuration parameters.
host = "http://localhost"
configuration = airflow_client.client.Configuration(host=host)

# The client must configure the authentication and authorization parameters
# in accordance with the API server security policy.
# Examples for each auth method are provided below, use the example that
# satisfies your auth use case.

configuration.access_token = get_airflow_client_access_token(
    host=host,
    username="admin-api",
    password=os.environ["PASSWORD"],
)

# Enter a context with an instance of the API client
with airflow_client.client.ApiClient(configuration) as api_client:
    # Create an instance of the API class
    api_instance = airflow_client.client.AssetApi(api_client)
    create_asset_events_body = airflow_client.client.CreateAssetEventsBody()  # CreateAssetEventsBody |

    try:
        # Create Asset Event
        api_response = api_instance.create_asset_event(create_asset_events_body)
        print("The response of AssetApi->create_asset_event:\n")
        pprint(api_response)
    except ApiException as e:
        print("Exception when calling AssetApi->create_asset_event: %s\n" % e)
```

## Documentation for API Endpoints

All URIs are relative to *http://localhost*

Class | Method | HTTP request | Description
------------ | ------------- | ------------- | -------------
*AssetApi* | [**create_asset_event**](docs/AssetApi.md#create_asset_event) | **POST** /api/v2/assets/events | Create Asset Event
*AssetApi* | [**delete_asset_queued_events**](docs/AssetApi.md#delete_asset_queued_events) | **DELETE** /api/v2/assets/{asset_id}/queuedEvents | Delete Asset Queued Events
*AssetApi* | [**delete_dag_asset_queued_event**](docs/AssetApi.md#delete_dag_asset_queued_event) | **DELETE** /api/v2/dags/{dag_id}/assets/{asset_id}/queuedEvents | Delete Dag Asset Queued Event
*AssetApi* | [**delete_dag_asset_queued_events**](docs/AssetApi.md#delete_dag_asset_queued_events) | **DELETE** /api/v2/dags/{dag_id}/assets/queuedEvents | Delete Dag Asset Queued Events
*AssetApi* | [**get_asset**](docs/AssetApi.md#get_asset) | **GET** /api/v2/assets/{asset_id} | Get Asset
*AssetApi* | [**get_asset_alias**](docs/AssetApi.md#get_asset_alias) | **GET** /api/v2/assets/aliases/{asset_alias_id} | Get Asset Alias
*AssetApi* | [**get_asset_aliases**](docs/AssetApi.md#get_asset_aliases) | **GET** /api/v2/assets/aliases | Get Asset Aliases
*AssetApi* | [**get_asset_events**](docs/AssetApi.md#get_asset_events) | **GET** /api/v2/assets/events | Get Asset Events
*AssetApi* | [**get_asset_queued_events**](docs/AssetApi.md#get_asset_queued_events) | **GET** /api/v2/assets/{asset_id}/queuedEvents | Get Asset Queued Events
*AssetApi* | [**get_assets**](docs/AssetApi.md#get_assets) | **GET** /api/v2/assets | Get Assets
*AssetApi* | [**get_dag_asset_queued_event**](docs/AssetApi.md#get_dag_asset_queued_event) | **GET** /api/v2/dags/{dag_id}/assets/{asset_id}/queuedEvents | Get Dag Asset Queued Event
*AssetApi* | [**get_dag_asset_queued_events**](docs/AssetApi.md#get_dag_asset_queued_events) | **GET** /api/v2/dags/{dag_id}/assets/queuedEvents | Get Dag Asset Queued Events
*AssetApi* | [**materialize_asset**](docs/AssetApi.md#materialize_asset) | **POST** /api/v2/assets/{asset_id}/materialize | Materialize Asset
*BackfillApi* | [**cancel_backfill**](docs/BackfillApi.md#cancel_backfill) | **PUT** /api/v2/backfills/{backfill_id}/cancel | Cancel Backfill
*BackfillApi* | [**create_backfill**](docs/BackfillApi.md#create_backfill) | **POST** /api/v2/backfills | Create Backfill
*BackfillApi* | [**create_backfill_dry_run**](docs/BackfillApi.md#create_backfill_dry_run) | **POST** /api/v2/backfills/dry_run | Create Backfill Dry Run
*BackfillApi* | [**get_backfill**](docs/BackfillApi.md#get_backfill) | **GET** /api/v2/backfills/{backfill_id} | Get Backfill
*BackfillApi* | [**list_backfills**](docs/BackfillApi.md#list_backfills) | **GET** /api/v2/backfills | List Backfills
*BackfillApi* | [**pause_backfill**](docs/BackfillApi.md#pause_backfill) | **PUT** /api/v2/backfills/{backfill_id}/pause | Pause Backfill
*BackfillApi* | [**unpause_backfill**](docs/BackfillApi.md#unpause_backfill) | **PUT** /api/v2/backfills/{backfill_id}/unpause | Unpause Backfill
*ConfigApi* | [**get_config**](docs/ConfigApi.md#get_config) | **GET** /api/v2/config | Get Config
*ConfigApi* | [**get_config_value**](docs/ConfigApi.md#get_config_value) | **GET** /api/v2/config/section/{section}/option/{option} | Get Config Value
*ConnectionApi* | [**bulk_connections**](docs/ConnectionApi.md#bulk_connections) | **PATCH** /api/v2/connections | Bulk Connections
*ConnectionApi* | [**create_default_connections**](docs/ConnectionApi.md#create_default_connections) | **POST** /api/v2/connections/defaults | Create Default Connections
*ConnectionApi* | [**delete_connection**](docs/ConnectionApi.md#delete_connection) | **DELETE** /api/v2/connections/{connection_id} | Delete Connection
*ConnectionApi* | [**get_connection**](docs/ConnectionApi.md#get_connection) | **GET** /api/v2/connections/{connection_id} | Get Connection
*ConnectionApi* | [**get_connections**](docs/ConnectionApi.md#get_connections) | **GET** /api/v2/connections | Get Connections
*ConnectionApi* | [**patch_connection**](docs/ConnectionApi.md#patch_connection) | **PATCH** /api/v2/connections/{connection_id} | Patch Connection
*ConnectionApi* | [**post_connection**](docs/ConnectionApi.md#post_connection) | **POST** /api/v2/connections | Post Connection
*ConnectionApi* | [**test_connection**](docs/ConnectionApi.md#test_connection) | **POST** /api/v2/connections/test | Test Connection
*DAGApi* | [**delete_dag**](docs/DAGApi.md#delete_dag) | **DELETE** /api/v2/dags/{dag_id} | Delete Dag
*DAGApi* | [**get_dag**](docs/DAGApi.md#get_dag) | **GET** /api/v2/dags/{dag_id} | Get Dag
*DAGApi* | [**get_dag_details**](docs/DAGApi.md#get_dag_details) | **GET** /api/v2/dags/{dag_id}/details | Get Dag Details
*DAGApi* | [**get_dag_tags**](docs/DAGApi.md#get_dag_tags) | **GET** /api/v2/dagTags | Get Dag Tags
*DAGApi* | [**get_dags**](docs/DAGApi.md#get_dags) | **GET** /api/v2/dags | Get Dags
*DAGApi* | [**patch_dag**](docs/DAGApi.md#patch_dag) | **PATCH** /api/v2/dags/{dag_id} | Patch Dag
*DAGApi* | [**patch_dags**](docs/DAGApi.md#patch_dags) | **PATCH** /api/v2/dags | Patch Dags
*DAGParsingApi* | [**reparse_dag_file**](docs/DAGParsingApi.md#reparse_dag_file) | **PUT** /api/v2/parseDagFile/{file_token} | Reparse Dag File
*DagReportApi* | [**get_dag_reports**](docs/DagReportApi.md#get_dag_reports) | **GET** /api/v2/dagReports | Get Dag Reports
*DagRunApi* | [**clear_dag_run**](docs/DagRunApi.md#clear_dag_run) | **POST** /api/v2/dags/{dag_id}/dagRuns/{dag_run_id}/clear | Clear Dag Run
*DagRunApi* | [**delete_dag_run**](docs/DagRunApi.md#delete_dag_run) | **DELETE** /api/v2/dags/{dag_id}/dagRuns/{dag_run_id} | Delete Dag Run
*DagRunApi* | [**get_dag_run**](docs/DagRunApi.md#get_dag_run) | **GET** /api/v2/dags/{dag_id}/dagRuns/{dag_run_id} | Get Dag Run
*DagRunApi* | [**get_dag_runs**](docs/DagRunApi.md#get_dag_runs) | **GET** /api/v2/dags/{dag_id}/dagRuns | Get Dag Runs
*DagRunApi* | [**get_list_dag_runs_batch**](docs/DagRunApi.md#get_list_dag_runs_batch) | **POST** /api/v2/dags/{dag_id}/dagRuns/list | Get List Dag Runs Batch
*DagRunApi* | [**get_upstream_asset_events**](docs/DagRunApi.md#get_upstream_asset_events) | **GET** /api/v2/dags/{dag_id}/dagRuns/{dag_run_id}/upstreamAssetEvents | Get Upstream Asset Events
*DagRunApi* | [**wait_dag_run_until_finished**](docs/DagRunApi.md#wait_dag_run_until_finished) | **GET** /api/v2/dags/{dag_id}/dagRuns/{dag_run_id}/wait | Experimental: Wait for a dag run to complete, and return task results if requested.
*DagRunApi* | [**patch_dag_run**](docs/DagRunApi.md#patch_dag_run) | **PATCH** /api/v2/dags/{dag_id}/dagRuns/{dag_run_id} | Patch Dag Run
*DagRunApi* | [**trigger_dag_run**](docs/DagRunApi.md#trigger_dag_run) | **POST** /api/v2/dags/{dag_id}/dagRuns | Trigger Dag Run
*DagSourceApi* | [**get_dag_source**](docs/DagSourceApi.md#get_dag_source) | **GET** /api/v2/dagSources/{dag_id} | Get Dag Source
*DagStatsApi* | [**get_dag_stats**](docs/DagStatsApi.md#get_dag_stats) | **GET** /api/v2/dagStats | Get Dag Stats
*DagVersionApi* | [**get_dag_version**](docs/DagVersionApi.md#get_dag_version) | **GET** /api/v2/dags/{dag_id}/dagVersions/{version_number} | Get Dag Version
*DagVersionApi* | [**get_dag_versions**](docs/DagVersionApi.md#get_dag_versions) | **GET** /api/v2/dags/{dag_id}/dagVersions | Get Dag Versions
*DagWarningApi* | [**list_dag_warnings**](docs/DagWarningApi.md#list_dag_warnings) | **GET** /api/v2/dagWarnings | List Dag Warnings
*EventLogApi* | [**get_event_log**](docs/EventLogApi.md#get_event_log) | **GET** /api/v2/eventLogs/{event_log_id} | Get Event Log
*EventLogApi* | [**get_event_logs**](docs/EventLogApi.md#get_event_logs) | **GET** /api/v2/eventLogs | Get Event Logs
*ExtraLinksApi* | [**get_extra_links**](docs/ExtraLinksApi.md#get_extra_links) | **GET** /api/v2/dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances/{task_id}/links | Get Extra Links
*ImportErrorApi* | [**get_import_error**](docs/ImportErrorApi.md#get_import_error) | **GET** /api/v2/importErrors/{import_error_id} | Get Import Error
*ImportErrorApi* | [**get_import_errors**](docs/ImportErrorApi.md#get_import_errors) | **GET** /api/v2/importErrors | Get Import Errors
*JobApi* | [**get_jobs**](docs/JobApi.md#get_jobs) | **GET** /api/v2/jobs | Get Jobs
*LoginApi* | [**login**](docs/LoginApi.md#login) | **GET** /api/v2/auth/login | Login
*LoginApi* | [**logout**](docs/LoginApi.md#logout) | **GET** /api/v2/auth/logout | Logout
*MonitorApi* | [**get_health**](docs/MonitorApi.md#get_health) | **GET** /api/v2/monitor/health | Get Health
*PluginApi* | [**get_plugins**](docs/PluginApi.md#get_plugins) | **GET** /api/v2/plugins | Get Plugins
*PoolApi* | [**bulk_pools**](docs/PoolApi.md#bulk_pools) | **PATCH** /api/v2/pools | Bulk Pools
*PoolApi* | [**delete_pool**](docs/PoolApi.md#delete_pool) | **DELETE** /api/v2/pools/{pool_name} | Delete Pool
*PoolApi* | [**get_pool**](docs/PoolApi.md#get_pool) | **GET** /api/v2/pools/{pool_name} | Get Pool
*PoolApi* | [**get_pools**](docs/PoolApi.md#get_pools) | **GET** /api/v2/pools | Get Pools
*PoolApi* | [**patch_pool**](docs/PoolApi.md#patch_pool) | **PATCH** /api/v2/pools/{pool_name} | Patch Pool
*PoolApi* | [**post_pool**](docs/PoolApi.md#post_pool) | **POST** /api/v2/pools | Post Pool
*ProviderApi* | [**get_providers**](docs/ProviderApi.md#get_providers) | **GET** /api/v2/providers | Get Providers
*TaskApi* | [**get_task**](docs/TaskApi.md#get_task) | **GET** /api/v2/dags/{dag_id}/tasks/{task_id} | Get Task
*TaskApi* | [**get_tasks**](docs/TaskApi.md#get_tasks) | **GET** /api/v2/dags/{dag_id}/tasks | Get Tasks
*TaskInstanceApi* | [**get_extra_links**](docs/TaskInstanceApi.md#get_extra_links) | **GET** /api/v2/dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances/{task_id}/links | Get Extra Links
*TaskInstanceApi* | [**get_log**](docs/TaskInstanceApi.md#get_log) | **GET** /api/v2/dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances/{task_id}/logs/{try_number} | Get Log
*TaskInstanceApi* | [**get_mapped_task_instance**](docs/TaskInstanceApi.md#get_mapped_task_instance) | **GET** /api/v2/dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances/{task_id}/{map_index} | Get Mapped Task Instance
*TaskInstanceApi* | [**get_mapped_task_instance_tries**](docs/TaskInstanceApi.md#get_mapped_task_instance_tries) | **GET** /api/v2/dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances/{task_id}/{map_index}/tries | Get Mapped Task Instance Tries
*TaskInstanceApi* | [**get_mapped_task_instance_try_details**](docs/TaskInstanceApi.md#get_mapped_task_instance_try_details) | **GET** /api/v2/dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances/{task_id}/{map_index}/tries/{task_try_number} | Get Mapped Task Instance Try Details
*TaskInstanceApi* | [**get_mapped_task_instances**](docs/TaskInstanceApi.md#get_mapped_task_instances) | **GET** /api/v2/dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances/{task_id}/listMapped | Get Mapped Task Instances
*TaskInstanceApi* | [**get_task_instance**](docs/TaskInstanceApi.md#get_task_instance) | **GET** /api/v2/dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances/{task_id} | Get Task Instance
*TaskInstanceApi* | [**get_task_instance_dependencies**](docs/TaskInstanceApi.md#get_task_instance_dependencies) | **GET** /api/v2/dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances/{task_id}/dependencies | Get Task Instance Dependencies
*TaskInstanceApi* | [**get_task_instance_dependencies_by_map_index**](docs/TaskInstanceApi.md#get_task_instance_dependencies_by_map_index) | **GET** /api/v2/dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances/{task_id}/{map_index}/dependencies | Get Task Instance Dependencies
*TaskInstanceApi* | [**get_task_instance_tries**](docs/TaskInstanceApi.md#get_task_instance_tries) | **GET** /api/v2/dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances/{task_id}/tries | Get Task Instance Tries
*TaskInstanceApi* | [**get_task_instance_try_details**](docs/TaskInstanceApi.md#get_task_instance_try_details) | **GET** /api/v2/dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances/{task_id}/tries/{task_try_number} | Get Task Instance Try Details
*TaskInstanceApi* | [**get_task_instances**](docs/TaskInstanceApi.md#get_task_instances) | **GET** /api/v2/dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances | Get Task Instances
*TaskInstanceApi* | [**get_task_instances_batch**](docs/TaskInstanceApi.md#get_task_instances_batch) | **POST** /api/v2/dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances/list | Get Task Instances Batch
*TaskInstanceApi* | [**patch_task_instance**](docs/TaskInstanceApi.md#patch_task_instance) | **PATCH** /api/v2/dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances/{task_id} | Patch Task Instance
*TaskInstanceApi* | [**patch_task_instance_by_map_index**](docs/TaskInstanceApi.md#patch_task_instance_by_map_index) | **PATCH** /api/v2/dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances/{task_id}/{map_index} | Patch Task Instance
*TaskInstanceApi* | [**patch_task_instance_dry_run**](docs/TaskInstanceApi.md#patch_task_instance_dry_run) | **PATCH** /api/v2/dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances/{task_id}/dry_run | Patch Task Instance Dry Run
*TaskInstanceApi* | [**patch_task_instance_dry_run_by_map_index**](docs/TaskInstanceApi.md#patch_task_instance_dry_run_by_map_index) | **PATCH** /api/v2/dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances/{task_id}/{map_index}/dry_run | Patch Task Instance Dry Run
*TaskInstanceApi* | [**post_clear_task_instances**](docs/TaskInstanceApi.md#post_clear_task_instances) | **POST** /api/v2/dags/{dag_id}/clearTaskInstances | Post Clear Task Instances
*VariableApi* | [**bulk_variables**](docs/VariableApi.md#bulk_variables) | **PATCH** /api/v2/variables | Bulk Variables
*VariableApi* | [**delete_variable**](docs/VariableApi.md#delete_variable) | **DELETE** /api/v2/variables/{variable_key} | Delete Variable
*VariableApi* | [**get_variable**](docs/VariableApi.md#get_variable) | **GET** /api/v2/variables/{variable_key} | Get Variable
*VariableApi* | [**get_variables**](docs/VariableApi.md#get_variables) | **GET** /api/v2/variables | Get Variables
*VariableApi* | [**patch_variable**](docs/VariableApi.md#patch_variable) | **PATCH** /api/v2/variables/{variable_key} | Patch Variable
*VariableApi* | [**post_variable**](docs/VariableApi.md#post_variable) | **POST** /api/v2/variables | Post Variable
*VersionApi* | [**get_version**](docs/VersionApi.md#get_version) | **GET** /api/v2/version | Get Version
*XComApi* | [**create_xcom_entry**](docs/XComApi.md#create_xcom_entry) | **POST** /api/v2/dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances/{task_id}/xcomEntries | Create Xcom Entry
*XComApi* | [**get_xcom_entries**](docs/XComApi.md#get_xcom_entries) | **GET** /api/v2/dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances/{task_id}/xcomEntries | Get Xcom Entries
*XComApi* | [**get_xcom_entry**](docs/XComApi.md#get_xcom_entry) | **GET** /api/v2/dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances/{task_id}/xcomEntries/{xcom_key} | Get Xcom Entry
*XComApi* | [**update_xcom_entry**](docs/XComApi.md#update_xcom_entry) | **PATCH** /api/v2/dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances/{task_id}/xcomEntries/{xcom_key} | Update Xcom Entry


## Documentation For Models

 - [AppBuilderMenuItemResponse](docs/AppBuilderMenuItemResponse.md)
 - [AppBuilderViewResponse](docs/AppBuilderViewResponse.md)
 - [AssetAliasCollectionResponse](docs/AssetAliasCollectionResponse.md)
 - [AssetAliasResponse](docs/AssetAliasResponse.md)
 - [AssetCollectionResponse](docs/AssetCollectionResponse.md)
 - [AssetEventCollectionResponse](docs/AssetEventCollectionResponse.md)
 - [AssetEventResponse](docs/AssetEventResponse.md)
 - [AssetResponse](docs/AssetResponse.md)
 - [BackfillCollectionResponse](docs/BackfillCollectionResponse.md)
 - [BackfillPostBody](docs/BackfillPostBody.md)
 - [BackfillResponse](docs/BackfillResponse.md)
 - [BaseInfoResponse](docs/BaseInfoResponse.md)
 - [BulkAction](docs/BulkAction.md)
 - [BulkActionNotOnExistence](docs/BulkActionNotOnExistence.md)
 - [BulkActionOnExistence](docs/BulkActionOnExistence.md)
 - [BulkActionResponse](docs/BulkActionResponse.md)
 - [BulkBodyConnectionBody](docs/BulkBodyConnectionBody.md)
 - [BulkBodyConnectionBodyActionsInner](docs/BulkBodyConnectionBodyActionsInner.md)
 - [BulkBodyPoolBody](docs/BulkBodyPoolBody.md)
 - [BulkBodyPoolBodyActionsInner](docs/BulkBodyPoolBodyActionsInner.md)
 - [BulkBodyVariableBody](docs/BulkBodyVariableBody.md)
 - [BulkBodyVariableBodyActionsInner](docs/BulkBodyVariableBodyActionsInner.md)
 - [BulkCreateActionConnectionBody](docs/BulkCreateActionConnectionBody.md)
 - [BulkCreateActionPoolBody](docs/BulkCreateActionPoolBody.md)
 - [BulkCreateActionVariableBody](docs/BulkCreateActionVariableBody.md)
 - [BulkDeleteActionConnectionBody](docs/BulkDeleteActionConnectionBody.md)
 - [BulkDeleteActionPoolBody](docs/BulkDeleteActionPoolBody.md)
 - [BulkDeleteActionVariableBody](docs/BulkDeleteActionVariableBody.md)
 - [BulkResponse](docs/BulkResponse.md)
 - [BulkUpdateActionConnectionBody](docs/BulkUpdateActionConnectionBody.md)
 - [BulkUpdateActionPoolBody](docs/BulkUpdateActionPoolBody.md)
 - [BulkUpdateActionVariableBody](docs/BulkUpdateActionVariableBody.md)
 - [ClearTaskInstancesBody](docs/ClearTaskInstancesBody.md)
 - [ClearTaskInstancesBodyTaskIdsInner](docs/ClearTaskInstancesBodyTaskIdsInner.md)
 - [Config](docs/Config.md)
 - [ConfigOption](docs/ConfigOption.md)
 - [ConfigSection](docs/ConfigSection.md)
 - [ConnectionBody](docs/ConnectionBody.md)
 - [ConnectionCollectionResponse](docs/ConnectionCollectionResponse.md)
 - [ConnectionResponse](docs/ConnectionResponse.md)
 - [ConnectionTestResponse](docs/ConnectionTestResponse.md)
 - [Content](docs/Content.md)
 - [CreateAssetEventsBody](docs/CreateAssetEventsBody.md)
 - [DAGCollectionResponse](docs/DAGCollectionResponse.md)
 - [DAGDetailsResponse](docs/DAGDetailsResponse.md)
 - [DAGPatchBody](docs/DAGPatchBody.md)
 - [DAGResponse](docs/DAGResponse.md)
 - [DAGRunClearBody](docs/DAGRunClearBody.md)
 - [DAGRunCollectionResponse](docs/DAGRunCollectionResponse.md)
 - [DAGRunPatchBody](docs/DAGRunPatchBody.md)
 - [DAGRunPatchStates](docs/DAGRunPatchStates.md)
 - [DAGRunResponse](docs/DAGRunResponse.md)
 - [DAGRunsBatchBody](docs/DAGRunsBatchBody.md)
 - [DAGSourceResponse](docs/DAGSourceResponse.md)
 - [DAGTagCollectionResponse](docs/DAGTagCollectionResponse.md)
 - [DAGVersionCollectionResponse](docs/DAGVersionCollectionResponse.md)
 - [DAGWarningCollectionResponse](docs/DAGWarningCollectionResponse.md)
 - [DAGWarningResponse](docs/DAGWarningResponse.md)
 - [DagProcessorInfoResponse](docs/DagProcessorInfoResponse.md)
 - [DagRunAssetReference](docs/DagRunAssetReference.md)
 - [DagRunState](docs/DagRunState.md)
 - [DagRunTriggeredByType](docs/DagRunTriggeredByType.md)
 - [DagRunType](docs/DagRunType.md)
 - [DagScheduleAssetReference](docs/DagScheduleAssetReference.md)
 - [DagStatsCollectionResponse](docs/DagStatsCollectionResponse.md)
 - [DagStatsResponse](docs/DagStatsResponse.md)
 - [DagStatsStateResponse](docs/DagStatsStateResponse.md)
 - [DagTagResponse](docs/DagTagResponse.md)
 - [DagVersionResponse](docs/DagVersionResponse.md)
 - [DagWarningType](docs/DagWarningType.md)
 - [Detail](docs/Detail.md)
 - [DryRunBackfillCollectionResponse](docs/DryRunBackfillCollectionResponse.md)
 - [DryRunBackfillResponse](docs/DryRunBackfillResponse.md)
 - [EventLogCollectionResponse](docs/EventLogCollectionResponse.md)
 - [EventLogResponse](docs/EventLogResponse.md)
 - [ExtraLinkCollectionResponse](docs/ExtraLinkCollectionResponse.md)
 - [FastAPIAppResponse](docs/FastAPIAppResponse.md)
 - [FastAPIRootMiddlewareResponse](docs/FastAPIRootMiddlewareResponse.md)
 - [HTTPExceptionResponse](docs/HTTPExceptionResponse.md)
 - [HTTPValidationError](docs/HTTPValidationError.md)
 - [HealthInfoResponse](docs/HealthInfoResponse.md)
 - [ImportErrorCollectionResponse](docs/ImportErrorCollectionResponse.md)
 - [ImportErrorResponse](docs/ImportErrorResponse.md)
 - [JobCollectionResponse](docs/JobCollectionResponse.md)
 - [JobResponse](docs/JobResponse.md)
 - [PatchTaskInstanceBody](docs/PatchTaskInstanceBody.md)
 - [PluginCollectionResponse](docs/PluginCollectionResponse.md)
 - [PluginResponse](docs/PluginResponse.md)
 - [PoolBody](docs/PoolBody.md)
 - [PoolCollectionResponse](docs/PoolCollectionResponse.md)
 - [PoolPatchBody](docs/PoolPatchBody.md)
 - [PoolResponse](docs/PoolResponse.md)
 - [ProviderCollectionResponse](docs/ProviderCollectionResponse.md)
 - [ProviderResponse](docs/ProviderResponse.md)
 - [QueuedEventCollectionResponse](docs/QueuedEventCollectionResponse.md)
 - [QueuedEventResponse](docs/QueuedEventResponse.md)
 - [ReprocessBehavior](docs/ReprocessBehavior.md)
 - [ResponseClearDagRun](docs/ResponseClearDagRun.md)
 - [ResponseGetXcomEntry](docs/ResponseGetXcomEntry.md)
 - [SchedulerInfoResponse](docs/SchedulerInfoResponse.md)
 - [StructuredLogMessage](docs/StructuredLogMessage.md)
 - [TaskCollectionResponse](docs/TaskCollectionResponse.md)
 - [TaskDependencyCollectionResponse](docs/TaskDependencyCollectionResponse.md)
 - [TaskDependencyResponse](docs/TaskDependencyResponse.md)
 - [TaskInstanceCollectionResponse](docs/TaskInstanceCollectionResponse.md)
 - [TaskInstanceHistoryCollectionResponse](docs/TaskInstanceHistoryCollectionResponse.md)
 - [TaskInstanceHistoryResponse](docs/TaskInstanceHistoryResponse.md)
 - [TaskInstanceResponse](docs/TaskInstanceResponse.md)
 - [TaskInstanceState](docs/TaskInstanceState.md)
 - [TaskInstancesBatchBody](docs/TaskInstancesBatchBody.md)
 - [TaskInstancesLogResponse](docs/TaskInstancesLogResponse.md)
 - [TaskOutletAssetReference](docs/TaskOutletAssetReference.md)
 - [TaskResponse](docs/TaskResponse.md)
 - [TimeDelta](docs/TimeDelta.md)
 - [TriggerDAGRunPostBody](docs/TriggerDAGRunPostBody.md)
 - [TriggerResponse](docs/TriggerResponse.md)
 - [TriggererInfoResponse](docs/TriggererInfoResponse.md)
 - [ValidationError](docs/ValidationError.md)
 - [ValidationErrorLocInner](docs/ValidationErrorLocInner.md)
 - [Value](docs/Value.md)
 - [VariableBody](docs/VariableBody.md)
 - [VariableCollectionResponse](docs/VariableCollectionResponse.md)
 - [VariableResponse](docs/VariableResponse.md)
 - [VersionInfo](docs/VersionInfo.md)
 - [XComCollectionResponse](docs/XComCollectionResponse.md)
 - [XComCreateBody](docs/XComCreateBody.md)
 - [XComResponse](docs/XComResponse.md)
 - [XComResponseNative](docs/XComResponseNative.md)
 - [XComResponseString](docs/XComResponseString.md)
 - [XComUpdateBody](docs/XComUpdateBody.md)

## Documentation For Authorization

By default the generated client supports the three authentication schemes:

* Basic
* GoogleOpenID
* Kerberos
* OAuth2PasswordBearer

However, you can generate client and documentation with your own schemes by adding your own schemes in
the security section of the OpenAPI specification. You can do it with Breeze CLI by adding the
``--security-schemes`` option to the ``breeze release-management prepare-python-client`` command.

## Basic "smoke" tests

You can run basic smoke tests to check if the client is working properly - we have a simple test script
that uses the API to run the tests. To do that, you need to:

* install the `apache-airflow-client` package as described above
* install ``rich`` Python package
* download the [test_python_client.py](test_python_client.py) file
* make sure you have test airflow installation running. Do not experiment with your production deployment
* configure your airflow webserver to enable basic authentication
  In the `[api]` section of your `airflow.cfg` set:

```ini
[api]
auth_backend = airflow.providers.fab.auth_manager.api.auth.backend.session,airflow.providers.fab.auth_manager.api.auth.backend.basic_auth
```

You can also set it by env variable:
`export AIRFLOW__API__AUTH_BACKENDS=airflow.providers.fab.auth_manager.api.auth.backend.session,airflow.providers.fab.auth_manager.api.auth.backend.basic_auth`

* configure your airflow webserver to load example dags
  In the `[core]` section of your `airflow.cfg` set:

```ini
[core]
load_examples = True
```

You can also set it by env variable: `export AIRFLOW__CORE__LOAD_EXAMPLES=True`

* optionally expose configuration (NOTE! that this is dangerous setting). The script will happily run with
  the default setting, but if you want to see the configuration, you need to expose it.
  Note that sensitive configuration values are always masked.
  In the `[api]` section of your `airflow.cfg` set:

```ini
[api]
expose_config = True
```

You can also set it by env variable: `export AIRFLOW__API__EXPOSE_CONFIG=True`

* Configure your host/ip/user/password in the `test_python_client.py` file

```python
import airflow_client

# get the access token from Airflow API Server via /auth/token
configuration = airflow_client.client.Configuration(host="http://localhost:8080", access_token=access_token)
```

* Run scheduler (or dag file processor you have setup with standalone dag file processor) for few parsing
  loops (you can pass --num-runs parameter to it or keep it running in the background). The script relies
  on example DAGs being serialized to the DB and this only
  happens when scheduler runs with ``core/load_examples`` set to True.

* Run webserver - reachable at the host/port for the test script you want to run. Make sure it had enough
  time to initialize.

Run `python test_python_client.py` and you should see colored output showing attempts to connect and status.


## Notes for Large OpenAPI documents

If the OpenAPI document is large, imports in client.apis and client.models may fail with a
RecursionError indicating the maximum recursion limit has been exceeded. In that case, there are a couple of solutions:

Solution 1:
Use specific imports for apis and models like:

- `from airflow_client.client.api.default_api import DefaultApi`
- `from airflow_client.client.model.pet import Pet`

Solution 2:
Before importing the package, adjust the maximum recursion limit as shown below:

```python
import sys

sys.setrecursionlimit(1500)
import airflow_client.client
from airflow_client.client.api import *
from airflow_client.client.models import *
```

## Authors

dev@airflow.apache.org
