Backlog APIを使ってみる

プロジェクト管理やタスク管理を行えるツール「Backlog」のAPIを使用する機会があったのでメモ。

APIキーの発行

Backlog APIの認証方法は、APIキーとOAuth 2.0が提供されているようです。
今回はAPIキーを使用する方法で試してみます。

Backlogにログインして、右上のユーザーメニューから個人設定を選択します。

左メニューのAPIを選択して、APIの登録をクリックします。

下部にAPIキーが表示されるので、コピーしておきます。

これでAPIキーの発行が完了しました。

使い方

実際にBacklog APIのうちいくつか試してみます。
詳しくは公式のリファレンスをご確認ください。

スペース情報の取得

まずはBacklogのスペース情報の取得を試してみます。

const API_KEY = 'BacklogのAPIキー';
const BACKLOG_URL = 'BacklogのURL';
const ENDPOINT = '/api/v2/space';

const queryParams = new URLSearchParams();
if (API_KEY) queryParams.append('apiKey', API_KEY);

const url = `${BACKLOG_URL}${ENDPOINT}?${queryParams.toString()}`;

async function fetchBacklogApi() {
  try {
    const response = await fetch(url, {
      method: 'GET'
    });

    if (!response.ok) {
      throw new Error(`API error: ${response.status} ${response.statusText}`);
    }

    const data = await response.json();
    console.log(JSON.stringify(data, null, 2));
  } catch (error) {
    console.error(error.message);
  }
}

fetchBacklogApi();

以下のような形式の内容が返ってきました。

{
  "spaceKey": "xxxxx",
  "name": "XXXXX",
  "ownerId": xxxxxxx,
  "lang": "ja",
  "timezone": "Asia/Tokyo",
  "reportSendTime": "HH:MM:DD",
  "textFormattingRule": "markdown",
  "created": "YYYY-MM-DDTHH:MM:DDZ",
  "updated": "YYYY-MM-DDTHH:MM:DDZ"
}

プロジェクト一覧の取得

プロジェクト一覧の取得を試してみます。

const API_KEY = 'BacklogのAPIキー';
const BACKLOG_URL = 'BacklogのURL';
const ENDPOINT = `/api/v2/projects`;

const queryParams = new URLSearchParams();
if (API_KEY) queryParams.append('apiKey', API_KEY);

const url = `${BACKLOG_URL}${ENDPOINT}?${queryParams.toString()}`;

async function fetchBacklogApi() {
  try {
    const response = await fetch(url, {
      method: 'GET'
    });

    if (!response.ok) {
      throw new Error(`API error: ${response.status} ${response.statusText}`);
    }

    const data = await response.json();
    console.log(JSON.stringify(data, null, 2));
  } catch (error) {
    console.error(error.message);
  }
}

fetchBacklogApi();

以下のような形式の内容が返ってきました。

[
  {
    "id": XXXXXX,
    "projectKey": "XXXXXX",
    "name": "XXXXXX",
    "chartEnabled": false,
    "useResolvedForChart": false,
    "subtaskingEnabled": false,
    "projectLeaderCanEditProjectLeader": false,
    "useWiki": true,
    "useDocument": true,
    "useFileSharing": true,
    "useWikiTreeView": true,
    "useSubversion": false,
    "useGit": true,
    "useOriginalImageSizeAtWiki": false,
    "textFormattingRule": "markdown",
    "archived": false,
    "displayOrder": 20000,
    "useDevAttributes": true
  },
  ~略~
]

プロジェクトの最近の活動の取得

プロジェクトの最近の活動の取得を試してみます。

const API_KEY = 'BacklogのAPIキー';
const BACKLOG_URL = 'BacklogのURL';
const PROJECT_KEY = 'プロジェクトキー';
const ENDPOINT = `/api/v2/projects/${PROJECT_KEY}/activities`;

const queryParams = new URLSearchParams();
if (API_KEY) queryParams.append('apiKey', API_KEY);

const url = `${BACKLOG_URL}${ENDPOINT}?${queryParams.toString()}`;

