Session Replay API
認証とリクエストの要件
- すべてのエンドポイントでHTTP Basic認証を使用しています。プロジェクトのAPIキーをユーザー名として使用し、シークレットキーをパスワードとして使用してください。
project_idパラメータは必要ありません。認証済みのAPIキーによってプロジェクトを識別します。- 事前署名済みファイルのURLは15分後に期限切れになります。
- ページネーションカーソルは不透明な文字列です。構築したり変更したりしないでください。前のレスポンスで返された
next_page_tokenをそのまま渡してください。 sort_orderパラメータは、ページネーションリクエストのすべてのページで一貫して同じである必要があります。ascリクエストからのpage_tokenをsort_order=descとともに渡すと、400エラーが返されます。amplitude_idとreplay_idは相互に排他的です。両方を渡すと、400エラーが返されます。replay_idとpage_tokenは相互に排他的です。両方を渡すと、400エラーが返されます。- 各
replay_idの値にはdevice_id/session_id形式を使用する必要があります。先頭または末尾にスラッシュを付けると、400エラーが返されます。 - リクエストごとに最大100個の
replay_id値を渡すことができます。101個を超えて渡すと、400エラーが返されます。 amplitude_idは有効な整数でなければなりません。数値以外の値の場合、400エラーが返されます。replay_idを使用する場合、APIはpage_sizeを無視し、next_page_tokenに対して常にnullを返します。
EU域内のデータレジデンシー
EU域内のデータレジデンシーの場合は、https://amplitude.comではなくhttps://analytics.eu.amplitude.comをベースURLとして使用してください。例えば:
- セッションのリプレイをリストアップする:
GET https://analytics.eu.amplitude.com/api/1/session-replays - セッションリプレイファイルを取得する:
GET https://analytics.eu.amplitude.com/api/1/session-replays/files
セッションのリプレイをリストアップする
認証済みプロジェクトのセッションリプレイの、ページネーションされたリストを返します。
GET https://amplitude.com/api/1/session-replays
curl --location 'https://amplitude.com/api/1/session-replays' \
-u '{api_key}:{secret_key}'
クエリパラメータ
| 名前 | 概要 |
|---|---|
start_time | オプションです。ISO 8601文字列です。リプレイstart_timeの下限値(この値を含む)。たとえば、2024-01-01T00:00:00Zのようになります。 |
end_time | オプションです。ISO 8601文字列です。リプレイ時の上限値start_time(これを含みます)。たとえば、2024-01-31T23:59:59Zのようになります。 |
amplitude_id | オプションです。整数です。 特定のAmplitudeユーザーIDに属するリプレイに、結果を絞り込みます。replay_idとは相互に排他的です。 |
replay_id | オプションです。文字列です。 IDで特定のリプレイに結果を絞り込みします(device_id/session_id形式)。/セパレータを%2FとしてURLエンコードします。このパラメータを繰り返すと、最大100回のリプレイをリクエストできます。amplitude_idとpage_tokenは相互に排他的です。このパラメータを使用する場合、page_sizeは無視され、next_page_tokenは常にnullになります。 |
page_size | オプションです。整数です。 ページあたりの結果数。 デフォルトは50、最大値は200です。replay_idが指定されている場合は無視されます。 |
page_token | オプションです。文字列です。 前のレスポンスのnext_page_tokenからの不透明なページネーションカーソルです。 replay_idとは相互に排他的です。 |
sort_order | オプションです。文字列。ascは最も古いリプレイを最初に返します(デフォルト)。descは最も新しいリプレイを最初に返します。page_tokenを使用する際には、ページ全体で一貫性を保つ必要があります。 |
レスポンス
json
{
"session_replays": [
{
"replay_id": "string",
"session_id": "string",
"device_id": "string",
"amplitude_id": 123456,
"start_time": "2024-01-01T00:00:00Z",
"end_time": "2024-01-01T00:05:00Z",
"retention_in_days": 90
}
],
"next_page_token": "string | null"
}
| プロパティ | 概要 |
|---|---|
session_replays | セッションリプレイオブジェクトの配列。 |
session_replays[].replay_id | リプレイの一意の識別子(device_id/session_id形式)。ファイルを取得するときは、これをreplay_idパラメータとして使用します。 |
session_replays[].session_id | セッション識別子。 |
session_replays[].device_id | デバイス識別子。 |
session_replays[].amplitude_id | AmplitudeのユーザーID。 |
session_replays[].start_time | セッションが開始されたときのISO 8601タイムスタンプ。 |
session_replays[].end_time | セッションが終了したときのISO 8601タイムスタンプ。 |
session_replays[].retention_in_days | Amplitudeがリプレイデータを保持する日数です。 |
next_page_token | 次のページを取得するためにpage_tokenとして渡す不透明なカーソルです。結果がこれ以上ない場合はnullになります。 |
セッションリプレイファイルを取得する
特定のリプレイに属するイベントファイルの、事前署名付きS3 URLのページネーションされたリストを返します。各URLはrrwebイベントのgzip圧縮されたJSON配列を指しています。Amplitudeは開始時間をエンコードするキーで、ファイルを並び替えます。
GET https://amplitude.com/api/1/session-replays/files
curl --location 'https://amplitude.com/api/1/session-replays/files?replay_id={device_id}%2F{session_id}' \
-u '{api_key}:{secret_key}'
クエリパラメータ
| 名前 | 概要 |
|---|---|
replay_id | 必須です。 文字列です。 リプレイ識別子(device_id/session_id形式)。/セパレータを%2FとしてURLエンコードします。 |
version | オプションです。整数です。 録画形式のバージョン。2または3。デフォルトは3です。 |
page_size | オプションです。整数です。 ページあたりのファイル数。 デフォルトは100、最大値は1000です。 |
page_token | オプションです。文字列です。 前のレスポンスのnext_page_tokenからの不透明なページネーションカーソル。 |
レスポンス
json
{
"files": [
"https://s3.amazonaws.com/...presigned-url-1...",
"https://s3.amazonaws.com/...presigned-url-2..."
],
"next_page_token": "string | null"
}
| プロパティ | 概要 |
|---|---|
files | 事前署名付きS3 URLの配列。各URLはrrwebイベントのgzip圧縮されたJSON配列を提供します。URLは15分後に期限切れになります。 |
next_page_token | 次のページを取得するためにpage_tokenとして渡す不透明なカーソルです。ファイルがこれ以上ない場合はnullになります。 |
リプレイファイルを解凍して解析する
各ファイルの形式は、リクエストしたversionによって異なります。
バージョン 3
各ファイルはgzip圧縮を使用します。ファイルを解凍して、rrwebプレーヤーに渡す準備が整ったrrwebイベントのJSON配列を取得します。
async function fetchReplayEvents(fileUrl) {
const response = await fetch(fileUrl);
// The response is gzip-compressed; fetch decompresses automatically in browsers.
// In Node.js 18+, use the DecompressionStream API or the zlib module.
const buffer = await response.arrayBuffer();
const text = new TextDecoder().decode(buffer);
return JSON.parse(text); // array of rrweb events
}
結果はrrwebイベントのJSON配列です:
json
[
{ "type": 4, "data": { "href": "https://example.com", "width": 1440, "height": 900 }, "timestamp": 1700000000000 },
{ "type": 2, "data": { ... }, "timestamp": 1700000000050 },
...
]
バージョン 2
バージョン2ファイルの解凍には、次の2つのステップを実行する必要があります。
- gzipファイルを解凍し、JSONパースを行うと、パックされた文字列の配列になります。
- 各文字列をzlibで解凍します。各要素はJSONエンコードされ、zlib圧縮(DEFLATE)されたバイナリペイロードであり、rrwebイベントオブジェクトになります。
const zlib = require("zlib");
async function fetchReplayEventsV2(fileUrl) {
const response = await fetch(fileUrl);
const buffer = Buffer.from(await response.arrayBuffer());
// Step 1: gzip decompress the file, then JSON parse → array of packed strings
const packedStrings = JSON.parse(zlib.gunzipSync(buffer).toString("utf8"));
// Step 2: unpack each string
return packedStrings.map((packed) => {
// Each packed string is itself a JSON string whose value is a latin1-encoded
// binary blob of zlib-compressed event data.
const compressedBinary = JSON.parse(packed);
const buf = Buffer.from(compressedBinary, "latin1");
return JSON.parse(zlib.inflateSync(buf).toString("utf8")); // rrweb event
});
}
イベントをリプレイする
フルセッションをリプレイするには、リプレイ用のすべてのファイルを順番に取得し、各ファイルを解凍し、イベント配列を連結して、その結果をAmplitudeのrrwebプレーヤーに渡します。アップストリーム版のrrwebではなくAmplitudeのforkを使用してください。このforkにはアップストリーム版と互換性がない可能性のある修正が含まれています。
javascript
const events = (await Promise.all(fileUrls.map(fetchReplayEvents))).flat();
rrweb.replay({ events, root: document.getElementById("player") });
ステータスとエラーコード
| コード | 概要 |
|---|---|
200 OK | リクエストに成功しました。 |
400 Bad Request | 無効なパラメータ値です。 詳細については、エラーメッセージを確認してください。 |
401 Unauthorized | API資格情報がありませんか、または無効です。 |
404 Not Found | 指定されたreplay_idのデータが見つかりませんでした。 Amplitudeは最初のページでのみこのエラーを返します。 |
これは役に立ちましたか?