セッションと結果 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のセッションとそのアクセシビリティ結果にプログラムでアクセスできます。プロジェクトのセッションを見つけるにはSessionsエンドポイントを使用し、特定のセッションの詳細な結果を取得するにはResultsエンドポイントを使用します。

どちらのエンドポイントもプロジェクトIDが必要です。Axe Developer Hubで見つけるか、Projects APIを使用してプロジェクト名で検索してください。

認証

すべてのリクエストにはAPIキーが必要です。これをX-API-Keyヘッダーに提供してください:

X-API-Key: <DEQUE_API_KEY>

AxeアカウントポータルでAPIキーを見つけてください。ウェブまたは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

取得したいセッションのプロジェクトIDで{project_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"
    }
  ]
}

モバイルプロジェクトのセッションは同じ形式を持っています。このモバイルプロジェクトからの例では、セッションにGit情報がないため、git_branch、git_url、commit_shaがnullです。

{
  "sessions": [
    {
      "session_id": "5b6c7d8e-9f0a-4b1c-8d2e-3f4a5b6c7d8e",
      "created_at": "2026-06-15T11:05:00.000Z",
      "is_canonical_source": false,
      "git_branch": null,
      "git_url": null,
      "commit_sha": null,
      "created_by_user_name": "Jane Developer",
      "created_by_user_email": "jane.developer@example.com",
      "created_by_user_api_key_name": "Mobile CI Key"
    }
  ]
}

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

セッションエンドポイントはカーソルベースのページネーションを使用します。現在のページの結果の他にさらに結果がある場合、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圧縮されています。Accept-Encoding: brをすべてのリクエストに含めると、特にformat=fullや大規模なセッションで最速かつ最も信頼性の高いダウンロードが可能です。レスポンス圧縮を参照してください。

重複排除

webプロジェクトの場合、どちらのレスポンス形式も重複排除された結果を返します。セッション内で同じ問題が複数のページ状態で見つかった場合、初めに見つかったページ状態に基づいて一度だけ報告されます。同じルールとページURL、そしてCSSセレクタ、XPath、または系譜によって一致する同じ要素の場合に二つの結果が同じ問題と見なされます。完全な一致ルールについては重複を参照してください。

  • 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がAccept-Encodingからbrを削除する場合)、gzipと非圧縮レスポンスは引き続き動作します。ダウンロードが遅くなるのが予想され、大きな結果は1セッションずつダウンロードしてください。

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

  • curl: --compressed を追加します。curl はそれがサポートするすべてのエンコーディングをリクエストし、レスポンスを自動で解凍します。Brotliをリクエストするのはあなたのcurl ビルドがそれをサポートしている場合のみ: curl -V を実行し、brotli がFeatures行内にあるか確認してください。一部のビルド、特に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などで自分で解凍してください。

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

セッションの結果がまだ処理されていない場合、Resultsエンドポイントは自動的に処理を開始し、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の処理

負荷が高い期間中、Resultsエンドポイントは処理を即座に開始する代わりに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(共通エクスポート形式)でフルの問題レベルの結果を返します。この形式には、セッション中に発見されたすべてのアクセシビリティの問題が含まれており、ページレベルおよびルールレベルの詳細も含まれています。また、レビューが必要ですの結果も含まれており、ウェブおよびモバイルセッションの両方に対応しています。それぞれがneedsReview: trueとstatus: "INCOMPLETE"でマークされており、ファイルにはルールごとのneedsReviewサマリーとissueSummary.needsReviewカウントが含まれています。レビューが必要です の結果は、issueSummaryの影響カウントやfailedRulesに追加されません。2026年10月14日以前に処理されたセッションにはレビューが必要です が含まれておらず、2026年9月15日以前のモバイルスキャンではこれを含めることができませんでした。

important

allIssuesのすべてのエントリが違反ではありません。レビューが必要です のエントリは同じallIssues配列に表示されるため、すべてのallIssuesエントリを違反としてカウントまたは処理するツールはカウントを超えてしまいます。各エントリのneedsReviewプロパティを確認し、違反だけを求める場合は、trueのエントリをスキップしてください。例として、jqを使用できます。

jq '.allIssues | map(select(.needsReview != true))' results.json

モバイルセッションの場合、format=fullはユニバーサルJSONを返します。元のモバイルスキャンJSON、スクリーンショット、またはビュー階層は含まれません。モバイルスキャンJSONを取得するには、Axe Developer Hubからセッションをエクスポートしてください。

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

important

2026年7月15日以前に作成されたセッションはformat=fullに対して404 Not Foundを返します。これは、ユニバーサルJSON(共通エクスポート形式)のキャプチャがその日まで有効化されなかったためです。これらのセッションには返すべきユニバーサル形式のデータがありません。この日以前に作成されたセッションの結果を取得するには、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リクエストが多すぎますの対処を参照してください。

一般的なワークフロー

プロジェクトのすべてのセッションを取得し、フル結果をダウンロードする

この例では、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