Adobe Analytics で便利な機能｜プライバシー対応編

Web サイトやモバイルアプリのアクセスデータを集計して分析・解析する Adobe Analytics は、SaaS 型のサービスとなっており、その基盤は Adobe が運営するクラウド・データセンターに集約されます。計測されたデータもそのクラウド基盤に溜まりますが、以前の Adobe Analytics では一度計測して格納されたデータは、一般的な操作の範囲では編集や削除はできない構造になっていました。ここ数年で個人情報保護法などの法令の施行やプライバシーに対する関心の高まりもあり、データ削除の機能が追加実装・強化されていますので、その利用方法について紹介したいと思います。

本記事ではいくつかあるデータ削除オプションの中で **Data Repair API** という機能に触れていきます。
Data Repair は API のみを提供する機能なので、取っ付きづらい印象もあるかと思いますが、なるべく簡単に進められるよう手順についてもまとめてみました。

:::note warn
この記事の内容は 2022 年 5 月時点の情報に基づいて執筆しています。UI の変更や API の仕様等は適宜変更されている場合がありますのでご注意ください。Data Repair API の最新情報はこちらです。
https://developer.adobe.com/analytics-apis/docs/2.0/guides/endpoints/data-repair/
:::

# データの削除方法の種類と使い分け
まず、Adobe Analytics で用意されているデータ削除の機能は、カスタマイズプログラムも含めると、全部で 4 種類の機能があります。一言にデータ削除と言っても、それぞれの機能によって対応できる範囲が異なってきます。それぞれの有償・無償や、できること・できないことを簡単に以下の表に並べてみました。
(ここでの企業とは、Adobe Analytics を契約して利用している企業を意図しています)

| 機能 | 機能概要 | コスト | 活用シーン |
|:-|:-|:-|:-|
| データ保持期間 | 保持期限を過ぎたデータを自動的に削除<br>(標準は 25 か月まで保持) | 無償 | 企業のプライバシーポリシー等、データ保持期間を明示する場合 |
| Privacy Service | 訪問者のデータ削除要求に応じて、訪問者の該当する変数データを削除 | 無償 | GDPR 等に定義されるように、訪問者が企業にデータ削除を要請した場合 |
| Data Repair API | 企業側の判断で、特定の期間の特定の変数データを削除 | 有償<br>追加ライセンスが必要 | 意図せず個人情報を計測していることが発覚した場合 |
| エンジニアリングサービス | 企業と要件・設計の確認を行い、企業個別のカスタマイズプログラムを作成してデータを削除 | 有償<br>個別見積もり | 上記 3 つの機能で削除できない場合

