---
title: "Change the runtime version"
method: POST
path: "/app/{id}/runtime-version"
tags: ["apps"]
---

# Change the runtime version

`POST /app/{id}/runtime-version`

## Request

- Base URL: `https://api.faable.com`
- URL: `https://api.faable.com/app/{id}/runtime-version`
- Auth: one of:
  - OAuth 2 (authorization code, authorization URL `https://faable.auth.faable.link/authorize`, token URL `https://faable.auth.faable.link/oauth/token`)
  - HTTP bearer
  - OAuth 2 (client credentials, token URL `https://faable.auth.faable.link/oauth/token`)
  - HTTP bearer
  - HTTP basic
  - API key in query parameter `apikey`

Move the app to another supported runtime version. Writes the sticky pin and rebuilds the promoted deployment from its stored source — the version changes with a build, never in place. The previous deployment keeps serving until the rebuild is READY, and remains available to roll back to.

## Path parameters

- `id` string, required

## Request body

- object
  - `version` string, required: A supported minor (python/php, e.g. "3.13") or major (node, e.g. "24")

## Response `200`

Default Response

- object
  - `pinned` object, required
    - `name` string, required
    - `version` string, required
    - `pinned_at` string, date-time, required
    - `source` string, required
  - `deployment_id` string, required

## Other responses

- `400`: `unsupported_runtime_version` — The requested version has no runtime image in the platform catalogue. `message` lists the supported versions. `validation_error` — The body, query or path failed schema validation. `details.issues` lists each failing field.
- `401`: `unauthorized` — The request carries no valid credentials. `invalid_token` — The bearer token is missing, malformed or expired.
- `403`: `forbidden` — The credentials are valid but do not allow this operation. `user_suspended` — The account is suspended. Contact support@faable.com.
- `409`: `runtime_pin_unavailable` — The app has no shared runtime to version: docker and static apps bring their own, and an app that never built has nothing to move. `runtime_repo_pinned` — The repository forces the runtime version (runtime.txt, engines.node…), which outranks this setting. `message` names the file; remove that pin and push to manage the version from the platform. `rebuild_in_flight` — A rebuild of this deployment is already queued or building. `details.deployment_id` is that rebuild.
- `429`: `too_many_requests` — Rate limit exceeded. Honour the `Retry-After` header.
- `500`: `internal_error` — Unexpected server error. Retry later; the request id is logged.
- `503`: `database_unavailable` — Faable cannot reach its database right now. Transient: retry after the `Retry-After` header.

---

[API](https://skmtc.dev/faable/apis/faablecloud-api.md) · [All operations](https://skmtc.dev/faable/apis/faablecloud-api/llms.txt) · [OpenAPI document](https://skmtc.dev/faable/apis/faablecloud-api/revisions/e2fc93da3c49?raw)
