Create, upload, and publish.
The public publishing API is a three-request control flow with a direct presigned PUT between artifact declaration and final publication.
All publishing requests use:
https://releases.mateality.com
and require a publish key.
1. Create a draft
POST /v1/apps/{app-slug}/releases
Content-Type: application/json
Authorization: Bearer {publish-key}
{
"channel": "stable",
"version": "1.4.2",
"notes": "Release notes",
"pubDate": "2026-07-28T10:00:00.000Z"
}
versionstringRequired1–128 allowed characters; begins with a letter or number.
channelstringAn existing active channel.
Default:stablenotesstringRelease notes, at most 64 KiB.
pubDatedate-timeA value accepted by JavaScript Date parsing.
Default:request timeSuccess is 201 with { "release": ... }. Save release.id.
2. Declare an artifact
POST /v1/apps/{app-slug}/artifacts/presign
Content-Type: application/json
Authorization: Bearer {publish-key}
{
"channel": "stable",
"version": "1.4.2",
"target": "linux-x86_64",
"format": ".zip",
"size": 8459217,
"sha256": "64-lowercase-hex-characters",
"signature": null,
"contentType": "application/zip"
}
channelstringMust match the draft’s channel.
Default:stableversionstringRequiredMust match an existing draft version.
targetstringRequired1–128 letters, numbers, dot, underscore, or hyphen.
formatstringRequiredLeading dot plus up to 64 allowed characters.
sizeintegerRequiredPositive byte count within the deployment artifact limit.
sha256stringRequiredExactly 64 hexadecimal characters; normalized to lowercase.
signaturestring | nullAdapter-specific signature text, at most 32 KiB.
contentTypestringPrintable MIME type containing `/`, at most 200 characters.
The response contains artifact, uploadUrl, and headers.
3. Upload bytes
PUT {uploadUrl}
{every header returned by the presign response}
{exact artifact bytes}
Do not attach the publish key to the storage URL. Send the exact declared byte length and every returned header, including server-side encryption.
4. Publish
POST /v1/apps/{app-slug}/releases/{release-id}/publish
Authorization: Bearer {publish-key}
Success is 200 with { "release": ... }. The release’s publication time is
set to the server’s current time.