Skip to main content

Upload App

Upload a new version of an application, including the binary file and relevant metadata. You can specify an updater type for artifact isolation when uploading files for updaters that generate special files.

Endpoint

POST /upload

Authentication

HeaderValue
AuthorizationBearer <jwt_token>

Request Body

The request uses multipart/form-data format with the following fields:

FieldTypeRequiredDescription
filefileApp binary file(s)
app_namestringName of the application
versionstringVersion of the application
channelstringChannel (e.g., stable, beta)
publishbooleanMarks the version available for users
criticalbooleanMarks the version as critical
platformstringPlatform (e.g., linux, windows)
archstringArchitecture (e.g., amd64, arm64)
changelogstringChangelog in markdown format
updaterstringUpdater type for artifact isolation (manual, squirrel_darwin, squirrel_windows, electron-builder, tauri)
signaturestringCryptographic signature (required for Tauri updater)
info

The updater parameter is useful when uploading files for updaters that generate special files (like RELEASES for Squirrel Windows or *.yml for electron-builder). It ensures files are stored in isolated folders specific to that updater.

Example Requests

Single File Upload (Standard)

curl -X POST --location 'http://localhost:9000/upload' \
--header 'Authorization: Bearer <jwt_token>' \
--form 'file=@"/path_to_file/myapp.deb"' \
--form 'data="{\"app_name\":\"myapp\",\"version\":\"0.0.1\",\"channel\":\"stable\",\"publish\":true,\"platform\":\"linux\",\"arch\":\"amd64\",\"changelog\":\"### Changelog\\n\\n- Added new feature X\\n- Fixed bug Y\"}"'

Upload with Updater Parameter (Squirrel Windows)

curl -X POST --location 'http://localhost:9000/upload' \
--header 'Authorization: Bearer <jwt_token>' \
--form 'file=@"/path_to_file/myapp.exe"' \
--form 'file=@"/path_to_file/RELEASES"' \
--form 'data="{\"app_name\":\"myapp\",\"version\":\"0.0.1\",\"channel\":\"stable\",\"publish\":true,\"platform\":\"windows\",\"arch\":\"amd64\",\"updater\":\"squirrel_windows\",\"changelog\":\"### Changelog\\n\\n- Added new feature X\\n- Fixed bug Y\"}"'

Upload with Updater Parameter (Electron Builder)

curl -X POST --location 'http://localhost:9000/upload' \
--header 'Authorization: Bearer <jwt_token>' \
--form 'file=@"/path_to_file/myapp.exe"' \
--form 'file=@"/path_to_file/latest.yml"' \
--form 'data="{\"app_name\":\"myapp\",\"version\":\"0.0.1\",\"channel\":\"stable\",\"publish\":true,\"platform\":\"windows\",\"arch\":\"amd64\",\"updater\":\"electron-builder\",\"changelog\":\"### Changelog\\n\\n- Added new feature X\\n- Fixed bug Y\"}"'

Upload with Updater Parameter (Tauri)

curl -X POST --location 'http://localhost:9000/upload' \
--header 'Authorization: Bearer <jwt_token>' \
--form 'file=@"/path_to_file/myapp.app.tar.gz"' \
--form 'data="{\"app_name\":\"myapp\",\"version\":\"1.0.0\",\"channel\":\"stable\",\"publish\":true,\"platform\":\"darwin\",\"arch\":\"amd64\",\"updater\":\"tauri\",\"signature\":\"dW50cnVzdGVkIGNvbW1lbnQ6IHNpZ25hdHVyZSBmcm9tIHRhdXJpIHNlY3JldCBrZXkKUlVUUzIzUGJLcHpQNHdCVEJzTXJjbWFhUUdUVEtaUGRLdGhWdGZJZkF2VmM0TzJGMkdPQUk4V1hzYWJuUUhWbWI2cTFWTkhEZE9lbkVwUERCQmhRPT0K\",\"changelog\":\"### Changelog\\n\\n- Added new feature X\\n- Fixed bug Y\"}"'

Multiple File Upload (Standard)

curl -X POST --location 'http://localhost:9000/upload' \
--header 'Authorization: Bearer <jwt_token>' \
--form 'file=@"/path_to_file/myapp.deb"' \
--form 'file=@"/path_to_file/myapp.rpm"' \
--form 'data="{\"app_name\":\"myapp\",\"version\":\"0.0.1\",\"channel\":\"stable\",\"publish\":true,\"platform\":\"linux\",\"arch\":\"amd64\",\"changelog\":\"### Changelog\\n\\n- Added new feature X\\n- Fixed bug Y\"}"'

Response

Success Response (200 OK)

{
"uploadResult.Uploaded": "6411c7c0ec4ff9a9a9bc18fa"
}

Response Fields

FieldTypeDescription
uploadResult.UploadedstringThe unique identifier (ID) of the uploaded version

Updater-Specific File Organization

When you specify an updater parameter, files are organized in isolated folders:

File Structure Examples

Standard Upload (No Updater):

/myapp/stable/linux/amd64/
├── myapp-0.0.1.deb
└── myapp-0.0.1.rpm

Squirrel Windows Upload:

/squirrel_windows/myapp/stable/windows/amd64/0.0.1/
├── myapp.exe
└── RELEASES

Electron Builder Upload:

/electron-builder/myapp/stable/windows/amd64/0.0.1/
├── myapp.exe
└── latest.yml

Supported Updater Types

UpdaterGenerated FilesUse CaseSpecial Requirements
manualNoneStandard FaynoSync uploadsNone
squirrel_darwinNoneSquirrel macOS applicationsNone
squirrel_windowsRELEASESSquirrel Windows applicationsNone
electron-builder*.ymlElectron applicationsNone
tauriNoneTauri applications with built-in updaterRequires signature field

Notes

  • You can upload multiple files for different platforms/architectures in a single request
  • The changelog field supports markdown formatting
  • Critical versions are typically used for security updates or critical bug fixes
  • Published versions are immediately available to end users
  • The channel field helps organize releases (e.g., stable, beta, nightly)
  • File uploads support common package formats (.deb, .rpm, .exe, .dmg, etc.)
  • Updater Parameter: Use the updater parameter when uploading files for updaters that generate special files (RELEASES, *.yml)
  • Artifact Isolation: Files uploaded with an updater parameter are stored in isolated folders to prevent conflicts
  • File Organization: Generated files (RELEASES, *.yml) are properly organized when using updater-specific uploads
  • Signature Field: When using Tauri updater, the signature field is required for cryptographic verification of updates. This signature is generated by Tauri's build process and ensures update integrity and authenticity.