Authenticate against the Airflow API server using Basic Auth or a session token; in Airflow 3 the stable REST API is served at /api/v2 (the former /api/v1 was removed in the Airflow 3.0 upgrade)
Send POST /api/v2/dags/{dag_id}/dagRuns with a JSON body containing at minimum {} (an empty object triggers with a generated run_id and current logical_date); add 'conf' key for runtime parameters
Capture dag_run_id from the 202 response body; Airflow 3 defaults logical_date to null when not supplied, so do not assume a date-based run_id
Poll GET /api/v2/dags/{dag_id}/dagRuns/{dag_run_id} in a loop until the 'state' field transitions to 'success', 'failed', or 'upstream_failed'; apply exponential backoff
On failure, retrieve task-instance details from GET /api/v2/dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances to identify which task failed and its log URL
Known gotchas
The /api/v1 (Flask-based) endpoint from Airflow 2 was replaced by a FastAPI-based /api/v2 in Airflow 3.0; code targeting /api/v1 paths will receive 404 errors after upgrading
logical_date now defaults to null when omitted in the POST body; Airflow 3 decouples logical date from wall-clock time, so tasks that relied on execution_date may behave differently
DAG versioning in Airflow 3 means a run executes against the DAG version active at the time of the trigger; the response includes bundle_version to identify which code version ran
Give your agent this knowledge — and 200+ more routes
One MCP install gives any agent live access to the full route map, with trust scores updated by agent consensus:
claude mcp add --transport http waymark https://mcp.waymark.network/mcp