## Privacy Service と Data Repair API の違い
4つの機能の中でも、この二つがよく混同されやすいので、違いについて簡単に触れておきます。
2022年3月にオンラインで開催された Adobe Summit 2022 で公開しているセッションで分かりやすい解説があったので以下に引用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1025787/012d1394-ab4f-135c-6f47-d008ef48f22d.png)
> 引用元：[Adobe Summit 2022｜Data Responsibly: Stewardship in Regulated Times - S110](https://business.adobe.com/summit/2022/sessions/data-responsibly-stewardship-in-regulated-times-s110.html)
> セッションは英語になります。

列をデータを計測する変数、行を訪問者単位を示す表イメージとなりますが、Data Repair API は **列 (変数) ベース** でデータを編集・削除します。Privacy Service は **行 (訪問者) ベース** で該当データを削除する仕組みです。データを捉える視点が異なるのが、この二つの機能の違いです。

# Data Repair API を実行する流れ
大まかに、Data Repair API は以下のステップで実行します。
ジョブがどれぐらいで完了するかは、そのデータ量などにも変わってきますが、大概の場合は数時間～数日レベルで完了することがほとんどです。
1. 対象サーバーのコール数を検証
1. Data Repair ジョブを開始 <-- 削除処理を開始
1. (ジョブの完了まで待ち：数時間～数日)
1. Data Repair ジョブの完了後、データを確認

:::note warn
この記事では Data Repair API の利用方法も記載していますが、実際に Data Repair API を試すにはライセンスが適用されている必要があります。ライセンス未適用ですと、Create Data Repair Job 以降の操作が利用できませんのでご注意ください。ライセンスの適用状況については Adobe Analytics の契約元に確認が必要です。
:::

# Data Repair API で出来ること

Data Repair API では、以下のような項目を指定して特定の変数に対してジョブを作成します。
値の削除、あるいは値の書き変えができます。

|指定できる項目| 指定できる内容 |
|:-|:-|
|レポートスイート | データの格納先 |
|期間 | Data Repair API で操作する対象の期間 |
|変数 | Data Repair API で操作する対象の変数 (prop や eVar 等) |
|アクション| 変数に対して実施するアクション<br>(`set`, `delete`, `deleteQueryString`, `deleteQueryStringParameters`) |
|フィルター条件 | 変数の値をフィルターする場合の条件 (省略可) |

上記を組み合わせて、以下のような場合に使います。

- 特定期間の特定変数の値を一括で削除すること
    - 例：2021/11/1 ～ 2021/12/15 までの間の propX 変数、eVarX 変数の値を削除
    - 例：2022/1/15 ～ 2022/2/28 までの間の pageUrl、referrer に計測されている customerid クエリパラメーターだけを削除
- 特定期間の特定変数の値を一括で書き変えること
    - 例：2021/6/1 ～ 2021/9/30 までの間の propX 変数、eVarX 変数のうち、値が abcd を含む場合に「Replaced by Data Repair API」に書き換え

Data Repair API で指定できるアクションには、以下の通り 4 パターンあります。
- `set`: 変数の値を上書きします。
- `delete`: 変数の値をクリアします。
- `deleteQueryString`: 変数の値が URL 形式の場合にクエリパラメーター全体を削除します。
- `deleteQueryStringParamaters`: 変数の値が URL 形式の場合に parameters に指定する特定のクエリパラメーターを削除します。

Data Repair API ではすべての変数に対して 4 パターンのアクションを利用できるのではなく、指定できる変数と、その変数によってサポートするアクションが存在します。その一覧は以下ヘルプを参照してください。

https://developer.adobe.com/analytics-apis/docs/2.0/guides/endpoints/data-repair/json-body/

## Data Repair API で出来ないこと・制限
Data Repair API で実現できないこともありますので予めご注意ください。Data Repair API で実現できない場合は他の機能による対応を検討することになります。
- 特定訪問者のデータを削除することはできません。GDPR 等に定義されるように訪問者からのデータ削除要請に応じてデータ削除を行う場合は、Privacy Service をご利用ください。
- Data Repair API は当月データと 37 カ月以前のデータは削除することができません。Data Repair API で指定できる期間は 36 カ月前～先月までの間となります。
    - 事前に開発レポートスイートでテストする場合も当月データは削除できません。テストデータが先月以前に存在することを確認の上、テストをお試しください。
- 一つのレポートスイートに対して、同時に複数のジョブを実行することはできません。複数の変数を対象とする場合は、一つのジョブに定義して実行することが有効です。
- Cross-Device Analytics 機能を使用しているレポートスイートではサポートされていません。
- マーチャンダイジングが有効になっている、あるいは、過去に有効だった変数はサポートされていません。

## Data Repair API でデータ削除が必要なときに注意したいこと

Data Repair API はあくまで **計測済みのデータを削除・変更する** ことになります。削除が必要なデータがさらに入ってこないように対策した上でデータ削除を検討する必要があることに注意してください。
- Data Repair API で削除・編集されたデータは元に戻すことができません。事前に開発レポートスイートを使うなど、テストを実施した上で本番レポートスイートへの適用をご検討ください。
- 削除しなければいけないデータが新しく計測されていないことを確認してください。
    - Web サイトのデータであれば、計測タグや Adobe Analytics 処理ルールなど、値の取得実装を見直してください。
    - 計測タグを更新した場合でも、訪問者のブラウザのキャッシュなどによって直ぐにデータの計測が止まるわけではありません。しばらく期間を置いて経過を見る場合もあります。
    - Adobe Analytics のモバイル SDK を使って、iOS、Android アプリで該当データを計測していた場合、アプリの実装を変えたとしても、利用者側でアプリのアップグレードが必要な場合があります。アプリのアップグレードが難しい場合は、その変数を無効化することも一案です。
- eVar 変数のデータを削除する場合は eVar 変数の保持期限も注意してください。保持期間が無期限など、長い期間に設定されている場合、過去に計測されたデータが引き継がれて計測されます。
    - eVar 変数のデータ取得を停止した上で、eVar 変数のデータの保持をリセットすることも可能です。リセットは、Adobe Analytics レポートスイートマネージャーから設定できます。以下ヘルプを参照ください。

https://experienceleague.adobe.com/docs/analytics/admin/admin-tools/conversion-variables/conversion-var-admin.html?lang=ja

# Data Repair API 実行のための準備設定
事前の説明が長くなってしまいましたが、実際に Data Repair API を実行するための必要情報の取得について紹介します。

## 権限の設定
Data Repair API を実行するには、API を実行するための Adobe Developer Console プロジェクトを用意して、必要な権限を割り当てる必要があります。Data Repair API には **レポートスイートツール ／ データ修復 API** の権限を設定しておく必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1025787/2043619d-ba72-2167-e147-0eee8e03f1fd.png)
Adobe Developer Console プロジェクトの用意については以下の記事を参考にしてみてください。
認証トークンの交換方式に JWT を選択してプロジェクトを作成します。

