{"openapi":"3.1.0","info":{"title":"Depot API","version":"0.3.0","description":"Control plane for Depot game distribution. Game bytes never pass through this API in staging or production: uploads and restricted downloads use short-lived presigned R2 URLs, public downloads use the CDN."},"servers":[{"url":"https://api.staging.depot.games"},{"url":"http://127.0.0.1:8787"}],"security":[{"bearer":[]}],"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","description":"OIDC access token from Depot's identity service (people), organization API key `dpk_…` (CI, integrations, agents), download grant `dpg_…`, download session `dps_…`, or the platform bootstrap secret (assigning M2-era games only). Never in URLs."}},"schemas":{"Problem":{"type":"object","required":["type","title","status","detail"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"request_id":{"type":"string"}}},"Descriptor":{"type":"object","description":"Signed with Ed25519 over `DEPOT-RELEASE-v1\\0` + RFC 8785 canonical JSON of this object.","required":["schema","game_id","platform","release_name","sequence","package","protection","manifest","index","packs","created_at"],"properties":{"schema":{"const":"depot.release/v1"},"game_id":{"type":"string"},"platform":{"type":"string"},"release_name":{"type":"string"},"sequence":{"type":"integer","minimum":1},"package":{"type":"string"},"protection":{"type":"object","required":["mode","domain_id","key_version","key_check"],"properties":{"mode":{"enum":["none","aes-256-gcm"]},"domain_id":{"type":"string"},"key_version":{"type":"integer"},"key_check":{"type":["string","null"]}}},"manifest":{"$ref":"#/components/schemas/ObjectRef"},"index":{"$ref":"#/components/schemas/ObjectRef"},"packs":{"type":"array","items":{"$ref":"#/components/schemas/ObjectRef"}},"created_at":{"type":"string"}}},"Organization":{"type":"object","required":["id","name","slug","created_at"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"slug":{"type":"string"},"created_at":{"type":"string","format":"date-time"}}},"Membership":{"description":"An organization with the caller's role and resolved permissions in it.","allOf":[{"$ref":"#/components/schemas/Organization"},{"type":"object","required":["role","permissions"],"properties":{"role":{"type":"string"},"permissions":{"type":"object","additionalProperties":{"type":"array","items":{"type":"string"}},"description":"resource → actions, e.g. {\"release\": [\"publish\"]}"}}}]},"OrganizationContext":{"description":"The organization as the calling principal sees it (a member, or an API key with role null).","allOf":[{"$ref":"#/components/schemas/Organization"},{"type":"object","required":["role","principal","permissions"],"properties":{"role":{"type":["string","null"]},"principal":{"type":"object","required":["kind","id"],"properties":{"kind":{"enum":["user","api_key"]},"id":{"type":["string","null"]}}},"permissions":{"type":"object","additionalProperties":{"type":"array","items":{"type":"string"}},"description":"resource → actions, e.g. {\"release\": [\"publish\"]}"}}}]},"Me":{"type":"object","required":["identity_id","issuer","subject","tenant_scope","display_name","handle","memberships"],"properties":{"identity_id":{"type":"string"},"issuer":{"type":"string"},"subject":{"type":"string"},"tenant_scope":{"type":["string","null"]},"display_name":{"type":["string","null"]},"handle":{"type":["string","null"],"description":"the public @handle, or null until chosen"},"memberships":{"type":"array","items":{"type":"object","required":["organization_id","slug","name","role"],"properties":{"organization_id":{"type":"string"},"slug":{"type":"string"},"name":{"type":"string"},"role":{"type":"string"}}}}}},"Member":{"type":"object","required":["user_id","display_name","handle","role","joined_at"],"properties":{"user_id":{"type":"string"},"display_name":{"type":"string"},"handle":{"type":["string","null"]},"email":{"type":"string","description":"only for callers who can manage members"},"role":{"enum":["owner","admin","publisher","member"]},"joined_at":{"type":"string","format":"date-time"}}},"Invitation":{"type":"object","required":["id","email","role","status","expires_at","inviter_id"],"properties":{"id":{"type":"string"},"email":{"type":"string"},"role":{"enum":["owner","admin","publisher","member"]},"status":{"type":"string"},"expires_at":{"type":"string","format":"date-time"},"inviter_id":{"type":"string"}}},"Storefront":{"type":"object","required":["slug","display_name","bio","links","support_url","logo","banner","revision"],"properties":{"slug":{"type":"string"},"display_name":{"type":"string"},"bio":{"type":["string","null"]},"links":{"type":"array","items":{"type":"object","required":["label","url"],"properties":{"label":{"type":"string"},"url":{"type":"string"}}}},"support_url":{"type":["string","null"]},"url":{"type":["string","null"],"description":"the studio's public page (shown once it has a public game page)"},"vanity_url":{"type":["string","null"],"description":"the studio's own address, https://<slug>.depot.games: its storefront at / and its games at /<game> (null when the slug is a reserved name)"},"logo":{"oneOf":[{"type":"object","required":["url","width","height"],"properties":{"url":{"type":"string"},"width":{"type":"integer"},"height":{"type":"integer"}}},{"type":"null"}]},"banner":{"oneOf":[{"type":"object","required":["url","width","height"],"properties":{"url":{"type":"string"},"width":{"type":"integer"},"height":{"type":"integer"}}},{"type":"null"}]},"revision":{"type":"integer"},"updated_at":{"type":"string"}}},"PageContent":{"type":"object","required":["tagline","short_description","description","screenshots","gallery","hero_video","theme","accessibility","trailer","tags","content_warnings","status","requirements","support_url","access","channel"],"properties":{"tagline":{"type":["string","null"],"maxLength":120},"short_description":{"type":["string","null"],"maxLength":200,"description":"used in link previews"},"description":{"type":["string","null"],"maxLength":8000},"screenshots":{"type":"array","items":{"type":"object","required":["id","url","width","height"],"properties":{"id":{"type":"string"},"url":{"type":"string"},"width":{"type":"integer"},"height":{"type":"integer"}}}},"gallery":{"type":"array","description":"screenshots (shot_…) and videos (vid_…) in display order; resolve ids through GamePage.media","items":{"$ref":"#/components/schemas/GalleryEntry"}},"hero_video":{"type":["string","null"],"description":"an uploaded loop (vid_…) that plays muted over the hero"},"theme":{"$ref":"#/components/schemas/PageTheme"},"accessibility":{"type":"array","items":{"type":"string"}},"trailer":{"oneOf":[{"type":"object","required":["provider","id"],"properties":{"provider":{"enum":["youtube","vimeo","depot"]},"id":{"type":"string","description":"YouTube/Vimeo id, or an uploaded video id (vid_…)"}}},{"type":"null"}]},"tags":{"type":"array","items":{"type":"string"}},"content_warnings":{"type":"array","items":{"type":"string"}},"status":{"enum":["alpha","beta","early-access","released"]},"requirements":{"type":"object","additionalProperties":{"type":"object","required":["minimum"],"properties":{"minimum":{"type":["string","null"]}}}},"support_url":{"type":["string","null"]},"access":{"enum":["free","key","invite"],"description":"free: claimable; key: redeem a key; invite: grants only"},"channel":{"type":"string","description":"channel players install from"}}},"GalleryEntry":{"type":"object","required":["id","caption"],"properties":{"id":{"type":"string"},"caption":{"type":["string","null"],"maxLength":140}}},"PageTheme":{"oneOf":[{"type":"object","required":["accent"],"properties":{"accent":{"type":"string","pattern":"^#[0-9a-f]{6}$","description":"the studio's colour; Depot adjusts its lightness for contrast"}}},{"type":"null"}]},"Video":{"type":"object","required":["id","purpose","status","url","bytes","duration_ms","width","height","poster"],"properties":{"id":{"type":"string"},"purpose":{"enum":["loop","trailer","clip"]},"status":{"enum":["uploading","ready"]},"url":{"type":"string"},"bytes":{"type":"integer"},"duration_ms":{"type":["integer","null"]},"width":{"type":["integer","null"]},"height":{"type":["integer","null"]},"poster":{"oneOf":[{"type":"object","required":["url","width","height"],"properties":{"url":{"type":"string"},"width":{"type":"integer"},"height":{"type":"integer"}}},{"type":"null"}]}}},"MediaItem":{"oneOf":[{"type":"object","required":["type","url","width","height"],"properties":{"type":{"const":"image"},"url":{"type":"string"},"width":{"type":"integer"},"height":{"type":"integer"}}},{"allOf":[{"type":"object","required":["type"],"properties":{"type":{"const":"video"}}},{"$ref":"#/components/schemas/Video"}]}]},"PageDraftPatch":{"type":"object","properties":{"tagline":{"type":["string","null"]},"short_description":{"type":["string","null"]},"description":{"type":["string","null"]},"screenshots":{"type":"array","maxItems":12,"items":{"type":"string"},"description":"screenshot ids, in order (older clients; prefer gallery)"},"gallery":{"type":"array","maxItems":20,"items":{"$ref":"#/components/schemas/GalleryEntry"},"description":"screenshots and videos, in order, with captions"},"hero_video":{"type":["string","null"],"description":"an uploaded loop's id"},"theme":{"$ref":"#/components/schemas/PageTheme"},"accessibility":{"type":"array","maxItems":10,"items":{"type":"string","maxLength":60}},"trailer":{"oneOf":[{"type":"object","required":["provider","id"],"properties":{"provider":{"enum":["youtube","vimeo","depot"]},"id":{"type":"string","description":"YouTube/Vimeo id, or an uploaded video id (vid_…)"}}},{"type":"null"}]},"tags":{"type":"array","maxItems":10,"items":{"type":"string"}},"content_warnings":{"type":"array","maxItems":10,"items":{"type":"string"}},"status":{"enum":["alpha","beta","early-access","released"]},"requirements":{"type":["object","null"],"additionalProperties":{"type":"object","properties":{"minimum":{"type":["string","null"]}}}},"support_url":{"type":["string","null"]},"access":{"enum":["free","key","invite"]},"channel":{"type":"string"},"expected_revision":{"type":["integer","null"]}}},"GamePage":{"type":"object","required":["game_id","visibility","disabled_reason","url","draft","published","media","has_unpublished_changes","revision","published_at","updated_at"],"properties":{"game_id":{"type":"string"},"visibility":{"enum":["draft","unlisted","public","disabled"]},"disabled_reason":{"type":["string","null"],"description":"why Depot disabled the page"},"url":{"type":["string","null"],"description":"the page's public URL"},"draft":{"$ref":"#/components/schemas/PageContent"},"published":{"oneOf":[{"$ref":"#/components/schemas/PageContent"},{"type":"null"}]},"media":{"type":"object","description":"every screenshot and video id the draft or published page uses","additionalProperties":{"$ref":"#/components/schemas/MediaItem"}},"has_unpublished_changes":{"type":"boolean"},"revision":{"type":"integer"},"published_at":{"type":["string","null"]},"published_by":{"type":["string","null"]},"updated_at":{"type":"string"}}},"PublicStudio":{"type":"object","required":["slug","display_name","bio","links","support_url","logo","banner","games"],"properties":{"slug":{"type":"string"},"display_name":{"type":"string"},"bio":{"type":["string","null"]},"links":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string"},"url":{"type":"string"}}}},"support_url":{"type":["string","null"]},"logo":{"type":["object","null"]},"banner":{"type":["object","null"]},"games":{"type":"array","items":{"type":"object","required":["slug","name","tagline","status","cover_url","icon_url","hero_url"],"properties":{"slug":{"type":"string"},"name":{"type":"string"},"tagline":{"type":["string","null"]},"status":{"type":"string"},"cover_url":{"type":["string","null"]},"icon_url":{"type":["string","null"]},"hero_url":{"type":["string","null"]}}}}}},"PublicGamePage":{"type":"object","required":["studio","game","page","access","available_platforms","facts","updates","install"],"properties":{"studio":{"type":"object","required":["slug","display_name"],"properties":{"slug":{"type":"string"},"display_name":{"type":"string"}}},"game":{"type":"object","required":["id","slug","name","platforms","art"],"properties":{"id":{"type":"string"},"slug":{"type":"string"},"name":{"type":"string"},"platforms":{"type":"array","items":{"type":"string"}},"art":{"type":"object"}}},"page":{"type":"object","description":"published content (PageContent without access/channel; screenshots, gallery, hero_video and an uploaded trailer resolved to urls with posters) plus visibility and published_at"},"access":{"enum":["free","key","invite"]},"available_platforms":{"type":"array","items":{"type":"string"},"description":"platforms with a build on the page's channel"},"facts":{"type":"object","required":["download_bytes"],"properties":{"download_bytes":{"type":["integer","null"],"description":"download size of the build the page installs (the largest platform)"}}},"updates":{"type":"array","description":"the studio's releases on the page's channel, newest first (at most 5; rollbacks left out)","items":{"type":"object","required":["version","at","note"],"properties":{"version":{"type":"string"},"at":{"type":"string"},"note":{"type":["string","null"]}}}},"install":{"type":"object","required":["channel","deep_link"],"properties":{"channel":{"type":"string"},"deep_link":{"type":"string","description":"depot://game/{id}?v=1&channel={name}"}}}}},"Package":{"type":"object","required":["id","game_id","name","kind","title","enabled","free_claim","includes","created_at"],"properties":{"id":{"type":"string"},"game_id":{"type":"string"},"name":{"type":"string","description":"what games check (e.g. base, expansion-1)"},"kind":{"enum":["base","dlc","bundle","test"]},"title":{"type":"string"},"enabled":{"type":"boolean"},"free_claim":{"type":"boolean"},"includes":{"type":"array","items":{"type":"string"},"description":"package names a bundle includes"},"created_at":{"type":"string","format":"date-time"}}},"KeyBatch":{"type":"object","required":["id","package_id","quantity","status","created_at","available","redeemed","revoked"],"properties":{"id":{"type":"string"},"package_id":{"type":"string"},"quantity":{"type":"integer"},"hmac_key_version":{"type":"integer"},"label":{"type":["string","null"]},"expires_at":{"type":["string","null"],"format":"date-time"},"delegation_id":{"type":["string","null"]},"status":{"enum":["active","revoked"]},"created_by":{"type":["string","null"]},"created_at":{"type":"string","format":"date-time"},"revoked_at":{"type":["string","null"],"format":"date-time"},"revoke_reason":{"type":["string","null"]},"available":{"type":"integer"},"redeemed":{"type":"integer"},"revoked":{"type":"integer"}}},"KeyBatchIssued":{"type":"object","required":["id","package_id","quantity","status"],"properties":{"id":{"type":"string"},"package_id":{"type":"string"},"quantity":{"type":"integer"},"hmac_key_version":{"type":"integer"},"label":{"type":["string","null"]},"expires_at":{"type":["string","null"]},"status":{"type":"string"},"codes":{"type":"array","items":{"type":"string"},"description":"the redemption codes: in the first response only, never stored in plaintext"},"codes_delivered":{"type":"boolean","description":"true on a retry: the codes went out in the first response"}}},"Entitlement":{"type":"object","required":["id","package_id","user_id","source","status","starts_at","ends_at","created_at"],"properties":{"id":{"type":"string"},"package_id":{"type":"string"},"user_id":{"type":"string"},"user":{"oneOf":[{"type":"object","required":["display_name","handle"],"properties":{"display_name":{"type":"string"},"handle":{"type":["string","null"]}}},{"type":"null"}]},"source":{"enum":["publisher_grant","redeemed_key","free_claim","test_access","purchase"],"description":"how the player got it; revoking one never touches access from another source"},"source_ref":{"type":["string","null"]},"status":{"enum":["active","expired","revoked"]},"starts_at":{"type":"string","format":"date-time"},"ends_at":{"type":["string","null"],"format":"date-time"},"created_by":{"type":["string","null"]},"created_at":{"type":"string","format":"date-time"},"revoked_at":{"type":["string","null"],"format":"date-time"},"revoke_reason":{"type":["string","null"]},"already_owned":{"type":"boolean"}}},"ApiKey":{"type":"object","required":["id","name","start","permissions","enabled","expires_at","created_at","last_used_at"],"properties":{"id":{"type":"string"},"name":{"type":["string","null"]},"start":{"type":["string","null"],"description":"the first characters of the key, to recognise it"},"permissions":{"type":"object","additionalProperties":{"type":"array","items":{"type":"string"}},"description":"resource → actions, e.g. {\"release\": [\"publish\"]}"},"enabled":{"type":"boolean"},"expires_at":{"type":["string","null"],"format":"date-time"},"created_at":{"type":"string","format":"date-time"},"last_used_at":{"type":["string","null"],"format":"date-time"},"created_by":{"type":["string","null"]}}},"ApiKeyWithSecret":{"allOf":[{"$ref":"#/components/schemas/ApiKey"},{"type":"object","required":["key"],"properties":{"key":{"type":"string","description":"the secret: in this response only"}}}]},"AuditEvent":{"type":"object","required":["id","actor_id","actor_kind","action","target_id","event","created_at"],"properties":{"id":{"type":"string"},"actor_id":{"type":"string"},"actor_kind":{"type":["string","null"]},"action":{"type":"string"},"target_id":{"type":["string","null"]},"event":{"type":"object","additionalProperties":true},"created_at":{"type":"string","format":"date-time"}}},"Usage":{"type":"object","required":["computed_at","totals","games"],"properties":{"computed_at":{"type":"string","format":"date-time"},"totals":{"type":"object","required":["games","releases","stored_bytes","logical_bytes","art_bytes","active_entitlements","keys_issued","keys_redeemed"],"properties":{"games":{"type":"integer"},"releases":{"type":"integer"},"stored_bytes":{"type":"integer"},"logical_bytes":{"type":"integer"},"art_bytes":{"type":"integer"},"active_entitlements":{"type":"integer"},"keys_issued":{"type":"integer"},"keys_redeemed":{"type":"integer"}}},"games":{"type":"array","items":{"type":"object","required":["id","slug","name","releases","stored_bytes","logical_bytes","art_bytes"],"properties":{"id":{"type":"string"},"slug":{"type":"string"},"name":{"type":"string"},"releases":{"type":"integer"},"stored_bytes":{"type":"integer"},"logical_bytes":{"type":"integer"},"art_bytes":{"type":"integer"}}}}}},"Release":{"type":"object","required":["release_id","platform","release_name","sequence","status","package","protection","pack_count","bytes","created_at"],"properties":{"release_id":{"type":"string"},"platform":{"type":"string"},"release_name":{"type":"string"},"sequence":{"type":"integer"},"status":{"enum":["reserved","uploading","verifying","published","failed","aborted"]},"protection_domain_id":{"type":"string"},"package":{"type":"string"},"protection":{"enum":["none","aes-256-gcm"]},"descriptor_hash":{"type":["string","null"]},"manifest_hash":{"type":["string","null"]},"signing_key_id":{"type":["string","null"]},"created_by":{"type":["string","null"],"description":"user:<id> or key:<id>; null for releases before M6"},"pack_count":{"type":"integer"},"bytes":{"type":"integer","description":"stored size of the release's packs (shared packs count in every release that uses them)"},"created_at":{"type":"string","format":"date-time"},"published_at":{"type":["string","null"],"format":"date-time"}}},"Channel":{"type":"object","required":["platform","channel","revision","updated_at","release_id","release_name","sequence"],"properties":{"platform":{"type":"string"},"channel":{"type":"string"},"revision":{"type":"integer"},"updated_at":{"type":"string","format":"date-time"},"release_id":{"type":"string"},"release_name":{"type":"string"},"sequence":{"type":"integer"}}},"ChannelMove":{"type":"object","required":["revision","release_id","release_name","sequence","from_release_id","rollback","note","actor_id","created_at"],"properties":{"revision":{"type":"integer"},"release_id":{"type":"string"},"release_name":{"type":"string"},"sequence":{"type":"integer"},"from_release_id":{"type":["string","null"]},"from_release_name":{"type":["string","null"]},"from_sequence":{"type":["integer","null"]},"rollback":{"type":"boolean"},"note":{"type":["string","null"]},"actor_id":{"type":"string"},"actor_kind":{"type":["string","null"]},"created_at":{"type":"string","format":"date-time"}}},"Art":{"type":"object","required":["url","content_type","width","height","bytes"],"properties":{"url":{"type":"string","format":"uri"},"content_type":{"enum":["image/png","image/jpeg","image/webp"]},"width":{"type":"integer"},"height":{"type":"integer"},"bytes":{"type":"integer"}}},"Game":{"type":"object","required":["id","slug","name","description","visibility","listed","platforms","build_platforms","status","revision","art","page","readiness","created_at","updated_at"],"properties":{"id":{"type":"string"},"slug":{"type":"string"},"name":{"type":"string"},"description":{"type":["string","null"]},"visibility":{"enum":["public","restricted"],"description":"restricted for every new game (encrypted builds); public only for older unencrypted games"},"listed":{"type":"integer","enum":[0,1],"description":"1 when the studio chose to list it in the launcher catalog (shown while the store page is public and free or key only)"},"build_platforms":{"type":"array","items":{"type":"string"},"description":"Platforms players can install now: a channel serves a release for them (derived from builds; `platforms` are the studio's announced ones)"},"page":{"type":["object","null"],"description":"The store page's state: null until a page is written. `access` is who can get the game now (the published page); null until first published.","required":["visibility","access"],"properties":{"visibility":{"enum":["draft","unlisted","public","disabled"]},"access":{"enum":["free","key","invite",null]}}},"readiness":{"type":"object","description":"Can a player get the game right now: the page is published, its channel serves a release, and an enabled base package exists to grant. `blockers` (in fix order) say why not: archived, no_build_on_channel, no_base_package, no_page, page_unpublished, page_disabled.","required":["installable","channel","blockers"],"properties":{"installable":{"type":"boolean"},"channel":{"type":"string","description":"the channel players install from (the published page's, else the draft's)"},"blockers":{"type":"array","items":{"enum":["archived","no_build_on_channel","no_base_package","no_page","page_unpublished","page_disabled"]}}}},"platforms":{"type":"array","items":{"type":"string"},"description":"platforms the publisher says the game supports (release platform names)"},"status":{"enum":["active","archived"]},"revision":{"type":"integer","description":"increments on every edit; pass as expected_revision"},"art":{"type":"object","required":["icon","cover","hero","logo"],"properties":{"icon":{"oneOf":[{"$ref":"#/components/schemas/Art"},{"type":"null"}]},"cover":{"oneOf":[{"$ref":"#/components/schemas/Art"},{"type":"null"}]},"hero":{"oneOf":[{"$ref":"#/components/schemas/Art"},{"type":"null"}]},"logo":{"oneOf":[{"$ref":"#/components/schemas/Art"},{"type":"null"}]}}},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}}},"ObjectRef":{"type":"object","required":["hash","size"],"properties":{"hash":{"type":"string","pattern":"^[0-9a-f]{64}$"},"size":{"type":"integer","minimum":0}}},"Signature":{"type":"object","required":["key_id","algorithm","value"],"properties":{"key_id":{"type":"string"},"algorithm":{"const":"ed25519"},"value":{"type":"string","contentEncoding":"base64"}}}}},"paths":{"/v1/whoami":{"get":{"summary":"Describe the calling credential: an API key (organization, permissions) or a person (identity, organizations)","responses":{"200":{"description":"Principal","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/organizations":{"get":{"summary":"Organizations I belong to, with my role and permissions","responses":{"200":{"description":"Organizations","content":{"application/json":{"schema":{"type":"object","required":["organizations","next_cursor"],"properties":{"organizations":{"type":"array","items":{"$ref":"#/components/schemas/Membership"}},"next_cursor":{"type":["string","null"]}}}}}},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"summary":"Create an organization (a publisher); you become its owner","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","pattern":"^[A-Za-z0-9._:-]{8,128}$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name","slug"],"properties":{"name":{"type":"string"},"slug":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,46}[a-z0-9]$"}}}}}},"responses":{"201":{"description":"Organization","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Membership"}}}},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/organizations/{org}":{"get":{"parameters":[{"name":"org","in":"path","required":true,"schema":{"type":"string"}}],"summary":"The organization, and the caller's role and permissions in it (member or API key)","responses":{"200":{"description":"Organization","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationContext"}}}},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"patch":{"parameters":[{"name":"org","in":"path","required":true,"schema":{"type":"string"}}],"summary":"Rename (organization:update; people only)","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"}}}}}},"responses":{"200":{"description":"Organization","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Organization"}}}},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/organizations/{org}/games":{"get":{"parameters":[{"name":"org","in":"path","required":true,"schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":200}},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"next_cursor from the previous page"},{"name":"status","in":"query","required":false,"schema":{"enum":["all","active","archived"],"default":"all"}}],"summary":"The organization's games (game:read)","responses":{"200":{"description":"Games page","content":{"application/json":{"schema":{"type":"object","required":["games","next_cursor"],"properties":{"games":{"type":"array","items":{"$ref":"#/components/schemas/Game"}},"next_cursor":{"type":["string","null"]}}}}}},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"summary":"Create a game","parameters":[{"name":"org","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","pattern":"^[A-Za-z0-9._:-]{8,128}$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["slug","name"],"properties":{"slug":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,63}$"},"name":{"type":"string","maxLength":200},"visibility":{"enum":["restricted"],"default":"restricted","description":"Every game is restricted: builds are encrypted. Who can get it (free claim, key only, invite only) is the store page's `access`. Unencrypted public games exist only as test fixtures outside production."}}}}}},"responses":{"201":{"description":"Game","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Game"}}}},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"description":"Requires `game:create` in the organization."}},"/v1/organizations/{org}/games/{id}":{"get":{"parameters":[{"name":"org","in":"path","required":true,"schema":{"type":"string"}},{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^game_[0-9a-f]{32}$"}}],"summary":"One game (game:read)","responses":{"200":{"description":"Game","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Game"}}}},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"patch":{"parameters":[{"name":"org","in":"path","required":true,"schema":{"type":"string"}},{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^game_[0-9a-f]{32}$"}}],"summary":"Edit a game (game:update): name, description, catalog listing (public, active games only), supported platforms, or archive (status). Archived games keep working for players who own them but take no new releases, keys, grants or free claims, and leave the catalog. Pass expected_revision to refuse stale edits (409).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","maxLength":200},"description":{"type":["string","null"],"maxLength":2000},"listed":{"type":"boolean","description":"Also list the game in the Depot launcher's catalog. It shows there only while its store page is public and free (claimable) or key only."},"platforms":{"type":"array","maxItems":16,"items":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{0,31}$"},"example":["windows-x64","macos-arm64"]},"status":{"enum":["active","archived"]},"expected_revision":{"type":["integer","null"],"minimum":1}}}}}},"responses":{"200":{"description":"Game","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Game"}}}},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/organizations/{org}/storefront":{"get":{"parameters":[{"name":"org","in":"path","required":true,"schema":{"type":"string"}}],"summary":"The studio's public storefront profile (game:read). Created on first use from the organization's name and slug.","responses":{"200":{"description":"Storefront","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Storefront"}}}},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"patch":{"parameters":[{"name":"org","in":"path","required":true,"schema":{"type":"string"}}],"summary":"Edit the storefront profile (organization:update): display name, bio, up to 5 https links, support URL. Optional expected_revision.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"display_name":{"type":"string","maxLength":60},"bio":{"type":["string","null"],"maxLength":600},"links":{"type":"array","maxItems":5,"items":{"type":"object","required":["url"],"properties":{"label":{"type":"string","maxLength":30},"url":{"type":"string","format":"uri"}}}},"support_url":{"type":["string","null"],"format":"uri"},"expected_revision":{"type":["integer","null"]}}}}}},"responses":{"200":{"description":"Storefront","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Storefront"}}}},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/organizations/{org}/storefront/art/{kind}":{"put":{"parameters":[{"name":"org","in":"path","required":true,"schema":{"type":"string"}},{"name":"kind","in":"path","required":true,"schema":{"enum":["logo","banner"]}}],"summary":"Upload the studio logo (square, 128–1024 px, ≤1 MB) or banner (1200–3840 px wide, 2.5:1–6:1, ≤4 MB); organization:update. PNG, JPEG or WebP body.","requestBody":{"required":true,"content":{"image/png":{"schema":{"type":"string","format":"binary"}},"image/jpeg":{"schema":{"type":"string","format":"binary"}},"image/webp":{"schema":{"type":"string","format":"binary"}}}},"responses":{"200":{"description":"Stored","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"413":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"415":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"delete":{"parameters":[{"name":"org","in":"path","required":true,"schema":{"type":"string"}},{"name":"kind","in":"path","required":true,"schema":{"enum":["logo","banner"]}}],"summary":"Remove the logo or banner (organization:update)","responses":{"204":{"description":"Removed"},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/organizations/{org}/games/{id}/page":{"get":{"parameters":[{"name":"org","in":"path","required":true,"schema":{"type":"string"}},{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^game_[0-9a-f]{32}$"}}],"summary":"The game's public page: draft, published snapshot, visibility and public URL (game:read)","responses":{"200":{"description":"Game page","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GamePage"}}}},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"patch":{"parameters":[{"name":"org","in":"path","required":true,"schema":{"type":"string"}},{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^game_[0-9a-f]{32}$"}}],"summary":"Edit the page draft (game:update). Plain text only (the description supports paragraphs, '- ' lists, **bold** and https links, all escaped). Trailers are a YouTube or Vimeo id. Links must be https. Publishing is separate.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageDraftPatch"}}}},"responses":{"200":{"description":"Game page","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GamePage"}}}},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/organizations/{org}/games/{id}/page/publish":{"post":{"parameters":[{"name":"org","in":"path","required":true,"schema":{"type":"string"}},{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^game_[0-9a-f]{32}$"}}],"summary":"Publish the draft (game:update) as public (listed, indexed) or unlisted (link only, noindex). Applies the access setting: free turns on free claims of the base package; key and invite turn them off. Visibility never authorizes downloads.","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"visibility":{"enum":["public","unlisted"],"default":"public"},"expected_revision":{"type":["integer","null"]}}}}}},"responses":{"200":{"description":"Game page","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GamePage"}}}},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/organizations/{org}/games/{id}/page/unpublish":{"post":{"parameters":[{"name":"org","in":"path","required":true,"schema":{"type":"string"}},{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^game_[0-9a-f]{32}$"}}],"summary":"Take the page down (game:update). New free claims stop; players who already own the game keep it, updates included. Nothing is revoked.","responses":{"200":{"description":"Game page","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GamePage"}}}},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/organizations/{org}/games/{id}/page/screenshots":{"post":{"parameters":[{"name":"org","in":"path","required":true,"schema":{"type":"string"}},{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^game_[0-9a-f]{32}$"}}],"summary":"Upload a screenshot (game:update): landscape, 960–3840 px wide, ≤6 MB, PNG/JPEG/WebP body. Add its id to the draft's screenshots to show it.","requestBody":{"required":true,"content":{"image/png":{"schema":{"type":"string","format":"binary"}},"image/jpeg":{"schema":{"type":"string","format":"binary"}},"image/webp":{"schema":{"type":"string","format":"binary"}}}},"responses":{"201":{"description":"Screenshot","content":{"application/json":{"schema":{"type":"object","required":["id","url","width","height"],"properties":{"id":{"type":"string"},"url":{"type":"string"},"width":{"type":"integer"},"height":{"type":"integer"},"bytes":{"type":"integer"}}}}}},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/organizations/{org}/games/{id}/page/screenshots/{shot}":{"delete":{"parameters":[{"name":"org","in":"path","required":true,"schema":{"type":"string"}},{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^game_[0-9a-f]{32}$"}},{"name":"shot","in":"path","required":true,"schema":{"type":"string","pattern":"^shot_[0-9a-f]{32}$"}}],"summary":"Remove a screenshot from the draft (game:update); the published page keeps it until the next publish","responses":{"204":{"description":"Removed"},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/organizations/{org}/games/{id}/page/videos":{"get":{"parameters":[{"name":"org","in":"path","required":true,"schema":{"type":"string"}},{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^game_[0-9a-f]{32}$"}}],"summary":"The game's uploaded videos (game:read)","responses":{"200":{"description":"Videos","content":{"application/json":{"schema":{"type":"object","required":["videos"],"properties":{"videos":{"type":"array","items":{"$ref":"#/components/schemas/Video"}}}}}}},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"parameters":[{"name":"org","in":"path","required":true,"schema":{"type":"string"}},{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^game_[0-9a-f]{32}$"}}],"summary":"Start a video upload (game:update). purpose loop: the muted clip over the hero, MP4 ≤30 s and ≤40 MB. trailer or clip: MP4 ≤10 min and ≤500 MB. PUT the file to put_url with exactly the returned headers, then call complete.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["bytes"],"properties":{"purpose":{"enum":["loop","trailer","clip"]},"bytes":{"type":"integer","minimum":1}}}}}},"responses":{"201":{"description":"Upload","content":{"application/json":{"schema":{"type":"object","required":["id","purpose","put_url","headers","expires_in"],"properties":{"id":{"type":"string"},"purpose":{"type":"string"},"put_url":{"type":"string"},"headers":{"type":"object","additionalProperties":{"type":"string"}},"expires_in":{"type":"integer"}}}}}},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"413":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/organizations/{org}/games/{id}/page/videos/{vid}/complete":{"post":{"parameters":[{"name":"org","in":"path","required":true,"schema":{"type":"string"}},{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^game_[0-9a-f]{32}$"}},{"name":"vid","in":"path","required":true,"schema":{"type":"string","pattern":"^vid_[0-9a-f]{32}$"}}],"summary":"Check an uploaded video (game:update): an MP4 within its purpose's length and size. 422 (and the upload is discarded) otherwise.","responses":{"200":{"description":"Video","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Video"}}}},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/organizations/{org}/games/{id}/page/videos/{vid}/poster":{"put":{"parameters":[{"name":"org","in":"path","required":true,"schema":{"type":"string"}},{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^game_[0-9a-f]{32}$"}},{"name":"vid","in":"path","required":true,"schema":{"type":"string","pattern":"^vid_[0-9a-f]{32}$"}}],"summary":"Set a video's still frame (game:update): PNG, JPEG or WebP 480–3840 px wide, ≤4 MB. Shown before the video plays and instead of it for reduced motion.","requestBody":{"required":true,"content":{"image/png":{"schema":{"type":"string","format":"binary"}},"image/jpeg":{"schema":{"type":"string","format":"binary"}},"image/webp":{"schema":{"type":"string","format":"binary"}}}},"responses":{"200":{"description":"Video","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Video"}}}},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"413":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"415":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/organizations/{org}/games/{id}/page/videos/{vid}":{"delete":{"parameters":[{"name":"org","in":"path","required":true,"schema":{"type":"string"}},{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^game_[0-9a-f]{32}$"}},{"name":"vid","in":"path","required":true,"schema":{"type":"string","pattern":"^vid_[0-9a-f]{32}$"}}],"summary":"Remove a video (game:update): out of the draft now; the published page keeps it until the next publish","responses":{"204":{"description":"Removed"},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/organizations/{org}/games/{id}/art/{kind}":{"put":{"parameters":[{"name":"org","in":"path","required":true,"schema":{"type":"string"}},{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^game_[0-9a-f]{32}$"}},{"name":"kind","in":"path","required":true,"schema":{"enum":["icon","cover","hero","logo"]}}],"summary":"Upload store art (game:update). logo: the game's wordmark shown in place of its name, a transparent PNG or WebP 200–2400 px wide, 1:2 to 8:1, ≤1 MB. The body is the image: PNG, JPEG or WebP (identified from the bytes; SVG refused). icon: square, 128–2048 px, ≤1 MB (512×512 recommended). cover: 2:3 portrait, 300–2400 px wide, ≤4 MB (600×900). hero: about 3:1, 1280–3840 px wide, ≤8 MB (1920×620). Served from the CDN.","requestBody":{"required":true,"content":{"image/png":{"schema":{"type":"string","format":"binary"}},"image/jpeg":{"schema":{"type":"string","format":"binary"}},"image/webp":{"schema":{"type":"string","format":"binary"}}}},"responses":{"200":{"description":"Stored","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Art"},{"type":"object","required":["kind"],"properties":{"kind":{"enum":["icon","cover","hero","logo"]}}}]}}}},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"413":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"415":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"delete":{"parameters":[{"name":"org","in":"path","required":true,"schema":{"type":"string"}},{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^game_[0-9a-f]{32}$"}},{"name":"kind","in":"path","required":true,"schema":{"enum":["icon","cover","hero","logo"]}}],"summary":"Remove store art (game:update)","responses":{"204":{"description":"Removed"},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/organizations/{org}/members":{"get":{"parameters":[{"name":"org","in":"path","required":true,"schema":{"type":"string"}}],"summary":"Members (people only; emails only for member managers)","responses":{"200":{"description":"Members","content":{"application/json":{"schema":{"type":"object","required":["members","next_cursor"],"properties":{"members":{"type":"array","items":{"$ref":"#/components/schemas/Member"}},"next_cursor":{"type":["string","null"]}}}}}},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/organizations/{org}/members/{user}":{"patch":{"parameters":[{"name":"org","in":"path","required":true,"schema":{"type":"string"}},{"name":"user","in":"path","required":true,"schema":{"type":"string"}}],"summary":"Change a member's role (member:update; only owners grant or remove ownership)","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["role"],"properties":{"role":{"enum":["owner","admin","publisher","member"]}}}}}},"responses":{"200":{"description":"Member","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Member"}}}},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"delete":{"parameters":[{"name":"org","in":"path","required":true,"schema":{"type":"string"}},{"name":"user","in":"path","required":true,"schema":{"type":"string"}}],"summary":"Remove a member (member:delete), or leave (your own id). The last owner can't leave.","responses":{"204":{"description":"Removed"},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/organizations/{org}/invitations":{"get":{"parameters":[{"name":"org","in":"path","required":true,"schema":{"type":"string"}}],"summary":"Pending invitations (invitation:create)","responses":{"200":{"description":"Invitations","content":{"application/json":{"schema":{"type":"object","required":["invitations","next_cursor"],"properties":{"invitations":{"type":"array","items":{"$ref":"#/components/schemas/Invitation"}},"next_cursor":{"type":["string","null"]}}}}}},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"parameters":[{"name":"org","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","pattern":"^[A-Za-z0-9._:-]{8,128}$"}}],"summary":"Invite by email (invitation:create); accepted on the identity service's invitation page","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["email"],"properties":{"email":{"type":"string"},"role":{"enum":["owner","admin","publisher","member"]}}}}}},"responses":{"201":{"description":"Invitation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Invitation"}}}},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/organizations/{org}/invitations/{id}":{"delete":{"parameters":[{"name":"org","in":"path","required":true,"schema":{"type":"string"}},{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"summary":"Cancel an invitation (invitation:cancel)","responses":{"204":{"description":"Cancelled"},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/organizations/{org}/api-keys":{"get":{"parameters":[{"name":"org","in":"path","required":true,"schema":{"type":"string"}}],"summary":"Organization API keys (apiKey:read; never the secrets)","responses":{"200":{"description":"API keys","content":{"application/json":{"schema":{"type":"object","required":["api_keys","next_cursor"],"properties":{"api_keys":{"type":"array","items":{"$ref":"#/components/schemas/ApiKey"}},"next_cursor":{"type":["string","null"]}}}}}},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"parameters":[{"name":"org","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","pattern":"^[A-Za-z0-9._:-]{8,128}$"}}],"summary":"Create an API key (apiKey:create; people only). Permissions must be a subset of your role and can't include member or key management. Secret shown once.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name","permissions"],"properties":{"name":{"type":"string","maxLength":32},"permissions":{"type":"object","additionalProperties":{"type":"array","items":{"type":"string"}},"description":"resource → actions, e.g. {\"release\": [\"publish\"]}"},"expires_in_days":{"type":"integer","minimum":1,"maximum":365,"default":90}}}}}},"responses":{"201":{"description":"API key with secret (shown once)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyWithSecret"}}}},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/organizations/{org}/api-keys/{id}/rotate":{"post":{"parameters":[{"name":"org","in":"path","required":true,"schema":{"type":"string"}},{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"summary":"Replace a key (same name and permissions); the old one stops now or after grace_seconds","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"grace_seconds":{"type":"integer","minimum":0,"maximum":86400},"expires_in_days":{"type":"integer"}}}}}},"responses":{"201":{"description":"New API key with secret (shown once)","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ApiKeyWithSecret"},{"type":"object","properties":{"replaces":{"type":"string"}}}]}}}},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/organizations/{org}/api-keys/{id}":{"delete":{"parameters":[{"name":"org","in":"path","required":true,"schema":{"type":"string"}},{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"summary":"Revoke a key (apiKey:delete); immediate","responses":{"204":{"description":"Revoked"},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/organizations/{org}/audit":{"get":{"parameters":[{"name":"org","in":"path","required":true,"schema":{"type":"string"}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":500}},{"name":"cursor","in":"query","schema":{"type":"string"}},{"name":"action","in":"query","schema":{"type":"string"},"description":"action prefix, e.g. channel. or key_batch.issue"},{"name":"actor_kind","in":"query","schema":{"enum":["user","api_key"]}},{"name":"target_id","in":"query","schema":{"type":"string"}}],"summary":"Audit events, newest first (organization:update). Events carry safe metadata only: never codes, secrets or keys.","responses":{"200":{"description":"Events page","content":{"application/json":{"schema":{"type":"object","required":["events","next_cursor"],"properties":{"events":{"type":"array","items":{"$ref":"#/components/schemas/AuditEvent"}},"next_cursor":{"type":["string","null"]}}}}}},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/organizations/{org}/usage":{"get":{"parameters":[{"name":"org","in":"path","required":true,"schema":{"type":"string"}}],"summary":"Storage and activity, computed live (game:read). stored_bytes counts each pack once per game (deduplicated); logical_bytes counts every published release in full. Only verified releases count.","responses":{"200":{"description":"Usage","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Usage"}}}},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/organizations/{org}/games/{id}/packages":{"get":{"parameters":[{"name":"org","in":"path","required":true,"schema":{"type":"string"}},{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^game_[0-9a-f]{32}$"}}],"summary":"Packages of a game (game:read)","responses":{"200":{"description":"Packages","content":{"application/json":{"schema":{"type":"object","required":["packages","next_cursor"],"properties":{"packages":{"type":"array","items":{"$ref":"#/components/schemas/Package"}},"next_cursor":{"type":["string","null"]}}}}}},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"parameters":[{"name":"org","in":"path","required":true,"schema":{"type":"string"}},{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^game_[0-9a-f]{32}$"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","pattern":"^[A-Za-z0-9._:-]{8,128}$"}}],"summary":"Define a package (game:update): base, dlc, test (content = releases pushed with --package <name>) or bundle (includes other packages of the game)","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name"],"properties":{"name":{"type":"string"},"kind":{"enum":["base","dlc","bundle","test"]},"title":{"type":"string"},"free_claim":{"type":"boolean"},"includes":{"type":"array","items":{"type":"string"}}}}}}},"responses":{"201":{"description":"Package","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Package"}}}},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/organizations/{org}/packages/{pkg}":{"patch":{"parameters":[{"name":"org","in":"path","required":true,"schema":{"type":"string"}},{"name":"pkg","in":"path","required":true,"schema":{"type":"string","pattern":"^pkg_[0-9a-f]{32}$"}}],"summary":"Enable/disable, retitle, toggle free claims (game:update). Disabled packages grant nothing new.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"enabled":{"type":"boolean"},"title":{"type":"string"},"free_claim":{"type":"boolean"}}}}}},"responses":{"200":{"description":"Package","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Package"}}}},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/organizations/{org}/entitlements/grants":{"post":{"parameters":[{"name":"org","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9._:-]{8,128}$"}}],"summary":"Grant a package to a Depot user (entitlement:grant). Already owned: 200 with the existing entitlement.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["package_id"],"properties":{"package_id":{"type":"string"},"user_id":{"type":"string"},"handle":{"type":"string","description":"resolved to the user id at grant time"},"ends_at":{"type":"string","format":"date-time"},"source":{"enum":["publisher_grant","test_access"]},"source_ref":{"type":"string","maxLength":200}}}}}},"responses":{"200":{"description":"Already owned","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Entitlement"}}}},"201":{"description":"Entitlement","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Entitlement"}}}},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/organizations/{org}/entitlements":{"get":{"parameters":[{"name":"org","in":"path","required":true,"schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":200}},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"next_cursor from the previous page"},{"name":"package_id","in":"query","schema":{"type":"string"}},{"name":"user_id","in":"query","schema":{"type":"string"}},{"name":"handle","in":"query","schema":{"type":"string"},"description":"@handle of the player (resolved at query time)"},{"name":"status","in":"query","schema":{"enum":["active","expired","revoked"]}}],"summary":"Entitlements to the organization's packages, oldest first (entitlement:read). Each names its player by display name and @handle only.","responses":{"200":{"description":"Entitlements page","content":{"application/json":{"schema":{"type":"object","required":["entitlements","next_cursor"],"properties":{"entitlements":{"type":"array","items":{"$ref":"#/components/schemas/Entitlement"}},"next_cursor":{"type":["string","null"]}}}}}},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/organizations/{org}/entitlements/{id}/revoke":{"post":{"parameters":[{"name":"org","in":"path","required":true,"schema":{"type":"string"}},{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^ent_[0-9a-f]{32}$"}}],"summary":"Revoke an entitlement (entitlement:revoke): new grants, sessions and key delivery stop at once; installed copies keep launching","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["reason"],"properties":{"reason":{"type":"string","maxLength":500}}}}}},"responses":{"200":{"description":"Entitlement","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Entitlement"}}}},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/me/library":{"get":{"summary":"Games and packages the signed-in player owns (store-page fields only)","responses":{"200":{"description":"Library","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/packages/{pkg}/claim":{"post":{"parameters":[{"name":"pkg","in":"path","required":true,"schema":{"type":"string","pattern":"^pkg_[0-9a-f]{32}$"}}],"summary":"Claim a free package","responses":{"200":{"description":"Already owned","content":{"application/json":{"schema":{"type":"object"}}}},"201":{"description":"Entitlement","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/games/{id}/download-grants":{"post":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^game_[0-9a-f]{32}$"}}],"summary":"A short-lived download grant (1 hour, 5 sessions) for a package the player owns now; exchange it at /v1/sessions. Every use re-checks the entitlement.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"package":{"type":"string","default":"base"}}}}}},"responses":{"201":{"description":"Grant (secret shown once)","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/organizations/{org}/packages/{pkg}/key-batches":{"post":{"parameters":[{"name":"org","in":"path","required":true,"schema":{"type":"string"}},{"name":"pkg","in":"path","required":true,"schema":{"type":"string","pattern":"^pkg_[0-9a-f]{32}$"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9._:-]{8,128}$"}}],"summary":"Issue a batch of single-use game keys (keys:issue). The codes are in this response only; a retry with the same Idempotency-Key returns the batch without codes.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["quantity"],"properties":{"quantity":{"type":"integer","minimum":1,"maximum":1000},"label":{"type":"string"},"expires_at":{"type":"string","format":"date-time"}}}}}},"responses":{"200":{"description":"Batch already issued (no codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KeyBatchIssued"}}}},"201":{"description":"Batch with codes (shown once)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KeyBatchIssued"}}}},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/organizations/{org}/key-batches":{"get":{"parameters":[{"name":"org","in":"path","required":true,"schema":{"type":"string"}},{"name":"package_id","in":"query","schema":{"type":"string"}},{"name":"game_id","in":"query","schema":{"type":"string"}}],"summary":"Batches with available/redeemed/revoked counts, never codes (keys:read)","responses":{"200":{"description":"Batches","content":{"application/json":{"schema":{"type":"object","required":["batches","next_cursor"],"properties":{"batches":{"type":"array","items":{"$ref":"#/components/schemas/KeyBatch"}},"next_cursor":{"type":["string","null"]}}}}}},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/organizations/{org}/key-batches/{id}/revoke":{"post":{"parameters":[{"name":"org","in":"path","required":true,"schema":{"type":"string"}},{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^kb_[0-9a-f]{32}$"}}],"summary":"Revoke a batch's still-available keys (keys:revoke); redeemed keys keep their entitlements","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["reason"],"properties":{"reason":{"type":"string"}}}}}},"responses":{"200":{"description":"Batch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KeyBatch"}}}},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/keys/redeem":{"post":{"summary":"Redeem a game key into an entitlement (signed-in player; atomic, single use). Already owned: the key is not used.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["code"],"properties":{"code":{"type":"string","example":"DPT1-ABCD-EFGH-JKMN-PQRS-TVWX-YZ01-2345"}}}}}},"responses":{"200":{"description":"Already redeemed by you","content":{"application/json":{"schema":{"type":"object"}}}},"201":{"description":"Entitlement","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"410":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/organizations/{org}/retailer-delegations":{"get":{"parameters":[{"name":"org","in":"path","required":true,"schema":{"type":"string"}}],"summary":"Delegations this publisher granted (retailer:delegate)","responses":{"200":{"description":"Delegations","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"parameters":[{"name":"org","in":"path","required":true,"schema":{"type":"string"}}],"summary":"Let a retailer organization issue keys for one package, up to a quota (retailer:delegate)","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["retailer_organization_id","package_id","quota"],"properties":{"retailer_organization_id":{"type":"string"},"package_id":{"type":"string"},"quota":{"type":"integer","minimum":1},"expires_at":{"type":"string","format":"date-time"}}}}}},"responses":{"201":{"description":"Delegation","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/organizations/{org}/retailer-delegations/{id}/revoke":{"post":{"parameters":[{"name":"org","in":"path","required":true,"schema":{"type":"string"}},{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^rdl_[0-9a-f]{32}$"}}],"summary":"Stop a retailer's issuance now; optionally revoke its still-available keys (default: they stay valid)","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"revoke_issued_keys":{"type":"boolean","default":false}}}}}},"responses":{"200":{"description":"Delegation","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/organizations/{org}/retail/delegations":{"get":{"parameters":[{"name":"org","in":"path","required":true,"schema":{"type":"string"}}],"summary":"Delegations this retailer holds, with remaining quota (retail:issue)","responses":{"200":{"description":"Delegations","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/organizations/{org}/retail/keys":{"post":{"parameters":[{"name":"org","in":"path","required":true,"schema":{"type":"string"}}],"summary":"Retailer just-in-time issuance (retail:issue): unique per order_id; quota reserved atomically; codes shown once","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["delegation_id","order_id"],"properties":{"delegation_id":{"type":"string"},"order_id":{"type":"string"},"quantity":{"type":"integer","minimum":1,"maximum":100}}}}}},"responses":{"200":{"description":"Order already issued (no codes)","content":{"application/json":{"schema":{"type":"object"}}}},"201":{"description":"Order with codes (shown once)","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/games/{game}/licenses/offline":{"post":{"parameters":[{"name":"game","in":"path","required":true,"schema":{"type":"string"}}],"summary":"A signed, game-scoped offline license (30 days) for the signed-in player's entitlements in this game (ADR 0010). Root-certified licensing key; not device-bound.","responses":{"200":{"description":"{license: envelope, server_time}","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/licensing/key-status":{"get":{"security":[],"summary":"Root-signed list of revoked licensing keys for this environment","responses":{"200":{"description":"Signed key status","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/admin/redemption-keys/outstanding":{"get":{"summary":"Platform operators (bootstrap secret): key counts per HMAC version and state, for retiring old secrets","responses":{"200":{"description":"Counts","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/admin/games/{id}/assign":{"post":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^game_[0-9a-f]{32}$"}}],"summary":"Platform operators (bootstrap secret): assign an M2-era game to an organization, once","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["organization_id"],"properties":{"organization_id":{"type":"string"}}}}}},"responses":{"200":{"description":"Assigned","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/healthz":{"get":{"security":[],"summary":"Liveness and database check","responses":{"200":{"description":"Healthy","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/v1/openapi.json":{"get":{"security":[],"summary":"This document","responses":{"200":{"description":"OpenAPI document","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/v1/me":{"get":{"summary":"The signed-in person: identity (issuer, subject), display name, handle and organization memberships. Requires a Depot (OIDC) access token.","responses":{"200":{"description":"Identity","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Me"}}}},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/public/studios/{slug}":{"get":{"security":[],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"summary":"A studio's public storefront and its public game pages (404 when it has none). ETag; cached ~60 s.","responses":{"200":{"description":"Studio","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicStudio"}}}},"304":{"description":"Not modified"},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/public/studios/{slug}/games/{game}":{"get":{"security":[],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}},{"name":"game","in":"path","required":true,"schema":{"type":"string"}}],"summary":"A published game page (public or unlisted) by game slug or id. Only published metadata: never release, build or key identifiers. ETag; cached ~60 s.","responses":{"200":{"description":"Game page","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicGamePage"}}}},"304":{"description":"Not modified"},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/public/sitemap":{"get":{"security":[],"summary":"Public game pages (never unlisted or drafts), for sitemaps","responses":{"200":{"description":"Pages","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/v1/public/reports":{"post":{"security":[],"summary":"Report a studio or game page (malware, copyright, impersonation, scam, dangerous link, misleading, other). Rate-limited; never public.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["studio","reason"],"properties":{"studio":{"type":"string"},"game":{"type":"string"},"reason":{"enum":["malware","copyright","impersonation","scam","dangerous_link","misleading","other"]},"details":{"type":"string","maxLength":1000}}}}}},"responses":{"202":{"description":"Received","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/games/{id}/claim":{"post":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^game_[0-9a-f]{32}$"}}],"summary":"Claim a game whose published page is free (signed-in player): grants its base package, provenance free_claim. Idempotent: already owned (from any source) returns 200 and changes nothing.","responses":{"200":{"description":"Already owned","content":{"application/json":{"schema":{"type":"object"}}}},"201":{"description":"Claimed","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/admin/reports":{"get":{"summary":"Platform operators (bootstrap secret): open reports","responses":{"200":{"description":"Reports","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/admin/games/{id}/page/{action}":{"post":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^game_[0-9a-f]{32}$"}},{"name":"action","in":"path","required":true,"schema":{"enum":["disable","enable"]}}],"summary":"Platform operators (bootstrap secret): take a page down (reason required; free claims stop; owners keep the game) or allow it again (back to draft)","responses":{"200":{"description":"Done","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/catalog":{"get":{"security":[],"summary":"Listed games and their channels for the launcher (not download authorization)","description":"Games their studios listed: older public games, and restricted games whose store page is public and free (claimable) or key only. `access` is what a player does next.","responses":{"200":{"description":"Catalog","content":{"application/json":{"schema":{"type":"object","required":["games"],"properties":{"games":{"type":"array","items":{"type":"object","required":["id","slug","name","description","visibility","access","channels"],"properties":{"id":{"type":"string"},"slug":{"type":"string"},"name":{"type":"string"},"description":{"type":["string","null"]},"visibility":{"enum":["public","restricted"]},"access":{"enum":["anyone","free","key"],"description":"anyone: install without an account (older public games); free: claim with a Depot account; key: redeem a key from the studio"},"channels":{"type":"array","items":{"type":"object","properties":{"platform":{"type":"string"},"channel":{"type":"string"},"release_name":{"type":"string"},"sequence":{"type":"integer"},"updated_at":{"type":"string"}}}},"art":{"type":"object","description":"The studio's art from the published store page","properties":{"icon":{"oneOf":[{"type":"object","required":["url","width","height"],"properties":{"url":{"type":"string"},"width":{"type":"integer"},"height":{"type":"integer"}}},{"type":"null"}]},"cover":{"oneOf":[{"type":"object","required":["url","width","height"],"properties":{"url":{"type":"string"},"width":{"type":"integer"},"height":{"type":"integer"}}},{"type":"null"}]},"hero":{"oneOf":[{"type":"object","required":["url","width","height"],"properties":{"url":{"type":"string"},"width":{"type":"integer"},"height":{"type":"integer"}}},{"type":"null"}]},"logo":{"oneOf":[{"type":"object","required":["url","width","height"],"properties":{"url":{"type":"string"},"width":{"type":"integer"},"height":{"type":"integer"}}},{"type":"null"}]}}},"accent":{"type":["string","null"],"description":"the studio's page colour (#rrggbb) from the published page"},"studio":{"oneOf":[{"type":"object","required":["slug","display_name"],"properties":{"slug":{"type":"string"},"display_name":{"type":"string"}}},{"type":"null"}]},"page_url":{"type":["string","null"],"description":"The game's store page"}}}}}}}}}}}},"/v1/games/{ref}":{"get":{"security":[],"parameters":[{"name":"ref","in":"path","required":true,"schema":{"type":"string"}}],"summary":"Look up a game by id or slug (what a store link's launcher shows before sign-in)","description":"Art, studio and `access` come from the game's published store page (public or unlisted); `page_url` only for a public page. A draft or taken-down page shares none of them.","responses":{"200":{"description":"Game","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"},"name":{"type":"string"},"description":{"type":["string","null"]},"visibility":{"type":"string"},"access":{"enum":["anyone","free","key","invite",null]},"art":{"type":"object","description":"The studio's art from the published store page","properties":{"icon":{"oneOf":[{"type":"object","required":["url","width","height"],"properties":{"url":{"type":"string"},"width":{"type":"integer"},"height":{"type":"integer"}}},{"type":"null"}]},"cover":{"oneOf":[{"type":"object","required":["url","width","height"],"properties":{"url":{"type":"string"},"width":{"type":"integer"},"height":{"type":"integer"}}},{"type":"null"}]},"hero":{"oneOf":[{"type":"object","required":["url","width","height"],"properties":{"url":{"type":"string"},"width":{"type":"integer"},"height":{"type":"integer"}}},{"type":"null"}]},"logo":{"oneOf":[{"type":"object","required":["url","width","height"],"properties":{"url":{"type":"string"},"width":{"type":"integer"},"height":{"type":"integer"}}},{"type":"null"}]}}},"accent":{"type":["string","null"],"description":"the studio's page colour (#rrggbb) from the published page"},"studio":{"oneOf":[{"type":"object","required":["slug","display_name"],"properties":{"slug":{"type":"string"},"display_name":{"type":"string"}}},{"type":"null"}]},"page_url":{"type":["string","null"],"description":"The game's store page"}}}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/organizations/{org}/games/{id}/keys":{"post":{"summary":"Enroll an Ed25519 publisher public key","parameters":[{"name":"org","in":"path","required":true,"schema":{"type":"string"}},{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^game_[0-9a-f]{32}$"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","pattern":"^[A-Za-z0-9._:-]{8,128}$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["public_key"],"properties":{"public_key":{"type":"string","contentEncoding":"base64"}}}}}},"responses":{"200":{"description":"Already enrolled","content":{"application/json":{"schema":{"type":"object"}}}},"201":{"description":"Enrolled","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"description":"Requires `signingKey:manage` in the organization."}},"/v1/organizations/{org}/games/{id}/keys/{keyId}/revoke":{"post":{"parameters":[{"name":"org","in":"path","required":true,"schema":{"type":"string"}},{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^game_[0-9a-f]{32}$"}},{"name":"keyId","in":"path","required":true,"schema":{"type":"string","pattern":"^key_[0-9a-f]{32}$"}}],"summary":"Revoke a publisher key","responses":{"200":{"description":"Revoked","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"description":"Requires `signingKey:manage` in the organization."}},"/v1/games/{id}/keys/trusted":{"get":{"security":[],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^game_[0-9a-f]{32}$"}}],"summary":"Publisher keys and their states (clients pin these)","responses":{"200":{"description":"Keys","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/v1/organizations/{org}/games/{id}/domains":{"post":{"summary":"Get or create the protection domain of a package","parameters":[{"name":"org","in":"path","required":true,"schema":{"type":"string"}},{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^game_[0-9a-f]{32}$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["mode"],"properties":{"package":{"type":"string"},"mode":{"enum":["none","aes-256-gcm"]}}}}}},"responses":{"200":{"description":"Existing domain","content":{"application/json":{"schema":{"type":"object"}}}},"201":{"description":"Created","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"description":"Requires `release:publish` in the organization."}},"/v1/organizations/{org}/games/{id}/domains/{pd}/content-key":{"post":{"summary":"Register a domain's content key once; wrapped under the Worker KEK and never returned to publishers","parameters":[{"name":"org","in":"path","required":true,"schema":{"type":"string"}},{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^game_[0-9a-f]{32}$"}},{"name":"pd","in":"path","required":true,"schema":{"type":"string","pattern":"^pd_[0-9a-f]{32}$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["content_key"],"properties":{"content_key":{"type":"string","contentEncoding":"base64"}}}}}},"responses":{"200":{"description":"Already registered (same key)","content":{"application/json":{"schema":{"type":"object"}}}},"201":{"description":"Registered","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"description":"Requires `signingKey:manage` in the organization."}},"/v1/organizations/{org}/games/{id}/domains/{pd}/published-indexes":{"get":{"parameters":[{"name":"org","in":"path","required":true,"schema":{"type":"string"}},{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^game_[0-9a-f]{32}$"}},{"name":"pd","in":"path","required":true,"schema":{"type":"string","pattern":"^pd_[0-9a-f]{32}$"}}],"summary":"Published releases in a domain (for encrypted record reuse)","responses":{"200":{"description":"Releases","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"description":"Requires `release:publish` in the organization."}},"/v1/organizations/{org}/games/{id}/releases":{"get":{"parameters":[{"name":"org","in":"path","required":true,"schema":{"type":"string"}},{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^game_[0-9a-f]{32}$"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":200}},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"next_cursor from the previous page"},{"name":"platform","in":"query","schema":{"type":"string"}},{"name":"status","in":"query","schema":{"enum":["reserved","uploading","verifying","published","failed","aborted"]}}],"summary":"Releases, newest first (game:read). status published means the API verified every object's hash and size and the descriptor's signature by an active key of the game; only published releases can go on a channel.","responses":{"200":{"description":"Releases page","content":{"application/json":{"schema":{"type":"object","required":["releases","next_cursor"],"properties":{"releases":{"type":"array","items":{"$ref":"#/components/schemas/Release"}},"next_cursor":{"type":["string","null"]}}}}}},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"description":"Requires `game:read` in the organization."},"post":{"summary":"Reserve a release name and the next sequence number","parameters":[{"name":"org","in":"path","required":true,"schema":{"type":"string"}},{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^game_[0-9a-f]{32}$"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","pattern":"^[A-Za-z0-9._:-]{8,128}$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["platform","release_name","protection_domain_id"],"properties":{"platform":{"type":"string"},"release_name":{"type":"string"},"protection_domain_id":{"type":"string"}}}}}},"responses":{"200":{"description":"Resumed reservation","content":{"application/json":{"schema":{"type":"object"}}}},"201":{"description":"Reserved","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"description":"Requires `release:publish` in the organization."}},"/v1/games/{id}/releases/{rid}":{"get":{"security":[{"bearer":[]},{}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^game_[0-9a-f]{32}$"}},{"name":"rid","in":"path","required":true,"schema":{"type":"string","pattern":"^rel_[0-9a-f]{32}$"}}],"summary":"Published release: signed envelope, manifest and index URLs","responses":{"200":{"description":"Release","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/games/{id}/releases/{rid}/pack-urls":{"post":{"security":[{"bearer":[]},{}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^game_[0-9a-f]{32}$"}},{"name":"rid","in":"path","required":true,"schema":{"type":"string","pattern":"^rel_[0-9a-f]{32}$"}}],"summary":"Download URLs for packs of a release (CDN for public, presigned for restricted)","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["packs"],"properties":{"packs":{"type":"array","items":{"type":"string","pattern":"^[0-9a-f]{64}$"}}}}}}},"responses":{"200":{"description":"URLs","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/organizations/{org}/games/{id}/releases/{rid}/uploads":{"post":{"parameters":[{"name":"org","in":"path","required":true,"schema":{"type":"string"}},{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^game_[0-9a-f]{32}$"}},{"name":"rid","in":"path","required":true,"schema":{"type":"string","pattern":"^rel_[0-9a-f]{32}$"}}],"summary":"Open (or resume) an upload session; existing objects are reported present","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["objects"],"properties":{"objects":{"type":"array","items":{"type":"object","properties":{"kind":{"enum":["pack","manifest","index"]},"hash":{"type":"string","pattern":"^[0-9a-f]{64}$"},"size":{"type":"integer"}}}}}}}}},"responses":{"200":{"description":"Session","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"description":"Requires `release:publish` in the organization."}},"/v1/organizations/{org}/games/{id}/uploads/{sid}/parts":{"post":{"parameters":[{"name":"org","in":"path","required":true,"schema":{"type":"string"}},{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^game_[0-9a-f]{32}$"}},{"name":"sid","in":"path","required":true,"schema":{"type":"string","pattern":"^up_[0-9a-f]{32}$"}}],"summary":"Presigned multipart part URLs and already-uploaded parts","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"hash":{"type":"string","pattern":"^[0-9a-f]{64}$"},"parts":{"type":"array","items":{"type":"integer"}}}}}}},"responses":{"200":{"description":"Parts","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"description":"Requires `release:publish` in the organization."}},"/v1/organizations/{org}/games/{id}/uploads/{sid}/complete":{"post":{"parameters":[{"name":"org","in":"path","required":true,"schema":{"type":"string"}},{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^game_[0-9a-f]{32}$"}},{"name":"sid","in":"path","required":true,"schema":{"type":"string","pattern":"^up_[0-9a-f]{32}$"}}],"summary":"Complete a multipart upload from the parts R2 holds","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"hash":{"type":"string","pattern":"^[0-9a-f]{64}$"}}}}}},"responses":{"200":{"description":"Present","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"description":"Requires `release:publish` in the organization."}},"/v1/organizations/{org}/games/{id}/uploads/{sid}/abort":{"post":{"parameters":[{"name":"org","in":"path","required":true,"schema":{"type":"string"}},{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^game_[0-9a-f]{32}$"}},{"name":"sid","in":"path","required":true,"schema":{"type":"string","pattern":"^up_[0-9a-f]{32}$"}}],"summary":"Abort an upload session","responses":{"200":{"description":"Aborted","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"description":"Requires `release:publish` in the organization."}},"/v1/organizations/{org}/games/{id}/uploads/{sid}/finalize":{"post":{"parameters":[{"name":"org","in":"path","required":true,"schema":{"type":"string"}},{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^game_[0-9a-f]{32}$"}},{"name":"sid","in":"path","required":true,"schema":{"type":"string","pattern":"^up_[0-9a-f]{32}$"}}],"summary":"Verify objects, index and signature; publish the release","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["descriptor","signature"],"properties":{"descriptor":{"$ref":"#/components/schemas/Descriptor"},"signature":{"$ref":"#/components/schemas/Signature"}}}}}},"responses":{"200":{"description":"Published","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"description":"Requires `release:publish` in the organization."}},"/v1/organizations/{org}/games/{id}/channels":{"get":{"parameters":[{"name":"org","in":"path","required":true,"schema":{"type":"string"}},{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^game_[0-9a-f]{32}$"}}],"summary":"List channels (game:read)","responses":{"200":{"description":"Channels","content":{"application/json":{"schema":{"type":"object","required":["channels","next_cursor"],"properties":{"channels":{"type":"array","items":{"$ref":"#/components/schemas/Channel"}},"next_cursor":{"type":["string","null"]}}}}}},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"description":"Requires `game:read` in the organization."}},"/v1/games/{id}/channels/{platform}/{name}":{"get":{"security":[{"bearer":[]},{}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^game_[0-9a-f]{32}$"}},{"name":"platform","in":"path","required":true,"schema":{"type":"string"}},{"name":"name","in":"path","required":true,"schema":{"type":"string"}}],"summary":"Resolve a channel","responses":{"200":{"description":"Channel","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/organizations/{org}/games/{id}/channels/{platform}/{name}":{"put":{"parameters":[{"name":"org","in":"path","required":true,"schema":{"type":"string"}},{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^game_[0-9a-f]{32}$"}},{"name":"platform","in":"path","required":true,"schema":{"type":"string"}},{"name":"name","in":"path","required":true,"schema":{"type":"string"}}],"summary":"Promote or roll back a channel (channel:write): point it at a published release of its platform. Compare-and-swap on revision (null creates the channel): a stale or replayed request gets 409 revision_mismatch with the current release, never a double move. Moving to a lower sequence is a rollback and needs allow_rollback. Recorded in the channel's history with the optional note.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["release_id","expected_revision"],"properties":{"release_id":{"type":"string"},"expected_revision":{"type":["integer","null"]},"allow_rollback":{"type":"boolean"},"note":{"type":"string","maxLength":500}}}}}},"responses":{"200":{"description":"Moved","content":{"application/json":{"schema":{"type":"object","required":["game_id","platform","channel","release_id","sequence","revision","rollback"],"properties":{"game_id":{"type":"string"},"platform":{"type":"string"},"channel":{"type":"string"},"release_id":{"type":"string"},"sequence":{"type":"integer"},"revision":{"type":"integer"},"rollback":{"type":"boolean"}}}}}},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"description":"Requires `channel:write` in the organization."}},"/v1/organizations/{org}/games/{id}/channels/{platform}/{name}/history":{"get":{"parameters":[{"name":"org","in":"path","required":true,"schema":{"type":"string"}},{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^game_[0-9a-f]{32}$"}},{"name":"platform","in":"path","required":true,"schema":{"type":"string"}},{"name":"name","in":"path","required":true,"schema":{"type":"string"}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":200}},{"name":"cursor","in":"query","schema":{"type":"string"}}],"summary":"A channel's moves, newest first (game:read)","responses":{"200":{"description":"History page","content":{"application/json":{"schema":{"type":"object","required":["moves","next_cursor"],"properties":{"moves":{"type":"array","items":{"$ref":"#/components/schemas/ChannelMove"}},"next_cursor":{"type":["string","null"]}}}}}},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"description":"Requires `game:read` in the organization."}},"/v1/organizations/{org}/games/{id}/grants":{"post":{"parameters":[{"name":"org","in":"path","required":true,"schema":{"type":"string"}},{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^game_[0-9a-f]{32}$"}}],"summary":"Issue a download grant for a package","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"package":{"type":"string"},"ttl_seconds":{"type":"integer"},"max_sessions":{"type":"integer"}}}}}},"responses":{"201":{"description":"Grant (secret shown once)","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"description":"Requires `entitlement:grant` in the organization."}},"/v1/organizations/{org}/games/{id}/grants/{gid}/revoke":{"post":{"parameters":[{"name":"org","in":"path","required":true,"schema":{"type":"string"}},{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^game_[0-9a-f]{32}$"}},{"name":"gid","in":"path","required":true,"schema":{"type":"string","pattern":"^dpg_[0-9a-f]{32}$"}}],"summary":"Revoke a grant (its sessions stop working)","responses":{"200":{"description":"Revoked","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"description":"Requires `entitlement:grant` in the organization."}},"/v1/sessions":{"post":{"summary":"Exchange a download grant for a short-lived session","responses":{"201":{"description":"Session (secret shown once)","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/games/{id}/content-key":{"post":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^game_[0-9a-f]{32}$"}}],"summary":"Release a content key to a download session","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["protection_domain_id"],"properties":{"protection_domain_id":{"type":"string"}}}}}},"responses":{"200":{"description":"Content key","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Problem","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}}}}