Blue Archive API ドキュメント

v1.0

🚀 クイックスタート

📡 ベースURL

https://bluearchive-api.skyia.jp

⚡ 簡単な例

GET /api/students

📋 概要

Blue Archive API は、ブルーアーカイブの生徒データにアクセスするための RESTful API です。 生徒の基本情報、戦闘データ、地形適応度、武器情報などを簡単に取得できます。

🌐 エンドポイント

GET/api/students

全生徒データを取得します(パフォーマンス向上のためキャッシュ済み)

📝クエリパラメータ(オプション)

パラメータ説明
limitnumber取得する生徒数の制限?limit=10
schoolstring学校で絞り込み?school=ゲヘナ学園
raritynumberレア度で絞り込み?rarity=3

成功レスポンス (200 OK)

{
  "message": "success",
  "total": 150,
  "count": 10,
  "data": [
    {
      "id": "B5F50C9O",
      "name": "アカネ(バニーガール)",
      "rarity": 3,
      "weapon": {
        "type": "HG",
        "cover": false
      },
      "role": {
        "type": "SPECIAL",
        "class": "アタッカー",
        "position": "BACK"
      },
      "school": "ミレニアムサイエンススクール",
      "combat": {
        "attackType": "神秘",
        "defenseType": "重装甲"
      },
      "terrainAdaptation": {
        "city": "B",
        "outdoor": "D",
        "indoor": "S"
      }
    }
    // ... 他の生徒データ
  ]
}

エラーレスポンス

429 Too Many Requests
{ "error": "Rate limit exceeded", "retryAfter": 60 }
500 Internal Server Error
{ "error": "Internal server error" }

GET/api/students/{id}

指定IDの生徒データを取得します

パスパラメータ

id - 生徒の一意識別子(例: B5F50C9O)

成功レスポンス (200 OK)

{
  "message": "success",
  "data": {
    "id": "B5F50C9O",
    "name": "アカネ(バニーガール)",
    // ... 完全な生徒データ
  }
}

エラーレスポンス (404 Not Found)

{ "error": "Student not found" }

📊 データ形式・スキーマ

🏗️Student オブジェクト

{
  "id": string,              // 生徒ID
  "name": string,            // 生徒名
  "rarity": number,          // レア度 (1-3)
  "weapon": {
    "type": string,          // 武器タイプ
    "cover": boolean         // カバー可否
  },
  "role": {
    "type": string,          // STRIKER/SPECIAL
    "class": string,         // 役割クラス
    "position": string       // FRONT/MIDDLE/BACK
  },
  "school": string,          // 所属学校
  "combat": {
    "attackType": string,    // 攻撃タイプ
    "defenseType": string    // 防御タイプ
  },
  "terrainAdaptation": {
    "city": string,          // 市街地適応度
    "outdoor": string,       // 屋外適応度
    "indoor": string         // 屋内適応度
  }
}

📤API レスポンス構造

// GET /api/students
{
  "message": string,         // ステータスメッセージ
  "total": number,           // 総データ数
  "count": number,           // 返却データ数
  "data": Student[]          // 生徒データ配列
}

// GET /api/students/[id]  
{
  "message": string,         // ステータスメッセージ
  "data": Student            // 単一生徒データ
}

レア度 (rarity)

★3
値: 3
★2
値: 2
★1
値: 1

🔫武器タイプ (weapon.type)

HG
AR
SMG
SR
SG
GL
RL
RG
MG
MT
FT
HG: ハンドガン, AR: アサルトライフル, SMG: サブマシンガン, SR: スナイパーライフル, SG: ショットガン, GL: グレネードランチャー, RL: ロケットランチャー, RG: レイルガン, MG: マシンガン, MT: 迫撃砲, FT: 火炎放射器

⚔️攻撃・防御タイプ

攻撃タイプ

神秘爆発貫通振動分解

防御タイプ

重装甲軽装備特殊装甲弾力装甲複合装甲

🌍地形適応度

S最高 - 120%効率
A優秀 - 100%効率
B普通 - 80%効率
C低い - 60%効率
D最低 - 40%効率

💻 使用例・実装ガイド

JavaScript / TypeScript

基本的な使用例

// 全生徒データを取得
const fetchStudents = async () => {
  try {
    const response = await fetch('/api/students');
    const result = await response.json();
    
    if (result.message === 'success') {
      console.log(`${result.total}名の生徒データを取得`);
      return result.data;
    }
  } catch (error) {
    console.error('データ取得エラー:', error);
  }
};

// 特定の生徒を検索
const findStudent = async (id) => {
  const response = await fetch(`/api/students/${id}`);
  const result = await response.json();
  return result.data;
};

// 学校で絞り込み
const getStudentsBySchool = async (school) => {
  const response = await fetch(`/api/students?school=${encodeURIComponent(school)}`);
  return (await response.json()).data;
};

