{"id":24290761,"url":"https://github.com/anr007/airflow-xtended-api","last_synced_at":"2025-07-16T18:40:35.132Z","repository":{"id":46628006,"uuid":"378816408","full_name":"anr007/airflow-xtended-api","owner":"anr007","description":"Apache Airflow plugin that exposes custom secure API endpoints similar to the official Airflow API, providing richer capabilities to support more powerful DAG and job management.","archived":false,"fork":false,"pushed_at":"2024-02-04T10:53:56.000Z","size":344,"stargazers_count":11,"open_issues_count":0,"forks_count":3,"subscribers_count":2,"default_branch":"main","last_synced_at":"2024-12-15T20:42:53.739Z","etag":null,"topics":["airflow","airflow-plugin","flask","python","workflow-scheduler"],"latest_commit_sha":null,"homepage":"https://pypi.org/project/airflow-xtended-api/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/anr007.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2021-06-21T05:27:59.000Z","updated_at":"2024-02-04T11:00:37.000Z","dependencies_parsed_at":"2022-08-29T13:31:54.597Z","dependency_job_id":null,"html_url":"https://github.com/anr007/airflow-xtended-api","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anr007%2Fairflow-xtended-api","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anr007%2Fairflow-xtended-api/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anr007%2Fairflow-xtended-api/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anr007%2Fairflow-xtended-api/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/anr007","download_url":"https://codeload.github.com/anr007/airflow-xtended-api/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":234173169,"owners_count":18790978,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["airflow","airflow-plugin","flask","python","workflow-scheduler"],"created_at":"2025-01-16T12:37:04.871Z","updated_at":"2025-01-16T12:37:05.471Z","avatar_url":"https://github.com/anr007.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Airflow Xtended API - Plugin\r\n\r\nApache Airflow plugin that exposes xtended secure API endpoints similar to the official [Airflow API (Stable) (1.0.0)](https://airflow.apache.org/docs/apache-airflow/stable/stable-rest-api-ref.html), providing richer capabilities to support more powerful DAG and job management. Apache Airflow version 2.8.0 or higher is necessary.\r\n\r\n## Requirements\r\n\r\n- [apache-airflow](https://github.com/apache/airflow)\r\n- [pymongo](https://github.com/mongodb/mongo-python-driver)\r\n- [boto3](https://github.com/boto/boto3)\r\n- [requests](https://github.com/psf/requests)\r\n\r\n## Installation\r\n\r\n```python\r\npython3 -m pip install airflow-xtended-api\r\n```\r\n\r\n## Build from source\r\n\r\nBuild a custom version of this plugin by following the instructions in this [doc](BUILD.md)\r\n\r\n## Screenshots\r\n\r\n![screen1](https://raw.githubusercontent.com/anr007/airflow-xtended-api/main/grabs/screen1.jpg)\r\n![screen2](https://raw.githubusercontent.com/anr007/airflow-xtended-api/main/grabs/screen2.jpg)\r\n![screen3](https://raw.githubusercontent.com/anr007/airflow-xtended-api/main/grabs/screen3.jpg)\r\n\r\n## Authentication\r\n\r\nAirflow Xtended API plugin uses the same auth mechanism as [Airflow API (Stable) (1.0.0)](https://airflow.apache.org/docs/apache-airflow/stable/stable-rest-api-ref.html#section/Trying-the-API). So, by default APIs exposed via this plugin respect the auth mechanism used by your Airflow webserver and also complies with the existing RBAC policies. Note that you will need to pass credentials data as part of the request. Here is a snippet from the official docs when basic authorization is used:\r\n\r\n```bash\r\ncurl -X POST 'http://{AIRFLOW_HOST}:{AIRFLOW_PORT}/api/v1/dags/{dag_id}?update_mask=is_paused' \\\r\n-H 'Content-Type: application/json' \\\r\n--user \"username:password\" \\\r\n-d '{\r\n    \"is_paused\": true\r\n}'\r\n```\r\n\r\n## Using the Custom API\r\n\r\nAfter installing the plugin python package and restarting your airflow webserver, You can see a link under the 'Xtended API' tab called 'Reference Docs' on the airflow webserver homepage. All the necessary documentation for the supported API endpoints resides on that page. You can also directly navigate to that page using below link.\r\n\r\n```text\r\nhttp://{AIRFLOW_HOST}:{AIRFLOW_PORT}/xtended_api/\r\n```\r\n\r\nAll the supported endpoints are exposed in the below format:\r\n\r\n```text\r\nhttp://{AIRFLOW_HOST}:{AIRFLOW_PORT}/api/v1/xtended/{ENDPOINT_NAME}\r\n```\r\n\r\nFollowing are the names of endpoints which are currently supported.\r\n\r\n- [deploy_dag](#deploy_dag)\r\n- [create_dag](#create_dag)\r\n- [s3_sync](#s3_sync)\r\n- [mongo_sync](#mongo_sync)\r\n- [scan_dags](#scan_dags)\r\n- [purge_dags](#purge_dags)\r\n- [refresh_all_dags](#refresh_all_dags)\r\n- [delete_dag](#delete_dag)\r\n- [upload_file](#upload_file)\r\n- [restart_failed_task](#restart_failed_task)\r\n- [kill_running_tasks](#kill_running_tasks)\r\n- [run_task_instance](#run_task_instance)\r\n- [skip_task_instance](#skip_task_instance)\r\n\r\n### **_\u003cspan id=\"deploy_dag\"\u003edeploy_dag\u003c/span\u003e_**\r\n\r\n##### Description:\r\n\r\n- Deploy a new DAG File to the DAGs directory.\r\n\r\n##### Endpoint:\r\n\r\n```text\r\nhttp://{AIRFLOW_HOST}:{AIRFLOW_PORT}/api/v1/xtended/deploy_dag\r\n```\r\n\r\n##### Method:\r\n\r\n- POST\r\n\r\n##### POST request Arguments:\r\n\r\n- dag_file - file - Upload \u0026 Deploy a DAG from .py or .zip files\r\n- force (optional) - boolean - Force uploading the file if it already exists\r\n- unpause (optional) - boolean - The DAG will be unpaused on creation (Works only when uploading .py files)\r\n- otf_sync (optional) - boolean - Check for newly created DAGs On The Fly!\r\n\r\n##### Examples:\r\n\r\n```bash\r\ncurl -X POST -H 'Content-Type: multipart/form-data' \\\r\n --user \"username:password\" \\\r\n -F 'dag_file=@test_dag.py' \\\r\n -F 'force=y' \\\r\n -F 'unpause=y' \\\r\n http://{AIRFLOW_HOST}:{AIRFLOW_PORT}/api/v1/xtended/deploy_dag\r\n```\r\n\r\n##### response:\r\n\r\n```json\r\n{\r\n  \"message\": \"DAG File [\u003cmodule '{MODULE_NAME}' from '/{DAG_FOLDER}/exam.py'\u003e] has been uploaded\",\r\n  \"status\": \"success\"\r\n}\r\n```\r\n\r\n##### Method:\r\n\r\n- GET\r\n\r\n##### Get request Arguments:\r\n\r\n- dag_file_url - file - A valid url for fetching .py, .pyc or .zip DAG files\r\n- filename - string - A valid filename ending with .py, .pyc or .zip\r\n- force (optional) - boolean - Force uploading the file if it already exists.\r\n- unpause (optional) - boolean - The DAG will be unpaused on creation (Works only when uploading .py files)\r\n- otf_sync (optional) - boolean - Check for newly created DAGs On The Fly!\r\n\r\n##### Examples:\r\n\r\n```bash\r\ncurl -X GET --user \"username:password\" \\\r\n'http://{AIRFLOW_HOST}:{AIRFLOW_PORT}/api/v1/xtended/deploy_dag?dag_file_url={DAG_FILE_URL}\u0026filename=test_dag.py\u0026force=on\u0026unpause=on'\r\n\r\n```\r\n\r\n##### response:\r\n\r\n```json\r\n{\r\n  \"message\": \"DAG File [\u003cmodule '{MODULE_NAME}' from '/{DAG_FOLDER}/exam.py'\u003e] has been uploaded\",\r\n  \"status\": \"success\"\r\n}\r\n```\r\n\r\n### **_\u003cspan id=\"create_dag\"\u003ecreate_dag\u003c/span\u003e_**\r\n\r\n##### Description:\r\n\r\n- Create a new DAG File in the DAGs directory.\r\n\r\n##### Endpoint:\r\n\r\n```text\r\nhttp://{AIRFLOW_HOST}:{AIRFLOW_PORT}/api/v1/xtended/create_dag\r\n```\r\n\r\n##### Method:\r\n\r\n- POST\r\n\r\n##### POST request Arguments:\r\n\r\n- filename - string - Name of the python DAG file\r\n- dag_code - string(multiline) - Python code of the DAG file\r\n- force (optional) - boolean - Force uploading the file if it already exists\r\n- unpause (optional) - boolean - The DAG will be unpaused on creation (Works only when uploading .py files)\r\n- otf_sync (optional) - boolean - Check for newly created DAGs On The Fly!\r\n\r\n### **_\u003cspan id=\"s3_sync\"\u003es3_sync\u003c/span\u003e_**\r\n\r\n##### Description:\r\n\r\n- Sync DAG files from an S3 bucket.\r\n\r\n##### Endpoint:\r\n\r\n```text\r\nhttp://{AIRFLOW_HOST}:{AIRFLOW_PORT}/api/v1/xtended/s3_sync\r\n```\r\n\r\n##### Method:\r\n\r\n- POST\r\n\r\n##### POST request Arguments:\r\n\r\n- s3_bucket_name - string - S3 bucket name where DAG files exist\r\n- s3_region - string - S3 region name where the specified bucket exists\r\n- s3_access_key - string - IAM access key having atleast S3 bucket read access\r\n- s3_secret_key - string - IAM secret key for the specifed access key\r\n- s3_object_prefix (optional) - string - Filter results by object prefix\r\n- s3_object_keys (optional) - string - Sync DAG files specifed by the object keys. Multiple object keys are seperated by comma (,)\r\n- skip_purge (optional) - boolean - Skip emptying DAGs directory\r\n- otf_sync (optional) - boolean - Check for newly created DAGs On The Fly!\r\n\r\n##### Examples:\r\n\r\n```bash\r\ncurl -X POST -H 'Content-Type: multipart/form-data' \\\r\n --user \"username:password\" \\\r\n -F 's3_bucket_name=test-bucket' \\\r\n -F 's3_region=us-east-1' \\\r\n -F 's3_access_key={IAM_ACCESS_KEY}' \\\r\n -F 's3_secret_key={IAM_SECRET_KEY}' \\\r\n -F 'skip_purge=y' \\\r\n http://{AIRFLOW_HOST}:{AIRFLOW_PORT}/api/v1/xtended/s3_sync\r\n```\r\n\r\n##### response:\r\n\r\n```json\r\n{\r\n  \"message\": \"dag files synced from s3\",\r\n  \"sync_status\": {\r\n    \"synced\": [\"test_dag0.py\", \"test_dag1.py\", \"test_dag2.py\"],\r\n    \"failed\": []\r\n  },\r\n  \"status\": \"success\"\r\n}\r\n```\r\n\r\n### **_\u003cspan id=\"mongo_sync\"\u003emongo_sync\u003c/span\u003e_**\r\n\r\n##### Description:\r\n\r\n- Sync DAG files from a mongo db collection\r\n\r\n##### Endpoint:\r\n\r\n```text\r\nhttp://{AIRFLOW_HOST}:{AIRFLOW_PORT}/api/v1/xtended/mongo_sync\r\n```\r\n\r\n##### Method:\r\n\r\n- POST\r\n\r\n##### POST request Arguments:\r\n\r\n- connection_string - string - Source mongo server connection string\r\n- db_name - string - Source mongo database name\r\n- collection_name - string - Collection name where DAG data exists in the specified db\r\n- field_filename - string - DAGs are named using value of this document field from the specified collection\r\n- field_dag_source - string - A document field referring the Python source for the yet-to-be created DAGs\r\n- query_filter (optional) - string - JSON query string to filter required documents\r\n- skip_purge (optional) - boolean - Skip emptying DAGs directory\r\n- otf_sync (optional) - boolean - Check for newly created DAGs On The Fly!\r\n\r\n##### Examples:\r\n\r\n```bash\r\ncurl -X POST -H 'Content-Type: multipart/form-data' \\\r\n --user \"username:password\" \\\r\n -F 'connection_string={MONGO_SERVER_CONNECTION_STRING}' \\\r\n -F 'db_name=test_db' \\\r\n -F 'collection_name=test_collection' \\\r\n -F 'field_dag_source=dag_source' \\\r\n -F 'field_filename=dag_filename' \\\r\n -F 'skip_purge=y' \\\r\n http://{AIRFLOW_HOST}:{AIRFLOW_PORT}/api/v1/xtended/mongo_sync\r\n```\r\n\r\n##### response:\r\n\r\n```json\r\n{\r\n  \"message\": \"dag files synced from mongo\",\r\n  \"sync_status\": {\r\n    \"synced\": [\"test_dag0.py\", \"test_dag1.py\", \"test_dag2.py\"],\r\n    \"failed\": []\r\n  },\r\n  \"status\": \"success\"\r\n}\r\n```\r\n\r\n### **_\u003cspan id=\"refresh_all_dags\"\u003erefresh_all_dags\u003c/span\u003e_**\r\n\r\n##### Description:\r\n\r\n- Refresh all DAGs in the webserver.\r\n\r\n##### Endpoint:\r\n\r\n```text\r\nhttp://{AIRFLOW_HOST}:{AIRFLOW_PORT}/api/v1/xtended/refresh_all_dags\r\n```\r\n\r\n##### Method:\r\n\r\n- GET\r\n\r\n##### GET request Arguments:\r\n\r\n- None\r\n\r\n##### Examples:\r\n\r\n```bash\r\ncurl -X GET --user \"username:password\" \\\r\nhttp://{AIRFLOW_HOST}:{AIRFLOW_PORT}/api/v1/xtended/refresh_all_dags\r\n```\r\n\r\n##### response:\r\n\r\n```json\r\n{\r\n  \"message\": \"All DAGs are now up-to-date!!\",\r\n  \"status\": \"success\"\r\n}\r\n```\r\n\r\n### **_\u003cspan id=\"scan_dags\"\u003escan_dags\u003c/span\u003e_**\r\n\r\n##### Description:\r\n\r\n- Check for newly created DAGs.\r\n\r\n##### Endpoint:\r\n\r\n```text\r\nhttp://{AIRFLOW_HOST}:{AIRFLOW_PORT}/api/v1/xtended/scan_dags\r\n```\r\n\r\n##### Method:\r\n\r\n- GET\r\n\r\n##### GET request Arguments:\r\n\r\n- otf_sync (optional) - boolean - Check for newly created DAGs On The Fly!\r\n\r\n##### Examples:\r\n\r\n```bash\r\ncurl -X GET --user \"username:password\" \\\r\nhttp://{AIRFLOW_HOST}:{AIRFLOW_PORT}/api/v1/xtended/scan_dags\r\n```\r\n\r\n##### response:\r\n\r\n```json\r\n{\r\n  \"message\": \"Ondemand DAG scan complete!!\",\r\n  \"status\": \"success\"\r\n}\r\n```\r\n\r\n### **_\u003cspan id=\"purge_dags\"\u003epurge_dags\u003c/span\u003e_**\r\n\r\n##### Description:\r\n\r\n- Empty DAG directory.\r\n\r\n##### Endpoint:\r\n\r\n```text\r\nhttp://{AIRFLOW_HOST}:{AIRFLOW_PORT}/api/v1/xtended/purge_dags\r\n```\r\n\r\n##### Method:\r\n\r\n- GET\r\n\r\n##### GET request Arguments:\r\n\r\n- None\r\n\r\n##### Examples:\r\n\r\n```bash\r\ncurl -X GET --user \"username:password\" \\\r\nhttp://{AIRFLOW_HOST}:{AIRFLOW_PORT}/api/v1/xtended/purge_dags\r\n```\r\n\r\n##### response:\r\n\r\n```json\r\n{\r\n  \"message\": \"DAG directory purged!!\",\r\n  \"status\": \"success\"\r\n}\r\n```\r\n\r\n### **_\u003cspan id=\"delete_dag\"\u003edelete_dag\u003c/span\u003e_**\r\n\r\n##### Description:\r\n\r\n- Delete a DAG in the web server from Airflow database and filesystem.\r\n\r\n##### Endpoint:\r\n\r\n```text\r\nhttp://{AIRFLOW_HOST}:{AIRFLOW_PORT}/api/v1/xtended/delete_dag\r\n```\r\n\r\n##### Method:\r\n\r\n- GET\r\n\r\n##### GET request Arguments:\r\n\r\n- dag_id (optional)- string - DAG id\r\n- filename (optional) - string - Name of the DAG file that needs to be deleted\r\n- Note: Atleast one of args 'dag_id' or 'filename' should be specified\r\n\r\n##### Examples:\r\n\r\n```bash\r\ncurl -X GET --user \"username:password\" \\\r\n'http://{AIRFLOW_HOST}:{AIRFLOW_PORT}/api/v1/xtended/delete_dag?dag_id=test_dag\u0026filename=test_dag.py'\r\n```\r\n\r\n##### response:\r\n\r\n```json\r\n{\r\n  \"message\": \"DAG [dag_test] deleted\",\r\n  \"status\": \"success\"\r\n}\r\n```\r\n\r\n### **_\u003cspan id=\"upload_file\"\u003eupload_file\u003c/span\u003e_**\r\n\r\n##### Description:\r\n\r\n- Upload a new File to the specified directory.\r\n\r\n##### Endpoint:\r\n\r\n```text\r\nhttp://{AIRFLOW_HOST}:{AIRFLOW_PORT}/api/v1/xtended/upload_file\r\n```\r\n\r\n##### Method:\r\n\r\n- POST\r\n\r\n##### POST request Arguments:\r\n\r\n- file - file - File to be uploaded\r\n- force (optional) - boolean - Force uploading the file if it already exists\r\n- path (optional) - string - Location where the file is to be uploaded (Default is the DAGs directory)\r\n\r\n##### Examples:\r\n\r\n```bash\r\ncurl -X POST -H 'Content-Type: multipart/form-data' \\\r\n --user \"username:password\" \\\r\n -F 'file=@test_file.py' \\\r\n -F 'force=y' \\\r\n http://{AIRFLOW_HOST}:{AIRFLOW_PORT}/api/v1/xtended/upload_file\r\n```\r\n\r\n##### response:\r\n\r\n```json\r\n{\r\n  \"message\": \"File [/{DAG_FOLDER}/dag_test.txt] has been uploaded\",\r\n  \"status\": \"success\"\r\n}\r\n```\r\n\r\n### **_\u003cspan id=\"restart_failed_task\"\u003erestart_failed_task\u003c/span\u003e_**\r\n\r\n##### Description:\r\n\r\n- Restart failed tasks with downstream.\r\n\r\n##### Endpoint:\r\n\r\n```text\r\nhttp://{AIRFLOW_HOST}:{AIRFLOW_PORT}/api/v1/xtended/restart_failed_task\r\n```\r\n\r\n##### Method:\r\n\r\n- GET\r\n\r\n##### GET request Arguments:\r\n\r\n- dag_id - string - DAG id\r\n- run_id - string - DagRun id\r\n\r\n##### Examples:\r\n\r\n```bash\r\ncurl -X GET --user \"username:password\" \\\r\n'http://{AIRFLOW_HOST}:{AIRFLOW_PORT}/api/v1/xtended/restart_failed_task?dag_id=test_dag\u0026run_id=test_run'\r\n```\r\n\r\n##### response:\r\n\r\n```json\r\n{\r\n  \"message\": {\r\n    \"failed_task_count\": 1,\r\n    \"clear_task_count\": 7\r\n  },\r\n  \"status\": \"success\"\r\n}\r\n```\r\n\r\n### **_\u003cspan id=\"kill_running_tasks\"\u003ekill_running_tasks\u003c/span\u003e_**\r\n\r\n##### Description:\r\n\r\n- Kill running tasks having status in ['none', 'running'].\r\n\r\n##### Endpoint:\r\n\r\n```text\r\nhttp://{AIRFLOW_HOST}:{AIRFLOW_PORT}/api/v1/xtended/kill_running_tasks\r\n```\r\n\r\n##### Method:\r\n\r\n- GET\r\n\r\n##### GET request Arguments:\r\n\r\n- dag_id - string - DAG id\r\n- run_id - string - DagRun id\r\n- task_id - string - If task_id is none, kill all tasks, else kill the specified task.\r\n\r\n##### Examples:\r\n\r\n```bash\r\ncurl -X GET --user \"username:password\" \\\r\n'http://{AIRFLOW_HOST}:{AIRFLOW_PORT}/api/v1/xtended/kill_running_tasks?dag_id=test_dag\u0026run_id=test_run\u0026task_id=test_task'\r\n```\r\n\r\n##### response:\r\n\r\n```json\r\n{\r\n  \"message\": \"tasks in test_run killed!!\",\r\n  \"status\": \"success\"\r\n}\r\n```\r\n\r\n### **_\u003cspan id=\"run_task_instance\"\u003erun_task_instance\u003c/span\u003e_**\r\n\r\n##### Description:\r\n\r\n- Create DagRun, run the specified tasks, and skip the rest.\r\n\r\n##### Endpoint:\r\n\r\n```text\r\nhttp://{AIRFLOW_HOST}:{AIRFLOW_PORT}/api/v1/xtended/run_task_instance\r\n```\r\n\r\n##### Method:\r\n\r\n- POST\r\n\r\n##### POST request Arguments:\r\n\r\n- dag_id - string - DAG id\r\n- run_id - string - DagRun id\r\n- tasks - string - task id(s), Multiple tasks are separated by comma (,)\r\n- conf (optional)- string - Optional configuartion for creating DagRun.\r\n\r\n##### Examples:\r\n\r\n```bash\r\ncurl -X POST -H 'Content-Type: multipart/form-data' \\\r\n --user \"username:password\" \\\r\n -F 'dag_id=test_dag' \\\r\n -F 'run_id=test_run' \\\r\n -F 'tasks=test_task' \\\r\n http://{AIRFLOW_HOST}:{AIRFLOW_PORT}/api/v1/xtended/run_task_instance\r\n```\r\n\r\n##### response:\r\n\r\n```json\r\n{\r\n  \"execution_date\": \"2021-06-21T05:50:19.740803+0000\",\r\n  \"status\": \"success\"\r\n}\r\n```\r\n\r\n### **_\u003cspan id=\"skip_task_instance\"\u003eskip_task_instance\u003c/span\u003e_**\r\n\r\n##### Description:\r\n\r\n- Skip one task instance.\r\n\r\n##### Endpoint:\r\n\r\n```text\r\nhttp://{AIRFLOW_HOST}:{AIRFLOW_PORT}/api/v1/xtended/skip_task_instance\r\n```\r\n\r\n##### Method:\r\n\r\n- GET\r\n\r\n##### GET request Arguments:\r\n\r\n- dag_id - string - DAG id\r\n- run_id - string - DagRun id\r\n- task_id - string - task id\r\n\r\n##### Examples:\r\n\r\n```bash\r\ncurl -X GET http://{AIRFLOW_HOST}:{AIRFLOW_PORT}/api/v1/xtended/skip_task_instance?dag_id=test_dag\u0026run_id=test_run\u0026task_id=test_task\r\n```\r\n\r\n##### response:\r\n\r\n```json\r\n{\r\n  \"message\": \"\u003cTaskInstance: test_dag.test_task 2021-06-21 19:59:34.638794+00:00 [skipped]\u003e skipped!!\",\r\n  \"status\": \"success\"\r\n}\r\n```\r\n\r\n## Acknowledgements\r\n\r\nHuge shout out to these awesome plugins that contributed to the growth of Airflow ecosystem, which also inspired this plugin.\r\n\r\n- [airflow-rest-api-plugin](https://github.com/teamclairvoyant/airflow-rest-api-plugin)\r\n- [airflow-rest-api-plugin](https://github.com/eBay/airflow-rest-api-plugin)\r\n- [simple-dag-editor](https://github.com/ohadmata/simple-dag-editor)\r\n- [airflow-code-editor](https://github.com/andreax79/airflow-code-editor)\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fanr007%2Fairflow-xtended-api","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fanr007%2Fairflow-xtended-api","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fanr007%2Fairflow-xtended-api/lists"}