学校検索をもっと簡単に!REST APIサービスを公開
こんにちは、スタートアップのCTOをしているまつぼっくりです。今回は、私が開発した日本の学校情報APIについて紹介します。
日本の学校情報APIとは?
日本の学校情報APIは、日本全国の小学校、中学校、高等学校の情報を簡単に検索・取得できるAPIサービスです。学校名、住所などの基本情報を提供しています。
なぜこのAPIを作ったのか
スタートアップのCTOとして、様々なプロジェクトに携わる中で、学校情報を扱う機会が何度かありました。
その度に感じたのが、信頼できる学校データの取得の難しさです。
「もっと簡単に学校情報を取得できないだろうか?」
「他の開発者も同じような悩みを抱えているのでは?」
そんな思いから、日本の学校情報APIの開発がスタートしました。
APIの特徴
- 豊富なデータ: 全国約37,000校の情報を網羅
- 簡単な利用: RESTful APIで、簡単にデータにアクセス可能
- 柔軟な検索: 学校名、住所、電話番号など様々な条件で検索可能
- 個人・商用利用無料: 商用、非商用利用が可能です。アクセス数の制限はありません。
開発で苦労したポイント
1. データの収集と整理
信頼性の高いデータを提供するため、複数のソースから情報を収集し、クレンジングする必要がありました。この過程で、データの不整合や欠損に悩まされましたが、機械学習を活用した自動クレンジングシステムを構築することで、効率的にデータの質を向上させることができました。
2. APIのパフォーマンス最適化
大量のデータを高速に検索・提供するため、データベースの最適化に注力しました。インデックスの適切な設計や、キャッシュ戦略の実装により、応答速度を大幅に改善することができました。
3. ユーザーフレンドリーなドキュメンテーション
APIの使いやすさは、ドキュメンテーションの質に大きく依存します。開発者目線でのわかりやすさと、ビジネス利用者向けの説明のバランスを取るのに苦心しました。結果として、API仕様書はとてもクリアで使いやすいものになったと自負しています。
API使用例
学校情報をCSVで取得
REST APIでありながら、CSVファイルでの出力にも対応しています。
日本全国の教育機関を全件取得
❯ curl -s https://school.teraren.com/schools.csv | nkf -w | head -n 5
学校コード,学校種,都道府県番号,設置区分,本分校,学校名,学校所在地,郵便番号,属性情報設定年月日,属性情報廃止年月日,旧学校調査番号,移行後の学校コード
A101110000012,A1,01,1,1,北海道教育大学附属函館幼稚園,北海道函館市美原3丁目48番6号,0410806,2020-12-22,,016501,
A101110000021,A1,01,1,1,北海道教育大学附属旭川幼稚園,北海道旭川市春光5条2丁目1番1号,0700875,2020-12-22,,016502,
A101210000010,A1,01,2,1,札幌市立手稲中央幼稚園,北海道札幌市手稲区手稲本町2条5丁目13番1号,0060022,2020-12-22,,016511,
A101210110017,A1,01,2,1,札幌市立中央幼稚園,北海道札幌市中央区北2条西11丁目,0600002,2020-12-22,,017527,
東京都の高等学校を全件取得
❯ curl -s https://school.teraren.com/prefectures/13/standard_areas/13000/school_types/D1.csv | nkf -w | head -n 5
学校コード,学校種,都道府県番号,設置区分,本分校,学校名,学校所在地,郵便番号,属性情報設定年月日,属性情報廃止年月日,旧学校調査番号,移行後の学校コード
D113110000012,D1,13,1,1,東京学芸大学附属高等学校,東京都世田谷区下馬4−1−5,1540002,2020-12-22,,135502,
D113110000021,D1,13,1,1,筑波大学附属高等学校,東京都文京区大塚1−9−1,1120012,2020-12-22,,135503,
D113110000030,D1,13,1,1,筑波大学附属駒場高等学校,東京都世田谷区池尻4−7−1,1540001,2020-12-22,,135504,
D113110000049,D1,13,1,1,東京工業大学附属科学技術高等学校,東京都港区芝浦3−3−6,1080023,2020-12-22,,135505,
教育機関個別の詳細を取得
東京大学の詳細を取得
❯ curl -s https://school.teraren.com/schools/F113110102700.json | jq
{
"code": "F113110102700",
"school_type": "F1",
"prefecture_number": "13",
"establishment_category": 1,
"main_branch_indicator": 1,
"name": "東京大学",
"location": "東京都文京区本郷7−3−1",
"postal_code": "1130033",
"attribute_info_setup_date": "2021-01-20",
"attribute_info_cancellation_date": null,
"old_school_survey_number": "0172",
"post_transition_school_code": null,
"created_at": "2024-06-02T02:45:53.123+09:00",
"updated_at": "2024-06-02T02:45:53.123+09:00",
"url": "https://school.teraren.com/schools/F113110102700.json"
}
テキスト検索
「慶應」を含む教育機関を取得
❯ curl -s 'https://school.teraren.com/schools.json?s=%E6%85%B6%E6%87%89&commit=%E6%A4%9C%E7%B4%A2' | jq
[
{
"code": "D111322800026",
"school_type": "D1",
"prefecture_number": "11",
"establishment_category": 3,
"main_branch_indicator": 1,
"name": "慶應義塾志木高等学校",
"location": "埼玉県志木市本町4−14−1",
"postal_code": "3530004",
"attribute_info_setup_date": "2020-12-22",
"attribute_info_cancellation_date": null,
"old_school_survey_number": "116006",
"post_transition_school_code": null,
"created_at": "2024-06-02T02:45:51.505+09:00",
"updated_at": "2024-06-02T02:45:51.505+09:00",
"url": "https://school.teraren.com/schools/D111322800026.json"
},
{
"code": "B113311300026",
"school_type": "B1",
"prefecture_number": "13",
"establishment_category": 3,
"main_branch_indicator": 1,
"name": "慶應義塾幼稚舎",
"location": "東京都渋谷区恵比寿2−35−1",
"postal_code": "1500013",
"attribute_info_setup_date": "2020-12-22",
"attribute_info_cancellation_date": null,
"old_school_survey_number": "132048",
"post_transition_school_code": null,
"created_at": "2024-06-02T02:45:51.505+09:00",
"updated_at": "2024-06-02T02:45:51.505+09:00",
"url": "https://school.teraren.com/schools/B113311300026.json"
},
{
"code": "C113310300026",
"school_type": "C1",
"prefecture_number": "13",
"establishment_category": 3,
"main_branch_indicator": 1,
"name": "慶應義塾中等部",
"location": "東京都港区三田2−17−10",
"postal_code": "1080073",
"attribute_info_setup_date": "2020-12-22",
"attribute_info_cancellation_date": null,
"old_school_survey_number": "134532",
"post_transition_school_code": null,
"created_at": "2024-06-02T02:45:51.505+09:00",
"updated_at": "2024-06-02T02:45:51.505+09:00",
"url": "https://school.teraren.com/schools/C113310300026.json"
},
{
"code": "D113310300024",
"school_type": "D1",
"prefecture_number": "13",
"establishment_category": 3,
"main_branch_indicator": 1,
"name": "慶應義塾女子高等学校",
"location": "東京都港区三田2−17−23",
"postal_code": "1080073",
"attribute_info_setup_date": "2020-12-22",
"attribute_info_cancellation_date": null,
"old_school_survey_number": "135986",
"post_transition_school_code": null,
"created_at": "2024-06-02T02:45:51.505+09:00",
"updated_at": "2024-06-02T02:45:51.505+09:00",
"url": "https://school.teraren.com/schools/D113310300024.json"
},
{
"code": "B114310000119",
"school_type": "B1",
"prefecture_number": "14",
"establishment_category": 3,
"main_branch_indicator": 1,
"name": "慶應義塾横浜初等部",
"location": "神奈川県横浜市青葉区あざみ野南3−1−3",
"postal_code": "2250012",
"attribute_info_setup_date": "2020-12-22",
"attribute_info_cancellation_date": null,
"old_school_survey_number": "140448",
"post_transition_school_code": null,
"created_at": "2024-06-02T02:45:51.505+09:00",
"updated_at": "2024-06-02T02:45:51.505+09:00",
"url": "https://school.teraren.com/schools/B114310000119.json"
},
{
"code": "C114310000199",
"school_type": "C1",
"prefecture_number": "14",
"establishment_category": 3,
"main_branch_indicator": 1,
"name": "慶應義塾普通部",
"location": "神奈川県横浜市港北区日吉本町1−45−1",
"postal_code": "2230062",
"attribute_info_setup_date": "2020-12-22",
"attribute_info_cancellation_date": null,
"old_school_survey_number": "143842",
"post_transition_school_code": null,
"created_at": "2024-06-02T02:45:51.505+09:00",
"updated_at": "2024-06-02T02:45:51.505+09:00",
"url": "https://school.teraren.com/schools/C114310000199.json"
},
{
"code": "C114320500040",
"school_type": "C1",
"prefecture_number": "14",
"establishment_category": 3,
"main_branch_indicator": 1,
"name": "慶應義塾湘南藤沢中等部",
"location": "神奈川県藤沢市遠藤5466",
"postal_code": "2520816",
"attribute_info_setup_date": "2020-12-22",
"attribute_info_cancellation_date": null,
"old_school_survey_number": "144226",
"post_transition_school_code": null,
"created_at": "2024-06-02T02:45:51.505+09:00",
"updated_at": "2024-06-02T02:45:51.505+09:00",
"url": "https://school.teraren.com/schools/C114320500040.json"
},
{
"code": "D114310000222",
"school_type": "D1",
"prefecture_number": "14",
"establishment_category": 3,
"main_branch_indicator": 1,
"name": "慶應義塾高等学校",
"location": "神奈川県横浜市港北区日吉4−1−2",
"postal_code": "2238524",
"attribute_info_setup_date": "2020-12-22",
"attribute_info_cancellation_date": null,
"old_school_survey_number": "145644",
"post_transition_school_code": null,
"created_at": "2024-06-02T02:45:51.505+09:00",
"updated_at": "2024-06-02T02:45:51.505+09:00",
"url": "https://school.teraren.com/schools/D114310000222.json"
},
{
"code": "D114320500093",
"school_type": "D1",
"prefecture_number": "14",
"establishment_category": 3,
"main_branch_indicator": 1,
"name": "慶應義塾湘南藤沢高等部",
"location": "神奈川県藤沢市遠藤5466",
"postal_code": "2520816",
"attribute_info_setup_date": "2020-12-22",
"attribute_info_cancellation_date": null,
"old_school_survey_number": "145798",
"post_transition_school_code": null,
"created_at": "2024-06-02T02:45:51.505+09:00",
"updated_at": "2024-06-02T02:45:51.505+09:00",
"url": "https://school.teraren.com/schools/D114320500093.json"
},
{
"code": "F113310102984",
"school_type": "F1",
"prefecture_number": "13",
"establishment_category": 3,
"main_branch_indicator": 1,
"name": "慶應義塾大学",
"location": "東京都港区三田2−15−45",
"postal_code": "1088345",
"attribute_info_setup_date": "2021-01-20",
"attribute_info_cancellation_date": null,
"old_school_survey_number": "2197",
"post_transition_school_code": null,
"created_at": "2024-06-02T02:45:53.123+09:00",
"updated_at": "2024-06-02T02:45:53.123+09:00",
"url": "https://school.teraren.com/schools/F113310102984.json"
}
]
学校種別の一覧を取得
D1やF1といったschool_typeの説明を取得
❯ curl -s 'https://school.teraren.com/school_types.json' | jq
[
{
"code": "A1",
"name": "幼稚園",
"created_at": "2024-06-01T03:39:26.790+09:00",
"updated_at": "2024-06-01T03:39:26.790+09:00",
"url": "https://school.teraren.com/school_types/A1.json"
},
{
"code": "A2",
"name": "幼保連携型認定こども園",
"created_at": "2024-06-01T03:39:26.793+09:00",
"updated_at": "2024-06-01T03:39:26.793+09:00",
"url": "https://school.teraren.com/school_types/A2.json"
},
{
"code": "B1",
"name": "小学校",
"created_at": "2024-06-01T03:39:26.793+09:00",
"updated_at": "2024-06-01T03:39:26.793+09:00",
"url": "https://school.teraren.com/school_types/B1.json"
},
{
"code": "C1",
"name": "中学校",
"created_at": "2024-06-01T03:39:26.793+09:00",
"updated_at": "2024-06-01T03:39:26.793+09:00",
"url": "https://school.teraren.com/school_types/C1.json"
},
{
"code": "C2",
"name": "義務教育学校",
"created_at": "2024-06-01T03:39:26.794+09:00",
"updated_at": "2024-06-01T03:39:26.794+09:00",
"url": "https://school.teraren.com/school_types/C2.json"
},
{
"code": "D1",
"name": "高等学校",
"created_at": "2024-06-01T03:39:26.794+09:00",
"updated_at": "2024-06-01T03:39:26.794+09:00",
"url": "https://school.teraren.com/school_types/D1.json"
},
{
"code": "D2",
"name": "中等教育学校",
"created_at": "2024-06-01T03:39:26.794+09:00",
"updated_at": "2024-06-01T03:39:26.794+09:00",
"url": "https://school.teraren.com/school_types/D2.json"
},
{
"code": "E1",
"name": "特別支援学校",
"created_at": "2024-06-01T03:39:26.794+09:00",
"updated_at": "2024-06-01T03:39:26.794+09:00",
"url": "https://school.teraren.com/school_types/E1.json"
},
{
"code": "F1",
"name": "大学",
"created_at": "2024-06-01T03:39:26.794+09:00",
"updated_at": "2024-06-01T03:39:26.794+09:00",
"url": "https://school.teraren.com/school_types/F1.json"
},
{
"code": "F2",
"name": "短期大学",
"created_at": "2024-06-01T03:39:26.794+09:00",
"updated_at": "2024-06-01T03:39:26.794+09:00",
"url": "https://school.teraren.com/school_types/F2.json"
},
{
"code": "G1",
"name": "高等専門学校",
"created_at": "2024-06-01T03:39:26.795+09:00",
"updated_at": "2024-06-01T03:39:26.795+09:00",
"url": "https://school.teraren.com/school_types/G1.json"
},
{
"code": "H1",
"name": "専修学校",
"created_at": "2024-06-01T03:39:26.795+09:00",
"updated_at": "2024-06-01T03:39:26.795+09:00",
"url": "https://school.teraren.com/school_types/H1.json"
},
{
"code": "H2",
"name": "各種学校",
"created_at": "2024-06-01T03:39:26.795+09:00",
"updated_at": "2024-06-01T03:39:26.795+09:00",
"url": "https://school.teraren.com/school_types/H2.json"
}
]
今後の展望
現在のバージョンでも十分実用的ですが、さらに以下の機能を追加したいと考えています:
- 学校の特徴(特色ある教育プログラムなど)の情報提供
- 時系列データ(生徒数の推移など)の追加
- より柔軟な検索オプション(周辺施設との連携など)
また、海外の学校情報も提供できるよう、データベースの拡張も検討中です。
まとめ
日本の学校情報APIの開発を通じて、改めてデータの重要性と、それを使いやすい形で提供することの価値を実感しました。このAPIが、教育関連のアプリケーション開発やリサーチなど、様々な場面で活用されることを願っています。
みなさんも、「あったらいいな」と思うAPIやサービスがあれば、ぜひ開発にチャレンジしてみてください。ニッチな分野であっても、確実にニーズは存在するはずです。
最後になりましたが、日本の学校情報APIへのフィードバックをお待ちしています。より良いサービスにしていくため、皆様のご意見をぜひお聞かせください!
参考リンク
みなさんの開発ライフがより充実することを願っています!
Discussion