# Serve

The `serve()` API handler is used to serve your application's [functions](/docs-markdown/reference/typescript/v4/functions/create) via HTTP. This handler enables Inngest to remotely and securely read your functions' configuration and invoke your function code. This enables you to host your function code on any platform.

```ts
import { serve } from "inngest/next"; // or your preferred framework
import { inngest } from "./client";
import {
  importProductImages,
  sendSignupEmail,
  summarizeText,
} from "./functions";

serve({
  client: inngest,
  functions: [sendSignupEmail, summarizeText, importProductImages],
});

```

`serve` handlers are imported from convenient framework-specific packages like `"inngest/next"`, `"inngest/express"`, or `"inngest/lambda"`. [Click here for a full list of officially supported frameworks](/docs-markdown/learn/serving-inngest-functions). For any framework that is not support, you can [create a custom handler](#custom-frameworks).

***

## `serve(options)`

- `client` (Inngest client): An Inngest client (reference).

* `functions` (InngestFunctions\[]): An array of Inngest functions defined using inngest.createFunction() (reference).

- `serveOrigin` (string): The domain host of your application, including protocol, e.g. https\://myapp.com. The SDK attempts to infer this via HTTP headers at runtime, but this may be required when using platforms like AWS Lambda or when using a reverse proxy. See also INNGEST\_SERVE\_ORIGIN.

* `servePath` (string): The path where your serve handler is hosted. The SDK attempts to infer this via HTTP headers at runtime. We recommend /api/inngest. See also INNGEST\_SERVE\_PATH.

- `streaming` (\`true | false\`): Enables streaming responses back to Inngest which can enable maximum serverless function timeouts. See reference for more information on the configuration.  See also INNGEST\_STREAMING.

> **Callout:** Options like signingKey, signingKeyFallback, logger, baseUrl, and fetch are configured on the Inngest client, not on serve(). We always recommend setting the INNGEST\_SIGNING\_KEY environment variable over using the signingKey option directly. As with any secret, it's not a good practice to hard-code the signing key in your codebase.

## How the `serve` API handler works

The API works by exposing a single endpoint at `/api/inngest` which handles different actions utilizing HTTP request methods:

- `GET`: Return function metadata and render a landing page in **development only**.
- `POST`: Invoke functions with the request body as incoming function state.
- `PUT`: Trigger the SDK to register all functions with Inngest using the signing key.