Command Reference

Reference for all commands available in the Webflow CLI

Global Options

Global options can be used with any command.

OptionDescription
-v, --versionDisplay the installed version of the Webflow CLI.
-h, --helpDisplay help information for any command.
--no-inputDisable all interactive prompts. Use in CI/CD pipelines.
--inputForce interactive prompts on when they were auto-disabled. An explicit --no-input still wins.
--manifest <path>Path to a webflow.json file or directory containing one. Defaults to ./webflow.json.
--skip-update-checkSkip checking for @webflow package updates.
--verboseDisplay more information for debugging purposes.

Assets

assets list

Lists assets for a site, with optional filtering and sorting.

Usage

webflow assets list [options]

Options

OptionDescriptionDefault
--site <siteId>Site ID. Falls back to webflow.json or an interactive prompt.
--folder <folderId>Filter assets to a specific folder.
--fields <fields>Comma-separated columns to display. Valid fields: id, displayName, originalFileName, contentType, size, lastUpdated.id,displayName,lastUpdated,size
--sort-by <field>Sort by: displayName, originalFileName, contentType, size, lastUpdated.displayName
--order <dir>Sort direction: asc or desc.asc
--limit <n>Maximum number of assets to return.100
--offset <n>Number of assets to skip (for pagination).0
--jsonOutput as JSON.false

Also accepts global options.

Example

webflow assets list --site 6258612d1ee792848f805dcf --sort-by size --order desc

assets upload

Uploads a file as a site asset.

Supported file types

  • Images (≤ 4 MB): PNG, JPG, JPEG, GIF, SVG, WEBP, AVIF
  • Documents (≤ 10 MB): PDF, DOC, DOCX, XLS, XLSX, PPT, PPTX, TXT, CSV, ODT, ODS, ODP, JSON, Lottie

Usage

webflow assets upload <file> [options]

Arguments

ArgumentDescription
filePath to the file to upload.

Options

OptionDescription
--site <siteId>Site ID. Falls back to webflow.json or an interactive prompt.
--name <displayName>Display name for the asset. Defaults to the filename.
--folder <folderId>Upload into a specific folder.
--dry-runPreview the upload without uploading.
--jsonOutput as JSON.

Also accepts global options.

Example

webflow assets upload ./logo.png --site 6258612d1ee792848f805dcf --name "Company Logo"

assets update

Updates an asset’s metadata.

Usage

webflow assets update <assetId> [options]

Arguments

ArgumentDescription
assetIdThe ID of the asset to update.

Options

OptionDescription
--display-name <name>New display name for the asset.
--alt-text <text>Alt text for the asset.
--dry-runPreview the update without applying it.
--jsonOutput as JSON.

Also accepts global options.

Example

webflow assets update 6258612d1ee792848f805dcf --display-name "New Logo" --alt-text "Company logo"

assets folders list

Lists asset folders for a site.

Usage

webflow assets folders list [options]

Options

OptionDescription
-s, --site <site-id>Site ID. Default: value set in webflow.json config.
--jsonOutput as JSON.

Also accepts global options.

Example

webflow assets folders list --site 6258612d1ee792848f805dcf

assets folders create

Creates a new asset folder.

Usage

webflow assets folders create [options] <name>

Arguments

ArgumentDescription
nameDisplay name for the folder.

Options

OptionDescription
-s, --site <site-id>Site ID. Default: value set in webflow.json config.
--parent <folderId>Parent folder ID (creates a nested folder).
--jsonOutput as JSON.

Also accepts global options.

Example

webflow assets folders create --site 6258612d1ee792848f805dcf "Marketing"

Authentication

auth login

Authenticates the CLI with your Webflow account. Opens a browser window where you select a workspace and grant access, then saves WEBFLOW_API_TOKEN to a .env file in your project root.

Usage

webflow auth login [options]

Options

OptionDescription
-f, --forceForce reauthentication even if credentials already exist.

Also accepts global options.

Example

# Open browser OAuth flow to authenticate
webflow auth login
# Re-authenticate even if a token is already saved
webflow auth login --force

For more details, see the authentication documentation.


auth status

Shows the currently authenticated user and active OAuth scopes.

Usage

webflow auth status

Example

webflow auth status
# ✔ Logged in as Jane Smith (jane@example.com)
# Scopes: assets:read, assets:write, cms:read, ...
# Session: ~/.config/webflow/auth.json

auth logout

Removes the stored session and logs out of the CLI.

Usage

webflow auth logout

Example

webflow auth logout
# ✔ Logged out. Session file removed.

auth telemetry

Manages telemetry settings for all Webflow CLI commands.

Usage

webflow auth telemetry [options]

Options

OptionDescription
--enableEnable telemetry for all commands.
--disableDisable telemetry for all commands.
--statusShow current telemetry status.
--localWrite the preference to the current directory’s webflow.json instead of the global config.

Also accepts global options.

By default, --enable/--disable write to a global config file (~/.config/webflow/telemetry.json on macOS/Linux, %APPDATA%\webflow\telemetry.json on Windows) that applies to every project. Pass --local to write the preference to the current directory’s webflow.json instead, overriding the global setting only for commands run there. A webflow.json with an existing telemetry setting is still read and takes precedence over the global config regardless of this flag. DO_NOT_TRACK overrides both.

Example

# Check current telemetry status
webflow auth telemetry --status
# Disable telemetry globally (useful in CI/CD)
webflow auth telemetry --disable
# Enable telemetry
webflow auth telemetry --enable
# Disable telemetry for this project only
webflow auth telemetry --disable --local

CMS

cms collections list

Lists all CMS collections for a site.

Usage

webflow cms collections list [options]

Options

OptionDescriptionDefault
--site <siteId>Site ID. Falls back to webflow.json or an interactive prompt.
--fields <fields>Comma-separated columns to display. Valid fields: id, displayName, singularName, slug, lastUpdated.id,displayName,slug
--sort-by <field>Sort by: displayName, slug, lastUpdated.displayName
--order <dir>Sort direction: asc or desc.asc
--jsonOutput as JSON.false

