         self.routes.append(route)
 
     def api_route(
@@ -1425,6 +1589,9 @@ class APIRouter(routing.Router):
         response_description: str = "Successful Response",
         responses: dict[int | str, dict[str, Any]] | None = None,
         deprecated: bool | None = None,
+        sunset: datetime | None = None,
+        deprecation_date: datetime | None = None,
+        successor_url: str | None = None,
         methods: list[str] | None = None,
         operation_id: str | None = None,
         response_model_include: IncEx | None = None,
@@ -1455,6 +1622,9 @@ class APIRouter(routing.Router):
                 response_description=response_description,
                 responses=responses,
                 deprecated=deprecated,
+                sunset=sunset,
+                deprecation_date=deprecation_date,
+                successor_url=successor_url,
                 methods=methods,
                 operation_id=operation_id,
                 response_model_include=response_model_include,
@@ -1656,6 +1826,45 @@ class APIRouter(routing.Router):
                 """
             ),
         ] = None,
+        sunset: Annotated[
+            datetime | None,
+            Doc(
+                """
+                Declare a date and time when all *path operations* in this
+                router are planned to stop being available (their
+                "sunset" moment).
+
+                Responses will include a `Sunset` header (RFC 8594) and the
+                generated OpenAPI will include `x-sunset`.
+                """
+            ),
+        ] = None,
+        deprecation_date: Annotated[
+            datetime | None,
+            Doc(
+                """
+                Declare the date and time when all *path operations* in this
+                router became (or will become) deprecated.
+
+                Responses will include a `Deprecation` header with this date
+                (instead of `Deprecation: true`) and the generated OpenAPI will
+                include `x-deprecation-date`.
+                """
+            ),
+        ] = None,
+        successor_url: Annotated[
+            str | None,
+            Doc(
+                """
+                URL (relative or absolute) of the successor version of the
+                *path operations* in this router.
+
+                Responses will include a `Link` header with
+                `rel="successor-version"` (RFC 8288) and the generated OpenAPI
+                will include `x-successor-url`.
+                """
+            ),
+        ] = None,
         include_in_schema: Annotated[
             bool,
             Doc(
@@ -1766,7 +1975,22 @@ class APIRouter(routing.Router):
                     description=route.description,
                     response_description=route.response_description,
                     responses=combined_responses,
-                    deprecated=route.deprecated or deprecated or self.deprecated,
+                    deprecated=_first_not_none(
+                        route._explicit_deprecated, deprecated, router.deprecated
+                    ),
+                    sunset=_first_not_none(
+                        route._explicit_sunset, sunset, router.sunset
+                    ),
+                    deprecation_date=_first_not_none(
diff --git a/fastapi/openapi/utils.py b/fastapi/openapi/utils.py
index 82844255..03c809a8 100644
--- a/fastapi/openapi/utils.py
+++ b/fastapi/openapi/utils.py
@@ -257,6 +257,12 @@ def get_openapi_operation_metadata(
     operation["operationId"] = operation_id
     if route.deprecated:
         operation["deprecated"] = route.deprecated
+    if route.deprecation_date is not None:
+        operation["x-deprecation-date"] = route.deprecation_date.isoformat()
+    if route.sunset is not None:
+        operation["x-sunset"] = route.sunset.isoformat()
+    if route.successor_url is not None:
+        operation["x-successor-url"] = route.successor_url
     return operation
 
 