async function fetchBacklogApi() {
  try {
    const response = await fetch(url, {
      method: 'GET'
    });

    if (!response.ok) {
      throw new Error(`API error: ${response.status} ${response.statusText}`);
    }

    const data = await response.json();
    console.log(JSON.stringify(data, null, 2));
  } catch (error) {
    console.error(error.message);
  }
}

fetchBacklogApi();

以下のような形式の内容が返ってきました。

[
  {
    "id": XXXXXXXXX,
    "project": {
      "id": XXXXXX,
      "projectKey": "XXXXXXX",
      "name": "XXXXXXX",
      ~略~
    },
    "type": 2,
    "content": {
      "id": XXXXXXXXX,
      "key_id": 1,
      "summary": "XXXXXX",
      "description": "XXXXXX",
      "comment": {
        "id": XXXXXXXXX,
        "content": "XXXXXX"
      },
      "changes": [
        {
          "field": "status",
          "field_text": "状態",
          "new_value": "2",
          "old_value": "1",
          "type": "standard"
        }
      ],
      "attachments": [],
      "shared_files": [],
      "external_file_links": []
    },
    "notifications": [],
    "createdUser": {
      "id": XXXXXXX,
      "userId": "XXXXXXXXXX",
      "name": "XXXXXX",
      "roleType": 1,
      "lang": "ja",
      "mailAddress": "XXXXXXXXXX",
      "nulabAccount": {
        "nulabId": "XXXXXXXXXX",
        "name": "Y",
        "uniqueId": "XXXXXXXXXX",
        "iconUrl": "XXXXXXXXXX"
      },
      "keyword": "XXXXXXXXXX",
      "lastLoginTime": "YYYY-MM-DDTHH:MM:DDZ"
    },
    "created": "YYYY-MM-DDTHH:MM:DDZ"
  },
  ~略~
]

課題一覧の取得

課題一覧の取得を試してみます。

const API_KEY = 'BacklogのAPIキー';
const BACKLOG_URL = 'BacklogのURL';
const ENDPOINT = `/api/v2/issues`;

const queryParams = new URLSearchParams();
if (API_KEY) queryParams.append('apiKey', API_KEY);

const url = `${BACKLOG_URL}${ENDPOINT}?${queryParams.toString()}`;

async function fetchBacklogApi() {
  try {
    const response = await fetch(url, {
      method: 'GET'
    });

    if (!response.ok) {
      throw new Error(`API error: ${response.status} ${response.statusText}`);
    }

    const data = await response.json();
    console.log(JSON.stringify(data, null, 2));
  } catch (error) {
    console.error(error.message);
  }
}

fetchBacklogApi();

以下のような形式の内容が返ってきました。

