Draft, upload, verify, publish.
A published release is the result of three authenticated API operations with a direct storage upload between presign and publish.
Create or update draft
POST /v1/apps/{app-slug}/releases creates the channel/version draft or updates its notes and requested publication date while it remains a draft.Declare an artifact
POST /v1/apps/{app-slug}/artifacts/presign records target, format, size, SHA-256, optional signature, and optional content type.Upload directly
PUT the exact bytes to the returned uploadUrl using all returned headers.Publish
POST /v1/apps/{app-slug}/releases/{release-id}/publish verifies every draft object exists and matches its declared byte size, then changes the release to published.Draft behavior
Creating the same channel and version again updates notes and publication date
only while the existing release is still a draft. Once published, the same
channel/version returns release_already_published.
Declaring another artifact with the same release and target replaces the draft artifact record. Declaring a new target adds another artifact until the 32-artifact limit is reached.
Publication checks
Publication requires at least one artifact. Every artifact must have an object
key, the uploaded object must exist, and its actual byte size must equal the
declared size.
After publication
The release becomes eligible for:
- the updater endpoint
- public latest and release-history responses
- the hosted download page
- completed-download analytics
- channel retention scheduling
Only artifacts whose stored object still exists and has not been pruned appear in edge responses.