Modrinth

Minecraft modding platform API

docs.modrinth.com ↗
Version
v2.7.0/15cf3fc
OpenAPI
3.0.0
Endpoints
76
Schemas
91
Updated
3 days ago
Gaming gaming minecraft mods
Use this API in your AI agent

Query structured spec data via REST or MCP. Get exactly what your agent needs.

Get API Key

Server URLs

https://api.modrinth.com/v2
https://staging-api.modrinth.com/v2

Authentication

apiKey

Endpoints

Misc 2 endpoints

GET /statistics
operationId: Misc_instanceStatistics

Responses

200 Expected response to a valid request
GET /statistics
GET /updates/{id|slug}/forge_updates.json

If you're a Forge mod developer, your Modrinth mods have an automatically generated `updates.json` using the [Forge Update Checker](https://docs.minecraftforge.net/en/latest/misc/updatechecker/). The only setup is to insert the URL into the `[[mods]]` section of your `mods.toml` file as such: ```toml [[mods]] # the other stuff here - ID, version, display name, etc. updateJSONURL = "https://api.modrinth.com/updates/{slug|ID}/forge_updates.json" ``` Replace `{slug|id}` with the slug or ID of your project. Modrinth will handle the rest! When you update your mod, Forge will notify your users that their copy of your mod is out of date. Make sure that the version format you use for your Modrinth releases is the same as the version format you use in your `mods.toml`. If you use a format such as `1.2.3-forge` or `1.2.3+1.19` with your Modrinth releases but your `mods.toml` only has `1.2.3`, the update checker may not function properly.

operationId: Misc_getForgeUpdatesJson

Responses

200 Expected response to a valid request
400 Invalid request
GET /updates/{id|slug}/forge_updates.json

Notifications 7 endpoints

DELETE /notification/{id}
operationId: Notifications_deleteById

Responses

204 Expected response to a valid request
401 Incorrect token scopes or no authorization to access the requested item(s)
404 The requested item(s) were not found or no authorization to access the requested item(s)
DELETE /notification/{id}
GET /notification/{id}
operationId: Notifications_getById

Responses

200 Expected response to a valid request
401 Incorrect token scopes or no authorization to access the requested item(s)
404 The requested item(s) were not found or no authorization to access the requested item(s)
GET /notification/{id}
PATCH /notification/{id}
operationId: Notifications_markAsRead

Responses

204 Expected response to a valid request
401 Incorrect token scopes or no authorization to access the requested item(s)
404 The requested item(s) were not found or no authorization to access the requested item(s)
PATCH /notification/{id}
DELETE /notifications
operationId: Notifications_deleteMultiple

Responses

204 Expected response to a valid request
401 Incorrect token scopes or no authorization to access the requested item(s)
404 The requested item(s) were not found or no authorization to access the requested item(s)
DELETE /notifications
GET /notifications
operationId: Notifications_getMultiple

Responses

200 Expected response to a valid request
401 Incorrect token scopes or no authorization to access the requested item(s)
404 The requested item(s) were not found or no authorization to access the requested item(s)
GET /notifications
PATCH /notifications
operationId: Notifications_markAsRead

Responses

204 Expected response to a valid request
401 Incorrect token scopes or no authorization to access the requested item(s)
404 The requested item(s) were not found or no authorization to access the requested item(s)
PATCH /notifications
GET /user/{id|username}/notifications
operationId: Notifications_getUserNotifications

Responses

200 Expected response to a valid request
401 Incorrect token scopes or no authorization to access the requested item(s)
404 The requested item(s) were not found or no authorization to access the requested item(s)
GET /user/{id|username}/notifications

Projects 18 endpoints

POST /project
operationId: Projects_createNewProject

Request Body

{
  "content": {
    "multipart/form-data": {
      "schema": {
        "$ref": "#/components/schemas/CreateProjectBody"
      }
    }
  },
  "description": "New project"
}

Responses

200 Expected response to a valid request
400 Request was invalid, see given error
401 Incorrect token scopes or no authorization to access the requested item(s)
POST /project
DELETE /project/{id|slug}
operationId: Projects_removeBySlug

Responses

204 Expected response to a valid request
400 Request was invalid, see given error
401 Incorrect token scopes or no authorization to access the requested item(s)
DELETE /project/{id|slug}
GET /project/{id|slug}
operationId: Projects_getProjectByIdOrSlug

Responses

200 Expected response to a valid request
404 The requested item(s) were not found or no authorization to access the requested item(s)
GET /project/{id|slug}
PATCH /project/{id|slug}
operationId: Projects_updateProjectByIdOrSlug

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/EditableProject"
      }
    }
  },
  "description": "Modified project fields"
}

Responses

204 Expected response to a valid request
401 Incorrect token scopes or no authorization to access the requested item(s)
404 The requested item(s) were not found or no authorization to access the requested item(s)
PATCH /project/{id|slug}
GET /project/{id|slug}/check
operationId: Projects_checkValidity

Responses

200 Expected response to a valid request
404 The requested item(s) were not found or no authorization to access the requested item(s)
GET /project/{id|slug}/check
GET /project/{id|slug}/dependencies
operationId: Projects_getDependencies

Responses

200 Expected response to a valid request
404 The requested item(s) were not found or no authorization to access the requested item(s)
GET /project/{id|slug}/dependencies
DELETE /project/{id|slug}/follow
operationId: Projects_unfollowProject

Responses

204 Expected response to a valid request
400 Request was invalid, see given error
401 Incorrect token scopes or no authorization to access the requested item(s)
DELETE /project/{id|slug}/follow
POST /project/{id|slug}/follow
operationId: Projects_followProjectBySlug

Responses

204 Expected response to a valid request
400 Request was invalid, see given error
401 Incorrect token scopes or no authorization to access the requested item(s)
POST /project/{id|slug}/follow
DELETE /project/{id|slug}/gallery
operationId: Projects_deleteGalleryImage

Parameters

Name In Required Type Description
url query required string URL link of the image to delete

Responses

204 Expected response to a valid request
400 Request was invalid, see given error
401 Incorrect token scopes or no authorization to access the requested item(s)
DELETE /project/{id|slug}/gallery
PATCH /project/{id|slug}/gallery
operationId: Projects_modifyGalleryImage

Parameters

Name In Required Type Description
url query required string URL link of the image to modify
featured query optional boolean Whether the image is featured
title query optional string New title of the image
description query optional string New description of the image
ordering query optional integer New ordering of the image

Responses

204 Expected response to a valid request
401 Incorrect token scopes or no authorization to access the requested item(s)
404 The requested item(s) were not found or no authorization to access the requested item(s)
PATCH /project/{id|slug}/gallery
POST /project/{id|slug}/gallery

Modrinth allows you to upload files of up to 5MiB to a project's gallery.

operationId: Projects_addGalleryImage

Parameters

Name In Required Type Description
ext query required string Image extension
featured query required boolean Whether an image is featured
title query optional string Title of the image
description query optional string Description of the image
ordering query optional integer Ordering of the image

Request Body

{
  "$ref": "#/components/requestBodies/Image"
}

Responses

204 Expected response to a valid request
400 Request was invalid, see given error
401 Incorrect token scopes or no authorization to access the requested item(s)
404 The requested item(s) were not found or no authorization to access the requested item(s)
POST /project/{id|slug}/gallery
DELETE /project/{id|slug}/icon
operationId: Projects_deleteProjectIcon

Responses

204 Expected response to a valid request
400 Request was invalid, see given error
401 Incorrect token scopes or no authorization to access the requested item(s)
DELETE /project/{id|slug}/icon
PATCH /project/{id|slug}/icon

The new icon may be up to 256KiB in size.

operationId: Projects_changeProjectIcon

Parameters

Name In Required Type Description
ext query required string Image extension

Request Body

{
  "$ref": "#/components/requestBodies/Image"
}

Responses

204 Expected response to a valid request
400 Request was invalid, see given error
PATCH /project/{id|slug}/icon
POST /project/{id|slug}/schedule
operationId: Projects_scheduleProject

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/Schedule"
      }
    }
  },
  "description": "Information about date and requested status"
}

Responses

204 Expected response to a valid request
400 Request was invalid, see given error
401 Incorrect token scopes or no authorization to access the requested item(s)
POST /project/{id|slug}/schedule
GET /projects
operationId: Projects_listProjects

Responses

200 Expected response to a valid request
GET /projects
PATCH /projects
operationId: Projects_bulkEdit

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/PatchProjectsBody"
      }
    }
  },
  "description": "Fields to edit on all projects specified"
}

Responses

204 Expected response to a valid request
400 Request was invalid, see given error
401 Incorrect token scopes or no authorization to access the requested item(s)
PATCH /projects
GET /projects_random
operationId: Projects_getRandomList

Parameters

Name In Required Type Description
count query required integer The number of random projects to return

Responses

200 Expected response to a valid request
400 Request was invalid, see given error
GET /projects_random
GET /search
operationId: Projects_find

Parameters

