セッションと結果 API リファレンス
セッションリストや完全なアクセシビリティ結果を REST API を使用してプログラムで取得
セッションと結果 API は、Axe Developer Hub のセッションとそのアクセシビリティ結果にプログラムでアクセスするための手段を提供します。プロジェクトのセッションを見つけるにはセッションエンドポイントを使用し、特定のセッションの詳細な結果を取得するには結果エンドポイントを使用します。
どちらのエンドポイントもプロジェクトIDが必要です。Axe Developer Hubで見つけるか、プロジェクト名でプロジェクト APIを使用して検索してください。
認証
すべてのリクエストには API キーが必要です。X-API-Key ヘッダーを使用して提供してください。
X-API-Key: <DEQUE_API_KEY>Axe アカウントポータルで API キーを見つけてください。Web や CI/CD プロジェクトには Axe Developer Hub API キーを、モバイルプロジェクトには Axe DevTools Mobile API キーを選んでください。
APIキーは秘密として扱ってください:リクエストにハードコードするのではなく、環境変数やCI/CDプラットフォームのシークレットストアに保存してください。
アクセス制御
次のアクセスルールは両方のエンドポイントに適用されます:
- プロジェクトメンバーは所属するプロジェクトのセッションと結果にアクセスできます。
- 組織管理者はアクティブな Axe Developer Hub や Axe DevTools Mobile のサブスクリプションを持っていれば、プロジェクトへの所属に関わらず、組織内の全プロジェクトのセッションと結果にアクセスできます。アクセスは API キーのプロダクトに基づいて制限されます: Axe Developer Hub API キーは Axe Developer Hub のデータのみを返し、Axe DevTools Mobile API キーは Axe DevTools Mobile のデータのみを返します。組織管理者は、Axe DevTools Mobile の API キーを使って Axe Developer Hub のデータを取得したり、Axe Developer Hub の API キーを使って Axe DevTools Mobile のデータを取得したりすることはできません。
- 非メンバー、非管理者ユーザーにはアクセス拒否の応答が返されます。
- 非アクティブなサブスクリプションは
401 Unauthorizedを返します。
セッションエンドポイント
指定されたプロジェクトのセッションのページ付けされた、フィルタ可能なリストを返します。
リクエスト
- エンドポイント:
GET https://axe.deque.com/api-pub/v1/results/projects/{project_id}/sessions - ヘッダー (必須):
X-API-Key: <DEQUE_API_KEY>Accept: application/json
{project_id}を、取得したいセッションのプロジェクト ID に置き換えてください。Axe Developer Hubでプロジェクト ID を見つけてください。
クエリパラメータ
すべてのクエリパラメータはオプションです。
| パラメータ | 説明 |
|---|---|
page_size |
ページごとに返すセッションの数。デフォルト: 30。最大値: 100。最大値を超える数値は100に制限されます。 |
after |
次のページを取得するために、前回の応答からのカーソル値を使用します。カーソルページネーションを参照してください。 |
created_after |
このタイムスタンプ以降に作成されたセッションのみを返します (ISO 8601 UTC、半開; 正確な境界は除外)。例: 2025-01-01T00:00:00Z |
created_before |
このタイムスタンプ以前に作成されたセッションのみを返します (ISO 8601 UTC、半開; 正確な境界は除外)。例: 2026-01-01T00:00:00Z |
is_canonical_source |
true時、カノニカルソースとしてマークされたセッションのみを返します。trueまたはfalseでなければなりません。 |
git_branch |
指定された Git ブランチ名に関連付けられたセッションのみを返します。Git なしのセッションは一致しません。 |
commit_sha |
指定された Git コミット SHA に関連付けられたセッションのみを返します。Git なしのセッションは一致しません。 |
git_url |
指定された Git リポジトリ URL に関連付けられたセッションのみを返します。Git なしのセッションは一致しません。 |
created_by_user_email |
このメールアドレスのユーザーによって作成されたセッションのみを返します。メールフィルターの制限を参照してください。 |
レスポンスボディ
成功したレスポンスは、sessions配列を含む JSON オブジェクトを返します。各セッションオブジェクトには以下のフィールドが含まれます。
| フィールド | 型 | 説明 |
|---|---|---|
session_id |
文字列 | セッションの一意の識別子。 |
name |
文字列 | 人が読める形のセッション名 (設定した場合)。未設定の場合は省略されます; 合成された代替は提供されません。 |
created_at |
文字列 | セッションが作成された時刻のISO 8601 UTCタイムスタンプ。 |
is_canonical_source |
ブール型 | このセッションが標準ソースとしてマークされているかどうか。 |
git_branch |
文字列 | セッションに関連付けられたGitブランチ。Gitを使用しないセッションの場合はnull。 |
git_url |
文字列 | セッションに関連付けられたGitリポジトリのURL。Gitを使用しないセッションの場合はnull。 |
commit_sha |
文字列 | セッションに関連付けられたGitコミットSHA。Gitを使用しないセッションの場合はnull。 |
created_by_user_name |
文字列 | セッションを作成したユーザーの表示名。ユーザーのAPIキーが削除された場合は省略されます。 |
created_by_user_email |
文字列 | セッションを作成したユーザーのメールアドレス。ユーザーのAPIキーが削除された場合は省略されます。 |
created_by_user_api_key_name |
文字列 | セッションの作成に使用されたAPIキーの名前。APIキーが削除された場合は"Unknown Member"を返します。 |
例のレスポンスボディ
{
"sessions": [
{
"session_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"name": "Main CI run for PR 451",
"created_at": "2026-06-01T14:23:00.000Z",
"is_canonical_source": true,
"git_branch": "feature/new-nav",
"git_url": "https://github.com/example/webapp",
"commit_sha": "9eabf5b536662000f79978c4d1b6e4eff5c8d785",
"created_by_user_name": "Jane Smith",
"created_by_user_email": "jane.smith@example.com",
"created_by_user_api_key_name": "CI Pipeline Key"
},
{
"session_id": "f0e1d2c3-b4a5-6789-0123-456789abcdef",
"created_at": "2026-05-30T09:00:00.000Z",
"is_canonical_source": false,
"git_branch": null,
"git_url": null,
"commit_sha": null,
"created_by_user_api_key_name": "Unknown Member"
}
]
}カーソルページネーション
セッションエンドポイントはカーソルベースのページネーションを使用します。現在のページを超える結果がある場合、x-pagination-cursorレスポンスヘッダーに不透明なカーソル値が返されます。この値を次のリクエストでafterクエリパラメーターとして渡して、次のページを取得してください。
レスポンスにx-pagination-cursorヘッダーがない場合、最後のページに到達しています。
メールフィルターの制限
created_by_user_emailフィルターは、サーバー側で作成者のメールが保持されるようになった日付以降に作成されたセッションのみに一致します。その日付以前に作成されたセッションには、保存された作成者のメールがないため、メールでフィルターされた結果には表示されません。新しいセッションが増えるにつれて、フィルターは徐々に完了します。
セッションエンドポイントエラーレスポンス
| ステータス | 原因 |
|---|---|
400 Bad Request |
クエリパラメーターの値が無効です(たとえば、ISO 8601タイムスタンプが不完全である場合や、page_sizeが最大値を超えている場合)。 |
401 Unauthorized |
APIキーが無効であるか、欠落しているか、または関連するサブスクリプションが非アクティブです。 |
403 Forbidden |
APIキーは指定されたプロジェクトにアクセスする権限がありません。 |
404 Not Found |
指定されたプロジェクトIDは存在しません。 |
結果エンドポイント
特定のセッションに対するアクセシビリティの結果を返します。結果は非同期で返されます:結果がまだ準備されていない場合、エンドポイントは204 No Contentを返し、結果が準備されるまでポーリングします。
重複排除
ウェブプロジェクトの場合、両方の応答フォーマットが重複排除された結果を返します。同じ問題がセッション内の複数のページ状態で見つかった場合、最初に問題が見つかったページ状態の下で一度だけ報告されます。同じルールとページURL、CSSセレクタ、XPath、または親子関係で一致した同じ要素を持つとき、2つの結果は同じ問題と見なされます。完全な一致ルールについては、重複を参照してください。
format=summary: 問題の数は影響度とルール数によってそれぞれ一意の問題を一度ずつカウントします。format=full: 各一意の問題は問題のリストに一度表示され、ヘッダーの概要のカウントは一意のカウントです。
重複排除は単一のセッション内のみで行われます: 結果は他のセッションと比較されず、何個の重複が除去されたかや問題が新しいかどうかの情報は応答に含まれません。モバイルの結果は重複排除されません。
リクエスト
- エンドポイント:
GET https://axe.deque.com/api-pub/v1/results/sessions/{session_id}/results - ヘッダー (必須):
X-API-Key: <DEQUE_API_KEY>Accept: application/json
セッションエンドポイントから返されたsession_id値を{session_id}に置き換えます。これは有効なUUIDでなければなりません。
クエリパラメータ
| パラメータ | 必須 | 説明 |
|---|---|---|
format |
いいえ | レスポンス形式。デフォルトの場合はsummaryで、レガシーのダウンロード可能なレポートエンドポイントと同じJSON形式を返します。fullは完全なユニバーサルJSON(共通エクスポート形式)を返します。 |
セッション状態とポーリングパターン
セッションの結果がまだ処理されていない場合、結果エンドポイントは自動的に処理を開始し、204 No Content(レスポンスボディなし)で応答します。クライアントは200 OKレスポンスを受け取るまで同じエンドポイントをポーリングする必要があります。
| ステート | HTTPレスポンス | 何をするか |
|---|---|---|
done |
200 OKと結果ペイロード |
結果が準備されています。レスポンスボディを使用します。 |
processing |
204 No Content |
結果はまだ生成中です。少し待ってから再試行してください。 |
error |
204 No Content |
処理中にエラーが発生しました。リクエストを再試行することができます。 |
429 Too Many Requestsの処理
負荷が高い期間中、結果エンドポイントは429 Too Many Requestsを返すことがあり、すぐに処理を開始しない場合があります。これはリクエストが失われたことを意味するものではありません。基礎となる作業はキューに残り、再試行しても同じセッションに対する重複処理は行われません。
429レスポンスには、Retry-Afterヘッダーが含まれ、秒単位で示されます。再試行する前に、その時間だけ待つ必要があります—以下の例は通常の204ポーリングケースと並行してこれを処理します。
レスポンスボディ
{
"error": "Too many requests. Retry after the Retry-After interval."
}例:結果のポーリング
#!/bin/bash
SESSION_ID="a1b2c3d4-e5f6-7890-abcd-ef1234567890"
URL="https://axe.deque.com/api-pub/v1/results/sessions/$SESSION_ID/results"
MAX_ATTEMPTS=20
DELAY=5
TEMP_FILE=$(mktemp)
for ((i=1; i<=MAX_ATTEMPTS; i++)); do
echo "Attempt $i..."
HEADERS_FILE=$(mktemp)
STATUS=$(curl -s -w '%{http_code}' -L \
-H "Accept: application/json" \
-H "X-API-Key: $API_KEY" \
-D "$HEADERS_FILE" \
-o "$TEMP_FILE" \
"$URL?format=full")
case $STATUS in
200)
echo "Results ready!"
cat "$TEMP_FILE"
rm "$TEMP_FILE" "$HEADERS_FILE"
exit 0
;;
204)
echo "Still processing, waiting ${DELAY}s..."
sleep $DELAY
;;
429)
RETRY_AFTER=$(grep -i '^retry-after:' "$HEADERS_FILE" | tr -d '\r' | awk '{print $2}')
RETRY_AFTER=${RETRY_AFTER:-$DELAY}
echo "Too many requests, waiting ${RETRY_AFTER}s per Retry-After..."
sleep "$RETRY_AFTER"
;;
*)
echo "Error: HTTP $STATUS"
cat "$TEMP_FILE"
rm "$TEMP_FILE" "$HEADERS_FILE"
exit 1
;;
esac
rm -f "$HEADERS_FILE"
done
echo "Timeout after $MAX_ATTEMPTS attempts"
rm "$TEMP_FILE"
exit 1レスポンス形式
format=summary(デフォルト)
レガシーのダウンロード可能なレポートエンドポイントと同じJSON形式を返します。ダウンロード可能なレポートエンドポイントに基づいて既存のツールを持ち、その代替品を必要とする場合はこの形式を使用してください。
format=full
ユニバーサルJSON(共通エクスポート形式)で完全な問題レベルの結果を返します。この形式には、セッション中に見つかったすべてのアクセシビリティ問題が含まれ、ページレベルおよびルールレベルの詳細が含まれます。
レスポンスはクライアントのAccept-Encodingヘッダーから交渉されたContent-Encodingと共に提供されます。
2026年7月15日以前に作成されたセッションでは、Universal JSON(共通エクスポートフォーマット)のキャプチャがその日まで有効化されていなかったため、format=fullには404 Not Foundが返されます。これらのセッションには返すべきユニバーサルフォーマットのデータがありません。この日以前に作成されたセッションの結果を取得するには、format=summaryを使用してください。
結果エンドポイントエラーレスポンス
| ステータス | 原因 |
|---|---|
400 Bad Request |
formatパラメーター値がsummaryまたはfullではない、またはsession_idが有効なUUIDではない。 |
401 Unauthorized |
APIキーが無効であるか、欠落しているか、または関連するサブスクリプションが非アクティブです。 |
403 Forbidden |
APIキーはこのセッションを所有するプロジェクトにアクセスする権限がありません。 |
404 Not Found |
指定されたセッションIDは存在しません。 |
429 Too Many Requests |
システムが過負荷状態です。429 Too Many Requests の処理を参照してください。 |
一般的なワークフロー
プロジェクトのすべてのセッションを取得し、完全な結果をダウンロードする
この例では、curlとjqを使用してプロジェクトのすべてのセッションをページングし、各セッションの完全なユニバーサルJSON結果をダウンロードします。ウェブプロジェクトの場合、各ファイルにはセッションの重複排除された問題が含まれます; 重複排除を参照してください。
#!/bin/bash
# Set these environment variables before running:
# API_KEY: your Axe Developer Hub API key
# PROJECT_ID: your project ID
BASE_URL="https://axe.deque.com/api-pub/v1/results"
CURSOR=""
while true; do
QUERY="page_size=100"
if [ -n "$CURSOR" ]; then
QUERY="$QUERY&after=$CURSOR"
fi
RESPONSE=$(curl -s -D - -H "Accept: application/json" -H "X-API-Key: $API_KEY" \
"$BASE_URL/projects/$PROJECT_ID/sessions?$QUERY")
NEXT_CURSOR=$(echo "$RESPONSE" | grep -i "x-pagination-cursor:" | tr -d '\r' | awk '{print $2}')
BODY=$(echo "$RESPONSE" | sed -n '/^\r\{0,1\}$/,$p' | tail -n +2)
SESSION_IDS=$(echo "$BODY" | jq -r '.sessions[].session_id')
for SESSION_ID in $SESSION_IDS; do
echo "Fetching results for session $SESSION_ID..."
while true; do
STATUS=$(curl -s -w '%{http_code}' -L \
-H "Accept: application/json" \
-H "X-API-Key: $API_KEY" \
-o "${SESSION_ID}.json" \
"$BASE_URL/sessions/$SESSION_ID/results?format=full")
if [ "$STATUS" = "200" ]; then
echo "Saved ${SESSION_ID}.json"
break
elif [ "$STATUS" = "204" ]; then
echo " Still processing, waiting..."
sleep 5
else
echo " Error: HTTP $STATUS"
break
fi
done
done
if [ -z "$NEXT_CURSOR" ]; then
break
fi
CURSOR="$NEXT_CURSOR"
done