VRChat データ API

開発者向け

このAPIを、アプリ・Bot・Webサイト・VRChat内のアセットなどに組み込む方へ。最短で動かすための情報と、出典表記のお願いをまとめました。

目次概要はじめかた型・クライアントを自動生成型定義実装の目安変更について出典表記のお願い

概要

ベースURLhttps://vrc.hachune.space/api/v1
エンドポイントGET /avatars / GET /avatar-detail / GET /worlds
認証なし(APIキー不要)。User-Agent の指定は必須
制限1つのIPアドレスから10秒間に40リクエストまで(超えると 429)
更新アバターは1日4回(0・6・12・18時 JST)
仕様APIリファレンス(Swagger)/ OpenAPI 3.0 の定義 / コマンド例 / 利用ガイド

はじめかた

  1. User-Agent を決める:アプリ名とバージョン、できれば連絡先(例:my-app/1.0 (+https://example.com))。
  2. エンドポイントを選ぶ:一覧は /avatars・/worlds、1件の詳細(価格推移・対応アイテム)は /avatar-detail。
  3. 結果を手元にキャッシュする:データは1日に数回しか変わりません。毎回取りにいかず、保存して使い回してください。
curl
curl -s -A "my-app/1.0" "https://vrc.hachune.space/api/v1/worlds?season=autumn&sort=favorites" | head -c 400

型・クライアントを自動生成

OpenAPI の定義から、型やクライアントを自動生成できます。

シェル
# TypeScript の型
npx openapi-typescript https://vrc.hachune.space/api/openapi.json -o vrc-api.d.ts

# Python のモデル(pydantic)
pip install datamodel-code-generator
datamodel-codegen --url https://vrc.hachune.space/api/openapi.json --output vrc_models.py

# 各言語のクライアント(OpenAPI Generator)
npx @openapitools/openapi-generator-cli generate -i https://vrc.hachune.space/api/openapi.json -g typescript-fetch -o ./vrc-client

型定義

手早く使いたい方向けに、応答の型を載せます(定義から作ったものです)。

TypeScript
// 型定義(TypeScript)。https://vrc.hachune.space/api/openapi.json から作ったものです
export interface AvatarItem {
  item_id: string;          // BOOTHの商品ID
  name: string;             // 商品名
  shop_name: string;        // 出店元(作者・ショップ名)
  shop_url: string;         // 出店元(ショップ)のURL
  item_url: string;         // BOOTHの商品ページURL
  image_url: string;        // サムネイルのURL
  price: string;            // 表示用の価格(例: "¥ 3,000")
  rank_position: number;    // お気に入り数順の順位(順位なしは 0)
  new_arrival_rank: number | null;
  manual_added: number;     // 手動で登録した商品なら 1
  on_sale: number;          // セールの可能性があれば 1(参考値)
  discount: number;         // 記録上の最高値からの値下げ率(%)
  rise: number;             // 記録開始時からの順位上昇幅
}
export interface AvatarList {
  items: AvatarItem[]; total: number; page: number; page_size: number; has_more: boolean;
}
export interface World {
  world_id: string;
  name: string;
  author_name: string;      // 作者名
  image_url: string;
  world_url: string;        // VRChat上のワールドページ
  favorites: number;
  heat: number;
  capacity: number;
  season: string | null;
  curator_score: number | null;
  publication_date: string | null;
  rise: number;
}
export interface CompatibleItem {
  category: string;         // 衣装 / 髪型 / 小物 / 装飾品
  item_id: string; name: string; shop_name: string; item_url: string; image_url: string; price: string;
}
export interface AvatarDetail {
  item: Record<string, unknown>;
  compatible: Record<string, CompatibleItem[]>;
  history: { recorded_date: string; price_yen: string }[];
  min_price: number | null; max_price: number | null; current_price: number | null;
  is_on_sale: boolean; days_tracked: number;
}
export interface ApiError { error: string }
Python
# 型定義(Python)。https://vrc.hachune.space/api/openapi.json から作ったものです
from typing import TypedDict, Optional

class AvatarItem(TypedDict):
    item_id: str            # BOOTHの商品ID
    name: str               # 商品名
    shop_name: str          # 出店元(作者・ショップ名)
    shop_url: str           # 出店元(ショップ)のURL
    item_url: str           # BOOTHの商品ページURL
    image_url: str
    price: str              # 表示用の価格(例: "¥ 3,000")
    rank_position: int      # 順位なしは 0
    new_arrival_rank: Optional[int]
    manual_added: int
    on_sale: int            # 参考値
    discount: int
    rise: int

class AvatarList(TypedDict):
    items: list[AvatarItem]
    total: int
    page: int
    page_size: int
    has_more: bool

class World(TypedDict):
    world_id: str
    name: str
    author_name: str        # 作者名
    image_url: str
    world_url: str          # VRChat上のワールドページ
    favorites: int
    heat: int
    capacity: int
    season: Optional[str]
    curator_score: Optional[int]
    publication_date: Optional[str]
    rise: int

実装の目安

変更について

出典表記のお願い

お願いです。義務ではありません。 このAPIの利用条件ではなく、強制力もありません。表記がなくても、APIは変わらず使えます。そのうえで、できる範囲でご協力いただけるとありがたいです。

このAPIを使ったサービス・アプリ・Bot・Webサイト、またVRChat内のワールドやアセットなどを公開するときに、次の2点を明示していただけないでしょうか。

  1. データの出典として、このAPIを示す:「VRChat データ API」の名前と、https://vrc.hachune.space/ へのリンク(または名前だけでも)。
  2. アバター・ワールドを表示するときは、出店元(作者)を添える:商品なら shop_name(出店元)と shop_url、item_url(BOOTHの商品ページ)。ワールドなら author_name(作者)と world_url。商品やワールドの権利は、それぞれの作者に帰属します。作者へ人が戻れる導線を、残してください。

連絡は不要です。もし掲載したときにお知らせいただければ、励みになります(運営ブログから)。

コピーして使える例文

テキスト(アプリの「このアプリについて」・説明欄など)
このアプリ(サービス)は「VRChat データ API」(https://vrc.hachune.space/)のデータを利用しています。
データの出典: BOOTH、VRChat。商品・ワールドの権利は各作者に帰属します。
HTML(Webサイトのフッターなど)
<p class="credit">
  データ: <a href="https://vrc.hachune.space/" rel="noopener">VRChat データ API</a>
  (出典: BOOTH/VRChat。権利は各作者に帰属します)
</p>
Markdown(READMEなど)
## Credits

- Data: [VRChat データ API](https://vrc.hachune.space/) (出典: BOOTH / VRChat。権利は各作者に帰属します)
商品・ワールドを表示するとき(テンプレート例)
<!-- アバター(商品)を表示するとき:出店元と商品ページを添える -->
<a href="{{ item.item_url }}" rel="noopener">{{ item.name }}</a>
 出店元: <a href="{{ item.shop_url }}" rel="noopener">{{ item.shop_name }}</a>

<!-- ワールドを表示するとき:作者とワールドページを添える -->
<a href="{{ world.world_url }}" rel="noopener">{{ world.name }}</a> 作者: {{ world.author_name }}

VRChat内のアセットに載せる

ワールドの看板やクレジットボード、アバターの説明などには、短い文面と、QRコードを使えます。QRコードは、このサイトのトップページに飛びます。

vrc.hachune.space へのQRコード
看板・クレジット用の文面
データ提供: VRChat データ API
https://vrc.hachune.space/
(出典: BOOTH / VRChat 権利は各作者に帰属)

QRコードの画像:PNG / SVG(自由に使えます)