Developer documentation
Ship a skill game on Fiero
Build an HTML5 game, integrate the Fiero SDK, and submit it through this API. Fiero runs it through skill-certification and, once it clears, players compete on it for real prizes. This is an API-only developer surface — no dashboard; everything below is a plain HTTP call.
Overview
The lifecycle of a submission:
- Register a developer account and get a sandbox API key.
- Create a game record with its metadata (name, run clock, skill channels, mechanics).
- Upload your bundle (the built HTML5 game).
- Pre-check — run the §19 conformity checks and fix any gaps.
- Submit — a passing submission enters Fiero's review queue; a failing one comes back with the gaps.
- Fiero takes it through certification (statistical skill tests, human playtest, sign-off) and, once certified, flips it live for cash play.
Base URL & authentication
All endpoints are under:
https://dev.159-195-198-184.sslip.io/api
Authenticate every request (except POST /developers) with your API key, either header works:
Authorization: Bearer fk_sbx_xxxxxxxx…
# or
X-Api-Key: fk_sbx_xxxxxxxx…
Bodies are JSON (Content-Type: application/json) except the bundle upload, which is raw bytes.
Register a developer
Creates your developer account and returns your first sandbox key. The raw key is shown once — store it.
curl -X POST https://dev.159-195-198-184.sslip.io/api/developers \
-H 'content-type: application/json' \
-d '{"email":"you@studio.com","name":"Your Studio"}'
# → 201
{
"developer": { "id": "…", "email": "you@studio.com", "name": "Your Studio", "status": "active" },
"apiKey": { "key": "fk_sbx_9f3c…", "prefix": "fk_sbx_9f3c", "environment": "sandbox", ... }
}
API keys
Issue additional keys, list them (prefix only — never the raw key), or revoke one.
curl -X POST https://dev.159-195-198-184.sslip.io/api/keys \
-H 'authorization: Bearer fk_sbx_…' -H 'content-type: application/json' \
-d '{"label":"ci"}'
Create a game
Registers a submission (status draft) with the game's declared manifest:
| Field | Type | Notes |
|---|---|---|
slug | string | lowercase letters/digits/dashes, 3–40 chars (e.g. space-race) |
name | string | display name |
description | string? | optional |
runClockSec | int | 30–600s. A 120–180s timed score-attack qualifies for §19 fast-track. |
skillChannels | string[] | 1+ of speed, accuracy, pattern-recognition, planning |
mechanics | object | { hiddenInformation, prohibitedMechanics, summary } — see below |
category | string? | e.g. arcade-reaction |
mechanics.hiddenInformation — one of complete, symmetric, none (all pass),
or imperfect-asymmetric (a chance-assigned information advantage — fails M6, routes to rejection).
mechanics.prohibitedMechanics — must be empty; any of slots/reels/loot/wheels/dice-decided fails M8.
mechanics.summary — a non-empty description of how the game plays (§12.1).
curl -X POST https://dev.159-195-198-184.sslip.io/api/games \
-H 'authorization: Bearer fk_sbx_…' -H 'content-type: application/json' \
-d '{
"slug":"space-race","name":"Space Race","runClockSec":150,
"skillChannels":["speed","accuracy"],
"mechanics":{"hiddenInformation":"complete","prohibitedMechanics":[],
"summary":"Deterministic asteroid field from the match seed; pure reaction dodging."},
"category":"arcade-reaction"
}'
Upload the bundle
Upload the built game as raw bytes — a single self-contained HTML file or a zip. Set the
Content-Type to the file's type (text/html, application/zip, or
application/gzip). Max 20 MB.
curl -X POST https://dev.159-195-198-184.sslip.io/api/games/SUBMISSION_ID/bundle \
-H 'authorization: Bearer fk_sbx_…' \
-H 'content-type: application/zip' \
--data-binary @dist/space-race.zip
Pre-check conformity (§19 fast-track)
Runs the conformity checks without submitting — use it to see if your game qualifies and fix any gaps first. It's the same mechanical evaluation Fiero's Gate-1 certification uses, so a passing pre-check means your declared mechanics won't get the game rejected.
curl -X POST https://dev.159-195-198-184.sslip.io/api/games/SUBMISSION_ID/precheck \
-H 'authorization: Bearer fk_sbx_…'
# → { "conformity": { "ok": true, "checks": [ { "id":"m6-hidden-info", "ok":true, ... } ], "gaps": [] } }
Checks: valid slug · display name · skill channels declared · run clock in range · M6 hidden-information · M8 no prohibited mechanics · §12.1 mechanics summary · bundle uploaded · §19 fast-track eligibility.
Submit
Runs conformity and either advances the submission to pending_review (Fiero's queue) or returns it
as conformity_failed with the gaps to fix. Resubmit after fixing.
curl -X POST https://dev.159-195-198-184.sslip.io/api/games/SUBMISSION_ID/submit \
-H 'authorization: Bearer fk_sbx_…'
# → { "submission": { "status": "pending_review", "conformity": { "ok": true, ... } } }
Check status
List your submissions, fetch one, or edit a draft / conformity_failed submission's
metadata. Statuses: draft → conformity_failed | pending_review → in_certification | rejected → approved.
SDK integration
Your game runs inside a sandboxed iframe and talks to Fiero only through the Fiero SDK (postMessage bridge). The essentials the certification pipeline depends on:
- Determinism — all randomness must come from the match seed the SDK provides (
match.random/match.randomInt), neverMath.random. Both players get the identical board. - Record actions — call
match.recordAction(n)for each input; the server replays them to recompute and verify the score. - Submit the score — call
fiero.submitScore(score)at the end of the run.
The game is timing-independent and re-playable from its seed + action log — that's what lets Fiero prove skill and catch cheating by reconstruction.
Errors
| Status | Body error | Meaning |
|---|---|---|
| 400 | invalid_request | malformed body (see issues) |
| 400 | invalid_bundle | bundle wrong type / too large / empty |
| 401 | unauthorized | missing or invalid API key |
| 404 | not_found | submission not found (or not yours) |
| 409 | developer_exists | email already registered |
| 409 | invalid_transition | e.g. editing a submitted game |
| 415 | unsupported_media_type | bundle Content-Type not allowed |
| 429 | rate_limited | slow down (120 req/min) |