CrUX API の使用方法

Chrome UX Report API を使用して、数百万ものウェブサイ��の実際のユーザー エクスペリエンス データにアクセスする方法を学べます。

Rick Viscomi
Rick Viscomi
Shane Exterkamp
Shane Exterkamp

Chrome UX レポート(CrUX)データセットは、Chrome ユーザーがウェブ上の人��ページに実際にアクセスしたときの状況を表すデータセットです。クエリ可能なデータセットが BigQuery で初めてリリースされた 2017 年以来、CrUX のフィールド データは PageSpeed InsightsCrUX ダッシュボード、Search Console の Core Web Vitals レポートなどのデベロッパー ツールに統合され、デベロッパーは実際のユーザー エクスペリエンスを測定、モニタリングできるようになりました。これまで欠けていたのが、CrUX データへの RESTful アクセスをプログラムで提供するツールです。このギャップを埋めるために、このたび、まったく新しい Chrome UX Report API をリリースすることになりました。

この API は、CrUX データへのシンプル、迅速、包括的なアクセスをデベロッパーに提供することを目標に構築されました。CrUX API は、Lighthouse のパフォーマンス監査のラボデータもレポートする既存の PageSpeed Insights API とは異なり、フィールドのユーザー エクスペリエンス データのみをレポートします。CrUX API は効率化されており、ユーザー エクスペリエンス データを迅速に提供できるため、リアルタイム監査アプリケーションに最適です。

デベロッパーが最も重要なすべての指標(Core Web Vitals)にアクセスできるようにするために、CrUX API は、オリジンレベルと URL レベルの両方で Largest Contentful Paint(LCP)、First Input Delay(FID)、Cumulative Layout Shift(CLS)の監査とモニタリングを行います。

早速、使い方を見ていきましょう。

送信元データをクエリする

CrUX データセットのオリジンには、基盤となるページレベルのエクスペリエンスがすべて含まれます。次の例は、コマンドラインで cURL を使用して、CrUX API に対してオリジンのユーザー エクスペリエンス データを照会する方法を示しています。

API_KEY="[YOUR_API_KEY]"
curl "https://chromeuxreport.googleapis.com/v1/records:queryRecord?key=$API_KEY" \
  --header 'Content-Type: application/json' \
  --data '{"origin": "https://web.dev"}'

curl コマンドは、次の 3 つの部分で構成されます。

  1. API の URL エンドポイント(呼び出し元の API 秘密鍵を含む)。
  2. リクエスト本文に JSON が含まれていることを示す Content-Type: application/json ヘッダー。
  3. https://web.dev オリジンを指定する、JSON エンコードのリクエスト本文

JavaScript で同じことを行うには、CrUXApiUtil ユーティリティを使用します。 API 呼び出しを行い、デコードされたレスポンスを返す(GitHub のバリアントも参照) では、履歴やバッチのサポートなど、さらに多くの機能をご利用いただけます)。

const CrUXApiUtil = {};
// Get your CrUX API key at https://goo.gle/crux-api-key.
CrUXApiUtil.API_KEY = '[YOUR_API_KEY]';
CrUXApiUtil.API_ENDPOINT = `https://chromeuxreport.googleapis.com/v1/records:queryRecord?key=${CrUXApiUtil.API_KEY}`;
CrUXApiUtil.query = function (requestBody) {
  if (CrUXApiUtil.API_KEY == '[YOUR_API_KEY]') {
    throw 'Replace "YOUR_API_KEY" with your private CrUX API key. Get a key at https://goo.gle/crux-api-key.';
  }
  return fetch(CrUXApiUtil.API_ENDPOINT, {
    method: 'POST',
    body: JSON.stringify(requestBody)
  }).then(response => response.json()).then(response => {
    if (response.error) {
      return Promise.reject(response);
    }
    return response;
  });
};

[YOUR_API_KEY] は実際のに置き換えます。次に、CrUXApiUtil.query 関数を呼び出し、リクエスト本文オブジェクトを渡します。

CrUXApiUtil.query({
  origin: 'https://web.dev'
}).then(response => {
  console.log(response);
}).catch(response => {
  console.error(response);
});

このオリジンのデータが存在する場合、API レスポンスはユーザー エクスペリエンスの分布を表す指標を含む JSON エンコードされたオブジェクトです。分布指標はヒストグラムのビンとパーセンタイルです。

{
  "record": {
    "key": {
      "origin": "https://web.dev"
    },
    "metrics": {
      "largest_contentful_paint": {
        "histogram": [
          {
            "start": 0,
            "end": 2500,
            "density": 0.7925068547983514
          },
          {
            "start": 2500,
            "end": 4000,
            "density": 0.1317422195536863
          },
          {
            "start": 4000,
            "density": 0.07575092564795324
          }
        ],
        "percentiles": {
          "p75": 2216
        }
      },
      // ...
    }
  }
}

