Repository: PrefectHQ/prefect
Pull request: Automating the Mintlify OpenAPI docs
This script will reconcile the current state of the REST API with what's in
the `docs/<version>/api-ref/server` directory, as well as the navigation within
the `mint.json` file that defines the overall documentation.

I'm also wiring this script up as a pre-commit hook so that any changes to the
API and schemas are automatically reflected in the docs.  To make this the least
invasive as I can, this attempts to install the required `@mintlify/scraping`
package if it is not currently installed.

Fixes #13907


Problem statement:
Automate the production of the Mintlify OpenAPI docs
We've got a manual process now that involves:

1. Producing the `schema.json` file using our script and FastAPI's tooling
2. Adding a few fields to the file to make it amenable to Mintlify's scraper
3. Running the `mintlify-scrape openapi-file ...` command to produce the markdown docs
4. Taking the produced markdown docs and merging them with the global `mint.json`

Let's get this automated so that it can be done with a single command, and ultimately, be done in CI

Hints from issue discussion:

Commit message: Automating the Mintlify OpenAPI docs

This script will reconcile the current state of the REST API with what's in
the `docs/<version>/api-ref/server` directory, as well as the navigation within
the `mint.json` file that defines the overall documentation.

I'm also wiring this script up as a pre-commit hook so that any changes to the
API and schemas are automatically reflected in the docs.  To make this the least
invasive as I can, this attempts to install the required `@mintlify/scraping`
package if it is not currently installed.

Fixes #13907

Patch to review:
diff --git a/.github/workflows/static-analysis.yaml b/.github/workflows/static-analysis.yaml
index e91a12f721e4..576f6c79267d 100644
--- a/.github/workflows/static-analysis.yaml
+++ b/.github/workflows/static-analysis.yaml
@@ -30,12 +30,33 @@ jobs:
 
       - name: Set up Python
         uses: actions/setup-python@v5
+        id: setup_python
         with:
           python-version: 3.9
 
-      - name: Install pre-commit
+      - name: UV Cache
+        # Manually cache the uv cache directory
+        # until setup-python supports it:
+        # https://github.com/actions/setup-python/issues/822
+        uses: actions/cache@v4
+        id: cache-uv
+        with:
+          path: ~/.cache/uv
+          key: uvcache-${{ runner.os }}-${{ steps.setup_python.outputs.python-version }}-${{ hashFiles('requirements-client.txt', 'requirements.txt', 'requirements-dev.txt') }}
+
+      - name: Install packages
         run: |
-          pip install pre-commit
+          python -m pip install -U uv pre-commit
+          uv pip install --upgrade --system -e .[dev]
+
+      - name: Setup NodeJS
+        uses: actions/setup-node@v4
+        with:
+          node-version-file: ".nvmrc"
+          cache-dependency-path: "**/package-lock.json"
+
+      - name: Install mintlify-scrape
+        run: npm install -g @mintlify/scraping
 
       - name: Run pre-commit
         run: |
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 124a79752928..282928c238e8 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -1,26 +1,38 @@
 repos:
