Private Preview
This feature is in private preview: it's not ready for production use, and it may be briefly unavailable as we deploy updates. To get access, sign up here.
Deploy withneon.ts
If your project has a neon.ts config, this is the recommended way to deploy. neon deploy reads the config and applies the entire branch policy in one step: services, per-branch tuning, and every function it declares:
neon deploy| Flag | Default | Description |
|---|---|---|
--config | walks up from cwd | Path to the neon.ts policy |
--env | (none) | Path to a .env file loaded before neon.ts is evaluated, so function env values resolve from it |
--branch | linked branch | Target branch ID or name |
--project-id | linked project | Project ID |
--update-existing | false | Auto-confirm overriding existing remote settings on the branch |
--allow-protected | false | Auto-confirm applying to a branch marked protected on Neon |
neon deploy is an alias for neon config apply. To preview what a deploy would change without applying it, run neon config plan.
Note that --env here takes a path to a .env file. The --env flag on neon functions deploy below takes KEY=VALUE pairs instead.
Deploy withneon functions deploy
To deploy one function directly, without a neon.ts config:
neon functions deploy <slug> [--src <dir-or-entry-file>] [--env KEY=VALUE] [--wait]The CLI bundles with esbuild, zips the output, and uploads it. The first deploy creates the function; subsequent deploys update it. See the neon functions reference for the full command surface.
| Flag | Default | Description |
|---|---|---|
--src | (none) | Function source: a directory containing index.ts, index.mjs, or index.js, or a path to the entry file |
--env KEY=VALUE | (none) | Set an environment variable. Repeatable. Stored with the deployment. Takes KEY=VALUE pairs, not a .env file path like neon deploy --env |
--runtime | nodejs24 | Function runtime. nodejs24 is the only valid value |
--branch | linked branch | Target branch. Defaults to the branch in .neon |
--wait | true | Poll until completed or failed, up to 10 minutes |
Examples:
neon functions deploy hello --src functions/hello.tsneon functions deploy hello --src . --env RESEND_API_KEY=re_...neon functions deploy hello --src functions/hello.ts --branch feat/my-featureDeploy with the API
Bundle with esbuild, zip the output, then POST to the deploy endpoint.
1. Bundle:
esbuild functions/hello.ts --bundle --platform=node --target=node24 --outfile=dist/index.mjs2. Zip:
zip -j function.zip dist/index.mjsThe archive's entry file must be named index.mjs or index.js; the runtime looks for those names.
From Node.js, buildFunctionBundle from @neon/config-runtime does both steps in one call and produces exactly the archive the deploy endpoint expects:
import { buildFunctionBundle } from "@neon/config-runtime/v1";
const zip = await buildFunctionBundle({
slug: "hello",
name: "My first function",
source: "./functions/hello.ts",
env: {},
runtime: "nodejs24",
});3. Deploy:
curl -X POST \
"https://console.neon.tech/api/v2/projects/{project_id}/branches/{branch_id}/functions/{slug}/deployments" \
-H "Authorization: Bearer $NEON_API_KEY" \
-F "zip=@function.zip" \
-F 'environment={"MY_SECRET":"value"}'| Field | Type | Required | Description |
|---|---|---|---|
zip | binary | When code changes | ZIP of the bundled function. Omit only to update environment or runtime on an existing deployment |
runtime | string | No | nodejs24 is the only valid value |
environment | string | No | JSON-encoded string-to-string map |
The API returns immediately. Poll the get endpoint (see Check status) until the deployment completes.
Slugs
The slug is assigned at first deploy: either the key in neon.ts or the positional argument to neon functions deploy. It becomes part of the invocation URL and can't be changed afterward. Slugs must match ^[a-z0-9]{1,20}$: lowercase letters and digits only, 1 to 20 characters, no hyphens.
Deployment states
| State | Meaning |
|---|---|
pending | Queued, not yet building |
building | Source is being compiled and bundled |
completed | Function is live and accepting requests |
failed | Build or deployment error |
Manage functions
Check status
neon functions get helloThe response includes invocation_url, the public URL for your function:
https://<branch_id>-<slug>.compute.<cell>.us-east-2.aws.neon.techList functions
neon functions listDelete a function
neon functions delete helloNeed help?
Join our Discord Server to ask questions or see what others are doing with Neon. For paid plan support options, see Support.








