セッションと結果 API リファレンス

This page is not available in the language you requested. You have been redirected to the English version of the page.
Link to this page copied to clipboard

セッションリストや完全なアクセシビリティ結果を REST API を使用してプログラムで取得

Not for use with personal data

セッションと結果 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 文字列またはnull セッションを作成したユーザーのメールアドレス。nullは、作成者のメールが記録される前に作成されたセッション用です。
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_email": null,
      "created_by_user_api_key_name": "Unknown Member"
    }
  ]
}

カーソルページネーション

セッションエンドポイントはカーソルベースのページネーションを使用します。現在のページを超える結果がある場合、x-pagination-cursorレスポンスヘッダーに不透明なカーソル値が返されます。この値を次のリクエストでafterクエリパラメーターとして渡して、次のページを取得してください。

レスポンスにx-pagination-cursorヘッダーがない場合、最後のページに到達しています。

メールフィルターの制限

important

created_by_user_emailフィルターは、サーバー側で作成者のメールが保持されるようになった日付以降に作成されたセッションのみに一致します。その日付以前に作成されたセッションには、保存された作成者のメールがないため、メールでフィルターされた結果には表示されません。新しいセッションが増えるにつれて、フィルターは徐々に完了します。

セッションエンドポイントエラーレスポンス

ステータス 原因
400 Bad Request クエリパラメーターの値が無効です(たとえば、ISO 8601タイムスタンプが不完全である場合や、page_sizeが最大値を超えている場合)。
401 Unauthorized APIキーが無効であるか、欠落しているか、または関連するサブスクリプションが非アクティブです。
403 Forbidden APIキーは指定されたプロジェクトにアクセスする権限がありません。
404 Not Found 指定されたプロジェクトIDは存在しません。

結果エンドポイント

特定のセッションに対するアクセシビリティの結果を返します。結果は非同期で返されます:結果がまだ準備されていない場合、エンドポイントは204 No Contentを返し、結果が準備されるまでポーリングします。

tip

結果はデフォルトでBrotli圧縮されます。特にformat=fullや大規模なセッションで、Accept-Encoding: brをすべてのリクエストと共に送信して、最も高速で信頼性の高いダウンロードを実現してください。レスポンス圧縮を参照してください。

重複排除

ウェブプロジェクトの場合、両方の応答フォーマットが重複排除された結果を返します。同じ問題がセッション内の複数のページ状態で見つかった場合、最初に問題が見つかったページ状態の下で一度だけ報告されます。同じルールとページ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
  • ヘッダー(推奨):
    • Accept-Encoding: br:Brotli圧縮されたレスポンスをリクエストし、最も高速にダウンロードします。レスポンス圧縮を参照してください。

セッションエンドポイントから返されたsession_id値を{session_id}に置き換えます。これは有効なUUIDでなければなりません。

クエリパラメータ

パラメータ 必須 説明
format いいえ レスポンス形式。デフォルトの場合はsummaryで、レガシーのダウンロード可能なレポートエンドポイントと同じJSON形式を返します。fullは完全なユニバーサルJSON(共通エクスポート形式)を返します。

レスポンス圧縮

結果エンドポイントは、リクエストのAccept-Encodingヘッダーに基づいてレスポンスを圧縮します。Brotli(br)が許可されている場合はそれを使用し、そうでない場合はgzipを、さらにそれも不可の場合は圧縮なしになります。レスポンスのContent-Encodingヘッダーが使用されたエンコーディングを示します。

可能な限りBrotliを使用してください。結果はBrotli圧縮された状態で保存されているため、Brotliレスポンスはそのまま送信されます。gzipまたは非圧縮のレスポンスは、サーバで最初に解凍し再エンコードする必要があり、それがはるかに遅くなります:大規模format=fullのダウンロードや、複数のダウンロードを同時に行うと、完了する前に失敗する可能性があります。

Brotliを使用できない場合(たとえば、ネットワーク上のプロキシやVPNがbrをAccept-Encodingから削除する場合)、gzipおよび非圧縮レスポンスはまだ動作します。ダウンロードが遅くなるのを予想し、大規模な結果は1セッションごとにダウンロードしてください。

ほとんどのHTTPクライアントはデフォルトでBrotliをリクエストしません:

  • curl:--compressedを追加してください。curlは、サポートするすべてのエンコーディングをリクエストし、レスポンスを自動的に解凍します。それは、curlビルドがそれをサポートしている場合のみBrotliをリクエストします:curl -Vを実行し、Features行にbrotliがあるか確認してください。macOSに付属するcurlを含むいくつかのビルドはBrotliを含まず、gzipにフォールバックします。Homebrewなどのパッケージマネージャからインストールされたcurlには通常それが含まれています。curlがBrotliをサポートしていない場合は、-H "Accept-Encoding: br"(--compressedなし)でリクエストし、セーブしたファイルをbrotli -dで解凍してください。
  • Python requests:brotliパッケージ(pip install brotli)をインストールしてください。それをインストールすると、requestsはBrotliを要求し、レスポンスを自動的に解凍します。
  • その他のクライアント:Accept-Encoding: brを設定し、クライアントがBrotliレスポンスを解凍することを確認してください。もしそうでない場合は、レスポンスを保存し、たとえばbrotli -dで自分で解凍してください。

セッション状態とポーリングパターン

セッションの結果がまだ処理されていない場合、結果エンドポイントは自動的に処理を開始し、204 No Content(レスポンスボディなし)で応答します。クライアントは200 OKレスポンスを受け取るまで同じエンドポイントをポーリングする必要があります。

ステート HTTPレスポンス 何をするか
done 200 OKと結果ペイロード 結果が準備されています。レスポンスボディを使用します。
processing 204 No Content 結果はまだ生成中です。少し待ってから再試行してください。
error エラーボディを持つ422 Unprocessable Entity(下記参照) このセッションの処理が失敗しました。リクエストを再試行すると、処理が再開されるため、再試行してポーリングを再開できます。

errorのレスポンスボディ

{
  "state": "ERROR",
  "message": "We were unable to process your session. Please try again, if the issue persists contact helpdesk."
}

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)
    # --compressed requests Brotli (if your curl supports it) and decompresses the response
    STATUS=$(curl -s -w '%{http_code}' -L --compressed \
      -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(共通エクスポート形式)で完全な問題レベルの結果を返します。この形式には、セッション中に見つかったすべてのアクセシビリティ問題が含まれ、ページレベルおよびルールレベルの詳細が含まれます。

完全な結果は非常に大きくなる可能性があるため、Brotli圧縮してリクエストしてください(Accept-Encoding: br、またはBrotli対応curlでの--compressed)。レスポンスのContent-EncodingはAccept-Encodingヘッダーからネゴシエートされます。レスポンス圧縮を参照してください。

important

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は存在しません。
422 Unprocessable Entity このセッションの処理が失敗しました。セッション状態とポーリングパターンを参照してください。
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
            # --compressed requests Brotli (if your curl supports it) and decompresses the response
            STATUS=$(curl -s -w '%{http_code}' -L --compressed \
              -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