{
 "openapi": "3.0.3",
 "info": {
  "title": "HCNネットワーク 公開API",
  "version": "1.0.0",
  "description": "HCNネットワークの「VRCニュース」の記事、人気データ、稼働状況、更新履歴を、認証なしで読み取るAPIです。ワールド内のギミックや、自分のサーバーから使えます。\n\n- 呼び出せるのは **GET** だけです。認証・APIキーは要りません。\n- データは約5分ごとに更新されます。更新の確認には `updated.txt` を使ってください(短い間隔での取得は控えてください)。\n- VRChat・BOOTH非公式です。記事の権利はHCNネットワークにあります。引用・利用のときは、元の記事のURLを添えてください。",
  "contact": {
   "name": "HCNネットワーク",
   "url": "https://hcnnetwork.hachune.space/contact/"
  }
 },
 "servers": [
  {
   "url": "https://hcnnetwork.hachune.space/api/v1"
  }
 ],
 "tags": [
  {
   "name": "記事",
   "description": "ニュース記事の一覧・本文・タグ"
  },
  {
   "name": "ワールド内向け",
   "description": "VRCStringDownloader などで読み込みやすい、ニュースのプレーンテキスト"
  },
  {
   "name": "最新情報フィード",
   "description": "ワールド制作者向け・アバター・セールの最新情報"
  },
  {
   "name": "人気データ",
   "description": "VRChat データ API の人気上位(出店元・作者の表示をお願いします)"
  },
  {
   "name": "サービス",
   "description": "稼働状況・更新履歴"
  },
  {
   "name": "そのほか"
  }
 ],
 "paths": {
  "/news.json": {
   "get": {
    "tags": [
     "記事"
    ],
    "summary": "記事の一覧(新しい順)",
    "description": "最新50件。本文は含みません。本文は `/news/articles/{slug}.json` で取得します。",
    "operationId": "listNews",
    "responses": {
     "200": {
      "description": "成功",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "updated_at": {
           "type": "string",
           "format": "date-time"
          },
          "count": {
           "type": "integer"
          },
          "items": {
           "type": "array",
           "items": {
            "$ref": "#/components/schemas/NewsItem"
           }
          }
         }
        }
       }
      }
     }
    }
   }
  },
  "/news/latest.json": {
   "get": {
    "tags": [
     "記事"
    ],
    "summary": "最新の記事(本文つき)",
    "operationId": "latestNews",
    "responses": {
     "200": {
      "description": "成功",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/NewsDetail"
        }
       }
      }
     }
    }
   }
  },
  "/news/articles/{slug}.json": {
   "get": {
    "tags": [
     "記事"
    ],
    "summary": "記事の本文",
    "operationId": "getNews",
    "parameters": [
     {
      "name": "slug",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string",
       "example": "vrc-news-start"
      },
      "description": "記事のスラッグ(一覧の `slug`)"
     }
    ],
    "responses": {
     "200": {
      "description": "成功",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/NewsDetail"
        }
       }
      }
     },
     "404": {
      "description": "記事がありません"
     }
    }
   }
  },
  "/news/headlines.txt": {
   "get": {
    "tags": [
     "ワールド内向け"
    ],
    "summary": "見出しの一覧(1行1件)",
    "description": "`2026-10-31 タイトル` の形式。新しい順に、最大10行。UTF-8、改行は LF。",
    "operationId": "headlines",
    "responses": {
     "200": {
      "description": "成功",
      "content": {
       "text/plain": {
        "schema": {
         "type": "string",
         "example": "2026-10-31 VRCニュースを始めます（不定期更新）"
        }
       }
      }
     }
    }
   }
  },
  "/news/latest.txt": {
   "get": {
    "tags": [
     "ワールド内向け"
    ],
    "summary": "最新の記事(プレーンテキスト)",
    "description": "1行目がタイトル、2行目が日付、3行目が元記事のURL、4行目は空行、5行目以降が本文。最大3000文字。",
    "operationId": "latestText",
    "responses": {
     "200": {
      "description": "成功",
      "content": {
       "text/plain": {
        "schema": {
         "type": "string"
        }
       }
      }
     }
    }
   }
  },
  "/news/updated.txt": {
   "get": {
    "tags": [
     "ワールド内向け"
    ],
    "summary": "最終更新日時だけ",
    "description": "`2026-10-31T08:00:00+09:00` のような1行。前回と同じなら、再取得は要りません。",
    "operationId": "updated",
    "responses": {
     "200": {
      "description": "成功",
      "content": {
       "text/plain": {
        "schema": {
         "type": "string",
         "example": "2026-10-31T08:00:00+09:00"
        }
       }
      }
     }
    }
   }
  },
  "/news/feed.xml": {
   "get": {
    "tags": [
     "そのほか"
    ],
    "summary": "Atomフィード",
    "operationId": "feed",
    "responses": {
     "200": {
      "description": "成功",
      "content": {
       "application/atom+xml": {
        "schema": {
         "type": "string"
        }
       }
      }
     }
    }
   }
  },
  "/site.json": {
   "get": {
    "tags": [
     "そのほか"
    ],
    "summary": "サイトの概要",
    "description": "名称・URL・運営しているものの一覧。",
    "operationId": "site",
    "responses": {
     "200": {
      "description": "成功",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "name": {
           "type": "string"
          },
          "url": {
           "type": "string"
          },
          "unofficial_notice": {
           "type": "string"
          },
          "products": {
           "type": "array",
           "items": {
            "type": "object",
            "properties": {
             "name": {
              "type": "string"
             },
             "url": {
              "type": "string"
             },
             "status": {
              "type": "string"
             }
            }
           }
          }
         }
        }
       }
      }
     }
    }
   }
  },
  "/status.json": {
   "get": {
    "tags": [
     "サービス"
    ],
    "summary": "各サイトの稼働状況",
    "description": "各サイトのトップページが応答するかを、約5分ごとに確認した結果です。BOT本体(コエル)の稼働ではありません。",
    "operationId": "status",
    "responses": {
     "200": {
      "description": "成功",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "checked_at": {
           "type": "string",
           "format": "date-time"
          },
          "overall": {
           "type": "string",
           "enum": [
            "ok",
            "degraded",
            "down"
           ]
          },
          "services": {
           "type": "array",
           "items": {
            "type": "object",
            "properties": {
             "id": {
              "type": "string"
             },
             "name": {
              "type": "string"
             },
             "status": {
              "type": "string",
              "enum": [
               "ok",
               "degraded",
               "down"
              ]
             },
             "http_status": {
              "type": "integer"
             },
             "response_ms": {
              "type": "integer"
             }
            }
           }
          }
         }
        }
       }
      }
     }
    }
   }
  },
  "/status.txt": {
   "get": {
    "tags": [
     "サービス"
    ],
    "summary": "稼働状況(プレーンテキスト)",
    "description": "1行目=全体(ok/degraded/down)、2行目=確認日時、以降=`id 状態`。ワールド内の掲示板向けです。",
    "operationId": "statusText",
    "responses": {
     "200": {
      "description": "成功",
      "content": {
       "text/plain": {
        "schema": {
         "type": "string",
         "example": "ok"
        }
       }
      }
     }
    }
   }
  },
  "/changelog.json": {
   "get": {
    "tags": [
     "サービス"
    ],
    "summary": "更新履歴",
    "description": "HCNネットワークのお知らせ(サービスの更新)の一覧。新しい順。",
    "operationId": "changelog",
    "responses": {
     "200": {
      "description": "成功",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "updated_at": {
           "type": "string",
           "format": "date"
          },
          "count": {
           "type": "integer"
          },
          "items": {
           "type": "array",
           "items": {
            "type": "object",
            "properties": {
             "date": {
              "type": "string",
              "format": "date"
             },
             "category": {
              "type": "string"
             },
             "title": {
              "type": "string"
             },
             "url": {
              "type": "string",
              "format": "uri"
             }
            }
           }
          }
         }
        }
       }
      }
     }
    }
   }
  },
  "/changelog.txt": {
   "get": {
    "tags": [
     "サービス"
    ],
    "summary": "更新履歴(プレーンテキスト)",
    "description": "`2026-10-29 [API] タイトル` の形式で1行1件。",
    "operationId": "changelogText",
    "responses": {
     "200": {
      "description": "成功",
      "content": {
       "text/plain": {
        "schema": {
         "type": "string"
        }
       }
      }
     }
    }
   }
  },
  "/tags.json": {
   "get": {
    "tags": [
     "記事"
    ],
    "summary": "タグの一覧",
    "description": "ニュース記事のタグと、そのタグが付いた記事のスラッグ。",
    "operationId": "tags",
    "responses": {
     "200": {
      "description": "成功",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "updated_at": {
           "type": "string",
           "format": "date-time"
          },
          "count": {
           "type": "integer"
          },
          "tags": {
           "type": "array",
           "items": {
            "type": "object",
            "properties": {
             "name": {
              "type": "string"
             },
             "count": {
              "type": "integer"
             },
             "slugs": {
              "type": "array",
              "items": {
               "type": "string"
              }
             }
            }
           }
          }
         }
        }
       }
      }
     }
    }
   }
  },
  "/popular/avatars.json": {
   "get": {
    "tags": [
     "人気データ"
    ],
    "summary": "人気アバターの上位10件",
    "description": "VRChat データ API(BOOTHのVRChat向けアバター)の人気順の上位10件。出店元の名前とリンクを添えて表示してください。",
    "operationId": "popularAvatars",
    "responses": {
     "200": {
      "description": "成功",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "updated_at": {
           "type": "string",
           "format": "date-time"
          },
          "source": {
           "type": "string"
          },
          "credit": {
           "type": "string",
           "description": "表示するときの、出典・作者表記のお願い(強制ではありません)"
          },
          "count": {
           "type": "integer"
          },
          "items": {
           "type": "array",
           "items": {
            "type": "object",
            "properties": {
             "rank": {
              "type": "integer"
             },
             "item_id": {
              "type": "string"
             },
             "name": {
              "type": "string"
             },
             "price": {
              "type": "string"
             },
             "on_sale": {
              "type": "boolean"
             },
             "image_url": {
              "type": "string"
             },
             "item_url": {
              "type": "string"
             },
             "shop_name": {
              "type": "string"
             },
             "shop_url": {
              "type": "string"
             }
            }
           }
          }
         }
        }
       }
      }
     }
    }
   }
  },
  "/popular/avatars.txt": {
   "get": {
    "tags": [
     "人気データ"
    ],
    "summary": "人気アバター(プレーンテキスト)",
    "description": "`1. 名前 / 出店元` の形式で10行。ワールド内の掲示板向け。",
    "operationId": "popularAvatarsText",
    "responses": {
     "200": {
      "description": "成功",
      "content": {
       "text/plain": {
        "schema": {
         "type": "string"
        }
       }
      }
     }
    }
   }
  },
  "/popular/worlds.json": {
   "get": {
    "tags": [
     "人気データ"
    ],
    "summary": "人気ワールドの上位10件",
    "description": "VRChat データ API のワールド一覧(お気に入り数順)の上位10件。作者名とワールドのURLを添えて表示してください。",
    "operationId": "popularWorlds",
    "responses": {
     "200": {
      "description": "成功",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "updated_at": {
           "type": "string",
           "format": "date-time"
          },
          "source": {
           "type": "string"
          },
          "credit": {
           "type": "string",
           "description": "表示するときの、出典・作者表記のお願い(強制ではありません)"
          },
          "count": {
           "type": "integer"
          },
          "items": {
           "type": "array",
           "items": {
            "type": "object",
            "properties": {
             "rank": {
              "type": "integer"
             },
             "world_id": {
              "type": "string"
             },
             "name": {
              "type": "string"
             },
             "author_name": {
              "type": "string"
             },
             "favorites": {
              "type": "integer"
             },
             "capacity": {
              "type": "integer"
             },
             "image_url": {
              "type": "string"
             },
             "world_url": {
              "type": "string"
             }
            }
           }
          }
         }
        }
       }
      }
     }
    }
   }
  },
  "/popular/worlds.txt": {
   "get": {
    "tags": [
     "人気データ"
    ],
    "summary": "人気ワールド(プレーンテキスト)",
    "description": "`1. 名前 / 作者 (お気に入り N)` の形式で10行。",
    "operationId": "popularWorldsText",
    "responses": {
     "200": {
      "description": "成功",
      "content": {
       "text/plain": {
        "schema": {
         "type": "string"
        }
       }
      }
     }
    }
   }
  },
  "/feed.json": {
   "get": {
    "tags": [
     "最新情報フィード"
    ],
    "summary": "最新情報(すべて)",
    "description": "約5分ごとに更新される、要約つきの最新情報です。要約は機械が作ったものです。内容の正確さは確認していません。投稿の本文・画像は含みません。 最新100件。",
    "operationId": "feedAll",
    "responses": {
     "200": {
      "description": "成功",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "updated_at": {
           "type": "string",
           "format": "date-time"
          },
          "note": {
           "type": "string"
          },
          "count": {
           "type": "integer"
          },
          "items": {
           "type": "array",
           "items": {
            "type": "object",
            "properties": {
             "id": {
              "type": "string"
             },
             "category": {
              "type": "string",
              "enum": [
               "world",
               "avatar",
               "sale"
              ]
             },
             "summary": {
              "type": "string",
              "description": "機械が作った要約(60文字ほど)。投稿の本文ではありません"
             },
             "tags": {
              "type": "array",
              "items": {
               "type": "string"
              }
             },
             "sale": {
              "type": "object",
              "nullable": true,
              "properties": {
               "item": {
                "type": "string",
                "nullable": true
               },
               "shop": {
                "type": "string",
                "nullable": true
               },
               "discount": {
                "type": "string",
                "nullable": true
               },
               "until": {
                "type": "string",
                "nullable": true
               }
              }
             },
             "author_name": {
              "type": "string"
             },
             "author_handle": {
              "type": "string"
             },
             "posted_at": {
              "type": "string",
              "format": "date-time"
             },
             "url": {
              "type": "string",
              "format": "uri",
              "description": "元の投稿のURL"
             }
            }
           }
          }
         }
        }
       }
      }
     }
    }
   }
  },
  "/feed/world.json": {
   "get": {
    "tags": [
     "最新情報フィード"
    ],
    "summary": "最新情報(ワールド制作者向け)",
    "description": "約5分ごとに更新される、要約つきの最新情報です。要約は機械が作ったものです。内容の正確さは確認していません。投稿の本文・画像は含みません。 最新60件。",
    "operationId": "feed_world",
    "responses": {
     "200": {
      "description": "成功",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "updated_at": {
           "type": "string",
           "format": "date-time"
          },
          "note": {
           "type": "string"
          },
          "count": {
           "type": "integer"
          },
          "category": {
           "type": "string"
          },
          "label": {
           "type": "string"
          },
          "items": {
           "type": "array",
           "items": {
            "type": "object",
            "properties": {
             "id": {
              "type": "string"
             },
             "category": {
              "type": "string",
              "enum": [
               "world",
               "avatar",
               "sale"
              ]
             },
             "summary": {
              "type": "string",
              "description": "機械が作った要約(60文字ほど)。投稿の本文ではありません"
             },
             "tags": {
              "type": "array",
              "items": {
               "type": "string"
              }
             },
             "sale": {
              "type": "object",
              "nullable": true,
              "properties": {
               "item": {
                "type": "string",
                "nullable": true
               },
               "shop": {
                "type": "string",
                "nullable": true
               },
               "discount": {
                "type": "string",
                "nullable": true
               },
               "until": {
                "type": "string",
                "nullable": true
               }
              }
             },
             "author_name": {
              "type": "string"
             },
             "author_handle": {
              "type": "string"
             },
             "posted_at": {
              "type": "string",
              "format": "date-time"
             },
             "url": {
              "type": "string",
              "format": "uri",
              "description": "元の投稿のURL"
             }
            }
           }
          }
         }
        }
       }
      }
     }
    }
   }
  },
  "/feed/world.txt": {
   "get": {
    "tags": [
     "最新情報フィード"
    ],
    "summary": "最新情報(ワールド制作者向け)・プレーンテキスト",
    "description": "`2026-10-31 要約 (@投稿者)` の形式で最大15行。ワールド内の掲示板向け。",
    "operationId": "feedText_world",
    "responses": {
     "200": {
      "description": "成功",
      "content": {
       "text/plain": {
        "schema": {
         "type": "string"
        }
       }
      }
     }
    }
   }
  },
  "/feed/avatar.json": {
   "get": {
    "tags": [
     "最新情報フィード"
    ],
    "summary": "最新情報(アバター)",
    "description": "約5分ごとに更新される、要約つきの最新情報です。要約は機械が作ったものです。内容の正確さは確認していません。投稿の本文・画像は含みません。 最新60件。",
    "operationId": "feed_avatar",
    "responses": {
     "200": {
      "description": "成功",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "updated_at": {
           "type": "string",
           "format": "date-time"
          },
          "note": {
           "type": "string"
          },
          "count": {
           "type": "integer"
          },
          "category": {
           "type": "string"
          },
          "label": {
           "type": "string"
          },
          "items": {
           "type": "array",
           "items": {
            "type": "object",
            "properties": {
             "id": {
              "type": "string"
             },
             "category": {
              "type": "string",
              "enum": [
               "world",
               "avatar",
               "sale"
              ]
             },
             "summary": {
              "type": "string",
              "description": "機械が作った要約(60文字ほど)。投稿の本文ではありません"
             },
             "tags": {
              "type": "array",
              "items": {
               "type": "string"
              }
             },
             "sale": {
              "type": "object",
              "nullable": true,
              "properties": {
               "item": {
                "type": "string",
                "nullable": true
               },
               "shop": {
                "type": "string",
                "nullable": true
               },
               "discount": {
                "type": "string",
                "nullable": true
               },
               "until": {
                "type": "string",
                "nullable": true
               }
              }
             },
             "author_name": {
              "type": "string"
             },
             "author_handle": {
              "type": "string"
             },
             "posted_at": {
              "type": "string",
              "format": "date-time"
             },
             "url": {
              "type": "string",
              "format": "uri",
              "description": "元の投稿のURL"
             }
            }
           }
          }
         }
        }
       }
      }
     }
    }
   }
  },
  "/feed/avatar.txt": {
   "get": {
    "tags": [
     "最新情報フィード"
    ],
    "summary": "最新情報(アバター)・プレーンテキスト",
    "description": "`2026-10-31 要約 (@投稿者)` の形式で最大15行。ワールド内の掲示板向け。",
    "operationId": "feedText_avatar",
    "responses": {
     "200": {
      "description": "成功",
      "content": {
       "text/plain": {
        "schema": {
         "type": "string"
        }
       }
      }
     }
    }
   }
  },
  "/feed/sale.json": {
   "get": {
    "tags": [
     "最新情報フィード"
    ],
    "summary": "最新情報(セール)",
    "description": "約5分ごとに更新される、要約つきの最新情報です。要約は機械が作ったものです。内容の正確さは確認していません。投稿の本文・画像は含みません。 最新60件。",
    "operationId": "feed_sale",
    "responses": {
     "200": {
      "description": "成功",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "updated_at": {
           "type": "string",
           "format": "date-time"
          },
          "note": {
           "type": "string"
          },
          "count": {
           "type": "integer"
          },
          "category": {
           "type": "string"
          },
          "label": {
           "type": "string"
          },
          "items": {
           "type": "array",
           "items": {
            "type": "object",
            "properties": {
             "id": {
              "type": "string"
             },
             "category": {
              "type": "string",
              "enum": [
               "world",
               "avatar",
               "sale"
              ]
             },
             "summary": {
              "type": "string",
              "description": "機械が作った要約(60文字ほど)。投稿の本文ではありません"
             },
             "tags": {
              "type": "array",
              "items": {
               "type": "string"
              }
             },
             "sale": {
              "type": "object",
              "nullable": true,
              "properties": {
               "item": {
                "type": "string",
                "nullable": true
               },
               "shop": {
                "type": "string",
                "nullable": true
               },
               "discount": {
                "type": "string",
                "nullable": true
               },
               "until": {
                "type": "string",
                "nullable": true
               }
              }
             },
             "author_name": {
              "type": "string"
             },
             "author_handle": {
              "type": "string"
             },
             "posted_at": {
              "type": "string",
              "format": "date-time"
             },
             "url": {
              "type": "string",
              "format": "uri",
              "description": "元の投稿のURL"
             }
            }
           }
          }
         }
        }
       }
      }
     }
    }
   }
  },
  "/feed/sale.txt": {
   "get": {
    "tags": [
     "最新情報フィード"
    ],
    "summary": "最新情報(セール)・プレーンテキスト",
    "description": "`2026-10-31 要約 (@投稿者)` の形式で最大15行。ワールド内の掲示板向け。",
    "operationId": "feedText_sale",
    "responses": {
     "200": {
      "description": "成功",
      "content": {
       "text/plain": {
        "schema": {
         "type": "string"
        }
       }
      }
     }
    }
   }
  },
  "/news/index.json": {
   "get": {
    "tags": [
     "記事"
    ],
    "summary": "記事の検索用インデックス",
    "description": "全記事の、見出し・要約・タグ・日付の一覧(本文なし)。キーワードで絞り込むときに使います。",
    "operationId": "newsIndex",
    "responses": {
     "200": {
      "description": "成功",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "updated_at": {
           "type": "string",
           "format": "date-time"
          },
          "count": {
           "type": "integer"
          },
          "items": {
           "type": "array",
           "items": {
            "type": "object",
            "properties": {
             "slug": {
              "type": "string"
             },
             "title": {
              "type": "string"
             },
             "published_at": {
              "type": "string",
              "format": "date-time"
             },
             "tags": {
              "type": "array",
              "items": {
               "type": "string"
              }
             },
             "excerpt": {
              "type": "string"
             },
             "hcn_url": {
              "type": "string"
             }
            }
           }
          }
         }
        }
       }
      }
     }
    }
   }
  },
  "/deals/avatars.json": {
   "get": {
    "tags": [
     "人気データ"
    ],
    "summary": "セール中のアバター(割引率順)",
    "description": "VRChat データ API のうち、割引中のアバターを、割引率の高い順に最大30件。出店元の名前とリンクを添えて表示してください。割引率・価格は取得時点のものです。",
    "operationId": "dealsAvatars",
    "responses": {
     "200": {
      "description": "成功",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "updated_at": {
           "type": "string",
           "format": "date-time"
          },
          "source": {
           "type": "string"
          },
          "credit": {
           "type": "string"
          },
          "count": {
           "type": "integer"
          },
          "items": {
           "type": "array",
           "items": {
            "type": "object",
            "properties": {
             "rank": {
              "type": "integer"
             },
             "item_id": {
              "type": "string"
             },
             "name": {
              "type": "string"
             },
             "price": {
              "type": "string"
             },
             "discount_percent": {
              "type": "integer"
             },
             "image_url": {
              "type": "string"
             },
             "item_url": {
              "type": "string"
             },
             "shop_name": {
              "type": "string"
             },
             "shop_url": {
              "type": "string"
             }
            }
           }
          }
         }
        }
       }
      }
     }
    }
   }
  },
  "/deals/avatars.txt": {
   "get": {
    "tags": [
     "人気データ"
    ],
    "summary": "セール中のアバター・プレーンテキスト",
    "description": "`1. 名前 / 出店元 (98%OFF ¥ 100~)` の形式で15行。ワールド内の掲示板向け。",
    "operationId": "dealsAvatarsText",
    "responses": {
     "200": {
      "description": "成功",
      "content": {
       "text/plain": {
        "schema": {
         "type": "string"
        }
       }
      }
     }
    }
   }
  },
  "/usage.json": {
   "get": {
    "tags": [
     "サービス"
    ],
    "summary": "公開APIの利用状況(直近30日)",
    "description": "種類ごとの呼び出し回数と、日ごとの回数。ブラウザとみられるもの(human)と自動のクライアント(bot)を分けています。IPなど個人を特定できる情報は含みません。",
    "operationId": "usage",
    "responses": {
     "200": {
      "description": "成功",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "updated_at": {
           "type": "string",
           "format": "date-time"
          },
          "period_days": {
           "type": "integer"
          },
          "from": {
           "type": "string"
          },
          "to": {
           "type": "string"
          },
          "total": {
           "type": "integer"
          },
          "endpoints": {
           "type": "array",
           "items": {
            "type": "object",
            "properties": {
             "id": {
              "type": "string"
             },
             "label": {
              "type": "string"
             },
             "total": {
              "type": "integer"
             },
             "human": {
              "type": "integer"
             },
             "bot": {
              "type": "integer"
             },
             "daily": {
              "type": "array",
              "items": {
               "type": "integer"
              }
             }
            }
           }
          }
         }
        }
       }
      }
     }
    }
   }
  }
 },
 "components": {
  "schemas": {
   "NewsItem": {
    "type": "object",
    "required": [
     "id",
     "slug",
     "title",
     "published_at",
     "url"
    ],
    "properties": {
     "id": {
      "type": "integer",
      "example": 338,
      "description": "ブログの記事ID"
     },
     "slug": {
      "type": "string",
      "example": "vrc-news-start"
     },
     "title": {
      "type": "string",
      "example": "VRCニュースを始めます（不定期更新）"
     },
     "excerpt": {
      "type": "string",
      "description": "要約(プレーンテキスト)"
     },
     "published_at": {
      "type": "string",
      "format": "date-time",
      "example": "2026-10-31T08:00:00+09:00",
      "description": "公開日時(日本時間)"
     },
     "modified_at": {
      "type": "string",
      "format": "date-time"
     },
     "url": {
      "type": "string",
      "format": "uri",
      "description": "ブログ(元記事)のURL"
     },
     "hcn_url": {
      "type": "string",
      "format": "uri",
      "description": "公式サイトの記事ページのURL"
     },
     "image": {
      "type": "string",
      "format": "uri",
      "nullable": true,
      "description": "アイキャッチ画像のURL"
     },
     "tags": {
      "type": "array",
      "items": {
       "type": "string"
      }
     }
    }
   },
   "NewsDetail": {
    "allOf": [
     {
      "$ref": "#/components/schemas/NewsItem"
     },
     {
      "type": "object",
      "properties": {
       "text": {
        "type": "string",
        "description": "本文(プレーンテキスト。ワールド内の掲示板向け)"
       },
       "html": {
        "type": "string",
        "description": "本文(HTML。script・style・iframeなどは取り除き済み)"
       }
      }
     }
    ]
   }
  }
 }
}