Hikarinagi Public API

读取公开条目数据,或在用户授权后代表用户进行数据读写。

鉴权

令牌取法代表scope
应用级client_credentials应用自己catalog:read、catalog:full
用户级authorization_code + PKCE同意授权的用户catalog:*,外加 user:read、status:*、collection:*
  • 开放平台令牌仅可访问 api.hikarinagi.org/v3/** ,用于其它接口将返回 401。
  • 客户端类型在控制台切换。机密客户端持有 client_secret,可取得应用级令牌;公共客户端(SPA、移动端)不持有密钥,仅支持授权码流程。
  • 授权码流程强制启用 PKCE,未携带 code_challenge 的授权请求将被拒绝。

应用级令牌

控制台 创建应用并勾选 catalog:read ,随后使用密钥换取令牌。请求的 scope 不得超出应用已获授权的范围,否则返回 invalid_scope

curl -X POST "https://id.hikarinagi.org/oidc/token" \
  -u "$CLIENT_ID:$CLIENT_SECRET" \
  -d "grant_type=client_credentials" \
  -d "scope=catalog:read"
curl "https://api.hikarinagi.org/v3/galgames/1" \
  -H "Authorization: Bearer $ACCESS_TOKEN"

访问令牌有效期为 1 小时,过期后重新换取。应用级令牌不签发 refresh token。

用户级令牌

Hikarinagi ID 通过 OpenID Connect 授权码流程签发用户级令牌,PKCE 为必填项。应用须先在控制台配置回调地址,配置后方可开通授权码流程并勾选用户级 scope。

使用标准客户端库

Hikarinagi ID 为标准 OpenID Connect 实现,未引入私有扩展。向客户端库提供下列发现文档地址,端点、支持的 scope 与签名密钥即可自动获取。

https://id.hikarinagi.org/oidc/.well-known/openid-configuration
服务端 Nodeopenid-client
浏览器 SPAoidc-client-ts
iOS / AndroidAppAuth
Gocoreos/go-oidc

以下为该流程的原始 HTTP 交互,供自行实现或排查时参照。

1. 生成 PKCE 参数

Hikarinagi ID 仅接受 S256 ,不接受 plain

const bytes = crypto.getRandomValues(new Uint8Array(32))
const verifier = btoa(String.fromCharCode(...bytes))
  .replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '')

const digest = await crypto.subtle.digest("SHA-256", new TextEncoder().encode(verifier))
const challenge = btoa(String.fromCharCode(...new Uint8Array(digest)))
  .replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '')

// 保存 verifier,回调阶段需用它换取令牌
sessionStorage.setItem("hikari_verifier", verifier)

2. 发起授权请求

由浏览器导航至授权端点。

https://id.hikarinagi.org/oidc/auth
  ?response_type=code
  &client_id=$CLIENT_ID
  &redirect_uri=https%3A%2F%2Fyour.app%2Fcallback
  &scope=openid%20status%3Aread%20status%3Awrite%20offline_access
  &prompt=consent
  &state=$RANDOM_STATE
  &nonce=$RANDOM_NONCE
  &code_challenge=$CHALLENGE
  &code_challenge_method=S256
response_type必填固定为 code,不支持隐式流
client_id必填控制台中该应用的 client_id
redirect_uri必填必须与控制台登记的某一条完全一致,包括协议、端口、路径与结尾斜杠,不做前缀匹配
scope必填空格分隔。openid 表示同时签发 ID token;offline_access 需与 prompt=consent 同时出现才会签发 refresh token;其余见「权限范围」,且不得超出控制台已勾选的集合
prompt申请 offline_access 时必填取 consent。按 OIDC 规范,prompt 不含 consent 时 offline_access 会被静默忽略,授权仍然成功但不会签发 refresh token
state必填随机值,回调时原样返回,须逐字比对后再继续
nonce申请 openid 时建议随机值,原样写入所签发 ID token 的 nonce 声明
code_challenge必填code_verifier 的 SHA-256 摘要,base64url 编码
code_challenge_method必填固定为 S256,不接受 plain

3. 接收授权响应

用户在同意屏作出决策后,Hikarinagi ID 将响应参数附于 redirect_uri 的查询串返回。

code成功时返回授权码,仅可使用一次,有效期 60 秒
state总是返回原样回传授权请求中发出的值
error失败时返回access_denied 表示用户拒绝授权;invalid_scope 表示申请了应用未获授权的 scope
error_description失败时可能返回可读的失败原因,仅供排错

4. 发起令牌请求

客户端认证方式须与控制台登记值一致,其余方式将被拒绝。机密客户端默认为 client_secret_basic

curl -X POST "https://id.hikarinagi.org/oidc/token" \
  -u "$CLIENT_ID:$CLIENT_SECRET" \
  -d "grant_type=authorization_code" \
  -d "code=$CODE" \
  -d "redirect_uri=https://your.app/callback" \
  -d "code_verifier=$VERIFIER"

登记为 client_secret_post 时,凭据改由表单参数传递:

curl -X POST "https://id.hikarinagi.org/oidc/token" \
  -d "grant_type=authorization_code" \
  -d "client_id=$CLIENT_ID" \
  -d "client_secret=$CLIENT_SECRET" \
  -d "code=$CODE" \
  -d "redirect_uri=https://your.app/callback" \
  -d "code_verifier=$VERIFIER"

公共客户端不持有密钥,仅传递 client_id:

curl -X POST "https://id.hikarinagi.org/oidc/token" \
  -d "grant_type=authorization_code" \
  -d "client_id=$CLIENT_ID" \
  -d "code=$CODE" \
  -d "redirect_uri=https://your.app/callback" \
  -d "code_verifier=$VERIFIER"
grant_type必填固定为 authorization_code
code必填回调中拿到的授权码
redirect_uri必填必须与授权请求中使用的那一条完全一致,否则换取失败
code_verifier必填第一步生成的原始随机串,而非其摘要
client_id公共客户端必填机密客户端不在此处传递,改由所登记的客户端认证方式携带
{
  "access_token": "eyJhbGciOiJSUzI1NiIs…",
  "id_token": "eyJhbGciOiJSUzI1NiIs…",
  "refresh_token": "…",
  "expires_in": 3600,
  "token_type": "Bearer",
  "scope": "status:read status:write"
}

5. 访问受保护资源

Authorization: Bearer 请求头携带访问令牌。相关端点统一位于 /v3/user/me/** 之下,主体由令牌的 sub 声明确定,不接受在请求中指定用户。

curl -X PUT "https://api.hikarinagi.org/v3/user/me/rates/galgames/1" \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"status":"COMPLETED","rate":9}'

权限范围

应用可申请的 scope 在控制台勾选,换取令牌时请求的 scope 不得超出该集合。标注「需用户授权」的 scope 仅可通过授权码流程取得;即使已在控制台勾选,客户端凭据流程签发的令牌也不会包含它们。其余 scope 两种流程都可取得,授权码流程签发的令牌同样可以携带 catalog scope 去调用条目端点。

openid需用户授权

以 Hikarinagi 账号登录

标准 OIDC 登录,签发 ID 令牌并返回用户的唯一标识 sub

profile需用户授权

读取标准资料声明

OIDC profile 声明:用户名、昵称与头像

email需用户授权

读取邮箱地址

OIDC email 声明:授权用户的邮箱及其验证状态

offline_access需用户授权

保持登录状态

签发刷新令牌,应用可在用户离线时续期访问令牌

catalog:read

读取条目数据

不含 NSFW 与乙女向条目

catalog:full

读取条目数据(全部)

含 NSFW 与乙女向条目;用户令牌下以该用户账号的内容偏好为上限

user:read需用户授权

读取用户公开资料

授权用户的用户名、昵称、头像与简介

status:read需用户授权

读取用户的状态与评分

授权用户在游戏/轻小说/漫画上的观看游玩状态、评分与短评

status:write需用户授权

修改用户的状态与评分

代替授权用户标记状态、打分、撤回记录;含 status:read 的读取权限

collection:read需用户授权

读取用户的收藏夹

授权用户的收藏夹列表及其中收录的作品

collection:write需用户授权

修改用户的收藏夹

代替授权用户新建收藏夹、收录或移除作品;含 collection:read 的读取权限

存在两组蕴含关系: catalog:full 包含 catalog:readstatus:write 包含 status:read 。申请上位 scope 即可,无需重复勾选。

令牌生命周期

服务发现文档位于 https://id.hikarinagi.org/oidc/.well-known/openid-configuration ,可直接用于标准 OAuth / OIDC 客户端库的自动配置。

访问令牌形态
授权包含开放 API 权限时,签发自包含 JWT,无需调用内省端点即可验证;仅包含 openid / profile / email 时,签发不透明的身份令牌,用于调用用户信息端点。有效期均为 1 小时。
受众
开放 API 令牌的 aud 固定为 Hikarinagi ID 的 open 受众,仅 api.hikarinagi.org/v3/** 接受该受众;身份令牌不携带受众。
用户信息端点
服务发现文档中的 userinfo_endpoint。仅接受身份令牌;以绑定受众的 JWT 调用会返回 401,用户资料声明请读取 ID 令牌,或按下文换取身份令牌。
刷新令牌
仅在申请了 offline_access 的用户级授权中签发,且每次刷新均会轮换。请以响应中返回的新值覆盖原有 refresh token。
撤销
用户可在账号中心的「已授权应用」中随时取消授权,该应用名下的访问令牌与刷新令牌将立即失效。

刷新令牌

curl -X POST "https://id.hikarinagi.org/oidc/token" \
  -u "$CLIENT_ID:$CLIENT_SECRET" \
  -d "grant_type=refresh_token" \
  -d "refresh_token=$REFRESH_TOKEN"

401 并不总是意味着令牌过期。用户撤销授权后刷新同样会失败,此时应引导用户重新完成授权流程,而非持续重试。

身份令牌与开放 API 令牌

同时申请了 openid 与开放 API 权限的应用,常规流程签发的是开放 API 令牌。如需调用用户信息端点,可在刷新时传入 scope=openid(可按需附加 profile、email) 换取一枚身份令牌;轮换返回的新刷新令牌仍保留完整权限,后续照常刷新即可取回开放 API 令牌。

响应约定

所有响应均使用统一信封,业务数据位于 data 字段。端点参考中的响应示例展示的即为该字段的内容;204 响应没有响应体。

成功

{
  "success": true,
  "data": {  },
  "request_id": "req-x",
  "timestamp": "2026-08-02T00:00:00.000Z"
}

分页

分页信息位于 data.meta ,与 items 同级,而非信封顶层。

{
  "success": true,
  "data": {
    "items": [  ],
    "meta": {
      "page": 1,
      "page_size": 20,
      "item_count": 20,
      "total_items": 137,
      "total_pages": 7
    }
  },
  "request_id": "req-x",
  "timestamp": "2026-08-02T00:00:00.000Z"
}

失败

失败响应不含 data ,改为 errorcode 为稳定的业务错误码,可用于分支判断。

{
  "success": false,
  "error": {
    "code": "AUTH_FORBIDDEN",
    "message": "访问令牌缺少此端点所需的 scope:status:write"
  },
  "request_id": "req-x",
  "timestamp": "2026-08-02T00:00:00.000Z"
}

错误码

401AUTH_UNAUTHENTICATED缺少 Authorization 请求头,或该端点要求令牌代表某个用户而所用令牌只代表应用自身
401AUTH_TOKEN_INVALID令牌的签名、签发方或受众不匹配,或令牌已过期、已被撤销
403AUTH_FORBIDDEN令牌有效,但缺少该端点要求的 scope
403USER_BANNED授权用户的账号已被封禁或停用
404COMMON_NOT_FOUND资源不存在、未发布,或不在当前 scope 的可见范围内
422COMMON_VALIDATION_FAILED请求体或查询参数未通过校验,field_errors 中给出逐字段原因
429COMMON_RATE_LIMITED超出该应用的调用频率上限

限流

限流以应用为单位计数,默认 60 次 / 分钟,超出返回 429 COMMON_RATE_LIMITED 。配额为应用级:同一应用代表不同用户发起的调用共享同一配额,批量同步场景需自行控制并发与节奏。

每个响应均携带以下响应头,描述的是该应用的配额而非来源 IP 的配额;四者均已列入 Access-Control-Expose-Headers ,浏览器端应用可直接读取。请依据 Retry-After 退避,不要固定间隔重试。

X-RateLimit-Limit当前窗口的调用上限,即该应用的配额
X-RateLimit-Remaining当前窗口内剩余的调用次数,触发限流后为 0
X-RateLimit-Reset距当前窗口重置的秒数
Retry-After仅 429 响应携带,恢复调用前需等待的秒数

品牌与署名

本节说明 Hikarinagi 的名称写法、标识用法与数据署名要求,以便用户区分应用的开发者与数据来源。

名称

Hikarinagi
平台的正式名称。例:同步游戏状态到 Hikarinagi
Hikarinagi ID
账号系统的名称,用于登录、授权与账号相关的表述。例:使用 Hikarinagi ID 登录
Hinagi
移动端应用的展示名,用于长度受限的场景。
Hina
移动端应用图标所使用的标识。

书写规范

  • Hikarinagi— 首字母大写,其余小写
  • HikariNagi— 驼峰写法
  • hikarinagi— 正文中的全小写;域名、包名等技术标识符除外
  • HIKARINAGI— 全大写
  • 自行翻译的名称— 中文或日文译名

标识

标识仅限用于下列用途:

  1. 标注条目数据来源为 Hikarinagi
  2. 标示该入口使用 Hikarinagi ID 登录或授权
  3. 在相关说明或文案中指代 Hikarinagi

下列文件按适用空间选用。

图标

适用于方形与窄空间:按钮前缀、列表行、署名角标

/brand/hikarinagi-icon.webp

字标

适用于横向空间:正文中的指代、数据来源标注

/brand/hikarinagi-wordmark.svg

Hikarinagi ID 组合标

仅用于登录与授权入口

/brand/hikarinagi-id-lockup.svg

横向空间不足以容纳字标或组合标时改用图标;标识缩小到难以辨认时,改用纯文字 Hikarinagi。图标为位图,源文件为 1024×1024,放大使用不应超过该尺寸。

  • 请勿改变标识的颜色、比例与字形,或添加描边、阴影、渐变等效果
  • 请勿将标识与其他图形组合为新的标识,或用作应用图标
  • 标识文件请从本页获取,请勿截图或反向提取

数据署名

展示通过开放 API 获取的条目信息时,须标注数据来源为 Hikarinagi,并指向该条目在 Hikarinagi 上的页面。

端点参考

能否调用一个端点由两件事决定,与令牌来自哪种授权流程无关。响应示例展示的是信封内 data 字段的内容,完整信封见 响应约定

所需 scope逐端点标注。令牌缺少其中任意一项即返回 403,响应会指出缺失的具体 scope。scope 集合不得超出应用在控制台勾选的范围。
是否需要用户授权标注于每组标题旁。「需用户授权」的端点要求令牌代表某个已授权用户,只有授权码流程签发的令牌满足;「无需用户授权」的端点两种流程签发的令牌都可调用。

Hikarinagi ID issuer: https://id.hikarinagi.org/oidc

条目数据

无需用户授权

公开条目数据,需 catalog:read 或 catalog:full;令牌无需代表任何用户。

角色详情

GET/v3/characters/{id}

需要 scopecatalog:read

响应200 成功

查询参数

id *number

响应字段

age *number | null年龄
aliases *string[]别名列表
birthday_day *number | null生日日
birthday_month *number | null生日月份
blood_type *string | null血型
bust *number | null胸围,单位厘米
created_at *string条目创建时间
cup *string | null罩杯
en_intro *string | null英文简介
en_name *string | null英文名或罗马字
gender *string | null性别
height *number | null身高,单位厘米
hips *number | null臀围,单位厘米
id *number角色 ID
image *OpenMediaDto | null角色头像
intro *string原文简介
labels *OpenEntityLabelDto[]补充信息标签,键值对形式
name *string原名
revised_at *string | null最近一次修订通过审核的时间
trans_intro *string | null简介译文
trans_name *string | null译名
updated_at *string条目最后更新时间
waist *number | null腰围,单位厘米
weight *number | null体重,单位千克
curl "https://api.hikarinagi.org/v3/characters/1" \
  -H "Authorization: Bearer $ACCESS_TOKEN"

响应示例

{
  "age": 1,
  "aliases": [
    "string"
  ],
  "birthday_day": 1,
  "birthday_month": 1,
  "blood_type": "string",
  "bust": 1,
  "created_at": "2026-08-02T00:00:00.000Z",
  "cup": "string",
  "en_intro": "string",
  "en_name": "string",
  "gender": "string",
  "height": 1,
  "hips": 1,
  "id": 1,
  "image": {
    "height": 1,
    "sexual": 1,
    "url": "path/to/asset.jpg",
    "violence": 1,
    "width": 1
  },
  "intro": "string",
  "labels": [
    {
      "key": "string",
      "value": "string"
    }
  ],
  "name": "string",
  "revised_at": "2026-08-02T00:00:00.000Z",
  "trans_intro": "string",
  "trans_name": "string",
  "updated_at": "2026-08-02T00:00:00.000Z",
  "waist": 1,
  "weight": 1
}

Galgame 详情

GET/v3/galgames/{id}

需要 scopecatalog:read

响应200 成功

查询参数

id *number

响应字段

adv_type *string | null游戏类型
aliases *string[]别名列表
covers *OpenGalgameCoverDto[]封面列表,按得票数由高到低排序
created_at *string条目创建时间
dev_status *GalgameDevStatus | null开发状态
CANCELLED
开发终止
IN_DEVELOPMENT
开发中
RELEASED
已发售
developer *string | null开发商名称,取首个开发商
en_intro *string | null英文简介
en_title *string | null官方英文标题
engine *string | null游戏引擎
external_links *OpenGalgameExternalLinkDto[]官网、商店页等外部链接
homepage *string | null官方网站
id *numberGalgame ID
images *OpenMediaDto[]游戏截图
nsfw *boolean是否为NSFW 内容
origin_intro *string | null原文简介
origin_lang *string | null原始语言
origin_title *string原名
platforms *string[]支持的平台
prices *OpenGalgamePriceDto[]各版本定价
rating *OpenRatingDto评分统计
release_date *string | null发行日期
release_date_tbd *boolean发行日期是否待定
release_date_tbd_note *string发行日期待定时的补充说明
revised_at *string | null最近一次修订通过审核的时间
steam_apps *OpenGalgameSteamAppDto[]Steam 商店页,首项为主商店页
tags *OpenTagDto[]标签列表
trans_intro *string | null简介译文
trans_title *string | null译名
updated_at *string条目最后更新时间
curl "https://api.hikarinagi.org/v3/galgames/1" \
  -H "Authorization: Bearer $ACCESS_TOKEN"

响应示例

{
  "adv_type": "string",
  "aliases": [
    "string"
  ],
  "covers": [
    {
      "height": 1,
      "kind": "DIG",
      "language": "string",
      "sexual": 1,
      "url": "path/to/asset.jpg",
      "violence": 1,
      "votes": 1,
      "width": 1
    }
  ],
  "created_at": "2026-08-02T00:00:00.000Z",
  "dev_status": "RELEASED",
  "developer": "string",
  "en_intro": "string",
  "en_title": "string",
  "engine": "string",
  "external_links": [
    {
      "label": "string",
      "name": "string",
      "url": "path/to/asset.jpg"
    }
  ],
  "homepage": "string",
  "id": 1,
  "images": [
    {
      "height": 1,
      "sexual": 1,
      "url": "path/to/asset.jpg",
      "violence": 1,
      "width": 1
    }
  ],
  "nsfw": false,
  "origin_intro": "string",
  "origin_lang": "string",
  "origin_title": "string",
  "platforms": [
    "string"
  ],
  "prices": [
    {
      "amount": 1,
      "currency": "string",
      "tax_included": false,
      "version": "string"
    }
  ],
  "rating": {
    "count": {
      "1": 1,
      "2": 1,
      "3": 1,
      "4": 1,
      "5": 1,
      "6": 1,
      "7": 1,
      "8": 1,
      "9": 1,
      "10": 1
    },
    "score": 1,
    "total": 1
  },
  "release_date": "string",
  "release_date_tbd": false,
  "release_date_tbd_note": "string",
  "revised_at": "2026-08-02T00:00:00.000Z",
  "steam_apps": [
    {
      "app_id": 1
    }
  ],
  "tags": [
    {
      "likes": 1,
      "name": "string"
    }
  ],
  "trans_intro": "string",
  "trans_title": "string",
  "updated_at": "2026-08-02T00:00:00.000Z"
}

Galgame 角色

GET返回数组/v3/galgames/{id}/characters

需要 scopecatalog:read

响应200 成功

查询参数

id *number
role CharacterRole

响应字段

actors *OpenEntityRefDto[]配音演员列表
character *OpenEntityRefDto角色信息
role *CharacterRole角色定位
GUEST
客串
MAIN
主角
PRIMARY
主要角色
SUPPORTING
配角
curl "https://api.hikarinagi.org/v3/galgames/1/characters?page=1&page_size=10" \
  -H "Authorization: Bearer $ACCESS_TOKEN"

响应示例

[
  {
    "actors": [
      {
        "id": 1,
        "image": {
          "height": 1,
          "sexual": 1,
          "url": "path/to/asset.jpg",
          "violence": 1,
          "width": 1
        },
        "name": "string",
        "trans_name": "string"
      }
    ],
    "character": {
      "id": 1,
      "image": {
        "height": 1,
        "sexual": 1,
        "url": "path/to/asset.jpg",
        "violence": 1,
        "width": 1
      },
      "name": "string",
      "trans_name": "string"
    },
    "role": "MAIN"
  }
]

Galgame 开发商

GET返回数组/v3/galgames/{id}/developers

需要 scopecatalog:read

响应200 成功

查询参数

id *number

响应字段

aliases *string[]别名列表
country *string所属国家或地区
en_intro *string | null英文简介
established *string | null成立日期
id *number厂商 ID
intro *string | null原文简介
logo *OpenMediaDto | null厂商 Logo
name *string厂商名
note *string该作品下的厂商备注
trans_intro *string | null简介译文
type *string厂商类型
website *string | null官方网站
curl "https://api.hikarinagi.org/v3/galgames/1/developers" \
  -H "Authorization: Bearer $ACCESS_TOKEN"

响应示例

[
  {
    "aliases": [
      "string"
    ],
    "country": "string",
    "en_intro": "string",
    "established": "string",
    "id": 1,
    "intro": "string",
    "logo": {
      "height": 1,
      "sexual": 1,
      "url": "path/to/asset.jpg",
      "violence": 1,
      "width": 1
    },
    "name": "string",
    "note": "string",
    "trans_intro": "string",
    "type": "string",
    "website": "string"
  }
]

Galgame 厂商

GET返回数组/v3/galgames/{id}/producers

需要 scopecatalog:read

响应200 成功

查询参数

id *number

响应字段

note *string角色备注
producer *OpenEntityRefDto厂商信息
role *ProducerRole | null厂商承担的角色
DEVELOPER
开发商
LOCALIZER
本地化
PUBLISHER
发行商
curl "https://api.hikarinagi.org/v3/galgames/1/producers" \
  -H "Authorization: Bearer $ACCESS_TOKEN"

响应示例

[
  {
    "note": "string",
    "producer": {
      "id": 1,
      "image": {
        "height": 1,
        "sexual": 1,
        "url": "path/to/asset.jpg",
        "violence": 1,
        "width": 1
      },
      "name": "string",
      "trans_name": "string"
    },
    "role": "DEVELOPER"
  }
]

Galgame 相关作品

GET返回数组/v3/galgames/{id}/relations

需要 scopecatalog:read

响应200 成功

查询参数

id *number

响应字段

galgame *OpenGalgameRelationTargetDto目标作品
relation *"SEQUEL" | "PREQUEL" | "SIDE_STORY" | "MAIN_STORY" | "VARIANT" | "MAIN_VERSION" | "COLLECTION" | "COLLECTED_WORK" | "SAME_UNIVERSE" | "DIFFERENT_ADAPTATION" | "EXPANSION"当前条目相对目标作品的关系类型
curl "https://api.hikarinagi.org/v3/galgames/1/relations" \
  -H "Authorization: Bearer $ACCESS_TOKEN"

响应示例

[
  {
    "galgame": {
      "covers": [
        {
          "height": 1,
          "sexual": 1,
          "url": "path/to/asset.jpg",
          "violence": 1,
          "votes": 1,
          "width": 1
        }
      ],
      "id": 1,
      "nsfw": false,
      "origin_title": "string",
      "release_date": "string",
      "trans_title": "string"
    },
    "relation": "SEQUEL"
  }
]

Galgame Staff

GET返回数组/v3/galgames/{id}/staff

需要 scopecatalog:read

响应200 成功

查询参数

id *number
role GalgameStaffRole

响应字段

person *OpenEntityRefDto人物信息
role *GalgameStaffRole | null担任的职位
ANIMATION_DIRECTOR
动画监督
ANIMATION_PRODUCTION
动画制作
ANIMATION_SCRIPT
动画剧本
ANIMATION_SUPERVISOR
作画监督
ART
原画
BACKGROUND
背景
CG_SUPERVISOR
CG 监修
CHARACTER_DESIGN
人物设定
COOPERATION
协力
COVER_ART
海报
DIRECTOR
导演
EDITOR
编辑
EXECUTIVE_PRODUCER
制作总指挥
GAME_DESIGNER
游戏设计师
GRAPHICS
美工
INSERT_PERFORMANCE
插入歌演出
LEVEL_DESIGN
关卡设计
MECHANICAL_DESIGN
机械设定
MUSIC
音乐
ORIGINAL_WORK
原作
PLANNING
企画
PRODUCER
制作人
PROGRAM
程序
QC
QC
SCENARIO
剧本
SD_ART
SD原画
SERIES_COMPOSITION
系列构成
SOUND_DIRECTOR
音响监督
SUPERVISOR
监修
THEME_COMPOSITION
主题歌作曲
THEME_LYRICS
主题歌作词
THEME_PERFORMANCE
主题歌演出
TRANSLATOR
翻译
curl "https://api.hikarinagi.org/v3/galgames/1/staff?page=1&page_size=10" \
  -H "Authorization: Bearer $ACCESS_TOKEN"

响应示例

[
  {
    "person": {
      "id": 1,
      "image": {
        "height": 1,
        "sexual": 1,
        "url": "path/to/asset.jpg",
        "violence": 1,
        "width": 1
      },
      "name": "string",
      "trans_name": "string"
    },
    "role": "GAME_DESIGNER"
  }
]

轻小说详情

GET/v3/light-novels/{id}

需要 scopecatalog:read

响应200 成功

查询参数

id *number

响应字段

covers *OpenCoverDto[]封面列表,按得票数由高到低排序
created_at *string条目创建时间
id *number轻小说 ID
name *string原名
name_cn *string | null中文名
novel_status *NovelStatus连载状态
ABANDONED
休刊
FINISHED
已完结
PAUSED
休刊
SERIALIZING
连载中
nsfw *boolean是否为NSFW 内容
other_names *string[]别名列表
publication_date *string | null首卷出版日期
rating *OpenRatingDto评分统计
revised_at *string | null最近一次修订通过审核的时间
summary *string | null原文简介
summary_cn *string | null简介译文
tags *OpenTagDto[]标签列表
total_volumes *number已收录的分卷数
updated_at *string条目最后更新时间
curl "https://api.hikarinagi.org/v3/light-novels/1" \
  -H "Authorization: Bearer $ACCESS_TOKEN"

响应示例

{
  "covers": [
    {
      "height": 1,
      "sexual": 1,
      "url": "path/to/asset.jpg",
      "violence": 1,
      "votes": 1,
      "width": 1
    }
  ],
  "created_at": "2026-08-02T00:00:00.000Z",
  "id": 1,
  "name": "string",
  "name_cn": "string",
  "novel_status": "SERIALIZING",
  "nsfw": false,
  "other_names": [
    "string"
  ],
  "publication_date": "string",
  "rating": {
    "count": {
      "1": 1,
      "2": 1,
      "3": 1,
      "4": 1,
      "5": 1,
      "6": 1,
      "7": 1,
      "8": 1,
      "9": 1,
      "10": 1
    },
    "score": 1,
    "total": 1
  },
  "revised_at": "2026-08-02T00:00:00.000Z",
  "summary": "string",
  "summary_cn": "string",
  "tags": [
    {
      "likes": 1,
      "name": "string"
    }
  ],
  "total_volumes": 1,
  "updated_at": "2026-08-02T00:00:00.000Z"
}

轻小说角色

GET返回数组/v3/light-novels/{id}/characters

需要 scopecatalog:read

响应200 成功

查询参数

id *number
role CharacterRole

响应字段

character *OpenEntityRefDto角色信息
role *CharacterRole角色定位
GUEST
客串
MAIN
主角
PRIMARY
主要角色
SUPPORTING
配角
curl "https://api.hikarinagi.org/v3/light-novels/1/characters?page=1&page_size=10" \
  -H "Authorization: Bearer $ACCESS_TOKEN"

响应示例

[
  {
    "character": {
      "id": 1,
      "image": {
        "height": 1,
        "sexual": 1,
        "url": "path/to/asset.jpg",
        "violence": 1,
        "width": 1
      },
      "name": "string",
      "trans_name": "string"
    },
    "role": "MAIN"
  }
]

轻小说人物

GET返回数组/v3/light-novels/{id}/people

需要 scopecatalog:read

响应200 成功

查询参数

id *number
relation "author" | "illustrator"

响应字段

note *string | null职位备注
person *OpenEntityRefDto人物信息
relation *string担任的职位
curl "https://api.hikarinagi.org/v3/light-novels/1/people?page=1&page_size=10" \
  -H "Authorization: Bearer $ACCESS_TOKEN"

响应示例

[
  {
    "note": "string",
    "person": {
      "id": 1,
      "image": {
        "height": 1,
        "sexual": 1,
        "url": "path/to/asset.jpg",
        "violence": 1,
        "width": 1
      },
      "name": "string",
      "trans_name": "string"
    },
    "relation": "string"
  }
]

轻小说厂商

GET返回数组/v3/light-novels/{id}/producers

需要 scopecatalog:read

响应200 成功

查询参数

id *number
relation "bunko" | "publisher"

响应字段

note *string | null角色备注
producer *OpenEntityRefDto厂商信息
relation *string承担的角色
curl "https://api.hikarinagi.org/v3/light-novels/1/producers?page=1&page_size=10" \
  -H "Authorization: Bearer $ACCESS_TOKEN"

响应示例

[
  {
    "note": "string",
    "producer": {
      "id": 1,
      "image": {
        "height": 1,
        "sexual": 1,
        "url": "path/to/asset.jpg",
        "violence": 1,
        "width": 1
      },
      "name": "string",
      "trans_name": "string"
    },
    "relation": "string"
  }
]

轻小说分卷

GET返回数组/v3/light-novels/{id}/volumes

需要 scopecatalog:read

响应200 成功

查询参数

id *number
sort "volume_number" | "recent"

响应字段

covers *OpenCoverDto[]封面列表,按得票数由高到低排序
id *number分卷 ID
name *string | null原名
name_cn *string | null中文名
publication_date *string | null出版日期
relation *string与所属作品的关联说明
volume_label *string | null卷号的展示文本
volume_number *number | null卷号
volume_type *VolumeType分卷类型
EXTRA
番外
MAIN
正篇
curl "https://api.hikarinagi.org/v3/light-novels/1/volumes?page=1&page_size=10" \
  -H "Authorization: Bearer $ACCESS_TOKEN"

响应示例

[
  {
    "covers": [
      {
        "height": 1,
        "sexual": 1,
        "url": "path/to/asset.jpg",
        "violence": 1,
        "votes": 1,
        "width": 1
      }
    ],
    "id": 1,
    "name": "string",
    "name_cn": "string",
    "publication_date": "string",
    "relation": "string",
    "volume_label": "string",
    "volume_number": 1,
    "volume_type": "MAIN"
  }
]

漫画详情

GET/v3/mangas/{id}

需要 scopecatalog:read

响应200 成功

查询参数

id *number

响应字段

audience *MangaAudience | null受众分类
JOSEI
女性
SEINEN
青年
SHOJO
少女
SHONEN
少年
covers *OpenCoverDto[]封面列表,按得票数由高到低排序
created_at *string条目创建时间
editions *OpenMangaEditionDto[]版本信息
homepage *string | null官方网站
id *number漫画 ID
isbn *string | nullISBN
latest_chapter_at *string | null最新一话的更新时间,暂无章节信息时为空
name *string原名
name_cn *string | null中文名
nsfw *boolean是否为NSFW 内容
origin_country *string | null出品国家或地区
other_names *string[]别名列表
pages *number | null页数
price_amount *number | null价格金额
price_currency *string | null货币代码
publication_date *string | null开始连载日期
publication_end_date *string | null完结日期
rating *OpenRatingDto评分统计
reading_mode *MangaReadingMode阅读方向
PAGED_LTR
从左往右
PAGED_RTL
从右往左
WEBTOON
条漫(竖向滚动)
revised_at *string | null最近一次修订通过审核的时间
serial_status *MangaSerialStatus连载状态
ABANDONED
中止连载
FINISHED
已完结
PAUSED
暂停连载
SERIALIZING
连载中
summary *string | null原文简介
summary_cn *string | null简介译文
tags *OpenTagDto[]标签列表
updated_at *string条目最后更新时间
curl "https://api.hikarinagi.org/v3/mangas/1" \
  -H "Authorization: Bearer $ACCESS_TOKEN"

响应示例

{
  "audience": "SHONEN",
  "covers": [
    {
      "height": 1,
      "sexual": 1,
      "url": "path/to/asset.jpg",
      "violence": 1,
      "votes": 1,
      "width": 1
    }
  ],
  "created_at": "2026-08-02T00:00:00.000Z",
  "editions": [
    {
      "fields": null,
      "label": "string"
    }
  ],
  "homepage": "string",
  "id": 1,
  "isbn": "string",
  "latest_chapter_at": "2026-08-02T00:00:00.000Z",
  "name": "string",
  "name_cn": "string",
  "nsfw": false,
  "origin_country": "string",
  "other_names": [
    "string"
  ],
  "pages": 1,
  "price_amount": 1,
  "price_currency": "string",
  "publication_date": "string",
  "publication_end_date": "string",
  "rating": {
    "count": {
      "1": 1,
      "2": 1,
      "3": 1,
      "4": 1,
      "5": 1,
      "6": 1,
      "7": 1,
      "8": 1,
      "9": 1,
      "10": 1
    },
    "score": 1,
    "total": 1
  },
  "reading_mode": "PAGED_RTL",
  "revised_at": "2026-08-02T00:00:00.000Z",
  "serial_status": "SERIALIZING",
  "summary": "string",
  "summary_cn": "string",
  "tags": [
    {
      "likes": 1,
      "name": "string"
    }
  ],
  "updated_at": "2026-08-02T00:00:00.000Z"
}

漫画角色

GET返回数组/v3/mangas/{id}/characters

需要 scopecatalog:read

响应200 成功

查询参数

id *number
role CharacterRole

响应字段

character *OpenEntityRefDto角色信息
role *CharacterRole角色定位
GUEST
客串
MAIN
主角
PRIMARY
主要角色
SUPPORTING
配角
curl "https://api.hikarinagi.org/v3/mangas/1/characters?page=1&page_size=10" \
  -H "Authorization: Bearer $ACCESS_TOKEN"

响应示例

[
  {
    "character": {
      "id": 1,
      "image": {
        "height": 1,
        "sexual": 1,
        "url": "path/to/asset.jpg",
        "violence": 1,
        "width": 1
      },
      "name": "string",
      "trans_name": "string"
    },
    "role": "MAIN"
  }
]

漫画人物

GET返回数组/v3/mangas/{id}/people

需要 scopecatalog:read

响应200 成功

查询参数

id *number

响应字段

note *string职位备注
person *OpenEntityRefDto人物信息
role *MangaStaffRole担任的职位
ART
作画
AUTHOR
作者
CHARACTER_DESIGN
人物原案
ILLUSTRATION
插图
ORIGINAL_CREATOR
原作
SCRIPT
脚本
curl "https://api.hikarinagi.org/v3/mangas/1/people" \
  -H "Authorization: Bearer $ACCESS_TOKEN"

响应示例

[
  {
    "note": "string",
    "person": {
      "id": 1,
      "image": {
        "height": 1,
        "sexual": 1,
        "url": "path/to/asset.jpg",
        "violence": 1,
        "width": 1
      },
      "name": "string",
      "trans_name": "string"
    },
    "role": "AUTHOR"
  }
]

漫画厂商

GET返回数组/v3/mangas/{id}/producers

需要 scopecatalog:read

响应200 成功

查询参数

id *number

响应字段

note *string角色备注
producer *OpenEntityRefDto厂商信息
role *MangaProducerRole承担的角色
LABEL
书系
MAGAZINE
连载杂志
PUBLISHER
出版社
curl "https://api.hikarinagi.org/v3/mangas/1/producers" \
  -H "Authorization: Bearer $ACCESS_TOKEN"

响应示例

[
  {
    "note": "string",
    "producer": {
      "id": 1,
      "image": {
        "height": 1,
        "sexual": 1,
        "url": "path/to/asset.jpg",
        "violence": 1,
        "width": 1
      },
      "name": "string",
      "trans_name": "string"
    },
    "role": "PUBLISHER"
  }
]

漫画单行本

GET返回数组/v3/mangas/{id}/volumes

需要 scopecatalog:read

响应200 成功

查询参数

id *number

响应字段

cover *OpenMediaDto | null分卷封面
id *number分卷 ID
isbn *string | nullISBN
name *string | null原名
name_cn *string | null中文名
page_count *number | null页数
publication_date *string | null出版日期
volume_number *number | null卷号
curl "https://api.hikarinagi.org/v3/mangas/1/volumes" \
  -H "Authorization: Bearer $ACCESS_TOKEN"

响应示例

[
  {
    "cover": {
      "height": 1,
      "sexual": 1,
      "url": "path/to/asset.jpg",
      "violence": 1,
      "width": 1
    },
    "id": 1,
    "isbn": "string",
    "name": "string",
    "name_cn": "string",
    "page_count": 1,
    "publication_date": "string",
    "volume_number": 1
  }
]

人物详情

GET/v3/people/{id}

需要 scopecatalog:read

响应200 成功

查询参数

id *number

响应字段

aliases *string[]别名列表
created_at *string条目创建时间
gender *string | null性别
id *number人物 ID
image *OpenMediaDto | null人物头像
intro *string原文简介
labels *OpenEntityLabelDto[]补充信息标签,键值对形式
name *string原名
revised_at *string | null最近一次修订通过审核的时间
trans_intro *string | null简介译文
trans_name *string | null译名
updated_at *string条目最后更新时间
curl "https://api.hikarinagi.org/v3/people/1" \
  -H "Authorization: Bearer $ACCESS_TOKEN"

响应示例

{
  "aliases": [
    "string"
  ],
  "created_at": "2026-08-02T00:00:00.000Z",
  "gender": "string",
  "id": 1,
  "image": {
    "height": 1,
    "sexual": 1,
    "url": "path/to/asset.jpg",
    "violence": 1,
    "width": 1
  },
  "intro": "string",
  "labels": [
    {
      "key": "string",
      "value": "string"
    }
  ],
  "name": "string",
  "revised_at": "2026-08-02T00:00:00.000Z",
  "trans_intro": "string",
  "trans_name": "string",
  "updated_at": "2026-08-02T00:00:00.000Z"
}

厂商详情

GET/v3/producers/{id}

需要 scopecatalog:read

响应200 成功

查询参数

id *number

响应字段

aliases *string[]别名列表
country *string所属国家或地区
created_at *string条目创建时间
en_intro *string | null英文简介
established *string | null成立日期
id *number厂商 ID
intro *string | null原文简介
labels *OpenEntityLabelDto[]补充信息标签,键值对形式
logo *OpenMediaDto | null厂商 Logo
name *string厂商名
revised_at *string | null最近一次修订通过审核的时间
trans_intro *string | null简介译文
type *string厂商类型
updated_at *string条目最后更新时间
website *string | null官方网站
curl "https://api.hikarinagi.org/v3/producers/1" \
  -H "Authorization: Bearer $ACCESS_TOKEN"

响应示例

{
  "aliases": [
    "string"
  ],
  "country": "string",
  "created_at": "2026-08-02T00:00:00.000Z",
  "en_intro": "string",
  "established": "string",
  "id": 1,
  "intro": "string",
  "labels": [
    {
      "key": "string",
      "value": "string"
    }
  ],
  "logo": {
    "height": 1,
    "sexual": 1,
    "url": "path/to/asset.jpg",
    "violence": 1,
    "width": 1
  },
  "name": "string",
  "revised_at": "2026-08-02T00:00:00.000Z",
  "trans_intro": "string",
  "type": "string",
  "updated_at": "2026-08-02T00:00:00.000Z",
  "website": "string"
}

用户资料

需用户授权

读取授权用户的公开资料,需 user:read。

公开资料

GET/v3/user/me

需要 scopeuser:read

响应200 成功

响应字段

avatar *MediaAssetDto | null头像
bio *string | null个人简介
equipped_badges *EquippedBadgeDto[]当前佩戴的徽章
equipped_frame *EquippedFrameDto | null当前佩戴的头像框
follower_count *number粉丝数
following_count *number关注数
head_cover *MediaAssetDto | null个人主页封面
id *number用户 ID
is_following *boolean请求方是否已关注该用户;查看自己的资料时恒为 false
is_mutual *boolean是否与该用户互相关注;查看自己的资料时恒为 false
mobile_head_cover *MediaAssetDto | null移动端个人主页封面
name *string用户名
nickname *string | null昵称
role *"USER" | "ADMIN" | "SUPER_ADMIN"用户角色
ADMIN
管理员
SUPER_ADMIN
超级管理员
USER
用户
signature *string | null个性签名
status *"ACTIVE" | "INACTIVE" | "BANNED"账号状态
ACTIVE
正常
BANNED
已封禁
INACTIVE
未激活
curl "https://api.hikarinagi.org/v3/user/me" \
  -H "Authorization: Bearer $ACCESS_TOKEN"

响应示例

{
  "avatar": {
    "height": 1,
    "id": 1,
    "src": "path/to/asset.jpg",
    "width": 1
  },
  "bio": "string",
  "equipped_badges": [
    {
      "decoration": {
        "id": 1,
        "image": {
          "height": 1,
          "id": 1,
          "src": "path/to/asset.jpg",
          "width": 1
        },
        "key": "string",
        "name": "string",
        "scale": 1
      }
    }
  ],
  "equipped_frame": {
    "id": 1,
    "image": {
      "height": 1,
      "id": 1,
      "src": "path/to/asset.jpg",
      "width": 1
    },
    "key": "string",
    "name": "string",
    "scale": 1
  },
  "follower_count": 1,
  "following_count": 1,
  "head_cover": {
    "height": 1,
    "id": 1,
    "src": "path/to/asset.jpg",
    "width": 1
  },
  "id": 1,
  "is_following": false,
  "is_mutual": false,
  "mobile_head_cover": {
    "height": 1,
    "id": 1,
    "src": "path/to/asset.jpg",
    "width": 1
  },
  "name": "string",
  "nickname": "string",
  "role": "USER",
  "signature": "string",
  "status": "ACTIVE"
}

状态与评分

需用户授权

读写授权用户的观看游玩状态与评分,需 status:read 或 status:write。

状态与评分记录

GET分页/v3/user/me/rates

需要 scopestatus:read

响应200 成功

查询参数

status "GOING" | "COMPLETED" | "ON_HOLD" | "DROPPED" | "PLAN"
work_type "GALGAME" | "LIGHT_NOVEL" | "MANGA"
scored booleanOnly rates that carry a score.
page *number
page_size *number

响应字段

items *RateWorkDto[]
meta *PageMetaDto
curl "https://api.hikarinagi.org/v3/user/me/rates?page=1&page_size=10" \
  -H "Authorization: Bearer $ACCESS_TOKEN"

响应示例

{
  "items": [
    {
      "cover": {
        "height": 1,
        "id": 1,
        "nsfw": false,
        "sexual": 1,
        "src": "path/to/asset.jpg",
        "violence": 1,
        "width": 1
      },
      "dimensions": [
        {
          "key": "string",
          "score": 1
        }
      ],
      "id": 1,
      "is_spoiler": false,
      "last_activity_at": "2026-08-02T00:00:00.000Z",
      "rate": 1,
      "rate_content": "string",
      "rate_id": 1,
      "status": "GOING",
      "title": "string",
      "work_type": "GALGAME"
    }
  ],
  "meta": {
    "item_count": 1,
    "page": 1,
    "page_size": 1,
    "total_items": 1,
    "total_pages": 1
  }
}

撤回 Galgame 的记录

DELETE/v3/user/me/rates/galgames/{id}

需要 scopestatus:write

响应204 成功,无响应体

查询参数

id *number
curl -X DELETE "https://api.hikarinagi.org/v3/user/me/rates/galgames/1" \
  -H "Authorization: Bearer $ACCESS_TOKEN"

Galgame 的状态与评分

GET/v3/user/me/rates/galgames/{id}

需要 scopestatus:read

响应200 成功

查询参数

id *number

响应字段

created_at *string创建时间
dislike_count *number短评被踩数
id *number评分记录 ID
is_spoiler *boolean短评是否含剧透
like_count *number短评获赞数
rate *number | null总评分
rate_character *number | null角色评分
rate_content *string短评正文
rate_direction *number | null演出评分
rate_music *number | null音乐评分
rate_scenario *number | null剧本评分
rate_system *number | null系统评分
rate_visual *number | nullCG 评分
status *"GOING" | "COMPLETED" | "ON_HOLD" | "DROPPED" | "PLAN"标记状态
COMPLETED
通关
DROPPED
弃坑
GOING
在玩
ON_HOLD
搁置
PLAN
想玩
time_to_finish_minutes *number通关耗时,单位分钟
updated_at *string最后更新时间
curl "https://api.hikarinagi.org/v3/user/me/rates/galgames/1" \
  -H "Authorization: Bearer $ACCESS_TOKEN"

响应示例

{
  "created_at": "2026-08-02T00:00:00.000Z",
  "dislike_count": 1,
  "id": 1,
  "is_spoiler": false,
  "like_count": 1,
  "rate": 1,
  "rate_character": 1,
  "rate_content": "string",
  "rate_direction": 1,
  "rate_music": 1,
  "rate_scenario": 1,
  "rate_system": 1,
  "rate_visual": 1,
  "status": "GOING",
  "time_to_finish_minutes": 1,
  "updated_at": "2026-08-02T00:00:00.000Z"
}

记录 Galgame 的状态与评分

PUT/v3/user/me/rates/galgames/{id}

需要 scopestatus:write

响应200 成功

查询参数

id *number

请求体

is_spoiler boolean短评是否含剧透
rate number | null总评分
rate_character number | null角色评分
rate_content string短评正文
rate_direction number | null演出评分
rate_music number | null音乐评分
rate_scenario number | null剧本评分
rate_system number | null系统评分
rate_visual number | nullCG 评分
status "GOING" | "COMPLETED" | "ON_HOLD" | "DROPPED" | "PLAN"标记状态
COMPLETED
通关
DROPPED
弃坑
GOING
在玩
ON_HOLD
搁置
PLAN
想玩
time_to_finish_minutes number通关耗时,单位分钟

响应字段

created_at *string创建时间
dislike_count *number短评被踩数
id *number评分记录 ID
is_spoiler *boolean短评是否含剧透
like_count *number短评获赞数
rate *number | null总评分
rate_character *number | null角色评分
rate_content *string短评正文
rate_direction *number | null演出评分
rate_music *number | null音乐评分
rate_scenario *number | null剧本评分
rate_system *number | null系统评分
rate_visual *number | nullCG 评分
status *"GOING" | "COMPLETED" | "ON_HOLD" | "DROPPED" | "PLAN"标记状态
COMPLETED
通关
DROPPED
弃坑
GOING
在玩
ON_HOLD
搁置
PLAN
想玩
time_to_finish_minutes *number通关耗时,单位分钟
updated_at *string最后更新时间
curl -X PUT "https://api.hikarinagi.org/v3/user/me/rates/galgames/1" \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "is_spoiler": false,
    "rate": 1,
    "rate_character": 1,
    "rate_content": "string",
    "rate_direction": 1,
    "rate_music": 1,
    "rate_scenario": 1,
    "rate_system": 1,
    "rate_visual": 1,
    "status": "GOING",
    "time_to_finish_minutes": 1
  }'

响应示例

{
  "created_at": "2026-08-02T00:00:00.000Z",
  "dislike_count": 1,
  "id": 1,
  "is_spoiler": false,
  "like_count": 1,
  "rate": 1,
  "rate_character": 1,
  "rate_content": "string",
  "rate_direction": 1,
  "rate_music": 1,
  "rate_scenario": 1,
  "rate_system": 1,
  "rate_visual": 1,
  "status": "GOING",
  "time_to_finish_minutes": 1,
  "updated_at": "2026-08-02T00:00:00.000Z"
}

撤回轻小说的记录

DELETE/v3/user/me/rates/light-novels/{id}

需要 scopestatus:write

响应204 成功,无响应体

查询参数

id *number
curl -X DELETE "https://api.hikarinagi.org/v3/user/me/rates/light-novels/1" \
  -H "Authorization: Bearer $ACCESS_TOKEN"

轻小说的状态与评分

GET/v3/user/me/rates/light-novels/{id}

需要 scopestatus:read

响应200 成功

查询参数

id *number

响应字段

created_at *string创建时间
dislike_count *number短评被踩数
id *number评分记录 ID
is_spoiler *boolean短评是否含剧透
like_count *number短评获赞数
rate *number | null总评分
rate_character *number | null角色评分
rate_content *string短评正文
rate_illustration *number | null插画评分
rate_pacing *number | null节奏评分
rate_plot *number | null剧情评分
rate_worldview *number | null世界观评分
rate_writing *number | null文笔评分
status *"GOING" | "COMPLETED" | "ON_HOLD" | "DROPPED" | "PLAN"标记状态
COMPLETED
读完
DROPPED
弃读
GOING
在读
ON_HOLD
搁置
PLAN
想读
time_to_finish_minutes *number阅读耗时,单位分钟
updated_at *string最后更新时间
curl "https://api.hikarinagi.org/v3/user/me/rates/light-novels/1" \
  -H "Authorization: Bearer $ACCESS_TOKEN"

响应示例

{
  "created_at": "2026-08-02T00:00:00.000Z",
  "dislike_count": 1,
  "id": 1,
  "is_spoiler": false,
  "like_count": 1,
  "rate": 1,
  "rate_character": 1,
  "rate_content": "string",
  "rate_illustration": 1,
  "rate_pacing": 1,
  "rate_plot": 1,
  "rate_worldview": 1,
  "rate_writing": 1,
  "status": "GOING",
  "time_to_finish_minutes": 1,
  "updated_at": "2026-08-02T00:00:00.000Z"
}

记录轻小说的状态与评分

PUT/v3/user/me/rates/light-novels/{id}

需要 scopestatus:write

响应200 成功

查询参数

id *number

请求体

is_spoiler boolean短评是否含剧透
rate number | null总评分
rate_character number | null角色评分
rate_content string短评正文
rate_illustration number | null插画评分
rate_pacing number | null节奏评分
rate_plot number | null剧情评分
rate_worldview number | null世界观评分
rate_writing number | null文笔评分
status "GOING" | "COMPLETED" | "ON_HOLD" | "DROPPED" | "PLAN"标记状态
COMPLETED
读完
DROPPED
弃读
GOING
在读
ON_HOLD
搁置
PLAN
想读
time_to_finish_minutes number阅读耗时,单位分钟

响应字段

created_at *string创建时间
dislike_count *number短评被踩数
id *number评分记录 ID
is_spoiler *boolean短评是否含剧透
like_count *number短评获赞数
rate *number | null总评分
rate_character *number | null角色评分
rate_content *string短评正文
rate_illustration *number | null插画评分
rate_pacing *number | null节奏评分
rate_plot *number | null剧情评分
rate_worldview *number | null世界观评分
rate_writing *number | null文笔评分
status *"GOING" | "COMPLETED" | "ON_HOLD" | "DROPPED" | "PLAN"标记状态
COMPLETED
读完
DROPPED
弃读
GOING
在读
ON_HOLD
搁置
PLAN
想读
time_to_finish_minutes *number阅读耗时,单位分钟
updated_at *string最后更新时间
curl -X PUT "https://api.hikarinagi.org/v3/user/me/rates/light-novels/1" \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "is_spoiler": false,
    "rate": 1,
    "rate_character": 1,
    "rate_content": "string",
    "rate_illustration": 1,
    "rate_pacing": 1,
    "rate_plot": 1,
    "rate_worldview": 1,
    "rate_writing": 1,
    "status": "GOING",
    "time_to_finish_minutes": 1
  }'

响应示例

{
  "created_at": "2026-08-02T00:00:00.000Z",
  "dislike_count": 1,
  "id": 1,
  "is_spoiler": false,
  "like_count": 1,
  "rate": 1,
  "rate_character": 1,
  "rate_content": "string",
  "rate_illustration": 1,
  "rate_pacing": 1,
  "rate_plot": 1,
  "rate_worldview": 1,
  "rate_writing": 1,
  "status": "GOING",
  "time_to_finish_minutes": 1,
  "updated_at": "2026-08-02T00:00:00.000Z"
}

撤回漫画的记录

DELETE/v3/user/me/rates/mangas/{id}

需要 scopestatus:write

响应204 成功,无响应体

查询参数

id *number
curl -X DELETE "https://api.hikarinagi.org/v3/user/me/rates/mangas/1" \
  -H "Authorization: Bearer $ACCESS_TOKEN"

漫画的状态与评分

GET/v3/user/me/rates/mangas/{id}

需要 scopestatus:read

响应200 成功

查询参数

id *number

响应字段

created_at *string创建时间
dislike_count *number短评被踩数
id *number评分记录 ID
is_spoiler *boolean短评是否含剧透
like_count *number短评获赞数
rate *number | null总评分
rate_content *string短评正文
status *"GOING" | "COMPLETED" | "ON_HOLD" | "DROPPED" | "PLAN"标记状态
COMPLETED
看过
DROPPED
弃坑
GOING
在看
ON_HOLD
搁置
PLAN
想看
updated_at *string最后更新时间
curl "https://api.hikarinagi.org/v3/user/me/rates/mangas/1" \
  -H "Authorization: Bearer $ACCESS_TOKEN"

响应示例

{
  "created_at": "2026-08-02T00:00:00.000Z",
  "dislike_count": 1,
  "id": 1,
  "is_spoiler": false,
  "like_count": 1,
  "rate": 1,
  "rate_content": "string",
  "status": "GOING",
  "updated_at": "2026-08-02T00:00:00.000Z"
}

记录漫画的状态与评分

PUT/v3/user/me/rates/mangas/{id}

需要 scopestatus:write

响应200 成功

查询参数

id *number

请求体

is_spoiler boolean短评是否含剧透
rate number | null总评分
rate_content string短评正文
status "GOING" | "COMPLETED" | "ON_HOLD" | "DROPPED" | "PLAN"标记状态
COMPLETED
看过
DROPPED
弃坑
GOING
在看
ON_HOLD
搁置
PLAN
想看

响应字段

created_at *string创建时间
dislike_count *number短评被踩数
id *number评分记录 ID
is_spoiler *boolean短评是否含剧透
like_count *number短评获赞数
rate *number | null总评分
rate_content *string短评正文
status *"GOING" | "COMPLETED" | "ON_HOLD" | "DROPPED" | "PLAN"标记状态
COMPLETED
看过
DROPPED
弃坑
GOING
在看
ON_HOLD
搁置
PLAN
想看
updated_at *string最后更新时间
curl -X PUT "https://api.hikarinagi.org/v3/user/me/rates/mangas/1" \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "is_spoiler": false,
    "rate": 1,
    "rate_content": "string",
    "status": "GOING"
  }'

响应示例

{
  "created_at": "2026-08-02T00:00:00.000Z",
  "dislike_count": 1,
  "id": 1,
  "is_spoiler": false,
  "like_count": 1,
  "rate": 1,
  "rate_content": "string",
  "status": "GOING",
  "updated_at": "2026-08-02T00:00:00.000Z"
}

收藏夹

需用户授权

读写授权用户的收藏夹,需 collection:read 或 collection:write。

收藏夹列表

GET返回数组/v3/user/me/collections

需要 scopecollection:read

响应200 成功

响应字段

id *number收藏夹 ID
is_default *boolean是否为默认收藏夹
is_private *boolean是否为私密收藏夹
item_count *number收藏夹内的条目总数,含板块与话题收藏,因此可能大于收藏项接口能返回的条数
name *string收藏夹名称
curl "https://api.hikarinagi.org/v3/user/me/collections" \
  -H "Authorization: Bearer $ACCESS_TOKEN"

响应示例

[
  {
    "id": 1,
    "is_default": false,
    "is_private": false,
    "item_count": 1,
    "name": "string"
  }
]

创建收藏夹

POST/v3/user/me/collections

需要 scopecollection:write

响应200 成功

请求体

description string收藏夹简介
is_private boolean是否设为私密收藏夹
name *string收藏夹名称

响应字段

description *string | null收藏夹简介
id *number收藏夹 ID
is_default *boolean是否为默认收藏夹
is_private *boolean是否为私密收藏夹
name *string收藏夹名称
owner_id *number收藏夹所有者的用户 ID
curl -X POST "https://api.hikarinagi.org/v3/user/me/collections" \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "description": "string",
    "is_private": false,
    "name": "string"
  }'

响应示例

{
  "description": "string",
  "id": 1,
  "is_default": false,
  "is_private": false,
  "name": "string",
  "owner_id": 1
}

删除收藏夹

DELETE/v3/user/me/collections/{id}

需要 scopecollection:write

响应204 成功,无响应体

查询参数

id *number
curl -X DELETE "https://api.hikarinagi.org/v3/user/me/collections/1" \
  -H "Authorization: Bearer $ACCESS_TOKEN"

收藏夹详情

GET/v3/user/me/collections/{id}

需要 scopecollection:read

响应200 成功

查询参数

id *number

响应字段

description *string | null收藏夹简介
id *number收藏夹 ID
is_default *boolean是否为默认收藏夹
is_private *boolean是否为私密收藏夹
name *string收藏夹名称
owner_id *number收藏夹所有者的用户 ID
curl "https://api.hikarinagi.org/v3/user/me/collections/1" \
  -H "Authorization: Bearer $ACCESS_TOKEN"

响应示例

{
  "description": "string",
  "id": 1,
  "is_default": false,
  "is_private": false,
  "name": "string",
  "owner_id": 1
}

修改收藏夹

PATCH/v3/user/me/collections/{id}

需要 scopecollection:write

响应200 成功

查询参数

id *number

请求体

description string收藏夹简介
is_private boolean是否设为私密收藏夹
name string收藏夹名称

响应字段

description *string | null收藏夹简介
id *number收藏夹 ID
is_default *boolean是否为默认收藏夹
is_private *boolean是否为私密收藏夹
name *string收藏夹名称
owner_id *number收藏夹所有者的用户 ID
curl -X PATCH "https://api.hikarinagi.org/v3/user/me/collections/1" \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "description": "string",
    "is_private": false,
    "name": "string"
  }'

响应示例

{
  "description": "string",
  "id": 1,
  "is_default": false,
  "is_private": false,
  "name": "string",
  "owner_id": 1
}

从收藏夹移除 Galgame

DELETE/v3/user/me/collections/{id}/galgames/{work_id}

需要 scopecollection:write

响应204 成功,无响应体

查询参数

id *number
work_id *number
curl -X DELETE "https://api.hikarinagi.org/v3/user/me/collections/1/galgames/1" \
  -H "Authorization: Bearer $ACCESS_TOKEN"

将 Galgame 收入收藏夹

PUT/v3/user/me/collections/{id}/galgames/{work_id}

需要 scopecollection:write

响应200 成功

查询参数

id *number
work_id *number

请求体

note string收藏备注

响应字段

favorited *boolean请求方是否已收藏该条目
curl -X PUT "https://api.hikarinagi.org/v3/user/me/collections/1/galgames/1" \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "note": "string"
  }'

响应示例

{
  "favorited": false
}

收藏夹内的条目

GET分页/v3/user/me/collections/{id}/items

需要 scopecollection:read

响应200 成功

查询参数

id *number
type "galgame" | "light_novel" | "manga" | "article" | "post"
keyword string
page *number
page_size *number

响应字段

items *FavoriteCollectionItemDto[]收藏项列表
meta *PageMetaDto分页信息
type_counts *FavoriteCollectionItemCountsDto各内容类型的收藏数统计
curl "https://api.hikarinagi.org/v3/user/me/collections/1/items?page=1&page_size=10" \
  -H "Authorization: Bearer $ACCESS_TOKEN"

响应示例

{
  "items": [
    {
      "article": {
        "cover": {
          "height": 1,
          "id": 1,
          "src": "path/to/asset.jpg",
          "width": 1
        },
        "created_at": "2026-08-02T00:00:00.000Z",
        "creator": {
          "avatar": {},
          "equipped_badges": [],
          "equipped_frame": {},
          "id": 1,
          "name": "string",
          "nickname": "string",
          "role": "USER"
        },
        "id": 1,
        "like_count": 1,
        "sections": [
          {}
        ],
        "title": "string",
        "topics": [
          {}
        ],
        "updated_at": "2026-08-02T00:00:00.000Z",
        "view_count": 1
      },
      "created_at": "2026-08-02T00:00:00.000Z",
      "galgame": {
        "covers": [
          {}
        ],
        "id": 1,
        "nsfw": false,
        "origin_title": "string",
        "producers": [
          {}
        ],
        "release_date": "string",
        "trans_title": "string"
      },
      "id": 1,
      "light_novel": {
        "author": {
          "id": 1,
          "name": "string"
        },
        "bunko": {
          "id": 1,
          "name": "string"
        },
        "covers": [
          {}
        ],
        "id": 1,
        "name": "string",
        "name_cn": "string",
        "novel_status": "SERIALIZING",
        "nsfw": false,
        "publication_date": "string",
        "publishers": [
          {}
        ]
      },
      "manga": {
        "covers": [
          {}
        ],
        "id": 1,
        "latest_chapter_at": "2026-08-02T00:00:00.000Z",
        "name": "string",
        "name_cn": "string",
        "nsfw": false,
        "publication_date": "string",
        "serial_status": "SERIALIZING"
      },
      "note": "string",
      "post": {
        "covers": [
          {}
        ],
        "created_at": "2026-08-02T00:00:00.000Z",
        "creator": {
          "avatar": {},
          "equipped_badges": [],
          "equipped_frame": {},
          "id": 1,
          "name": "string",
          "nickname": "string",
          "role": "USER"
        },
        "id": 1,
        "like_count": 1,
        "sections": [
          {}
        ],
        "title": "string",
        "topics": [
          {}
        ],
        "updated_at": "2026-08-02T00:00:00.000Z",
        "view_count": 1
      },
      "type": "galgame"
    }
  ],
  "meta": {
    "item_count": 1,
    "page": 1,
    "page_size": 1,
    "total_items": 1,
    "total_pages": 1
  },
  "type_counts": {
    "article": 1,
    "galgame": 1,
    "light_novel": 1,
    "manga": 1,
    "post": 1,
    "total": 1
  }
}

从收藏夹移除轻小说

DELETE/v3/user/me/collections/{id}/light-novels/{work_id}

需要 scopecollection:write

响应204 成功,无响应体

查询参数

id *number
work_id *number
curl -X DELETE "https://api.hikarinagi.org/v3/user/me/collections/1/light-novels/1" \
  -H "Authorization: Bearer $ACCESS_TOKEN"

将轻小说收入收藏夹

PUT/v3/user/me/collections/{id}/light-novels/{work_id}

需要 scopecollection:write

响应200 成功

查询参数

id *number
work_id *number

请求体

note string收藏备注

响应字段

favorited *boolean请求方是否已收藏该条目
curl -X PUT "https://api.hikarinagi.org/v3/user/me/collections/1/light-novels/1" \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "note": "string"
  }'

响应示例

{
  "favorited": false
}

从收藏夹移除漫画

DELETE/v3/user/me/collections/{id}/mangas/{work_id}

需要 scopecollection:write

响应204 成功,无响应体

查询参数

id *number
work_id *number
curl -X DELETE "https://api.hikarinagi.org/v3/user/me/collections/1/mangas/1" \
  -H "Authorization: Bearer $ACCESS_TOKEN"

将漫画收入收藏夹

PUT/v3/user/me/collections/{id}/mangas/{work_id}

需要 scopecollection:write

响应200 成功

查询参数

id *number
work_id *number

请求体

note string收藏备注

响应字段

favorited *boolean请求方是否已收藏该条目
curl -X PUT "https://api.hikarinagi.org/v3/user/me/collections/1/mangas/1" \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "note": "string"
  }'

响应示例

{
  "favorited": false
}

你和同好的ACGN社区

© 2026 Hikarinagi · Some Rights Reserved · 3.31.0

开发者平台