若要傳送新事件,請從以下路徑向此 API 的 /events
關係連線發出 POST
要求:https://graph.facebook.com/{API_VERSION}/{PIXEL_ID}/events?access_token={TOKEN}
。當您發佈到此關係連線時,Facebook 會建立新的伺服器事件。
curl -X POST \
-F 'data=[
{
"event_name": "Purchase",
"event_time": 1732196916,
"user_data": {
"em": [
"309a0a5c3e211326ae75ca18196d301a9bdbd1a882a4d2569511033da23f0abd"
],
"ph": [
"254aa248acb47dd654ca3ea53f48c2c26d641d23d7e2e93a1ec56258df7674c4",
"6f4fcb9deaeadc8f9746ae76d97ce1239e98b404efe5da3ee0b7149740f89ad6"
],
"client_ip_address": "123.123.123.123",
"client_user_agent": "$CLIENT_USER_AGENT",
"fbc": "fb.1.1554763741205.AbCdEfGhIjKlMnOpQrStUvWxYz1234567890",
"fbp": "fb.1.1558571054389.1098115397"
},
"custom_data": {
"currency": "usd",
"value": 123.45,
"contents": [
{
"id": "product123",
"quantity": 1,
"delivery_category": "home_delivery"
}
]
},
"event_source_url": "http://jaspers-market.com/product/123",
"action_source": "website"
}
]' \
-F 'access_token=<ACCESS_TOKEN>' \
https://graph.facebook.com/v21.0/<PIXEL_ID>/events
使用 access_token
查詢參數將產生的安全存取權杖附加到要求。您也可使用圖形 API 測試工具 來 POST
到 /<pixel_id>/events
端點。
要求範例的主體看起來如下所示:
{ "data": [ { "event_name": "Purchase", "event_time": 1633552688, "event_id": "event.id.123", "event_source_url": "http:\/\/jaspers-market.com\/product\/123", "action_source": "website", "user_data": { "client_ip_address": "192.19.9.9", "client_user_agent": "test ua", "em": [ "309a0a5c3e211326ae75ca18196d301a9bdbd1a882a4d2569511033da23f0abd" ], "ph": [ "254aa248acb47dd654ca3ea53f48c2c26d641d23d7e2e93a1ec56258df7674c4", "6f4fcb9deaeadc8f9746ae76d97ce1239e98b404efe5da3ee0b7149740f89ad6" ], "fbc": "fb.1.1554763741205.AbCdEfGhIjKlMnOpQrStUvWxYz1234567890", "fbp": "fb.1.1558571054389.1098115397" }, "custom_data": { "value": 100.2, "currency": "USD", "content_ids": [ "product.id.123" ], "content_type": "product" }, "opt_out": false }, { "event_name": "Purchase", "event_time": 1633552688, "user_data": { "client_ip_address": "192.88.9.9", "client_user_agent": "test ua2" }, "custom_data": { "value": 50.5, "currency": "USD" }, "opt_out": false } ] }
event_time
是事件交易時間,應以 Unix 時間戳記的形式(以秒為單位)傳送,指示實際事件發生的時間。指定的時間可能會早於您向 Facebook 傳送事件的時間,這是為了能夠進行批次處理和達到伺服器效能最佳化。
在您向 Meta 傳送事件之前,event_time
最多可達 7 天。如果 data
中的任何 event_time
在過去大於 7 天,我們會針對整個要求傳回錯誤,且不會處理任何事件。若是將 physical_store
作為 action_source
的離線和實體商店事件,您應在轉換後的 62 天內上傳交易。
使用轉換 API,即表示您同意 action_source
參數就您所知是正確的。
您最多可以在 data
中傳送 1,000 個事件。如要確保最佳效能,建議您在事件發生後立即傳送事件,最好是在事件發生後的一小時內傳送。如果您在批次中傳送的任何事件無效,我們會拒絕整個批次。
如需瞭解哪些參數應先進行雜湊再傳送至 Facebook,請參閱顧客資訊參數頁面。如果您是使用 Facebook 的其中一個 Business SDK,則 SDK 會直接為您進行雜湊。
深入瞭解專為轉換 API 用戶設計的三項特定 Business SDK 功能:非同步要求、並行批次與 HTTP 服務介面。使用這些功能所需的最低語言版本:
自 2019 年 1 月起,Business SDK 已不再支援 PHP 5。若要使用 Business SDK,請升級至 PHP 7。
如果您必須使用 PHP 5,則建議使用 Swagger 整合。
傳送事件後,您可以在事件管理工具中確認我們已收到這些事件,步驟如下:
您可以使用事件管理工具中的測試事件功能,驗證 Facebook 是否已正確接收伺服器事件。若要尋找工具,請前往 Events Manager > Data Sources > Your Pixel > Test Events
。
測試事件工具會產生測試編號。將測試編號作為 test_event_code
參數傳送,可以開始看到「測試事件」視窗中顯示的事件活動。
注意:test_event_code
欄位應僅作為測試之用。傳送生產承載時,必須將其移除。
系統不會取消使用 test_event_code
傳送的事件。它們會流入事件管理工具,並作為目標設定和廣告成效衡量用途。
以下是應該如何建構要求的範例:
以下範例顯示的是要求在圖形 API 測試工具中的呈現方式:
您可以使用裝載協助工具產生此測試裝載。請注意,測試事件程式碼僅用於測試裝載。
傳送要求後,「測試事件」視窗就會顯示伺服器事件。
針對這兩個 API,請於事件之 data 參數中的每個事件內新增 data_processing_options
、data_processing_options_country
和 data_processing_options_state
來實作資料處理選項。
注意:新整合不再建議使用應用程式事件及離線轉換 API。改為建議您使用轉換 API,因其現在支援 Web、應用程式及離線事件。請參閱應用程式事件適用的轉換 API 及離線事件適用的轉換 API 取得更多資訊。
若要明確「不」啟用「限制資料使用(LDU)」,應針對每個事件指定空白陣列,或者直接移除承載中的欄位:
{ "data": [ { "event_name": "Purchase", "event_time": <EVENT_TIME>, "user_data": { "em": "<EMAIL>" }, "custom_data": { "currency": "<CURRENCY>", "value": "<VALUE>" }, "data_processing_options": [] } ] }
若要啟用 LDU 並且讓 Meta 指定地理位置:
{ "data": [ { "event_name": "Purchase", "event_time": <EVENT_TIME>, "user_data": { "em": "<EMAIL>", "client_ip_address": "256.256.256.256" }, "custom_data": { "currency": "<CURRENCY>", "value": "<VALUE>" }, "data_processing_options": ["LDU"], "data_processing_options_country": 0, "data_processing_options_state": 0 } ] }
若要啟用 LDU 並手動指定位置,例如:針對加州:
{ "data": [ { "event_name": "Purchase", "event_time": <EVENT_TIME>, "user_data": { "em": "<EMAIL>" }, "custom_data": { "currency": "<CURRENCY>", "value": "<VALUE>" }, "data_processing_options": ["LDU"], "data_processing_options_country": 1, "data_processing_options_state": 1000 } ] }
離線轉換 API 提供從 .csv
檔案手動上傳事件的選項。在此情況中,請將「資料處理選項」、「資料處理國家/地區」和「資料處理州/省」新增為檔案內的欄位。有關此方面的詳細資訊,請參閱上傳用戶介面。
深入瞭解資料處理選項。
行銷 API 有自己的限速邏輯,並且獨立於所有圖形 API 速率限制外。因此,如果您發出行銷 API 呼叫,並不會計入圖形 API 限速內。
轉換 API 沒有特定的速率限制。轉換 API 呼叫會以行銷 API 呼叫計算。唯一的限制是,您一次最多可向我們傳送 1,000 個事件。請參閱傳送要求瞭解更多資訊。
行銷 API 限速本指南旨在協助您運用專為轉換 API 閘道用戶設計的 Meta Business SDK 進階功能。若要瞭解基本的轉換 API 閘道用法,請參閱轉換 API 閘道說明文件。
您必須先安裝 Meta Business SDK,才能使用下列任一功能。詳情請參閱 Meta Business SDK 新手指南,或是按照下列網址中的 README 指示操作:
這些功能目前僅適用於 PHP 和 Java Business SDK,其他語言版本將在 2023 年底前建置完成。
使用這些功能所需的最低語言版本如下所示:
PHP >= 7.2
Java >= 8
請注意:若要刪除重複的事件並傳送到轉換 API 端點,請在要求中傳遞 eventId
。這樣在轉換 API 發佈功能為啟用的情況下,系統就不會顯示重複的事件。
CAPIGatewayIngressRequest
參數參數 | 說明 |
---|---|
endpointUrl 字串 | 接收事件的轉換 API 閘道端點。系統只會檢查該參數是否為有效的網址,而不會執行其他預先驗證操作。 範例:https://test.example.com |
accessKey 字串 | 將事件傳送至轉換 API 閘道事件端點時所需的轉換 API 閘道存取密鑰。若要產生該密鑰,請參閱相關指示。 |
CAPIGatewayIngressRequest
Setter參數 | 說明 |
---|---|
setSendToDestinationOnly 布林值 | 布林值旗標,註明事件是否只能傳送至所選端點。 預設值: |
setFilter CustomEndpointRequest.Filter() 函數 | 用來處理每個事件的篩選函數。如果篩選邏輯傳回 true,事件就能成功傳遞,否則事件將遭到捨棄。請務必在具備參數 Event 的介面中實作 shouldSendEvent 函數。 預設值: |
如果系統目前已使用 Business SDK,您只需參照新的 CAPIGatewayIngressRequest,並將該要求附加至 eventRequest 的 customEndpoint 物件即可。
// this is the standard event request that we attach events to $event_request = new EventRequest($this->pixel_id); $capiIngressRequest = new CAPIGatewayIngressRequest($this->cb_url, $this->access_key); $event_request->setCustomEndpoint($capiIngressRequest); // pass the events to this event Request object $event_request->setEvents($events); $event_request->execute()
如果系統目前已使用 Business SDK,您只需參照新的 CAPIGatewayIngressRequest,並將該要求附加至 eventRequest 的 customEndpoint 物件即可。
// this is the standard event request that we attach events to EventRequest eventRequest = new EventRequest(PIXEL_ID, context); CAPIGatewayIngressRequest capiSyncRequest = new CAPIGatewayIngressRequest(CB_URL, CAPIG_ACCESS_KEY); eventRequest.setCustomEndpoint(capiSyncRequest); eventRequest.addDataItem(testEvent); eventRequest.execute();
$api = Api::init(null, null, $this->access_token); $api->setLogger(new CurlLogger()); $event_request = new EventRequest($this->pixel_id); $capiIngressRequest = new CAPIGatewayIngressRequest($this->cb_url, $this->access_key); $event_request->setCustomEndpoint($capiIngressRequest); $user_data = (new UserData()) ->setEmails(array('joe@eg.com')) ->setPhones(array('12345678901', '14251234567')) ->setFbc('fb.1.1554763741205.AbCdEfGhIjKlMnOpQrStUvWxYz1234567890') ->setFbp('fb.1.1558571054389.1098115397'); $event1 = (new Event()) ->setEventName('Purchase') ->setEventId('125') ->setEventTime(time()) ->setEventSourceUrl('http://jaspers-market.com/product/123') ->setUserData($user_data); $events = array($event1, $event2); $event_request->setEvents($events); $response = $event_request->execute(); print($response->__toString());
EventRequest eventRequest = new EventRequest(PIXEL_ID, context); UserData userData = new UserData() .email("abc@eg.com"); CAPIGatewayIngressRequest capiSyncRequest = new CAPIGatewayIngressRequest(CB_URL, CAPIG_ACCESS_KEY); eventRequest.setCustomEndpoint(capiSyncRequest); Event testEvent = new Event(); testEvent.eventId("125").eventName("Purchase") .eventTime(System.currentTimeMillis() / 1000L) .userData(userData) .dataProcessingOptions(new String[]{}).setEventId("134423232"); eventRequest.namespaceId("11") .uploadId("22222") .uploadTag("upload-tag-4") .uploadSource("upload-source-4") .testEventCode("test-event-code-5") .partnerAgent("partner-agent-6"); eventRequest.addDataItem(testEvent); eventRequest.execute();
$api = Api::init(null, null, $this->access_token); $api->setLogger(new CurlLogger()); $event_request = new EventRequestAsync($this->pixel_id); $capiIngressRequest = new CAPIGatewayIngressRequest($this->cb_url, $this->access_key); $capiIngressRequest->setSendToDestinationOnly(true); $event_request->setCustomEndpoint($capiIngressRequest); $event1 = (new Event()) ->setEventName('test Async Event') ->setEventId('134423232') ->setEventTime(time()) ->setEventSourceUrl('http://jaspers-market.com/product/123'); $events = array($event1, $event2); $event_request->setEvents($events); $response = $event_request->execute()->wait();
EventRequest eventRequest = new EventRequest(PIXEL_ID, context); UserData userData = new UserData() .email("abc@eg.com"); CAPIGatewayIngressRequest capiSyncRequest = new CAPIGatewayIngressRequest(CB_URL, CAPIG_ACCESS_KEY); capiSyncRequest.setSendToDestinationOnly(true); eventRequest.setCustomEndpoint(capiSyncRequest); Event testEvent = new Event(); testEvent.eventName("test Async Event") .eventTime(System.currentTimeMillis() / 1000L) .userData(userData) .dataProcessingOptions(new String[]{}).setEventId("134423232"); eventRequest.namespaceId("11222") .uploadId("22222") .uploadTag("upload-tag-4") .uploadSource("upload-source-4") .testEventCode("test-event-code-5") .partnerAgent("partner-agent-6"); eventRequest.addDataItem(testEvent); eventRequest.executeAsync();
lass APIFilter implements Filter { public function shouldSendEvent(Event $event): bool { if ($event->getEventId() === '125') { return false; } return true; } } $capiIngressRequest = new CAPIGatewayIngressRequest($this->cb_url, $this->access_key); $event_request->setCustomEndpoint($capiIngressRequest); $capiIngressRequest->setFilter(new APIFilter());
CAPIGatewayIngressRequest capiSyncRequest = new CAPIGatewayIngressRequest(CB_URL, CAPIG_ACCESS_KEY); eventRequest.setCustomEndpoint(capiSyncRequest); capiSyncRequest.setFilter(new CustomEndpointRequest.Filter() { @Override public boolean shouldSendEvent(Event event) { if (event.getEventId().equals("125")) { return true; } return false; } });