Also accepts global options.

Example

webflow cms collections list --site 6258612d1ee792848f805dcf --sort-by lastUpdated --order desc

cms collections get

Gets the details and field schema for a CMS collection.

Usage

webflow cms collections get <collectionId> [options]

Arguments

ArgumentDescription
collectionIdThe ID of the collection to retrieve.

Options

OptionDescription
--jsonOutput as JSON.

Also accepts global options.

Example

webflow cms collections get 6258612d1ee792848f805dcf

cms collections create

Creates a new CMS collection on a site.

Usage

webflow cms collections create --name <displayName> [options]

Options

OptionDescription
--site <siteId>Site ID. Falls back to webflow.json or an interactive prompt.
--name <displayName>(Required) Collection display name.
--singular-name <name>Singular display name. Defaults to --name.
--slug <slug>URL slug for the collection. Auto-derived from --name if omitted.
--dry-runPreview the collection that would be created without creating it.
--jsonOutput as JSON.

Also accepts global options.

Example

webflow cms collections create --site 6258612d1ee792848f805dcf --name "Blog Posts" --slug "blog-posts"
# Preview without creating
webflow cms collections create --site 6258612d1ee792848f805dcf --name "Blog Posts" --dry-run

cms fields create

Adds a field to a CMS collection.

Usage

webflow cms fields create --collection <collectionId> --name <name> --type <type> [options]

Options

OptionDescription
--collection <collectionId>(Required) Collection ID to add the field to.
--name <displayName>(Required) Field display name.
--type <type>(Required) Field type. See valid types below.
--requiredMark the field as required.
--dry-runPreview the field that would be created without creating it.
--jsonOutput as JSON.

Also accepts global options.

Valid field types

PlainText, RichText, Number, DateTime, Link, Image, Video, Color, Bool, Option, ItemRef, ItemRefSet

Example

webflow cms fields create \
--collection 6258612d1ee792848f805dcf \
--name "Author" \
--type PlainText \
--required

cms items list

Lists items in a CMS collection.

Usage

webflow cms items list --collection <collectionId> [options]

Options

OptionDescriptionDefault
--collection <collectionId>(Required) Collection ID.
--fields <fields>Comma-separated columns to display. Valid fields: id, isDraft, isArchived, lastUpdated, fieldData.id,isDraft,lastUpdated
--limit <n>Maximum number of items to return.100
--offset <n>Number of items to skip (for pagination).0
--locale <cmsLocaleId>CMS locale ID to filter by.
--jsonOutput as JSON.false

Also accepts global options.

Example

webflow cms items list --collection 6258612d1ee792848f805dcf --limit 50 --json

cms items get

Gets a single CMS item by ID.

Usage

webflow cms items get --collection <collectionId> --item <itemId> [options]

Options

OptionDescription
--collection <collectionId>(Required) Collection ID.
--item <itemId>(Required) Item ID.
--locale <cmsLocaleId>CMS locale ID to retrieve content for.
--jsonOutput as JSON.

Also accepts global options.

Example

webflow cms items get \
--collection 6258612d1ee792848f805dcf \
--item 62b720ef280c7a7a3be8cabe

cms items create

Creates a new CMS item.

Usage

webflow cms items create --collection <collectionId> --data <json> [options]

Options

OptionDescription
--collection <collectionId>(Required) Collection ID.
--data <json>(Required) Item field data as a JSON string.
--draftCreate as a draft (not published).
--dry-runPreview the item that would be created without creating it.
--jsonOutput as JSON.

Also accepts global options.

Example

webflow cms items create \
--collection 6258612d1ee792848f805dcf \
--data '{"name":"Hello World","slug":"hello-world"}'

cms items update

Updates an existing CMS item.

Usage

webflow cms items update --collection <collectionId> --item <itemId> --data <json> [options]

Options

OptionDescription
--collection <collectionId>(Required) Collection ID.
--item <itemId>(Required) Item ID to update.
--data <json>(Required) Updated field data as a JSON string.
--dry-runPreview the update without applying it.
--jsonOutput as JSON.

Also accepts global options.

Example

webflow cms items update \
--collection 6258612d1ee792848f805dcf \
--item 62b720ef280c7a7a3be8cabe \
--data '{"name":"Updated Title"}'

cms items delete

Deletes a CMS item.

Usage

webflow cms items delete --collection <collectionId> --item <itemId> [options]

Options

OptionDescription
--collection <collectionId>(Required) Collection ID.
--item <itemId>(Required) Item ID to delete.
--dry-runPreview the deletion without deleting.

Also accepts global options.

Example

webflow cms items delete \
--collection 6258612d1ee792848f805dcf \
--item 62b720ef280c7a7a3be8cabe

cms items publish

Publishes one or more CMS items.

Usage

webflow cms items publish --collection <collectionId> --items <itemIds> [options]

Options

OptionDescription
--collection <collectionId>(Required) Collection ID.
--items <itemIds>(Required) Comma-separated item IDs to publish.
--dry-runPreview which items would be published without publishing.
--jsonOutput as JSON.

Also accepts global options.

Example

webflow cms items publish \
--collection 6258612d1ee792848f805dcf \
--items 62b720ef280c7a7a3be8cabe,62b720ef280c7a7a3be8cabf

Exports Webflow components from your site as a static, self-contained local React bundle.

Usage

webflow devlink export [options]

Options

OptionDescriptionDefault
--api-token <token>API token to use for the export.Uses WEBFLOW_API_TOKEN from .env or the OAuth session.
-s, --site <site-id>Site ID to export from.Uses siteId from webflow.json, or WEBFLOW_SITE_ID from .env.

Also accepts global options.

Example

# Export components using a specific site ID and token
webflow devlink export --site 1234567890 --api-token <YOUR_TOKEN>

Deprecated

webflow devlink sync is deprecated. Use webflow devlink export instead.

Syncs Webflow components to your local filesystem. When run without arguments, all components are synced.

Usage

webflow devlink sync [components...] [options]

Arguments

