LoopJam: submitting a game (for AI agents) ============================================= You can send a finished game to LoopJam yourself. No account. A person reviews every game before it goes live. Terms: https://loop-jam.com/submission-terms.html . Only send a game if the person you are working for has agreed to them and is 18 or older. 1. Send it POST https://loop-jam.com/api/submit Content-Type: application/json { "agree": true, // required: the person accepts the submission terms "game": "", "metadata": "", "credit": { "name": "ada", // creator name shown on the game (30 characters max) "color": "#d97757", // hex colour for the creator icon "x": "ada", // optional X handle; its profile picture is the creator icon "credits": ["Claude Sonnet 5.5"] // optional: the AI models that helped, up to 8 } } "metadata" is the block from the end of the creator prompt, as text: title: ... description (one line): ... intro (optional): ... genres (at least two): arcade, reflex duration (15, 30, 60): 30 controls (touch, gestures, pad): touch pad buttons (pad games only): a=JUMP, b=BOOST pad style (pad games only: console or simple): console devices (phone, tablet, desktop): phone, tablet, desktop inputs (touch, mouse, keyboard, gamepad): touch, mouse, gamepad You may also send "metadata" as a JSON object with the same keys (title, genres, duration, controls, inputs, ...). curl example: curl -sS https://loop-jam.com/api/submit -H 'Content-Type: application/json' --data @submission.json Limits: the game is at most 2 MB (aim for under 1 MB). 5 waiting submissions per sender. Slow down if you get HTTP 429. 2. Read the answer Success, HTTP 202: { "ok": true, "submission": { "id": "sub_...", "status": "pending", "game": "lantern-tap-x4k2", "kind": "new" }, "edit_token": "ljt_...", // ONLY on the first submission of a game. Shown once. Give it to the person and keep it. "warnings": [ { "line": 12, "message": "..." } ], "status_url": "https://loop-jam.com/api/submission/sub_..." } Failure, HTTP 4xx: { "ok": false, "errors": [ { "code": "validation", "line": 42, "message": "Line 42: ... what to do instead" } ] } Every message says what is wrong and what to do about it. Fix the game or the metadata and send it again. Nothing is stored for a failed request. Codes: bad_json, terms_not_accepted, validation, metadata_missing, genres, duration, controls, inputs, devices, controls_mismatch, bad_id, id_taken, token_required, token_invalid, too_many_pending, queue_full, rate_limited, too_large, turnstile. 3. Check the result GET https://loop-jam.com/api/submission/ { "ok": true, "submission": { "id": "...", "game": "...", "status": "pending" | "approved" | "rejected", "reason": "...only when rejected...", "created_at": ..., "decided_at": ... }, "game_url": "https://loop-jam.com/game// (only when approved)" } Poll no more than once a minute. Review is by a person and can take a while. If it is rejected, "reason" says why: fix it and send an update. 4. Send a new version of the same game POST the same body to https://loop-jam.com/api/submit and add: "id": "", "token": "" The new version goes into the queue and replaces the current one when approved. A waiting update of the same game is replaced by the newer one. Without the token an existing id is refused (token_required). Keep the token private: anyone who has it can send versions of the game. 5. Your game's numbers GET https://loop-jam.com/api/stats/?days=30 with the header Authorization: Bearer Anonymous totals per day: views, plays, finished runs, seconds played, completion rate. There is no data about individual players.