https://qiita.com/smzakio/items/ede69ffeb7a90222964a

## Data Repair API を叩くため POSTMAN の設定
API を実行するのに、操作が簡単になるよう API クライアントである POSTMAN を使って操作例を紹介していきます。以下の手順では、POSTMAN を使って API の必要情報を埋めていきますが、他の API クライアントを利用する場合や curl コマンドを実行する場合も必要となる情報に変わりはありません。

:::note info
Postman とは UI ベースで Web API リクエストを投げたり、レスポンスを確認したりを簡単に行える Web API クライアントソフトウェアです。以下より無料でダウンロード・利用できます。(サインインは必要です)
https://www.postman.com/
:::

POSTMAN をインストールして起動した後、まずは POSTMAN で Data Repair API を実行できるように環境設定を整えます。ここでは手順を簡略化するため、以下の二つの json ファイルを POSTMAN にインポートします。

<details><summary>ファイル１：Data Repair API Env.postman_environment.json</summary>

```json:Data Repair API Env.postman_environment.json
{
	"id": "1439dc37-49f6-4f80-ae7d-827e2fc34ce2",
	"name": "Data Repair API Env",
	"values": [
		{
			"key": "CLIENT_ID",
			"value": "",
			"enabled": true
		},
		{
			"key": "GLOBALCOMPANYID",
			"value": "",
			"enabled": true
		},
		{
			"key": "ACCESS_TOKEN",
			"value": "",
			"enabled": true
		},
		{
			"key": "RSID",
			"value": "",
			"enabled": true
		},
		{
			"key": "START_DATE",
			"value": "",
			"enabled": true
		},
		{
			"key": "END_DATE",
			"value": "",
			"enabled": true
		}
	],
	"_postman_variable_scope": "environment",
	"_postman_exported_at": "2022-05-12T15:32:38.709Z",
	"_postman_exported_using": "Postman/8.12.2"
}
```
</details>
<details><summary>ファイル２：Data Repair API Sample.postman_collection.json</summary>