React Hook の実装例

import { useState, useEffect } from 'react';

const useStudents = (filters = {}) => {
  const [students, setStudents] = useState([]);
  const [loading, setLoading] = useState(true);
  const [error, setError] = useState(null);

  useEffect(() => {
    const fetchData = async () => {
      setLoading(true);
      try {
        const params = new URLSearchParams(filters);
        const response = await fetch(`/api/students?${params}`);
        const result = await response.json();
        setStudents(result.data);
      } catch (err) {
        setError(err.message);
      } finally {
        setLoading(false);
      }
    };

    fetchData();
  }, [JSON.stringify(filters)]);

  return { students, loading, error };
};

🐍Python

import requests
import json

class BlueArchiveAPI:
    BASE_URL = "https://bluearchive-api.skyia.jp/api"
    
    def __init__(self):
        self.session = requests.Session()
    
    def get_students(self, **filters):
        """全生徒データまたはフィルタリング結果を取得"""
        response = self.session.get(f"{self.BASE_URL}/students", params=filters)
        response.raise_for_status()
        return response.json()
    
    def get_student(self, student_id):
        """特定の生徒データを取得"""
        response = self.session.get(f"{self.BASE_URL}/students/{student_id}")
        response.raise_for_status()
        return response.json()
    
    def search_by_rarity(self, rarity):
        """レア度で検索"""
        return self.get_students(rarity=rarity)
    
    def search_by_school(self, school):
        """学校で検索"""
        return self.get_students(school=school)

# 使用例
api = BlueArchiveAPI()

# 全生徒取得
all_students = api.get_students()
print(f"総生徒数: {all_students['total']}")

# ★3生徒のみ取得
ssr_students = api.search_by_rarity(3)
print(f"★3生徒数: {len(ssr_students['data'])}")

# 特定学校の生徒取得
gehenna_students = api.search_by_school("ゲヘナ学園")
print(f"ゲヘナ学園生徒数: {len(gehenna_students['data'])}")

📡cURL コマンド例

基本的なGETリクエスト

# 全生徒データを取得
curl -X GET "https://bluearchive-api.skyia.jp/api/students" \
     -H "Accept: application/json"

# 特定生徒を取得
curl -X GET "https://bluearchive-api.skyia.jp/api/students/B5F50C9O" \
     -H "Accept: application/json"

# フィルタリングして取得
curl -X GET "https://bluearchive-api.skyia.jp/api/students?rarity=3&limit=10" \
     -H "Accept: application/json"

JavaScript 実装例

// 全生徒データを取得(ページネーション対応)
const fetchStudents = async (page = 1, limit = 20) => {
  try {
    // 例: /api/students?page=1&limit=20
    const response = await fetch('/api/students?page=' + page + '&limit=' + limit);
    const result = await response.json();

    if (result.message === 'success') {
      console.log(result.total + '名の生徒データを取得 (count=' + result.count + ')');
      return result.data;
    }
  } catch (error) {
    console.error('データ取得エラー:', error);
  }
};

// 特定の生徒を検索
const findStudent = async (id) => {
  const response = await fetch('/api/students/' + id);
  const result = await response.json();
  return result.data;
};

// 学校で絞り込み
const getStudentsBySchool = async (school, page = 1, limit = 20) => {
  const response = await fetch('/api/students?school=' + encodeURIComponent(school) + '&page=' + page + '&limit=' + limit);
  return (await response.json()).data;
};
制限内容
  • GET リクエスト: 1分間に100リクエスト
  • 同一IP: 1時間に1000リクエスト
制限超過時
429 Too Many Requests レスポンスが返され、Retry-After ヘッダーで待機時間が通知されます。

🔐認証・権限

パブリックアクセス
  • • GET /api/students - 認証不要
  • • GET /api/students/[id] - 認証不要
管理者系エンドポイント
  • • PUT /api/students/[id] - APIキー必須
  • • DELETE /api/students/[id] - APIキー必須

❓ FAQ・トラブルシューティング

Q: データが取得できません

A: 以下を確認してください:

  • URLが正しいか(/api/students
  • ネットワーク接続状況
  • レート制限に達していないか
  • ブラウザの開発者ツールでエラーメッセージを確認

Q: 特定の生徒が見つからない

A: 生徒IDが正しいか確認してください。IDは英数字の組み合わせです(例: B5F50C9O)。全生徒リストから正確なIDを確認できます。

Q: フィルタリングが機能しない

A: クエリパラメータの形式を確認してください:

  • 学校名: 完全一致で指定(例: ?school=ゲヘナ学園
  • レア度: 1-3の数値(例: ?rarity=3
  • 日本語文字のURLエンコードが必要な場合があります

🔗 関連リンク