Name In Required Type Description
query query optional string The query to search for
facets query optional string Facets are an essential concept for understanding how to filter out results. These are the most commonly used facet types: - `project_type` - `categories` (loaders are lumped in with categories in search) - `versions` - `client_side` - `server_side` - `open_source` Several others are also available for use, though these should not be used outside very specific use cases. - `title` - `author` - `follows` - `project_id` - `license` - `downloads` - `color` - `created_timestamp` - `modified_timestamp` In order to then use these facets, you need a value to filter by, as well as an operation to perform on this value. The most common operation is `:` (same as `=`), though you can also use `!=`, `>=`, `>`, `<=`, and `<`. Join together the type, operation, and value, and you've got your string. ``` {type} {operation} {value} ``` Examples: ``` categories = adventure versions != 1.20.1 downloads <= 100 ``` You then join these strings together in arrays to signal `AND` and `OR` operators. ##### OR All elements in a single array are considered to be joined by OR statements. For example, the search `[["versions:1.16.5", "versions:1.17.1"]]` translates to `Projects that support 1.16.5 OR 1.17.1`. ##### AND Separate arrays are considered to be joined by AND statements. For example, the search `[["versions:1.16.5"], ["project_type:modpack"]]` translates to `Projects that support 1.16.5 AND are modpacks`.
index query optional string The sorting method used for sorting search results
offset query optional integer The offset into the search. Skips this number of results
limit query optional integer The number of results returned by the search

Responses

200 Expected response to a valid request
400 Request was invalid, see given error
GET /search

Tags 8 endpoints

GET /tag/category

Gets an array of categories, their icons, and applicable project types

operationId: Tags_listCategoriesWithIcons

Responses

200 Expected response to a valid request
GET /tag/category
GET /tag/donation_platform

Gets an array of donation platforms and information about them

operationId: Tags_listDonationPlatforms

Responses

200 Expected response to a valid request
GET /tag/donation_platform
GET /tag/game_version

Gets an array of game versions and information about them

operationId: Tags_listGameVersions

Responses

200 Expected response to a valid request
GET /tag/game_version
GET /tag/license/{id}
operationId: Tags_getLicenseTextTitle

Responses

200 Expected response to a valid request
400 Request was invalid, see given error
GET /tag/license/{id}
GET /tag/loader

Gets an array of loaders, their icons, and supported project types

operationId: Tags_getLoaderList

Responses

200 Expected response to a valid request
GET /tag/loader
GET /tag/project_type

Gets an array of valid project types

operationId: Tags_listProjectTypes

Responses

200 Expected response to a valid request
GET /tag/project_type
GET /tag/report_type

Gets an array of valid report types

operationId: Tags_listReportTypes

Responses

200 Expected response to a valid request
GET /tag/report_type
GET /tag/side_type

Gets an array of valid side types

operationId: Tags_listSideTypes

Responses

200 Expected response to a valid request
GET /tag/side_type

Teams 8 endpoints

GET /project/{id|slug}/members
operationId: Teams_getProjectMembers

Responses

200 Expected response to a valid request
404 The requested item(s) were not found or no authorization to access the requested item(s)
GET /project/{id|slug}/members
POST /team/{id}/join
operationId: Teams_joinTeam

Responses

204 Expected response to a valid request
401 Incorrect token scopes or no authorization to access the requested item(s)
404 The requested item(s) were not found or no authorization to access the requested item(s)
POST /team/{id}/join
GET /team/{id}/members
operationId: Teams_getTeamMembers

Responses

200 Expected response to a valid request
GET /team/{id}/members
POST /team/{id}/members
operationId: Teams_addUserToTeam

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/UserIdentifier"
      }
    }
  },
  "description": "User to be added (must be the ID, usernames cannot be used here)"
}

Responses

204 Expected response to a valid request
401 Incorrect token scopes or no authorization to access the requested item(s)
404 The requested item(s) were not found or no authorization to access the requested item(s)
POST /team/{id}/members
DELETE /team/{id}/members/{id|username}
operationId: Teams_removeMember

Responses

204 Expected response to a valid request
401 Incorrect token scopes or no authorization to access the requested item(s)
404 The requested item(s) were not found or no authorization to access the requested item(s)
DELETE /team/{id}/members/{id|username}
PATCH /team/{id}/members/{id|username}
operationId: Teams_modifyMemberInfo

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/ModifyTeamMemberBody"
      }
    }
  },
  "description": "Contents to be modified"
}

Responses

204 Expected response to a valid request
401 Incorrect token scopes or no authorization to access the requested item(s)
404 The requested item(s) were not found or no authorization to access the requested item(s)
PATCH /team/{id}/members/{id|username}
PATCH /team/{id}/owner
operationId: Teams_transferOwnership

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/UserIdentifier"
      }
    }
  },
  "description": "New owner's ID"
}

Responses

204 Expected response to a valid request
401 Incorrect token scopes or no authorization to access the requested item(s)
404 The requested item(s) were not found or no authorization to access the requested item(s)
PATCH /team/{id}/owner
GET /teams
operationId: Teams_getMembers

Responses

200 Expected response to a valid request
GET /teams

Threads 9 endpoints

DELETE /message/{id}
operationId: Threads_deleteThreadMessage

Responses

204 Expected response to a valid request
401 Incorrect token scopes or no authorization to access the requested item(s)
404 The requested item(s) were not found or no authorization to access the requested item(s)
DELETE /message/{id}
GET /report
operationId: Threads_getOpenReports

Parameters

Name In Required Type Description
count query optional integer

Responses

200 Expected response to a valid request
401 Incorrect token scopes or no authorization to access the requested item(s)
404 The requested item(s) were not found or no authorization to access the requested item(s)
GET /report
POST /report

Bring a project, user, or version to the attention of the moderators by reporting it.

operationId: Threads_reportProjectUserVersion

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/CreatableReport"
      }
    }
  },
  "description": "The report to be sent"
}

Responses

200 Expected response to a valid request
400 Request was invalid, see given error
401 Incorrect token scopes or no authorization to access the requested item(s)
POST /report
GET /report/{id}
operationId: Threads_getReportById

Responses

200 Expected response to a valid request
401 Incorrect token scopes or no authorization to access the requested item(s)
404 The requested item(s) were not found or no authorization to access the requested item(s)
GET /report/{id}
PATCH /report/{id}
operationId: Threads_modifyReport

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/ThreadsModifyReportRequest"
      }
    }
  },
  "description": "What to modify about the report"
}

Responses

204 Expected response to a valid request
400 Request was invalid, see given error
401 Incorrect token scopes or no authorization to access the requested item(s)
404 The requested item(s) were not found or no authorization to access the requested item(s)
PATCH /report/{id}
GET /reports
operationId: Threads_getMultipleReports

Responses

200 Expected response to a valid request
401 Incorrect token scopes or no authorization to access the requested item(s)
404 The requested item(s) were not found or no authorization to access the requested item(s)
GET /reports
GET /thread/{id}
operationId: Threads_getThreadById

Responses

200 Expected response to a valid request
404 The requested item(s) were not found or no authorization to access the requested item(s)
GET /thread/{id}
POST /thread/{id}
operationId: Threads_sendMessage

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/ThreadMessageBody"
      }
    }
  },
  "description": "The message to be sent. Note that you only need the fields applicable for the `text` type."
}

Responses

200 Expected response to a valid request
400 Request was invalid, see given error
404 The requested item(s) were not found or no authorization to access the requested item(s)
POST /thread/{id}
GET /threads
operationId: Threads_listThreads

Responses

200 Expected response to a valid request
404 The requested item(s) were not found or no authorization to access the requested item(s)
GET /threads

Users 9 endpoints

GET /user
operationId: Users_getUserFromAuthHeader

Responses

200 Expected response to a valid request
401 Incorrect token scopes or no authorization to access the requested item(s)
GET /user
GET /user/{id|username}
operationId: Users_getUserByIdOrUsername

Responses

200 Expected response to a valid request
404 The requested item(s) were not found or no authorization to access the requested item(s)
GET /user/{id|username}
PATCH /user/{id|username}
operationId: Users_modifyUserPatch

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/EditableUser"
      }
    }
  },
  "description": "Modified user fields"
}

Responses

204 Expected response to a valid request
401 Incorrect token scopes or no authorization to access the requested item(s)
404 The requested item(s) were not found or no authorization to access the requested item(s)
PATCH /user/{id|username}
GET /user/{id|username}/follows
operationId: Users_getFollowedProjects

Responses

200 Expected response to a valid request
401 Incorrect token scopes or no authorization to access the requested item(s)
404 The requested item(s) were not found or no authorization to access the requested item(s)
GET /user/{id|username}/follows
PATCH /user/{id|username}/icon

The new avatar may be up to 2MiB in size.

operationId: Users_changeAvatar

Request Body

{
  "$ref": "#/components/requestBodies/Image"
}

Responses

204 Expected response to a valid request
400 Request was invalid, see given error
404 The requested item(s) were not found or no authorization to access the requested item(s)
PATCH /user/{id|username}/icon
GET /user/{id|username}/payouts
operationId: Users_getPayouts

Responses

200 Expected response to a valid request
401 Incorrect token scopes or no authorization to access the requested item(s)
404 The requested item(s) were not found or no authorization to access the requested item(s)
GET /user/{id|username}/payouts
POST /user/{id|username}/payouts

Warning: certain amounts get withheld for fees. Please do not call this API endpoint without first acknowledging the warnings on the corresponding frontend page.

