開発者向け
このAPIを、アプリ・Bot・Webサイト・VRChat内のアセットなどに組み込む方へ。最短で動かすための情報と、出典表記のお願いをまとめました。
概要
| ベースURL | https://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 の定義 / コマンド例 / 利用ガイド |
はじめかた
- User-Agent を決める:アプリ名とバージョン、できれば連絡先(例:
my-app/1.0 (+https://example.com))。 - エンドポイントを選ぶ:一覧は
/avatars・/worlds、1件の詳細(価格推移・対応アイテム)は/avatar-detail。 - 結果を手元にキャッシュする:データは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実装の目安
- キャッシュ:アバター一覧は6時間程度、ワールド一覧は1時間〜数時間を目安に、手元に保存してください。画面を開くたびに呼ぶ作りは避けてください。
- 429 のとき:
Retry-Afterの秒数だけ待ってから再開します。すぐに再試行を繰り返さないでください。 - 失敗したとき:
5xxや通信エラーのときは、直前のキャッシュを使い、間隔を空けて(指数的に長くして)再試行してください。 - 全件取得:
has_moreがfalseになるまでpageを進め、1ページごとに1秒ほど空けてください。 - 未知の項目は無視する:応答に項目が増えても壊れないよう、決まった項目だけを読む作りにしてください。
- サーバー側から呼ぶ:他サイトのブラウザからの直接呼び出し(CORS)は許可していません。
変更について
- 現在の版は
v1です。互換性を保つよう努めますが、個人運営のため、保証はできません。 - 項目の追加は予告なく行うことがあります。項目の削除や意味の変更は、このサイトや運営ブログでお知らせするよう努めます。
- セール情報(
on_saleなど)は参考値です。購入前に、必ず元のページで確認してください。
出典表記のお願い
お願いです。義務ではありません。 このAPIの利用条件ではなく、強制力もありません。表記がなくても、APIは変わらず使えます。そのうえで、できる範囲でご協力いただけるとありがたいです。
このAPIを使ったサービス・アプリ・Bot・Webサイト、またVRChat内のワールドやアセットなどを公開するときに、次の2点を明示していただけないでしょうか。
- データの出典として、このAPIを示す:「VRChat データ API」の名前と、
https://vrc.hachune.space/へのリンク(または名前だけでも)。 - アバター・ワールドを表示するときは、出店元(作者)を添える:商品なら
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コードは、このサイトのトップページに飛びます。