histogram オブジェクトの start プロパティと end プロパティは、特定の指標でユーザーに表示される値の範囲を表します。density プロパティは、その範囲内のユーザー エクスペリエンスの割合を表します。この例では、すべての web.dev ページにわたる LCP ユーザー エクスペリエンスの 79% が 2,500 ミリ秒未満であり、これは「良好」です。LCP のしきい値。percentiles.p75 値は、この分布のユーザー エクスペリエンスの 75% が 2,216 ミリ秒未満であることを意味します。レスポンスの構造について詳しくは、レスポンスの本文のドキュメントをご覧��ださい。

エラー

CrUX API に特定のオリジンのデータがない場合、CrUX API は JSON でエンコードされたエラー メッセージを返します。

{
  "error": {
    "code": 404,
    "message": "chrome ux report data not found",
    "status": "NOT_FOUND"
  }
}

このエラーをデバッグするには、まず、リクエストされたオリジンがパブリック ナビゲート可能であることを確認します。これをテストするには、ブラウザのアドレスバーにオリジンを入力し、リダイレクト後の最終ページ URL と比較します。よくある問題としては、サブドメインを不必要に追加または削除することや、間違った HTTP プロトコルを使用することなどが挙げられます。

エラー
{"origin": "http://www.web.dev"}

このオリジンに http:// プロトコルと www. サブドメインが誤って含まれています。

成功
{"origin": "https://web.dev"}

このオリジンは一般公開されています。

リクエストされたオリジンがナビゲーション可能なバージョンである場合、オリジンのサンプル数が不十分な場合にも、このエラーが発生することがあります。データセットに含まれるすべてのオリジンと URL には、個々のユーザーを匿名化するために十分な数のサンプルが必要です。また、オリジンと URL は公開インデックス登録が可能である必要があります。ウェブサイトをデータセットに含める方法について詳しくは、CrUX の手法をご覧ください。

URL データをクエリする

オリジンでの全体的なユーザー エクスペリエンスに関する CrUX API へのクエリ方法は見てきました。結果を特定のページに制限するには、url リクエスト パラメータを使用します。

API_KEY="[YOUR_API_KEY]"
curl "https://chromeuxreport.googleapis.com/v1/records:queryRecord?key=$API_KEY" \
  --header 'Content-Type: application/json' \
  --data '{"url": "https://web.dev/fast/"}'

この cURL コマンドはオリジンの例と��ていますが、リクエスト本文で url パラメータを使用して検索するページを指定する点が異なります。

JavaScript で CrUX API から URL データをクエリするには、リクエスト本文で url パラメータを使用して CrUXApiUtil.query 関数を呼び出します。

CrUXApiUtil.query({
  url: 'https://web.dev/fast/'
}).then(response => {
  console.log(response);
}).catch(response => {
  console.error(response);
});

この URL のデータが CrUX データセットに存在する場合は、API は JSON でエンコードされたレスポンスを返します。次に例を示します。

{
  "record": {
    "key": {
      "url": "https://web.dev/fast/"
    },
    "metrics": {
      "largest_contentful_paint": {
        "histogram": [
          {
            "start": 0,
            "end": 2500,
            "density": 0.8477304539092148
          },
          {
            "start": 2500,
            "end": 4000,
            "density": 0.08988202359528057
          },
          {
            "start": 4000,
            "density": 0.062387522495501155
          }
        ],
        "percentiles": {
          "p75": 1947
        }
      },
      // ...
    }
  }
}

フォームによると、https://web.dev/fast/ の 85% が「良好」です。LCP は 75 パーセンタイルの 1,947 ミリ秒で、オリジン全体の分布よりもわずかに優れています。

URL の正規化

CrUX API は、既知の URL のリストと一致するようにリクエストされた URL を正規化する場合があります。たとえば、URL https://web.dev/fast/#measure-performance-in-the-field のクエリを実行すると、正規化により https://web.dev/fast/ のデータが生成されます。この場合、レスポンスに urlNormalizationDetails オブジェクトが含まれます。

{
  "record": {
    "key": {
      "url": "https://web.dev/fast/"
    },
    "metrics": { ... }
  },
  "urlNormalizationDetails": {
    "normalizedUrl": "https://web.dev/fast/",
    "originalUrl": "https://web.dev/fast/#measure-performance-in-the-field"
  }
}

詳しくは、CrUX ドキュメントの URL の正規化をご覧ください。

フォーム ファクタ別のクエリ

ユーザー エクスペリエンスは、ウェブサイトの最適化、ネットワーク状態、ユーザーの環境によってできます。これらの違いをより深く理解するには、CrUX API の formFactor ディメンションを使用して、オリジンと URL のパフォーマンスをドリルダウンします。

API では、DESKTOPPHONETABLET の 3 つの明示的なフォーム ファクタ値がサポートされています。オリジンまたは URL に加えて、これらの値のいずれかをリクエスト本文に指定し、結果をそれらのユーザー エクスペリエンスのみに制限します。この例では、cURL を使ってフォーム ファクタ別に API をクエリする方法を示します。

API_KEY="[YOUR_API_KEY]"
curl "https://chromeuxreport.googleapis.com/v1/records:queryRecord?key=$API_KEY" \
  --header 'Content-Type: application/json' \
  --data '{"url": "https://web.dev/fast/", "formFactor": "PHONE"}'

