openapi: 3.1.0 info: title: Itch.io Auth Wharf API description: The itch.io server-side API provides authenticated access to user profiles, uploaded games, download key validation, purchase lookup, and build version retrieval. Authentication is via API key or short-lived JWT tokens using the Authorization Bearer header. Responses are JSON with snake_case naming and RFC 3339 dates. version: 1.0.0 contact: name: Itch.io Support url: https://itch.io/support license: name: Proprietary url: https://itch.io/docs/legal/terms servers: - url: https://api.itch.io description: Itch.io API Server security: - bearerAuth: [] tags: - name: Wharf description: Wharf build infrastructure operations (butler/CI integration) paths: /wharf/status: get: operationId: wharfStatus summary: Wharf status description: Requests the status of the wharf build infrastructure. tags: - Wharf responses: '200': description: Successful response content: application/json: schema: $ref: '#/components/schemas/WharfStatusResponse' /wharf/channels: get: operationId: listChannels summary: List wharf channels description: Returns a list of channels for a game. tags: - Wharf parameters: - name: target in: query required: true description: Target in the format user/game schema: type: string responses: '200': description: Successful response content: application/json: schema: $ref: '#/components/schemas/ListChannelsResponse' '401': $ref: '#/components/responses/Unauthorized' /wharf/channels/{channelName}: get: operationId: getChannel summary: Get wharf channel description: Returns information about a given channel for a given game. tags: - Wharf parameters: - name: channelName in: path required: true schema: type: string - name: target in: query required: true description: Target in the format user/game schema: type: string responses: '200': description: Successful response content: application/json: schema: $ref: '#/components/schemas/GetChannelResponse' '401': $ref: '#/components/responses/Unauthorized' /wharf/builds: post: operationId: createBuild summary: Create wharf build description: Creates a new build for a given user/game:channel, with an optional user version. tags: - Wharf requestBody: required: true content: application/x-www-form-urlencoded: schema: type: object required: - target - channel properties: target: type: string description: Target in the format user/game channel: type: string description: Channel name (e.g. windows-64) user_version: type: string description: Optional developer-specified version string hidden: type: boolean description: If true, the build is hidden source: type: string description: Source that initiated the push (e.g. cli, butlerd, app) responses: '200': description: Successful response content: application/json: schema: $ref: '#/components/schemas/CreateBuildResponse' '401': $ref: '#/components/responses/Unauthorized' /wharf/builds/{buildId}: get: operationId: getWharfBuild summary: Get wharf build description: Retrieves info about a single build by ID via the owner-side wharf endpoint. tags: - Wharf parameters: - name: buildId in: path required: true schema: type: integer format: int64 responses: '200': description: Successful response content: application/json: schema: $ref: '#/components/schemas/GetWharfBuildResponse' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /wharf/builds/{buildId}/files: get: operationId: listBuildFiles summary: List build files description: Returns a list of files associated to a build. tags: - Wharf parameters: - name: buildId in: path required: true schema: type: integer format: int64 responses: '200': description: Successful response content: application/json: schema: $ref: '#/components/schemas/ListBuildFilesResponse' '401': $ref: '#/components/responses/Unauthorized' post: operationId: createBuildFile summary: Create build file description: Creates a new build file entry for a build. tags: - Wharf parameters: - name: buildId in: path required: true schema: type: integer format: int64 requestBody: required: true content: application/x-www-form-urlencoded: schema: type: object required: - type properties: type: type: string enum: - patch - archive - signature - manifest - unpacked sub_type: type: string enum: - default - gzip - optimized upload_type: type: string enum: - multipart - resumable - deferred_resumable filename: type: string responses: '200': description: Successful response content: application/json: schema: $ref: '#/components/schemas/CreateBuildFileResponse' '401': $ref: '#/components/responses/Unauthorized' /wharf/builds/{buildId}/files/{fileId}: post: operationId: finalizeBuildFile summary: Finalize build file description: Marks the end of the upload for a build file. Validates that the file size in storage matches the provided size. tags: - Wharf parameters: - name: buildId in: path required: true schema: type: integer format: int64 - name: fileId in: path required: true schema: type: integer format: int64 requestBody: required: true content: application/x-www-form-urlencoded: schema: type: object required: - size properties: size: type: integer format: int64 description: Expected file size in bytes responses: '200': description: Successful response content: application/json: schema: type: object '401': $ref: '#/components/responses/Unauthorized' /wharf/builds/{buildId}/events: get: operationId: listBuildEvents summary: List build events description: Returns a series of events associated with a given build. tags: - Wharf parameters: - name: buildId in: path required: true schema: type: integer format: int64 responses: '200': description: Successful response content: application/json: schema: $ref: '#/components/schemas/ListBuildEventsResponse' '401': $ref: '#/components/responses/Unauthorized' post: operationId: createBuildEvent summary: Create build event description: Associates a new build event (e.g. log message) to a build. tags: - Wharf parameters: - name: buildId in: path required: true schema: type: integer format: int64 requestBody: required: true content: application/x-www-form-urlencoded: schema: type: object required: - type - message properties: type: type: string enum: - log message: type: string data: type: string description: JSON-encoded additional event data responses: '200': description: Successful response content: application/json: schema: type: object '401': $ref: '#/components/responses/Unauthorized' /wharf/builds/{buildId}/failures: post: operationId: createBuildFailure summary: Mark build as failed description: Marks a given build as failed with an error message. tags: - Wharf parameters: - name: buildId in: path required: true schema: type: integer format: int64 requestBody: required: true content: application/x-www-form-urlencoded: schema: type: object required: - message properties: message: type: string fatal: type: boolean description: If true, the build cannot be retried responses: '200': description: Successful response content: application/json: schema: type: object '401': $ref: '#/components/responses/Unauthorized' /wharf/builds/{buildId}/failures/rediff: post: operationId: createRediffBuildFailure summary: Mark build rediff as failed description: Marks a given build as having failed to rediff (optimize). tags: - Wharf parameters: - name: buildId in: path required: true schema: type: integer format: int64 requestBody: required: true content: application/x-www-form-urlencoded: schema: type: object required: - message properties: message: type: string responses: '200': description: Successful response content: application/json: schema: type: object '401': $ref: '#/components/responses/Unauthorized' components: schemas: BuildFile: type: object description: Contains information about a build file (archive, signature, patch, etc.) properties: id: type: integer format: int64 size: type: integer format: int64 state: type: string enum: - created - uploading - uploaded - failed type: type: string enum: - patch - archive - signature - manifest - unpacked subType: type: string enum: - default - gzip - optimized createdAt: type: string format: date-time updatedAt: type: string format: date-time Build: type: object description: Contains information about a specific build properties: id: type: integer format: int64 parentBuildId: type: integer format: int64 description: Identifier of the build before this one on the same channel, or -1 if initial state: type: string enum: - started - queued - processing - completed - failed uploadId: type: integer format: int64 gameId: type: integer format: int64 userId: type: integer format: int64 version: type: integer format: int64 description: Automatically-incremented version number, starting with 1 userVersion: type: string description: Developer-specified version string from --userversion files: type: array items: $ref: '#/components/schemas/BuildFile' user: $ref: '#/components/schemas/User' upload: $ref: '#/components/schemas/Upload' game: $ref: '#/components/schemas/Game' createdAt: type: string format: date-time updatedAt: type: string format: date-time ErrorResponse: type: object properties: errors: type: array items: type: string CreateBuildFileResponse: type: object properties: file: $ref: '#/components/schemas/FileUploadSpec' FileUploadSpec: type: object description: Contains the info needed to upload one specific build file properties: id: type: integer format: int64 uploadUrl: type: string format: uri uploadParams: type: object additionalProperties: type: string uploadHeaders: type: object additionalProperties: type: string Sale: type: object description: Describes a discount for a game properties: id: type: integer format: int64 gameId: type: integer format: int64 rate: type: number description: Discount rate in percent; can be negative (reverse sales) startDate: type: string format: date-time endDate: type: string format: date-time ListBuildEventsResponse: type: object properties: events: type: array items: $ref: '#/components/schemas/BuildEvent' Upload: type: object description: A downloadable file; may be wharf-enabled for versioned channel-based distribution properties: id: type: integer format: int64 storage: type: string enum: - hosted - build - external host: type: string description: Host if external storage filename: type: string description: Original file name (e.g. Overland_x64.zip) displayName: type: string description: Human-friendly name set by developer size: type: integer format: int64 description: Size of upload in bytes channelName: type: string description: Name of the wharf channel for this upload, if wharf-enabled build: $ref: '#/components/schemas/Build' buildId: type: integer format: int64 type: type: string enum: - default - flash - unity - java - html - soundtrack - book - video - documentation - mod - audio_assets - graphical_assets - sourcecode - other preorder: type: boolean description: Is this upload a pre-order placeholder? demo: type: boolean description: Is this upload a free demo? platforms: $ref: '#/components/schemas/Platforms' createdAt: type: string format: date-time updatedAt: type: string format: date-time GameEmbedData: type: object description: Presentation information for embed games properties: gameId: type: integer format: int64 width: type: integer format: int64 description: Width of the initial viewport in pixels height: type: integer format: int64 description: Height of the initial viewport in pixels fullscreen: type: boolean description: Whether a fullscreen button should be shown Game: type: object description: Represents a page on itch.io; could be a game, tool, comic, etc. properties: id: type: integer format: int64 description: Site-wide unique identifier url: type: string format: uri description: Canonical address of the game's page on itch.io title: type: string description: Human-friendly title (may contain any character) shortText: type: string description: Human-friendly short description type: type: string enum: - default - flash - unity - java - html description: Type of the game page classification: type: string enum: - game - tool - assets - game_mod - physical_game - soundtrack - other - comic - book description: Creator-picked classification embed: $ref: '#/components/schemas/GameEmbedData' coverUrl: type: string format: uri description: Cover URL (might be a GIF) stillCoverUrl: type: string format: uri description: Non-gif cover URL; only set if the main cover is a GIF createdAt: type: string format: date-time description: Date the game was created publishedAt: type: string format: date-time description: Date the game was published; empty if not currently published minPrice: type: integer format: int64 description: Price in cents of a dollar canBeBought: type: boolean description: Are payments accepted? hasDemo: type: boolean description: Does this game have a demo available? inPressSystem: type: boolean description: Is this game part of the itch.io press system? platforms: $ref: '#/components/schemas/Platforms' user: $ref: '#/components/schemas/User' userId: type: integer format: int64 sale: $ref: '#/components/schemas/Sale' viewsCount: type: integer format: int64 description: Owner-only field downloadsCount: type: integer format: int64 description: Owner-only field purchasesCount: type: integer format: int64 description: Owner-only field published: type: boolean description: Owner-only field Platforms: type: object description: Describes which OS/architectures a game or upload is compatible with properties: windows: type: string enum: - all - '386' - amd64 linux: type: string enum: - all - '386' - amd64 osx: type: string enum: - all - '386' - amd64 ListChannelsResponse: type: object properties: channels: type: object additionalProperties: $ref: '#/components/schemas/Channel' User: type: object description: Represents an itch.io account with basic profile info properties: id: type: integer format: int64 description: Site-wide unique identifier generated by itch.io username: type: string description: The user's username (used for login) displayName: type: string description: The user's display name; may contain spaces and unicode characters developer: type: boolean description: Has the user opted into creating games? pressUser: type: boolean description: Is the user part of itch.io's press program? url: type: string format: uri description: The address of the user's page on itch.io coverUrl: type: string format: uri description: User's avatar URL; may be a GIF stillCoverUrl: type: string format: uri description: Static version of user's avatar; only set if the main cover URL is a GIF GetWharfBuildResponse: type: object properties: build: $ref: '#/components/schemas/Build' Channel: type: object description: Contains information about a channel and its current status properties: name: type: string description: Name of the channel (e.g. windows-64-beta, osx-universal) tags: type: string upload: $ref: '#/components/schemas/Upload' head: $ref: '#/components/schemas/Build' pending: $ref: '#/components/schemas/Build' GetChannelResponse: type: object properties: channel: $ref: '#/components/schemas/Channel' ListBuildFilesResponse: type: object properties: files: type: array items: $ref: '#/components/schemas/BuildFile' BuildEvent: type: object description: Describes something that happened while processing a build properties: type: type: string enum: - log message: type: string data: type: object additionalProperties: true CreateBuildResponse: type: object properties: build: type: object properties: id: type: integer format: int64 uploadId: type: integer format: int64 parentBuild: type: object properties: id: type: integer format: int64 WharfStatusResponse: type: object properties: success: type: boolean responses: Unauthorized: description: Authentication is required or credentials are invalid content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' NotFound: description: Resource not found content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' securitySchemes: bearerAuth: type: http scheme: bearer description: API key or JWT token issued by itch.io