> ## Documentation Index
> Fetch the complete documentation index at: https://docs.susaplay.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Build Uploads

> Submit playable builds for review and version tracking

## WebGL build structure

The zip must contain `index.html` and a `*.loader.js` file:

```text theme={null}
your-build.zip
├── index.html          ← required
├── Build/
│   ├── game.loader.js  ← required
│   ├── game.wasm
│   ├── game.data
│   └── game.framework.js
└── TemplateData/
```

A single wrapping folder is fine — if Unity exports to `WebGLBuild/`, the upload strips that
prefix for you. What fails is a zip with several top-level folders and no `index.html` inside any
single one.

`__MACOSX/` and `._` entries created by macOS are ignored automatically.

<Warning>
  Missing either `index.html` or a `*.loader.js` file is rejected with
  `Invalid build: missing index.html or loader file`.
</Warning>

### Archive limits

| Limit                       | Value  |
| --------------------------- | ------ |
| Files in the archive        | 1,000  |
| Single file, uncompressed   | 200 MB |
| Whole archive, uncompressed | 1.5 GB |

These are checked before extraction, so an oversized build fails fast rather than part-way.

## Upload via Developer Portal

1. Developer Portal → your game → **Builds → Upload Build**
2. Select platform (WebGL, iOS, Android)
3. Set version ID — use semantic versioning (`1.0.0`) or dates (`2026-08-01`)
4. Add release notes — describe what changed and how to test
5. Upload zip

## Upload via CI/CD

Use the developer API key:

```bash theme={null}
curl -X POST https://api.susaplay.com/catalog/publish \
  -H "Authorization: ApiKey $DEVELOPER_API_KEY" \
  -F "gameId=$GAME_ID" \
  -F "versionId=$VERSION" \
  -F "platform=webgl" \
  -F "notes=Build $CI_COMMIT_SHA" \
  -F "build=@./dist/game.zip"
```

## Version states

| State            | Meaning                                 |
| ---------------- | --------------------------------------- |
| `pending_review` | Submitted, awaiting review              |
| `live`           | Currently served to players             |
| `deprecated`     | Replaced by a newer live version        |
| `rejected`       | Failed review — fix issues and resubmit |

A passing review moves a version straight to `live`. There is no separate approved-but-not-live
state.

## Release notes checklist

Good release notes help reviewers pass builds faster:

* What changed since last version
* Known issues or workarounds
* Test account credentials if auth is required
* Which platforms were tested
