概要:Web Performance Measurement向けS2S APIを使用すると、広告ブロッカーやCookie制限などのブラウザによる制約を回避し、Webサイトへの訪問とイベントをサーバーからAppsFlyerへ直接送信できます。Web SDKと併用することも、単独で使用することもでき、より網羅的で品質の高いアトリビューションデータを取得できます。
Webアトリビューション向けS2S APIについて
AppsFlyerでは、Webデータをアトリビューションのために送信する方法として、Web SDK(クライアントサイド)とS2S API(Server-to-Server)の2種類を提供しています。これらは、それぞれ単独で利用することも、運用環境や要件に応じて組み合わせて利用することもできます。
Web SDKはブラウザ上で動作します。一方、S2S APIでは同じデータをお客様のバックエンドから直接送信できます。この違いは非常に重要です。Safari ITP、Firefox ETP、Braveなどのプライバシー保護を重視したブラウザや広告ブロッカーは、ブラウザ上で行われる計測を制限またはブロックする場合があります。業界では、このようなブラウザレベルでの制限の影響を受けるユーザーはWebユーザー全体の25~40%程度と推定されています。S2S APIによるリクエストはお客様のサーバーから直接送信され、ブラウザを経由しないため、これらの制限の影響を受けません。
仕組み
- ユーザーがウェブサイユーザーがWebサイトへアクセスする、またはブラウザ上でイベントを発生させます。
- お客様のサーバーがそのイベントを受信します。
- お客様のサーバーからAppsFlyerサーバーへイベントを直接送信し、アトリビューションを行います。
S2Sを使用するメリット
S2S APIを利用することで、以下のようなメリットがあります:
- サーバー側で発生するイベントを計測できる:一部のコンバージョンはブラウザを経由しません。例えば、バックエンドで処理されるサブスクリプション更新や、CRMシステムで発生するイベントなどが該当します。これらのイベントをAppsFlyerへ送信し、適切なキャンペーンへアトリビューションできるのは、S2S APIのみです。
- 計測対象を拡大できる:S2S APIによるリクエストはブラウザではなくサーバーから送信されるため、広告ブロッカー、Safari ITPによるCookie制限、その他ブラウザレベルの制限の影響を受けません。その結果、クライアントサイド計測だけでは取得できない訪問やコンバージョンも計測できます。
- バックエンドのデータを追加できる:S2S APIでは、イベント送信前にバックエンド側で追加情報を付与できます。 例えば、以下の情報を追加できます: ・Customer User ID ・ハッシュ化したメールアドレス ・ハッシュ化した電話番号 ・CRM属性 ・サブスクリプションステータス ・社内システムの識別子これにより、ユーザー識別の精度が向上し、アトリビューションの品質も高まります。
- セキュリティを強化できる:Dev Key、ユーザー識別子、および追加したデータはすべてお客様のサーバー内で管理され、安全な通信を通じてAppsFlyerへ送信されます。そのため、お客様はインフラストラクチャの外部へ送信する情報を完全に管理できます。
API仕様
Base URL:https://events.appsflyer.com
認証
すべてのリクエストには、有効なS2S APIトークンおよび適切なContent-Typeをリクエストヘッダーに含める必要があります。
| Header | 型 | 説明 |
|---|---|---|
Authorization |
APIトークン |
S2S APIトークンを以下の形式で指定します。 Authorization: Bearer {s2s-token} |
Content-Type |
string |
application/jsonを指定します。すべてのリクエストで必要です。 |
注意
S2S APIトークンを作成するには、AppsFlyerトークンの管理の手順を参照してください。
イベントの計測
POST /v2.0/s2s/inapps/app/web/{appId}
指定したアプリに対して、購入、会員登録、カスタムアクションなどのWebイベントを計測します。
パスパラメータ
| パラメータ | 必須 | 説明 |
|---|---|---|
appId |
必須 | AppsFlyerで定義されているunified_app_id。例:website-www.example.com
|
リクエスト本文
| 項目 | 型 | 必須 | 説明 |
|---|---|---|---|
user_id |
object | 必須 | ユーザー識別子。customer_user_idまたはappsflyer_idのいずれかを少なくとも1つ含める必要があります。 |
event_name |
string | 必須 | イベント名。1~64文字で指定します。@ = + -を含めることはできません。例:af_purchase
|
event_revenue |
number(double) | 任意 | 購入イベントまたは収益化イベントの売上金額。 |
event_revenue_currency |
string (ISO-4217) | 任意 | 売上金額の通貨コード。例:USD , EUR
|
event_value |
object | 任意 | 自由形式のイベントパラメータ。custom_parameters のサブオブジェクトに対応しています。 |
event_url |
string | 任意 | イベントが発生したページのURL。有効なHTTP URLで、最大4,096文字まで指定できます。 |
timestamp |
integer (int64) | 任意 | Unix時間(ミリ秒、UTC)。省略した場合、AppsFlyerは受信時刻を使用します。遅延イベントの受付期限:イベントは、アプリのタイムゾーンにおける翌暦日の00:30までに到着している必要があります。 |
ip |
string | 任意 | デバイスのIPアドレス(IPv4またはIPv6)。最大46文字まで指定できます。 |
user_agent |
string | 任意 | ブラウザから取得した完全なユーザーエージェント文字列。最大1,024文字まで指定できます。 |
http_referrer |
string | 任意 | 現在のページのリファラURL。 |
customer_dedup_id |
string | 任意 | お客様側で指定する重複排除用の識別子。 |
email_hashed |
string | 任意 | 正規化されたメールアドレス(小文字化・前後の空白削除済み)のSHA256ハッシュ値。64文字の16進数文字列である必要があります。 |
phone_number_hashed |
string | 任意 | 電話番号のSHA256ハッシュ値。64文字の16進数文字列である必要があります。 |
phone_number_e164_hashed |
string | 任意 | E.164形式の電話番号(例:+14155552671)のSHA256ハッシュ値。64文字の16進数文字列である必要があります。 |
first_name_hashed |
string | 任意 | 正規化された名のSHA256ハッシュ値。64文字の16進数文字列である必要があります。 |
last_name_hashed |
string | 任意 | 正規化された姓のSHA256ハッシュ値。64文字の16進数文字列である必要があります。 |
リクエスト例
{"user_id":{"customer_user_id":"15667737-366d-4994-ac8b-653fe6b2be4a"},"event_name":"af_purchase","event_revenue":49.99,"event_revenue_currency":"USD","event_value":{"af_content_id":"SKU-001","af_quantity":2,"custom_parameters":{"promo_code":"SUMMER10"}},"event_url":"https://example.com/checkout/success","timestamp":1712000000000,"ip":"35.244.183.10","user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) ...","email_hashed":"a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2"}レスポンス
| ステータス | 説明 |
|---|---|
| 202 Accepted | リクエストが受け付けられました。status、message、および任意でmessageIdが返されます。 |
| 400 Bad Request | フィールドが無効、または不足しています。 |
| 401 Unauthorized | アプリが存在しない、または認証に失敗しました。 |
| 403 Forbidden | アプリのトラフィックがブロックされています。 |
| 415 Unsupported Media Type |
Content-Type は application/json である必要があります。 |
Web訪問の計測
POST /v2.0/s2s/visits/app/web/{appId}
指定したWebアプリのページ訪問を計測します。このエンドポイントは、イベント計測エンドポイントと共通の基本フィールドを使用しますが、以下の2点が異なります。
・event_url は必須です。
・event_nameおよび収益関連のフィールドは使用しません。
パスパラメータ
| パラメータ | 必須 | 説明 |
|---|---|---|
appId |
必須 | AppsFlyerで定義されているunified_app_id。例:website-www.example.com
|
リクエスト本文
| 項目 | 型 | 必須 | 説明 |
|---|---|---|---|
user_id |
object | 必須 | ユーザー識別子。customer_user_idまたはappsflyer_idのいずれかを少なくとも1つ含める必要があります。 |
event_url |
string | 必須 | 訪問したページのURL。有効なHTTP URLで、最大4,096文字まで指定できます。 |
timestamp |
integer (int64) | 任意 | Unix時間(ミリ秒、UTC)。省略した場合、AppsFlyerは受信時刻を使用します。遅延イベントの受付期限:訪問データは、アプリのタイムゾーンにおける翌日の00:30までに到着している必要があります。 |
ip |
string | 任意 | デバイスのIPアドレス(IPv4またはIPv6)。最大46文字まで指定できます。 |
user_agent |
string | 任意 | ブラウザから取得した完全なユーザーエージェント文字列。最大1,024文字まで指定できます。 |
http_referrer |
string | 任意 | 現在のページのリファラURL。 |
event_value |
object | 任意 | 自由形式のイベントパラメータ。custom_parametersのサブオブジェクトを含めることができます。 |
customer_dedup_id |
string | 任意 | お客様側で指定する重複排除用の識別子。 |
email_hashed |
string | 任意 | 正規化されたメールアドレスのSHA256ハッシュ値。64文字の16進数文字列である必要があります。 |
phone_number_hashed |
string | 任意 | 電話番号のSHA256ハッシュ値。64文字の16進数文字列である必要があります。 |
phone_number_e164_hashed |
string | 任意 | E.164形式の電話番号のSHA256ハッシュ値。64文字の16進数文字列である必要があります。 |
first_name_hashed |
string | 任意 | 正規化された名のSHA256ハッシュ値。64文字の16進数文字列である必要があります。 |
last_name_hashed |
string | 任意 | 正規化された姓のSHA256ハッシュ値。64文字の16進数文字列である必要があります。 |
リクエスト例
{"user_id":{"appsflyer_id":"1234567890abcdef","customer_user_id":"15667737-366d-4994-ac8b-653fe6b2be4a"},"event_url":"https://example.com/products/sneakers","timestamp":1712000000000,"ip":"35.244.183.10","user_agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) ...","http_referrer":"https://www.google.com/","email_hashed":"a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2"}レスポンス
| ステータス | 説明 |
|---|---|
| 202 Accepted | リクエストが受け付けられました。status、message、および任意でmessageIdが返されます。 |
| 400 Bad Request | フィールドが無効、または不足しています。 |
| 401 Unauthorized | アプリが存在しない、または認証に失敗しました。 |
| 403 Forbidden | アプリのトラフィックがブロックされています。 |
| 415 Unsupported Media Type |
Content-Type は application/json である必要があります。 |
完全なサーバーサイド連携を設定する
Web SDKとS2Sを併用している場合は、このセクションではなく、Web SDKのafUserIDを取得するを参照してください。このセクションは、SDKを一切使用しない連携のみを対象としています。
WebサイトでWeb SDKをまったく使用しない場合は、通常Web SDKが処理するすべての作業を自社で行う必要があります。これには、ユーザーCookieの設定、適切な識別子の送信、各イベントペイロードに必要な情報を不足なく含めることが含まれます。正しく設定すれば、S2Sを使用する理由で説明したすべてのメリットを得られますが、そのためには以下の詳細を正しく設定する必要があります。
イベントだけでなく訪問も送信する
訪問データには、それ以降のすべてのイベントが参照するアトリビューションパラメーターが含まれています。また、システムでは、同じユーザーからイベントを受信する前に、訪問データを受信することを前提としています。訪問データより先にイベントを送信した場合、そのイベントはオーガニックとして分類されます。
HTTP経由でファーストパーティCookieを設定する
afUserIdを設定するWeb SDKがないため、Cookieを自社で設定して管理する必要があります。JavaScriptで書き込むクライアントサイドCookieではなく、Set-Cookieレスポンスヘッダーで設定するHTTP Cookieとして実装してください。
この違いが重要である理由は、クライアントサイドCookie(document.cookieを使用して設定したCookie)の有効期限が短いためです。Safariでは最短7日間、ITPの対象となるドメインでは24時間で期限切れになる場合があります。Cookieの有効期限が切れると識別子がリセットされるため、再訪問したユーザーが新規ユーザーとして認識されます。一方、サーバーで設定したCookieにはこの上限が適用されず、ブラウザが許容する最大期間まで保持できます。たとえば、Chromeでは最大400日間保持できます。また、HttpOnlyを指定すれば、ページ上のスクリプトや広告ブロッカーによるCookieの読み取りや削除を防ぐことができます。さらに、ページ上でスクリプトを実行する必要もありません。
Cookieを設定して読み取る手順は、次のとおりです。
- Cookieを持たない訪問者から最初のリクエストを受信した際に、サーバー側で永続的かつ一意のID(UUIDなど)を生成します。
-
そのIDをファーストパーティCookieとして返します:
Set-Cookie: af_web_id=<generated-id>; Max-Age=34128000; Path=/; Secure; HttpOnly; SameSite=Lax - それ以降のすべてのリクエストでは、受信したCookieヘッダーから値を読み取り、同じ値を再利用します。新しい値を生成しないでください。
- AppsFlyerへのすべてのリクエストで、その値をリクエスト内の
user_idオブジェクトにappsflyer_idとして含めて送信します。
Cookieには任意の名前を付けることができます。AppsFlyerが読み取るのは送信された値であり、Cookieの名前ではありません。ただし、必ず自社のファーストパーティドメインからCookieを設定してください。
各リクエストで適切な識別子を送信する
すべてのリクエストにuser_idオブジェクトを含め、少なくともappsflyer_id(Cookieの値)またはcustomer_user_id(自社の内部ユーザーID)のいずれかを指定する必要があります。両方の値を利用できる場合は、両方を送信することでユーザー識別の精度が向上します。
留意すべき点は、Webサイトへの訪問時点では、ほとんどのユーザーが匿名であるということです。そのため、訪問データには必ずcustomer_user_idの値を含めてください。Webサイト上で発生するイベントについては、ユーザーを識別できた時点でcustomer_user_idを追加し、それ以降もCookieの値と併せて送信してください。ブラウザ以外で発生するイベントについては、以前に識別済みのセッションを通じてAppsFlyerがそのユーザーをすでに認識している場合に限り、customer_user_idのみを送信することもできます。
考慮事項
ユーザー識別
すべてのリクエストでuser_idのオブジェクトを指定する必要があります。以下のいずれかの識別子を必ず含めてください。
| 項目 | 型 | 説明 |
|---|---|---|
customer_user_id |
string(1~64文字) | お客様のシステムで設定している内部ユーザー識別子です。 |
appsflyer_id |
string(1文字以上) | AppsFlyerがWebユーザーに付与する内部識別子です。AppsFlyer Web SDKを利用している場合は、appsflyer_idはWeb SDKのCookieから取得できます。afUserIdを参照してください。詳しくは「Web SDKの afUserID の抽出」を参照してください。
|
遅延イベントの受付期間
イベントおよびWeb訪問は、アプリのタイムゾーンにおける翌日の00:30までにAppsFlyerへ到着する必要があります。この期限を過ぎて受信したイベントは、イベントに含まれるタイムスタンプではなく、AppsFlyerが受信した時刻が使用されます。
ハッシュ化された個人情報(PII)項目
すべての個人情報(PII)項目は、送信前にSHA256でハッシュ化する必要があります。ハッシュ化する前に、文字列は小文字へ変換し、前後の空白を削除して正規化してください。各ハッシュ値は、大文字・小文字を区別しない64文字の16進数文字列である必要があります。
- すべてのハッシュフィールドで使用するパターンは以下のとおりです:
^[a-fA-F0-9]{64}$ -
phone_number_e164_hashedを使用する場合は、電話番号をE.164形式(例:+14155552671)へ変換してからハッシュ化してください。
Web SDKの afUserID の抽出
-
afUserIdは、ユーザーが初めてWebサイトへアクセスした際に、Web SDKによって設定される一意の識別子です。 -
afUserIdが必要な場合は、以下のいずれかの方法で取得できます。
HTTP CookieヘッダーからafUserIdを取得する
-
afUserIdは、ユーザーのブラウザからWebサイトへ送信されるHTTP Cookieヘッダーに含まれています。 - 必要に応じてHTTP Cookieヘッダーから取得してください。
ブラウザでafUserIdを確認する
- トラブルシューティングやデバッグを行う場合は、ブラウザ上で
afUserIdを確認できます。 - afUserIdを確認するには、ユーザーがWeb SDKを組み込んだページへ少なくとも1回アクセスしている必要があります。
-
afUserIdを含むCookieは、お客様のドメインに対するファーストパーティCookieとして保存されます。 - 以下の手順はChrome 81を使用して作成しています。ブラウザやOSによって表示や操作方法が異なる場合があります。
ブラウザからafUserIdを取得する:
- ブラウザでWebサイトを開きます。
- ページ上で右クリックし、Inspectを選択します。ブラウザの開発者ツールが表示されます。
- (A) Applicationタブを開きます。
- サイドメニューにて、(B)[Cookie]を開きます。
- お客様のWebサイトを選択します。表示されない場合はブラウザを更新してください。
- (C) フィルター欄に
afUserIdと入力すると、afUserIdの値が表示されます。
This article was translated using AI and may contain errors. For the most accurate information, please refer to the English version using the language selector.