-    - repo: https://github.com/astral-sh/ruff-pre-commit
-      rev: "v0.2.1"
-      hooks:
-          - id: ruff
-            language_version: python3
-            args: [--fix, --exit-non-zero-on-fix, --show-fixes]
-          - id: ruff-format
-    - repo: https://github.com/codespell-project/codespell
-      rev: v2.2.6
-      hooks:
-          - id: codespell
-            exclude: package-lock.json|_vendor/.*|docs/.*
-    - repo: https://github.com/netromdk/vermin
-      rev: v1.6.0
-      hooks:
-          - id: vermin
-    - repo: https://github.com/pre-commit/mirrors-mypy
-      rev: v1.9.0
-      hooks:
-          - id: mypy
-            additional_dependencies:
-                - pydantic>=1.10.0,!=2.0.0,!=2.0.1,!=2.1.0,<3.0.0
-                - types-cachetools==5.3.0.5
-                - types-pyyaml==6.0.12.9
-            files: ^(src/prefect/server/models/agents\.py|src/prefect/server/models/flows\.py|src/prefect/concurrency/.*|src/prefect/events/.*|src/prefect/input/.*)$
+  - repo: https://github.com/astral-sh/ruff-pre-commit
+    rev: "v0.2.1"
+    hooks:
+        - id: ruff
+          language_version: python3
+          args: [--fix, --exit-non-zero-on-fix, --show-fixes]
+        - id: ruff-format
+  - repo: https://github.com/codespell-project/codespell
+    rev: v2.2.6
+    hooks:
+        - id: codespell
+          exclude: package-lock.json|_vendor/.*|docs/.*
+  - repo: https://github.com/netromdk/vermin
+    rev: v1.6.0
+    hooks:
+        - id: vermin
+  - repo: https://github.com/pre-commit/mirrors-mypy
+    rev: v1.9.0
+    hooks:
+        - id: mypy
+          additional_dependencies:
+              - pydantic>=1.10.0,!=2.0.0,!=2.0.1,!=2.1.0,<3.0.0
+              - types-cachetools==5.3.0.5
+              - types-pyyaml==6.0.12.9
+          files: ^(src/prefect/server/models/agents\.py|src/prefect/server/models/flows\.py|src/prefect/concurrency/.*|src/prefect/events/.*|src/prefect/input/.*)$
+  - repo: local
+    hooks:
+      - id: generate-mintlify-openapi-docs
+        name: Generating OpenAPI docs for Mintlify
+        language: system
+        entry: ./scripts/generate_mintlify_openapi_docs.py
+        files: |
+            (?x)^(
+                .pre-commit-config.yaml|
+                src/prefect/server/|
+                scripts/generate_mintlify_openapi_docs.py
+            )$
diff --git a/docs/3.0rc/api-ref/server/flow-runs/count-task-runs-by-flow-run.mdx b/docs/3.0rc/api-ref/server/flow-runs/count-task-runs-by-flow-run.mdx
new file mode 100644
index 000000000000..4448377f6278
--- /dev/null
+++ b/docs/3.0rc/api-ref/server/flow-runs/count-task-runs-by-flow-run.mdx
@@ -0,0 +1,3 @@
+---
+openapi: post /api/ui/flow_runs/count-task-runs
+---
\ No newline at end of file
diff --git a/docs/3.0rc/api-ref/server/flow-runs/paginate-flow-runs.mdx b/docs/3.0rc/api-ref/server/flow-runs/paginate-flow-runs.mdx
new file mode 100644
index 000000000000..3903b1d92243
--- /dev/null
+++ b/docs/3.0rc/api-ref/server/flow-runs/paginate-flow-runs.mdx
@@ -0,0 +1,3 @@
+---
+openapi: post /api/flow_runs/filter
+---
\ No newline at end of file
diff --git a/docs/3.0rc/api-ref/server/flows/paginate-flows.mdx b/docs/3.0rc/api-ref/server/flows/paginate-flows.mdx
new file mode 100644
index 000000000000..8489bb760b80
--- /dev/null
+++ b/docs/3.0rc/api-ref/server/flows/paginate-flows.mdx
@@ -0,0 +1,3 @@
+---
+openapi: post /api/flows/paginate
+---
\ No newline at end of file
diff --git a/docs/3.0rc/api-ref/server/root/orion-info.mdx b/docs/3.0rc/api-ref/server/root/server-version.mdx
similarity index 100%
rename from docs/3.0rc/api-ref/server/root/orion-info.mdx
rename to docs/3.0rc/api-ref/server/root/server-version.mdx
diff --git a/docs/3.0rc/api-ref/server/schema.json b/docs/3.0rc/api-ref/server/schema.json
index bf82bc841d25..c1ff2dd27d04 100644
--- a/docs/3.0rc/api-ref/server/schema.json
+++ b/docs/3.0rc/api-ref/server/schema.json
@@ -1,8 +1,11 @@
 {
     "openapi": "3.1.0",
     "info": {
-        "title": "Server API Docs",
-        "version": "3.0rc"
+        "title": "Prefect Prefect REST API",
+        "version": "3.0rc",
+        "x-logo": {
+            "url": "static/prefect-logo-mark-gradient.png"
+        }
     },
     "paths": {
         "/api/health": {
@@ -29,8 +32,8 @@
                 "tags": [
                     "Root"
                 ],
-                "summary": "Orion Info",
-                "operationId": "orion_info_version_get",
+                "summary": "Server Version",
+                "operationId": "server_version_version_get",
                 "responses": {
                     "200": {
                         "description": "Successful Response",
@@ -426,6 +429,63 @@
                 }
             }
         },
+        "/api/flows/paginate": {
+            "post": {
+                "tags": [
+                    "Flows"
+                ],
+                "summary": "Paginate Flows",
+                "description": "Pagination query for flows.",
+                "operationId": "paginate_flows_flows_paginate_post",
+                "parameters": [
+                    {
+                        "name": "x-prefect-api-version",
+                        "in": "header",
+                        "required": false,
+                        "schema": {
+                            "type": "string",
+                            "title": "X-Prefect-Api-Version"
+                        }
+                    }
+                ],
+                "requestBody": {
+                    "content": {
+                        "application/json": {
+                            "schema": {
+                                "allOf": [
+                                    {
+                                        "$ref": "#/components/schemas/Body_paginate_flows_flows_paginate_post"
+                                    }
+                                ],
+                                "title": "Body"
+                            }
+                        }
+                    }
+                },
+                "responses": {
+                    "200": {
+                        "description": "Successful Response",
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/FlowPaginationResponse"
+                                }
+                            }
+                        }
+                    },
+                    "422": {
+                        "description": "Validation Error",
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HTTPValidationError"
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        },
         "/api/flow_runs/": {
             "post": {
                 "tags": [
@@ -1017,9 +1077,9 @@
                 "tags": [
                     "Flow Runs"
                 ],
-                "summary": "Read Flow Runs",
+                "summary": "Paginate Flow Runs",
                 "description": "Query for flow runs.",
-                "operationId": "read_flow_runs_flow_runs_filter_post",
+                "operationId": "paginate_flow_runs_flow_runs_filter_post",
                 "parameters": [
                     {
                         "name": "x-prefect-api-version",
@@ -1037,7 +1097,7 @@
                             "schema": {
                                 "allOf": [
                                     {
-                                        "$ref": "#/components/schemas/Body_read_flow_runs_flow_runs_filter_post"
+                                        "$ref": "#/components/schemas/Body_paginate_flow_runs_flow_runs_filter_post"
                                     }
                                 ],
                                 "title": "Body"
@@ -1055,7 +1115,7 @@
                                     "items": {
                                         "$ref": "#/components/schemas/FlowRunResponse"
                                     },
-                                    "title": "Response Read Flow Runs Flow Runs Filter Post"
+                                    "title": "Response Paginate Flow Runs Flow Runs Filter Post"
                                 }
                             }
                         }
@@ -1391,6 +1451,63 @@
                 }
             }
         },
+        "/api/flow_runs/paginate": {
+            "post": {
+                "tags": [
+                    "Flow Runs"
+                ],
+                "summary": "Read Flow Runs",
+                "description": "Pagination query for flow runs.",
+                "operationId": "read_flow_runs_flow_runs_paginate_post",
+                "parameters": [
+                    {
+                        "name": "x-prefect-api-version",
+                        "in": "header",
+                        "required": false,
+                        "schema": {
+                            "type": "string",
+                            "title": "X-Prefect-Api-Version"
+                        }
+                    }
+                ],
+                "requestBody": {
+                    "content": {
+                        "application/json": {
+                            "schema": {
+                                "allOf": [
+                                    {
+                                        "$ref": "#/components/schemas/Body_read_flow_runs_flow_runs_paginate_post"
+                                    }
+                                ],
+                                "title": "Body"
+                            }
+                        }
+                    }
+                },
+                "responses": {
+                    "200": {
+                        "description": "Successful Response",
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/FlowRunPaginationResponse"
+                                }
+                            }
+                        }
+                    },
+                    "422": {
+                        "description": "Validation Error",
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HTTPValidationError"
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        },
         "/api/task_runs/": {
             "post": {
                 "tags": [
@@ -9110,6 +9227,64 @@
                 }
             }
         },
+        "/api/ui/flow_runs/count-task-runs": {
+            "post": {
+                "tags": [
+                    "Flow Runs",
+                    "UI"
+                ],
+                "summary": "Count Task Runs By Flow Run",
+                "description": "Get task run counts by flow run id.",
+                "operationId": "count_task_runs_by_flow_run_ui_flow_runs_count_task_runs_post",
+                "parameters": [
+                    {
+                        "name": "x-prefect-api-version",
+                        "in": "header",
+                        "required": false,
+                        "schema": {
+                            "type": "string",
+                            "title": "X-Prefect-Api-Version"
+                        }
+                    }
+                ],
+                "requestBody": {
+                    "required": true,
+                    "content": {
+                        "application/json": {
+                            "schema": {
+                                "$ref": "#/components/schemas/Body_count_task_runs_by_flow_run_ui_flow_runs_count_task_runs_post"
+                            }
+                        }
+                    }
+                },
+                "responses": {
+                    "200": {
+                        "description": "Successful Response",
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "type": "object",
+                                    "additionalProperties": {
+                                        "type": "integer"
+                                    },
+                                    "title": "Response Count Task Runs By Flow Run Ui Flow Runs Count Task Runs Post"
+                                }
+                            }
+                        }
+                    },
+                    "422": {
+                        "description": "Validation Error",
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HTTPValidationError"
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        },
         "/api/ui/schemas/validate": {
             "post": {
                 "tags": [
@@ -12659,6 +12834,24 @@
                 "type": "object",
                 "title": "Body_count_latest_artifacts_artifacts_latest_count_post"
             },
+            "Body_count_task_runs_by_flow_run_ui_flow_runs_count_task_runs_post": {
+                "properties": {
+                    "flow_run_ids": {
+                        "items": {
+                            "type": "string",
+                            "format": "uuid"
+                        },
+                        "type": "array",
+                        "title": "Flow Run Ids",
+                        "max_items": 200
+                    }
+                },
+                "type": "object",
+                "required": [
+                    "flow_run_ids"
+                ],
+                "title": "Body_count_task_runs_by_flow_run_ui_flow_runs_count_task_runs_post"
+            },
             "Body_count_task_runs_task_runs_count_post": {
                 "properties": {
                     "flows": {
@@ -12960,6 +13153,166 @@
                 ],
                 "title": "Body_next_runs_by_flow_ui_flows_next_runs_post"
             },
+            "Body_paginate_flow_runs_flow_runs_filter_post": {
+                "properties": {
+                    "sort": {
+                        "allOf": [
+                            {
+                                "$ref": "#/components/schemas/FlowRunSort"
+                            }
+                        ],
+                        "default": "ID_DESC"
+                    },
+                    "offset": {
+                        "type": "integer",
+                        "minimum": 0.0,
+                        "title": "Offset",
+                        "default": 0
+                    },
+                    "flows": {
+                        "anyOf": [
+                            {
+                                "$ref": "#/components/schemas/FlowFilter"
+                            },
+                            {
+                                "type": "null"
+                            }
+                        ]
+                    },
+                    "flow_runs": {
+                        "anyOf": [
+                            {
+                                "$ref": "#/components/schemas/FlowRunFilter"
+                            },
+                            {
+                                "type": "null"
+                            }
+                        ]
+                    },
+                    "task_runs": {
+                        "anyOf": [
+                            {
+                                "$ref": "#/components/schemas/TaskRunFilter"
+                            },
+                            {
+                                "type": "null"
+                            }
+                        ]
+                    },
+                    "deployments": {
+                        "anyOf": [
+                            {
+                                "$ref": "#/components/schemas/DeploymentFilter"
+                            },
+                            {
+                                "type": "null"
+                            }
+                        ]
+                    },
+                    "work_pools": {
+                        "anyOf": [
+                            {
+                                "$ref": "#/components/schemas/WorkPoolFilter"
+                            },
+                            {
+                                "type": "null"
+                            }
+                        ]
+                    },
+                    "work_pool_queues": {
+                        "anyOf": [
+                            {
+                                "$ref": "#/components/schemas/WorkQueueFilter"
+                            },
+                            {
+                                "type": "null"
+                            }
+                        ]
+                    },
+                    "limit": {
+                        "type": "integer",
+                        "title": "Limit",
+                        "description": "Defaults to PREFECT_API_DEFAULT_LIMIT if not provided."
+                    }
+                },
+                "type": "object",
+                "title": "Body_paginate_flow_runs_flow_runs_filter_post"
+            },
+            "Body_paginate_flows_flows_paginate_post": {
+                "properties": {
+                    "page": {
+                        "type": "integer",
+                        "minimum": 1.0,
+                        "title": "Page",
+                        "default": 1
+                    },
+                    "flows": {
+                        "anyOf": [
+                            {
+                                "$ref": "#/components/schemas/FlowFilter"
+                            },
+                            {
+                                "type": "null"
+                            }
+                        ]
+                    },
+                    "flow_runs": {
+                        "anyOf": [
+                            {
+                                "$ref": "#/components/schemas/FlowRunFilter"
+                            },
+                            {
+                                "type": "null"
+                            }
+                        ]
+                    },
+                    "task_runs": {
+                        "anyOf": [
+                            {
+                                "$ref": "#/components/schemas/TaskRunFilter"
+                            },
+                            {
+                                "type": "null"
+                            }
+                        ]
+                    },
+                    "deployments": {
+                        "anyOf": [
+                            {
+                                "$ref": "#/components/schemas/DeploymentFilter"
+                            },
+                            {
+                                "type": "null"
+                            }
+                        ]
+                    },
+                    "work_pools": {
+                        "anyOf": [
+                            {
+                                "$ref": "#/components/schemas/WorkPoolFilter"
+                            },
+                            {
+                                "type": "null"
+                            }
+                        ]
+                    },
+                    "sort": {
+                        "allOf": [
+                            {
+                                "$ref": "#/components/schemas/FlowSort"
+                            }
+                        ],
+                        "default": "NAME_ASC"
+                    },
+                    "limit": {
+                        "type": "integer",
+                        "title": "Limit",
+                        "description": "Defaults to PREFECT_API_DEFAULT_LIMIT if not provided."
+                    }
+                },
+                "type": "object",
+                "title": "Body_paginate_flows_flows_paginate_post"
+            },
             "Body_read_all_concurrency_limits_v2_v2_concurrency_limits_filter_post": {
                 "properties": {
                     "offset": {
@@ -13456,7 +13809,7 @@
                 "type": "object",
                 "title": "Body_read_flow_run_notification_policies_flow_run_notification_policies_filter_post"
             },
-            "Body_read_flow_runs_flow_runs_filter_post": {
+            "Body_read_flow_runs_flow_runs_paginate_post": {
                 "properties": {
                     "sort": {
                         "allOf": [
@@ -13466,11 +13819,11 @@
                         ],
                         "default": "ID_DESC"
                     },
-                    "offset": {
+                    "page": {
                         "type": "integer",
-                        "minimum": 0.0,
-                        "title": "Offset",
-                        "default": 0
+                        "minimum": 1.0,
+                        "title": "Page",
+                        "default": 1
                     },
                     "flows": {
                         "anyOf": [
@@ -13539,7 +13892,7 @@
                     }
                 },
                 "type": "object",
-                "title": "Body_read_flow_runs_flow_runs_filter_post"
+                "title": "Body_read_flow_runs_flow_runs_paginate_post"
             },
             "Body_read_flows_flows_filter_post": {
                 "properties": {
@@ -15301,6 +15654,17 @@
                         ],
                         "description": "Filter criteria for `Deployment.name`"
                     },
+                    "flow_or_deployment_name": {
+                        "anyOf": [
+                            {
+                                "$ref": "#/components/schemas/DeploymentOrFlowNameFilter"
+                            },
+                            {
+                                "type": "null"
+                            }
+                        ],
+                        "description": "Filter criteria for `Deployment.name` or `Flow.name`"
+                    },
                     "paused": {
                         "anyOf": [
                             {
@@ -15653,6 +16017,26 @@
                 "title": "DeploymentFlowRunCreate",
                 "description": "Data used by the Prefect REST API to create a flow run from a deployment."
             },
+            "DeploymentOrFlowNameFilter": {
+                "properties": {
+                    "like_": {
+                        "anyOf": [
+                            {
+                                "type": "string"
+                            },
+                            {
+                                "type": "null"
+                            }
+                        ],
+                        "title": "Like ",
+                        "description": "A case-insensitive partial match on deployment or flow names. For example, passing 'example' might match deployments or flows with 'example' in their names."
+                    }
+                },
+                "additionalProperties": false,
+                "type": "object",
+                "title": "DeploymentOrFlowNameFilter",
+                "description": "Filter by `Deployment.name` or `Flow.name` with a single input string for ilike filtering."
+            },
             "DeploymentResponse": {
                 "properties": {
                     "id": {
@@ -17353,6 +17737,42 @@
                 "title": "FlowFilterTags",
                 "description": "Filter by `Flow.tags`."
             },
+            "FlowPaginationResponse": {
+                "properties": {
+                    "results": {
+                        "items": {
+                            "$ref": "#/components/schemas/Flow"
+                        },
+                        "type": "array",
+                        "title": "Results"
+                    },
+                    "count": {
+                        "type": "integer",
+                        "title": "Count"
+                    },
+                    "limit": {
+                        "type": "integer",
+                        "title": "Limit"
+                    },
+                    "pages": {
+                        "type": "integer",
+                        "title": "Pages"
+                    },
+                    "page": {
+                        "type": "integer",
+                        "title": "Page"
+                    }
+                },
+                "type": "object",
+                "required": [
+                    "results",
+                    "count",
+                    "limit",
+                    "pages",
+                    "page"
+                ],
+                "title": "FlowPaginationResponse"
+            },
             "FlowRun": {
                 "properties": {
                     "id": {
@@ -18434,6 +18854,21 @@
                         ],
                         "title": "Any ",
                         "description": "A list of flow run state names to include"
+                    },
+                    "not_any_": {
+                        "anyOf": [
+                            {
+                                "items": {
+                                    "type": "string"
+                                },
+                                "type": "array"
+                            },
+                            {
+                                "type": "null"
+                            }
+                        ],
+                        "title": "Not Any ",
+                        "description": "A list of flow run state names to exclude"
                     }
                 },
                 "additionalProperties": false,
@@ -18457,6 +18892,21 @@
                         ],
                         "title": "Any ",
                         "description": "A list of flow run state types to include"
+                    },
+                    "not_any_": {
+                        "anyOf": [
+                            {
+                                "items": {
+                                    "$ref": "#/components/schemas/StateType"
+                                },
+                                "type": "array"
+                            },
+                            {
+                                "type": "null"
+                            }
+                        ],
+                        "title": "Not Any ",
+                        "description": "A list of flow run state types to exclude"
                     }
                 },
                 "additionalProperties": false,
@@ -18884,6 +19334,42 @@
                 "title": "FlowRunNotificationPolicyUpdate",
                 "description": "Data used by the Prefect REST API to update a flow run notification policy."
             },
+            "FlowRunPaginationResponse": {
+                "properties": {
+                    "results": {
+                        "items": {
+                            "$ref": "#/components/schemas/FlowRunResponse"
+                        },
+                        "type": "array",
+                        "title": "Results"
+                    },
+                    "count": {
+                        "type": "integer",
+                        "title": "Count"
+                    },
+                    "limit": {
+                        "type": "integer",
+                        "title": "Limit"
+                    },
+                    "pages": {
+                        "type": "integer",
+                        "title": "Pages"
+                    },
+                    "page": {
+                        "type": "integer",
+                        "title": "Page"
+                    }
+                },
+                "type": "object",
+                "required": [
+                    "results",
+                    "count",
+                    "limit",
+                    "pages",
+                    "page"
+                ],
+                "title": "FlowRunPaginationResponse"
+            },
             "FlowRunPolicy": {
                 "properties": {
                     "max_retries": {
@@ -20512,7 +20998,7 @@
                         "anyOf": [
                             {
                                 "type": "string",
-                                "pattern": "Asia/Qatar|Europe/Gibraltar|Pacific/Majuro|Antarctica/Palmer|Europe/Skopje|Asia/Kuching|Asia/Anadyr|Pacific/Noumea|Asia/Shanghai|Australia/Darwin|America/La_Paz|America/Indiana/Vevay|Etc/UCT|Asia/Barnaul|Atlantic/Bermuda|Asia/Novokuznetsk|Indian/Reunion|America/Campo_Grande|America/Punta_Arenas|build/etc/localtime|Pacific/Midway|Chile/Continental|Asia/Bahrain|Australia/South|Atlantic/Stanley|Africa/Gaborone|Asia/Calcutta|Atlantic/Faroe|Asia/Atyrau|Etc/GMT+7|Africa/Libreville|Europe/Tallinn|Etc/GMT+1|Indian/Kerguelen|Asia/Novosibirsk|Europe/Bratislava|America/Metlakatla|Antarctica/Vostok|America/Noronha|Africa/Brazzaville|Africa/Kinshasa|America/Montevideo|Etc/GMT+0|America/Santarem|Atlantic/South_Georgia|Indian/Antananarivo|America/Belize|Asia/Damascus|Europe/San_Marino|America/Danmarkshavn|Mexico/BajaNorte|America/St_Kitts|Asia/Ho_Chi_Minh|America/Nuuk|America/Indiana/Petersburg|Africa/Tunis|America/Merida|Antarctica/DumontDUrville|Asia/Tokyo|America/Miquelon|America/Virgin|Europe/Uzhgorod|America/Port_of_Spain|America/Louisville|Europe/Oslo|Pacific/Kiritimati|US/Arizona|America/Chihuahua|Pacific/Kanton|Asia/Saigon|America/Argentina/Rio_Gallegos|Pacific/Guam|America/Adak|Canada/Eastern|Etc/GMT+3|Etc/GMT-12|Canada/Saskatchewan|Atlantic/St_Helena|Asia/Seoul|US/Indiana-Starke|CET|Africa/Niamey|Atlantic/Faeroe|Australia/ACT|America/Araguaina|Pacific/Chuuk|Africa/Accra|Asia/Kathmandu|America/North_Dakota/New_Salem|America/Sitka|Asia/Almaty|Africa/Nairobi|America/Indiana/Winamac|America/Hermosillo|Africa/Porto-Novo|America/Atka|America/Porto_Velho|Europe/Vaduz|Australia/Perth|Asia/Qostanay|Europe/Rome|Pacific/Norfolk|Asia/Brunei|Singapore|Asia/Jayapura|Australia/Tasmania|Europe/Ljubljana|UTC|Asia/Singapore|Etc/GMT+8|Pacific/Niue|America/Santo_Domingo|America/Blanc-Sablon|Atlantic/Madeira|Africa/Kampala|America/Jujuy|Asia/Yekaterinburg|Etc/GMT+6|America/Glace_Bay|America/St_Barthelemy|Asia/Colombo|America/Ensenada|Europe/Sofia|Australia/NSW|America/Buenos_Aires|America/Rio_Branco|America/Pangnirtung|Mexico/BajaSur|Australia/LHI|UCT|Asia/Dili|MST|Antarctica/Syowa|Asia/Jakarta|America/Cayman|Asia/Rangoon|America/Cayenne|Asia/Dacca|Turkey|America/Argentina/Salta|Etc/GMT-14|America/Chicago|Europe/Lisbon|Canada/Yukon|Canada/Atlantic|Eire|Africa/Dakar|MET|Etc/GMT-11|Japan|America/Maceio|Canada/Mountain|Mexico/General|Africa/Maseru|Pacific/Galapagos|Asia/Famagusta|Antarctica/Macquarie|America/St_Johns|Kwajalein|Iran|America/Caracas|Europe/Berlin|Europe/Amsterdam|Greenwich|Pacific/Palau|America/Rosario|America/Halifax|Egypt|Australia/Queensland|America/Havana|America/New_York|Pacific/Kwajalein|Pacific/Marquesas|Indian/Comoro|Asia/Bangkok|Africa/Mbabane|America/Lower_Princes|America/Cancun|Pacific/Kosrae|Pacific/Wallis|America/Montserrat|Asia/Jerusalem|Africa/Lome|US/Mountain|Africa/Malabo|Atlantic/Azores|Asia/Manila|America/Resolute|America/Argentina/La_Rioja|Africa/Abidjan|Europe/London|Asia/Riyadh|Libya|America/Boise|GB|US/East-Indiana|EET|Etc/Universal|Europe/Stockholm|Australia/Victoria|America/Bogota|Asia/Phnom_Penh|Africa/Ndjamena|Indian/Mayotte|Asia/Baghdad|Asia/Aqtobe|Indian/Maldives|Africa/Lagos|Europe/Budapest|Europe/Samara|Asia/Thimphu|Etc/GMT-9|Europe/Guernsey|America/Martinique|Europe/Andorra|EST5EDT|Africa/Blantyre|America/Guatemala|America/Rankin_Inlet|Africa/Asmara|America/Matamoros|Asia/Yakutsk|PST8PDT|Pacific/Pohnpei|Europe/Tiraspol|Etc/UTC|Pacific/Apia|America/Tegucigalpa|Asia/Taipei|Asia/Chongqing|Africa/Djibouti|America/Ojinaga|Europe/Brussels|Africa/Nouakchott|Brazil/East|Asia/Makassar|Pacific/Auckland|Pacific/Yap|America/Argentina/Tucuman|America/Antigua|MST7MDT|Pacific/Easter|America/Managua|America/Whitehorse|Etc/GMT+12|Africa/Ceuta|America/Curacao|Africa/Lubumbashi|America/Vancouver|Africa/Monrovia|Europe/Busingen|America/Indiana/Tell_City|GMT|Pacific/Gambier|America/Nassau|Etc/GMT+4|Europe/Simferopol|Asia/Vientiane|Asia/Kuwait|CST6CDT|Africa/Banjul|Asia/Harbin|America/Atikokan|America/Guayaquil|Asia/Tbilisi|Asia/Krasnoyarsk|Africa/Bangui|Asia/Chungking|EST|Etc/GMT+11|Asia/Dubai|Asia/Baku|Australia/Hobart|Pacific/Wake|Brazil/DeNoronha|America/Shiprock|US/Samoa|Pacific/Johnston|Africa/Cairo|America/Argentina/Mendoza|America/Indiana/Marengo|Africa/Casablanca|Australia/Brisbane|America/Indiana/Knox|Europe/Astrakhan|Australia/Sydney|Europe/Copenhagen|America/Panama|Asia/Ust-Nera|US/Central|America/Guadeloupe|Indian/Cocos|Arctic/Longyearbyen|Europe/Prague|Asia/Vladivostok|America/Goose_Bay|America/Cuiaba|Europe/Paris|Asia/Macao|Australia/West|Asia/Dushanbe|Europe/Istanbul|Etc/Zulu|Pacific/Port_Moresby|America/Argentina/Catamarca|Europe/Kirov|America/Mendoza|Asia/Gaza|America/Rainy_River|Europe/Nicosia|Israel|America/St_Thomas|Etc/GMT-1|Africa/Khartoum|America/Aruba|Europe/Riga|America/Detroit|America/Creston|Pacific/Guadalcanal|America/Guyana|Navajo|Africa/Douala|Etc/GMT+10|America/Menominee|America/Yakutat|Europe/Belgrade|America/Anchorage|Asia/Pontianak|Europe/Helsinki|Europe/Moscow|America/Santa_Isabel|Australia/Broken_Hill|Indian/Chagos|Australia/Adelaide|America/Santiago|America/Recife|America/Nome|Asia/Khandyga|America/Porto_Acre|Asia/Hebron|Indian/Mahe|America/Regina|Asia/Kolkata|Pacific/Fiji|Atlantic/Reykjavik|Zulu|Asia/Ashgabat|Europe/Tirane|WET|Antarctica/Rothera|Europe/Volgograd|Asia/Karachi|America/Argentina/Jujuy|America/Grenada|America/Monterrey|Pacific/Nauru|GB-Eire|Africa/Conakry|America/Boa_Vista|Pacific/Tarawa|America/Juneau|Africa/Addis_Ababa|America/Puerto_Rico|Asia/Oral|Australia/North|Asia/Sakhalin|America/Bahia|Pacific/Pitcairn|Africa/Lusaka|Etc/GMT-5|America/Swift_Current|Asia/Qyzylorda|America/Winnipeg|Universal|Asia/Kamchatka|Africa/Ouagadougou|America/Thule|America/Indiana/Indianapolis|America/Kentucky/Louisville|America/Asuncion|America/Eirunepe|Asia/Magadan|US/Hawaii|Pacific/Saipan|America/Scoresbysund|Pacific/Enderbury|Africa/Mogadishu|America/Inuvik|Pacific/Tahiti|US/Michigan|Pacific/Funafuti|Africa/Bissau|America/Argentina/Buenos_Aires|Etc/GMT-10|America/Mazatlan|GMT+0|America/Kralendijk|America/Indiana/Vincennes|Africa/Timbuktu|Asia/Pyongyang|Indian/Christmas|America/Kentucky/Monticello|Asia/Tashkent|Asia/Dhaka|Asia/Ulaanbaatar|Asia/Ashkhabad|Europe/Madrid|Antarctica/Casey|Asia/Istanbul|Asia/Yerevan|Europe/Podgorica|America/Catamarca|Brazil/Acre|Asia/Muscat|America/Argentina/Ushuaia|Jamaica|Etc/GMT-7|Etc/GMT-6|Europe/Dublin|Europe/Mariehamn|Iceland|ROC|America/Dawson|Asia/Tel_Aviv|America/Cordoba|America/Phoenix|Asia/Bishkek|Pacific/Ponape|Etc/GMT+2|America/Montreal|America/Manaus|Asia/Tomsk|America/Iqaluit|Pacific/Fakaofo|Etc/GMT0|US/Alaska|Europe/Jersey|Asia/Samarkand|Pacific/Efate|Asia/Choibalsan|Asia/Hovd|Europe/Kiev|America/El_Salvador|America/Barbados|NZ-CHAT|Africa/Asmera|America/Marigot|Antarctica/McMurdo|Africa/Johannesburg|Asia/Urumqi|Asia/Macau|Europe/Belfast|America/Edmonton|Asia/Kashgar|America/Sao_Paulo|Poland|Australia/Currie|Africa/Bamako|Asia/Omsk|America/Paramaribo|Antarctica/Davis|Asia/Chita|America/Tortola|Etc/GMT|Europe/Chisinau|Antarctica/Troll|America/Indianapolis|GMT0|Europe/Vienna|America/Argentina/San_Juan|Canada/Pacific|America/Coral_Harbour|America/Toronto|Asia/Aden|Etc/GMT+5|America/Thunder_Bay|America/Fort_Nelson|GMT-0|Pacific/Bougainville|Europe/Zaporozhye|Etc/GMT-13|Pacific/Truk|America/Los_Angeles|Asia/Kuala_Lumpur|Etc/GMT-0|Pacific/Honolulu|America/Bahia_Banderas|Europe/Sarajevo|America/Grand_Turk|Asia/Irkutsk|Europe/Isle_of_Man|Europe/Vilnius|Pacific/Rarotonga|Africa/Freetown|Africa/Kigali|America/Port-au-Prince|Asia/Thimbu|Europe/Saratov|Asia/Ulan_Bator|Atlantic/Canary|Asia/Kabul|Canada/Central|America/Knox_IN|Europe/Vatican|America/Argentina/ComodRivadavia|America/Fortaleza|Antarctica/South_Pole|Asia/Ujung_Pandang|America/Anguilla|Atlantic/Jan_Mayen|Africa/Windhoek|Canada/Newfoundland|Chile/EasterIsland|Etc/GMT-4|America/Dawson_Creek|Asia/Yangon|Etc/GMT-3|Cuba|Etc/GMT-2|America/St_Vincent|America/Moncton|US/Pacific|America/Fort_Wayne|US/Eastern|Asia/Aqtau|Asia/Beirut|America/Costa_Rica|Asia/Hong_Kong|Europe/Bucharest|Europe/Kyiv|America/Jamaica|Atlantic/Cape_Verde|Africa/Harare|America/Nipigon|Europe/Minsk|Hongkong|Etc/GMT-8|America/St_Lucia|Europe/Malta|Australia/Lord_Howe|Australia/Lindeman|Australia/Yancowinna|HST|W-SU|America/Mexico_City|Africa/Juba|America/Lima|Pacific/Tongatapu|America/Denver|Asia/Amman|Indian/Mauritius|Africa/Sao_Tome|Europe/Zagreb|Africa/Maputo|Pacific/Chatham|America/Dominica|America/Argentina/San_Luis|Africa/Tripoli|Africa/Algiers|America/Argentina/Cordoba|Europe/Ulyanovsk|America/Cambridge_Bay|Asia/Tehran|Brazil/West|US/Aleutian|Africa/Luanda|Asia/Srednekolymsk|Africa/Dar_es_Salaam|Factory|Antarctica/Mawson|Asia/Katmandu|NZ|Pacific/Samoa|Portugal|Australia/Melbourne|America/Godthab|Europe/Warsaw|PRC|Etc/GMT+9|Europe/Zurich|Australia/Canberra|America/North_Dakota/Beulah|Europe/Luxembourg|Africa/El_Aaiun|Pacific/Pago_Pago|America/Tijuana|America/Yellowknife|Asia/Nicosia|America/Belem|Africa/Bujumbura|America/North_Dakota/Center|Europe/Athens|Europe/Monaco|America/Ciudad_Juarez|Europe/Kaliningrad|Etc/Greenwich|ROK|Australia/Eucla",
+                                "pattern": "Africa/Abidjan|Africa/Accra|Africa/Addis_Ababa|Africa/Algiers|Africa/Asmara|Africa/Asmera|Africa/Bamako|Africa/Bangui|Africa/Banjul|Africa/Bissau|Africa/Blantyre|Africa/Brazzaville|Africa/Bujumbura|Africa/Cairo|Africa/Casablanca|Africa/Ceuta|Africa/Conakry|Africa/Dakar|Africa/Dar_es_Salaam|Africa/Djibouti|Africa/Douala|Africa/El_Aaiun|Africa/Freetown|Africa/Gaborone|Africa/Harare|Africa/Johannesburg|Africa/Juba|Africa/Kampala|Africa/Khartoum|Africa/Kigali|Africa/Kinshasa|Africa/Lagos|Africa/Libreville|Africa/Lome|Africa/Luanda|Africa/Lubumbashi|Africa/Lusaka|Africa/Malabo|Africa/Maputo|Africa/Maseru|Africa/Mbabane|Africa/Mogadishu|Africa/Monrovia|Africa/Nairobi|Africa/Ndjamena|Africa/Niamey|Africa/Nouakchott|Africa/Ouagadougou|Africa/Porto-Novo|Africa/Sao_Tome|Africa/Timbuktu|Africa/Tripoli|Africa/Tunis|Africa/Windhoek|America/Adak|America/Anchorage|America/Anguilla|America/Antigua|America/Araguaina|America/Argentina/Buenos_Aires|America/Argentina/Catamarca|America/Argentina/ComodRivadavia|America/Argentina/Cordoba|America/Argentina/Jujuy|America/Argentina/La_Rioja|America/Argentina/Mendoza|America/Argentina/Rio_Gallegos|America/Argentina/Salta|America/Argentina/San_Juan|America/Argentina/San_Luis|America/Argentina/Tucuman|America/Argentina/Ushuaia|America/Aruba|America/Asuncion|America/Atikokan|America/Atka|America/Bahia|America/Bahia_Banderas|America/Barbados|America/Belem|America/Belize|America/Blanc-Sablon|America/Boa_Vista|America/Bogota|America/Boise|America/Buenos_Aires|America/Cambridge_Bay|America/Campo_Grande|America/Cancun|America/Caracas|America/Catamarca|America/Cayenne|America/Cayman|America/Chicago|America/Chihuahua|America/Ciudad_Juarez|America/Coral_Harbour|America/Cordoba|America/Costa_Rica|America/Creston|America/Cuiaba|America/Curacao|America/Danmarkshavn|America/Dawson|America/Dawson_Creek|America/Denver|America/Detroit|America/Dominica|America/Edmonton|America/Eirunepe|America/El_Salvador|America/Ensenada|America/Fort_Nelson|America/Fort_Wayne|America/Fortaleza|America/Glace_Bay|America/Godthab|America/Goose_Bay|America/Grand_Turk|America/Grenada|America/Guadeloupe|America/Guatemala|America/Guayaquil|America/Guyana|America/Halifax|America/Havana|America/Hermosillo|America/Indiana/Indianapolis|America/Indiana/Knox|America/Indiana/Marengo|America/Indiana/Petersburg|America/Indiana/Tell_City|America/Indiana/Vevay|America/Indiana/Vincennes|America/Indiana/Winamac|America/Indianapolis|America/Inuvik|America/Iqaluit|America/Jamaica|America/Jujuy|America/Juneau|America/Kentucky/Louisville|America/Kentucky/Monticello|America/Knox_IN|America/Kralendijk|America/La_Paz|America/Lima|America/Los_Angeles|America/Louisville|America/Lower_Princes|America/Maceio|America/Managua|America/Manaus|America/Marigot|America/Martinique|America/Matamoros|America/Mazatlan|America/Mendoza|America/Menominee|America/Merida|America/Metlakatla|America/Mexico_City|America/Miquelon|America/Moncton|America/Monterrey|America/Montevideo|America/Montreal|America/Montserrat|America/Nassau|America/New_York|America/Nipigon|America/Nome|America/Noronha|America/North_Dakota/Beulah|America/North_Dakota/Center|America/North_Dakota/New_Salem|America/Nuuk|America/Ojinaga|America/Panama|America/Pangnirtung|America/Paramaribo|America/Phoenix|America/Port-au-Prince|America/Port_of_Spain|America/Porto_Acre|America/Porto_Velho|America/Puerto_Rico|America/Punta_Arenas|America/Rainy_River|America/Rankin_Inlet|America/Recife|America/Regina|America/Resolute|America/Rio_Branco|America/Rosario|America/Santa_Isabel|America/Santarem|America/Santiago|America/Santo_Domingo|America/Sao_Paulo|America/Scoresbysund|America/Shiprock|America/Sitka|America/St_Barthelemy|America/St_Johns|America/St_Kitts|America/St_Lucia|America/St_Thomas|America/St_Vincent|America/Swift_Current|America/Tegucigalpa|America/Thule|America/Thunder_Bay|America/Tijuana|America/Toronto|America/Tortola|America/Vancouver|America/Virgin|America/Whitehorse|America/Winnipeg|America/Yakutat|America/Yellowknife|Antarctica/Casey|Antarctica/Davis|Antarctica/DumontDUrville|Antarctica/Macquarie|Antarctica/Mawson|Antarctica/McMurdo|Antarctica/Palmer|Antarctica/Rothera|Antarctica/South_Pole|Antarctica/Syowa|Antarctica/Troll|Antarctica/Vostok|Arctic/Longyearbyen|Asia/Aden|Asia/Almaty|Asia/Amman|Asia/Anadyr|Asia/Aqtau|Asia/Aqtobe|Asia/Ashgabat|Asia/Ashkhabad|Asia/Atyrau|Asia/Baghdad|Asia/Bahrain|Asia/Baku|Asia/Bangkok|Asia/Barnaul|Asia/Beirut|Asia/Bishkek|Asia/Brunei|Asia/Calcutta|Asia/Chita|Asia/Choibalsan|Asia/Chongqing|Asia/Chungking|Asia/Colombo|Asia/Dacca|Asia/Damascus|Asia/Dhaka|Asia/Dili|Asia/Dubai|Asia/Dushanbe|Asia/Famagusta|Asia/Gaza|Asia/Harbin|Asia/Hebron|Asia/Ho_Chi_Minh|Asia/Hong_Kong|Asia/Hovd|Asia/Irkutsk|Asia/Istanbul|Asia/Jakarta|Asia/Jayapura|Asia/Jerusalem|Asia/Kabul|Asia/Kamchatka|Asia/Karachi|Asia/Kashgar|Asia/Kathmandu|Asia/Katmandu|Asia/Khandyga|Asia/Kolkata|Asia/Krasnoyarsk|Asia/Kuala_Lumpur|Asia/Kuching|Asia/Kuwait|Asia/Macao|Asia/Macau|Asia/Magadan|Asia/Makassar|Asia/Manila|Asia/Muscat|Asia/Nicosia|Asia/Novokuznetsk|Asia/Novosibirsk|Asia/Omsk|Asia/Oral|Asia/Phnom_Penh|Asia/Pontianak|Asia/Pyongyang|Asia/Qatar|Asia/Qostanay|Asia/Qyzylorda|Asia/Rangoon|Asia/Riyadh|Asia/Saigon|Asia/Sakhalin|Asia/Samarkand|Asia/Seoul|Asia/Shanghai|Asia/Singapore|Asia/Srednekolymsk|Asia/Taipei|Asia/Tashkent|Asia/Tbilisi|Asia/Tehran|Asia/Tel_Aviv|Asia/Thimbu|Asia/Thimphu|Asia/Tokyo|Asia/Tomsk|Asia/Ujung_Pandang|Asia/Ulaanbaatar|Asia/Ulan_Bator|Asia/Urumqi|Asia/Ust-Nera|Asia/Vientiane|Asia/Vladivostok|Asia/Yakutsk|Asia/Yangon|Asia/Yekaterinburg|Asia/Yerevan|Atlantic/Azores|Atlantic/Bermuda|Atlantic/Canary|Atlantic/Cape_Verde|Atlantic/Faeroe|Atlantic/Faroe|Atlantic/Jan_Mayen|Atlantic/Madeira|Atlantic/Reykjavik|Atlantic/South_Georgia|Atlantic/St_Helena|Atlantic/Stanley|Australia/ACT|Australia/Adelaide|Australia/Brisbane|Australia/Broken_Hill|Australia/Canberra|Australia/Currie|Australia/Darwin|Australia/Eucla|Australia/Hobart|Australia/LHI|Australia/Lindeman|Australia/Lord_Howe|Australia/Melbourne|Australia/NSW|Australia/North|Australia/Perth|Australia/Queensland|Australia/South|Australia/Sydney|Australia/Tasmania|Australia/Victoria|Australia/West|Australia/Yancowinna|Brazil/Acre|Brazil/DeNoronha|Brazil/East|Brazil/West|CET|CST6CDT|Canada/Atlantic|Canada/Central|Canada/Eastern|Canada/Mountain|Canada/Newfoundland|Canada/Pacific|Canada/Saskatchewan|Canada/Yukon|Chile/Continental|Chile/EasterIsland|Cuba|EET|EST|EST5EDT|Egypt|Eire|Etc/GMT|Etc/GMT+0|Etc/GMT+1|Etc/GMT+10|Etc/GMT+11|Etc/GMT+12|Etc/GMT+2|Etc/GMT+3|Etc/GMT+4|Etc/GMT+5|Etc/GMT+6|Etc/GMT+7|Etc/GMT+8|Etc/GMT+9|Etc/GMT-0|Etc/GMT-1|Etc/GMT-10|Etc/GMT-11|Etc/GMT-12|Etc/GMT-13|Etc/GMT-14|Etc/GMT-2|Etc/GMT-3|Etc/GMT-4|Etc/GMT-5|Etc/GMT-6|Etc/GMT-7|Etc/GMT-8|Etc/GMT-9|Etc/GMT0|Etc/Greenwich|Etc/UCT|Etc/UTC|Etc/Universal|Etc/Zulu|Europe/Amsterdam|Europe/Andorra|Europe/Astrakhan|Europe/Athens|Europe/Belfast|Europe/Belgrade|Europe/Berlin|Europe/Bratislava|Europe/Brussels|Europe/Bucharest|Europe/Budapest|Europe/Busingen|Europe/Chisinau|Europe/Copenhagen|Europe/Dublin|Europe/Gibraltar|Europe/Guernsey|Europe/Helsinki|Europe/Isle_of_Man|Europe/Istanbul|Europe/Jersey|Europe/Kaliningrad|Europe/Kiev|Europe/Kirov|Europe/Kyiv|Europe/Lisbon|Europe/Ljubljana|Europe/London|Europe/Luxembourg|Europe/Madrid|Europe/Malta|Europe/Mariehamn|Europe/Minsk|Europe/Monaco|Europe/Moscow|Europe/Nicosia|Europe/Oslo|Europe/Paris|Europe/Podgorica|Europe/Prague|Europe/Riga|Europe/Rome|Europe/Samara|Europe/San_Marino|Europe/Sarajevo|Europe/Saratov|Europe/Simferopol|Europe/Skopje|Europe/Sofia|Europe/Stockholm|Europe/Tallinn|Europe/Tirane|Europe/Tiraspol|Europe/Ulyanovsk|Europe/Uzhgorod|Europe/Vaduz|Europe/Vatican|Europe/Vienna|Europe/Vilnius|Europe/Volgograd|Europe/Warsaw|Europe/Zagreb|Europe/Zaporozhye|Europe/Zurich|Factory|GB|GB-Eire|GMT|GMT+0|GMT-0|GMT0|Greenwich|HST|Hongkong|Iceland|Indian/Antananarivo|Indian/Chagos|Indian/Christmas|Indian/Cocos|Indian/Comoro|Indian/Kerguelen|Indian/Mahe|Indian/Maldives|Indian/Mauritius|Indian/Mayotte|Indian/Reunion|Iran|Israel|Jamaica|Japan|Kwajalein|Libya|MET|MST|MST7MDT|Mexico/BajaNorte|Mexico/BajaSur|Mexico/General|NZ|NZ-CHAT|Navajo|PRC|PST8PDT|Pacific/Apia|Pacific/Auckland|Pacific/Bougainville|Pacific/Chatham|Pacific/Chuuk|Pacific/Easter|Pacific/Efate|Pacific/Enderbury|Pacific/Fakaofo|Pacific/Fiji|Pacific/Funafuti|Pacific/Galapagos|Pacific/Gambier|Pacific/Guadalcanal|Pacific/Guam|Pacific/Honolulu|Pacific/Johnston|Pacific/Kanton|Pacific/Kiritimati|Pacific/Kosrae|Pacific/Kwajalein|Pacific/Majuro|Pacific/Marquesas|Pacific/Midway|Pacific/Nauru|Pacific/Niue|Pacific/Norfolk|Pacific/Noumea|Pacific/Pago_Pago|Pacific/Palau|Pacific/Pitcairn|Pacific/Pohnpei|Pacific/Ponape|Pacific/Port_Moresby|Pacific/Rarotonga|Pacific/Saipan|Pacific/Samoa|Pacific/Tahiti|Pacific/Tarawa|Pacific/Tongatapu|Pacific/Truk|Pacific/Wake|Pacific/Wallis|Pacific/Yap|Poland|Portugal|ROC|ROK|Singapore|Turkey|UCT|US/Alaska|US/Aleutian|US/Arizona|US/Central|US/East-Indiana|US/Eastern|US/Hawaii|US/Indiana-Starke|US/Michigan|US/Mountain|US/Pacific|US/Samoa|UTC|Universal|W-SU|WET|Zulu|localtime",
                                 "default": "UTC"
                             },
                             {
@@ -21565,16 +22051,14 @@
                         "default": 3
                     },
                     "PREFECT_API_SERVICES_SCHEDULER_MAX_SCHEDULED_TIME": {
-                        "type": "string",
-                        "format": "duration",
+                        "type": "number",
                         "title": "Prefect Api Services Scheduler Max Scheduled Time",
-                        "default": "P100D"
+                        "default": 8640000.0
                     },
                     "PREFECT_API_SERVICES_SCHEDULER_MIN_SCHEDULED_TIME": {
-                        "type": "string",
-                        "format": "duration",
+                        "type": "number",
                         "title": "Prefect Api Services Scheduler Min Scheduled Time",
-                        "default": "PT1H"
+                        "default": 3600.0
                     },
                     "PREFECT_API_SERVICES_SCHEDULER_INSERT_BATCH_SIZE": {
                         "type": "integer",
@@ -21587,10 +22071,9 @@
                         "default": 5
                     },
                     "PREFECT_API_SERVICES_LATE_RUNS_AFTER_SECONDS": {
-                        "type": "string",
-                        "format": "duration",
+                        "type": "number",
                         "title": "Prefect Api Services Late Runs After Seconds",
-                        "default": "PT15S"
+                        "default": 15.0
                     },
                     "PREFECT_API_SERVICES_PAUSE_EXPIRATIONS_LOOP_SECONDS": {
                         "type": "number",
@@ -21632,6 +22115,11 @@
                         "title": "Prefect Api Services Foreman Work Queue Last Polled Timeout Seconds",
                         "default": 60
                     },
+                    "PREFECT_API_LOG_RETRYABLE_ERRORS": {
+                        "type": "boolean",
+                        "title": "Prefect Api Log Retryable Errors",
+                        "default": false
+                    },
                     "PREFECT_API_DEFAULT_LIMIT": {
                         "type": "integer",
                         "title": "Prefect Api Default Limit",
@@ -21658,10 +22146,9 @@
                         "default": false
                     },
                     "PREFECT_SERVER_CSRF_TOKEN_EXPIRATION": {
-                        "type": "string",
-                        "format": "duration",
+                        "type": "number",
                         "title": "Prefect Server Csrf Token Expiration",
-                        "default": "PT1H"
+                        "default": 3600.0
                     },
                     "PREFECT_UI_ENABLED": {
                         "type": "boolean",
@@ -21870,10 +22357,9 @@
                         "default": 100
                     },
                     "PREFECT_TASK_SCHEDULING_PENDING_TASK_TIMEOUT": {
-                        "type": "string",
-                        "format": "duration",
+                        "type": "number",
                         "title": "Prefect Task Scheduling Pending Task Timeout",
-                        "default": "PT30S"
+                        "default": 30.0
                     },
                     "PREFECT_EXPERIMENTAL_ENABLE_EXTRA_RUNNER_ENDPOINTS": {
                         "type": "boolean",
@@ -22000,16 +22486,14 @@
                         "default": true
                     },
                     "PREFECT_EVENTS_EXPIRED_BUCKET_BUFFER": {
-                        "type": "string",
-                        "format": "duration",
+                        "type": "number",
                         "title": "Prefect Events Expired Bucket Buffer",
-                        "default": "PT1M"
+                        "default": 60.0
                     },
                     "PREFECT_EVENTS_PROACTIVE_GRANULARITY": {
-                        "type": "string",
-                        "format": "duration",
+                        "type": "number",
                         "title": "Prefect Events Proactive Granularity",
-                        "default": "PT5S"
+                        "default": 5.0
                     },
                     "PREFECT_API_SERVICES_EVENT_PERSISTER_ENABLED": {
                         "type": "boolean",
@@ -22029,10 +22513,9 @@
                         "default": 5
                     },
                     "PREFECT_EVENTS_RETENTION_PERIOD": {
-                        "type": "string",
-                        "format": "duration",
+                        "type": "number",
                         "title": "Prefect Events Retention Period",
-                        "default": "P7D"
+                        "default": 604800.0
                     },
                     "PREFECT_API_EVENTS_STREAM_OUT_ENABLED": {
                         "type": "boolean",
@@ -22040,13 +22523,11 @@
                         "default": true
                     },
                     "PREFECT_API_EVENTS_RELATED_RESOURCE_CACHE_TTL": {
-                        "type": "string",
-                        "format": "duration",
+                        "type": "number",
                         "title": "Prefect Api Events Related Resource Cache Ttl",
-                        "default": "PT5M"
+                        "default": 300.0
                     }
                 },
-                "additionalProperties": false,
                 "type": "object",
                 "title": "Settings",
                 "description": "Contains validated Prefect settings.\n\nSettings should be accessed using the relevant `Setting` object. For example:\n```python\nfrom prefect.settings import PREFECT_HOME\nPREFECT_HOME.value()\n```\n\nAccessing a setting attribute directly will ignore any `value_callback` mutations.\nThis is not recommended:\n```python\nfrom prefect.settings import Settings\nSettings().PREFECT_PROFILES_PATH  # PosixPath('${PREFECT_HOME}/profiles.toml')\n```"
@@ -24166,8 +24647,15 @@
                         "description": "The current status of the work pool."
                     },
                     "default_queue_id": {
-                        "type": "string",
-                        "format": "uuid",
+                        "anyOf": [
+                            {
+                                "type": "string",
+                                "format": "uuid"
+                            },
+                            {
+                                "type": "null"
+                            }
+                        ],
                         "title": "Default Queue Id",
                         "description": "The id of the pool's default queue."
                     }
diff --git a/docs/3.0rc/resources/daemonize-processes.mdx b/docs/3.0rc/resources/daemonize-processes.mdx
index 7f9eed302b7f..9243c0e0444b 100644
--- a/docs/3.0rc/resources/daemonize-processes.mdx
+++ b/docs/3.0rc/resources/daemonize-processes.mdx
@@ -1,13 +1,12 @@
 ---
 title: Daemonize processes for deployments
-description: Learn how Prefect flow deployments enable configuring flows for scheduled and 
-remote execution with workers.
+description: Learn how Prefect flow deployments enable configuring flows for scheduled and remote execution with workers.
 ---
 
-When running workflow applications, it's helpful to create long-running processes that 
+When running workflow applications, it's helpful to create long-running processes that
 run at startup and are resilient to failure.
 
-This guide shows you how to set up a systemd service to create long-running Prefect processes 
+This guide shows you how to set up a systemd service to create long-running Prefect processes
 that poll for scheduled flow runs, including how to:
 
 * create a Linux user
@@ -16,28 +15,28 @@ that poll for scheduled flow runs, including how to:
 
 ## Prerequisites
 
-* An environment with a linux operating system with [systemd](https://systemd.io/) and Python 3.9 
+* An environment with a linux operating system with [systemd](https://systemd.io/) and Python 3.9
 or later.
 * A superuser account (you can run `sudo` commands).
 * A Prefect Cloud account, or a local instance of a Prefect server running on your network.
-* If daemonizing a worker, you'll need a Prefect [deployment](/3.0rc/deploy/serve-workflows/) with a 
+* If daemonizing a worker, you'll need a Prefect [deployment](/3.0rc/deploy/serve-workflows/) with a
 [work pool](/3.0rc/deploy/dynamic-infra/control-runs/) your worker can connect to.
 
-If using an [AWS t2-micro EC2 instance](https://aws.amazon.com/ec2/instance-types/t2/) with an 
+If using an [AWS t2-micro EC2 instance](https://aws.amazon.com/ec2/instance-types/t2/) with an
 AWS Linux image, you can install Python and pip with `sudo yum install -y python3 python3-pip`.
 
 ## Steps
 
 A systemd service is ideal for running a long-lived process on a Linux VM or physical Linux server.
-You will use systemd and learn how to automatically start a 
-[Prefect worker](/3.0rc/deploy/dynamic-infra/control-runs/#worker-overview) or 
+You will use systemd and learn how to automatically start a
+[Prefect worker](/3.0rc/deploy/dynamic-infra/control-runs/#worker-overview) or
 long-lived [`serve` process](/3.0rc/develop/write-workflows/#serving-a-flow) when Linux starts.
 This approach provides resilience by automatically restarting the process if it crashes.
 
 ### Step 1: Add a user
 
 Create a user account on your Linux system for the Prefect process.
-Although you can run a worker or serve process as root, it's a good security practice to avoid doing 
+Although you can run a worker or serve process as root, it's a good security practice to avoid doing
 so.
 
 In a terminal, run:
@@ -65,12 +64,12 @@ pip3 install prefect
 
 This guide assumes you are installing Prefect globally, not in a virtual environment.
 If running a systemd service in a virtual environment, change the ExecPath.
-For example, if using [venv](https://docs.python.org/3/library/venv.html), change the ExecPath 
+For example, if using [venv](https://docs.python.org/3/library/venv.html), change the ExecPath
 to target the `prefect` application in the `bin` subdirectory of your virtual environment.
 
 Next, set up your environment so the Prefect client knows which server to connect to.
 
-If connecting to Prefect Cloud, follow [the instructions](https://docs.prefect.io/ui/cloud-get-started/#create-an-api-key) 
+If connecting to Prefect Cloud, follow [the instructions](https://docs.prefect.io/ui/cloud-get-started/#create-an-api-key)
 to obtain an API key, and then run the following:
 
 ```bash
@@ -79,7 +78,7 @@ prefect cloud login -k YOUR_API_KEY
 
 When prompted, choose the Prefect workspace to log in to.
 
-If connecting to a self-hosted Prefect server instance instead of Prefect Cloud, run the following 
+If connecting to a self-hosted Prefect server instance instead of Prefect Cloud, run the following
 and substitute the IP address of your server:
 
 ```bash
@@ -87,13 +86,13 @@ prefect config set PREFECT_API_URL=http://your-prefect-server-IP:4200
 ```
 
 Run the `exit` command to sign out of the `prefect` Linux account.
-This command switches you back to your sudo-enabled account where you can run the commands in the 
+This command switches you back to your sudo-enabled account where you can run the commands in the
 next section.
 
 ### Step 3: Set up a systemd service
 
 See the section below if you are setting up a Prefect worker.
-Skip to the [next section](#setting-up-a-systemd-service-for-serve) if you are setting up a 
+Skip to the [next section](#setting-up-a-systemd-service-for-serve) if you are setting up a
 Prefect `.serve` process.
 
 #### Setting up a systemd service for a Prefect worker
@@ -124,7 +123,7 @@ Make sure you substitute your own work pool name.
 
 #### Setting up a systemd service for `.serve`
 
-Copy your flow entrypoint Python file and any other files needed for your flow to run into the 
+Copy your flow entrypoint Python file and any other files needed for your flow to run into the
 `/home` directory (or the directory of your choice).
 
 Here's a basic example flow:
@@ -141,8 +140,8 @@ if __name__=="__main__":
     say_hi.serve(name="Greeting from daemonized .serve")
 ```
 
-To make changes to your flow code without restarting your process, push your 
-code to git-based cloud storage (GitHub, BitBucket, GitLab) and use `flow.from_source().serve()`, 
+To make changes to your flow code without restarting your process, push your
+code to git-based cloud storage (GitHub, BitBucket, GitLab) and use `flow.from_source().serve()`,
 as in the example below.
 
 ```python title="my_remote_flow_code_file.py"
@@ -192,7 +191,7 @@ Next, run `sudo systemctl start my-prefect-service` to start the service.
 
 Run your deployment from the UI and check the logs on the **Flow Runs** page.
 
-You can see if your daemonized Prefect worker or serve process is running, and the 
+You can see if your daemonized Prefect worker or serve process is running, and the
 Prefect logs with `systemctl status my-prefect-service`.
 
-You now have a systemd service that starts when your system boots, which will restart if it ever crashes.
\ No newline at end of file
+You now have a systemd service that starts when your system boots, which will restart if it ever crashes.
diff --git a/docs/mint.json b/docs/mint.json
index 27123403e62a..d88e4fbf70c3 100644
--- a/docs/mint.json
+++ b/docs/mint.json
@@ -75,7 +75,7 @@
           "version": "3.0rc",
           "pages": [
             "3.0rc/develop/write-workflows/index",
-            "3.0rc/develop/write-workflows/pause-cancel-flows", 
+            "3.0rc/develop/write-workflows/pause-cancel-flows",
             "3.0rc/develop/write-workflows/variables"
           ]
         },
@@ -84,12 +84,12 @@
           "version": "3.0rc",
           "pages": [
             "3.0rc/develop/write-tasks/index",
-            "3.0rc/develop/write-tasks/separate-logic", 
+            "3.0rc/develop/write-tasks/separate-logic",
             "3.0rc/develop/write-tasks/task-run-limits",
             "3.0rc/develop/write-tasks/use-task-runners",
-            "3.0rc/develop/write-tasks/dask-and-ray", 
+            "3.0rc/develop/write-tasks/dask-and-ray",
             "3.0rc/develop/write-tasks/upstream-dependencies",
-            "3.0rc/develop/write-tasks/deferred-tasks" 
+            "3.0rc/develop/write-tasks/deferred-tasks"
           ]
         },
         "3.0rc/develop/recover-from-failure",
@@ -196,7 +196,7 @@
         "3.0rc/cloud/configure-client",
         "3.0rc/cloud/interact-with-api",
         "3.0rc/cloud/secrets",
-        "3.0rc/cloud/terraform-provider", 
+        "3.0rc/cloud/terraform-provider",
         "3.0rc/cloud/troubleshoot-cloud"
       ]
     },
@@ -216,7 +216,6 @@
         "3.0rc/resources/cli-shell",
         "3.0rc/resources/daemonize-processes",
         "3.0rc/resources/big-data"
-
       ]
     },
     {
@@ -480,7 +479,7 @@
           "group": "Root",
           "pages": [
             "3.0rc/api-ref/server/root/health-check",
-            "3.0rc/api-ref/server/root/orion-info",
+            "3.0rc/api-ref/server/root/server-version",
             "3.0rc/api-ref/server/root/hello",
             "3.0rc/api-ref/server/root/perform-readiness-check"
           ]
@@ -495,6 +494,7 @@
             "3.0rc/api-ref/server/flows/count-flows",
             "3.0rc/api-ref/server/flows/read-flow-by-name",
             "3.0rc/api-ref/server/flows/read-flows",
+            "3.0rc/api-ref/server/flows/paginate-flows",
             "3.0rc/api-ref/server/flows/count-deployments-by-flow",
             "3.0rc/api-ref/server/flows/next-runs-by-flow"
           ]
@@ -512,13 +512,15 @@
             "3.0rc/api-ref/server/flow-runs/read-flow-run-graph-v1",
             "3.0rc/api-ref/server/flow-runs/read-flow-run-graph-v2",
             "3.0rc/api-ref/server/flow-runs/resume-flow-run",
-            "3.0rc/api-ref/server/flow-runs/read-flow-runs",
+            "3.0rc/api-ref/server/flow-runs/paginate-flow-runs",
             "3.0rc/api-ref/server/flow-runs/set-flow-run-state",
             "3.0rc/api-ref/server/flow-runs/create-flow-run-input",
             "3.0rc/api-ref/server/flow-runs/filter-flow-run-input",
             "3.0rc/api-ref/server/flow-runs/read-flow-run-input",
             "3.0rc/api-ref/server/flow-runs/delete-flow-run-input",
-            "3.0rc/api-ref/server/flow-runs/read-flow-run-history"
+            "3.0rc/api-ref/server/flow-runs/read-flow-runs",
+            "3.0rc/api-ref/server/flow-runs/read-flow-run-history",
+            "3.0rc/api-ref/server/flow-runs/count-task-runs-by-flow-run"
           ]
         },
         {
@@ -771,7 +773,8 @@
             "3.0rc/api-ref/server/admin/drop-database",
             "3.0rc/api-ref/server/admin/create-database"
           ]
-        }
+        },
+        "3.0rc/api-ref/server/create-csrf-token"
       ]
     },
     {
diff --git a/scripts/generate_mintlify_openapi_docs.py b/scripts/generate_mintlify_openapi_docs.py
new file mode 100755
index 000000000000..8c1a1851e31d
--- /dev/null
+++ b/scripts/generate_mintlify_openapi_docs.py
@@ -0,0 +1,168 @@
+#!/usr/bin/env python3
+import json
+import subprocess
+import sys
+from pathlib import Path
+from typing import Any, Union
+
+from prefect.server.api.server import create_app
+
+Mint = dict[str, Any]
+Navigation = list[dict[str, Any]]
+SinglePage = str
+PageGroup = dict[str, Any]
+
+
+def docs_path() -> Path:
+    return Path(__file__).parent.parent / "docs"
+
+
+def current_version() -> str:
+    # TODO: derive this from the docs and the current version of the prefect package
+    return "3.0rc"
+
+
+def main():
+    ensure_mintlify_installed()
+
+    version = current_version()
+    server_docs_path = docs_path() / f"{version}/api-ref/server/"
+
+    suggestions = generate_schema_documentation(version, server_docs_path)
+
+    mint_json, current_navigation = load_mint_and_server_navigation(version)
+
+    # Add any additional pages that are not generated from the schema but that we
+    # definitely want to include, like the main index page
+    keepers = {f"{version}/api-ref/server/index"}
+
+    merge_suggestions(current_navigation, suggestions, keepers)
+
+    remove_orphaned_pages(server_docs_path, current_navigation)
+
+    write_mint(mint_json)
+
+
+def ensure_mintlify_installed():
+    result = subprocess.run(["which", "mintlify-scrape"], capture_output=False)
+    if result.returncode == 0:
+        return
+
+    result = subprocess.run(["which", "npm"], capture_output=False)
+    if result.returncode != 0:
+        print(
+            "Neither `@mintlify/scraping` nor `npm` are installed.  Please make sure "
+            "you have a working `npm` installation before generating API docs.",
+            file=sys.stderr,
+        )
+        sys.exit(1)
+
+    print("@mintlify/scraping is not installed. Installing...")
+    subprocess.check_call(["npm", "install", "-g", "@mintlify/scraping"])
+
+
+def generate_schema_documentation(version: str, server_docs_path: Path) -> Navigation:
+    """Write the current OpenAPI schema to the given path, generates documentation files
+    from it, then returns Mintlify's recommended navigation updates."""
+    openapi_schema = create_app().openapi()
+    openapi_schema["info"]["version"] = version
+
+    schema_path = server_docs_path / "schema.json"
+    with open(schema_path, "w") as f:
+        json.dump(openapi_schema, f, indent=4, ensure_ascii=False)
+        f.flush()
+
+    result = subprocess.run(
+        [
+            "mintlify-scrape",
+            "openapi-file",
+            schema_path,
+            "-o",
+            server_docs_path.relative_to(docs_path()),
+        ],
+        cwd=docs_path(),
+        stdout=subprocess.PIPE,
+        encoding="utf-8",
+        check=True,
+    )
+
+    # mintlify-scrape will output a list of suggestions for navigation objects, prefixed
+    # with a header "navigation object suggestion:"
+    output = result.stdout.replace("navigation object suggestion:\n", "")
+    suggestions = json.loads(output)
+    return suggestions
+
+
+def load_mint_and_server_navigation(version: str) -> tuple[Mint, Navigation]:
+    """Loads the overall Mintlify configuration and finds (or creates) the navigation
+    entry for the Server API REST documentation for the given version"""
+
+    with open(docs_path() / "mint.json", "r") as f:
+        mint_json = json.load(f)
+
+    for group in mint_json["navigation"]:
+        if group["group"] == "Server API" and group["version"] == version:
+            return mint_json, group["pages"]
+
+    current_navigation = {
+        "group": "Server API",
+        "version": version,
+        "pages": [],
+    }
+    mint_json["navigation"].append(current_navigation)
+
+    return mint_json, current_navigation["pages"]
+
+
+def merge_suggestions(
+    current_navigation: Navigation, suggestions: Navigation, keepers: set[SinglePage]
+):
+    """Merges the suggestions into the current navigation, updating the current
+    navigation in-place"""
+    suggestions_by_group: dict[str, Union[PageGroup, SinglePage]] = {
+        suggestion["group"] if isinstance(suggestion, dict) else suggestion: suggestion
+        for suggestion in suggestions
+    }
+    current_by_group: dict[str, Union[PageGroup, SinglePage]] = {
+        item["group"] if isinstance(item, dict) else item: item
+        for item in current_navigation
+    }
+
+    for group, suggestion in suggestions_by_group.items():
+        if group not in current_by_group:
+            current_navigation.append(suggestion)
+        else:
+            current = current_by_group[group]
+            if current == suggestion:
+                continue
+
+            current["pages"] = suggestion["pages"]
+
+    for group, current in current_by_group.items():
+        if group not in suggestions_by_group and group not in keepers:
+            current_navigation.remove(current)
+
+
+def remove_orphaned_pages(server_docs_path: Path, current_navigation: Navigation):
+    """Removes any pages that are not in the current navigation from the docs directory"""
+    all_desired_pages = set()
+    for item in current_navigation:
+        if isinstance(item, dict):
+            all_desired_pages.update(item["pages"])
+        else:
+            all_desired_pages.add(item)
+
+    for page in server_docs_path.glob("**/*.mdx"):
+        page_file = Path(page)
+        page_path = page_file.relative_to(docs_path()).with_suffix("")
+        if str(page_path) not in all_desired_pages:
+            page_file.unlink()
+
+
+def write_mint(mint_json):
+    with open(docs_path() / "mint.json", "w") as f:
+        json.dump(mint_json, f, indent=2, ensure_ascii=False)
+
+
+if __name__ == "__main__":
+    main()
diff --git a/src/prefect/server/api/server.py b/src/prefect/server/api/server.py
index e23e7520f032..d4342ec7aa74 100644
--- a/src/prefect/server/api/server.py
+++ b/src/prefect/server/api/server.py
@@ -299,7 +299,7 @@ async def health_check():
         return True
 
     @api_app.get(version_check_path, tags=["Root"])
-    async def orion_info():
+    async def server_version():
         return SERVER_API_VERSION
 
     # always include version checking
diff --git a/src/prefect/types/__init__.py b/src/prefect/types/__init__.py
index dcdfdeed753f..2a708c02ede1 100644
--- a/src/prefect/types/__init__.py
+++ b/src/prefect/types/__init__.py
@@ -20,7 +20,7 @@
 NonNegativeInteger = Annotated[int, Field(ge=0)]
 PositiveInteger = Annotated[int, Field(gt=0)]
 NonNegativeFloat = Annotated[float, Field(ge=0.0)]
-TimeZone = Annotated[str, Field(default="UTC", pattern="|".join(timezone_set))]
+TimeZone = Annotated[str, Field(default="UTC", pattern="|".join(sorted(timezone_set)))]
 
 
 BANNED_CHARACTERS = ["/", "%", "&", ">", "<"]


Code review comments:
diff_hunk: @@ -0,0 +1,168 @@
+#!/usr/bin/env python3
+import json
+import subprocess
+import sys
+from pathlib import Path
+from typing import Any, Union
+
+from prefect.server.api.server import create_app
+
+Mint = dict[str, Any]
+Navigation = list[dict[str, Any]]
+SinglePage = str
+PageGroup = dict[str, Any]
+
+
+def docs_path() -> Path:
+    return Path(__file__).parent.parent / "docs"
+
+
+def current_version() -> str:
+    # TODO: derive this from the docs and the current version of the prefect package
+    return "3.0rc"
path: scripts/generate_mintlify_openapi_docs.py
text: @user1:
Gotcha. 

@author:
Yeah this is something I want to dig more into.  I can make it work on `<major>.<minor>` for now (adding the `rc` tag if appropriate)