GitHub Copilotのリポジトリ別利用状況をREST APIで取得する方法|日次APIと前提ポリシー

「どのリポジトリでGitHub Copilot coding agentやCopilot code reviewが使われたのか」を日次で確認したい場合は、GitHub Copilot usage metrics APIのrepos-1-dayエンドポイントを利用します。Enterprise全体は/enterprises/{enterprise}/...、Organization単位は/orgs/{org}/...を呼び出し、day=YYYY-MM-DDで対象日を指定します。

ただし、APIを呼び出すだけでは取得できません。GitHub Enterprise CloudでCopilot usage metrics policyを有効化し、適切な管理権限とトークン権限を用意する必要があります。また、レスポンスに集計結果が直接入るのではなく、期限付きURLからNDJSON形式のレポートをダウンロードする2段階構成です。2026年7月17日に一般提供されたリポジトリ別レポートでは、Copilot coding agentによるプルリクエスト活動や、Copilot code reviewによるレビュー活動をリポジトリ単位で確認できます。(The GitHub Blog)

目次

GitHub Copilotのリポジトリ別利用状況はrepos-1-dayで取得する

利用するREST APIは、集計範囲によって次の2種類に分かれます。

集計範囲エンドポイント主な用途
EnterpriseGET /enterprises/{enterprise}/copilot/metrics/reports/repos-1-day?day=YYYY-MM-DDEnterprise全体のリポジトリを横断して確認する
OrganizationGET /orgs/{org}/copilot/metrics/reports/repos-1-day?day=YYYY-MM-DD特定Organization内のリポジトリだけを確認する

dayには、2026-07-15のようなYYYY-MM-DD形式の日付を指定します。1回の呼び出しで取得できるのは1日分です。Enterprise、Organizationのどちらも、その日に対象となる活動があったリポジトリだけがレポートに含まれ、原則として1リポジトリにつき1エントリが出力されます。(GitHub Docs)

APIの処理は、次の2段階です。

  1. repos-1-dayを呼び出し、download_linksreport_dayを取得する
  2. download_linksに含まれる期限付きURLからNDJSONファイルをダウンロードする

複数のdownload_linksが返る可能性があるため、最初のURLだけではなく、すべてのURLを処理する必要があります。URLには有効期限があるため、APIレスポンスを保存したまま後日ダウンロードする運用には向きません。(GitHub Docs)

このAPIで分かることと分からないこと

repos-1-dayは、GitHub Copilotのすべての利用状況をリポジトリへ割り当てるAPIではありません。対象は、主にGitHub上のプルリクエスト活動です。

確認したい内容対応状況
Copilot coding agentがPRを作成したリポジトリ確認できる
Copilot coding agentが作成したPRのマージ状況確認できる
Copilot code reviewがPRをレビューしたリポジトリ確認できる
Copilot code reviewによる提案活動確認できる。ただし実際のフィールド構成は初回取得時に要確認
IDE上でコード補完を承認したリポジトリ確認できない
Copilot Chatを使用したリポジトリ確認できない
ユーザーが入力したプロンプトの内容確認できない
Copilotライセンスの割り当て状況このAPIの対象外

つまり、このAPIが答えられるのは、主に次の問いです。

どのリポジトリで、Copilot coding agentやCopilot code reviewによるプルリクエスト活動が発生したか。

一方、「Visual Studio Codeでコード補完が使われたリポジトリ」や「Copilot Chatが多く使われたリポジトリ」を知るためのAPIではありません。リポジトリ別レポートは、プルリクエスト関連の利用状況として設計されています。(GitHub Docs)

REST APIを実行する前に確認する前提条件

GitHub Enterprise Cloudが対象

今回のリポジトリ別レポートは、GitHub Enterprise CloudでGitHub Copilot BusinessまたはGitHub Copilot Enterpriseを管理している環境を前提とします。

Organization単位で取得する場合でも、Enterprise側でポリシーが強制されていると、Organization管理者が設定を変更できないことがあります。

Copilot usage metrics policyを有効化する

リポジトリ別レポートを取得するには、対象範囲でCopilot usage metricsポリシーが有効になっている必要があります。ポリシーが無効なままでは、管理者権限やトークンスコープが正しくても、利用状況レポートへアクセスできません。(GitHub Docs)

Enterpriseで有効化する場合

