# Modrinth 元数据查询 API 使用文档
本文档描述如何获取 Modrinth 平台支持的**所有加载器(loaders)** 和 **Minecraft 游戏版本(game versions)**,以及项目类型、分类等元数据。这些接口均为**公开接口,无需认证**。
---
## 基本信息
| 项目 | 内容 |
|------|------|
| **生产环境** | `https://api.modrinth.com/v2` |
| **认证** | 无需认证(全部公开) |
| **Rate Limit** | 每 IP 每分钟 300 请求 |
---
## 接口一:获取所有加载器
获取 Modrinth 支持的全部模组加载器列表。
| 项目 | 内容 |
|------|------|
| **端点** | `GET /tag/loader` |
| **认证** | 否 |
| **成功响应码** | `200` |
| **响应体** | `LoaderTag[]` — 加载器对象数组 |
### 响应字段(LoaderTag)
| 字段 | 类型 | 说明 | 示例 |
|------|------|------|------|
| `name` | `string` | 加载器名称 | `"fabric"` |
| `icon` | `string` | 加载器的 SVG 图标 | `""` |
| `supported_project_types` | `string[]` | 该加载器适用的项目类型 | `["mod", "modpack"]` |
### 请求示例
```bash
curl "https://api.modrinth.com/v2/tag/loader"
```
```js
const response = await fetch("https://api.modrinth.com/v2/tag/loader");
const loaders = await response.json();
for (const loader of loaders) {
console.log(`${loader.name} — 适用于: ${loader.supported_project_types.join(", ")}`);
}
```
### 响应示例
```json
[
{
"icon": "",
"name": "fabric",
"supported_project_types": ["mod", "modpack"]
},
{
"icon": "",
"name": "forge",
"supported_project_types": ["mod", "modpack"]
},
{
"icon": "",
"name": "quilt",
"supported_project_types": ["mod", "modpack"]
},
{
"icon": "",
"name": "neoforge",
"supported_project_types": ["mod", "modpack"]
},
{
"icon": "",
"name": "minecraft",
"supported_project_types": ["resourcepack", "shader"]
}
]
```
> **注意:** `"minecraft"` 加载器用于资源包(resourcepacks)、光影等不需要模组加载器的项目类型。
---
## 接口二:获取所有游戏版本
获取 Modrinth 支持的全部 Minecraft 版本列表,包含版本类型和发布日期。
| 项目 | 内容 |
|------|------|
| **端点** | `GET /tag/game_version` |
| **认证** | 否 |
| **成功响应码** | `200` |
| **响应体** | `GameVersionTag[]` — 游戏版本对象数组 |
### 响应字段(GameVersionTag)
| 字段 | 类型 | 说明 | 示例 |
|------|------|------|------|
| `version` | `string` | 游戏版本号 | `"1.18.1"` |
| `version_type` | `string` | 版本类型:`release`、`snapshot`、`alpha`、`beta` | `"release"` |
| `date` | `string` | 版本发布日期(ISO-8601) | `"2021-12-10T00:00:00Z"` |
| `major` | `boolean` | 是否为主要版本,用于 Featured Versions 标记 | `true` |
### 请求示例
```bash
curl "https://api.modrinth.com/v2/tag/game_version"
```
```js
const response = await fetch("https://api.modrinth.com/v2/tag/game_version");
const versions = await response.json();
// 仅列出正式发布版
for (const v of versions.filter(v => v.version_type === "release")) {
console.log(`${v.version} (${v.version_type})${v.major ? " [主要版本]" : ""}`);
}
```
### 响应示例
```json
[
{
"version": "1.21.4",
"version_type": "release",
"date": "2025-04-04T00:00:00Z",
"major": true
},
{
"version": "1.21.3",
"version_type": "release",
"date": "2024-11-02T00:00:00Z",
"major": false
},
{
"version": "1.20.1",
"version_type": "release",
"date": "2023-06-12T00:00:00Z",
"major": true
},
{
"version": "24w45a",
"version_type": "snapshot",
"date": "2024-11-06T00:00:00Z",
"major": false
}
]
```
---
## 辅助接口:项目类型
获取 Modrinth 支持的项目类型,用于了解加载器适用哪些类型的项目。
| 项目 | 内容 |
|------|------|
| **端点** | `GET /tag/project_type` |
| **响应体** | `string[]` |
```bash
curl "https://api.modrinth.com/v2/tag/project_type"
```
```json
["mod", "modpack", "resourcepack", "shader"]
```
---
## 辅助接口:分类标签
获取 Modrinth 的项目分类列表(含图标和适用项目类型)。
| 项目 | 内容 |
|------|------|
| **端点** | `GET /tag/category` |
| **响应体** | `CategoryTag[]` |
```bash
curl "https://api.modrinth.com/v2/tag/category"
```
响应字段:
| 字段 | 类型 | 说明 |
|------|------|------|
| `icon` | `string` | 分类的 SVG 图标 |
| `name` | `string` | 分类名称 |
| `project_type` | `string` | 该分类适用的项目类型 |
| `header` | `string` | 该分类所属的标题分组 |
---
## 常见使用场景
### 场景 1:构建上传表单的下拉选项
在发布模组的 UI 中,动态获取可选加载器和游戏版本:
```js
const [loaders, gameVersions] = await Promise.all([
fetch("https://api.modrinth.com/v2/tag/loader").then(r => r.json()),
fetch("https://api.modrinth.com/v2/tag/game_version").then(r => r.json())
]);
// 加载器下拉
const loaderNames = loaders.map(l => l.name);
// → ["fabric", "forge", "quilt", "neoforge", "minecraft", ...]
// 仅正式版游戏版本
const releaseVersions = gameVersions
.filter(v => v.version_type === "release")
.map(v => v.version);
// → ["1.21.4", "1.21.3", "1.20.4", ...]
```
### 场景 2:验证用户输入是否合法
在上传版本前,校验 `loaders` 和 `game_versions` 中填的值是否被 Modrinth 接受:
```js
const validLoaders = new Set(loaders.map(l => l.name));
const validVersions = new Set(gameVersions.map(v => v.version));
const invalidLoaders = userInputLoaders.filter(l => !validLoaders.has(l));
const invalidVersions = userInputVersions.filter(v => !validVersions.has(v));
if (invalidLoaders.length > 0 || invalidVersions.length > 0) {
console.error("不合法的值:", { invalidLoaders, invalidVersions });
}
```
### 场景 3:获取某个加载器支持的 project_type
用于判断某个加载器是否适用于 mod、modpack 等类型:
```js
const loaders = await fetch("https://api.modrinth.com/v2/tag/loader").then(r => r.json());
const fabricInfo = loaders.find(l => l.name === "fabric");
console.log(fabricInfo.supported_project_types); // → ["mod", "modpack"]
// 判断 fabric 是否支持 mod 类型
const supportsMod = fabricInfo.supported_project_types.includes("mod"); // → true
```
---
## 缓存建议
这些元数据接口的返回值在短期内不会频繁变化,强烈建议在客户端做缓存:
- **加载器列表**:以天为单位缓存(加载器新增频率极低)。
- **游戏版本列表**:以小时或天为单位缓存(仅在 Minecraft 新版本发布时需要刷新)。
```js
// 简单的内存缓存示例
let cachedLoaders = null;
let cacheTime = 0;
const CACHE_TTL = 86400000; // 24 小时
async function getLoaders() {
if (cachedLoaders && Date.now() - cacheTime < CACHE_TTL) {
return cachedLoaders;
}
cachedLoaders = await fetch("https://api.modrinth.com/v2/tag/loader").then(r => r.json());
cacheTime = Date.now();
return cachedLoaders;
}
```
---
## 参考
- [Modrinth API 文档](https://docs.modrinth.com)
- [OpenAPI 规范文件](openapi.yml)
- [获取版本信息 API](get.md)
- [新建版本 API](upload.md)