```json:Data Repair API Sample.postman_collection.json
{
	"info": {
		"_postman_id": "84bdecfd-5d43-4891-8085-8af3d26c0b00",
		"name": "Data Repair API Sample",
		"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
	},
	"item": [
		{
			"name": "Server Call estimate",
			"request": {
				"method": "GET",
				"header": [
					{
						"key": "x-api-key",
						"value": "{{CLIENT_ID}}",
						"type": "text"
					},
					{
						"warning": "This is a duplicate header and will be overridden by the Authorization header generated by Postman.",
						"key": "Authorization",
						"value": "Bearer {{ACCESS_TOKEN}}",
						"type": "text"
					}
				],
				"url": {
					"raw": "https://analytics.adobe.io/api/{{GLOBALCOMPANYID}}/datarepair/v1/{{RSID}}/serverCallEstimate?dateRangeStart={{START_DATE}}&dateRangeEnd={{END_DATE}}",
					"protocol": "https",
					"host": [
						"analytics",
						"adobe",
						"io"
					],
					"path": [
						"api",
						"{{GLOBALCOMPANYID}}",
						"datarepair",
						"v1",
						"{{RSID}}",
						"serverCallEstimate"
					],
					"query": [
						{
							"key": "dateRangeStart",
							"value": "{{START_DATE}}"
						},
						{
							"key": "dateRangeEnd",
							"value": "{{END_DATE}}"
						}
					]
				}
			},
			"response": []
		},
		{
			"name": "Create Data Repair Job",
			"request": {
				"method": "POST",
				"header": [
					{
						"key": "x-api-key",
						"value": "{{CLIENT_ID}}",
						"type": "text"
					},
					{
						"warning": "This is a duplicate header and will be overridden by the Authorization header generated by Postman.",
						"key": "Authorization",
						"value": "Bearer {{ACCESS_TOKEN}}",
						"type": "text"
					}
				],
				"body": {
					"mode": "raw",
					"raw": "{\r\n  \"variables\": {\r\n    \"{VARIABLE_1}\": {\r\n      \"action\": \"{ACTION_1}\",\r\n      \"filter\": {\"condition\":  \"{CONDITION_1}\"}\r\n    },\r\n    \"{VARIABLE_2}\": {\r\n      \"action\": \"{ACTION_2}\"\r\n    }\r\n  }\r\n}",
					"options": {
						"raw": {
							"language": "json"
						}
					}
				},
				"url": {
					"raw": "https://analytics.adobe.io/api/{{GLOBALCOMPANYID}}/datarepair/v1/{{RSID}}/job?validationToken={{VALIDATION_TOKEN}}&dateRangeStart={{START_DATE}}&dateRangeEnd={{END_DATE}}",
					"protocol": "https",
					"host": [
						"analytics",
						"adobe",
						"io"
					],
					"path": [
						"api",
						"{{GLOBALCOMPANYID}}",
						"datarepair",
						"v1",
						"{{RSID}}",
						"job"
					],
					"query": [
						{
							"key": "validationToken",
							"value": "{{VALIDATION_TOKEN}}"
						},
						{
							"key": "dateRangeStart",
							"value": "{{START_DATE}}"
						},
						{
							"key": "dateRangeEnd",
							"value": "{{END_DATE}}"
						}
					]
				}
			},
			"response": []
		},
		{
			"name": "Get Data Repair Job list",
			"request": {
				"method": "GET",
				"header": [
					{
						"key": "x-api-key",
						"value": "{{CLIENT_ID}}",
						"type": "text"
					},
					{
						"warning": "This is a duplicate header and will be overridden by the Authorization header generated by Postman.",
						"key": "Authorization",
						"value": "Bearer {{ACCESS_TOKEN}}",
						"type": "text"
					}
				],
				"url": {
					"raw": "https://analytics.adobe.io/api/{{GLOBALCOMPANYID}}/datarepair/v1/{{RSID}}/job",
					"protocol": "https",
					"host": [
						"analytics",
						"adobe",
						"io"
					],
					"path": [
						"api",
						"{{GLOBALCOMPANYID}}",
						"datarepair",
						"v1",
						"{{RSID}}",
						"job"
					]
				}
			},
			"response": []
		},
		{
			"name": "View Data Repair Job",
			"request": {
				"method": "GET",
				"header": [
					{
						"key": "x-api-key",
						"value": "{{CLIENT_ID}}",
						"type": "text"
					},
					{
						"warning": "This is a duplicate header and will be overridden by the Authorization header generated by Postman.",
						"key": "Authorization",
						"value": "Bearer {{ACCESS_TOKEN}}",
						"type": "text"
					}
				],
				"url": {
					"raw": "https://analytics.adobe.io/api/{{GLOBALCOMPANYID}}/datarepair/v1/{{RSID}}/job/{{JOB_ID}}",
					"protocol": "https",
					"host": [
						"analytics",
						"adobe",
						"io"
					],
					"path": [
						"api",
						"{{GLOBALCOMPANYID}}",
						"datarepair",
						"v1",
						"{{RSID}}",
						"job",
						"{{JOB_ID}}"
					]
				}
			},
			"response": []
		}
	],
	"event": [
		{
			"listen": "prerequest",
			"script": {
				"type": "text/javascript",
				"exec": [
					""
				]
			}
		},
		{
			"listen": "test",
			"script": {
				"type": "text/javascript",
				"exec": [
					""
				]
			}
		}
	]
}
```
</details>