Enterprise ownerとして、Enterpriseの設定画面を開きます。

  1. Enterpriseアカウントの設定を開く
  2. AI controlsからCopilotを開く
  3. Copilot関連ポリシーの一覧を確認する
  4. Copilot usage metricsを有効化する
  5. 適用対象のOrganizationを確認する

Enterprise側で適用を強制すると、配下のOrganizationでは独自に無効化できない場合があります。(GitHub Docs)

Organizationで有効化する場合

Organization ownerとして、対象Organizationの設定画面を開きます。

  1. GitHubのプロフィールメニューからOrganizationsを開く
  2. 対象OrganizationのSettingsを開く
  3. Copilotの設定を開く
  4. Policiesから利用状況メトリクスを有効化する

Enterpriseポリシーによって設定が固定されている場合は、Organization側では変更できません。その場合はEnterprise ownerに確認します。(GitHub Docs)

実行ユーザーとトークンに必要な権限

管理画面上の役割と、APIトークンの権限は別々に確認する必要があります。トークンにスコープがあっても、トークンを発行したユーザーに対象EnterpriseやOrganizationを参照する権限がなければ取得できません。

対象実行ユーザーの代表的な権限トークンの代表的な条件
EnterpriseEnterprise owner、billing manager、またはView Enterprise Copilot Metricsを持つカスタムロールClassic PATではmanage_billing:copilotまたはread:enterprise
OrganizationOrganization owner、またはView Organization Copilot Metricsを持つカスタムロールClassic PATではread:org
EnterpriseをGitHub Appで取得Enterpriseのメトリクスを参照できるGitHub AppEnterprise Copilot metricsのRead権限
Organizationをfine-grained PATで取得Organizationのメトリクスを参照できるユーザーOrganization Copilot metricsのRead権限

Organizationエンドポイントではfine-grained personal access tokenが対応トークンとして案内されています。一方、Enterpriseエンドポイントの対応トークン一覧にはfine-grained PATが掲載されていないため、Enterprise取得でfine-grained PATが使えることを前提に実装しない方が安全です。EnterpriseではClassic PAT、または必要な権限を付与したGitHub Appの利用を検討します。(GitHub Docs)

cURLで1日分のリポジトリレポートを取得する手順

以下は、EnterpriseとOrganizationの両方に対応したBashスクリプトです。実行にはcurljqを使用します。

APIリクエストでは、GitHub REST APIのメディアタイプ、Bearerトークン、APIバージョンをヘッダーで指定します。2026年7月時点の公式リクエスト例では、X-GitHub-Api-Version: 2026-03-10が使用されています。(GitHub Docs)

#!/usr/bin/env bash
set -euo pipefail

scope="${1:?enterprise または org を指定してください}"
owner="${2:?EnterpriseのslugまたはOrganization名を指定してください}"
day="${3:?YYYY-MM-DD形式の日付を指定してください}"

: "${GITHUB_TOKEN:?環境変数 GITHUB_TOKEN を設定してください}"

if [[ ! "$day" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
  echo "日付はYYYY-MM-DD形式で指定してください: ${day}" >&2
  exit 2
fi

case "$scope" in
  enterprise)
    endpoint="https://api.github.com/enterprises/${owner}/copilot/metrics/reports/repos-1-day?day=${day}"
    ;;
  org)
    endpoint="https://api.github.com/orgs/${owner}/copilot/metrics/reports/repos-1-day?day=${day}"
    ;;
  *)
    echo "第1引数には enterprise または org を指定してください" >&2
    exit 2
    ;;
esac

workdir="copilot-repo-metrics/${scope}-${owner}/${day}"
response="${workdir}/response.json"
report="${workdir}/repos-${day}.ndjson"

mkdir -p "$workdir"

http_status="$(
  curl -sS -L \
    -o "$response" \
    -w '%{http_code}' \
    -H "Accept: application/vnd.github+json" \
    -H "Authorization: Bearer ${GITHUB_TOKEN}" \
    -H "X-GitHub-Api-Version: 2026-03-10" \
    "$endpoint"
)"

case "$http_status" in
  200)
    ;;
  204)
    echo "HTTP 204: レポート本文はありません。日付やデータ反映状況を確認してください。"
    rm -f "$response"
    exit 0
    ;;
  *)
    echo "API呼び出しに失敗しました。HTTPステータス: ${http_status}" >&2

    if [[ -s "$response" ]]; then
      jq . "$response" 2>/dev/null || cat "$response"
    fi

    exit 1
    ;;
esac