ArgumentDescription
componentsSpace-separated list of component names to sync. If omitted, all components are synced.

Options

OptionDescription
--api-token <token>API token, overriding WEBFLOW_API_TOKEN.
-s, --site <site-id>Site ID, overriding webflow.json.

Also accepts global options.

Example

# Sync all components
webflow devlink sync
# Sync specific components by name
webflow devlink sync Button Card

Bundles and shares components with a Webflow Workspace.

Usage

webflow devlink import [options]

Options

OptionDescriptionDefault
--api-token <token>Workspace API token.Uses WEBFLOW_API_TOKEN from .env.
-f, --forceForces the bundler to finish compiling, even if there are warnings or type errors.false
--debug-bundlerDisplays the final bundler configurations for debugging.false
--devBundles in development mode. Disables minification and source maps.false

Also accepts global options.

Example

# Share the components and bypass any interactive prompts
webflow devlink import --no-input

Bundles components locally to a dist directory. This command doesn’t share the components to Webflow.

Usage

webflow devlink bundle [options]

Options

OptionDescriptionDefault
--public-path <path>Required. The URL where you can serve your library.None
--output-path <path>Overrides the output path for the bundle../dist
-f, --forceForces the bundler to finish compiling, even if there are warnings or type errors.false
--debug-bundlerDisplays the final bundler configurations for debugging.false
--devBundles in development mode. Disables minification and source maps.false

Also accepts global options.

Example

# Bundle the components and output to a 'build' folder
webflow devlink bundle --output-path ./build

Designer Extensions

extension list

Lists available templates for extension init.

Usage

webflow extension list

extension init

Initializes a new Designer Extension from a template.

Usage

webflow extension init [options] [projectName] [scaffoldName]

Arguments

Both arguments are optional — the CLI prompts for any that are not provided.

ArgumentDescription
projectNameThe name of your new app directory.
scaffoldNameThe template to use: default, react, or typescript-alt.

Example

# Initialize a new React-based extension in a 'my-new-extension' folder
webflow extension init my-new-extension react

extension bundle

Bundles your Designer Extension into a bundle.zip file for upload.

Usage

webflow extension bundle

extension serve

Serves your Designer Extension on a local development server.

Usage

webflow extension serve [port]

Arguments

ArgumentDescriptionDefault
portThe port to serve the app on.1337

Forms

forms list

Lists all forms for a site.

Usage

webflow forms list [options]

Options

OptionDescriptionDefault
--site <siteId>Site ID. Falls back to webflow.json or an interactive prompt.
--fields <fields>Comma-separated columns to display. Valid fields: id, displayName, name, slug, createdOn, lastUpdated.id,displayName,slug
--jsonOutput as JSON.false

Also accepts global options.

Example

webflow forms list --site 6258612d1ee792848f805dcf
webflow forms list --site 6258612d1ee792848f805dcf --fields id,displayName,name,slug --json

forms submissions

Lists submissions for a specific form. Supports JSON output and CSV export.

Usage

webflow forms submissions [options]

Options

OptionDescriptionDefault
--site <siteId>Site ID. Falls back to webflow.json or an interactive prompt.
--form <formId>Form ID.
--output <file>Export submissions to a CSV file at the given path.
--jsonOutput as JSON. Ignored if --output is also provided.false

Also accepts global options.

Example

webflow forms submissions --site 6258612d1ee792848f805dcf --form 62b720ef280c7a7a3be8cabe
webflow forms submissions --site 6258612d1ee792848f805dcf --form 62b720ef280c7a7a3be8cabe --output submissions.csv
webflow forms submissions --site 6258612d1ee792848f805dcf --form 62b720ef280c7a7a3be8cabe --json

Logging

log

Displays the directory and path to the latest log file.

Usage

webflow log

Sites

sites list

Lists all sites in your Webflow workspace.

Usage

webflow sites list [options]

Options

OptionDescriptionDefault
--fields <fields>Comma-separated columns to display. Valid fields: id, displayName, shortName, timeZone, lastUpdated, lastPublished.id,displayName,lastPublished
--jsonOutput as JSON.false

Also accepts global options.

Example

webflow sites list
webflow sites list --fields id,displayName,shortName --json

sites get

Gets details for a specific site.

Usage

webflow sites get <siteId> [options]

Arguments

ArgumentDescription
siteIdThe ID of the site to retrieve.

Options

OptionDescription
--jsonOutput as JSON.

Also accepts global options.

Example

webflow sites get 6258612d1ee792848f805dcf

sites domains

Lists the custom domains configured for a site.

Usage

webflow sites domains --site <siteId> [options]

Options

OptionDescription
--site <siteId>(Required) Site ID.
--jsonOutput as JSON.

Also accepts global options.

Example

webflow sites domains --site 6258612d1ee792848f805dcf

sites publish

Publishes a site to the Webflow subdomain or to specific custom domains.

Usage

webflow sites publish --site <siteId> [options]

Options

OptionDescription
--site <siteId>(Required) Site ID to publish.
--domains <domainIds>Comma-separated custom domain IDs to publish to. Defaults to the Webflow subdomain.
--page <pageId>Publish a single page instead of the full site.
--dry-runPreview what would be published without triggering a build.
--jsonOutput as JSON.

Also accepts global options.

Example

# Publish to the Webflow subdomain
webflow sites publish --site 6258612d1ee792848f805dcf
# Publish a single page
webflow sites publish --site 6258612d1ee792848f805dcf --page 5f43a0dfe6f3b800161c19b3
# Preview without publishing
webflow sites publish --site 6258612d1ee792848f805dcf --dry-run

Apps

The apps namespace is the canonical way to manage Webflow Cloud apps — full-stack applications deployed either to an existing Webflow site (site-attached) or as a standalone project (project app). It replaces the cloud namespace below, which remains available as a set of deprecated aliases.

apps is a pre-release namespace — install the @next channel

Every apps command on this page ships only on the CLI’s pre-release channel. On the stable channel the apps namespace does not exist, and each command below fails with an unknown-command error.

