Getting Access
Become an approved UbuntuPlay developer to sign game releases, publish plugins, and distribute through the Marketplace.
1. Apply for a Developer Account
Go to the Developer Portal signup page.
Create a Better Auth account with your email and password.
Fill in your profile: name, organisation, website, and a short description of what you plan to build.
Submit the application. New accounts start in
pendingstatus until reviewed.
active.2. Account States
| Status | Meaning | Can sign / publish? |
|---|---|---|
pending | Awaiting admin review | No |
active | Approved developer | Yes |
suspended | Administrative suspension | No |
3. Create an API Key
Once active, generate a key from the Dev Portal or via the API:
POST /hub/api/dev/api-keys
Content-Type: application/json
Cookie: better-auth.session_token=<your-session>
{
"name": "My Laptop",
"scopes": ["sign:game", "publish:plugin"]
}
The response contains the raw key once. Store it securely:
{
"ok": true,
"key": "updev_abc123...",
"keyId": "key_...",
"warning": "Copy this key now — it will not be shown again."
}
4. Authenticate Requests
There are two ways to call developer endpoints:
Session cookie (browser / portal)
When calling from the Dev Portal, the Better Auth session cookie is sent automatically.
API key (scripts, CI, game builders)
Pass the key in the X-Api-Key header for game signing and plugin publishing:
curl -X POST https://ubuntuplay.fly.dev/hub/api/dev/sign \
-H "X-Api-Key: updev_your_key_here" \
-H "Content-Type: application/json" \
-d '{"manifest": {"type": "game_add", "version": "1.0.0", "files": [...]}}'
5. First Request — Check Your Profile
Profile and portal endpoints such as GET /hub/api/dev/me use your session cookie (they do not accept X-Api-Key). From a script, sign in first and reuse the cookie:
curl -c cookies.txt -X POST https://ubuntuplay.fly.dev/api/auth/sign-in/email \
-H "Content-Type: application/json" \
-d '{"email": "you@example.com", "password": "…"}'
curl -b cookies.txt https://ubuntuplay.fly.dev/hub/api/dev/me
sign:game is required for POST /hub/api/dev/sign. publish:plugin is required for plugin submissions. New keys default to sign:game if no scopes are supplied.