Короткий ответ Разница важна, когда внутри обработчика выполняется блокирующий I/O (синхронный HTTP-клиент, синхронный драйвер БД, time.sleep): такой код в async def-эндпоинте блокирует единственный event loop и замедляет обработку всех остальных параллельных запросов. Как это работает подробнее async def-эндпоинты выполняются в event loop; любой синхронный блокирующий вызов внутри них «замораживает» этот loop на время своего выполнения, не давая обслуживать другие корутины. Обычные def-эндпоинты FastAPI автоматически выполняются в отдельном thread pool (через Starlette), поэтому блокирующий код там не останавливает event loop целиком. Пример кода Что использовать на практике Практика. Если библиотека для похода в БД/внешний сервис не умеет async/await (синхронный драйвер), для такого эндпоинта логичнее использовать обычный def — тогда FastAPI сам унесёт вызов в поток. Если же используется асинхронный драйвер (например, asyncpg, httpx.AsyncClient), стоит писать async def и действительно использовать await. По