科研費データベース(KAKEN)の情報をプログラムから取得する方法を解説します。

1. はじめに

KAKENは、国立情報学研究所(NII)が提供する科学研究費助成事業データベースです。OpenSearch APIを利用することで、研究課題の情報をプログラムから取得できます。

2. 事前準備:アプリケーションIDの取得

KAKEN APIを利用するには、CiNiiでアプリケーションIDを取得する必要があります。

  1. CiNii API利用登録にアクセス
  2. 必要事項を入力して登録申請
  3. 承認後、メールでApplication ID(appid)が届く

注意 : 登録から承認まで時間がかかる場合があります。

3. APIエンドポイント

研究課題をさがす

https://kaken.nii.ac.jp/opensearch/

研究者をさがす

https://nrid.nii.ac.jp/opensearch/

4. 主要パラメータ(研究課題をさがす)

パラメータ説明必須
appidアプリケーションID82RKpPlZiIjbqKwFDO3D
qb研究課題番号で検索19K20626
kwフリーワード検索IIIF
qa研究課題名で検索デジタルアーカイブ
qg研究者の姓名で検索中村覚
qm研究者番号で検索80802743
formatレスポンス形式-xml(デフォルト: html5
rw1ページの件数-20, 50, 100, 200, 500
lang言語-ja, en

△: いずれか1つ以上が必要

その他の検索パラメータ

パラメータ説明
qc研究種目で検索
qd審査区分/研究分野で検索
qe研究機関で検索
s1, s2助成期間(From/To)で検索
qfキーワードで検索

詳細は公式ドキュメントを参照してください。

5. 使用例

例1: 課題番号で検索

curl "https://kaken.nii.ac.jp/opensearch/?appid=YOUR_APPID&qb=19K20626&format=xml"

例2: キーワードで検索

curl "https://kaken.nii.ac.jp/opensearch/?appid=YOUR_APPID&kw=IIIF&format=xml&rw=50"

例3: 研究者番号で検索

curl "https://kaken.nii.ac.jp/opensearch/?appid=YOUR_APPID&qm=80802743&format=xml"

6. レスポンス形式

format=xmlを指定した場合、以下のようなXMLが返されます。

レスポンス例(19K20626)

<?xml version="1.0" encoding="UTF-8"?>
<grantAwards>
  <totalResults>1</totalResults>
  <startIndex>1</startIndex>
  <itemsPerPage>20</itemsPerPage>

  <grantAward id="KAKENHI-PROJECT-19K20626"
              recordSet="kakenhi"
              projectType="project"
              awardNumber="19K20626">

    <urlList>
      <url>https://kaken.nii.ac.jp/grant/KAKENHI-PROJECT-19K20626/</url>
    </urlList>

    <summary xml:lang="ja">
      <title>IIIFとTEIを用いたオンライン翻刻支援システムの開発</title>
      <awardNumber awardNumber="19K20626" sequence="1"/>
      <category niiCode="252">若手研究</category>

      <member sequence="1" eradCode="80802743" role="principal_investigator">
        <institution>東京大学</institution>
        <department>史料編纂所</department>
        <jobTitle>助教</jobTitle>
        <personalName sequence="1">
          <fullName>中村 覚</fullName>
          <familyName yomi="ナカムラ">中村</familyName>
          <givenName yomi="サトル"></givenName>
        </personalName>
        <enriched>
          <researcherNumber type="erad">80802743</researcherNumber>
        </enriched>
      </member>

      <projectStatus fiscalYear="2022" statusCode="project_closed"/>

      <keywordList>
        <keyword sequence="1">IIIF</keyword>
        <keyword sequence="2">TEI</keyword>
        <keyword sequence="3">RDF</keyword>
        <keyword sequence="4">OCR</keyword>
        <keyword sequence="5">Omeka</keyword>
        <keyword sequence="6">人文情報学</keyword>
        <keyword sequence="7">デジタルアーカイブ</keyword>
        <keyword sequence="8">翻刻</keyword>
      </keywordList>

      <periodOfAward>
        <startDate>2019-04-01</startDate>
        <endDate>2023-03-31</endDate>
      </periodOfAward>

      <overallAwardAmount>
        <directCost>3500000</directCost>
        <indirectCost>1050000</indirectCost>
        <totalCost>4550000</totalCost>
      </overallAwardAmount>
    </summary>
  </grantAward>
</grantAwards>

7. 取得できる主な情報

要素説明
awardNumber課題番号
title研究課題名
category研究種目(若手研究、基盤研究など)
member研究者情報(氏名、所属、研究者番号、役割)
projectStatus研究状態(granted: 実施中、project_closed: 完了)
keywordListキーワード
periodOfAward研究期間
overallAwardAmount配分額(直接経費、間接経費、合計)
paragraphList研究概要

研究者の役割(role属性)

説明
principal_investigator研究代表者
co_investigator_buntan研究分担者
co_investigator_renkei連携研究者

8. プログラムからの利用例

JavaScript/TypeScript(Next.js)

type KakenMember = {
  name: string;
  researcherId: string;
  role: 'pi' | 'coi';
  institution: string;
  department: string;
  jobTitle?: string;
};

type KakenProject = {
  grantId: string;
  title: string;
  category?: string;
  period?: { start?: string; end?: string };
  members: KakenMember[];
  keywords?: string[];
};

async function fetchKakenProject(
  grantId: string,
  appId: string
): Promise<KakenProject | null> {
  const url = new URL('https://kaken.nii.ac.jp/opensearch/');
  url.searchParams.set('appid', appId);
  url.searchParams.set('qb', grantId);
  url.searchParams.set('format', 'xml');

  const response = await fetch(url.toString());
  if (!response.ok) return null;

  const xml = await response.text();
  return parseKakenXml(xml, grantId);
}

function parseKakenXml(xml: string, grantId: string): KakenProject | null {
  // XMLパース処理
  // ...
}

Python

import requests
import xml.etree.ElementTree as ET

def fetch_kaken_project(grant_id: str, app_id: str) -> dict | None:
    url = "https://kaken.nii.ac.jp/opensearch/"
    params = {
        "appid": app_id,
        "qb": grant_id,
        "format": "xml"
    }

    response = requests.get(url, params=params)
    if response.status_code != 200:
        return None

    root = ET.fromstring(response.content)
    # XMLパース処理
    # ...

# 使用例
project = fetch_kaken_project("19K20626", "YOUR_APPID")

9. 注意事項

  1. 利用規約の遵守 : 短時間に大量のアクセスは避けてください
  2. キャッシュの活用 : 同じデータを繰り返し取得する場合はキャッシュを利用しましょう
  3. 所属情報について : APIで取得できる所属は「採択時点」のものです。現在の所属とは異なる場合があります
  4. エラーハンドリング : APIが利用できない場合のフォールバック処理を実装しましょう

10. 参考リンク