## Targeting Set JSON Schema

### Fields
- **adProductId** (integer, required): The ad product ID.
- **name** (string, required): The name of the targeting set.
- **enabled** (boolean, required): Whether the targeting set is enabled. Only enabled targeting sets are considered when calculating and displaying results.
- **priorityId** (integer | null): The ID of the priority. It is required when the targeting set is enabled.
- **rate** (object | null): The rate at which the advertiser pays you. It is required when the targeting set is enabled.
  - **rateType** (number, required): The field used to estimate the revenue you have made from your advertisers. Supported rate types:
    - 1: Flat
    - 2: CPM
    - 3: CPC
  - **price** (number, required): The amount being paid.
- **keywordTargeting** (string | null): Custom keyword targeting rules. See [Keyword Logic](https://dev.kevel.com/docs/keyword-logic).
- **frequencyCap** (object | null): Configuration for limiting ad frequency to users.
  - **type** (integer, required): Time unit for the frequency cap. Possible values:
    - 1: Hour
    - 2: Day
    - 3: Minute
  - **duration** (integer, required): Number of time units for the cap period.
  - **value** (integer, required): Maximum number of impressions allowed within the duration.
- **siteZoneTargeting** (array of objects | null): Specific site or zone targeting rules.
- **geoTargeting** (array of objects | null): Geographic targeting rules. Details:
  - **CountryCode** (string, required): Two-character country code.
  - **Region** (string): Two-character code for the state, region, or province.
  - **MetroCode** (string): Metro code (e.g., ZIP code).
  - **IsExclude** (boolean): True to exclude, false to target.
- **distanceTargeting** (array of objects | null): Distance-based geographic targeting rules.
  - **distance** (number, required): Radius distance in kilometers.
  - **latitude** (number, required): Latitude of center point.
  - **longitude** (number, required): Longitude of center point.
- **customTargeting** (string | null): Custom targeting string.
- **duplicateMode** (integer | null): Enables no duplicates, defining the duplicate mode type:
    - 1: Flight
    - 2: Campaign
    - 3: Advertiser
    - 4: Creative
- **adTypes** (array of strings): Ad type IDs required if targeting set is enabled.
- **searchTerms** (array of objects | null): Search term targeting rules.
  - **term** (string, required): Search term to match against.
  - **matchType** (string, required): How the term matches against the ad request's search term. Possible values:
    - broad
    - strict
    - exact
  - **isExclude** (boolean): Exclude or include matching requests.
- **bidModifiers** (array of objects | null): Bid modifiers for effective price adjustments on matching ad requests.
  - **match** (object, required): Conditions for applying the bid modifier.
  - **price** (number | null): Fixed effective price when this modifier applies.
  - **multiplier** (number | null): Factor applied to flight's price when this modifier applies.

### Example Payload
```json
{
  "name": "Awesome targeting set",
  "enabled": true,
  "priorityId": 221170,
  "rate": {
    "rateType": 1,
    "price": 100
  },
  "keywordTargeting": "keyword1,keyword2\nkeyword3\n!keyword1,keyword2",
  "frequencyCap": {
    "type": 2,
    "duration": 1,
    "value": 5
  },
  "siteZoneTargeting": [null, null],
  "geoTargeting": [{
    "CountryCode": "US",
    "Region": "NY",
    "MetroCode": "10001",
    "IsExclude": true
  }],
  "distanceTargeting": [{
    "distance": 20,
    "latitude": 41.40338,
    "longitude": 2.17403
  }],
  "customTargeting": "[\"order_confirmation\"] contains screen",
  "duplicateMode": 1,
  "adTypes": [4649],
  "searchTerms": [{
    "term": "running shoes",
    "matchType": "broad",
    "isExclude": false
  }],
  "bidModifiers": [{
    "match": {
      "Keyword": "string",
      "Site": 0,
      "Zone": 0,
      "Segment": 0,
      "SearchTerm": {"Term": "string"}
    },
    "price": 7.5,
    "multiplier": 1.5
  }]
}
```