JavaScript を使用して CrUX API でフォーム ファクタ固有のデータをクエリするには、リクエスト本文で url パラメータと formFactor パラメータを使用して CrUXApiUtil.query 関数を呼び出します。

CrUXApiUtil.query({
  url: 'https://web.dev/fast/',
  formFactor: 'PHONE'
}).then(response => {
  console.log(response);
}).catch(response => {
  console.error(response);
});

formFactor パラメータを省略することは、すべてのフォーム ファクタを組み合わせたデータをリクエストするのと同じことです。

{
  "record": {
    "key": {
      "url": "https://web.dev/fast/",
      "formFactor": "PHONE"
    },
    "metrics": {
      "largest_contentful_paint": {
        "histogram": [
          {
            "start": 0,
            "end": 2500,
            "density": 0.778631284916204
          },
          {
            "start": 2500,
            "end": 4000,
            "density": 0.13943202979515887
          },
          {
            "start": 4000,
            "density": 0.08193668528864119
          }
        ],
        "percentiles": {
          "p75": 2366
        }
      },
    // ...
    }
  }
}

レスポンスの key フィールドに formFactor リクエストの構成がエコーバックされ、スマートフォン エクスペリエンスのみが含まれていることを確認します。

前のセクションで、このページのユーザー エクスペリエンスの 85% が「良好」だったことを思い出してください。LCP。これに対して、スマートフォン専用のエクスペリエンスでは、「良好」と判断したのは 78% だけでした。また、75 パーセンタイルは、1,947 ミリ秒から 2,366 ミリ秒に上昇し、スマートフォンのエクスペリエンスで遅くなっています。フォーム ファクタ別にセグメント化すれば、ユーザー エクスペリエンスの極端なばらつきが顕在化す��可能性があります。

Core Web Vitals のパフォーマンスを評価する

Core Web Vitals プログラムでは、ユーザー エクスペリエンスまたはエクスペリエンスの分布が「良好」とみなすことができるかどうかを判断するためのターゲットを定義します。次の例では、CrUX API と CrUXApiUtil.query 関数を使用して、ウェブページにおける Core Web Vitals の指標(LCP、FID、CLS)の分布が「良好」かどうかを評価しています。

CrUXApiUtil.query({
  url: 'https://web.dev/fast/'
}).then(response => {
  assessCoreWebVitals(response);
}).catch(response => {
  console.error(response);
});

function assessCoreWebVitals(response) {
  // See https://web.dev/vitals/#core-web-vitals.
  const CORE_WEB_VITALS = [
    'largest_contentful_paint',
    'first_input_delay',
    'cumulative_layout_shift'
  ];
  CORE_WEB_VITALS.forEach(metric => {
    const data = response.record.metrics[metric];
    if (!data) {
      console.log('No data for', metric);
      return;
    }
    const p75 = data.percentiles.p75;
    const threshold = data.histogram[0].end;
    // A Core Web Vitals metric passes the assessment if
    // its 75th percentile is under the "good" threshold.
    const passes = p75 < threshold;
    console.log(`The 75th percentile (${p75}) of ${metric} ` +
        `${passes ? 'passes' : 'does not pass'} ` +
        `the Core Web Vitals "good" threshold (${threshold}).`)
  });
}

結果は、このページが 3 つの指標すべてについて Core Web Vitals の評価に合格していることを示しています。

The 75th percentile (1973) of largest_contentful_paint passes the Core Web Vitals "good" threshold (2500).
The 75th percentile (20) of first_input_delay passes the Core Web Vitals "good" threshold (100).
The 75th percentile (0.05) of cumulative_layout_shift passes the Core Web Vitals "good" threshold (0.10).

API の結果を自動的にモニタリングする方法と組み合わせることで、CrUX からのデータを使用して、実際のユーザー エクスペリエンスをすばやく常に向上させることができます。Core Web Vitals とその測定方法について詳しくは、Web VitalsCore Web Vitals を測定するためのツールをご覧ください。

次のステップ

CrUX API の初期バージョンに含まれる機能は、CrUX で可能な分析情報のほんの一部にすぎません。BigQuery の CrUX データセットユーザーは、次のような高度な機能に精通しているかもしれません。

  • その他の指標 <ph type="x-smartling-placeholder">
      </ph>
    • first_paint
    • dom_content_loaded
    • onload
    • time_to_first_byte
    • notification_permissions
  • その他のディメンション <ph type="x-smartling-placeholder">
      </ph>
    • month
    • country
    • effective connection type(ECT)
  • その他の粒度 <ph type="x-smartling-placeholder">
      </ph>
    • 詳細なヒストグラム
    • その他のパーセンタイル

公式の CrUX API ドキュメントを参照して API キーを取得し、他のサンプル アプリケーションを確認してください。ぜひお試しいただき、ご質問やフィードバックがございましたら、CrUX ディスカッション フォーラムからお寄せください。また、CrUX API に関する Google の計画に関する最新情報を入手するには、CrUX お知らせフォーラムに登録するか、Twitter で @ChromeUXReport をフォローしてください。