[
  {
    "id": XXXXXXXXX,
    "projectId": XXXXXX,
    "issueKey": "XXXXXXXXXX",
    "keyId": 1,
    "issueType": {
      "id": XXXXXXX,
      "projectId": XXXXXX,
      "name": "要望",
      "color": "#ff9200",
      "displayOrder": 2
    },
    "summary": "XXXXXXXXXX",
    "description": "XXXXXXXXXX",
    "resolution": null,
    "priority": {
      "id": 3,
      "name": "中"
    },
    "status": {
      "id": 2,
      "projectId": XXXXXX,
      "name": "処理中",
      "color": "#4488c5",
      "displayOrder": 2000
    },
    "assignee": {
      "id": XXXXXXX,
      "userId": "XXXXXXXXXX",
      "name": "XXXXXXXXXX",
      "roleType": 1,
      "lang": "ja",
      "mailAddress": "XXXXXXXXXX",
      "nulabAccount": {
        "nulabId": "XXXXXXXXXX",
        "name": "XXXXXXXXXX",
        "uniqueId": "XXXXXXXXXX",
        "iconUrl": "XXXXXXXXXX"
      },
      "keyword": "XXXXXXXXXX",
      "lastLoginTime": "YYYY-MM-DDTHH:MM:DDZ"
    },
    "category": [],
    "versions": [],
    "milestone": [],
    "startDate": null,
    "dueDate": null,
    "estimatedHours": null,
    "actualHours": null,
    "parentIssueId": null,
    "createdUser": {
      "id": XXXXXXX,
      "userId": "XXXXXXXXXX",
      "name": "Y",
      "roleType": 1,
      "lang": "ja",
      "mailAddress": "XXXXXXXXXX",
      "nulabAccount": {
        "nulabId": "XXXXXXXXXX",
        "name": "XXXXXXXXXX",
        "uniqueId": "XXXXXXXXXX",
        "iconUrl": "XXXXXXXXXX"
      },
      "keyword": "XXXXXXXXXX",
      "lastLoginTime": "YYYY-MM-DDTHH:MM:DDZ"
    },
    "created": "YYYY-MM-DDTHH:MM:DDZ",
    "updatedUser": {
      "id": XXXXXXX,
      "userId": "XXXXXXXXXX",
      "name": "XXXXXXXXXX",
      "roleType": 1,
      "lang": "ja",
      "mailAddress": "XXXXXXXXXX",
      "nulabAccount": {
        "nulabId": "XXXXXXXXXX",
        "name": "XXXXXXXXXX",
        "uniqueId": "XXXXXXXXXX",
        "iconUrl": "XXXXXXXXXX"
      },
      "keyword": "XXXXXXXXXX",
      "lastLoginTime": "YYYY-MM-DDTHH:MM:DDZ"
    },
    "updated": "YYYY-MM-DDTHH:MM:DDZ",
    "customFields": [],
    "attachments": [],
    "sharedFiles": [],
    "externalFileLinks": [],
    "stars": []
  }
  ~略~
]

課題コメントの取得

課題コメントの取得を試してみます。

const API_KEY = 'BacklogのAPIキー';
const BACKLOG_URL = 'BacklogのURL';
const ISSUE_KEY = '課題のキー';
const ENDPOINT = `/api/v2/issues/${ISSUE_KEY}/comments`;

const queryParams = new URLSearchParams();
if (API_KEY) queryParams.append('apiKey', API_KEY);

const url = `${BACKLOG_URL}${ENDPOINT}?${queryParams.toString()}`;

async function fetchBacklogApi() {
  try {
    const response = await fetch(url, {
      method: 'GET'
    });

    if (!response.ok) {
      throw new Error(`API error: ${response.status} ${response.statusText}`);
    }

    const data = await response.json();
    console.log(JSON.stringify(data, null, 2));
  } catch (error) {
    console.error(error.message);
  }
}

fetchBacklogApi();

以下のような形式の内容が返ってきました。

[
  {
    "id": XXXXXXXXX,
    "projectId": XXXXXX,
    "issueId": XXXXXXXXX,
    "content": "XXXXXXXXXX",
    "changeLog": [
      {
        "field": "status",
        "newValue": "処理中",
        "originalValue": "未対応",
        "attachmentInfo": null,
        "attributeInfo": null,
        "notificationInfo": null
      }
    ],
    "createdUser": {
      "id": XXXXXXX,
      "userId": "XXXXXXXXXX",
      "name": "XXXXXXXXXX",
      "roleType": 1,
      "lang": "ja",
      "mailAddress": "XXXXXXXXXX",
      "nulabAccount": {
        "nulabId": "XXXXXXXXXX",
        "name": "XXXXXXXXXX",
        "uniqueId": "XXXXXXXXXX",
        "iconUrl": "XXXXXXXXXX"
      },
      "keyword": "XXXXXXXXXX",
      "lastLoginTime": "YYYY-MM-DDTHH:MM:DDZ"
    },
    "created": "YYYY-MM-DDTHH:MM:DDZ",
    "updated": "YYYY-MM-DDTHH:MM:DDZ",
    "stars": [],
    "notifications": []
  }
  ~略~
]

今回試した以外にもいろいろな種類があるので、詳しくは公式のリファレンスを確認してみてください。

参考サイト

このエントリーをはてなブックマークに追加

関連記事

コメントを残す

メールアドレスが公開されることはありません。
* が付いている欄は必須項目です

CAPTCHA


コメントが承認されるまで時間がかかります。

2025年7月
 12345
6789101112
13141516171819
20212223242526
2728293031