Vitals API V2リファレンス
このページには、Vitals API V2を統合するために必要なリファレンス情報が記載されています。指標セット、指標、およびディメンションについては、Vitals API V2の概要を参照してください。
Amazonは引き続きVitals API のバージョン 1 (V1) をサポートしています。新しい統合にはV2を使用してください。既存のインテグレーションをV2に移行します。V1については、Vitals APIリファレンスを参照してください。必要な変更については、V1からの移行を参照してください。
Vitals APIの使用にあたっては、Program Materials License Agreementが適用されます。
前提条件
リクエストを送信する前に、次のアイテムが揃っていることを確認してください:
| 要件 | 詳細 |
|---|---|
| Amazon開発者アカウント | 管理者レベルの認証情報 |
| セキュリティプロファイル | 開発者コンソールの設定 > APIアクセスでセキュリティプロファイルを作成します。 |
| Reporting APIにアタッチされたセキュリティプロファイル | セキュリティプロファイルをReporting APIに添付します。 |
| クライアントIDとクライアントシークレット | これらの値は、セキュリティプロファイルの [Web 設定] タブから取得します。 |
| LWAスコープ | adx_reporting::appstore:marketer |
| パッケージ名 | アプリのパッケージ名。例:com.example.myapp。デベロッパーアカウントがアプリを所有している必要があります。 |
このページのコード例では、Python 3.8以降とrequestsライブラリを使用しています。
ベースURL
Vitals API V2のベースURLはhttps://developer.amazon.com/api/appstoreです。
操作
Vitals API V2には、以下の操作とエンドポイントが含まれています:
| 操作 | メソッド | エンドポイント | 説明 |
|---|---|---|---|
| 最新状況の確認 | GET | /v2/applications/{packageName}/vitals/{metricSetName} |
指標セットのメタデータと最新性を返します |
| 指標の照会 | POST | /v2/applications/{packageName}/vitals/{metricSetName}:query |
ディメンションとフィルターを使用して、各期間の指標を返します |
| 問題の照会 | POST | /v2/applications/{packageName}/vitals/issuesMetricSet:query |
上位のクラッシュ問題またはANRの上位問題を返します |
エンドポイントは以下のパスパラメータを使用します。
| パラメーター | 説明 |
|---|---|
packageName |
アプリのパッケージ名。例:com.example.myapp |
metricSetName |
指標セットの名前。ただしissuesMetricSetを除く。リストについては、使用可能な指標セットを参照してください。 |
issuesMetricSetは問題の照会のみをサポートします。これに対する最新状況の確認リクエストは404 RESOURCE_NOT_FOUNDを返します。- 指標の照会と問題の照会のパスは
:queryで終わる必要があります。
リクエストヘッダー
| ヘッダー | 必須 | 値 |
|---|---|---|
Authorization |
はい | Bearer ACCESS_TOKEN。ACCESS_TOKENはLogin with Amazonで取得した access_tokenの値です。 |
Content-Type |
はい、POST |
application/json |
Accept |
いいえ | application/json。APIはJSONのみを送信します。 |
リクエストルール
このセクションのルールは、指標の照会操作と問題の照会操作に適用されます。
時間値
UTC タイムスタンプには、YYYY-MM-DDThh:mm:ssZ形式を使用してくださいstartTimeおよびendTimeが含まれます。
時間値は次のルールに従います。
- 時間範囲には、
startTimeとendTimeの期間が含まれます。endTimeはstartTimeと同じか、それより後でなければなりません。 DAILYの場合、APIはUTC日付を使用します。HOURLYの場合、APIは分と秒を無視します。たとえば2026-08-18T14:35:00Zは、2026-08-18T14:00:00Zから始まるUTC期間を選択します。startTimeは、DAILYの場合は直近30(UTC)日以内HOURLYの場合は直近15(UTC)日以内でなければなりません。APIは、最新状況値を基準にこれらの日付を遡って数えます。最新状況値の日付はそのうちの最初のものです。endTimeの UTC日付 (DAILY) またはUTC時間 (HOURLY) は、最新状況値より後であってはなりません。- これらのルールに違反する時間範囲の場合、APIは、違反するフィールドが
timelineSpec.startTimeまたはtimelineSpec.endTimeであることを示す400 VALIDATION_ERRORとFIELD_OUT_OF_RANGEを送信します。 - 最新状況の値がない場合、照会は行を返しません。
APIは次の時間値を拒否します。
- 時刻のない日付。例:
2026-08-18 - 秒未満の小数部分を含む時刻。例:
2026-08-18T00:00:00.000Z - タイムゾーンオフセットを含む時刻。例:
2026-08-18T00:00:00+00:00 - 小文字の
zで終わる時間
ディメンションとフィルター
- フィルターキーには、指標セットのディメンションを指定する必要があります。
dimensionsに含まれている必要はありません。 - フィルター値には、空でなく、大文字と小文字を区別する文字列を使用してください。
countryCodeの値は、大文字のISO 3166-1 alpha-2コードである必要があります。例:US。API は各キーの任意の値を照合し、すべてのキーが一致する必要があります。空の配列は効果がありません。 - 分類では、要求されたディメンションの値のないデータは除外されます。
ページ分割
次のページを取得するには、nextPageTokenを pageTokenとして送信します。pageTokenと、必要に応じてpageSizeを除き、リクエストを変更しないでください。nextPageTokenがnullになるまで繰り返します。新しい照会を開始するには、pageTokenを省略してください。
最新状況の確認
最新状況の確認オペレーションは、指標セットのメタデータと、そのデータの最新状況を返します。リクエストには本文がありません。
最新状況レスポンスフィールドを確認する
| フィールド | 型 | 常に存在する | メモ |
|---|---|---|---|
name |
文字列 | はい | 指標セットの名前 |
description |
文字列 | はい | 指標セットの説明 |
metrics[] |
文字列の配列 | はい | すべての集計期間における指標セットのすべての指標。一部の指標は DAILY のみをサポートします。順序は決まっていません。 |
dimensions[] |
文字列の配列 | はい | 指標セットのディメンション。順序は決まっていません。 |
freshnessInfo[] |
オブジェクトの配列 | はい | 最新状況値を持つ各集計期間に対して、1つのエントリがあります。配列には、エントリが0個、1個、または2個含まれる場合があります。 |
freshnessInfo[].aggregationPeriod |
文字列 | はい | DAILYまたはHOURLYを指定できます。 |
freshnessInfo[].latestDataTimestamp |
文字列 | はい | 直近に処理された日(DAILY)または時間(HOURLY)のUTC開始時刻YYYY-MM-DDThh:mm:ssZ形式 |
最新状況リクエストの例を確認する
GET /api/appstore/v2/applications/com.example.myapp/vitals/crashMetricSet HTTP/1.1
Host: developer.amazon.com
Authorization: Bearer ACCESS_TOKEN
最新状況のレスポンスの例を確認する
{
"name": "crashMetricSet",
"description": "App crash metrics",
"metrics": [
"crashRate",
"crashRate7dUserWeighted",
"crashRate28dUserWeighted",
"userPerceivedCrashRate",
"userPerceivedCrashRate7dUserWeighted",
"userPerceivedCrashRate28dUserWeighted",
"distinctDevices",
"crashCount"
],
"dimensions": [
"versionCode",
"countryCode",
"deviceModel",
"deviceType",
"deviceOs",
"osVersion"
],
"freshnessInfo": [
{"aggregationPeriod": "HOURLY", "latestDataTimestamp": "2026-08-18T14:00:00Z"},
{"aggregationPeriod": "DAILY", "latestDataTimestamp": "2026-08-18T00:00:00Z"}
]
}
指標の照会
指標の照会オペレーションは、データが存在する時間範囲内の各期間について、1つの指標セットのメトリクスを返します。
指標の照会リクエストパラメーター
| パラメーター | 説明 | 型 | 必須 |
|---|---|---|---|
timelineSpec |
集計期間と時間範囲。ルールについては時間値を参照してください。 | オブジェクト | はい |
timelineSpec.aggregationPeriod |
DAILYまたはHOURLYを指定できます。 |
文字列 | はい |
timelineSpec.startTime |
時間範囲の開始時刻形式YYYY-MM-DDThh:mm:ssZ |
文字列 | はい |
timelineSpec.endTime |
同じ形式の時間範囲の終了。値はstartTimeと同じか、それより後でなければなりません。 |
文字列 | はい |
metrics[] |
返されるメトリクス。metricsを含めない場合、APIは集計期間をサポートする指標セットのすべてのメトリクスを返します。 |
文字列の配列 | いいえ |
dimensions[] |
ブレークダウンのディメンション。slowStartRateMetricSetの場合、dimensionsにはstartTypeを含める必要があります。 |
文字列の配列 | いいえ |
filter |
含めるディメンション値。各キーはディメンション名で、各値は文字列の配列です。ルールについては、ディメンションとフィルターを参照してください。 | オブジェクト | いいえ |
pageSize |
1ページの最大行数。デフォルト値は1,000です。値が0 の場合はデフォルトが使用されます。値が100,000を超えると、100,000が使用されます。 |
整数 | いいえ |
pageToken |
前のレスポンスから取得したnextPageTokenの値。最初のリクエストにはpageTokenを含めないでください。 |
文字列 | いいえ |
指標の照会リクエストの例
指標の照会と問題の照会のリクエスト例に記載されている日付は、説明用の例です。実際のリクエストでは、時間値と最新状況の確認に基づいて日付を選択してください。
{
"timelineSpec": {
"aggregationPeriod": "DAILY",
"startTime": "2026-08-12T00:00:00Z",
"endTime": "2026-08-18T00:00:00Z"
},
"metrics": ["crashRate", "crashCount", "distinctDevices"],
"dimensions": ["versionCode"],
"filter": {
"countryCode": ["US", "CA"],
"deviceType": ["FIRE_TV"]
},
"pageSize": 1000
}
指標の照会レスポンスフィールド
| フィールド | 型 | 常に存在する | メモ |
|---|---|---|---|
freshness |
オブジェクト、またはnull |
はい | 照会の集計期間中の最新状況。最新状況がない場合値はnullです。その場合rowsは空です。 |
freshness.aggregationPeriod |
文字列 | freshnessがnullでない場合は、はい |
DAILYまたはHOURLYを指定できます。 |
freshness.latestDataTimestamp |
文字列 | freshnessがnullでない場合は、はい |
直近に処理された日(DAILY)または時間(HOURLY)のUTC開始時刻YYYY-MM-DDThh:mm:ssZ形式 |
resultCount |
整数 | はい | このページの行数 |
rows[] |
オブジェクトの配列 | はい | このページの行。照会に一致するデータがない場合、配列は空です。 |
nextPageToken |
文字列、または null |
はい | ページ分割を参照してください。 |
availability |
オブジェクト | readyToUseMetricSetのみ |
照会ですぐに使用できるデータの状態。詳しくはすぐに使えるavailabilityを参照してください。 |
各行には次のフィールドがあります:
| フィールド | 型 | 常に存在する | メモ |
|---|---|---|---|
startTime |
文字列 | はい | 期間の開始時刻形式はYYYY-MM-DDThh:mm:ssZです。 |
aggregationPeriod |
文字列 | はい | DAILYまたはHOURLYを指定できます。 |
dimensions[] |
オブジェクトの配列、または null |
はい | 要求された各ディメンションについて、リクエスト内の dimensionsの順序で、フィールドnameと valueを持つオブジェクトが1つあります。リクエストにディメンションがない場合、フィールドは nullです。 |
metrics[] |
オブジェクトの配列 | はい | リクエストされた指標ごとに1つの指標オブジェクト。形状については、指標オブジェクトを参照してください。 |
指標オブジェクト
指標オブジェクトには次の2つの形状があります:
- レートまたはカウント指標:
{"name": "crashRate", "value": 0.0142} - 期間指標:
{"name": "coldStartAppLaunchTime", "statistics": {"Average": 1234.5678, "P90": 1500.0000, "P95": 1800.0000}}.appLatencyMetricSetとreadyToUseMetricSetの4つの期間メトリクスは、この形式を使用します。statisticsオブジェクトは常に存在します。各統計値はnullになる場合があります。
レートは分数 (0.0142は 1.42%)、カウントは整数、所要時間はミリ秒単位です。メトリクス値または統計値がnullの場合、APIはその値を計算できません。メトリクスの意味については、Metric valuesを参照してください。
nameフィールドを使用します。metrics内でのメトリクスの位置を使用しないでください。その他の指標ルール
特定の指標には以下のルールが適用されます。
- アプリの起動時間がコールドスタートの場合は5秒以上、ウォームスタートの場合は2秒以上の場合、起動が遅くなります。
HOURLYの7日間レートでは、APIは7日間それぞれの同じ UTC 時間の値を合算します。
指標の照会レスポンスの例
この例では、アプリには8月17日と8月18日のデータのみが含まれます。
{
"freshness": {
"aggregationPeriod": "DAILY",
"latestDataTimestamp": "2026-08-18T00:00:00Z"
},
"resultCount": 2,
"rows": [
{
"startTime": "2026-08-17T00:00:00Z",
"aggregationPeriod": "DAILY",
"dimensions": [
{"name": "versionCode", "value": "151"}
],
"metrics": [
{"name": "crashRate", "value": 0.0142},
{"name": "crashCount", "value": 912},
{"name": "distinctDevices", "value": 54320}
]
},
{
"startTime": "2026-08-18T00:00:00Z",
"aggregationPeriod": "DAILY",
"dimensions": [
{"name": "versionCode", "value": "151"}
],
"metrics": [
{"name": "crashRate", "value": 0.0138},
{"name": "crashCount", "value": 887},
{"name": "distinctDevices", "value": 55012}
]
}
],
"nextPageToken": null
}
期間指標の例
次の例は、ディメンションなしのappLatencyMetricSet1行を示しています。
{
"startTime": "2026-08-18T00:00:00Z",
"aggregationPeriod": "DAILY",
"dimensions": null,
"metrics": [
{
"name": "coldStartAppLaunchTime",
"statistics": {"Average": 1234.5678, "P90": 1500.0000, "P95": 1800.0000}
},
{
"name": "warmStartAppLaunchTime",
"statistics": {"Average": 412.2500, "P90": 620.0000, "P95": 710.5000}
}
]
}
すぐに使えるavailability
readyToUseMetricSetの各レスポンスには availabilityオブジェクトがあります。他の指標セットの応答にはこのオブジェクトはありません。
| フィールド | 型 | 常に存在する | メモ |
|---|---|---|---|
availability.state |
文字列 | はい | AVAILABLEまたはACTION_REQUIRED |
availability.reasonCode |
文字列 | ACTION_REQUIREDの場合のみ |
READY_TO_USE_DATA_UNAVAILABLE |
availability.message |
文字列 | ACTION_REQUIREDの場合のみ |
何をすべきかを伝えるメッセージ |
availability.documentationUrl |
文字列 | ACTION_REQUIREDの場合のみ |
すぐに使えるデータの説明へのリンク |
リクエストされたすぐに使用できるメトリクスのうち、1つ以上に照会の時間範囲内のデータがある場合、状態は AVAILABLEになります。それ以外の場合、状態はACTION_REQUIREDになります。API は、現在のページだけでなく、照会のすべてのページをチェックします。ACTION_REQUIREDの考えられる原因は次のとおりです:
- アプリは、使用できる状態になったことを報告しません。Fire OS では、アプリは
Activity.reportFullyDrawn()を呼び出す必要があります。Vega OS では、アプリはuseReportFullyDrawn()からコールバックを呼び出す必要があります。手順については使用可能な指標セットを参照してください。 - Amazonでは、アプリですぐに使えるデータをまだ用意していません。
- 照会の集計期間に対応する最新状況値はありません。
ACTION_REQUIREDを使用すると、レスポンスに行を含めることができます。これらの行では、統計値はnullです。
次の例は、行を含まないACTION_REQUIREDレスポンスを示しています。
{
"freshness": {
"aggregationPeriod": "DAILY",
"latestDataTimestamp": "2026-08-18T00:00:00Z"
},
"resultCount": 0,
"rows": [],
"nextPageToken": null,
"availability": {
"state": "ACTION_REQUIRED",
"reasonCode": "READY_TO_USE_DATA_UNAVAILABLE",
"message": 「このアプリでは、すぐに使用できるデータはありません。これは、アプリがReady to Use用に計測設定されていないか、データがまだ生成されていないことを意味している可能性があります。以下のドキュメントを参照してインストルメンテーションの設定を確認するか、Amazon の担当者に問い合わせてください。」,
"documentationUrl": "https://developer.amazon.com/apps-and-games/blogs/2023/06/improve-app-startup-times"
}
}
問題の照会
問題の照会操作は、全時間範囲における上位のクラッシュ問題、または上位のANR問題を返します。レスポンスには、問題ごとに1行が含まれます。ディメンションをリクエストした場合、レスポンスには、問題とディメンション値の組み合わせごとに1行が含まれます。
問題の照会のリクエストパラメーター
| パラメーター | 説明 | 型 | 必須 |
|---|---|---|---|
timelineSpec |
集計期間と時間範囲。ルールについては時間値を参照してください。 | オブジェクト | はい |
reportType |
CRASHまたはANR |
文字列 | はい |
dimensions[] |
ブレークダウンのディメンション。ディメンションはcrashMetricSetと同じです。 |
文字列の配列 | いいえ |
filter |
含めるディメンション値。ルールについては、ディメンションとフィルターを参照してください。 | オブジェクト | いいえ |
pageSize |
1ページの最大行数。デフォルト値は25です。値が0 の場合はデフォルトが使用されます。値が1,000を超えると、1,000 が使用されます。 |
整数 | いいえ |
pageToken |
前のレスポンスから取得したnextPageTokenの値。最初のリクエストにはpageTokenを含めないでください。 |
文字列 | いいえ |
問題の照会リクエストにはmetricsフィールドがありません。APIは、各問題についてerrorEventCountと affectedDeviceCountを返します。
問題の照会リクエストの例
{
"timelineSpec": {
"aggregationPeriod": "DAILY",
"startTime": "2026-08-05T00:00:00Z",
"endTime": "2026-08-18T00:00:00Z"
},
"reportType": "CRASH",
"filter": {"versionCode": ["152"]},
"pageSize": 25
}
問題の照会レスポンスフィールド
| フィールド | 型 | 常に存在する | メモ |
|---|---|---|---|
rows[] |
オブジェクトの配列 | はい | このページの問題。に一致する問題がない場合、配列は空です。 |
rows[].crashDescriptor |
文字列 | はい | 問題の識別子です |
rows[].reportText |
文字列、または null |
はい | 問題のスタックトレースの一例。例は応答ごとに異なる場合があります。APIは長いスタックトレースを短くすることができます。値はnullか、スタックトレースが使用できない場合は空の文字列です。 |
rows[].dimensions[] |
オブジェクトの配列、または null |
はい | 要求された各ディメンションについて、フィールド nameとvalueを持つオブジェクトが 1 つあります。リクエストにディメンションがない場合、フィールドは nullです。 |
rows[].metrics[] |
オブジェクトの配列 | はい | errorEventCountとaffectedDeviceCountの2つの指標オブジェクト。各オブジェクトにはnameと整数のvalueがあります。その意味については、使用可能な指標セットを参照してください。 |
nextPageToken |
文字列、または null |
はい | 次のページのトークン。最後のページでは、値はnullです。 |
レスポンスにはresultCountもfreshnessもありません。問題はerrorEventCountの降順で並べられます。
問題の照会のレスポンス例
{
"rows": [
{
"crashDescriptor": "67f35eb2c1a94d0e",
"reportText": "java.lang.IllegalStateException: Player is not ready\n\tat com.example.myapp.Player.start(Player.java:88)",
"dimensions": null,
"metrics": [
{"name": "errorEventCount", "value": 78},
{"name": "affectedDeviceCount", "value": 45}
]
}
],
"nextPageToken": null
}
実装例
以下の例は、Vitals API V2のPythonコードを示しています。1回のPythonセッションで例を順番に実行します。各例では、その前の例の関数と変数を使用しています。
アクセストークンを取得する
アクセストークンを取得するには、次のフォームフィールドを使用してPOSTリクエストをhttps://api.amazon.com/auth/o2/tokenに送信します。
grant_type:client_credentialsclient_id: あなたのクライアント IDclient_secret: あなたのクライアントシークレットscope:adx_reporting::appstore:marketer
レスポンスにはaccess_tokenとexpires_inが含まれています。expires_inの値は、トークンの有効期限が切れるまでの秒数です。
次の例では、トークンを保持しています。トークンの有効期限が切れる5分前に新しいトークンを取得します。
import time
import requests
# 指定しなければならない値
client_id = "<クライアントID>"
client_secret = "<クライアントシークレット>"
package_name = "<アプリパッケージ名>"
BASE_URL = "https://developer.amazon.com/api/appstore"
VITALS_URL = f"{BASE_URL}/v2/applications/{package_name}/vitals"
_token = {"value": None, "expires_at": 0.0}
def auth_headers():
"""Return the request headers with a valid LWA access token."""
if time.time() > _token["expires_at"] - 300:
response = requests.post(
"https://api.amazon.com/auth/o2/token",
data={
"grant_type": "client_credentials",
"client_id": client_id,
"client_secret": client_secret,
"scope": "adx_reporting::appstore:marketer",
},
timeout=30,
)
response.raise_for_status()
token = response.json()
_token["value"] = token["access_token"]
_token["expires_at"] = time.time() + token["expires_in"]
return {
"Authorization": f"Bearer {_token['value']}",
"Content-Type": "application/json",
"Accept": "application/json",
}
リトライ付きのリクエストを送信
次のヘルパーは、429と一時的なエラーを再試行します。最初の401ではトークンを更新し、試行が残っている場合は再試行します。リトライルールについてはリトライストラテジーを参照してください。
import random
import time
import requests
# 「アクセストークンを取得」からauth_headers()と_tokenを使用します。
MAX_ATTEMPTS = 4
RETRYABLE_STATUS_CODES = {429, 500, 503, 504}
def send(method, url, body=None):
"""Send a request.Retry a throttled request or a temporary error."""
token_renewed = False
for attempt in range(1, MAX_ATTEMPTS + 1):
headers = auth_headers()
try:
response = requests.request(
method, url, headers=headers, json=body, timeout=60
)
except (requests.ConnectionError, requests.Timeout):
if attempt == MAX_ATTEMPTS:
raise
time.sleep(2 ** attempt + random.uniform(0, 1))
continue
renew = response.status_code == 401 and not token_renewed
if renew and attempt < MAX_ATTEMPTS:
token_renewed = True
_token["expires_at"] = 0.0 # 次回の試行に備えて、新しいトークンを取得してください。
continue
if response.status_code not in RETRYABLE_STATUS_CODES:
response.raise_for_status()
return response.json()
if attempt == MAX_ATTEMPTS:
response.raise_for_status()
retry_after = response.headers.get("Retry-After")
if retry_after is not None:
delay = float(retry_after)
else:
delay = 2 ** attempt + random.uniform(0, 1)
time.sleep(delay)
時間範囲を選択してください
次のヘルパーは、指標セットの最新データ時刻で終了する時間範囲を作成します。時間値の制限内で範囲を選択します。
from datetime import datetime, timedelta
TIME_FORMAT = "%Y-%m-%dT%H:%M:%SZ"
def time_range(metric_set_name, aggregation_period, periods):
"""Return (startTime, endTime) for the latest time periods of a metric set."""
info = send("GET", f"{VITALS_URL}/{metric_set_name}")
latest = {item["aggregationPeriod"]: item["latestDataTimestamp"] for item in info["freshnessInfo"]}
end = datetime.strptime(latest[aggregation_period], TIME_FORMAT)
step = timedelta(days=1) if aggregation_period == "DAILY" else timedelta(hours=1)
start = end - step * (periods - 1)
return start.strftime(TIME_FORMAT), end.strftime(TIME_FORMAT)
クラッシュ指標を照会
次の例では、各アプリバージョンの毎日のクラッシュ率、クラッシュ数、およびデバイス数を取得します。フィルターには、米国およびカナダにあるFire TVデバイスのみが含まれます。
start_time, end_time = time_range("crashMetricSet", "DAILY", 7)
crash_body = {
"timelineSpec": {"aggregationPeriod": "DAILY", "startTime": start_time, "endTime": end_time},
"metrics": ["crashRate", "crashCount", "distinctDevices"],
"dimensions": ["versionCode"],
"filter": {"countryCode": ["US", "CA"], "deviceType": ["FIRE_TV"]},
}
result = send("POST", f"{VITALS_URL}/crashMetricSet:query", crash_body)
for row in result["rows"]:
values = {metric["name"]: metric["value"] for metric in row["metrics"]}
print(row["startTime"], row["dimensions"], values)
アプリ起動時間を照会
期間メトリクスにはstatisticsがありvalueはありません。次の例では、各デバイスタイプのコールドスタートとウォームスタートのアプリ起動時間を取得します。
start_time, end_time = time_range("appLatencyMetricSet", "DAILY", 7)
result = send("POST", f"{VITALS_URL}/appLatencyMetricSet:query", {
"timelineSpec": {"aggregationPeriod": "DAILY", "startTime": start_time, "endTime": end_time},
"metrics": ["coldStartAppLaunchTime", "warmStartAppLaunchTime"],
"dimensions": ["deviceType"],
})
スロースタートレートを照会
slowStartRateMetricSetでは、startTypeに dimensionsが必要です。次の例では、コールドスタートのみを対象に、直近 24 時間の 1 時間ごとのスロースタート率を取得します。
start_time, end_time = time_range("slowStartRateMetricSet", "HOURLY", 24)
slow_start_body = {
"timelineSpec": {"aggregationPeriod": "HOURLY", "startTime": start_time, "endTime": end_time},
"metrics": ["slowStartRate", "slowStartRate7dDeviceWeighted", "distinctDevices"],
"dimensions": ["startType"],
"filter": {"startType": ["COLD"]},
}
result = send("POST", f"{VITALS_URL}/slowStartRateMetricSet:query", slow_start_body)
for row in result["rows"]:
values = {metric["name"]: metric["value"] for metric in row["metrics"]}
print(row["startTime"], values["slowStartRate"], values["distinctDevices"])
すぐに使用できる時間を照会
次の例では、すぐに使用できる時間を取得し、availabilityオブジェクトを確認します。
from datetime import timezone
try:
start_time, end_time = time_range("readyToUseMetricSet", "DAILY", 7)
except KeyError:
# まだ更新されていません。最新の UTC 日付を照会して可用性の状態を取得してください。
end = datetime.now(timezone.utc)
start_time = (end - timedelta(days=6)).strftime(TIME_FORMAT)
end_time = end.strftime(TIME_FORMAT)
ready_to_use_body = {
"timelineSpec": {"aggregationPeriod": "DAILY", "startTime": start_time, "endTime": end_time},
"metrics": ["coldStartReadyToUseTime", "warmStartReadyToUseTime"],
}
result = send("POST", f"{VITALS_URL}/readyToUseMetricSet:query", ready_to_use_body)
availability = result["availability"]
if availability["state"] == "ACTION_REQUIRED":
print(availability["message"])
print(availability["documentationUrl"])
for row in result["rows"]:
for metric in row["metrics"]:
print(row["startTime"], metric["name"], metric["statistics"]["Average"])
結果のページ分割
次の関数は照会の全ページを取得します。レート制限を下回るまで、2 ページあたり 0.4 秒待機します。最後のページの行とfreshnessオブジェクトを返します。問題の照会 の場合、2 番目の値はNoneです。これは、レスポンスにfreshnessがないためです。
def query_all_rows(url, body):
"""Send a query.Return the rows of all pages and the freshness of the last page."""
rows = []
page_body = dict(body)
page_body.pop("pageToken", None)
while True:
result = send("POST", url, page_body)
rows.extend(result["rows"])
if result["nextPageToken"] is None:
return rows, result.get("freshness")
page_body["pageToken"] = result["nextPageToken"]
time.sleep(0.4)
上位のクラッシュ問題の照会
次の例では、過去 14 日間に発生したバージョンコード152のクラッシュ問題のトップページを取得しています。フィルターはバージョンを選択します。
start_time, end_time = time_range("crashMetricSet", "DAILY", 14)
issues_body = {
"timelineSpec": {"aggregationPeriod": "DAILY", "startTime": start_time, "endTime": end_time},
"reportType": "CRASH",
"filter": {"versionCode": ["152"]},
"pageSize": 25,
}
result = send("POST", f"{VITALS_URL}/issuesMetricSet:query", issues_body)
for issue in result["rows"]:
counts = {metric["name"]: metric["value"] for metric in issue["metrics"]}
print(issue["crashDescriptor"], counts["errorEventCount"], counts["affectedDeviceCount"])
print(issue["reportText"])
エラー処理
エラーの処理方法については、次のセクションを参照してください。
エラーレスポンス形式
APIは、エラーレスポンスごとにJSON本文を送信します。HTTPステータスコードは応答のステータス行にあります。本文にはステータスコードやリクエスト IDは含まれていません。
| フィールド | 型 | 常に存在する | メモ |
|---|---|---|---|
code |
文字列 | はい | エラーコード例:VALIDATION_ERROR |
message |
文字列 | はい | エラーの説明 |
errors[] |
オブジェクトの配列 | 400 VALIDATION_ERRORの場合のみ |
問題ごとに1つのエントリがあります |
errors[].field |
文字列 | はい | フィールドのパス。たとえばtimelineSpec.endTime、metrics[1]、または filter.countryCode[0] |
errors[].code |
文字列 | はい | フィールドエラーコード。値についてはフィールドエラーコードを参照してください。 |
errors[].message |
文字列 | はい | 問題の説明 |
各成功レスポンスと各エラーレスポンスにはx-amzn-RequestIdヘッダーがあります。この値を記録します。リクエストについてAmazon開発者サポートに問い合わせる場合は、この値を含めてください。
単一エラーの例
次のレスポンスは、HOURLYの照会のうち、crashRate28dUserWeightedをリクエストするものです。
{
"code": "VALIDATION_ERROR",
"message": "Metric 'crashRate28dUserWeighted' is not available for HOURLY aggregation",
"errors": [
{
"field": "metrics[0]",
"code": "VALUE_NOT_ALLOWED",
"message": "Metric 'crashRate28dUserWeighted' is not available for HOURLY aggregation"
}
]
}
マルチフィールド検証の例
次の応答は、"startTime": を含む照会に対するものです。 "2026-08-18" and "pageSize": -5.
{
"code": "VALIDATION_ERROR",
"message": "The request contains 2 invalid fields.",
"errors": [
{
"field": "timelineSpec.startTime",
"code": "FIELD_INVALID",
"message": "timelineSpec.startTime must be a valid canonical UTC timestamp in YYYY-MM-DDThh:mm:ssZ format"
},
{
"field": "pageSize",
"code": "FIELD_OUT_OF_RANGE",
"message": "pageSize must be non-negative, got: -5"
}
]
}
エラーコード
| HTTPステータス | コード | 原因 | 対処法 |
|---|---|---|---|
| 400 | VALIDATION_ERROR |
リクエストに問題があります。たとえば、不明な指標や不明な metricSetName、またはapplication/jsonではないContent-Typeヘッダーなどです。 |
レスポンスにerrors[]がある場合は、それを使用して問題を特定してください。リクエストを修正し、修正したリクエストを送信します。 |
| 401 | AUTHENTICATION_FAILED |
アクセストークンが見つからない、有効期限が切れているか、無効であるか、セキュリティプロファイルがReporting APIに添付されていません。 | 新しいアクセストークンを取得してください。セキュリティプロファイルがReporting APIに添付されていることを確認してください。 |
| 403 | ACCESS_DENIED |
開発者アカウントがアプリを所有していないか、Vitals API V2を開発者アカウントで利用できません。 | 開発者アカウントがアプリを所有していることを確認してください。開発者アカウントがアプリを所有している場合は、1分待ってからリクエストをもう一度送信してください。エラーが再度表示される場合は、Amazon開発者サポートに連絡してください。x-amzn-RequestIdの値を含めてください。 |
| 404 | RESOURCE_NOT_FOUND |
このパッケージ名を持つアプリがないか、パスが正しくないか、パスの HTTPメソッドが正しくありません。 | パッケージ名とパスが正しいことを確認してください。最新状況の確認には GET を使用してください。指標の照会と問題の照会にはPOSTを使用し、パスの末尾に:queryを付けます。 |
| 429 | RATE_LIMIT_EXCEEDED |
送信したリクエストの数が、レート制限で許可されている数を超えています。 | Retry-After ヘッダーに表示されている秒数だけ待ちます。その後、リクエストをもう一度送信してください。 |
| 500 | INTERNAL_ERROR |
サービスで予期しないエラーが発生したか、照会中にサービスの依存関係が失敗しました。 | エクスポネンシャルバックオフを使用してリクエストを最大3回再送信します。応答に Retry-After ヘッダーがある場合は、その秒数待ってください。待機時間についてはリトライストラテジーを参照してください。 |
| 503 | SERVICE_UNAVAILABLE |
サービスの依存関係が一時的に利用できないか、ゲートウェイがサービスにアクセスできない。 | エクスポネンシャルバックオフを使用してリクエストを最大3回再送信します。応答に Retry-After ヘッダーがある場合は、その秒数待ってください。待機時間についてはリトライストラテジーを参照してください。 |
| 504 | GATEWAY_TIMEOUT |
ゲートウェイは、サービスからの応答を時間内に受け取りませんでした。 | エクスポネンシャルバックオフを使用してリクエストを最大3回再送信します。応答に Retry-After ヘッダーがある場合は、その秒数待ってください。待機時間についてはリトライストラテジーを参照してください。 |
フィールドエラーコード
| フィールドエラーコード | 意味 |
|---|---|
FIELD_REQUIRED |
リクエストに必須フィールドがないか、配列に空の要素があります。 |
FIELD_INVALID |
値の形式またはタイプが間違っているか、フィールドがサポートされていないフィールドです。 |
FIELD_TOO_LONG |
versionCodeの値が32文字を超えています。 |
FIELD_OUT_OF_RANGE |
値が許容範囲を超えています。たとえば、時間範囲が長すぎるかpageSizeが負の値である場合です。 |
FIELD_NOT_UNIQUE |
値またはJSONキーが複数回出現します。 |
FIELD_IMMUTABLE |
pageTokenは無効です。前のレスポンスのnextPageTokenを使用するか、pageTokenを省略して新しい照会を開始してください。 |
VALUE_NOT_ALLOWED |
値が許容値のセットに含まれていません。たとえば、指標やディメンションが不明な場合などです。フィルターのfilterにおけるnull値、または metricsやdimensions内のnull要素も、このコードの原因となります。 |
よくある誤りと修正
| 誤り | 結果 | 修正 |
|---|---|---|
| V1の時間オブジェクトを使用する | 400 VALIDATION_ERROR |
UTCタイムスタンプ文字列。例:2026-08-18T00:00:00Zを使用してください。 |
AMAZON_FIRE_TVなどのV1デバイスタイプを使用する |
400 VALIDATION_ERROR |
FIRE_TV、FIRE_TABLET、または OTHERを使用してください。 |
28dメトリクスをHOURLYでリクエストする |
400 VALIDATION_ERROR |
DAILY使用 |
slowStartRateMetricSetの照会でstartType を省略する |
400 VALIDATION_ERROR |
startTypeをdimensionsに追加します。 |
期間指標からvalueを読み取る |
valueフィールドなし |
statistics.Average、statistics.P90、または statistics.P95を読み取ってください。 |
レート制限、再試行、ベストプラクティス
ガイドラインとして、APIは開発者アカウントごとに1秒あたり約3件のリクエストを許可し、短時間であれば最大10件のリクエストを送信できます。すべてのVitals API V2オペレーションは、すべてのアプリでこの制限を共有します。制限は変更される可能性があり、制限に達する前にAPIが429レスポンスを送信することがあります。Vitals API V1には別の制限があります。
制限を超えると、APIは429 RATE_LIMIT_EXCEEDEDレスポンスをRetry-Afterヘッダーとともに送信します。ヘッダーに指定された秒数だけ待ってから、リクエストを再送信してください。
リトライ戦略
send関数は、429、500、503、504、接続エラー、またはタイムアウトの後に、最大3回リクエストを再送信します。応答に Retry-After ヘッダーがある場合、関数はその秒数だけ待機します。それ以外の場合、関数は約2秒、4秒、8秒と待機し、さらに最大1秒のランダムなジッターを加えます。最初の401の後、関数は新しいアクセストークンを取得し、再試行回数が残っている場合はリクエストを再送信します。この関数は、その他の4xxエラーや、失敗したトークンリクエストについては再試行しません。
本番環境でのベストプラクティス
| ベストプラクティス | 推奨される方法 |
|---|---|
| 最近の期間を再照会する | 最近の期間を再照会し、保存されている値を置き換えます。後期データによって変更されることがあります。 |
| エラーコードを使用する | エラーメッセージを解析する代わりに、code、errors[].code、errors[].field を使用してください。 |
| 未知の値を無視する | 不明なレスポンスフィールド、メトリクス、ディメンション値は無視してください。Amazon はベータ期間中にこれらを追加することがあります。 |
V1からの移行
Vitals API のバージョン 1 (V1) は引き続き動作します。次の表は、バージョン 2 (V2) に移行するために行う必要がある変更を示しています。
| アイテム | V1 | V2 |
|---|---|---|
| エンドポイントパス | /vitals/apps/{packageName}/{metricSetName} |
/v2/applications/{packageName}/vitals/{metricSetName} |
| リクエストの時間値 | オブジェクト。たとえば{"year": 2026, "month": 8, "day": 18, "hours": 14} |
文字列、たとえば "2026-08-18T14:00:00Z" |
| 問題の照会 の時間範囲 | リクエスト本文のトップレベルにあるstartTimeと endTime |
timelineSpecこれにはaggregationPeriod、startTime、およびendTimeが含まれます。 |
行内のstartTime |
オブジェクト | 文字列形式YYYY-MM-DDThh:mm:ssZ |
| 最新状況時間値 | たとえば、2026-08-18と2026-08-18T14 |
たとえば、2026-08-18T00:00:00Zと2026-08-18T14:00:00Z |
| 指標値 | 文字列例"0.0142" |
数値例0.0142 |
| 所要時間の指標(アプリの起動時間とすぐに使用可能になるまでの時間) | value1 |
statisticsAverage、P90、および P95 |
指標の照会 レスポンスのstatusと requestId |
プレゼント | 削除済みリクエスト ID はx-amzn-RequestIdヘッダーにあります。 |
deviceType の値 |
AMAZON_FIRE_TVまたは AMAZON_TABLETSまたは AMAZON_FIRE_PHONEまたはAUCCまたはCORO |
FIRE_TVまたはFIRE_TABLETまたは OTHER |
| オペレーティングシステムのディメンション | deviceOS |
deviceOs |
| 開発者アカウントが所有していないアプリ | 404 NOT_FOUND |
403 ACCESS_DENIED |
| エラー本文 | code、message、status |
code、message、および検証エラーの場合は errors[] |
関連トピック
- Vitals API V2の概要: 使用可能な指標とディメンション
- アプリ健全性インサイトダッシュボード: 同じ指標の視覚的なダッシュボード
- Reporting API Explorer: 開発者ポータルのインタラクティブなAPI Explorer
- APIの確認: 開発者コンソールのReporting API Explorerへのリンク
Last updated: 2026年10月13日