operationId: Users_withdrawPayoutBalanceToPaypal

Parameters

Name In Required Type Description
amount query required integer Amount to withdraw

Responses

204 Expected response to a valid request
401 Incorrect token scopes or no authorization to access the requested item(s)
404 The requested item(s) were not found or no authorization to access the requested item(s)
POST /user/{id|username}/payouts
GET /user/{id|username}/projects
operationId: Users_getUserProjects

Responses

200 Expected response to a valid request
404 The requested item(s) were not found or no authorization to access the requested item(s)
GET /user/{id|username}/projects
GET /users
operationId: Users_getMultipleUsers

Responses

200 Expected response to a valid request
GET /users

Version-files 5 endpoints

DELETE /version_file/{hash}
operationId: Versionfiles_deleteByHash

Parameters

Name In Required Type Description
version_id query optional string Version ID to delete the version from, if multiple files of the same hash exist

Responses

204 Expected response to a valid request
401 Incorrect token scopes or no authorization to access the requested item(s)
404 The requested item(s) were not found or no authorization to access the requested item(s)
DELETE /version_file/{hash}
GET /version_file/{hash}
operationId: Versionfiles_getVersionFromHash

Parameters

Name In Required Type Description
optional

Responses

200 Expected response to a valid request
404 The requested item(s) were not found or no authorization to access the requested item(s)
GET /version_file/{hash}
POST /version_file/{hash}/update
operationId: Versionfiles_updateFromHashes

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/GetLatestVersionFromHashBody"
      }
    }
  },
  "description": "Parameters of the updated version requested"
}

Responses

200 Expected response to a valid request
400 Request was invalid, see given error
404 The requested item(s) were not found or no authorization to access the requested item(s)
POST /version_file/{hash}/update
POST /version_files

This is the same as [`/version_file/{hash}`](https://docs.modrinth.com) except it accepts multiple hashes.

operationId: Versionfiles_getVersionsFromHashes

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/HashList"
      }
    }
  },
  "description": "Hashes and algorithm of the versions requested"
}

Responses

200 Expected response to a valid request
400 Request was invalid, see given error
POST /version_files
POST /version_files/update

This is the same as [`/version_file/{hash}/update`](https://docs.modrinth.com) except it accepts multiple hashes.

operationId: Versionfiles_updateMultipleVersions

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/GetLatestVersionsFromHashesBody"
      }
    }
  },
  "description": "Parameters of the updated version requested"
}

Responses

200 Expected response to a valid request
400 Request was invalid, see given error
POST /version_files/update

Versions 9 endpoints

GET /project/{id|slug}/version
operationId: Versions_listProjectVersions

Parameters

Name In Required Type Description
loaders query optional string The types of loaders to filter for
game_versions query optional string The game versions to filter for
featured query optional boolean Allows to filter for featured or non-featured versions only

Responses

200 Expected response to a valid request
404 The requested item(s) were not found or no authorization to access the requested item(s)
GET /project/{id|slug}/version
GET /project/{id|slug}/version/{id|number}

Please note that, if the version number provided matches multiple versions, only the **oldest matching version** will be returned.

operationId: Versions_getByVersionIdOrNumber

Responses

200 Expected response to a valid request
404 The requested item(s) were not found or no authorization to access the requested item(s)
GET /project/{id|slug}/version/{id|number}
POST /version

This route creates a version on an existing project. There must be at least one file attached to each new version, unless the new version's status is `draft`. `.mrpack`, `.jar`, `.zip`, and `.litemod` files are accepted. The request is a [multipart request](https://www.ietf.org/rfc/rfc2388.txt) with at least two form fields: one is `data`, which includes a JSON body with the version metadata as shown below, and at least one field containing an upload file. You can name the file parts anything you would like, but you must list each of the parts' names in `file_parts`, and optionally, provide one to use as the primary file in `primary_file`.

operationId: Versions_createNewVersion

Request Body

{
  "content": {
    "multipart/form-data": {
      "schema": {
        "$ref": "#/components/schemas/CreateVersionBody"
      }
    }
  },
  "description": "New version"
}

Responses

200 Expected response to a valid request
400 Request was invalid, see given error
401 Incorrect token scopes or no authorization to access the requested item(s)
POST /version
DELETE /version/{id}
operationId: Versions_deleteVersionById

Responses

204 Expected response to a valid request
401 Incorrect token scopes or no authorization to access the requested item(s)
404 The requested item(s) were not found or no authorization to access the requested item(s)
DELETE /version/{id}
GET /version/{id}
operationId: Versions_getById

Responses

200 Expected response to a valid request
404 The requested item(s) were not found or no authorization to access the requested item(s)
GET /version/{id}
PATCH /version/{id}
operationId: Versions_modifyVersionById

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/EditableVersion"
      }
    }
  },
  "description": "Modified version fields"
}

Responses

204 Expected response to a valid request
401 Incorrect token scopes or no authorization to access the requested item(s)
404 The requested item(s) were not found or no authorization to access the requested item(s)
PATCH /version/{id}
POST /version/{id}/file

Project files are attached. `.mrpack` and `.jar` files are accepted.

operationId: Versions_addFilesToVersion

Request Body

{
  "content": {
    "multipart/form-data": {
      "schema": {
        "$ref": "#/components/schemas/VersionsAddFilesToVersionRequest"
      }
    }
  },
  "description": "New version files"
}

Responses

204 Expected response to a valid request
401 Incorrect token scopes or no authorization to access the requested item(s)
404 The requested item(s) were not found or no authorization to access the requested item(s)
POST /version/{id}/file
POST /version/{id}/schedule
operationId: Versions_scheduleVersion

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/Schedule"
      }
    }
  },
  "description": "Information about date and requested status"
}

Responses

204 Expected response to a valid request
400 Request was invalid, see given error
401 Incorrect token scopes or no authorization to access the requested item(s)
POST /version/{id}/schedule
GET /versions
operationId: Versions_list

Responses

200 Expected response to a valid request
GET /versions

Schemas