npm install -g @webflow/webflow-cli@next

A pre-release install reports a version with a -next. suffix; a stable install reports a plain version number. Check with webflow --version.

webflow --version

The stable channel covers cloud init, cloud deploy, cloud create, and cloud list only. There is no stable equivalent for the management commands — apps list, get, domains, link, update, delete, environments, deployments, logs, or env-vars.

For the identity-resolution order (flags, environment variables, webflow.json), non-interactive requirements, and CI/CD examples, see Agents & CI/CD.

apps init

Bootstraps a new Webflow Cloud app locally. Shares its options and behavior with the deprecated cloud init.

Usage

webflow apps init [options]

Options

OptionShortDescription
--app-name <name>-nApp name. Required with --no-input.
--project-name <name>Deprecated. Use --app-name instead.
--framework <framework>-fFramework to use (astro or nextjs). Required with --no-input.
--mount <mount>-mMount path. Defaults to /app for a site-attached app, / for a project app (--new).
--site-id <siteId>-sWebflow site ID to connect to (site-attached). Mutually exclusive with --workspace-id.
--newCreate an app without connecting to an existing site (project app).
--workspace-id <workspaceId>-wWorkspace ID to deploy into. Skips the workspace picker for --new. Mutually exclusive with --site-id.
--import <repo-url>Create the app from an existing GitHub repository and clone it locally. See Creating an app from a repository.
--branch <branch>Branch to build with --import. Defaults to the repository’s default branch.
--idempotency-key <key>Dedupes a retried create. Required with --import in non-interactive runs. --import only.
--skip-cloneCreate the app from --import without cloning locally. Nothing is written to disk; the app and environment IDs are printed instead. --import only.
--jsonOutput as JSON. --import only — the scaffold path has no single response object to serialize.
--dry-runValidate and preview without creating anything. Works on both the scaffold and --import paths.

Also accepts global options.

--no-input requirements

Always pass --app-name and --framework. Site-attached apps additionally require --site-id. Project apps (--new) should pass --workspace-id — without it, a token that can see more than one workspace triggers a picker that hangs in a non-TTY context.

Example

# Site-attached app, non-interactive
webflow apps init --no-input --app-name my-app --framework astro --mount /app --site-id site_abc123
# Project app (no existing site), non-interactive
webflow apps init --new --no-input --app-name my-app --framework nextjs --workspace-id ws_abc123

Creating an app from a repository

--import points init at an existing GitHub repository instead of scaffolding a new project. Webflow creates the app from that repo, triggers a first build, and clones the repo locally so you can keep working in it.

webflow apps init --import https://github.com/acme/storefront --json

The app name defaults to the repository name; pass --app-name to override it. The branch defaults to the repository’s default branch; pass --branch to build a different one.

--site-id, --new, and --mount behave differently with --import

These flags are not interchangeable with their scaffold-path behavior. With --import:

FlagRule
--site-id / --newExactly one is required. A siteId found inside the repository is never used to choose the target.
--mountRequired, and must be non-root, when attaching with --site-id.
--mount with --newRejected. A project app owns the root of its own domain, so it always mounts at /.

--framework and --workspace-id are also rejected alongside --import — a repository brings its own code, and the workspace is derived from your token.

Non-interactive imports need an idempotency key

--idempotency-key is required when importing with --no-input (including CI). Use a retry-stable value unique to the repository and target, so a retried step replays the original app instead of creating a second one.

webflow apps init --import https://github.com/acme/storefront --new --no-input \
--idempotency-key "$GITHUB_RUN_ID-acme-storefront" --json
The Webflow GitHub App has to be installed and connected

Webflow reads the repository through its GitHub App, never through your personal GitHub credentials, so the App must be installed on the repository’s account and connected to your workspace. When it isn’t, the command fails with an actionable error carrying the URL to complete:

ErrorWhat it meansWhat the URL opens
GITHUB_APP_NOT_INSTALLEDThe App isn’t installed on that account at all.the install page
GITHUB_REPO_NOT_CONNECTEDThe App is installed, but you haven’t connected it to this workspace.the authorize page

Open the URL from the error you got — the two are different pages, and visiting the install page for an already-installed account only shows GitHub’s “Configure” screen and connects nothing. Then re-run the command. The browser is only involved for this one-time step.

Creating an app needs a user token, not a Workspace API Token

A Workspace API Token can deploy but cannot create an app — creating one records you as its author, so it requires a token from webflow auth login. This applies to apps init generally, --import included.


apps deploy

Deploys the current app to Webflow Cloud. Shares its options and behavior with the deprecated cloud deploy.

Usage

webflow apps deploy [options]

Options

OptionShortDescription
--environment <environment>-eEnvironment name. Created if it doesn’t exist.
--mount <mount>-mMount path (e.g., /app). Always pass it with --no-input — never read from webflow.json. Not enforced: omitting it deploys at root rather than failing. See the warning below.
--app-name <name>-nApp name, used when creating an app on its first deploy.
--project-name <name>Deprecated. Use --app-name instead.
--directory <path>-dApp directory. Use for monorepos.
--description <description>App description, used when creating an app.
--skip-mount-path-checkSkip mount-path validation.
--auto-publishPublish the Webflow site after deployment so the mount path routing goes live.
--site-id <siteId>-sWebflow site ID for a site-attached deploy. Skips the site picker. Overrides webflow.json. Mutually exclusive with --workspace-id.
--app-id <appId>-aApp ID to deploy to. Skips the app picker. Overrides webflow.json.
--project-id <appId>Deprecated. Use --app-id instead.
--framework <framework>-fOverride framework detection (nextjs or astro). Writes the value back to webflow.json.
--workspace-id <workspaceId>-wWorkspace ID for a project app’s first deploy. Skips the workspace picker. Mutually exclusive with --site-id.

Also accepts global options.

--site-id and --workspace-id are mutually exclusive

Use --site-id to deploy site-attached, or --workspace-id to deploy a project app in a specific workspace. Passing both will error. This one is a hard failure before any backend call — unlike --mount, which is not enforced.

