Read this in: 한국어 | 日本語 | 简体中文
OpenAPI (Swagger) documentation and Swagger UI for the Azure Functions Python v2 programming model.
Part of the Azure Functions Python DX Toolkit → Bring FastAPI-like developer experience to Azure Functions
Azure Functions Python v2 has no built-in API documentation story:
- No auto-generated docs — you maintain OpenAPI specs by hand or not at all
- No Swagger UI — no browser-based API explorer for testing endpoints
- Hard to test — consumers rely on tribal knowledge or external tools to discover your API
- Spec drift — hand-written docs diverge from actual handler behavior over time
@openapidecorator — attach operation metadata directly to your handler- Auto-generated spec —
/openapi.jsonand/openapi.yamlendpoints from decorated handlers - Swagger UI — built-in
/docsendpoint with security defaults - CLI tooling — generate specs at build time for CI validation
| Feature | FastAPI | azure-functions-openapi |
|---|---|---|
| API docs generation | Built-in from type hints | @openapi decorator on handlers |
| Swagger UI | /docs auto-served |
render_swagger_ui() endpoint |
| OpenAPI spec | Auto-generated /openapi.json |
get_openapi_json() endpoint |
| CLI spec export | N/A | azure-functions-openapi generate |
| Pydantic integration | Native | request_model= / response_model= |
- Azure Functions Python v2 programming model
- Decorator-based
func.FunctionApp()applications - HTTP-triggered functions documented with
@openapi - Pydantic schema generation (requires Pydantic v2)
This package does not support the legacy function.json-based v1 programming model.
This package does not own:
- Runtime exposure or graph deployment — use
azure-functions-langgraph - Request/response validation or serialization — use
azure-functions-validation - Project scaffolding — use
azure-functions-scaffold
@openapidecorator for operation metadata/openapi.json,/openapi.yaml, and/docsendpoints- Query, path, header, body, and response schema support
- Swagger UI helper with security defaults
- CLI tooling for spec generation (JSON and YAML output)
Generate an OpenAPI spec from your decorated function app:
# Install
pip install azure-functions-openapi
# Generate spec from a function app module (registers @openapi routes)
azure-functions-openapi generate --app function_app --title "My API" --format json
# Write to file with pretty-printing
azure-functions-openapi generate --app function_app --title "My API" --pretty --output openapi.json
# YAML output
azure-functions-openapi generate --app function_app --format yaml --output openapi.yamlPass module:variable when the FunctionApp instance has a non-default name:
azure-functions-openapi generate --app function_app:my_app --title "My API"See the CLI Guide for all options and CI integration examples.
pip install azure-functions-openapiYour Function App dependencies should include:
azure-functions
azure-functions-openapi
import json
import azure.functions as func
from azure_functions_openapi.decorator import openapi
from azure_functions_openapi.openapi import get_openapi_json, get_openapi_yaml
from azure_functions_openapi.swagger_ui import render_swagger_ui
app = func.FunctionApp()
@app.function_name(name="http_trigger")
@app.route(route="http_trigger", auth_level=func.AuthLevel.ANONYMOUS, methods=["POST"])
@openapi(
summary="Greet user",
route="/api/http_trigger",
method="post",
request_body={
"type": "object",
"properties": {"name": {"type": "string"}},
"required": ["name"],
},
response={
200: {
"description": "Successful greeting",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {"message": {"type": "string"}},
}
}
},
}
},
tags=["Example"],
)
def http_trigger(req: func.HttpRequest) -> func.HttpResponse:
data = req.get_json()
name = data.get("name", "world")
return func.HttpResponse(
json.dumps({"message": f"Hello, {name}!"}),
mimetype="application/json",
)
@app.function_name(name="openapi_json")
@app.route(route="openapi.json", auth_level=func.AuthLevel.ANONYMOUS, methods=["GET"])
def openapi_json(req: func.HttpRequest) -> func.HttpResponse:
return func.HttpResponse(
get_openapi_json(
title="Sample API",
description="OpenAPI document for the Sample API.",
),
mimetype="application/json",
)
@app.function_name(name="openapi_yaml")
@app.route(route="openapi.yaml", auth_level=func.AuthLevel.ANONYMOUS, methods=["GET"])
def openapi_yaml(req: func.HttpRequest) -> func.HttpResponse:
return func.HttpResponse(
get_openapi_yaml(
title="Sample API",
description="OpenAPI document for the Sample API.",
),
mimetype="application/x-yaml",
)
@app.function_name(name="swagger_ui")
@app.route(route="docs", auth_level=func.AuthLevel.ANONYMOUS, methods=["GET"])
def swagger_ui(req: func.HttpRequest) -> func.HttpResponse:
return render_swagger_ui()Run locally with Azure Functions Core Tools:
func startAfter deploying (see docs/deployment.md), the same request produces the same response in both environments.
curl -s http://localhost:7071/api/http_trigger \
-H "Content-Type: application/json" \
-d '{"name": "World"}'{"message": "Hello, World!"}curl -s "https://<your-app>.azurewebsites.net/api/http_trigger" \
-H "Content-Type: application/json" \
-d '{"name": "World"}'{"message": "Hello, World!"}The /api/openapi.json, /api/openapi.yaml, and /api/docs endpoints are also available in both environments.
Verified against a temporary Azure Functions deployment in koreacentral (Python 3.12, Consumption plan). Response captured and URL anonymized.
The representative hello example shows the full outcome of adopting this library:
- You annotate an Azure Functions v2 HTTP handler with
@openapi. - The package generates a real OpenAPI document for that route.
- The same route is rendered in Swagger UI for browser-based inspection.
The generated OpenAPI file is captured as a static preview from the same example run, so the README shows the actual document produced by the representative function.
The web preview below is generated from the same representative example and captured automatically from the rendered Swagger UI page produced by that example flow.
- You have HTTP-triggered Azure Functions and need API documentation
- You want Swagger UI for browser-based API testing
- You need OpenAPI specs for client code generation or CI validation
- You want to keep docs in sync with handler code automatically
- Full docs: yeongseon.github.io/azure-functions-openapi
- Smoke-tested examples:
examples/ - Installation Guide
- Usage Guide
- API Reference
- CLI Guide
This package is part of the Azure Functions Python DX Toolkit.
Design principle: azure-functions-openapi owns API documentation and spec generation. azure-functions-validation owns request/response validation and serialization. azure-functions-langgraph owns LangGraph runtime exposure.
| Package | Role |
|---|---|
| azure-functions-langgraph | LangGraph deployment adapter for Azure Functions |
| azure-functions-validation | Request/response validation and serialization |
| azure-functions-openapi | OpenAPI spec generation and Swagger UI |
| azure-functions-logging | Structured logging and observability |
| azure-functions-doctor | Pre-deploy diagnostic CLI |
| azure-functions-scaffold | Project scaffolding |
| azure-functions-durable-graph | Manifest-first graph runtime with Durable Functions |
| azure-functions-python-cookbook | Recipes and examples |
This repository includes llms.txt and llms-full.txt in the root directory.
These files provide comprehensive package and API information optimized for LLM context windows.
llms.txt— Quick reference with core API, installation, and quick-start examplellms-full.txt— Complete reference with full signatures, patterns, design principles, and ecosystem context
Use these files to get better context when working with this package in AI-assisted coding environments.
This project is an independent community project and is not affiliated with, endorsed by, or maintained by Microsoft.
Azure and Azure Functions are trademarks of Microsoft Corporation.
MIT