object AuthError
{
  "type": "object",
  "required": [
    "error",
    "description"
  ],
  "properties": {
    "error": {
      "type": "string",
      "example": "unauthorized",
      "description": "The name of the error"
    },
    "description": {
      "type": "string",
      "example": "Authentication Error: Invalid Authentication Credentials",
      "description": "The contents of the error"
    }
  }
}
object BaseProject
{
  "type": "object",
  "properties": {
    "slug": {
      "type": "string",
      "example": "my_project",
      "description": "The slug of a project, used for vanity URLs. Regex: ```^[\\w!@$()`.+,\"\\-']{3,64}$```"
    },
    "title": {
      "type": "string",
      "example": "My Project",
      "description": "The title or name of the project"
    },
    "categories": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "example": [
        "technology",
        "adventure",
        "fabric"
      ],
      "description": "A list of the categories that the project has"
    },
    "client_side": {
      "enum": [
        "required",
        "optional",
        "unsupported"
      ],
      "type": "string",
      "example": "required",
      "description": "The client side support of the project"
    },
    "description": {
      "type": "string",
      "example": "A short description",
      "description": "A short description of the project"
    },
    "server_side": {
      "enum": [
        "required",
        "optional",
        "unsupported"
      ],
      "type": "string",
      "example": "optional",
      "description": "The server side support of the project"
    }
  }
}
object BaseVersion
{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "example": "Version 1.0.0",
      "description": "The name of this version"
    },
    "status": {
      "enum": [
        "listed",
        "archived",
        "draft",
        "unlisted",
        "scheduled",
        "unknown"
      ],
      "type": "string",
      "example": "listed"
    },
    "loaders": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "example": [
        "fabric",
        "forge"
      ],
      "description": "The mod loaders that this version supports"
    },
    "featured": {
      "type": "boolean",
      "example": true,
      "description": "Whether the version is featured or not"
    },
    "changelog": {
      "type": "string",
      "example": "List of changes in this version: ...",
      "nullable": true,
      "description": "The changelog for this version"
    },
    "dependencies": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/VersionDependency"
      },
      "description": "A list of specific versions of projects that this version depends on"
    },
    "version_type": {
      "enum": [
        "release",
        "beta",
        "alpha"
      ],
      "type": "string",
      "example": "release",
      "description": "The release channel for this version"
    },
    "game_versions": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "example": [
        "1.16.5",
        "1.17.1"
      ],
      "description": "A list of versions of Minecraft that this version supports"
    },
    "version_number": {
      "type": "string",
      "example": "1.0.0",
      "description": "The version number. Ideally will follow semantic versioning"
    },
    "requested_status": {
      "enum": [
        "listed",
        "archived",
        "draft",
        "unlisted"
      ],
      "type": "string",
      "nullable": true
    }
  }
}
object CategoryTag
{
  "type": "object",
  "required": [
    "icon",
    "name",
    "project_type",
    "header"
  ],
  "properties": {
    "icon": {
      "type": "string",
      "example": "<svg></svg>",
      "description": "The SVG icon of a category"
    },
    "name": {
      "type": "string",
      "example": "adventure",
      "description": "The name of the category"
    },
    "header": {
      "type": "string",
      "example": "resolutions",
      "description": "The header under which the category should go"
    },
    "project_type": {
      "type": "string",
      "example": "mod",
      "description": "The project type this category is applicable to"
    }
  }
}
object CreatableProject
{
  "allOf": [
    {
      "$ref": "#/components/schemas/ModifiableProject"
    },
    {
      "type": "object",
      "required": [
        "project_type",
        "slug",
        "title",
        "description",
        "body",
        "categories",
        "client_side",
        "server_side",
        "license_id"
      ],
      "properties": {
        "is_draft": {
          "type": "boolean",
          "example": true,
          "deprecated": true,
          "description": "Whether the project should be saved as a draft instead of being sent to moderation for review. Deprecated - please always mark this as true."
        },
        "project_type": {
          "enum": [
            "mod",
            "modpack"
          ],
          "type": "string",
          "example": "modpack"
        },
        "gallery_items": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/CreatableProjectGalleryItem"
          },
          "deprecated": true,
          "description": "Gallery images to be uploaded with the created project. Deprecated - please upload gallery images after initial upload."
        },
        "initial_versions": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/EditableVersion"
          },
          "deprecated": true,
          "description": "A list of initial versions to upload with the created project. Deprecated - please upload version files after initial upload."
        }
      }
    }
  ]
}
object CreatableProjectGalleryItem
{
  "type": "object",
  "nullable": true,
  "properties": {
    "item": {
      "type": "string",
      "description": "The name of the multipart item where the gallery media is located"
    },
    "title": {
      "type": "string",
      "example": "My awesome screenshot!",
      "nullable": true,
      "description": "The title of the gallery image"
    },
    "featured": {
      "type": "boolean",
      "example": true,
      "description": "Whether the image is featured in the gallery"
    },
    "ordering": {
      "type": "integer",
      "example": 0,
      "description": "The order of the gallery image. Gallery images are sorted by this field and then alphabetically by title."
    },
    "description": {
      "type": "string",
      "example": "This awesome screenshot shows all of the blocks in my mod!",
      "nullable": true,
      "description": "The description of the gallery image"
    }
  }
}
object CreatableReport
{
  "type": "object",
  "required": [
    "report_type",
    "item_id",
    "item_type",
    "body"
  ],
  "properties": {
    "body": {
      "type": "string",
      "example": "This is a reupload of my mod, AABBCCDD!",
      "description": "The extended explanation of the report"
    },
    "item_id": {
      "type": "string",
      "example": "EEFFGGHH",
      "description": "The ID of the item (project, version, or user) being reported"
    },
    "item_type": {
      "enum": [
        "project",
        "user",
        "version"
      ],
      "type": "string",
      "example": "project",
      "description": "The type of the item being reported"
    },
    "report_type": {
      "type": "string",
      "example": "copyright",
      "description": "The type of the report being sent"
    }
  }
}
object CreatableVersion
{
  "allOf": [
    {
      "$ref": "#/components/schemas/BaseVersion"
    },
    {
      "type": "object",
      "required": [
        "file_parts",
        "project_id",
        "name",
        "version_number",
        "game_versions",
        "version_type",
        "loaders",
        "featured",
        "dependencies"
      ],
      "properties": {
        "file_parts": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "An array of the multipart field names of each file that goes with this version"
        },
        "project_id": {
          "type": "string",
          "example": "AABBCCDD",
          "description": "The ID of the project this version is for"
        },
        "primary_file": {
          "type": "string",
          "description": "The multipart field name of the primary file"
        }
      }
    }
  ]
}
object CreateProjectBody
{
  "type": "object",
  "required": [
    "data"
  ],
  "properties": {
    "data": {
      "$ref": "#/components/schemas/CreatableProject"
    },
    "icon": {
      "enum": [
        "*.png",
        "*.jpg",
        "*.jpeg",
        "*.bmp",
        "*.gif",
        "*.webp",
        "*.svg",
        "*.svgz",
        "*.rgb"
      ],
      "type": "string",
      "format": "binary",
      "description": "Project icon file"
    }
  }
}
object CreateVersionBody
{
  "type": "object",
  "required": [
    "data"
  ],
  "properties": {
    "data": {
      "$ref": "#/components/schemas/CreatableVersion"
    }
  }
}
object DonationPlatformTag
{
  "type": "object",
  "required": [
    "short",
    "name"
  ],
  "properties": {
    "name": {
      "type": "string",
      "example": "Buy Me a Coffee",
      "description": "The full name of the donation platform"
    },
    "short": {
      "type": "string",
      "example": "bmac",
      "description": "The short identifier of the donation platform"
    }
  }
}
object EditableFileType
{
  "type": "object",
  "required": [
    "algorithm",
    "hash",
    "file_type"
  ],
  "properties": {
    "hash": {
      "type": "string",
      "example": "aaaabbbbccccddddeeeeffffgggghhhhiiiijjjj",
      "description": "The hash of the file you're editing"
    },
    "algorithm": {
      "type": "string",
      "example": "sha1",
      "description": "The hash algorithm of the hash specified in the hash field"
    },
    "file_type": {
      "enum": [
        "required-resource-pack",
        "optional-resource-pack"
      ],
      "type": "string",
      "example": "required-resource-pack",
      "nullable": true,
      "description": "The hash algorithm of the file you're editing"
    }
  }
}
object EditableProject
{
  "allOf": [
    {
      "$ref": "#/components/schemas/ModifiableProject"
    },
    {
      "type": "object",
      "properties": {
        "moderation_message": {
          "type": "string",
          "nullable": true,
          "description": "The title of the moderators' message for the project"
        },
        "moderation_message_body": {
          "type": "string",
          "nullable": true,
          "description": "The body of the moderators' message for the project"
        }
      }
    }
  ]
}
object EditableUser
{
  "type": "object",
  "required": [
    "username"
  ],
  "properties": {
    "bio": {
      "type": "string",
      "example": "My short biography",
      "description": "A description of the user"
    },
    "name": {
      "type": "string",
      "example": "My User",
      "nullable": true,
      "description": "The user's display name"
    },
    "email": {
      "type": "string",
      "format": "email",
      "nullable": true,
      "description": "The user's email (only displayed if requesting your own account). Requires `USER_READ_EMAIL` PAT scope."
    },
    "username": {
      "type": "string",
      "example": "my_user",
      "description": "The user's username"
    },
    "payout_data": {
      "$ref": "#/components/schemas/UserPayoutData"
    }
  }
}
object EditableVersion
{
  "allOf": [
    {
      "$ref": "#/components/schemas/BaseVersion"
    },
    {
      "type": "object",
      "properties": {
        "file_types": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/EditableFileType"
          },
          "description": "A list of file_types to edit"
        },
        "primary_file": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "example": [
            "sha1",
            "aaaabbbbccccddddeeeeffffgggghhhhiiiijjjj"
          ],
          "description": "The hash format and the hash of the new primary file"
        }
      }
    }
  ]
}
object ForgeUpdateCheckerPromos
{
  "type": "object",
  "properties": {
    "{version}-latest": {
      "type": "string",
      "description": "The latest mod version for `{version}`. Shows versions with the `alpha` and `beta` version types."
    },
    "{version}-recommended": {
      "type": "string",
      "description": "The mod version that is recommended for `{version}`. Excludes versions with the `alpha` and `beta` version types."
    }
  },
  "description": "A list of the recommended and latest versions for each Minecraft release"
}
object ForgeUpdates
{
  "type": "object",
  "properties": {
    "promos": {
      "$ref": "#/components/schemas/ForgeUpdateCheckerPromos"
    },
    "homepage": {
      "type": "string",
      "example": "https://modrinth.com",
      "description": "A link to the mod page"
    }
  },
  "description": "Mod version information that can be consumed by Forge's update checker"
}
object GalleryImage
{
  "type": "object",
  "nullable": true,
  "required": [
    "url",
    "featured",
    "created"
  ],
  "properties": {
    "url": {
      "type": "string",
      "example": "https://cdn.modrinth.com/data/AABBCCDD/images/009b7d8d6e8bf04968a29421117c59b3efe2351a.png",
      "description": "The URL of the gallery image"
    },
    "title": {
      "type": "string",
      "example": "My awesome screenshot!",
      "nullable": true,
      "description": "The title of the gallery image"
    },
    "created": {
      "type": "string",
      "format": "ISO-8601",
      "description": "The date and time the gallery image was created"
    },
    "featured": {
      "type": "boolean",
      "example": true,
      "description": "Whether the image is featured in the gallery"
    },
    "ordering": {
      "type": "integer",
      "example": 0,
      "description": "The order of the gallery image. Gallery images are sorted by this field and then alphabetically by title."
    },
    "description": {
      "type": "string",
      "example": "This awesome screenshot shows all of the blocks in my mod!",
      "nullable": true,
      "description": "The description of the gallery image"
    }
  }
}
object GameVersionTag
{
  "type": "object",
  "required": [
    "version",
    "version_type",
    "date",
    "major"
  ],
  "properties": {
    "date": {
      "type": "string",
      "format": "ISO-8601",
      "description": "The date of the game version release"
    },
    "major": {
      "type": "boolean",
      "example": true,
      "description": "Whether or not this is a major version, used for Featured Versions"
    },
    "version": {
      "type": "string",
      "example": "1.18.1",
      "description": "The name/number of the game version"
    },
    "version_type": {
      "enum": [
        "release",
        "snapshot",
        "alpha",
        "beta"
      ],
      "type": "string",
      "example": "release",
      "description": "The type of the game version"
    }
  }
}
object GetLatestVersionFromHashBody
{
  "type": "object",
  "required": [
    "loaders",
    "game_versions"
  ],
  "properties": {
    "loaders": {
      "type": "array",
      "items": {
        "type": "string",
        "example": [
          "fabric"
        ]
      }
    },
    "game_versions": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "example": [
        "1.18",
        "1.18.1"
      ]
    }
  }
}
object GetLatestVersionsFromHashesBody
{
  "allOf": [
    {
      "$ref": "#/components/schemas/HashList"
    },
    {
      "type": "object",
      "required": [
        "loaders",
        "game_versions"
      ],
      "properties": {
        "loaders": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "example": [
            "fabric"
          ]
        },
        "game_versions": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "example": [
            "1.18",
            "1.18.1"
          ]
        }
      }
    }
  ]
}
object HashList
{
  "type": "object",
  "required": [
    "hashes",
    "algorithm"
  ],
  "properties": {
    "hashes": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "example": [
        "ea0f38408102e4d2efd53c2cc11b88b711996b48d8922f76ea6abf731219c5bd1efe39ddf9cce77c54d49a62ff10fb685c00d2e4c524ab99d20f6296677ab2c4",
        "925a5c4899affa4098d997dfa4a4cb52c636d539e94bc489d1fa034218cb96819a70eb8b01647a39316a59fcfe223c1a8c05ed2e2ae5f4c1e75fa48f6af1c960"
      ]
    },
    "algorithm": {
      "enum": [
        "sha1",
        "sha512"
      ],
      "type": "string",
      "example": "sha512"
    }
  },
  "description": "A list of hashes and the algorithm used to create them"
}
object HashVersionMap
{
  "type": "object",
  "description": "A map from hashes to versions",
  "additionalProperties": {
    "$ref": "#/components/schemas/Version"
  }
}
object InvalidInputError
{
  "type": "object",
  "required": [
    "error",
    "description"
  ],
  "properties": {
    "error": {
      "type": "string",
      "example": "invalid_input",
      "description": "The name of the error"
    },
    "description": {
      "type": "string",
      "example": "Error while parsing multipart payload",
      "description": "The contents of the error"
    }
  }
}
object License
{
  "type": "object",
  "properties": {
    "body": {
      "type": "string",
      "example": "Insert the entire text of the LGPL-3.0 here..."
    },
    "title": {
      "type": "string",
      "example": "GNU Lesser General Public License v3.0 or later"
    }
  },
  "description": "A full license"
}
object LicenseTag
{
  "type": "object",
  "required": [
    "short",
    "name"
  ],
  "properties": {
    "name": {
      "type": "string",
      "example": "GNU Lesser General Public License v3",
      "description": "The full name of the license"
    },
    "short": {
      "type": "string",
      "example": "lgpl-3",
      "description": "The short identifier of the license"
    }
  },
  "description": "A short overview of a license"
}
object LoaderTag
{
  "type": "object",
  "required": [
    "icon",
    "name",
    "supported_project_types"
  ],
  "properties": {
    "icon": {
      "type": "string",
      "example": "<svg></svg>",
      "description": "The SVG icon of a loader"
    },
    "name": {
      "type": "string",
      "example": "fabric",
      "description": "The name of the loader"
    },
    "supported_project_types": {
      "type": "array",
      "items": {
        "type": "string",
        "description": "The project type"
      },
      "example": [
        "mod",
        "modpack"
      ],
      "description": "The project types that this loader is applicable to"
    }
  }
}
object ModeratorMessage
{
  "type": "object",
  "example": null,
  "nullable": true,
  "deprecated": true,
  "properties": {
    "body": {
      "type": "string",
      "nullable": true,
      "description": "The longer body of the message that a moderator has left for the project"
    },
    "message": {
      "type": "string",
      "description": "The message that a moderator has left for the project"
    }
  },
  "description": "A message that a moderator sent regarding the project"
}
object ModifiableProject
{
  "allOf": [
    {
      "$ref": "#/components/schemas/NonSearchProject"
    },
    {
      "type": "object",
      "properties": {
        "license_id": {
          "type": "string",
          "example": "LGPL-3.0-or-later",
          "description": "The SPDX license ID of a project"
        },
        "license_url": {
          "type": "string",
          "nullable": true,
          "description": "The URL to this license"
        }
      }
    }
  ]
}
object ModifyTeamMemberBody
{
  "properties": {
    "role": {
      "type": "string",
      "example": "Contributor"
    },
    "ordering": {
      "type": "integer",
      "example": 0,
      "description": "The order of the team member."
    },
    "permissions": {
      "type": "integer",
      "format": "bitfield",
      "example": 127,
      "description": "The user's permissions in bitfield format\n\nIn order from first to tenth bit, the bits are:\n- UPLOAD_VERSION\n- DELETE_VERSION\n- EDIT_DETAILS\n- EDIT_BODY\n- MANAGE_INVITES\n- REMOVE_MEMBER\n- EDIT_MEMBER\n- DELETE_PROJECT\n- VIEW_ANALYTICS\n- VIEW_PAYOUTS\n"
    },
    "payouts_split": {
      "type": "integer",
      "example": 100,
      "description": "The split of payouts going to this user. The proportion of payouts they get is their split divided by the sum of the splits of all members."
    }
  }
}
object NonSearchProject
{
  "allOf": [
    {
      "$ref": "#/components/schemas/BaseProject"
    },
    {
      "type": "object",
      "properties": {
        "body": {
          "type": "string",
          "example": "A long body describing my project in detail",
          "description": "A long form description of the project"
        },
        "status": {
          "enum": [
            "approved",
            "archived",
            "rejected",
            "draft",
            "unlisted",
            "processing",
            "withheld",
            "scheduled",
            "private",
            "unknown"
          ],
          "type": "string",
          "example": "approved",
          "description": "The status of the project"
        },
        "wiki_url": {
          "type": "string",
          "example": "https://github.com/my_user/my_project/wiki",
          "nullable": true,
          "description": "An optional link to the project's wiki page or other relevant information"
        },
        "issues_url": {
          "type": "string",
          "example": "https://github.com/my_user/my_project/issues",
          "nullable": true,
          "description": "An optional link to where to submit bugs or issues with the project"
        },
        "source_url": {
          "type": "string",
          "example": "https://github.com/my_user/my_project",
          "nullable": true,
          "description": "An optional link to the source code of the project"
        },
        "discord_url": {
          "type": "string",
          "example": "https://discord.gg/AaBbCcDd",
          "nullable": true,
          "description": "An optional invite link to the project's discord"
        },
        "donation_urls": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/ProjectDonationURL"
          },
          "description": "A list of donation links for the project"
        },
        "requested_status": {
          "enum": [
            "approved",
            "archived",
            "unlisted",
            "private",
            "draft"
          ],
          "type": "string",
          "nullable": true,
          "description": "The requested status when submitting for review or scheduling the project for release"
        },
        "additional_categories": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "example": [
            "technology",
            "adventure",
            "fabric"
          ],
          "description": "A list of categories which are searchable but non-primary"
        }
      }
    }
  ]
}
object Notification
{
  "type": "object",
  "required": [
    "id",
    "user_id",
    "title",
    "text",
    "link",
    "read",
    "created",
    "actions"
  ],
  "properties": {
    "id": {
      "type": "string",
      "example": "UUVVWWXX",
      "description": "The id of the notification"
    },
    "link": {
      "type": "string",
      "example": "mod/AABBCCDD/version/IIJJKKLL",
      "description": "A link to the related project or version"
    },
    "read": {
      "type": "boolean",
      "example": false,
      "description": "Whether the notification has been read or not"
    },
    "text": {
      "type": "string",
      "example": "The project, My Project, has released a new version: 1.0.0",
      "description": "The body text of the notification"
    },
    "type": {
      "enum": [
        "project_update",
        "team_invite",
        "status_change",
        "moderator_message"
      ],
      "type": "string",
      "example": "project_update",
      "nullable": true,
      "description": "The type of notification"
    },
    "title": {
      "type": "string",
      "example": "**My Project** has been updated!",
      "description": "The title of the notification"
    },
    "actions": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/NotificationAction"
      },
      "description": "A list of actions that can be performed"
    },
    "created": {
      "type": "string",
      "format": "ISO-8601",
      "description": "The time at which the notification was created"
    },
    "user_id": {
      "type": "string",
      "example": "EEFFGGHH",
      "description": "The id of the user who received the notification"
    }
  }
}
object NotificationAction
{
  "type": "object",
  "properties": {
    "title": {
      "type": "string",
      "example": "Accept",
      "description": "The friendly name for this action"
    },
    "action_route": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "example": [
        "POST",
        "team/{id}/join"
      ],
      "description": "The HTTP code and path to request in order to perform this action."
    }
  },
  "description": "An action that can be performed on a notification"
}
array NotificationsGetMultipleResponse
{
  "type": "array",
  "items": {
    "$ref": "#/components/schemas/Notification"
  }
}
array NotificationsGetUserNotificationsResponse
{
  "type": "array",
  "items": {
    "$ref": "#/components/schemas/Notification"
  }
}
object PatchProjectsBody
{
  "type": "object",
  "properties": {
    "wiki_url": {
      "type": "string",
      "example": "https://github.com/my_user/my_project/wiki",
      "nullable": true,
      "description": "An optional link to the projects' wiki page or other relevant information"
    },
    "categories": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Set all of the categories to the categories specified here"
    },
    "issues_url": {
      "type": "string",
      "example": "https://github.com/my_user/my_project/issues",
      "nullable": true,
      "description": "An optional link to where to submit bugs or issues with the projects"
    },
    "source_url": {
      "type": "string",
      "example": "https://github.com/my_user/my_project",
      "nullable": true,
      "description": "An optional link to the source code of the projects"
    },
    "discord_url": {
      "type": "string",
      "example": "https://discord.gg/AaBbCcDd",
      "nullable": true,
      "description": "An optional invite link to the projects' discord"
    },
    "donation_urls": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/ProjectDonationURL"
      },
      "description": "Set all of the donation links to the donation links specified here"
    },
    "add_categories": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Add all of the categories specified here"
    },
    "add_donation_urls": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/ProjectDonationURL"
      },
      "description": "Add all of the donation links specified here"
    },
    "remove_categories": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Remove all of the categories specified here"
    },
    "remove_donation_urls": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/ProjectDonationURL"
      },
      "description": "Remove all of the donation links specified here"
    },
    "additional_categories": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Set all of the additional categories to the categories specified here"
    },
    "add_additional_categories": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Add all of the additional categories specified here"
    },
    "remove_additional_categories": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Remove all of the additional categories specified here"
    }
  }
}
object Project
{
  "allOf": [
    {
      "$ref": "#/components/schemas/NonSearchProject"
    },
    {
      "$ref": "#/components/schemas/ServerRenderedProject"
    },
    {
      "type": "object",
      "required": [
        "id",
        "team",
        "published",
        "updated",
        "followers",
        "title",
        "description",
        "categories",
        "client_side",
        "server_side",
        "slug",
        "body",
        "status"
      ],
      "properties": {
        "id": {
          "type": "string",
          "example": "AABBCCDD",
          "description": "The ID of the project, encoded as a base62 string"
        },
        "team": {
          "type": "string",
          "example": "MMNNOOPP",
          "description": "The ID of the team that has ownership of this project"
        },
        "queued": {
          "type": "string",
          "format": "ISO-8601",
          "nullable": true,
          "description": "The date the project's status was submitted to moderators for review"
        },
        "gallery": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/GalleryImage"
          },
          "description": "A list of images that have been uploaded to the project's gallery"
        },
        "license": {
          "$ref": "#/components/schemas/ProjectLicense"
        },
        "loaders": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "example": [
            "forge",
            "fabric",
            "quilt"
          ],
          "description": "A list of all of the loaders supported by the project"
        },
        "updated": {
          "type": "string",
          "format": "ISO-8601",
          "description": "The date the project was last updated"
        },
        "approved": {
          "type": "string",
          "format": "ISO-8601",
          "nullable": true,
          "description": "The date the project's status was set to an approved status"
        },
        "body_url": {
          "type": "string",
          "default": null,
          "example": null,
          "nullable": true,
          "deprecated": true,
          "description": "The link to the long description of the project. Always null, only kept for legacy compatibility."
        },
        "versions": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "example": [
            "IIJJKKLL",
            "QQRRSSTT"
          ],
          "description": "A list of the version IDs of the project (will never be empty unless `draft` status)"
        },
        "followers": {
          "type": "integer",
          "description": "The total number of users following the project"
        },
        "published": {
          "type": "string",
          "format": "ISO-8601",
          "description": "The date the project was published"
        },
        "game_versions": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "example": [
            "1.19",
            "1.19.1",
            "1.19.2",
            "1.19.3"
          ],
          "description": "A list of all of the game versions supported by the project"
        },
        "moderator_message": {
          "$ref": "#/components/schemas/ModeratorMessage"
        }
      }
    }
  ]
}
object ProjectDependencyList
{
  "type": "object",
  "properties": {
    "projects": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/Project"
      },
      "description": "Projects that the project depends upon"
    },
    "versions": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/Version"
      },
      "description": "Versions that the project depends upon"
    }
  }
}
object ProjectDonationURL
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "example": "patreon",
      "description": "The ID of the donation platform"
    },
    "url": {
      "type": "string",
      "example": "https://www.patreon.com/my_user",
      "description": "The URL of the donation platform and user"
    },
    "platform": {
      "type": "string",
      "example": "Patreon",
      "description": "The donation platform this link is to"
    }
  }
}
object ProjectIdentifier
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "example": "AABBCCDD"
    }
  }
}
object ProjectLicense
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "example": "LGPL-3.0-or-later",
      "description": "The SPDX license ID of a project"
    },
    "url": {
      "type": "string",
      "nullable": true,
      "description": "The URL to this license"
    },
    "name": {
      "type": "string",
      "example": "GNU Lesser General Public License v3 or later",
      "description": "The long name of a license"
    }
  },
  "description": "The license of the project"
}
object ProjectResult
{
  "allOf": [
    {
      "$ref": "#/components/schemas/ServerRenderedProject"
    },
    {
      "type": "object",
      "required": [
        "slug",
        "title",
        "description",
        "client_side",
        "server_side",
        "project_id",
        "author",
        "versions",
        "follows",
        "date_created",
        "date_modified",
        "license"
      ],
      "properties": {
        "author": {
          "type": "string",
          "example": "my_user",
          "description": "The username of the project's author"
        },
        "follows": {
          "type": "integer",
          "description": "The total number of users following the project"
        },
        "gallery": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "example": [
            "https://cdn.modrinth.com/data/AABBCCDD/images/009b7d8d6e8bf04968a29421117c59b3efe2351a.png",
            "https://cdn.modrinth.com/data/AABBCCDD/images/c21776867afb6046fdc3c21dbcf5cc50ae27a236.png"
          ],
          "description": "All gallery images attached to the project"
        },
        "license": {
          "type": "string",
          "example": "MIT",
          "description": "The SPDX license ID of a project"
        },
        "versions": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "example": [
            "1.8",
            "1.8.9"
          ],
          "description": "A list of the minecraft versions supported by the project"
        },
        "project_id": {
          "type": "string",
          "example": "AABBCCDD",
          "description": "The ID of the project"
        },
        "date_created": {
          "type": "string",
          "format": "ISO-8601",
          "description": "The date the project was added to search"
        },
        "date_modified": {
          "type": "string",
          "format": "ISO-8601",
          "description": "The date the project was last modified"
        },
        "latest_version": {
          "type": "string",
          "example": "1.8.9",
          "description": "The latest version of minecraft that this project supports"
        },
        "featured_gallery": {
          "type": "string",
          "nullable": true,
          "description": "The featured gallery image of the project"
        },
        "display_categories": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "example": [
            "technology",
            "fabric"
          ],
          "description": "A list of the categories that the project has which are not secondary"
        }
      }
    }
  ]
}
string ProjectsChangeProjectIconRequest
{
  "type": "string",
  "format": "binary"
}
string ProjectsChangeProjectIconRequest1
{
  "type": "string",
  "format": "binary"
}
string ProjectsChangeProjectIconRequest2
{
  "type": "string",
  "format": "binary"
}
string ProjectsChangeProjectIconRequest3
{
  "type": "string",
  "format": "binary"
}
string ProjectsChangeProjectIconRequest4
{
  "type": "string",
  "format": "binary"
}
string ProjectsChangeProjectIconRequest5
{
  "type": "string",
  "format": "binary"
}
string ProjectsChangeProjectIconRequest6
{
  "type": "string",
  "format": "binary"
}
string ProjectsChangeProjectIconRequest7
{
  "type": "string",
  "format": "binary"
}
array ProjectsGetRandomListResponse
{
  "type": "array",
  "items": {
    "$ref": "#/components/schemas/Project"
  }
}
array ProjectsListProjectsResponse
{
  "type": "array",
  "items": {
    "$ref": "#/components/schemas/Project"
  }
}
object Report
{
  "type": "object",
  "allOf": [
    {
      "$ref": "#/components/schemas/CreatableReport"
    },
    {
      "type": "object",
      "required": [
        "reporter",
        "created",
        "closed",
        "thread_id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "example": "VVWWXXYY",
          "description": "The ID of the report"
        },
        "closed": {
          "type": "boolean",
          "description": "Whether the report is resolved"
        },
        "created": {
          "type": "string",
          "format": "ISO-8601",
          "description": "The time at which the report was created"
        },
        "reporter": {
          "type": "string",
          "example": "UUVVWWXX",
          "description": "The ID of the user who reported the item"
        },
        "thread_id": {
          "type": "string",
          "example": "TTUUVVWW",
          "description": "The ID of the moderation thread associated with this report"
        }
      }
    }
  ]
}
object Schedule
{
  "type": "object",
  "required": [
    "time",
    "requested_status"
  ],
  "properties": {
    "time": {
      "type": "string",
      "format": "ISO-8601",
      "example": "2023-02-05T19:39:55.551839Z"
    },
    "requested_status": {
      "enum": [
        "approved",
        "archived",
        "unlisted",
        "private",
        "draft"
      ],
      "type": "string",
      "description": "The requested status when scheduling the project for release"
    }
  }
}
object SearchResults
{
  "type": "object",
  "required": [
    "hits",
    "offset",
    "limit",
    "total_hits"
  ],
  "properties": {
    "hits": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/ProjectResult"
      },
      "description": "The list of results"
    },
    "limit": {
      "type": "integer",
      "example": 10,
      "description": "The number of results that were returned by the query"
    },
    "offset": {
      "type": "integer",
      "example": 0,
      "description": "The number of results that were skipped by the query"
    },
    "total_hits": {
      "type": "integer",
      "example": 10,
      "description": "The total number of results that match the query"
    }
  }
}
object ServerRenderedProject
{
  "allOf": [
    {
      "$ref": "#/components/schemas/BaseProject"
    },
    {
      "type": "object",
      "required": [
        "project_type",
        "downloads"
      ],
      "properties": {
        "color": {
          "type": "integer",
          "example": 8703084,
          "nullable": true,
          "description": "The RGB color of the project, automatically generated from the project icon"
        },
        "icon_url": {
          "type": "string",
          "example": "https://cdn.modrinth.com/data/AABBCCDD/b46513nd83hb4792a9a0e1fn28fgi6090c1842639.png",
          "nullable": true,
          "description": "The URL of the project's icon"
        },
        "downloads": {
          "type": "integer",
          "description": "The total number of downloads of the project"
        },
        "thread_id": {
          "type": "string",
          "example": "TTUUVVWW",
          "description": "The ID of the moderation thread associated with this project"
        },
        "project_type": {
          "enum": [
            "mod",
            "modpack",
            "resourcepack",
            "shader"
          ],
          "type": "string",
          "example": "mod",
          "description": "The project type of the project"
        },
        "monetization_status": {
          "enum": [
            "monetized",
            "demonetized",
            "force-demonetized"
          ],
          "type": "string"
        }
      }
    }
  ]
}
object Statistics
{
  "type": "object",
  "properties": {
    "files": {
      "type": "integer",
      "description": "Number of version files on Modrinth"
    },
    "authors": {
      "type": "integer",
      "description": "Number of authors (users with projects) on Modrinth"
    },
    "projects": {
      "type": "integer",
      "description": "Number of projects on Modrinth"
    },
    "versions": {
      "type": "integer",
      "description": "Number of projects on Modrinth"
    }
  }
}
array TagsGetLoaderListResponse
{
  "type": "array",
  "items": {
    "$ref": "#/components/schemas/LoaderTag"
  }
}
array TagsListCategoriesWithIconsResponse
{
  "type": "array",
  "items": {
    "$ref": "#/components/schemas/CategoryTag"
  }
}
array TagsListDonationPlatformsResponse
{
  "type": "array",
  "items": {
    "$ref": "#/components/schemas/DonationPlatformTag"
  }
}
array TagsListGameVersionsResponse
{
  "type": "array",
  "items": {
    "$ref": "#/components/schemas/GameVersionTag"
  }
}
array TagsListLicensesResponse
{
  "type": "array",
  "items": {
    "$ref": "#/components/schemas/LicenseTag"
  }
}
array TagsListProjectTypesResponse
{
  "type": "array",
  "items": {
    "type": "string"
  },
  "example": [
    "mod",
    "modpack",
    "resourcepack",
    "shader"
  ]
}
array TagsListReportTypesResponse
{
  "type": "array",
  "items": {
    "type": "string"
  },
  "example": [
    "spam",
    "copyright",
    "inappropriate",
    "malicious",
    "name-squatting",
    "other"
  ]
}
array TagsListSideTypesResponse
{
  "type": "array",
  "items": {
    "type": "string"
  },
  "example": [
    "required",
    "optional",
    "unsupported",
    "unknown"
  ]
}
object TeamMember
{
  "type": "object",
  "required": [
    "team_id",
    "user",
    "role",
    "accepted"
  ],
  "properties": {
    "role": {
      "type": "string",
      "example": "Member",
      "description": "The user's role on the team"
    },
    "user": {
      "$ref": "#/components/schemas/User"
    },
    "team_id": {
      "type": "string",
      "example": "MMNNOOPP",
      "description": "The ID of the team this team member is a member of"
    },
    "accepted": {
      "type": "boolean",
      "example": true,
      "description": "Whether or not the user has accepted to be on the team (requires authorization to view)"
    },
    "ordering": {
      "type": "integer",
      "example": 0,
      "description": "The order of the team member."
    },
    "permissions": {
      "type": "integer",
      "format": "bitfield",
      "example": 127,
      "description": "The user's permissions in bitfield format (requires authorization to view)\n\nIn order from first to tenth bit, the bits are:\n- UPLOAD_VERSION\n- DELETE_VERSION\n- EDIT_DETAILS\n- EDIT_BODY\n- MANAGE_INVITES\n- REMOVE_MEMBER\n- EDIT_MEMBER\n- DELETE_PROJECT\n- VIEW_ANALYTICS\n- VIEW_PAYOUTS\n"
    },
    "payouts_split": {
      "type": "integer",
      "example": 100,
      "description": "The split of payouts going to this user. The proportion of payouts they get is their split divided by the sum of the splits of all members."
    }
  }
}
array TeamsGetMembersResponse
{
  "type": "array",
  "items": {
    "type": "array",
    "items": {
      "$ref": "#/components/schemas/TeamMember"
    }
  }
}
array TeamsGetProjectMembersResponse
{
  "type": "array",
  "items": {
    "$ref": "#/components/schemas/TeamMember"
  },
  "description": "An array of team members"
}
array TeamsGetTeamMembersResponse
{
  "type": "array",
  "items": {
    "$ref": "#/components/schemas/TeamMember"
  },
  "description": "An array of team members"
}
object Thread
{
  "type": "object",
  "required": [
    "id",
    "type",
    "messages",
    "members"
  ],
  "properties": {
    "id": {
      "type": "string",
      "example": "WWXXYYZZ",
      "description": "The ID of the thread"
    },
    "type": {
      "enum": [
        "project",
        "report",
        "direct_message"
      ],
      "type": "string"
    },
    "members": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/User"
      }
    },
    "messages": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/ThreadMessage"
      }
    },
    "report_id": {
      "type": "string",
      "nullable": true,
      "description": "The ID of the associated report if a report thread"
    },
    "project_id": {
      "type": "string",
      "nullable": true,
      "description": "The ID of the associated project if a project thread"
    }
  }
}
object ThreadMessage
{
  "type": "object",
  "required": [
    "id",
    "body",
    "created"
  ],
  "properties": {
    "id": {
      "type": "string",
      "example": "MMNNOOPP",
      "description": "The ID of the message itself"
    },
    "body": {
      "$ref": "#/components/schemas/ThreadMessageBody"
    },
    "created": {
      "type": "string",
      "format": "ISO-8601",
      "description": "The time at which the message was created"
    },
    "author_id": {
      "type": "string",
      "example": "QQRRSSTT",
      "nullable": true,
      "description": "The ID of the author"
    }
  }
}
object ThreadMessageBody
{
  "type": "object",
  "required": [
    "type"
  ],
  "properties": {
    "body": {
      "type": "string",
      "example": "This is the text of the message.",
      "description": "The actual message text. **Only present for `text` message type**"
    },
    "type": {
      "enum": [
        "status_change",
        "text",
        "thread_closure",
        "deleted"
      ],
      "type": "string",
      "example": "status_change",
      "description": "The type of message"
    },
    "private": {
      "type": "boolean",
      "example": false,
      "description": "Whether the message is only visible to moderators. **Only present for `text` message type**"
    },
    "new_status": {
      "enum": [
        "approved",
        "archived",
        "rejected",
        "draft",
        "unlisted",
        "processing",
        "withheld",
        "scheduled",
        "private",
        "unknown"
      ],
      "type": "string",
      "example": "approved",
      "description": "The new status of the project. **Only present for `status_change` message type**"
    },
    "old_status": {
      "enum": [
        "approved",
        "archived",
        "rejected",
        "draft",
        "unlisted",
        "processing",
        "withheld",
        "scheduled",
        "private",
        "unknown"
      ],
      "type": "string",
      "example": "processing",
      "description": "The old status of the project. **Only present for `status_change` message type**"
    },
    "replying_to": {
      "type": "string",
      "example": "SSTTUUVV",
      "nullable": true,
      "description": "The ID of the message being replied to by this message. **Only present for `text` message type**"
    }
  },
  "description": "The contents of the message. **Fields will vary depending on message type.**"
}
array ThreadsGetMultipleReportsResponse
{
  "type": "array",
  "items": {
    "$ref": "#/components/schemas/Report"
  }
}
array ThreadsGetOpenReportsResponse
{
  "type": "array",
  "items": {
    "$ref": "#/components/schemas/Report"
  }
}
array ThreadsListThreadsResponse
{
  "type": "array",
  "items": {
    "$ref": "#/components/schemas/Thread"
  }
}
object ThreadsModifyReportRequest
{
  "type": "object",
  "properties": {
    "body": {
      "type": "string",
      "example": "This is the meat and potatoes of the report!",
      "description": "The contents of the report"
    },
    "closed": {
      "type": "boolean",
      "description": "Whether the thread should be closed"
    }
  }
}
object User
{
  "allOf": [
    {
      "$ref": "#/components/schemas/EditableUser"
    },
    {
      "type": "object",
      "required": [
        "id",
        "avatar_url",
        "created",
        "role"
      ],
      "properties": {
        "id": {
          "type": "string",
          "example": "EEFFGGHH",
          "description": "The user's ID"
        },
        "role": {
          "enum": [
            "admin",
            "moderator",
            "developer"
          ],
          "type": "string",
          "example": "developer",
          "description": "The user's role"
        },
        "badges": {
          "type": "integer",
          "format": "bitfield",
          "example": 63,
          "description": "Any badges applicable to this user. These are currently unused and undisplayed, and as such are subject to change\n\nIn order from first to seventh bit, the current bits are:\n- (unused)\n- EARLY_MODPACK_ADOPTER\n- EARLY_RESPACK_ADOPTER\n- EARLY_PLUGIN_ADOPTER\n- ALPHA_TESTER\n- CONTRIBUTOR\n- TRANSLATOR\n"
        },
        "created": {
          "type": "string",
          "format": "ISO-8601",
          "description": "The time at which the user was created"
        },
        "has_totp": {
          "type": "boolean",
          "nullable": true,
          "description": "Whether you have TOTP two-factor authentication connected to your account (only displayed if requesting your own account)"
        },
        "github_id": {
          "type": "integer",
          "example": null,
          "nullable": true,
          "deprecated": true,
          "description": "Deprecated - this is no longer public for security reasons and is always null"
        },
        "avatar_url": {
          "type": "string",
          "example": "https://avatars.githubusercontent.com/u/11223344?v=1",
          "description": "The user's avatar url"
        },
        "has_password": {
          "type": "boolean",
          "nullable": true,
          "description": "Whether you have a password associated with your account (only displayed if requesting your own account)"
        },
        "auth_providers": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "example": [
            "github",
            "gitlab",
            "steam",
            "microsoft",
            "google",
            "discord"
          ],
          "nullable": true,
          "description": "A list of authentication providers you have signed up for (only displayed if requesting your own account)"
        },
        "email_verified": {
          "type": "boolean",
          "nullable": true,
          "description": "Whether your email is verified (only displayed if requesting your own account)"
        }
      }
    }
  ]
}
object UserIdentifier
{
  "required": [
    "user_id"
  ],
  "properties": {
    "user_id": {
      "type": "string",
      "example": "EEFFGGHH"
    }
  }
}
object UserPayoutData
{
  "type": "object",
  "nullable": true,
  "properties": {
    "balance": {
      "type": "integer",
      "example": 10.11223344556678,
      "description": "The payout balance available for the user to withdraw (note, you cannot modify this in a PATCH request)"
    },
    "payout_wallet": {
      "enum": [
        "paypal",
        "venmo"
      ],
      "type": "string",
      "example": "paypal",
      "description": "The wallet that the user has selected"
    },
    "payout_address": {
      "type": "string",
      "example": "support@modrinth.com",
      "description": "The user's payout address"
    },
    "payout_wallet_type": {
      "enum": [
        "email",
        "phone",
        "user_handle"
      ],
      "type": "string",
      "example": "email",
      "description": "The type of the user's wallet"
    }
  },
  "description": "Various data relating to the user's payouts status (you can only see your own)"
}
object UserPayoutHistory
{
  "type": "object",
  "properties": {
    "payouts": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/UserPayoutHistoryEntry"
      },
      "description": "A history of all of the user's past transactions"
    },
    "all_time": {
      "type": "string",
      "example": 10.11223344556678,
      "description": "The all-time balance accrued by this user in USD"
    },
    "last_month": {
      "type": "string",
      "example": 2.2244668800224465,
      "description": "The amount in USD made by the user in the previous 30 days"
    }
  }
}
object UserPayoutHistoryEntry
{
  "type": "object",
  "properties": {
    "amount": {
      "type": "integer",
      "example": 10,
      "description": "The amount of this transaction in USD"
    },
    "status": {
      "type": "string",
      "example": "success",
      "description": "The status of this transaction"
    },
    "created": {
      "type": "string",
      "format": "ISO-8601",
      "description": "The date of this transaction"
    }
  }
}
array UsersGetFollowedProjectsResponse
{
  "type": "array",
  "items": {
    "$ref": "#/components/schemas/Project"
  }
}
array UsersGetMultipleUsersResponse
{
  "type": "array",
  "items": {
    "$ref": "#/components/schemas/User"
  }
}
array UsersGetUserProjectsResponse
{
  "type": "array",
  "items": {
    "$ref": "#/components/schemas/Project"
  }
}
object Version
{
  "allOf": [
    {
      "$ref": "#/components/schemas/BaseVersion"
    },
    {
      "type": "object",
      "required": [
        "id",
        "project_id",
        "author_id",
        "date_published",
        "downloads",
        "files",
        "name",
        "version_number",
        "game_versions",
        "version_type",
        "loaders",
        "featured"
      ],
      "properties": {
        "id": {
          "type": "string",
          "example": "IIJJKKLL",
          "description": "The ID of the version, encoded as a base62 string"
        },
        "files": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/VersionFile"
          },
          "description": "A list of files available for download for this version"
        },
        "author_id": {
          "type": "string",
          "example": "EEFFGGHH",
          "description": "The ID of the author who published this version"
        },
        "downloads": {
          "type": "integer",
          "description": "The number of times this version has been downloaded"
        },
        "project_id": {
          "type": "string",
          "example": "AABBCCDD",
          "description": "The ID of the project this version is for"
        },
        "changelog_url": {
          "type": "string",
          "example": null,
          "nullable": true,
          "deprecated": true,
          "description": "A link to the changelog for this version. Always null, only kept for legacy compatibility."
        },
        "date_published": {
          "type": "string",
          "format": "ISO-8601"
        }
      }
    }
  ]
}
object VersionDependency
{
  "type": "object",
  "required": [
    "dependency_type"
  ],
  "properties": {
    "file_name": {
      "type": "string",
      "example": "sodium-fabric-mc1.19-0.4.2+build.16.jar",
      "nullable": true,
      "description": "The file name of the dependency, mostly used for showing external dependencies on modpacks"
    },
    "project_id": {
      "type": "string",
      "example": "QQRRSSTT",
      "nullable": true,
      "description": "The ID of the project that this version depends on"
    },
    "version_id": {
      "type": "string",
      "example": "IIJJKKLL",
      "nullable": true,
      "description": "The ID of the version that this version depends on"
    },
    "dependency_type": {
      "enum": [
        "required",
        "optional",
        "incompatible",
        "embedded"
      ],
      "type": "string",
      "example": "required",
      "description": "The type of dependency that this version has"
    }
  }
}
object VersionFile
{
  "type": "object",
  "required": [
    "hashes",
    "url",
    "filename",
    "primary",
    "size"
  ],
  "properties": {
    "url": {
      "type": "string",
      "example": "https://cdn.modrinth.com/data/AABBCCDD/versions/1.0.0/my_file.jar",
      "description": "A direct link to the file"
    },
    "size": {
      "type": "integer",
      "example": 1097270,
      "description": "The size of the file in bytes"
    },
    "hashes": {
      "$ref": "#/components/schemas/VersionFileHashes"
    },
    "primary": {
      "type": "boolean",
      "example": false,
      "description": "Whether this file is the primary one for its version. Only a maximum of one file per version will have this set to true. If there are not any primary files, it can be inferred that the first file is the primary one."
    },
    "filename": {
      "type": "string",
      "example": "my_file.jar",
      "description": "The name of the file"
    },
    "file_type": {
      "enum": [
        "required-resource-pack",
        "optional-resource-pack"
      ],
      "type": "string",
      "example": "required-resource-pack",
      "nullable": true,
      "description": "The type of the additional file, used mainly for adding resource packs to datapacks"
    }
  }
}
object VersionFileHashes
{
  "type": "object",
  "properties": {
    "sha1": {
      "type": "string",
      "example": "c84dd4b3580c02b79958a0590afd5783d80ef504"
    },
    "sha512": {
      "type": "string",
      "example": "93ecf5fe02914fb53d94aa3d28c1fb562e23985f8e4d48b9038422798618761fe208a31ca9b723667a4e05de0d91a3f86bcd8d018f6a686c39550e21b198d96f"
    }
  },
  "description": "A map of hashes of the file. The key is the hashing algorithm and the value is the string version of the hash."
}
object VersionsAddFilesToVersionRequest
{
  "type": "object",
  "properties": {
    "data": {
      "enum": [
        {}
      ],
      "type": "object"
    }
  }
}
array VersionsListProjectVersionsResponse
{
  "type": "array",
  "items": {
    "$ref": "#/components/schemas/Version"
  }
}
array VersionsListResponse
{
  "type": "array",
  "items": {
    "$ref": "#/components/schemas/Version"
  }
}