Pass --mount and --environment together

The deploy prompts (pick an app, name a new app, pick an environment) are gated on whether --mount and --environment are both set — not on --no-input. Passing --no-input without both still triggers the prompt and hangs in a non-TTY context. The minimum safe form is --no-input --mount <path> --environment <env> plus --site-id (site-attached) or --workspace-id (project app, first deploy).

Omitting --mount under --no-input deploys to root, silently

--mount is not enforced. When it is omitted in a non-interactive run the command does not fail and does not warn — it deploys at root (/). The mount prompt offers a /app default, but the non-interactive path only accepts a default that passes a validator, and this prompt has none, so nothing is returned and the value normalizes to /. Root is a valid mount, so the deploy goes ahead there.

Always pass --mount explicitly in CI and scripts. A wrong mount tends to surface later as an ENVIRONMENT_MOUNT_MISMATCH on a subsequent deploy, well away from the run that caused it.

How deploy decides between site-attached and project app

A preflight step resolves identity before any backend call, taking the first match: --site-id--workspace-idWEBFLOW_SITE_IDsiteId in webflow.jsonWEBFLOW_WORKSPACE_IDcloud.workspace_id → a hard error under --no-input, or a picker otherwise.

Two consequences worth knowing: environment variables outrank webflow.json, and any resolved site short-circuits before workspace resolution is attempted. A stale WEBFLOW_SITE_ID left in the environment therefore wins over a manifest configured for a project-app deploy. Pass --site-id or --workspace-id explicitly to remove the ambiguity.

Example

# Site-attached deploy
webflow apps deploy --no-input --site-id site_abc123 --mount /app --environment production --skip-mount-path-check
# Project app deploy
webflow apps deploy --no-input --workspace-id ws_abc123 --app-name my-app --mount / --environment production

apps list

Lists all apps in your Webflow workspace.

Usage

webflow apps list [options]

Options

OptionDescription
-s, --siteFilter to an exact Webflow site ID. Does not default from webflow.json.
--name <name>Filter by exact app name (case-sensitive).
--q <text>Case-insensitive substring match on the app name.
--fields <fields>Comma-separated columns to display.
--jsonOutput as JSON.

Also accepts global options.

How the filters combine

App names are unique only within a site, so pass --site and --name together to resolve to at most one app. --site alone can match many apps, and --name alone can match apps across different sites.

Multiple filters combine with AND — every one must match. An exact filter plus a non-matching --q therefore returns an empty page, and that means nothing matched all the filters, not that the app doesn’t exist. Use --q to discover, then narrow.

Example

webflow apps list --json
webflow apps list --q checkout --json # discover
webflow apps list --site site_abc123 --name shop # resolve to one

apps get

Gets details for a specific app.

Usage

webflow apps get [appId] [options]

Arguments

ArgumentDescription
appIdApp ID. Defaults to WEBFLOW_APP_ID, webflow.json (cloud.app_id), or an interactive picker.

Options

OptionDescription
--fields <fields>Comma-separated columns to display.
--jsonOutput as JSON.

Also accepts global options.

Example

webflow apps get app_abc123 --json

apps domains

Lists the domains and live URLs configured for an app.

Usage

webflow apps domains [appId] [options]

Arguments

ArgumentDescription
appIdApp ID. Defaults to WEBFLOW_APP_ID, webflow.json, or an interactive picker.

Options

OptionDescription
--fields <fields>Comma-separated columns to display.
--limit <n>Max domains to return (server caps at 100).
--cursor <cursor>Pagination cursor from a previous nextCursor.
--jsonOutput as JSON.

Also accepts global options.

Example

webflow apps domains app_abc123 --json

apps update

Updates an app’s name, description, or GitHub source. Requires at least one of --name, --description, or --github-source.

Usage

webflow apps update [appId] [options]

Arguments

ArgumentDescription
appIdApp ID. Defaults to WEBFLOW_APP_ID, webflow.json, or an interactive picker.

Options

OptionDescription
--name <name>New app name.
--description <description>New app description.
--github-source <repo-url>GitHub repository to build from, as https://github.com/<owner>/<repo>. Attaches a repository to an app that has none, or repoints one that already has a different repo.
--dry-runPreview the update without applying it.
--jsonOutput as JSON.

--github-source does not deploy

Attaching or repointing a repository changes only what the app builds from. Run apps deployments trigger afterwards to build it.

To change which branch an environment builds, use apps environments update --branch--github-source selects the repository, the environment selects the branch.

It requires the Webflow GitHub App installed on the repository owner and connected to your workspace, the same prerequisite as apps init --import.

Also accepts global options.

Example

webflow apps update app_abc123 --description "Marketing site backend" --dry-run

apps delete

Deletes (or archives, depending on the site kind) an app.

Usage

webflow apps delete [appId] [options]

Arguments

ArgumentDescription
appIdApp ID. Defaults to WEBFLOW_APP_ID, webflow.json, or an interactive picker.

Options

OptionShortDescription
--yes-ySkip the confirmation prompt. Required under --no-input or --json — without it the CLI refuses rather than prompting.
--dry-runPreview the delete without executing it.
--jsonOutput as JSON.

Also accepts global options.

Example

# Preview first
webflow apps delete app_abc123 --dry-run
# Delete non-interactively
webflow apps delete app_abc123 --yes --no-input

apps environments list

Lists the environments of an app.

Usage

webflow apps environments list [appId] [options]

Arguments

ArgumentDescription
appIdApp ID. Defaults to WEBFLOW_APP_ID, webflow.json, or an interactive picker.

Options

OptionDescription
--branch <branch>Filter by exact branch name (case-sensitive) — resolves to at most one environment.
--q <text>Case-insensitive substring match on the branch name.
--fields <fields>Comma-separated columns to display.
--jsonOutput as JSON.

Also accepts global options.

Filters combine with AND, so --branch plus a non-matching --q returns an empty page — that means nothing matched every filter, not that the environment is absent.

Example

webflow apps environments list app_abc123 --json

apps environments create

Creates an environment on an app, bound to a branch and served at a mount path.

