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

Deprecated REST API
===================

.. warning::

  This REST API is deprecated since version 2.0. Please consider using the :doc:`stable REST API <stable-rest-api-ref>`.
  For more information on migration, see `UPDATING.md <https://github.com/apache/airflow/blob/main/UPDATING.md>`_

Before Airflow 2.0 this REST API was known as the "experimental" API, but now that the :doc:`stable REST API <stable-rest-api-ref>` is available, it has been renamed.

The endpoints for this API are available at ``/api/experimental/``.

.. versionchanged:: 2.0

  This REST API is disabled by default. To restore these APIs while migrating to
  the stable REST API, set ``enable_experimental_api`` option in ``[api]`` section to ``True``.

Endpoints
---------

.. http:post:: /api/experimental/dags/<DAG_ID>/dag_runs

  Creates a dag_run for a given dag id.
  Note: If execution_date is not specified in the body, airflow by default creates only one DAG per second for a given DAG_ID.
  In order to create multiple DagRun within one second, you should set parameter ``"replace_microseconds"`` to ``"false"`` (boolean as string).

  The execution_date must be specified with the format ``YYYY-mm-DDTHH:MM:SS.ssssss``.

  **Trigger DAG with config, example:**

  .. code-block:: bash

    curl -X POST \
        'http://localhost:8080/api/experimental/dags/<DAG_ID>/dag_runs' \
        --header 'Cache-Control: no-cache' \
        --header 'Content-Type: application/json' \
        --data '{"conf":"{\"key\":\"value\"}"}'

  **Trigger DAG with milliseconds precision, example:**

  .. code-block:: bash

    curl -X POST  \
        'http://localhost:8080/api/experimental/dags/<DAG_ID>/dag_runs' \
        --header 'Content-Type: application/json' \
        --header 'Cache-Control: no-cache' \
        --data '{"replace_microseconds":"false"}'

.. http:get:: /api/experimental/dags/<DAG_ID>/dag_runs

  Returns a list of Dag Runs for a specific DAG ID.


.. http:get:: /api/experimental/dags/<string:dag_id>/dag_runs/<string:execution_date>

  Returns a JSON with a dag_run's public instance variables. The format for the ``<string:execution_date>`` is expected to be ``YYYY-mm-DDTHH:MM:SS``, for example: ``"2016-11-16T11:34:15"``.


.. http:get:: /api/experimental/test

  To check REST API server correct work. Return status 'OK'.


.. http:get:: /api/experimental/dags/<DAG_ID>/tasks/<TASK_ID>

  Returns info for a task.


.. http:get:: /api/experimental/dags/<DAG_ID>/dag_runs/<string:execution_date>/tasks/<TASK_ID>

  Returns a JSON with a task instance's public instance variables. The format for the ``<string:execution_date>`` is expected to be ``YYYY-mm-DDTHH:MM:SS``, for example: ``"2016-11-16T11:34:15"``.


.. http:get:: /api/experimental/dags/<DAG_ID>/paused/<string:paused>

  '<string:paused>' must be a 'true' to pause a DAG and 'false' to unpause.


.. http:get:: /api/experimental/dags/<DAG_ID>/paused

  Returns the paused state of a DAG


.. http:get:: /api/experimental/latest_runs

  Returns the latest DagRun for each DAG formatted for the UI.


.. http:get:: /api/experimental/pools

  Get all pools.


.. http:get:: /api/experimental/pools/<string:name>

  Get pool by a given name.


.. http:post:: /api/experimental/pools

  Create a pool.


.. http:delete:: /api/experimental/pools/<string:name>

  Delete pool.

.. http:get:: /api/experimental/lineage/<DAG_ID>/<string:execution_date>/

  Returns the lineage information for the dag.
