---
title: server
sidebarTitle: server
---

# `prefect.server.api.server`



Defines the Prefect REST API FastAPI app.


## Functions

### `validation_exception_handler` <sup><a href="https://github.com/PrefectHQ/prefect/blob/main/src/prefect/server/api/server.py#L196" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>

```python
validation_exception_handler(request: Request, exc: RequestValidationError) -> JSONResponse
```


Provide a detailed message for request validation errors.


### `integrity_exception_handler` <sup><a href="https://github.com/PrefectHQ/prefect/blob/main/src/prefect/server/api/server.py#L212" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>

```python
integrity_exception_handler(request: Request, exc: Exception) -> JSONResponse
```


Capture database integrity errors.


### `is_client_retryable_exception` <sup><a href="https://github.com/PrefectHQ/prefect/blob/main/src/prefect/server/api/server.py#L227" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>

```python
is_client_retryable_exception(exc: Exception) -> bool
```

### `replace_placeholder_string_in_files` <sup><a href="https://github.com/PrefectHQ/prefect/blob/main/src/prefect/server/api/server.py#L256" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>

```python
replace_placeholder_string_in_files(directory: str, placeholder: str, replacement: str, allowed_extensions: list[str] | None = None) -> None
```


Recursively loops through all files in the given directory and replaces
a placeholder string.


### `copy_directory` <sup><a href="https://github.com/PrefectHQ/prefect/blob/main/src/prefect/server/api/server.py#L283" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>

```python
copy_directory(directory: str, path: str) -> None
```

### `custom_internal_exception_handler` <sup><a href="https://github.com/PrefectHQ/prefect/blob/main/src/prefect/server/api/server.py#L303" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>

```python
custom_internal_exception_handler(request: Request, exc: Exception) -> JSONResponse
```


Log a detailed exception for internal server errors before returning.

Send 503 for errors clients can retry on.


### `prefect_object_not_found_exception_handler` <sup><a href="https://github.com/PrefectHQ/prefect/blob/main/src/prefect/server/api/server.py#L328" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>

```python
prefect_object_not_found_exception_handler(request: Request, exc: ObjectNotFoundError) -> JSONResponse
```


Return 404 status code on object not found exceptions.


### `create_api_app` <sup><a href="https://github.com/PrefectHQ/prefect/blob/main/src/prefect/server/api/server.py#L340" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>

```python
create_api_app(dependencies: list[Any] | None = None, health_check_path: str = '/health', version_check_path: str = '/version', fast_api_app_kwargs: dict[str, Any] | None = None, final: bool = False, ignore_cache: bool = False) -> FastAPI
```


Create a FastAPI app that includes the Prefect REST API

**Args:**
- `dependencies`: a list of global dependencies to add to each Prefect REST API router
- `health_check_path`: the health check route path
- `fast_api_app_kwargs`: kwargs to pass to the FastAPI constructor
- `final`: whether this will be the last instance of the Prefect server to be
created in this process, so that additional optimizations may be applied
- `ignore_cache`: if set, a new app will be created even if the settings and fast_api_app_kwargs match
an existing app in the cache

**Returns:**
- a FastAPI app that serves the Prefect REST API


### `create_ui_app` <sup><a href="https://github.com/PrefectHQ/prefect/blob/main/src/prefect/server/api/server.py#L455" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>

```python
create_ui_app(ephemeral: bool) -> FastAPI
```

### `create_app` <sup><a href="https://github.com/PrefectHQ/prefect/blob/main/src/prefect/server/api/server.py#L628" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>

```python
create_app(settings: Optional[prefect.settings.Settings] = None, ephemeral: bool = False, webserver_only: bool = False, final: bool = False, ignore_cache: bool = False) -> FastAPI
```


Create a FastAPI app that includes the Prefect REST API and UI

**Args:**
- `settings`: The settings to use to create the app. If not set, settings are pulled
from the context.
- `ephemeral`: If set, the application will be treated as ephemeral. The UI
and services will be disabled.
- `webserver_only`: If set, the webserver and UI will be available but all background
services will be disabled.
- `final`: whether this will be the last instance of the Prefect server to be
created in this process, so that additional optimizations may be applied
- `ignore_cache`: If set, a new application will be created even if the settings
match. Otherwise, an application is returned from the cache.


## Classes

### `SPAStaticFiles` <sup><a href="https://github.com/PrefectHQ/prefect/blob/main/src/prefect/server/api/server.py#L163" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>


Implementation of `StaticFiles` for serving single page applications.

Adds `get_response` handling to ensure that when a resource isn't found the
application still returns the index.


**Methods:**

#### `get_response` <sup><a href="https://github.com/PrefectHQ/prefect/blob/main/src/prefect/server/api/server.py#L171" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>

```python
get_response(self, path: str, scope: Any) -> Response
```

### `RequestLimitMiddleware` <sup><a href="https://github.com/PrefectHQ/prefect/blob/main/src/prefect/server/api/server.py#L178" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>


A middleware that limits the number of concurrent requests handled by the API.

This is a blunt tool for limiting SQLite concurrent writes which will cause failures
at high volume. Ideally, we would only apply the limit to routes that perform
writes.


### `SubprocessASGIServer` <sup><a href="https://github.com/PrefectHQ/prefect/blob/main/src/prefect/server/api/server.py#L831" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>

**Methods:**

#### `address` <sup><a href="https://github.com/PrefectHQ/prefect/blob/main/src/prefect/server/api/server.py#L874" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>

```python
address(self) -> str
```

#### `api_url` <sup><a href="https://github.com/PrefectHQ/prefect/blob/main/src/prefect/server/api/server.py#L878" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>

```python
api_url(self) -> str
```

#### `find_available_port` <sup><a href="https://github.com/PrefectHQ/prefect/blob/main/src/prefect/server/api/server.py#L853" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>

```python
find_available_port(self) -> int
```

#### `is_port_available` <sup><a href="https://github.com/PrefectHQ/prefect/blob/main/src/prefect/server/api/server.py#L863" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>

```python
is_port_available(port: int) -> bool
```

#### `start` <sup><a href="https://github.com/PrefectHQ/prefect/blob/main/src/prefect/server/api/server.py#L881" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>

```python
start(self, timeout: Optional[int] = None) -> None
```

Start the server in a separate process. Safe to call multiple times; only starts
the server once.

**Args:**
- `timeout`: The maximum time to wait for the server to start


#### `stop` <sup><a href="https://github.com/PrefectHQ/prefect/blob/main/src/prefect/server/api/server.py#L975" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>

```python
stop(self) -> None
```