1. 上記二つの折りたたみを開いて内容をコピーして、それぞれの内容を json ファイルとして保存します。
1. POSTMAN の **Import** をクリックし、二つの json ファイルを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1025787/9212edd0-6510-3653-ca6b-fa142dc598bc.png)
1. それぞれの定義をインポートします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1025787/00a7672f-458a-a82c-5b20-4a4f0b2d7aff.png)
1. **Collections** に **Data Repair API Sample** がインポートされたこと、**Environments** に **Data Repair API Env** がインポートされたことを確認します。

|Collection のインポートを確認|Environment のインポートを確認|
|---|---|
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1025787/693512d2-51e8-849e-2c18-50e46b2115d7.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1025787/42c77f11-ca0d-8dd9-4e09-a4b086685ce4.png)|

POSTMAN 以外の API クライアント等をお使いの場合は、上記 json ファイルに API のエンドポイント等がまとまっていますので参考にしてください。詳細は以下ヘルプにも記載されています。

https://developer.adobe.com/analytics-apis/docs/2.0/guides/endpoints/data-repair/

## Global Company ID の確認・設定
インポートした API 実行環境に対して、ご利用の環境情報を設定します。まずは Adobe Analytics の環境情報です。
1. [Adobe Analytics](https://experience.adobe.com) にログインして、**Adobe Analytics ＞ 管理者 ＞ すべての管理者** を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1025787/279369a2-148e-16f1-b674-9162aa443099.png)
1. **会社設定 ＞ Web サービス** を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1025787/3140306a-31ea-6fcc-e579-550849472e9a.png)
1. 表示された以下赤線箇所に太字のコードが記載されています。この ID を控えます。
![globalcompanyid.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1025787/13b6123a-6f93-a66b-4cbb-9cef097c860d.png)
1. POSTMAN の Environment **Data Repair API Env**、**GLOBALCOMPANYID** の **CURRENT VALUE** に控えた ID を設定して保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1025787/2d701a1e-f01f-799f-be4a-9c900d508949.png)

:::note warn
Adobe Analytics の操作メニューが表示されない等の場合は Adobe Analytics の権限が不足している場合があります。ご利用の Adobe Analytics 管理者に相談ください。
:::

## Adobe Developer Console から Client ID の確認・設定