if ! jq -e '(.download_links | type) == "array"' "$response" >/dev/null; then
  echo "レスポンスにdownload_links配列がありません" >&2
  jq . "$response" >&2
  exit 1
fi

reported_day="$(jq -r '.report_day // empty' "$response")"

if [[ -n "$reported_day" && "$reported_day" != "$day" ]]; then
  echo "警告: 要求日${day}に対し、report_dayは${reported_day}です" >&2
fi

part=0

while IFS= read -r url; do
  [[ -z "$url" ]] && continue

  part=$((part + 1))
  printf -v part_file '%s/part-%03d.ndjson' "$workdir" "$part"

  curl --fail-with-body -sS -L \
    "$url" \
    -o "$part_file"
done < <(jq -r '.download_links[]' "$response")

if (( part == 0 )); then
  echo "ダウンロード対象のURLがありません"
  exit 0
fi

cat "$workdir"/part-*.ndjson > "$report"

echo "取得完了: ${report}"
echo "分割ファイル数: ${part}"
echo "レコード数: $(wc -l < "$report")"

このスクリプトをfetch-copilot-repos.shとして保存し、実行権限を付与します。

chmod +x fetch-copilot-repos.sh

トークンはソースコードへ直接書かず、環境変数やシークレット管理機能から渡します。

export GITHUB_TOKEN="YOUR_TOKEN"

Organizationの日次レポートを取得する場合は、次のように実行します。

./fetch-copilot-repos.sh org your-organization 2026-07-15

Enterprise全体を取得する場合は、第1引数をenterpriseに変更します。

./fetch-copilot-repos.sh enterprise your-enterprise-slug 2026-07-15

APIの認証ヘッダーは、最初のGitHub REST API呼び出しだけに使用しています。download_linksのURL自体が一時的なアクセス権を持つため、ダウンロード処理ではGitHubトークンを付与しません。

APIレスポンスとNDJSONの扱い方

最初のREST APIレスポンスには、集計データそのものではなく、次のような情報が返ります。

{
  "download_links": [
    "https://example.com/copilot-usage-report-part-1.ndjson"
  ],
  "report_day": "2026-07-15"
}

download_linksは1件とは限りません。データ量などによって複数ファイルに分割される可能性があるため、配列全体をループ処理します。

ダウンロードされるNDJSONは、1行ごとに独立したJSONオブジェクトが格納される形式です。通常のJSON配列とは異なるため、ファイル全体をそのまま1つのJSONオブジェクトとして解析しないようにします。

最初のレコードを確認するには、次のコマンドを使用します。

report="copilot-repo-metrics/org-your-organization/2026-07-15/repos-2026-07-15.ndjson"

head -n 1 "$report" | jq .

実際に含まれるトップレベルのキーを確認する場合は、次のように実行します。

jq -r 'keys_unsorted[]' "$report" | sort -u

最初のレコードに含まれるネストした項目のパスを確認する方法もあります。

head -n 1 "$report" |
  jq -r 'paths(scalars) | map(tostring) | join(".")'

通常のJSON配列として扱いたい場合は、jq -sで変換できます。

jq -s '.' "$report" > "${report%.ndjson}.json"

大量データを処理する場合、JSON配列への変換はメモリ使用量が増えます。ETL処理やログ分析基盤へ取り込む場合は、NDJSONのまま1行ずつストリーミング処理する方が適しています。

公式資料間のフィールド表現の違いに注意する

2026年7月17日のGitHub Changelogでは、Copilot code reviewの提案数をコメント種別ごとに確認できると案内されています。一方、現行のメトリクスフィールドリファレンスには、pull_requests.copilot_suggestions_by_comment_typeについて、リポジトリレベルでは利用できないという注記が残っています。(The GitHub Blog)

資料更新のタイミングによる差である可能性はありますが、実装時には次の対応が安全です。

  1. 初回取得時に実際のNDJSONフィールドを確認する
  2. 特定フィールドが必ず存在すると仮定しない
  3. 未知のフィールドが追加されても処理を継続できるようにする
  4. 必須フィールドが欠けた場合は警告を記録する
  5. APIバージョンと取得日をログへ保存する

特に、BIツールやデータウェアハウスのテーブル定義を最初から固定すると、フィールドの追加や名称変更で取り込みが停止しやすくなります。まず生のNDJSONを保存し、その後に正規化テーブルへ変換する構成が実務向きです。

複数日を集計するときは日付ごとにAPIを呼び出す