Usage

webflow apps environments create [appId] --branch <branch> --mount <path> [options]

Arguments

ArgumentDescription
appIdApp ID. Defaults to WEBFLOW_APP_ID, webflow.json, or an interactive picker.

Options

OptionDescription
--branch <branch>Required. Git branch this environment builds from. Must be a valid branch name and not already used by another environment of this app.
--mount <path>Required. URL path the environment is served at, for example /staging. Must be unique across the site.
--idempotency-key <key>Retry-stable key that dedupes a retried create. Must be non-empty printable ASCII when passed.
--dry-runPreview without creating anything.
--jsonOutput as JSON.

Also accepts global options.

Creating an environment does not deploy it

The environment starts empty. Run apps deployments trigger to build it.

Example

webflow apps environments create --branch staging --mount /staging --dry-run
webflow apps environments create --branch staging --mount /staging --json

apps environments update

Updates an environment’s branch or mount path. Requires at least one of --branch or --mount.

Usage

webflow apps environments update [appId] [envId] [options]

Arguments

ArgumentDescription
appIdApp ID. Defaults to WEBFLOW_APP_ID, webflow.json, or an interactive picker.
envIdEnvironment ID. Defaults to WEBFLOW_APP_ENVIRONMENT_ID, webflow.json, or an interactive picker.

Options

OptionDescription
--branch <branch>Git branch this environment builds from. Same uniqueness rules as create.
--mount <path>URL path the environment is served at. Must be unique across the site.
--app-id <id>App ID, overriding webflow.json.
--environment-id <id>Environment ID, overriding webflow.json.
--dry-runPreview without applying anything.
--jsonOutput as JSON.

Also accepts global options.

Changing the branch does not rebuild

The environment keeps serving its existing build until you run apps deployments trigger.

Example

webflow apps environments update --branch release --dry-run
webflow apps environments update env_abc123 --mount /v2 --json

apps environments delete

Deletes an environment from an app.

Usage

webflow apps environments delete [appId] [envId] [options]

Arguments

ArgumentDescription
appIdApp ID. Defaults to WEBFLOW_APP_ID, webflow.json, or an interactive picker.
envIdEnvironment ID. Defaults to WEBFLOW_APP_ENVIRONMENT_ID, webflow.json, or an interactive picker.

Options

OptionDescription
--app-id <id>App ID, overriding webflow.json.
--environment-id <id>Environment ID, overriding webflow.json.
--yesSkip the confirmation prompt.
--dry-runPreview without deleting anything.
--jsonOutput as JSON.

Also accepts global options.

--yes is required non-interactively

Without a TTY and without --yes, the command refuses rather than deleting, reporting yes as the missing flag.

Example

webflow apps environments delete env_abc123 --dry-run
webflow apps environments delete env_abc123 --yes --json

Points the current directory at an existing app and environment by updating webflow.json. Verifies the app, but creates and deploys nothing — use it to adopt an app from a fresh clone, or to repoint a directory at a different app or environment.

Usage

webflow apps link [appId] [options]

Arguments

ArgumentDescription
appIdApp ID. Takes precedence over --app-id, WEBFLOW_APP_ID, and webflow.json.

Options

OptionDescription
--app-id <id>App ID, overriding webflow.json.
--environment-id <id>Environment ID to link.
-w, --workspace-id <workspaceId>Workspace ID to persist. Written as supplied — it cannot be derived or verified from the app, so it is only stored when you pass it explicitly.
--dry-runPreview the manifest change without writing it.
--jsonOutput as JSON.

Also accepts global options.

Example

webflow apps link app_abc123 --environment-id env_abc123 --dry-run
webflow apps link app_abc123 --environment-id env_abc123 --json

apps deployments list

Lists the most recent deployments of an environment, newest first. Resolves the app and environment from WEBFLOW_APP_ID / WEBFLOW_APP_ENVIRONMENT_ID, webflow.json, or an interactive picker — this command takes no appId argument.

Usage

webflow apps deployments list [options]

Options

OptionDescriptionDefault
--limit <n>Max deployments to return, most recent first.20
--fields <fields>Comma-separated columns to display.id,status,sourceType,commitHash,buildStartedAt
--jsonOutput as JSON.false

Also accepts global options.

Example

webflow apps deployments list --limit 5 --json

apps deployments get

Gets details for a specific deployment. Resolves the app and environment the same way as deployments list.

Usage

webflow apps deployments get <depId> [options]

Options

OptionDescriptionDefault
--fields <fields>Comma-separated columns to display.
--waitPoll until the deployment reaches a terminal status, then exit with a status-derived code.false
--interval <seconds>Seconds between polls when --wait is set. Values below 5 are raised to 5.5
--timeout <seconds>Max seconds to keep polling before giving up. Values above 1800 (30 min) are capped.600
--jsonOutput as JSON.false

Also accepts global options.

Example

webflow apps deployments get dep_abc123 --json

Waiting for a deployment to finish

Watching is a modifier on get, not a separate command. Pass --wait to poll until the deployment reaches a terminal status — useful as a gate before a downstream step such as smoke tests or a notification.

Deployment status is one of starting, building, deploying, success, failed, canceled, or unstaged. The first three are in-flight; the rest are terminal.

Exit codes with --wait

CodeMeaning
0Deployment reached success.
1Any other outcome: a non-success terminal status, or a poll timeout.
A timeout is not distinguishable from a failure by exit code

--wait exits 1 both when the deployment ends in a non-success status and when polling times out first. A CI step that needs to tell “it broke” from “it is still running” has to read the reported status rather than gate on the exit code alone.

Example

webflow apps deployments get dep_abc123 --wait --interval 10 --timeout 300
echo "exit code: $?"

apps deployments redeploy

Re-runs an existing deployment at its same commit, enqueuing a fresh build. Redeploying an earlier successful deployment is how you roll back.

Usage

webflow apps deployments redeploy <depId> [options]

Arguments

ArgumentDescription
depIdRequired. ID of the deployment to re-run.

Options

