Skip to main content
GET
App Versions

App Versions

LaunchMyStore apps are versioned independently of the underlying App record. Each version captures a snapshot of the app’s extensions, functions, and per-function wasmPaths, plus a free-form releaseNotes body. Versions move through a three-state lifecycle:
  • draft — created but not visible to merchants. Cannot be installed.
  • published — the currently active version. Auto-installs to merchants with autoUpdate = true and no pinnedVersion.
  • deprecated — superseded by a newer published version, or explicitly deprecated. Still installable via rollback, but new installs go to the latest published version.
There is at most one published version per app at any time — publishing a new version automatically demotes the previously published one to deprecated. All endpoints in this group require merchant JWT auth and verify that the caller’s storeId matches App.developerId. Calls from non-owners return 404 App not found.

Endpoints

For per-installation rollback and resume-auto-update, see Rollback.

Create Version

POST /apps/developer/:appId/versions

string
required
Semver-valid version string (e.g. 1.0.0, 2.3.1-beta.4). Validated with semver.valid(). Must be strictly greater than the current published version. Invalid versions return 400 Invalid version format. Use semver (e.g. 1.0.0). Versions less than or equal to the latest published return 400 Version must be greater than X.Y.Z.
string
Free-form changelog body. Displayed to merchants when they review the update and to staff in the review queue.
object
Snapshot of the app’s extensions config for this version. Defaults to App.extensions (the live config) when omitted.
object
Snapshot of function definitions for this version.
object
Map of functionHandle → wasmPath for this version’s compiled artifacts. The artifacts themselves must already be uploaded via POST /apps/developer/:appId/functions.
Response (201):
A created entry is also appended to the version changelog.

List Versions

GET /apps/developer/:appId/versions

Returns every version (any status), newest-first by createdAt.

Version Stats

GET /apps/developer/:appId/versions/stats

Per-version install counts (counts installations by their installed version).
installCount includes installs that are pinned to that version (merchant-initiated rollback) plus stragglers with autoUpdate = false.

Publish Version

POST /apps/developer/:appId/versions/:version/publish

Promotes a draft to published. Has three side effects:
  1. The previously-published version (if any) is set to deprecated with deprecatedAt = now().
  2. App.version is synced to the new version.
  3. All installations with autoUpdate = true AND pinnedVersion IS NULL have installedVersion updated to the new version.
Response: the full AppVersion row with status: "published" and publishedAt populated. Error codes:

Deprecate Version

POST /apps/developer/:appId/versions/:version/deprecate

Manually deprecate a version — useful for emergency pulls when a bug is discovered in a previously-published version. Does not auto-promote another version; installations already running the deprecated version keep running until they are rolled back or the next published version hits them via autoUpdate.
Sets status = 'deprecated', deprecatedAt = now(), appends a deprecated changelog entry.

Changelog

Every state transition is recorded in the version changelog: The changelog endpoint is internal — there is no public list endpoint yet. Use the per-version stats and the version list to drive a UI.
The publish flow’s auto-update fan-out skips any installation with a non-null pinnedVersion — pinning is the merchant’s signal that they do not want automatic updates for this app.