Publish the original game through media and platform links in one operation. A preview only if representative, sandbox-tested and better than the original. Safe retries never expose credentials. One-operation flow for the original game: complete media, platform links, per-platform prices/model, description and pacts. New html/files additionally require preview_review: representative:true, sandbox_tested:true, preferable_to_direct_link:true and reason (20–600 characters). Do not recreate or strip the game; prefer direct access unless a genuinely representative preview is more useful and within authorized scope. Existing api_key OR studio{name,contact}; human_approved:true for already authorized listing/terms; idempotency_key (16–120 characters). Retry the same token/payload; no duplicate and no replayed credentials. Success is curator submission, not automatic listing.
View input schema
{
"type": "object",
"properties": {
"api_key": {
"type": "string",
"description": "Studio API key. Only needed when the connection does not send Authorization: Bearer <key> (for example in the session that created the studio): then pass it on every call."
},
"studio": {
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 60
},
"contact": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"bio": {
"type": "string",
"maxLength": 400
}
},
"required": [
"name",
"contact"
],
"additionalProperties": false
},
"title": {
"type": "string",
"minLength": 1,
"maxLength": 60
},
"tagline": {
"type": "string",
"maxLength": 120,
"description": "One line that bites (8-120 chars)"
},
"description": {
"type": "string",
"maxLength": 4000,
"description": "What the game is, its audience and what influencers can show (60-4000 chars)"
},
"genre": {
"type": "string",
"enum": [
"arcade",
"action",
"puzzle",
"roguelike",
"platformer",
"cozy",
"strategy",
"rhythm",
"horror",
"weird"
]
},
"stage": {
"type": "string",
"enum": [
"napkin",
"prototype",
"vertical-slice",
"alpha",
"beta",
"released"
],
"description": "Optional. Omitted means not specified on a metadata-only listing; legacy playable submissions default to prototype"
},
"tags": {
"type": "array",
"items": {
"type": "string",
"maxLength": 40
},
"maxItems": 8
},
"controls": {
"type": "string",
"maxLength": 200,
"description": "One line, e.g. \"Arrows or drag\""
},
"dev_note": {
"type": "string",
"maxLength": 600,
"description": "A personal note from the dev to influencers"
},
"store_url": {
"anyOf": [
{
"type": "string",
"maxLength": 300
},
{
"type": "null"
}
],
"description": "Optional https link to where the game already sells (Steam, itch.io, your site). Revenue from every store counts in a pact window. Pass \"\" or null to remove it."
},
"media": {
"type": "array",
"items": {
"type": "object",
"properties": {
"type": {
"type": "string",
"enum": [
"image",
"video"
]
},
"url": {
"type": "string",
"maxLength": 1000,
"description": "Public HTTPS screenshot, gameplay or trailer URL; validated without fetching it"
},
"alt": {
"type": "string",
"maxLength": 200
}
},
"required": [
"type",
"url"
],
"additionalProperties": false
},
"maxItems": 12,
"description": "Screenshots, gameplay and trailers. At least one when no optional playable version is supplied"
},
"platforms": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 60
},
"url": {
"type": "string",
"maxLength": 1000,
"description": "Public HTTPS game/store URL"
},
"price": {
"type": "number",
"minimum": 0,
"description": "This platform's purchase price. Omit an unknown price; zero means explicitly zero, never an assumed free game"
},
"currency": {
"type": "string",
"pattern": "^[A-Z]{3}$",
"description": "Uppercase currency code, e.g. EUR or USD; required for a positive price"
},
"monetization": {
"type": "string",
"enum": [
"paid",
"free",
"free_to_play",
"subscription",
"other"
]
},
"note": {
"type": "string",
"maxLength": 400,
"description": "Price conditions, subscription period or optional purchase details"
},
"type": {
"type": "string",
"enum": [
"store",
"web_portal",
"app_store",
"console",
"own_site",
"ad_network",
"other"
],
"description": "What kind of platform it is. Leave it out to have it read from the name and URL (unknown: other)"
}
},
"required": [
"name",
"url"
],
"additionalProperties": false
},
"maxItems": 12,
"description": "Where to access/buy the actual game, each with its own price/model. At least one without a build"
},
"monetization": {
"type": "string",
"maxLength": 600,
"description": "Explain how the game earns revenue across platforms; do not guess an unknown price"
},
"pacts": {
"type": "array",
"items": {
"type": "object",
"properties": {
"action": {
"type": "string",
"enum": [
"livestream",
"video",
"short",
"post",
"playtest"
],
"description": "What the influencer (a streamer, YouTuber or TikToker) does: livestream, video, short, post or playtest"
},
"share_pct": {
"type": "number",
"exclusiveMinimum": 0,
"maximum": 50,
"description": "Percent of the game's net revenue from every store, for 4 weeks from the earliest date in the influencer's approved action plan. In percent: 10 means 10%. Above 0, at most 50. The window length is fixed."
},
"requirement": {
"type": "string",
"maxLength": 400,
"description": "Concrete requirement, e.g. \"60+ min live, game title in stream title\". Left out, a generic one for the action is used."
},
"min_audience": {
"type": "integer",
"minimum": 0,
"description": "Optional follower floor. Followers are self-reported; pitches below it are flagged (below_min_audience), not blocked."
}
},
"required": [
"action",
"share_pct"
],
"additionalProperties": false
},
"minItems": 1
},
"html": {
"type": "string",
"description": "Original game links are the default. Add optional self-contained html only with preview_review declaring representative, sandbox-tested and preferable to direct access; max 8 MB"
},
"files": {
"type": "array",
"items": {
"type": "object",
"properties": {
"path": {
"type": "string",
"description": "Relative path, e.g. index.html or assets/sprite.png"
},
"content": {
"type": "string"
},
"encoding": {
"type": "string",
"enum": [
"utf8",
"base64"
]
}
},
"required": [
"path",
"content"
],
"additionalProperties": false
},
"description": "Optional justified playable preview instead of html; needs index.html and preview_review. Do not adapt an online game just to host a preview"
},
"preview_review": {
"type": "object",
"properties": {
"representative": {
"type": "boolean",
"description": "Must be true: this is representative of the actual game; it does not lose online/community, account, shop or ranking features"
},
"sandbox_tested": {
"type": "boolean",
"description": "Must be true only after playing this exact build successfully in the allow-scripts sandbox"
},
"preferable_to_direct_link": {
"type": "boolean",
"description": "Must be true only if influencers benefit more than by opening the original game link"
},
"reason": {
"type": "string",
"maxLength": 600,
"description": "Explain that choice in 20–600 characters. It must be within the owner's authorized scope"
}
},
"additionalProperties": false,
"description": "Required for new html/files sent by an agent; all three flags must be true with an explicit reason. A declaration, not certification by static checks"
},
"agent": {
"type": "string",
"maxLength": 60,
"description": "Which agent is calling, e.g. \"claude-code\" or \"codex\""
},
"idempotency_key": {
"type": "string",
"pattern": "^[A-Za-z0-9._:-]{16,120}$",
"description": "Fresh random value per new game; keep it unchanged with the complete payload for retries"
},
"human_approved": {
"type": "boolean",
"description": "True only when the owner authorized this listing, any registration and every pact. Existing authorization is sufficient"
}
},
"required": [
"title",
"tagline",
"description",
"genre",
"pacts",
"idempotency_key"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}