OptionDescription
--idempotency-key <key>Sent as the Idempotency-Key header so a retried enqueue is deduped instead of queueing a second build. Must be non-empty printable ASCII when passed.
--dry-runPreview without enqueuing anything.
--jsonOutput as JSON.

Also accepts global options.

Requires a GitHub-connected app

Apps deployed from local files with apps deploy are not eligible — there is no commit to re-run. Connect a repository with apps init --import or apps update --github-source.

Example

# Roll back: find the last success, then re-run it
webflow apps deployments list --status success --limit 1 --fields id --json
webflow apps deployments redeploy dep_abc123 --idempotency-key "$GITHUB_RUN_ID" --json

apps deployments trigger

Builds the resolved environment’s current HEAD on demand. Same as redeploy, but with no deployment ID — there is no past build to re-run, so it builds whatever the environment’s configured branch points at now.

Usage

webflow apps deployments trigger [options]

Options

OptionDescription
--idempotency-key <key>Sent as the Idempotency-Key header so a retried enqueue is deduped instead of queueing a second build. Must be non-empty printable ASCII when passed.
--dry-runPreview without enqueuing anything.
--jsonOutput as JSON.

Also accepts global options.

Requires a GitHub-connected app

Same eligibility rule as redeploy: apps deployed from local files with apps deploy cannot be triggered.

It builds the environment's branch, not your checked-out branch

If the two differ, the CLI warns but does not block. Check with webflow apps environments list --fields id,branch when you are unsure which branch will build.

Example

webflow apps deployments trigger --dry-run
webflow apps deployments trigger --json

apps logs build

Reads the build logs of one deployment. Resolves the app and environment from WEBFLOW_APP_ID / WEBFLOW_APP_ENVIRONMENT_ID, webflow.json, or an interactive picker.

Usage

webflow apps logs build <depId> [options]

Arguments

ArgumentDescription
depId(Required) Deployment ID. Get one from apps deployments list.
Why the deployment ID is required

The command does not fall back to the newest deployment. That default was removed because its result could not be told apart from a wrong answer: with two deploys in flight you silently got someone else’s build, and before your own build was queued you got the previous deployment — already finished, already green — reported as the current one.

Omitting the ID fails before any network call. Under --json the error carries missingFlag: "depId", so an agent can recover programmatically instead of string-matching:

{ "error": { "message": "Missing deployment ID. Run 'webflow apps deployments list' to find one, then pass it as the argument.", "missingFlag": "depId" } }

The two-step pattern is the intended one — listing first means you see which deployments exist rather than accepting a silent choice.

Options

OptionDescriptionDefault
--since <iso>Only logs at or after this ISO datetime.
--q <text>Substring filter on the log message.
--limit <n>Max log lines to return.100
--cursor <cursor>Pagination cursor from a previous nextCursor.
--fields <fields>Comma-separated columns to display (timestamp, message, phase).timestamp,message
--jsonOutput as JSON.false

Also accepts global options.

Example

webflow apps logs build dep_abc123 --since 2026-07-01T00:00:00Z --q "error" --json

apps logs runtime

Reads the runtime logs of an environment. Resolves the app from WEBFLOW_APP_ID / webflow.json (or a picker); the environment from the envId argument, WEBFLOW_APP_ENVIRONMENT_ID, webflow.json, or a picker.

Usage

webflow apps logs runtime [envId] [options]

Arguments

ArgumentDescription
envIdEnvironment ID. Defaults to the app’s only environment (required if the app has several).

Accepts the same --since, --q, --limit, --cursor, --fields, and --json options as logs build.

Example

webflow apps logs runtime env_abc123 --limit 200

apps env-vars list

Lists environment variables for a Cloud app environment. Secret values are always masked.

Usage

webflow apps env-vars list [options]

Options

OptionDescriptionDefault
--app-id <id>Cloud app ID. Defaults to webflow.json (cloud.app_id) or WEBFLOW_APP_ID.
--environment-id <id>Environment ID. Defaults to webflow.json (cloud.environment_id) or WEBFLOW_APP_ENVIRONMENT_ID.
--key <key>Filter by exact key (case-sensitive) — resolves to at most one variable. Its value is still never returned.
--q <text>Case-insensitive substring match on the key. Never searches values.
--fields <fields>Comma-separated columns to display.key,isSecret
--jsonOutput as JSON.false

Also accepts global options.

Example

webflow apps env-vars list --app-id app_abc123 --environment-id env_abc123 --json

apps env-vars set

Creates or updates an environment variable.

Usage

webflow apps env-vars set <key> [value] [options]

Arguments

ArgumentDescription
keyVariable name.
valueVariable value. Omit to read from piped stdin or an interactive prompt — recommended for secrets, since it keeps them out of shell history.

Options

OptionDescription
--app-id <id>Cloud app ID.
--environment-id <id>Environment ID.
--secretMark the variable as secret. Omitting it on an existing key preserves its current secrecy.
--dry-runPreview without executing.
--jsonOutput as JSON.

Also accepts global options.

Keep secrets out of shell history

Passing a secret value as the value argument exposes it in shell history and the process list. Pipe it via stdin instead:

printf '%s' "$VALUE" | webflow apps env-vars set API_KEY --secret --app-id app_abc123 --environment-id env_abc123

Example

webflow apps env-vars set NODE_ENV production --app-id app_abc123 --environment-id env_abc123

apps env-vars delete

Deletes an environment variable.

Usage

webflow apps env-vars delete <key> [options]

Options

OptionDescription
--app-id <id>Cloud app ID.
--environment-id <id>Environment ID.
--dry-runPreview without executing.
--jsonOutput as JSON.

Also accepts global options.

Example

webflow apps env-vars delete NODE_ENV --app-id app_abc123 --environment-id env_abc123 --dry-run

apps env-vars import

Bulk imports environment variables from a .env-style file.

Usage

webflow apps env-vars import <file> [options]

Arguments

ArgumentDescription
filePath to a .env (KEY=value) file.

Options

