Create Tactic
Once you have a campaign and line item, you must create a tactic in order to buy impressions
A Tactic in Life is a reusable, configurable step that defines how and when to send a specific message or perform an action within a workflow. Each Tactic encapsulates its targeting rules, content payload, and delivery logic. Tactics are designed to be chained together into larger strategies or flows, while still remaining independently testable, measurable, and reusable across campaigns. In practice, a Tactic represents the smallest actionable unit of messaging logic that the Life platform can execute.
Tactics have dozens of targeting options. We will be rolling out these targeting options over a period of months to be available to use within the API.
Endpoint
POST
https://lifeapi.pulsepoint.com/RestApi/v2/account/{accountId}/tactics
Path Parameters
| Name | Data Type | Notes |
|---|---|---|
| account_id | integer | The account ID you are creating tactics under |
Request Field List
tactics
| Name | Data Type | Required | Default | Notes |
|---|---|---|---|---|
| lineItemId | integer | yes | The ID of the line item associated with this tactic. | |
| name | string | yes | ||
| description | string | no | ||
| enabled | boolean | no | true | Whether you want the tactic to be enabled or disabled upon creation |
| baseBidPrice | number | no | 1.00 | The base bid price for the tactic. Must be less than or equal to Max Bid Price. |
| maxBidPrice | number | no | 50 | The maximum bid price for the tactic. Must be greater than or equal to Base Bid Price. |
| customFieldSettings | object | conditional | If you have a mandatory custom field setting in Life at the tactic level, this object will be mandatory. Otherwise, this object is optional. | |
| budgetDistribution | object | no | Dollars | How you want to allocate spend across tactics. This object allows you to set the values across tactics. |
| maxSpendPerTactic | object | no | An optional setting allowing the user to define an amount the tactic cannot spend more than over a given period of time | |
| managementFee | object | no | An override option if you only want to apply a management fee to some tactics and not others | |
| mediaOptimization | object | no | ||
| frequencyCap | object | no | An override option if you want to have a different frequency cap at the tactic level | |
| creativeAssignments | array of objects | no | While this object isn't required for creating a tactic, it will not serve without at least one creative assigned | |
| targeting | object | no | Narrowing the scope of your ad impressions to certain audience, contextual, or supply filters. |
lineItems.customFieldSetting
| Name | Data Type | Required | Notes |
|---|---|---|---|
| isNewField | Boolean | yes | Values: true,false |
| fieldName | String | yes | must be unique to the account id if isNewField = true |
| fieldValue | String | yes |
tactics.budgetDistribution
Name | Data Type | Required | Default | Notes |
|---|---|---|---|---|
type | ENUM String | yes | Valid Values: Dollars, Percent, Priority | |
value | Number | yes | This is the allocation of this tactic in the given line item flight. Specifically, for
Dollars: how much you want this tactic to spend. It cannot be more than the line item budget |
tactics.maxSpendPerTactic
| Name | Data Type | Required | Default | Notes |
|---|---|---|---|---|
| enabled | boolean | Yes | ||
| amount | numeric | Yes | ||
| period | ENUM String | No | day | Valid Values: "day" and "flight" |
tactics.managementFee
| Name | Data Type | Required | Default | Notes |
|---|---|---|---|---|
| type | ENUM string | Conditional | If managementFee object is used, then it is required. Valid Values: Percentage, CPM, PercentageAndCPM, FixedCPM | |
| percentage | integer | Conditional | Required in management fee types of Percentage or PercentageAndCPM | |
| cpm | numeric | Conditional | Required in management fee types of CPM , PercentageAndCPM , FixedCPM |
tactics.mediaOptimization
| Name | Data Type | Required | Default | Notes |
|---|---|---|---|---|
| type | ENUM String | No | CPM | Valid Values: CPM, FLAT, CPC, CTR, CPA, Tactic_Reach, LineItem_Reach, Campaign_Reach, Viewability |
| goal | Numeric | Conditional | Required for 'Viewability', 'CTR', 'CPA' optimization types | |
| conversionPixelId | Integer | Conditional | Required for CPA optimization type |
tactics.frequencyCap
| Name | Data Type | Required | Default | Notes |
|---|---|---|---|---|
| applyFrequencyCap | boolean | Conditional | If frequencyCap object is used, then it is required | |
| times | integer | yes | 1-100 | |
| period | period | yes | Valid Values: day, hour(s), week, month | |
| hoursValue | integer | conditional | Only if hour(s) is the period used. Valid Values: 1 to 1000 | |
| crossDevice | ENUM String | no | Valid Values: Per Device, Per Person, Per Household | |
| untrackable | boolean | no | Include untrackable users | |
| ipUntrackable | boolean | no | Include IP-untrackable users |
tactics.creativeAssignments
| Name | Data Type | Required | Default | Notes |
|---|---|---|---|---|
| creativeId | integer | yes | The ID of the creative to be assigned to the tactic | |
| weight | integer | yes | Weight is a percentage that should be used if you want one creative of the same adsize within a tactic to get more impressions than another creative. Total weight within adsize on a tactic must be 100 | |
| startDate | string | no | example: 2025-12-30 23:59:59 | |
| endDate | string | no | example: 2025-12-30 23:59:59 |
tactics.targeting.hcpByPractitioner
| Name | Data Type | Required | Default | Notes |
|---|---|---|---|---|
| crossDevice | ENUM string | no | device | valid values: device, person, home_ip, practice_ip |
| npiReporting | boolean | no | false | |
| segments | object |
tactics.targeting.hcpByPractitioner.segments
| Name | Data Type | Required | Default | Notes |
|---|---|---|---|---|
| include | boolean | no | valid values: true, false | |
| segmentId | integer | no | ||
| segmentType | ENUM string | no | valid values: practitioner, specialty |
tactics.targeting.npiTargeting
| Name | Data Type | Required | Default | Notes |
|---|---|---|---|---|
| crossDevice | ENUM string | no | device | valid values: device, person, home_ip, practice_ip |
| npiReporting | boolean | no | false | |
| lists | array of objects | Conditional - either lists or npiNumbers object is needed | Add one or more existing lists of NPIs | |
| npiNumbers | object | Add individual NPIs to target |
tactics.targeting.npiTargeting.lists
| Name | Data Type | Required | Default | Notes |
|---|---|---|---|---|
| listId | string | yes | ||
| include | boolean | yes | valid values: true, false |
tactics.targeting.npiTargeting.npiNumbers
| Name | Data Type | Required | Default | Notes |
|---|---|---|---|---|
| numbers | array of strings | yes | ||
| include | boolean | yes | valid values: true, false |
tactics.targeting.retargetingPixels
| Name | Data Type | Required | Default | Notes |
|---|---|---|---|---|
| crossDevice | ENUM string | no | device | valid values: device, person, home_ip, practice_ip |
| recency | ENUM string | yes | valid values: 1, 7, 15, 30, 60, 90, 90plus | |
| pixels | array of objects | list of retargeting pixels you are including or excluding |
tactics.targeting.retargetingPixels.pixels
| Name | Data Type | Required | Default | Notes |
|---|---|---|---|---|
| pixelId | integer | yes | ||
| include | boolean | yes | valid values: true, false |
tactics.targeting.behavioralSegments
| Name | Data Type | Required | Default | Notes |
|---|---|---|---|---|
| crossDevice | ENUM string | no | device | valid values: device, person, household, household_ip |
| segments | array of objects | yes |
tactics.targeting.behavioralSegments.segments
| Name | Data Type | Required | Default | Notes |
|---|---|---|---|---|
| providerId | integer | yes | ||
| segmentId | integer | yes | ||
| include | boolean | yes | valid values: true, false |
tactics.targeting.healthPopulations
Name | Data Type | Required | Default | Notes |
|---|---|---|---|---|
crossDevice | ENUM string | no | device | valid values: device, person, household, household_ip |
segments | array of objects | yes | ||
operator | Boolean | no | or | valid values: or, and |
historicalPeriod | ENUM string | yes | valid values: 3,30,90plus |
tactics.targeting.healthPopulations.segments
| Name | Data Type | Required | Default | Notes |
|---|---|---|---|---|
| meshCode | string | yes | ||
| segmentType | ENUM string | yes | valid values: treatment, condition | |
| include | boolean | yes | valid values: true, false |
tactics.targeting.iabNewCategories
| Name | Data Type | Required | Default | Notes |
|---|---|---|---|---|
| categoryId | integer | yes | ||
| include | boolean | yes | valid values: true, false |
tactics.targeting.geoTargets
| Name | Data Type | Required | Default | Notes |
|---|---|---|---|---|
| type | string | yes | valid values: country, state, city,metro | |
| values | array of strings | yes | List of geo target values. For country use ISO (e.g., 'gbr', 'usa'), for state use ISO (e.g., 'NY', 'CA'), for city use name (e.g., 'Los Angeles', 'san francisco'), for metro use name (e.g., 'philadelphia'). All values included in the array must have the same parent | |
| parent | object | |||
| include | ENUM string | yes | valid values: true, false |
tactics.targeting.geoTargets.parent
| Name | Data Type | Required | Default | Notes |
|---|---|---|---|---|
| type | ENUM string | yes | valid values: country, state | |
| value | string | yes | parent id of geoTargets.values |
tactics.targeting.devices
| Name | Data Type | Required | Default | Notes |
|---|---|---|---|---|
| deviceTypes | array of ENUM strings | yes | valid values: desktop, mobile, tablet, connected_tv, connected_device, set_top_box, ooh_device | |
| include | ENUM string | yes | valid values: true, false |
tactics.targeting.domainsApps
| Name | Data Type | Required | Default | Notes |
|---|---|---|---|---|
| domainLists | array of objects | no | one of the four objects is required | |
| domains | array of objects | no | ||
| appLists | array of objects | no | ||
| apps | array of objects | no |
tactics.targeting.domainsApps.domainLists
| Name | Data Type | Required | Default | Notes |
|---|---|---|---|---|
| listId | string | yes | ||
| include | ENUM string | yes | valid values: true, false |
tactics.targeting.domainsApps.domains
| Name | Data Type | Required | Default | Notes |
|---|---|---|---|---|
| domainName | string | yes | one of the four objects is required | |
| include | ENUM string | yes | valid values: true, false |
tactics.targeting.domainsApps.appLists
| Name | Data Type | Required | Default | Notes |
|---|---|---|---|---|
| listId | string | yes | ||
| include | ENUM string | yes | valid values: true, false |
tactics.targeting.domainsApps.apps
| Name | Data Type | Required | Default | Notes |
|---|---|---|---|---|
| appName | string | yes | one of the four objects is required | |
| include | ENUM string | yes | valid values: true, false |
tactics.targeting.inventorySources
| Name | Data Type | Required | Default | Notes |
|---|---|---|---|---|
| exchanges | array of strings | yes | ||
| include | ENUM string | yes | valid values: true, false |
tactics.targeting.inventoryTypes
| Name | Data Type | Required | Default | Notes |
|---|---|---|---|---|
| types | ENUM string of arrays | yes | valid values: app, site | |
| include | ENUM string | yes | valid values: true, false |
tactics.targetings.viewability
Name | Data Type | Required | Default | Notes |
|---|---|---|---|---|
minViewabilityRate | integer | yes | valid values: 1 to 80 - the percentage viewable | |
provider | ENUM String | yes | valid values: DV |
Updated about 2 months ago