API 認証を行う Adobe Developer Console プロジェクト情報を設定します。
[Adobe Developer Console](https://developer.adobe.com) にログインして、プロジェクトから情報を取得します。
1. 対象のプロジェクトから **Project overview ＞ Credentials ＞ Service Account (JWT)** を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1025787/ca77a38e-b242-d229-a61f-a67e56abaaf0.png)
1. 表示された CLIENT ID の値を取得します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1025787/43b32464-cd9d-dbdc-d1d2-bbd2081bd69f.png)
1. POSTMAN の Environment **Data Repair API Env**、**CLIENT_ID** の **CURRENT VALUE** に控えた CLIENT ID を設定して保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1025787/9c26a657-d1e7-aff9-5331-8f39b25e0a77.png)

## 認証トークンを取得・設定

Adobe Developer Console プロジェクトを使用して認証トークンを取得します。
認証トークンの取得方法は、以下の **JWT による認証トークンの交換** を参照ください。

https://qiita.com/smzakio/items/ede69ffeb7a90222964a#jwt-%E3%81%AB%E3%82%88%E3%82%8B%E8%AA%8D%E8%A8%BC%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E3%81%AE%E4%BA%A4%E6%8F%9B

POSTMAN の Environment **Data Repair API Env**、**ACCESS_TOKEN** の **CURRENT VALUE** に取得したトークンを設定して保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1025787/6708b8d4-a2b1-d948-6962-d0939d1c9620.png)

# Data Repair API の実行
Data Repair API を実行する レポートスイート ID、開始日、終了日をそれぞれ POSTMAN の Environment **Data Repair API Env**、**RSID** / **START_DATE** / **END_DATE** の **CURRENT VALUE** に設定して保存します。
- `RSID`: レポートスイート ID
- `START_DATE`: 削除期間の開始日 (`YYYY-MM-DD` 形式)
- `END_DATE`: 削除期間の終了日 (`YYYY-MM-DD` 形式)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1025787/6986d095-05ea-50ba-919f-d6323e606597.png)

## サーバーコール量の検証
POSTMAN の Data Collection **Data Repair API Sample ＞ Server Call estimate** を選択します。
画面右上の Environment から **Data Repair API Env** を選択します。
Environment を指定してから **Send** をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1025787/4df378f8-e08e-4d15-5801-52385508176f.png)

:::note warn
以下のような応答が返る場合、認証がうまくいっていないことが考えられます。
```json
{
    "error_code": "401013",
    "message": "Oauth token is not valid"
}
```
POSTMAN 画面右上の Environment から **Data Repair API Env** が選択されているか、Environments の各項目がきちんと保存されているかなどを確認してみてください。
|Environment を選択していない状態|Environment を選択済み|
|---|---|
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1025787/d241e6df-6c01-f45d-35a2-c81df580fc69.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1025787/54f078e9-06d6-f420-a250-5f18f48b1b23.png)|

エラーが出た場合の参考情報として、以下のヘルプもあります。ヘルプで紹介している API は異なるものですが、エラーコードは同様のものが紹介されているので、エラーが発生した原因の特定にお役立ていただけます。

> FAQ とトラブルシューティングガイド ＞ リクエストヘッダーエラー
https://experienceleague.adobe.com/docs/experience-platform/landing/troubleshooting.html?lang=ja#request-header-errors
:::

Server Call estimate が正常にリクエストされると、以下のような応答が返ります。

```terminal:Server Call estimate - API Request 例
curl -X GET "https://analytics.adobe.io/api/{GLOBALCOMPANYID}/datarepair/v1/{RSID}/serverCallEstimate?dateRangeStart={YYYY-MM-DD}&dateRangeEnd={YYYY-MM-DD}" \
    -H "Authorization: Bearer {ACCESS_TOKEN}" \
    -H "x-api-key: {API_KEY/CLIENT_ID}"
```