OptionDescription
--app-id <id>Cloud app ID.
--environment-id <id>Environment ID.
--secretMark every imported key as secret.
--dry-runPreview without executing. Never prints values.
--jsonOutput as JSON. Values are always omitted from the result, even on success.

Also accepts global options.

Partial failures exit non-zero after printing the full created / updated / skipped / error breakdown.

Example

webflow apps env-vars import .env.production --app-id app_abc123 --environment-id env_abc123 --secret

Webflow Cloud

Deprecated namespace

webflow cloud init and webflow cloud deploy are deprecated aliases of apps init and apps deploy — prefer the apps namespace for new scripts and CI/CD pipelines. cloud create remains cloud-only, with no apps equivalent. cloud list is also deprecated: it lists scaffold templates for init, not your Cloud apps — use apps list to list your apps, or apps init with --framework / --help for available templates.

cloud create

Deprecated

webflow cloud create is deprecated. Use webflow cloud init instead, which supports both site-attached and standalone apps and lets you choose the mount path interactively or via --mount.

Scaffolds a new site-attached Webflow Cloud project non-interactively. The project mounts at /app with no option to override the mount path.

Usage

webflow cloud create <name> [options]

Arguments

ArgumentDescription
name(Required) Project name.

Options

OptionDescriptionDefault
-f, --framework <framework>Framework to use for the project.nextjs

Also accepts global options.

Example

webflow cloud create my-project -f nextjs

cloud init

Deprecated

webflow cloud init is a deprecated alias of webflow apps init. Both share the exact same options and behavior; prefer apps init in new scripts.

Initializes a new Webflow Cloud app from a template.

Usage

webflow cloud init [options]

Options

OptionDescription
-n, --app-nameApp display name. Required in non-interactive mode.
--project-nameDeprecated. Long-form alias for --app-name. Still accepted, emits a warning.
-f, --frameworkThe framework to initialize (e.g., astro, nextjs).
-m, --mountThe path to mount the app on. Defaults to /app for site-attached apps and / when used with --new.
-s, --site-idConnect to an existing site directly, skipping the site picker.
--newCreate an app without connecting to an existing site.
-w, --workspace-idTarget workspace explicitly, skipping the workspace picker.
--no-inputGlobal option. Run non-interactively for CI/CD. Requires --app-name and --framework. Without --new, defaults to site-attached behavior.

Also accepts global options.

--site-id and --workspace-id are mutually exclusive

Use --site-id to connect to an existing site, or --workspace-id with --new to create a project app in a specific workspace. Passing both will error.

Example

# Initialize a new Astro app mounted at /app on a specific site
webflow cloud init -f astro -m /app -s 1234567890
# Initialize non-interactively with an explicit app name
webflow cloud init -f astro -m /app -s 1234567890 -n "My App" --no-input
# Initialize a project app (no site) in a specific workspace
webflow cloud init --new --no-input \
--app-name my-app \
--framework nextjs \
--workspace-id ws_abc123

cloud list

Deprecated

webflow cloud list is deprecated and will be removed in a future major release. It lists scaffold templates for init (e.g. nextjs, astro), not the Cloud apps in your workspace. To list your apps, use apps list. For available templates, use apps init with --framework (or --help).

Lists available app templates for cloud init.

Usage

webflow cloud list

cloud deploy

Deprecated

webflow cloud deploy is a deprecated alias of webflow apps deploy. Both share the exact same options and behavior; prefer apps deploy in new scripts.

Deploys your app to Webflow Cloud.

Usage

webflow cloud deploy [options]

Options

OptionDescription
-e, --environmentTarget environment name.
-m, --mountTarget mount path (e.g., /app).
-n, --app-nameApp name when creating an app.
--project-nameDeprecated. Long-form alias for --app-name. Still accepted, emits a warning.
-a, --app-idDeploy to an existing Cloud app directly, skipping the app picker.
--project-idDeprecated. Long-form alias for --app-id. Still accepted, emits a warning. The CLI no longer accepts the previous -p short flag — use -a instead.
-d, --directoryDeploy from a specific subdirectory. Use this when your app lives in a subfolder of a monorepo.
--descriptionApp description when creating an app.
-s, --site-idForce site-attached deploy context, skipping the site picker.
-f, --frameworkOverride framework detection before deploy.
--skip-mount-path-checkSkip mount-path validation checks.
--auto-publishPublish the site after deployment.
-w, --workspace-idTarget workspace explicitly for project-app first deploys, skipping the workspace picker.
--no-inputGlobal option. Run non-interactively for CI/CD. Disables most prompts but not the app-select prompt — see the callout below.

Also accepts global options.

--site-id and --workspace-id are mutually exclusive

Use --site-id to deploy site-attached, or --workspace-id to deploy a project app in a specific workspace. Passing both will error.

How deploy resolves which app to target

Before deploying, the CLI resolves the target app in this order:

  1. --site-id flag → site-attached deploy.
  2. --workspace-id flag → project-app deploy.
  3. siteId in webflow.json → site-attached deploy.
  4. cloud.workspace_id in webflow.json → project-app deploy.
  5. WEBFLOW_SITE_ID environment variable → site-attached deploy.
  6. Interactive picker → or hard-error when --no-input is set.
Configuration for CI/CD pipelines

For non-interactive deployments suitable for CI/CD pipelines, pass --no-input along with both --mount and --environment, plus an explicit target — either --site-id for site-attached deploys or --workspace-id for project apps. You can also use --auto-publish to publish the site after deployment so that your new environment is live.

# Site-attached deploy
webflow cloud deploy --no-input -s 1234567890 -e production -m /app --auto-publish
# Project app deploy
webflow cloud deploy --no-input -w ws_abc123 -e production -m /app
Avoid hangs in CI

The deploy prompts (select an existing app, name a new app, pick an environment) are gated on whether --mount and --environment are both set — not on --no-input. Passing --no-input without both flags still fires the prompt and hangs in non-TTY contexts. The minimum safe CI form is --no-input --mount <path> --environment <env> --site-id <id> (or --workspace-id <id> for a project-app first deploy).