repos-1-dayは、その名前のとおり1日単位のレポートです。1週間分や1か月分を一度に指定する開始日・終了日のパラメーターはありません。複数日を取得する場合は、日付ごとにエンドポイントを呼び出して集約します。(GitHub Docs)

例えば3日分を取得する場合は、次のように実行します。

for day in 2026-07-13 2026-07-14 2026-07-15; do
  ./fetch-copilot-repos.sh org your-organization "$day"
done

運用では、次のようなディレクトリ構成にすると、再取得や監査が容易になります。

copilot-repo-metrics/
└── org-your-organization/
    ├── 2026-07-13/
    │   ├── response.json
    │   ├── part-001.ndjson
    │   └── repos-2026-07-13.ndjson
    ├── 2026-07-14/
    └── 2026-07-15/

GitHubの利用状況レポートは、対象日が終わってすぐに確定するとは限りません。公式ドキュメントでは、APIレポートやダッシュボードのデータは、対象日が終了してから通常は最大2日分のUTC日を経て利用可能になると案内されています。安定した定期処理では、当日や前日ではなく、少なくともUTC基準で2日以上前の日付を取得対象にするのが安全です。(GitHub Docs)

集計結果を正しく読むための注意点

レポートにないリポジトリを「Copilot未使用」と断定しない

日次レポートには、その日に対象となる活動があったリポジトリだけが含まれます。

リポジトリがレポートに存在しない場合、分かるのは「その日のリポジトリ別PRレポートに記録される活動がなかった」ということです。次のような状態までは判別できません。

  • Copilotが無効だった
  • Copilotの利用者がいなかった
  • IDEのコード補完だけが使われた
  • Copilot Chatだけが使われた
  • 単にその日にPR活動がなかった

未使用リポジトリも含む一覧が必要な場合は、別途取得したリポジトリマスターと日次レポートを結合し、レポートにないリポジトリをゼロ件として補完します。

日次の作成数とマージ数を単純に割らない

同じ日の「Copilotが作成したPR数」と「Copilotが作成したPRのマージ数」は、同じPR集団とは限りません。

例えば、7月15日に作成されたPRが7月18日にマージされる場合、作成イベントとマージイベントは別の日のレポートに記録されます。そのため、次の計算をそのままマージ率として扱うのは不適切です。

同日のマージ数 ÷ 同日の作成数

正確なマージ率を求めるには、PR単位で作成日とマージ日を追跡するコホート分析が必要です。リポジトリ別の日次集計だけで算出する場合は、「当日の活動量」として扱い、転換率とは区別します。

レビュー数は期間内のユニークPR数とは限らない

同じPRが異なる日にレビューされた場合、各日のレビュー活動として記録される可能性があります。日次レポートを単純合算した値は「期間中のレビュー活動数」であり、「期間中にレビューされたユニークPR数」と一致しない場合があります。(GitHub Docs)

EnterpriseとOrganizationの結果を単純合算しない

EnterpriseレポートとOrganizationレポートを両方取得している場合、同じ活動を二重計上しないようにします。

また、EnterpriseとOrganizationでは、ユーザーやリポジトリの帰属、重複排除、集計タイミングなどにより、集計値が完全には一致しない場合があります。リポジトリの移管があった期間も、帰属先の解釈に注意が必要です。(GitHub Docs)

全社レポートを作る場合はEnterpriseエンドポイント、Organization管理者向けレポートを作る場合はOrganizationエンドポイントというように、用途ごとに基準となるデータソースを決めておくと混乱を防げます。

リポジトリ別レポートから作れる実用的なKPI

リポジトリ別データは、単に件数を一覧表示するだけでなく、開発プロセスの改善指標として利用できます。

KPI算出の考え方注意点
Copilot利用リポジトリ数日次レポートに登場したリポジトリ数PR関連の活動があったリポジトリだけを表す
Copilot利用リポジトリ率利用リポジトリ数 ÷ 対象となるアクティブリポジトリ数全リポジトリ数ではなく、アーカイブ済みなどを除いた分母を定義する
Copilot作成PR比率Copilotが作成したPR数 ÷ 同日の全PR作成数全PR数は別のGitHub APIや分析基盤から取得する
Copilotレビュー利用率Copilot code reviewを利用したPR数 ÷ レビュー対象PR数レビュー対象の定義を組織内で統一する
継続利用リポジトリ数一定期間に複数日登場したリポジトリ数単発検証と定常利用を区別できる
導入後のPR処理時間導入前後のマージ所要時間を比較するリポジトリ規模や変更量などの条件差を考慮する