```json:Server Call estimate - API Response 例
{
    "serverCallEstimate": 86,
    "reportSuiteId": "---RSID---",
    "validationToken": "gAAAAABifTJyMHSIWfvAn5WvotbKJ1IYQNDTQX4XcOmJUt23VksOjidTutv1kFvFYBXGh654hhDOYxL2iwqWBoW2wviRNw_JfB4lWeliwuafH4GFaFqEDrXHX8JDt-OF2FnYhp3a6W7vMMf4zzjdEiPdgbt_t9IJHSODOP1haWoXrLVwQf_SSb3YuAmFAV9kqLeKPHZgzfB4",
    "dateRangeStart": "2022-02-01",
    "dateRangeEnd": "2022-02-28"
}
```
`serverCallEstimate` は、同レポートスイートの該当期間におけるサーバーコール数です。
`validationToken` は Data Repair ジョブを作成する際に必要となる値です。この値を控えておきます。

## Data Repair ジョブを作成
POSTMAN の Data Collection **Data Repair API Sample ＞ Create Data Repair Job** を選択します。
リクエストの **Params** タブの **validationToken** の **VALUE** に Server call estimate からのレスポンスで控えたトークンを設定します。( `{{` `}}` のカッコ表記は不要です。トークンの値だけを設定します) 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1025787/e6d20132-e93e-ca98-150c-dc9e3d5754f0.png)
**Body** タブから対象の変数とアクション、条件を指定します。
以下の例では、pageurl から cid クエリパラメーターのみをクリアし、prop1 に cid が含まれている場合はその値をクリアする想定で定義しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1025787/e164f56c-fc00-faa4-d7c0-b734d43478fc.png)
```json:ジョブの定義例
{
  "variables": {
    "pageurl": {
      "action": "deleteQueryStringParameters",
      "parameters": ["cid"]
    },
    "prop1": {
      "action": "delete",
      "filter": {
          "condition": "contains",
          "matchValue": "cid"
      }
    }
  }
}
```
アクションや条件の指定オプションについては、以下ヘルプを参照ください。

https://developer.adobe.com/analytics-apis/docs/2.0/guides/endpoints/data-repair/json-body

**validationToken** と **Body** を設定したら **Send** します。

:::note warn
Create Data Repair Job のリクエストが完了した時点から、データの削除処理が開始されます。開始されたジョブは停止することが出来ませんのでご注意ください。
:::

Create Data Repair Job では以下のような応答が返ります。
```terminal:Create Data Repair Job - API Request 例
curl -X POST -H "accept: application/json" \
  -H "Authorization: Bearer {ACCESS_TOKEN}" \
  -H "x-api-key: {CLIENTID}" \
  -d '{"variables":{"pageurl":{"action":"deleteQueryStringParameters","parameters":["cid"]},"prop1":{"action":"delete","filter":{"condition":"contains","matchValue":"cid"}}}}' \
  "https://analytics.adobe.io/api/{GLOBALCOMPANYID}/datarepair/v1/{RSID}/job?validationToken={VALIDATION_TOKEN}&dateRangeStart={YYYY-MM-DD}&dateRangeEnd={YYYY-MM-DD}"
```

```json:Create Data Repair Job - API Response 例
{
    "jobId": 1189,
    "reportSuiteId": "---RSID---",
    "jobCreateTime": "2022-05-12T10:12:23+00:00",
    "jobCompleteTime": null,
    "progress": 0,
    "status": "processing",
    "dateRangeStart": "2022-02-01",
    "dateRangeEnd": "2022-02-28",
    "serverCalls": null,
    "jobDefinition": {
        "variables": {
            "pageurl": {
                "action": "deleteQueryStringParameters",
                "parameters": [
                    "cid"
                ]
            },
            "prop1": {
                "action": "delete",
                "filter": {
                    "condition": "contains",
                    "variable": null,
                    "matchValue": "cid"
                }
            }
        }
    }
}
```

