AppsinityAPPSINITY
Builds and uploads

Upload a build

Uploads do not pass through the Appsinity API. Studio asks a worker for a presigned URL and the browser PUTs the file directly to storage.appsinity.com.

Open Appsinity Studio

The two-request flow

  1. Presign. The page POSTs { fileName, contentType, contentEncoding, size, type, gameId, appId, version } to the upload worker's /upload-url with your bearer token.
  2. PUT. A single XMLHttpRequest PUT sends the whole File to the returned URL. SigV4 signs the request in the worker; the payload is unsigned.
  3. Verify. The client asks /api/storage/file-info for the stored byte size and compares it to the local file. A mismatch is fatal; an unreachable lookup is not — it logs and marks the result sizeVerified: false.
  4. Attach. The resulting URL is written onto the build or media record, and the listing's download chain begins to resolve.
POST https://appsinity-upload.virexeonofficial-aaa.workers.dev/upload-url
{
  "fileName": "mygame-release.aab",
  "contentType": "application/octet-stream",
  "size": 48227328,
  "type": "game-build",
  "gameId": "<game id>",
  "version": "<key prefix or timestamp>"
}

PUT https://storage.appsinity.com/public/games/<gameId>/builds/<version>/mygame-release.aab
    ?X-Amz-Algorithm=AWS4-HMAC-SHA254&X-Amz-SignedHeaders=content-type%3Bhost
    &X-Amz-Expires=10800&X-Amz-Signature=...

Where your file lands

Two consequences follow. First, the bucket name is part of the path: a public file is storage.appsinity.com/public/<key>, and a URL without /public/ will not resolve. Second, version defaults to Date.now() when you do not supply a prefix, so two uploads of the same file create two distinct build directories rather than overwriting one.

Upload categoryObject keyPublic URL
game-buildgames/{gameId}/builds/{version}/{file}storage.appsinity.com/public/games/…
game-webgames/{gameId}/web/[{version}/]{relPath}Folder root is served as a directory
app-fileapps/{appId}/files/{version}/{file}storage.appsinity.com/public/apps/…
app-mediaapps/{appId}/media/{file}No version segment at all
Watch out: There is no delete-your-own-object control. Superseded builds stay in storage and continue to be reachable by URL until Appsinity removes them.

What the progress bar means

  • The strip shows the file name, loaded / total bytes, and a rounded percent.
  • For a web-game folder it is cumulative bytes across every file in the folder, uploaded sequentially.
  • The only literal label is Preparing web game. There is no "Uploading…", "Processing…" or "Complete" string, no ETA and no speed.
  • On success the bar goes to 100% and hides. On failure it only hides — the reason appears in the browser console under [Appsinity upload].
  • The presigned URL is valid for 3 hours (10,800 s), but the page never reads that expiry.
Important: There is no resume, no cancel, no retry and no chunking. A tab closed at 99% means the file starts again from zero.

Every error string you can meet

Nothing is retried automatically. Every one of these is a single attempt you either repeat by hand or report.

MessageCauseWhat to do
Sign in again before uploading.No bearer token in localStorageLog out of Studio and back in
File too large (X GB). Max 5.00 GB.Above the client's 5 GiB ceilingSplit or rebuild with fewer assets
Blocked file type: <ext>The extension is on the denylistRepackage; see Upload limits and file types
Presign API failed (401).Token rejected by the workerSign in again
Presign API failed (400).Bad payload — missing gameId or appIdRetry from the correct sheet
Upload API did not return a signed URL.Worker secrets missing or storage unreachableWait and retry, then report to devhelp
Upload API returned a stale signed URL without Content-Encoding. Hard refresh the dashboard and upload again.Cached worker bundleHard-refresh Studio, then retry
Direct MinIO PUT failed (503): …Storage host refused the writeRetry later; if it repeats, report the file name and time
Direct MinIO PUT could not reach storage at <host>.DNS or CORS failure on storage.appsinity.comCorporate proxy; try another network
Direct MinIO PUT blocked: backend returned unsafe upload host …The presigned URL was not the public HTTPS storage domainReport it — the backend handed out a wrong URL
Could not verify file size: (console only)The file-info lookup failedNo action; the upload succeeded but is unverified

Frequently asked questions

Can I upload with curl instead of the dashboard?

The presign endpoint needs your Studio bearer token, and the PUT it returns is ordinary S3, so a scripted upload is possible in principle. Nothing on Appsinity documents or supports it, and the version key you invent will not match what the listing expects.

Does the uploader record which platform the build is for?

No. There is no platform field anywhere in the upload or the presign payload — the platform is inferred from the extension and from the listing's own platform string.

How do I replace a bad upload?

Upload the correct file and save the build record so the listing points at the new URL. The old object stays in storage until Appsinity prunes it.

Need help?

Developer publishing support: [email protected]
General support: [email protected]
Partnerships: [email protected]