--- title: "Product Yahoo Conversion API" slug: "product-yahoo-conversion-api" updated: 2026-09-04T16:23:44Z published: 2026-09-04T16:24:19Z canonical: "help.yahooinc.com/product-yahoo-conversion-api" --- > ## Documentation Index > Fetch the complete documentation index at: https://help.yahooinc.com/llms.txt > Use this file to discover all available pages before exploring further. # Product Yahoo Conversion API The product level integration to the Yahoo Conversion API (CAPI) can be used to send transaction data for campaign measurement, attribution and optimization using Yahoo In-Flight Outcomes (IFO). Transaction data includes product ID, product quantity, dollar amount and other conversion-related attributes. The end-to-end process for activating against CAPI works as follows: 1. [Deliver a Product Catalog via s3 to the Yahoo Partner Data Store (PDS)](/dsp-api/docs/product-yahoo-conversion-api#deliver-product-catalog-through-s3partner-data-store-pds). 2. [Create authentication credentials via an OAuth 2.0 connection](/dsp-api/docs/product-yahoo-conversion-api#oauth-20-authentication) and Yahoo enables the seat for IFO. 3. [Create a Pixel ID and set as the default pixel for IFO Conversions](/dsp-api/docs/product-yahoo-conversion-api#create-a-pixel-id-yp-id-and-set-as-the-default-pixel-for-ifo-conversions). 4. Send Transaction data via the CAPI spec. Transaction Data can be shared in one of the following ways. These endpoints support sending transaction data via CAPI (preferred method) or sending transaction data using multiple methods (for example, online data via DOT JS Pixel (Browser to Server) and/or offline data via CAPI (Server to Server). - [Conversions via DOT JS Pixel (Browser to Server)](/dsp-api/docs/transaction-data-delivery-through-browser-to-server): Send online transaction data, including product codes for individual transactions, using your existing pixel credentials. - [CAPI (Server to Server)](/dsp-api/docs/product-yahoo-conversion-api#transaction-data-delivery-through-server-to-server): Send transaction data using your existing pixel credentials to track individual transactions. 5. Work with the Yahoo Account Team to finalize the catalog and attribution rules in the Yahoo DSP. ## Deliver Product Catalog Through S3/Partner Data Store (PDS) Deliver the product catalog to the Yahoo S3 endpoint, which is updated on a recurring basis (preferably daily). This catalog contains a 3-level product hierarchy that users can search and select from the DSP UI when creating IFO rules. It includes the exact product IDs/SKUs provided in the sales data feed, ensuring precise tracking and accurate attribution of product-level sales transactions. > [!TIP] > Example Catalog and Yahoo DSP Rule Structure: > > Advertiser: Coca-Cola Company > > >High Brand: Coca-Cola > > >Low Brand: Coca-Cola Zero Sugar > > >Product ID: 049000042559 The following section details the high- level architecture and steps to set up delivery of product catalog data to Yahoo. ### Architecture and Data Flow ![](https://cdn.us.document360.io/098e3080-9ea6-4eb4-acdb-13b988f387a2/Images/Documentation/pds-product_catalog_data_flow_s3.png?sv=2026-02-06&spr=https&st=2026-11-11T11%3A25%3A34Z&se=2026-11-11T12%3A25%3A34Z&sr=c&sp=r&sig=79BRh3mwmzd5wjrXMGKmChsjGU%2BG3qVmUzqgynLJ%2BIA%3D) ### File Format and Contents File Type: Tab delimited gzip/bzip2 file. File Schema: Product ID, Product Owner, Product Brand, Product Name, Partner Attributes Data type: STRING for all columns. | Column Name (not case sensitive) | Required (Yes/No) | Rule UI Naming | Description | | --- | --- | --- | --- | | Product ID | Yes | Product ID | Unique ID that identifies a UPC or SKU. | | Product Owner | Yes | Advertiser | Brand name of the product owner. For example, Coca-Cola Corporation. | | Product Brand | Yes | High Brand | Brand family that the product/upc belongs to. For example, Coca-Cola. If the product/upc does not have a brand, this field should be populated as NA. | | Product Name | Yes | Low Brand | Descriptive name of the Product. For example, Coca-Cola Zero Sugar. | | Category | No | Category | Descriptive category of the product. For example, Soft Drinks. | | Subcategory | No | Sub Category | Descriptive subcategory of the product. For example, Diet Soft Drinks. | #### File format and Contents of “_manifest” The unit of the file size is “byte”. <.schema size><.schema> --- delimited ... #### File format and Contents of “<.schema>” The schema file, <.schema>, could be either of the following two formats: 1. A Pig header file, ”.pig_header”, in CSV column header format with extended data type support: - [,]{*} - Supported data types: [http://pig.apache.org/docs/latest/basic.html#data-types](http://pig.apache.org/docs/latest/basic.html#data-types) - [https://pig.apache.org/docs/r0.17.0/api/constant-values.html#org.apache.pig.data.DataType](https://pig.apache.org/docs/r0.17.0/api/constant-values.html#org.apache.pig.data.DataType) 2. The standard Apache Pig schema file, “.pig_schema”, in JSON file format. ### Requirements from Data Provider Please provide the following to allow for load estimation of the data to be sent: 1. Upload frequency (daily or hourly) 2. Number of files per batch upload and their size after compression, .bz2 preferred. 3. Projected data volume per day Load data into your S3 bucket and provide necessary access to Yahoo, or upload data to a Yahoo S3 bucket. If using a Yahoo S3 bucket to deliver the data, Yahoo will need the public IP address ranges (in the form of IP CIDRs) of the hosts from which the data provider will upload files to the S3 location provided. A sample IP range list: "188.12.111.0/24, 188.12.112.0/30, 198.11.23.23/30". ### High-Level Guidelines: Privacy, Security and Performance The following are best practices for sharing data via S3: 1. Do not send data for opted out users. 2. Protect S3 bucket/location with security policy, such as 1. Disable public access 2. Enforce HTTPS (TLS1.2 or above) connection 3. Enable server side encryption (SSE-S3) with cypher key rotation at least every 12 months. 3. Group files by feed types and day/hour and upload them to folders named by feed types and date/time. Refer to Directory Layout and File Format. 4. Limit the file size to around 1 GB (after .bz2 compressed) 1. For small data sets, limit the number of files to under 5 per hour. 5. Avoid many small files. 6. Support credential rotation: annually or in need. 7. Secrets—for example, credentials—should be delivered in encrypted format: GPG public key to be provided by the receiver of the credentials. Refer to [Sharing Secrets with External Partners using GPG](/dsp-api/docs/product-yahoo-conversion-api#sharing-secrets-with-external-partners-using-gpg). #### Directory Layout and File Format s3:///<3p-m>/product_catalog/yyyyMMdd[/hh] _manifest -- upload this after all other files are uploaded <.schema> --- data file; TAB, ‘\t’, delimited ... **Pig Data Types** | **Simple Types in .pig_header** | **Constant Value in .pig_schema** | **Description** | **Example** | | --- | --- | --- | --- | | [INT](https://pig.apache.org/docs/latest/api/org/apache/pig/data/DataType.html#INTEGER) | 10 | Signed 32-bit integer | 10 | | [LONG](https://pig.apache.org/docs/latest/api/org/apache/pig/data/DataType.html#LONG) | 15 | Signed 64-bit integer | Data: 10L or 10l Display: 10L | | [FLOAT](https://pig.apache.org/docs/latest/api/org/apache/pig/data/DataType.html#FLOAT) | 20 | 32-bit floating point | Data: 10.5F or 10.5f or 10.5e2f or 10.5E2F Display: 10.5F or 1050.0F | | [DOUBLE](https://pig.apache.org/docs/latest/api/org/apache/pig/data/DataType.html#DOUBLE) | 25 | 64-bit floating point | Data: 10.5 or 10.5e2 or 10.5E2 Display: 10.5 or 1050.0 | | [CHARARRAY](https://pig.apache.org/docs/latest/api/org/apache/pig/data/DataType.html#CHARARRAY) | 55 | Character array (string) in Unicode UTF-8 format | hello world | | [BYTEARRAY](https://pig.apache.org/docs/latest/api/org/apache/pig/data/DataType.html#BYTEARRAY) | 50 | Byte array (blob) | | | [BOOLEAN](https://pig.apache.org/docs/latest/api/org/apache/pig/data/DataType.html#BOOLEAN) | 5 | boolean | true/false (case insensitive) | | [DATETIME](https://pig.apache.org/docs/latest/api/org/apache/pig/data/DataType.html#DATETIME) | 30 | datetime | 1970-01-01T00:00:00.000+00:00 | | [BIGINTEGER](https://pig.apache.org/docs/latest/api/org/apache/pig/data/DataType.html#BIGINTEGER) | 65 | Java BigInteger | 200000000000 | | [BIGDECIMAL](https://pig.apache.org/docs/latest/api/org/apache/pig/data/DataType.html#BIGDECIMAL) | 70 | Java BigDecimal | 33.45678332 | #### Contacts of Operational alerts _s3_feed_alerts@.com #### Sharing Secrets with External Partners using GPG **Background** This document describes how company A, the secret sender, can share secrets with company B, the secret recipient, over the internet securely with GPG encryption. In a nutshell, 1. Company B uses GPG to generate a pair of public key, b_armor.pub, and private key, b_armor. 1. Company B needs to provide a password, password_B, in generating the public/private keys. 2. Company B will need this password in decrypting the encrypted secret from company A. 2. Company B emails b_armor.pub to company A. 3. Company A uses b_armor.pub to encrypt the secret, and emails the encrypted blob to company B. 4. The company B uses b_armor (and password_B when prompted) to decrypt the encrypted blob. **Detailed Steps** 1. Company A requests company B to generate (if not yet) and export their GPG public key. Company B follows instruction here: [https://kb.iu.edu/d/awio](https://kb.iu.edu/d/awio) 1. Generate a key, assume company B’s email address is: “b_poc@b.com” 1. gpg --gen-key 1. Choose “(1) RSA and RSA (default)” 2. Key length: 2048 3. Expire in 2 weeks: 2w 4. Full Name 5. Email address: b_poc@b.com 6. Comment: GPG key w/ company A 7. Enter passphrase: (company B need in decrypting the secret) 2. gpg -o b_armor.pub -a --export b_poc@b.com 3. Company B emails “b_armor.pub” as attachment to company A. 2. Company A imports company B’s public key 1. gpg --import “b_armor.pub” 3. Company A puts secrets in “my_secret.txt” and encrypt it using b_armor.pub identified as “b_poc@b.com” 1. gpg -o my_secret_armor.txt -a -e -r b_poc@b.com my_secret.txt 4. Company A emails “my_secret_armor.txt” as attachment to company B. ## Create a Pixel ID (yp ID) and set as the Default Pixel for IFO Conversions > [!WARNING] > Important > > In regards to multi-advertiser integrations, multiple advertisers will have different pixel IDs belonging to the same multi-vendor integration owner. Contact your Yahoo Account team for further details. ### Create a New Pixel and Assign It as the Default Pixel 1. Under your advertiser in the DSP, navigate to the **Tracking** tab. 2. Click **Create New** and **Pixel**. The unique pixel ID is generated. 3. Copy the pixel ID from this newly created pixel to use in the POST endpoint. ***Do not use this pixel code for website tracking.*** ![](https://cdn.us.document360.io/098e3080-9ea6-4eb4-acdb-13b988f387a2/Images/Documentation/dsp-create-pixel-id(1).png?sv=2026-02-06&spr=https&st=2026-11-11T11%3A25%3A34Z&se=2026-11-11T12%3A25%3A34Z&sr=c&sp=r&sig=79BRh3mwmzd5wjrXMGKmChsjGU%2BG3qVmUzqgynLJ%2BIA%3D) 4. Reach out to the Yahoo Account Team to set the pixel as the default pixel for the IFO conversions. ## Transaction Data Delivery Through Server to Server The specification shown below identifies the key components of the CAPI request, including the POST url for the batch conversions endpoint, header types and the POST body. ### Endpoint #### Batch Conversions Endpoint This is the default endpoint for all integrations. ```plaintext POST https://batch.datax.yahoo.com/v1/events/ ``` ### Headers ```json Content-Type: application/json Accept: application/json Authorization: Bearer ``` ### POST body - JSON keys #### Required and supported fields The required fields for a successful JSON body POST are described in the table below. Normalize all values to lower case. > [!NOTE] > Note > > CAPI supports multiple identity keys, the “userData” fields listed in the table below, to match the event. Multiple keys can be sent to improve match rates. One or more device IDs, email addresses, phone numbers or Partner Match IDs (pxid) are required. | **Field** | **Type** | **Required/Optional** | **Description** | | --- | --- | --- | --- | | eventName | Enum | Required | The type of conversion/action that triggers the event. Supported values include: - purchase | | eventId | String | Required | The custom external id for the transaction event used for identifying the digital event. This should be a unique value. If the ID is not unique, duplicate events will be dropped. | | eventTs | Integer | Required | The timestamp of the event in either seconds or milliseconds. For example,1746558464. | | actionSource | Enum | Required | The digital or physical source of the event. For example, web, app, phone, email, online, physical_store. | | actionSourceUrl | String | Optional | The URL of the website where the conversion occurred. Null in case of some actionSources, such as phone or physical_store. | | country | String | Optional | Two characters. For example, US. | | region | String | Optional | For example, APAC, NA, EMEA, LATAM or ROW. | | userData | Object | Required. | The wrapper object for all user data. At least one ID must be provided or clickData must be included. | | userData.email | List | Optional | SHA256 hashed email addresses. | | userData.phone | List | Optional | SHA256 hashed phone numbers. | | userData.gpsaid | List | Optional | The Android advertising ID. | | userData.idfa | List | Optional | The Apple advertising ID. | | userData.pxid | List | Optional | 3rd party external identifier. Format: pxIdSrcId + ‘:’ + pxIdValue. Provider source ID will be provided by Yahoo to the advertiser. | | userData.sid | List | Optional | Yahoo Native identifier. Raw id. | | userData.bid | List | Optional | Yahoo Native identifier. Raw id. | | userData.ip_address | String | Optional | The IP address of the user's device. Not hashed. | | userData.userAgent | String | Optional | The HTTP header passed by the browser. | | privacy | Object | Required if sending data for any field within the order object is needed. | The wrapper object for all privacy data. | | privacy.privacy_type | Enum/String | Required | Determines the applicable privacy regulation or mode. Must be set to one of: - `GPP`: Global Privacy Platform - `GDPR`: EU General Data protection regulation (TCF) - `OPTOUT`: attribution-only mode. Excludes user for optimization and does not include consent strings. | | privacy.consent_string | String | Required if privacy_type= GPP or GDPR Forbidden if privacy_type=OPTOUT | The consent string representing the user’s privacy preferences. - For GPP, send a valid GPP string - For GDPR, send a valid TCF string | | privacy.gpp_sid | List | Required if privacy_type=GPP | List of GPP section IDs that are active in the consent string. Each number corresponds to a privacy section as defined by the [IAB Tech Lab](https://github.com/InteractiveAdvertisingBureau/Global-Privacy-Platform/blob/main/Sections/Section%20Information.md). | | eventData | Object | Required | The wrapper object for commerce event data. | | eventData.price | Number | Optional | The numerical value of any given conversion. - By default, the value is assumed to be USD. | | eventData.currency | String | Optional | The ISO 4217 code of currency corresponding to price, null is unknown. | | eventData.products | Array | Required | The list of product(s) included in the event. This includes details on a product’s ID, name, brand, quantity, unit price, category and subcategory. - quantity=1 at default if not defined. For example, products : { id : string, name : string, brand : string, quantity : integer, unitPrice : number, category : string, subCategory : string, customKeyValues : map } | | eventData.customKeyValues | Map | Optional | Custom key value pairs. | | eventData.customKeyValues.isTestEvent | String | Optional | Used to signify test event(s). When set to `true`, CAPI will return API response code, but drop event(s) from downstream production. Must be used in eventData.customKeyValues. | #### Sample Without Privacy Object ```json [  {    "eventName": "addToCart",    "eventId": "event1",    "eventTs": 1713545795,    "actionSource": "web",    "actionSourceUrl": "http://store.com",    "country": "US",    "region": "NA",    "userData": {       "email" : [ "email1_hash", "email2_hash" ],       "gpsaid" : ["gpsaid_hash"],       "phone" : ["phone_hash","phone2_hash"],       "pxid" : ["pxid_key:pxid_value"],       "ip_address" : "clientIp",       "userAgent" : "Y Browser"    },    "eventData": {      "price": 1.22,      "currency": "USD",      "products" : [        {          "id": "abc1",          "name": "duck",          "brand": "Rubber",          "quantity": 2,          "unitPrice": 0.11,          "category": "bath",          "subCategory": "toys",          "customKeyValues" : {              "vendorModel" : "abc"          }        },{            "id": "abc2",          "name": "rake",          "brand": "Wood",          "unitPrice": 1.0,          "category": "garden",          "subCategory": "tools"        }      ],      "customKeyValues" : {          "orderId": "order1",          "promo": "abc1",          "store": "store1"      }    }  } ] ``` #### Sample With Privacy Object ```json [  {    "eventName": "addToCart",    "eventId": "event1",    "eventTs": 1713545795,    "actionSource": "web",    "actionSourceUrl": "http://store.com",    "country": "US",    "region": "NA",    "userData": {       "email" : [ "email1_hash", "email2_hash" ],       "gpsaid" : ["gpsaid_hash"],       "phone" : ["phone_hash","phone2_hash"],       "pxid" : ["pxid_key:pxid_value"],       "ip_address" : "clientIp",       "userAgent" : "Y Browser"    },    "privacy" : {      "privacy_type": “OPTOUT”    },    "eventData": {      "price": 1.22,      "currency": "USD",      "products" : [        {          "id": "abc1",          "name": "duck",          "brand": "Rubber",          "quantity": 2,          "unitPrice": 0.11,          "category": "bath",          "subCategory": "toys",          "customKeyValues" : {              "vendorModel" : "abc"          }        },{            "id": "abc2",          "name": "rake",          "brand": "Wood",          "unitPrice": 1.0,          "category": "garden",          "subCategory": "tools"        }      ],      "customKeyValues" : {          "orderId": "order1",          "promo": "abc1",          "store": "store1"      }    }  } ] ``` ## OAuth 2.0 Authentication CAPI is a server-to-server implementation that requires OAuth 2.0 authentication before any data can be posted to Yahoo Ad Tech servers. OAuth 2.0 is a mechanism that relies on continuously refreshing authentication tokens. Clients are providing those tokens during the posting of data. > [!WARNING] > Important > > Yahoo does not support OAuth 1.0, which depends on static tokens. [Step 1 Request Client Credentials](/dsp-api/docs/product-yahoo-conversion-api#request-client-credentials) [Step 2 Generate the JSON Web Token (JWT)](/dsp-api/docs/product-yahoo-conversion-api#generating-json-web-token-jwt) [Step 3 Complete the Post-Credential OAuth 2.0 Workflow](/dsp-api/docs/product-yahoo-conversion-api#postcredential-oauth-20-workflow) [Step 4 Use Access Token to Call CAPI Endpoint](/dsp-api/docs/product-yahoo-conversion-api#use-access-token-to-call-capi-endpoint) ### Request Client Credentials > [!NOTE] > Note > > Requesting client credentials includes an internal allowlist approval process that may require additional time for the setup to be completed. To complete the steps below, you first need a **Client ID** and a **Client Secret**. Follow the steps outlined below to request them. 1. Generate a private key. ```plaintext >> openssl genpkey -aes256 -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -out private_key.pem ``` 2. Generate a public key using the above private key. ```plaintext >> openssl rsa -in private_key.pem -out public_key.pem -outform PEM -pubout ``` 3. Send the public key to the Yahoo Account Team. 4. Yahoo will then send a file containing credentials encrypted with the above public key for you to use. 5. Decrypt the file with the private key. ```plaintext >> openssl rsautl -decrypt -inkey private_key.pem -in credential.enc -out my_credentials.txt ``` ### Generating JSON Web Token (JWT) The JSON Web Token is composed of three main parts: - Header: normalized structure specifying how the token is signed (generally using the HMAC SHA-256 algorithm). - Free set of claims embedding whatever you want: client_id, aud, expiration date, etc. - Signature ensuring data integrity. The signature mechanism is HMAC_SHA256 as defined by the JOSE specifications: ```plaintext https://tools.ietf.org/html/draft-ietf-jose-json-web-signature-31 ``` ```plaintext JWT Header { "alg": "HS256", "typ": "JWT" } JWT Claims { "aud": "https://id.b2b.yahooincapis.com/zts/v1", "iss": "{client_id}", "sub": "{client_id}", "exp": {expiry time in seconds}, "iat": {issued time in seconds}, "jti": "{UUID}" } ``` Note the following: - “exp” and “iat” values should be numeric. Do not set them as strings. - “exp” value is currentTime + 3600 (i.e. 60 minutes). - Don’t use currentTime + (`24 * 60 * 60`). You may get a “JWT has expired or is not valid” error. - UUID - A Universally Unique IDentifier, https://www.ietf.org/rfc/rfc4122.txt ### Walking through manual steps to build this JWT value ```plaintext jwt_signing_string = base64url_encode(jwt_header) + '.' + base64url_encode(jwt_body) jwt_signature = base64url_encode(hmac_sha256(jwt_signing_string, client_secret)) JWT = jwt_signing_string + '.' + jwt_signature ``` JWT libraries can be found at [https://openid.net/developers/libraries/.](https://openid.net/developers/libraries/.) ### Post-Credential OAuth 2.0 Workflow Start the workflow after the encrypted credentials are received from the Yahoo Account Team. 1. Call the ID B2B server to get the access_token, which is valid for 60 minutes. 2. Call the `POST /zts/v1/oauth2/token` endpoint of ID B2B with the JWT token created out of the provided client_id and the client credential. #### Sample Request ```plaintext curl -X POST 'https://id.b2b.yahooincapis.com/zts/v1/oauth2/token' \ -H 'Content-Type: application/x-www-form-urlencoded' \ --data-urlencode 'grant_type=client_credentials' \ --data-urlencode 'client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer' \ --data-urlencode 'client_assertion=' \ --data-urlencode 'scope=idb2b.dsp.datax:role.conversion.writer' \ --data-urlencode 'realm=dataxonline' ``` #### Sample Response ```json {  "access_token": "eyJraWQiOiJpZGIyYi56dHMuZWMudXMtZWFzdC0xLjAiLCJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiJ9.eyJzdWIiOiJpZGIyYi5kc3AuZGF0YXguZDYxYTJkNzUtYTUyNy00M2E2LWI4MjYtYmI5Nzc3MGRiZDc5Iiwic2NwIjpbImNvbnZlcnNpb24ud3JpdGVyIl0sInZlciI6MSwiaXNzIjoiaHR0cHM6Ly9pZC5iMmIueWFob29pbmNhcGlzLmNvbS96dHMvdjEiLCJjbGllbnRfaWQiOiJpZGIyYi5kc3AuZGF0YXguZDYxYTJkNzUtYTUyNy00M2E2LWI4MjYtYmI5Nzc3MGRiZDc5IiwiYXVkIjoiaWRiMmIuZHNwLmRhdGF4IiwidWlkIjoiaWRiMmIuZHNwLmRhdGF4LmQ2MWEyZDc1LWE1MjctNDNhNi1iODI2LWJiOTc3NzBkYmQ3OSIsImF1dGhfdGltZSI6MTc3MzY4OTQ5NCwic2NvcGUiOiJjb252ZXJzaW9uLndyaXRlciIsImV4cCI6MTc3MzcxMTA5NCwiaWF0IjoxNzczNjg5NDk0LCJqdGkiOiI4MDc5MzA0My1hZjAwLTQ5N2EtOWZmMy1iM2Q3YmVmNmVjYTQifQ.7UimvFh72DwA9WpVVhlvk7Ks1wXnT37IFihi9KTGjWPHVgc0vS2WSGus0kpI927uxTSwfVDlCLYrKZYSJUay2A",      "token_type": "Bearer",      "expires_in": 3599 } ``` ### Use Access Token to Call CAPI Endpoint Call the CAPI endpoint with the access_token in the Authorization header. The API will verify the client access_token and identify the client and determine whether it is authorized for the pixel ID. #### Sample Request ```json curl -X POST \    https://batch.datax.yahoo.com:443/v1/events/123456 \    -H 'authorization: Bearer 9f4c74cf-5bb9-45ce-987c-e5240e5710b8' \    -H 'cache-control: no-cache' \    -H 'content-type: application/json' \    -d '[ {    "eventName": "PURCHASE",    "eventId": "4CE3F5FD-B203-45EA-98BE-79FB28E92DF5",    "eventTs": 1733508168,    "actionSource": "web",    "actionSourceUrl": "http://store.com",    "country": "US",    "region": "NA",    "userData": {        "email": [            "536a09742acb5b4ec7c7d6c0e20a5d3f4318817817353b69f8ee15f27d3fc9fa",            "7ebd20af4a7ff32eb6331c108cb1aa2176c195f7f1b472fc7ebfd2051f89f8a1"        ],        "gpsaid": [            "c2f11fe5-3600-4ade-901e-5cf84f2d71a5"        ],        "phone": [            "1036636844eea8b0c54623eee63eb5d83ad5b86c02cfa7a8da29a3c140c9b100",            "f4ef23f72996f81f2bbc90929eb7d1e6397cba597cbbd70b5afa717ad41e500f"        ],        "pxid": [            "999:XY50038zETeXJBOYNTRn7Z3T6VSkxDF5ZpRz3wvPEVmt1ZXHo"        ],        "userAgent": "Y Browser",        "ip_address" : "1.2.3.4"    },    "eventData": {      "price": 1.22,      "currency": "USD",      "products" : [        {          "id": "abc1",          "name": "duck",          "brand": "Rubber",          "quantity": 2,          "unitPrice": 0.11,          "category": "bath",          "subCategory": "toys",          "customKeyValues" : {              "vendorModel" : "abc"          }        },{            "id": "abc2",          "name": "rake",          "brand": "Wood",          "unitPrice": 1.0,          "category": "garden",          "subCategory": "tools"        }      ],      "customKeyValues" : {          "orderId": "order1",          "promo": "abc1",          "store": "store1"      }    } } ]' ``` #### Sample Response ```json {  "success": "COMPLETE" } ``` ## Rate Limitation A rate limit is the number of events that are allowed within an API call an advertiser can make within a given period. For the batch endpoint, the 2 rate limits are: 1. 200 requests per second 2. 10MB of data per second ### Error Responses The following return codes can come back in response. | Code | Message | Reason | | --- | --- | --- | | 200 | JSON: { success: "COMPLETE" } | Valid request. | | 200 | JSON: { success: "PARTIAL", message: "{ = }" } | Submission included invalid events and so partially ingested. The returned success field is marked as partial and the message field contains the breakdown of error types and their respective counts. | | 400 | Error. Unsupported Content-Type. | Invalid Content-Type provided. | | 400 | Error. Missing body and no query parameters provided. | Missing query params and body. | | 400 | Error. Request body/params formatting error. | Unable to parse request body/params. Failed to decode KVs in request body. Failed to decode KVs in query params. | | 400 | { "message" : "Missing Conversion Event metadata eventTs in request", "error_code" : "DXOL400_MISSING_EVENT_TS_IN_REQUEST"} | Missing eventTs field in request | | 400 | { "message" : "Missing Conversion Event metadata eventName in request", "error_code" : "DXOL400_MISSING_EVENT_METADATA_IN_REQUEST"} | eventName field is missing or empty | | 400 | { "message" : "Encountered unexpected eventTs value.", "error_code" : "DXOL400_INVALID_EVENT_TS_FIELD"} | Invalid eventTs, either a future timestamp or older than 30 days | | 400 | { "message" : "Pxid must have pxIdSrcId + ‘:’ + pxIdValue format", "error_code" : "DXOL400_BAD_PXID_FORMAT_IN_REQUEST"} | PXID should be passed as : format | | 400 | { "message" : "Encountered unexpected clickData field in the event data unable to apply.", "error_code" : "DXOL400_UNEXPECTED_EVENT_CLICKDATA_FIELD"} | clickData is not expected for product events | | 400 | { "message" : "Encountered unexpected clickData field in the event data unable to apply.", "error_code" : "DXOL400_UNEXPECTED_EVENT_CLICKDATA_FIELD"} | clickData is not expected for product events | | 400 | GPP_STRING_MISSING_SECTION | Returned if privacy_type is GPP but provided gpp_sid section id is not found in the consent_string. | | 400 | INCORRECT_NUMBER_SECTION_IDS | Returned if privacy_type is GPP but provided gpp_sid contains more than 2 section ids. | | 400 | INVALID_GDPR_CONSENT_STRING | Returned if privacy_type is GDPR but consent_string cannot be decoded. | | 400 | INVALID_GPP_CONSENT_STRING | Returned if privacy_type is GPP but consent_string cannot be decoded. | | 400 | INVALID_GPP_SECTION_IDS | Returned if privacy_type is GPP but provided gpp_sid is not supported. | | 400 | INVALID_PRIVACY_TYPE | Returned if privacy_type is missing when consent_string is provided, or if privacy_type is not GPP or GDPR. | | 400 | MISSING_CONSENT_STRING | Returned if privacy_type is present but consent_string is missing. | | 400 | MISSING_GPP_SIDS | Returned if privacy_type is GPP but gpp_sid is missing. | | 401 | Error. Invalid ‘Authorization’ HTTP Header. Request a new token. (Not enforced in initial release) | Invalid Authorization token. | | 429 | Request is rate limited. | | | 500 | Internal Server Error | | | 502 | External Server Error | An external call failed during serving the query. |