## Data Repair ジョブのステータスを確認する
ジョブが完了するまでの時間はデータ量にも依存します。期間をおいて以下の通りジョブのステータスを確認します。
POSTMAN の Data Collection **Data Repair API Sample ＞ View Data Repair Job** を選択します。
アドレスバーの `{{JOB_ID}}` をジョブ ID に書き換えます。(`{{` `}}` のカッコ表記は不要です)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1025787/087efef9-16cb-e508-2583-01f66c4c9969.png)
ジョブ ID の設定後、**Send** します。
ジョブ完了時には以下のような応答が返ります。
```terminal:View Data Repair Job - API Request 例
curl -X GET "https://analytics.adobe.io/api/{GLOBALCOMPANYID}/datarepair/v1/{RSID}/{JOB_ID}" \
  -H "Authorization: Bearer {ACCESS_TOKEN}" \
  -H "x-api-key: {CLIENT_ID}"
```

```json:View Data Repair Job - API Response 例
{
    "jobId": 1189,
    "reportSuiteId": "---RSID---",
    "jobCreateTime": "2022-05-12T10:12:23+00:00",
    "jobCompleteTime": "2022-05-12T10:38:24+00:00",
    "progress": 100,
    "status": "complete",
    "dateRangeStart": "2022-02-01",
    "dateRangeEnd": "2022-02-28",
    "serverCalls": 86,
    "jobDefinition": {
        "variables": {
            "pageurl": {
                "action": "deleteQueryStringParameters",
                "parameters": [
                    "cid"
                ]
            },
            "prop1": {
                "action": "delete",
                "filter": {
                    "condition": "contains",
                    "variable": null,
                    "matchValue": "cid"
                }
            }
        }
    }
}
```

## データの削除完了後
Data Repair ジョブが完了したら、対象のデータを確認します。
以下は prop1 に cid 含まれている場合にデータのクリアした前・後のレポート例になります。

|クリア前|クリア後|
|---|---|
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1025787/f7f4b4b2-4233-9714-e1a6-7746d7047b99.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1025787/3504e801-b0d9-f208-7ea4-3d90a87295f1.png)|

なお、Adobe Analytics のローデータレベルでは、一つの変数でもデータ処理前の受信データ (PRE) とデータ処理後の加工済みデータ (POST) が存在します。分析ワークスペースや Data Warehouse 等のレポート機能では POST データのみが表示されますが、Data Feed を利用した場合は PRE データ、POST データの双方が取得可能です。
Data Repair API では、POST データだけでなく、PRE データに対しても作用します。

以下は pageurl から cid クエリパラメーターのみをクリアした前・後のレポート例です。
pageurl のクエリパラメーターは PRE データに記録されますが、指定したパラメーター (cid) のみ削除されていることが確認できます。
|page_url (クリア前) |page_url (クリア後) |
|---|---|
|`http://example.com/seg/page2.html?cid=abcd`|`http://example.com/seg/page2.html`|
|`http://example.com/seg/page3.html?aid=1234&cid=5678`|`http://example.com/seg/page3.html?aid=1234`|
|`http://example.com/seg/page4.html?aid=5678&cid=0124&bid=poiu`|`http://example.com/seg/page4.html?aid=5678&bid=poiu`|
|`http://example.com/seg/page1.html?cid=afgh&bid=qwer`|`http://example.com/seg/page1.html?&bid=qwer`|

# まとめ
Data Repair API は 2021 年にリリースされた比較的新しい機能になります。今後も細かな機能アップデートなどもされていくこともありますので、利用する際には必ず最新情報をチェック頂けますと幸いです。

https://developer.adobe.com/analytics-apis/docs/2.0/guides/endpoints/data-repair/

:::note info
最後に、私たちが働くアドビのカスタマーサポート部門では製品・技術のエキスパートを随時募集しています！私たちの部門や職種のご紹介をしていますので、以下のページもぜひご覧ください。
https://blog.adobe.com/jp/publish/2021/06/21/corp-adobe-life-talent-interview-11
:::