Network
Publish Application on the Web
Turns web publishing on for an application created without it, and off again.
POST
Publish Application on the Web
An application created without a
Takes no body. It releases the subdomain, removes every custom domain (their DNS records at your provider stay until
you delete them) and turns the application back into a private one, then recreates the container. The response has the same shape, with
subdomain is private: it runs, but nothing routes to it from the
internet. These two routes turn web publishing on and off at any time, without recreating the
application.
string
required
The application ID. Only the application’s owner can call this endpoint; workspace members are not accepted here yet.
string
The subdomain to publish under, without the
.vertraweb.app suffix (e.g., myapp). Between 3 and
50 characters, matching ^[a-z0-9][a-z0-9-]*[a-z0-9]$.Optional. Omit it and the platform picks a subdomain for you. Sending a value requires a plan
with custom subdomains; picking one at random does not.integer
Only for an application that runs a custom Docker image: the port the image listens on, from 1 to 65535. It is saved as the application’s port. Required when the application was created without web, otherwise the call fails with
IMAGE_APP_PORT_REQUIRED. Ignored for any other application.Response
object
Unpublish
subdomain
set to null, domains empty and type back to 1.
Memory floor
A published application needs at least 512 MB of RAM. Memory is never raised for you here: if the application has less, the request fails withMEMORY_BELOW_MINIMUM and the current and required
values come back in details. Raise it with
Update Application Config and try again.
Error Response (400)
Error Responses
string
The error code indicating the reason for the failure. Possible values:
VALIDATION_ERROR: The path parameter or the body failed validation (400). This is what a malformedsubdomainreturns — 3 to 50 characters,^[a-z0-9][a-z0-9-]*[a-z0-9]$. The response also carriesmessageandpath.AUTH_TOKEN_MISSING,API_KEY_INVALID,SESSION_REVOKED: TheAuthorizationheader is missing, the API key is invalid, or the dashboard session was revoked (401).API_KEY_IP_DENIED,API_KEY_SCOPE_DENIED: The API key is used from an IP outside its allowlist, or it lacks the scope the route requires (403).USER_NOT_FOUND: The authenticated user could not be resolved (401).ACCESS_DENIED: The user does not have permission to act on the application (403).PLAN_REQUIRED: The account that owns the application has no active plan (403).PLAN_DOES_NOT_SUPPORT_WEB_PUBLISH: The owner’s plan does not include web publishing (403).PLAN_DOES_NOT_SUPPORT_CUSTOM_SUBDOMAIN: Asubdomainwas sent but the owner’s plan does not allow choosing the name (403). Omit the field to get a random one.APP_NOT_FOUND: The specified application does not exist (404).IMAGE_APP_PORT_REQUIRED: The application runs a custom Docker image, has no port yet and the body has noport(400).APP_ALREADY_PUBLISHED: The application already has a subdomain or a custom domain (400).APP_NOT_PUBLISHED:DELETEon an application that is not published (400).MEMORY_BELOW_MINIMUM: The application has less RAM than a published application requires (400), withdetails: { current_mb, minimum_mb }.SUBDOMAIN_FORBIDDEN: The requested subdomain is on the platform’s reserved list (400).SUBDOMAIN_TAKEN: Another application already uses that subdomain (409).OPERATION_IN_PROGRESS: Another lifecycle operation on the same application is running; the container was not touched (409). Wait a few seconds and retry.INTERNAL_SERVER_ERROR: Unexpected failure (500).
string
A descriptive message providing additional details about the error.
Two limits apply, and they are deliberately tight. Publishing and unpublishing recreate the
container, so they share the per-application lifecycle budget with
start, stop, restart and
dependency installs: 10 requests per minute for all of them together, per application — not
one budget per route. On top of that, a successful publish starts a 5-minute cooldown on the
application’s public address, shared with
Change Subdomain: publishing again inside that
window returns 429 SUBDOMAIN_CHANGE_RATE_LIMITED. Unpublishing and publishing under a new name
is an address change like any other and does not bypass it. Refusals do not consume the cooldown —
only a publish that actually happened does. See Rate Limiting.Last modified on October 26, 2026