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

Integration
===========

Airflow has a mechanism that allows you to expand its functionality and integrate with other systems.

* :doc:`API Authentication backends </security/api>`
* :doc:`Email backends </howto/email-config>`
* :doc:`Executor </executor/index>`
* :doc:`Kerberos </security/kerberos>`
* :doc:`Logging </logging-monitoring/logging-tasks>`
* :doc:`Metrics (statsd) </logging-monitoring/metrics>`
* :doc:`Operators and hooks </operators-and-hooks-ref>`
* :doc:`Plugins </plugins>`
* :doc:`Secrets backends </security/secrets/secrets-backend/index>`
* :doc:`Tracking systems </logging-monitoring/tracking-user-activity>`
* :doc:`Web UI Authentication backends </security/api>`

It also has integration with :doc:`Sentry </logging-monitoring/errors>` service for error tracking. Other applications can also integrate using
the :doc:`REST API <rest-api-ref>`.
