Create Application
Create an application — the content unit. Deploy files to it (upload or git) and expose it with an agentless endpoint. To do all of that in one call, use Quick Deploy instead.
With source: "upload" the app starts empty — upload a .zip next. With source: "git" the repo is connected and the first deploy is enqueued automatically.
Application types
The type field selects which components the application carries:
.zip upload or git repo is built (or served as-is) to static files on the edge. Requires the application_hosting entitlement.Dockerfile into a signed, scanned, digest-pinned container image, run gVisor-isolated and reached through a managed endpoint. Requires the managed_backends entitlement, and creates the runtime spec.backend_paths prefixes (default ["/api"]) path-routed to the backend.function_* fields below. See the Serverless functions guide.static app builds to files. A managed / fullstack app builds a container image from your Dockerfile — signed, vulnerability-scanned, and pinned to its digest so a rollback is an immutable pointer. Tune the runtime (port, health check, replicas, cpu/mem) via PUT /runtime. Only MySQL / MariaDB managed databases are available today.
Request body
static (default), managed, fullstack, or function (see above).upload (default) or git.git. A github.com / gitlab.com URL.main. Must be a valid git branch name, at most 255 bytes; otherwise 400 “That isn't a valid branch name. Enter it as it appears in your repository, like main or feature/login.”repo_url / git_token. A GitHub account you connected through the ngris GitHub App (its uuid from GET /v1/git/installations — not GitHub's own installation_id). Use with repo. Builds use a short-lived, read-only token for that repository and pushes deploy without a webhook. See Import from GitHub.git_installation_uuid: "owner/name" of a repository that installation can read. branch defaults to its default branch./, no ... Applied at create for static, managed, fullstack and function apps (change it later with PUT /applications/{uuid}); a wordpress app doesn't use it.static and fullstack (the front end), and managed (Node apps only: a Python or Go app's build fails with one). "" = detected.static and fullstack (the front end), and managed (Python: after the dependencies; Go: must write /app/server). "" = detected.static and fullstack (the front end): the folder the build writes the site to, inside the project (e.g. dist); everything in it is published. Leading and trailing slashes are trimmed; no ..; . = the project root; at most 512 bytes. Used only when a build runs. "" = detected.managed, and fullstack (the backend): how the server starts, run with a shell; the server must listen on $PORT. npm start, npm run <name>, yarn <name> and pnpm <name> run that package.json script. See Backend Apps. "" = detected.fullstack only. URL path prefixes routed to the backend (each /-rooted; max 20). Default ["/api"].managed / fullstack only. The port your server listens on (1–65535). Default 8080.managed / fullstack only. The absolute path the readiness probe calls; a deploy goes live only once it answers. Default / for managed, the first backend_paths prefix for fullstack.function only. Base runtime: nodejs24 (Node.js 24, the default). nodejs20 and nodejs22 are still accepted as aliases and run on Node.js 24.function only. Entry as <file>:<export>. Default index.js:default.function only. Scale to zero after this many idle seconds (0 = never; 0–3600). Default 300.function only. Per-request wall-clock cap (1–300). Default 30.function only. Concurrent requests per instance before scale-up (1–200). Default 40.public or private — who can reach the production URL. Default public. Change later with PUT /visibility.public or private — who can reach preview URLs. Default private.The four build settings are trimmed, and each command is one line of at most 1024 bytes (chain steps with &&; control and invisible characters are refused). A function or wordpress app takes none of them. A value the app's type can't take is refused; "" (back to detection) is always accepted. Change them later with PUT /applications/{uuid}.
Deprecated: git_installation_id (integer) is still accepted until the sunset. Send git_installation_uuid; sending both for different objects is a 400 id_uuid_mismatch.
Response (201 Created)
A static app (the default) answers the same object as Get Application: endpoints is [] and primary_endpoint_uuid is omitted until an endpoint serves it. A managed, fullstack or function app answers the application fields plus a runtime object (its runtime spec) in place of the runtime fields, endpoints and the quota_paused fields.
/applications/{uuid} URL.static, managed, fullstack or function — whichever you requested.upload or git.index.html.public or private — production-URL access (default public).public or private — preview-URL access (default private).false, the repository root "" unless you sent root_directory). Change them with PUT /applications/{uuid}.static app's answer carries the build settings it was created with ("" = detected). A managed, fullstack or function app's answer doesn't: read them with Get Application.git object of Get Application (repository, branch, auto_deploy, auto_preview, connected, …; token and secret redacted). Omitted for upload apps.function apps only: the endpoint created with the function (a generated hostname on the platform domain, made the app's primary) and its https:// URL. It serves the function once the first deploy is ready. No other app type gets an endpoint at create — add one with Create Endpoint, or use Quick Deploy for a static app.function apps only, with status 207 instead of 201: why no endpoint could be created (for example, your plan's endpoint limit is reached). The function itself is created and deploys still work; add an endpoint later with Create Endpoint.Deprecated: until the sunset this response also carries the legacy integer id and *_id fields. Don't use them; read uuid and the *_uuid fields.
Errors
source, an invalid repo_url, root_directory, backend_paths, port or health_check_path, or a visibility other than public / private; a refused build setting — install_command must be a single line (chain commands with &&) of at most 1024 bytes (the same for build_command and start_command), invalid output_dir: must be a folder inside the project, like dist or build/site (no '..'), or a build setting the app's type can't take, e.g. start_command can only be set on a managed or full-stack app, output_dir can only be set on a static or full-stack app, install_command can only be set on a static, managed or full-stack app (a function takes none); git_installation_uuid is not a uuid or is combined with repo_url / git_token; id_uuid_mismatch.git_installation_uuid not found — no such linked installation in your active account.managed/fullstack, functions_enabled for function — or the applications_max (or max_functions) quota is reached.