利用リポジトリ数だけでは、Copilotが開発生産性へ与えた影響までは分かりません。PR全体の件数、マージまでの時間、変更規模、不具合率などと組み合わせて評価することが重要です。

エラーや想定外の結果が出たときの確認ポイント

Enterprise、Organizationの両エンドポイントでは、200204403404500などのHTTPステータスが定義されています。(GitHub Docs)

状況主な確認ポイント
204 No Contentレスポンス本文をjqで解析しない。対象日、データ反映待ち、レポート対象活動の有無を確認する
403 ForbiddenCopilot usage metrics policy、管理ロール、PATスコープ、GitHub App権限を確認する
404 Not FoundEnterpriseのslug、Organization名、エンドポイントのパス、トークンからの可視性を確認する
500 Internal Server Error一時的なエラーとして、間隔を空けた再試行を行う
200だが期待したリポジトリがないその日に対象となるPR活動があったか確認する。行がないことをCopilot無効と解釈しない
ダウンロードURLでエラーになるURLの有効期限切れを疑い、repos-1-dayを再実行する
一部のデータしか取得できないdownload_links[0]だけでなく、配列内のすべてのURLを処理しているか確認する
日次バッチでデータが頻繁に欠ける対象日をUTC基準で2日以上前にずらす
JSONパーサーが失敗する通常のJSON配列ではなくNDJSONとして1行ずつ解析する
フィールド不足でETLが停止する任意フィールドを許容し、実際のNDJSONスキーマを検査する

403404の原因は一つとは限りません。特に、ポリシー、ユーザーロール、トークン権限の3点を個別に確認することが重要です。

本番運用で押さえるべきセキュリティと設計

最小権限のトークンを使用する

メトリクス取得専用のGitHub Appや管理用アカウントを用意し、不要な書き込み権限を与えないようにします。

Classic PATを利用する場合も、別用途の強い権限を持つトークンを流用せず、用途を限定します。トークンはCI/CDのシークレットストアやクラウドのシークレット管理サービスで保管します。

期限付きURLをログへ不用意に出力しない

download_linksは一時的とはいえ、URLを知る者がファイルへアクセスできる可能性があります。CI/CDの公開ログやチャット通知へURL全文を出力しないようにします。

response.jsonにも期限付きURLが保存されるため、保存先のアクセス権と保持期間を決めておきます。

生データと加工データを分ける

次の3層に分けると、仕様変更への対応が容易です。

  1. APIレスポンスを保存する層
  2. ダウンロードした生のNDJSONを保存する層
  3. BIツールやデータウェアハウス向けに整形する層

加工処理に不具合があっても、生のNDJSONが残っていれば再処理できます。

取得条件を記録する

少なくとも、次の情報をレポートと一緒に保存します。

  • EnterpriseまたはOrganizationの識別子
  • 指定したday
  • レスポンスのreport_day
  • APIバージョン
  • 取得日時
  • HTTPステータス
  • ダウンロードした分割ファイル数
  • NDJSONのレコード数
  • ETL処理のバージョン

これにより、後から数値が合わない場合でも、どの条件で取得したデータかを追跡できます。

まとめ:ポリシーを有効化して日次NDJSONを確実に回収する

GitHub Copilotのリポジトリ別利用状況を取得するには、EnterpriseまたはOrganization向けのrepos-1-dayエンドポイントを使用します。

実施手順は次のとおりです。

  1. GitHub Enterprise CloudでCopilot usage metricsポリシーを有効化する
  2. EnterpriseまたはOrganizationの参照権限を持つユーザーを用意する
  3. エンドポイントに適したトークン権限を設定する
  4. day=YYYY-MM-DDを指定して日次APIを呼び出す
  5. 返されたdownload_linksをすべて処理する
  6. NDJSONの実際のフィールドを確認してから集計処理を実装する
  7. 日次バッチはUTC基準で2日以上前を対象にする
  8. レポートにないリポジトリを自動的に「Copilot未使用」と判定しない

最初に行うべきことは、対象EnterpriseまたはOrganizationのCopilot usage metricsポリシーと、自分の管理ロールを確認することです。その後、まず1日分を手動取得し、NDJSONの実スキーマを確認してから定期実行へ移行すると、安全にリポジトリ別の利用状況を可視化できます。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次