どのようにお手伝いできますか?

Web Performance Measurement向けのServer-to-Server(S2S)API

  • 更新

概要: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によるリクエストはお客様のサーバーから直接送信され、ブラウザを経由しないため、これらの制限の影響を受けません。

How it works

  1. ユーザーがウェブサイユーザーがWebサイトへアクセスする、またはブラウザ上でイベントを発生させます。
  2. お客様のサーバーがそのイベントを受信します。
  3. お客様のサーバーからAppsFlyerサーバーへイベントを直接送信し、アトリビューションを行います。

S2Sを使用するメリット

S2S APIを利用することで、以下のようなメリットがあります:

  • サーバー側で発生するイベントを計測できる:一部のコンバージョンはブラウザを経由しません。 例えば、バックエンドで処理されるサブスクリプション更新や、CRMシステムで発生するイベントなどが該当します。これらのイベントをAppsFlyerへ送信し、適切なキャンペーンへアトリビューションできるのは、S2S APIのみです。
  • 計測対象を拡大できる:S2S APIによるリクエストはブラウザではなくサーバーから送信されるため、広告ブロッカー、Safari ITPによるCookie制限、その他ブラウザレベルの制限の影響を受けません。その結果、クライアントサイド計測だけでは取得できない訪問やコンバージョンも計測できます。
  • バックエンドのデータを追加できる:S2S APIでは、イベント送信前にバックエンド側で追加情報を付与できます。 例えば、以下の情報を追加できます: ・Customer User ID ・ハッシュ化したメールアドレス ・ハッシュ化した電話番号 ・CRM属性 ・サブスクリプションステータス ・社内システムの識別子これにより、ユーザー識別の精度が向上し、アトリビューションの品質も高まります。 This improves identity resolution and strengthens signal quality.
  • セキュリティを強化できる: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

Request body

Field 型 必須 説明
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。
af_customer_event_id string 任意

Your own unique ID for the event, which you use to deduplicate conversions on ad network platforms. AppsFlyer forwards it to the network as the event ID.

Send it when either applies:

  • You run a network pixel on your site, alongside AppsFlyer tracking.
  • You send the same event through both the Web SDK and this API.

When you send it, also send the same value in the network's own pixel event (for example, eventID in fbq()), so the network counts the conversion once instead of twice.

If you omit it, AppsFlyer generates its own ID, and the network can't match your pixel events.

Limits: Max 256 characters. Matching is exact and case-sensitive.

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

Request body

Field 型 必須 説明
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の読み取りや削除を防ぐことができます。 さらに、ページ上でスクリプトを実行する必要もありません。

To set and read it:

  1. Cookieを持たない訪問者から最初のリクエストを受信した際に、サーバー側で永続的かつ一意のID(UUIDなど)を生成します。
  2. そのIDをファーストパーティCookieとして返します:

    Set-Cookie: af_web_id=<generated-id>; Max-Age=34128000; Path=/; Secure; HttpOnly; SameSite=Lax
  3. それ以降のすべてのリクエストでは、受信したCookieヘッダーから値を読み取り、同じ値を再利用します。新しい値を生成しないでください。
  4. AppsFlyerへのすべてのリクエストで、その値をリクエスト内のuser_idオブジェクトにappsflyer_idとして含めて送信します。

Cookieには任意の名前を付けることができます。 AppsFlyerが読み取るのは送信された値であり、Cookieの名前ではありません。ただし、必ず自社のファーストパーティドメインからCookieを設定してください。

各リクエストで適切な識別子を送信する

すべてのリクエストにuser_idオブジェクトを含め、少なくともappsflyer_id(Cookieの値)またはcustomer_user_id(自社の内部ユーザーID)のいずれかを指定する必要があります。両方の値を利用できる場合は、両方を送信することでユーザー識別の精度が向上します。

Here's what to keep in mind: visits are mostly anonymous, so always send the cookie value. Webサイト上で発生するイベントについては、ユーザーを識別できた時点でcustomer_user_idを追加し、それ以降もCookieの値と併せて送信してください。ブラウザ以外で発生するイベントについては、以前に識別済みのセッションを通じてAppsFlyerがそのユーザーをすでに認識している場合に限り、customer_user_idのみを送信することもできます。

考慮事項

ユーザー識別

すべてのリクエストでuser_idのオブジェクトを指定する必要があります。以下のいずれかの識別子を必ず含めてください。

Field 型 説明
customer_user_id string(1~64文字) お客様のシステムで設定している内部ユーザー識別子です。
appsflyer_id string(1文字以上) AppsFlyerがWebユーザーに付与する内部識別子です。 AppsFlyer Web SDKを利用している場合は、appsflyer_idはWeb SDKのCookieから取得できます。 afUserIdを参照してください。詳しくは「Web SDKの afUserID の抽出」を参照してください。

Late acceptance windows

イベントおよびWeb訪問は、アプリのタイムゾーンにおける翌日の00:30までにAppsFlyerへ到着する必要があります。この期限を過ぎて受信したイベントは、イベントに含まれるタイムスタンプではなく、AppsFlyerが受信した時刻が使用されます。

Hashed PII fields

すべての個人情報(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を確認できます。
  • For it to be available, the visitor needs to have first visited a page having the Web SDK at least once.
  • afUserId を含むCookieは、お客様のドメインに対するファーストパーティCookieとして保存されます。
  • 以下の手順はChrome 81を使用して作成しています。ブラウザやOSによって表示や操作方法が異なる場合があります。

ブラウザからafUserIdを取得する:

  1. ブラウザでWebサイトを開きます。
  2. ページ上で右クリックし、Inspectを選択します。ブラウザの開発者ツールが表示されます。
  3. (A) Applicationタブを開きます。
  4. サイドメニューにて、(B)[Cookie]を開きます。
  5. お客様のWebサイトを選択します。表示されない場合はブラウザを更新してください。
  6. (C) フィルター欄にafUserIdと入力すると、afUserIdの値が表示されます。 The value of afUserID displays.