Skip to main content

Planner API

This page covers the methods and endpoints associated with Political proposal Planners. With the Planner API you can create, retrieve, update, and manage proposal Planners for Political campaigns.

Read more about Political Planners in our Help Center article.

Political proposal Planner details​

Political Planner resource properties​

Plan resource properties
id
integer
Plan ID.
name
string
Plan name.
objectiveId
integer
Plan objective ID.
Supported values
1Reach forecasting
2Budget estimation
3Voter TV+
graphId
string
Cross-screen graph ID (cross-screen plans only, see Get reach saturation graph).
overview
object
Cross-screen overview metrics (cross-screen plans only).
overview object properties
linearTvCpm
number
Linear TV cost per thousand impressions.
ctvCpm
number
CTV cost per thousand impressions.
grp
number
Gross rating points.
linearTvPercentage
integer
Percentage of budget allocated to linear TV.
ctvFrequency
integer
Average CTV frequency.
totalBudget
number
Total plan budget.
details
object
Plan details object.
details object properties
startDate
integer
Unix epoch start date, in milliseconds.
endDate
integer
Unix epoch end date, in milliseconds.
timezoneId
integer
Timezone ID specifies data collection start time.
frequencyCap
integer
Frequency cap.
marginValue
integer
Margin percentage applied on top of base CPM, not a currency amount, valid range: 0-100.
statusId
integer
Plan status ID.
Supported values
1Draft
2Ready
cva
object
Custom Voter Audience (CVA) object.
cva object properties
id
integer
CVA ID.
equation
string
CVA segment equation, see Create CVA details for details.
stateIds
array of integers
State IDs.
segmentIds
array of integers
CVA segment IDs, see Get Custom Voter Audience segment details for details.
reach
integer
CVA reach.
targeting
object
Targeting object.
targeting object properties
whiteListedLocation
object
Whitelisted location targeting.
whiteListedLocation object properties
country
integer
Country ID.
states
array of integers
State IDs.
dma
array of integers
DMA IDs.
city
array of integers
City IDs.
county
array of integers
County IDs.
congressionalDistrict
array of integers
Congressional district IDs.
stateHouse
array of integers
State house IDs.
stateSenate
array of integers
State senate IDs.
zipCodes
array of integers
Zip codes.
blackListedLocation
object
Blacklisted location targeting (same structure as whitelisted).
device
object
Device targeting.
device object properties
deviceTypeIds
array of integers
Device type IDs.
Supported values
20300001Mobile
20300002Desktop
20300003Connected TV
20300004Tablet
20399999Unknown
channelTypeIds
array of integers
Channel type IDs.
Supported values
21100001App
21100002OTT App
21100003Web
inventory
object
Inventory targeting.
inventory object properties
openExchange
object
Open Exchange targeting.
inventoryGroupIds
array of integers
Inventory Group IDs.
creative
object
Creative targeting.
creative object properties
creativeTypeIds
array of integers
Creative type IDs.
Supported values
0All
11Image
13HTML
14Video
15Native
17Audio
isTvAutoBuying
boolean
Indicates CTV auto-buying is enabled.
whitelistedAudiences
array of integers
Whitelisted audience IDs.
blacklistedAudiences
array of integers
Blacklisted audience IDs.
prebidSegments
array of integers
Prebid segment IDs.
audienceSegments
array of integers
Audience segment IDs.
ageGroupSegments
array of integers
Age group segment IDs (cross-screen plans only, see Get demographics keys).
genderSegments
array of integers
Gender segment IDs (cross-screen plans only, see Get demographics keys).
incomeRangeSegments
array of integers
Income range segment IDs (cross-screen plans only, see Get demographics keys).
ethnicitySegments
array of integers
Ethnicity segment IDs (cross-screen plans only, see Get demographics keys).
partyAffiliationSegments
array of integers
Party affiliation segment IDs (cross-screen plans only, see Get demographics keys).
advanced
object
Advanced targeting.
advanced object properties
splitTypeId
integer
Split type ID.
Supported values
1AI
2Manual
locations
array of integers
Targeting type IDs for locations.
Supported values
1Location
devices
array of integers
Device type IDs.
Supported values
20300001Mobile
20300002Desktop
20300003Connected TV
20300004Tablet
20399999Unknown
inventoryGroupIds
array of integers
Inventory Group IDs.
audienceTypes
array of integers
Audience type IDs.
Supported values
1Matched audience
2Segmented audience
3Retargeted audience
4Geofarmed audience
5Contextual audience
6Lookalike audience
7Campaign audience
8Pre-bid audience
9Account Based Marketing (ABM) audience
10Custom Voter Audience (CVA)
11Integrated Care Team (ICT) audience
12Power Segment audience
creatives
array of integers
Creative type IDs.
Supported values
0All
11Image
13HTML
14Video
15Native
17Audio

Proposal resource properties
id
integer
Proposal ID.
name
string
Proposal name.
objectiveId
integer
Plan objective ID.
Supported values
1Reach forecasting
2Budget estimation
3Voter TV+
planId
integer
Plan ID (cross-screen proposals only).
startTime
integer
Unix epoch start date, in milliseconds.
endTime
integer
Unix epoch end date, in milliseconds.
statusId
integer
Plan status ID.
Supported values
1Draft
2Ready
ioId
integer
Insertion order ID.
reach
integer
Estimated reach.
impressions
integer
Estimated impressions.
budget
number
Proposal budget.
frequencyCap
integer
Frequency cap.
maxReach
integer
Maximum reach.
maxImpressions
integer
Maximum impressions.
maxBudget
number
Maximum budget.
cpm
number
Cost per thousand impressions.
timeZoneId
integer
Timezone ID.
timeZoneName
string
Timezone name.
linearTvReach
integer
Linear TV reach (cross-screen proposals only).
linearTvImpressions
integer
Linear TV impressions (cross-screen proposals only).
linearTvBudget
number
Linear TV budget (cross-screen proposals only).
linearTvMaxReach
integer
Maximum linear TV reach (cross-screen proposals only).
linearTvMaxImpressions
integer
Maximum linear TV impressions (cross-screen proposals only).
linearTvMaxBudget
number
Maximum linear TV budget (cross-screen proposals only).
proposedCampaigns
array of objects
Proposed campaigns.
proposedCampaigns object properties
id
integer
Campaign ID.
name
string
Campaign name.
startTime
integer
Unix epoch start date, in milliseconds.
endTime
integer
Unix epoch end date, in milliseconds.
creativeTypeId
integer
Creative Type ID.
Supported values
0All
11Image
13HTML
14Video
15Native
17Audio
duration
integer
Duration in days.
modelType
string
Bidding model type (e.g., CPM).
targetedReach
integer
Targeted reach.
maxTargetedReach
integer
Maximum targeted reach.
frequencyCap
integer
Campaign frequency cap.
targetedImpressions
integer
Targeted impressions.
maxTargetedImpressions
integer
Maximum targeted impressions.
cpm
number
Cost per thousand impressions.
minCpm
number
Minimum CPM.
maxCpm
number
Maximum CPM.
budget
number
Campaign budget.
maxBudget
number
Maximum campaign budget.
strategy
string
Campaign strategy description.

Get plan details by ID​

GET

Get Political proposal Planner details by plan ID.

Path parameters
planId
integer
Plan ID.
Response 200
{
"success": true,
"data": {
"id": 1,
"name": "Pollies Political Planner",
"objectiveId": 1,
"totalBudget": 120000,
"details": {
"startDate": 1747195200000,
"endDate": 1777089600000,
"timezoneId": 29,
"frequencyCap": 3
},
"owId": 204366,
"statusId": 1,
"lastVisitedScreen": "Screen 1",
"cva": {
"id": 1,
"equation": "((IQMCVAAL017144|IQMCVAAL086142))",
"stateIds": [30200012, 30200013, 30200014, 30200015],
"segmentIds": [88432, 18589],
"reach": 293180
},
"targeting": {
"whiteListedLocation": {
"country": 30100001,
"states": [30200035],
"dma": [30900026],
"city": [30436781, 30436782],
"county": [30318981],
"congressionalDistrict": [30617273],
"stateHouse": [30803564],
"stateSenate": [30718340],
"zipCodes": ["10002"]
},
"blackListedLocation": {
"country": 30100001,
"states": [30200003],
"dma": [30900139],
"city": [30442811],
"county": [30321244],
"congressionalDistrict": [30601009],
"stateHouse": [30800263],
"stateSenate": [30701056],
"zipCodes": ["10002"]
},
"device": {
"deviceTypeIds": [20300004, 20300003],
"channelTypeIds": [11, 12]
},
"inventory": {
"openExchange": null,
"inventoryGroupIds": [3904859, 3897153]
},
"creative": {
"creativeTypeIds": [11, 13],
"isTvAutoBuying": true
},
"whitelistedAudiences": [1142625, 1143191, 1156665, 1144602, 1157452, 1159375],
"blacklistedAudiences": [1140931, 1142626, 1143189, 1144600, 1157451, 1159357, 1142239],
"prebidSegments": [32, 422],
"audienceSegments": [323, 232, 12],
"advanced": {
"splitTypeId": 1,
"locations": [8, 9, 10],
"devices": [20300004, 20300003],
"inventoryGroupIds": [3904859, 3897153],
"audienceTypes": [18, 19],
"creatives": [11, 13]
}
}
}
}
Response 200
{
"success": true,
"data": {
"id": 1,
"name": "Pollies Political Planner",
"objectiveId": 3,
"graphId": "550e8400-e29b-41d4-a716-446655440000",
"overview": {
"linearTvCpm": 12,
"ctvCpm": 8,
"grp": 45,
"linearTvPercentage": 65,
"ctvFrequency": 3
},
"totalBudget": 120000,
"details": {
"startDate": 1747195200000,
"endDate": 1777089600000,
"timezoneId": 29,
"frequencyCap": 3
},
"owId": 204366,
"statusId": 1,
"lastVisitedScreen": "Screen 1",
"cva": {
"id": 1,
"equation": "((IQMCVAAL017144|IQMCVAAL086142))",
"stateIds": [30200012, 30200013, 30200014, 30200015],
"segmentIds": [88432, 18589],
"reach": 293180
},
"targeting": {
"whiteListedLocation": {
"country": 30100001,
"states": [30200035],
"dma": [30900026],
"city": [30436781, 30436782],
"county": [30318981],
"congressionalDistrict": [30617273],
"stateHouse": [30803564],
"stateSenate": [30718340],
"zipCodes": ["10002"]
},
"blackListedLocation": {
"country": 30100001,
"states": [30200003],
"dma": [30900139],
"city": [30442811],
"county": [30321244],
"congressionalDistrict": [30601009],
"stateHouse": [30800263],
"stateSenate": [30701056],
"zipCodes": ["10002"]
},
"device": {
"deviceTypeIds": [20300004, 20300003],
"channelTypeIds": [11, 12]
},
"inventory": {
"openExchange": null,
"inventoryGroupIds": [3904859, 3897153]
},
"creative": {
"creativeTypeIds": [11, 13],
"isTvAutoBuying": true
},
"whitelistedAudiences": [1142625, 1143191, 1156665, 1144602, 1157452, 1159375],
"blacklistedAudiences": [1140931, 1142626, 1143189, 1144600, 1157451, 1159357, 1142239],
"prebidSegments": [32, 422],
"audienceSegments": [323, 232, 12],
"ageGroupSegments": [101, 102, 103],
"genderSegments": [201, 202],
"incomeRangeSegments": [301, 302, 303],
"ethnicitySegments": [401, 402],
"partyAffiliationSegments": [501, 502],
"advanced": {
"splitTypeId": 1,
"locations": [8, 9, 10],
"devices": [20300004, 20300003],
"inventoryGroupIds": [3904859, 3897153],
"audienceTypes": [18, 19],
"creatives": [11, 13]
}
}
}
}

Download plan​

GET

Generate a signed URL for downloading a Political plan report in PDF format.

Path parameters
planId
integer required
Plan ID to download.
Query parameters
fileType
integer required
Type of file to download. 1 (Excel) and 2 (CSV) are rejected with "Invalid File type." - only 3 (PDF) is supported for this endpoint.
Supported values
3PDF
Response 200
{
"success": true,
"data": {
"planReportUrl": "https://example.s3.amazonaws.com/planner/plan/report/download/12345/plan_report.pdf"
}
}
More responses
Response 422
{
"success": false,
"errorObjects": [
{
"error": "Invalid File type"
}
]
}

Get list of Political plans​

GET

Get a paginated list of Political plans.

A plan id can be used in the Get plan details by ID endpoint and to perform various actions in Political proposal Planner management endpoints.

Query parameters
pageNo
integer
Page number of retrieved data, default: 1.
noOfEntries
integer
Number of entries returned per page, default: 50.
searchField
string
Search by plan name, ID, or created by user name.
sortBy
string
Sorts by ascending (+) or descending (-), default: -id.
Supported values: id, name, createdOn, createdBy, startDate, endDate, objectiveId, linkedProposals.
statusIds
string
Comma-separated status IDs.
Supported values
1Draft
2Ready
objectiveIds
string
Comma-separated objective IDs.
Supported values
1Reach forecasting
2Budget estimation
3Voter TV+
Response properties
id
integer
Plan ID.
name
string
Plan name.
statusId
integer
Plan status ID.
Supported values
1Draft
2Ready
createdOn
integer
Unix epoch created on date, in milliseconds.
createdBy
string
Created by user name.
userAvatarUrl
string
URL of the user avatar.
startDate
integer
Unix epoch start date, in milliseconds.
endDate
integer
Unix epoch end date, in milliseconds.
objectiveId
integer
Plan objective ID.
Supported values
1Reach forecasting
2Budget estimation
3Voter TV+
totalProposals
integer
Number of linked proposals.
proposals
array of integers
Linked proposal IDs.
Response 200
{
"success": true,
"data": {
"data": [
{
"id": 1001,
"name": "Q1 2026 Campaign Strategy",
"statusId": 1,
"createdOn": 1709654400000,
"createdByUowId": 5001,
"createdBy": "John Smith",
"userAvatarUrl": "https://example.com/avatars/john-smith.png",
"startDate": 1709654400000,
"endDate": 1717430400000,
"objectiveId": 1,
"totalProposals": 3,
"proposals": [12, 231, 245]
},
{
"id": 1002,
"name": "Voter Outreach Initiative",
"statusId": 2,
"createdOn": 1710259200000,
"createdByUowId": 5002,
"createdBy": "Jane Doe",
"userAvatarUrl": "https://example.com/avatars/jane-doe.png",
"startDate": 1710259200000,
"endDate": 1718640000000,
"objectiveId": 2,
"totalProposals": 5,
"proposals": [12, 231, 323, 445, 568]
}
],
"totalRecords": 25,
"filteredRecords": 2
}
}

Get list of proposals​

GET

Get a paginated list of Political proposals with comprehensive metadata including budget metrics, strategy type, creator details, and date ranges.

Query parameters
pageNo
integer
Page number of retrieved data, default: 1.
noOfEntries
integer
Number of entries returned per page, default: 50.
searchField
string
Search by proposal name, ID, or created by user name.
sortBy
string
Sorts by ascending (+) or descending (-), default: -id.
Supported values: id, name, createdOn, createdBy, startDate, endDate, reach, impressions, cpm, budget.
statusIds
string
Comma-separated status IDs.
Supported values
1Converted
2Draft
3Expired
4Failed
5Processing
6Ready
planId
integer
Filter proposals by plan ID.
Response properties
id
integer
Proposal ID.
name
string
Proposal name.
statusId
integer
Status ID.
Supported values
1Draft
2Ready
ioId
integer
Insertion order ID.
createdOn
integer
Unix epoch created on date, in milliseconds.
createdBy
string
Created by user name.
userAvatarUrl
string
URL of the user avatar.
startDate
integer
Unix epoch start date, in milliseconds.
endDate
integer
Unix epoch end date, in milliseconds.
reach
integer
Estimated reach.
impressions
integer
Estimated impressions.
cpm
number
Cost per thousand impressions.
budget
number
Proposal budget.
frequency
integer
Frequency cap.
strategyTypeId
integer
Strategy type ID.
Supported values
1Maximum reach
2Maximum impressions
linearTvReach
integer
Linear TV reach (cross-screen proposals only, null otherwise).
linearTvImpressions
integer
Linear TV impressions (cross-screen proposals only, null otherwise).
linearTvBudget
number
Linear TV budget (cross-screen proposals only, null otherwise).
Response 200
{
"success": true,
"data": {
"data": [
{
"id": 2001,
"name": "Q1 2026 Digital Campaign",
"statusId": 1,
"ioId": 1,
"createdOn": 1709654400000,
"createdByUserId": 5001,
"createdBy": "John Smith",
"userAvatarUrl": "https://example.com/avatars/john-smith.png",
"startDate": 1709654400000,
"endDate": 1717430400000,
"reach": 500000,
"impressions": 2000000,
"cpm": 15.50,
"budget": 31000.00,
"frequency": 3,
"strategyTypeId": 1,
"linearTvReach": null,
"linearTvImpressions": null,
"linearTvBudget": null
},
{
"id": 2002,
"name": "Voter Engagement Initiative",
"statusId": 2,
"ioId": null,
"createdOn": 1710259200000,
"createdByUserId": 5002,
"createdBy": "Jane Doe",
"userAvatarUrl": "https://example.com/avatars/jane-doe.png",
"startDate": 1710259200000,
"endDate": 1718640000000,
"reach": 750000,
"impressions": 3000000,
"cpm": 12.75,
"budget": 38250.00,
"frequency": 4,
"strategyTypeId": 2,
"linearTvReach": null,
"linearTvImpressions": null,
"linearTvBudget": null
}
],
"totalRecords": 45,
"filteredRecords": 2,
"recordsAggregation": {
"totalBudget": 69250
}
}
}
Response 200
{
"success": true,
"data": {
"data": [
{
"id": 2001,
"name": "Q1 2026 Digital Campaign",
"statusId": 1,
"ioId": 1,
"createdOn": 1709654400000,
"createdByUserId": 5001,
"createdBy": "John Smith",
"userAvatarUrl": "https://example.com/avatars/john-smith.png",
"startDate": 1709654400000,
"endDate": 1717430400000,
"reach": 500000,
"impressions": 2000000,
"cpm": 15.50,
"budget": 31000.00,
"frequency": 3,
"strategyTypeId": 1,
"linearTvReach": 232322,
"linearTvImpressions": 3245,
"linearTvBudget": 23232323
},
{
"id": 2002,
"name": "Voter Engagement Initiative",
"statusId": 2,
"ioId": null,
"createdOn": 1710259200000,
"createdByUserId": 5002,
"createdBy": "Jane Doe",
"userAvatarUrl": "https://example.com/avatars/jane-doe.png",
"startDate": 1710259200000,
"endDate": 1718640000000,
"reach": 750000,
"impressions": 3000000,
"cpm": 12.75,
"budget": 38250.00,
"frequency": 4,
"strategyTypeId": 2,
"linearTvReach": 232322,
"linearTvImpressions": 3245,
"linearTvBudget": 23232323
}
],
"totalRecords": 45,
"filteredRecords": 2,
"recordsAggregation": {
"totalBudget": 69250
}
}
}

Get proposal details​

GET

Get the complete details of a Political proposal including budgeting metrics, timezone info, and proposed campaigns.

Path parameters
proposalId
integer
Proposal ID.
Response 200
{
"success": true,
"data": {
"id": 14,
"name": "sample",
"objectiveId": 1,
"startTime": 1730658720000,
"endTime": 1733250720000,
"owId": 202500,
"statusId": 1,
"ioId": 1,
"reach": 122344433,
"impressions": 12232323,
"budget": 1212233.23,
"frequencyCap": 3,
"maxReach": 200000000,
"maxImpressions": 25000000,
"maxBudget": 2500000,
"timeZoneId": 29,
"timeZoneName": "US/EASTERN",
"proposedCampaigns": [
{
"id": 101,
"name": "Sample Campaign",
"startTime": 1747195200000,
"endTime": 1777089600000,
"creativeTypeId": 13,
"duration": 30,
"modelType": "CPM",
"targetedReach": 500000,
"maxTargetedReach": 750000,
"frequencyCap": 3,
"targetedImpressions": 1500000,
"maxTargetedImpressions": 2000000,
"cpm": 2.5,
"minCpm": 1.5,
"maxCpm": 3.5,
"budget": 10000,
"maxBudget": 15000,
"strategy": "Device + Channel"
}
]
}
}
Response 200
{
"success": true,
"data": {
"id": 14,
"name": "sample",
"planId": 3,
"objectiveId": 3,
"startTime": 1730658720000,
"endTime": 1733250720000,
"owId": 202500,
"statusId": 1,
"ioId": 1,
"reach": 122344433,
"impressions": 12232323,
"budget": 1212233.23,
"frequencyCap": 3,
"maxReach": 200000000,
"maxImpressions": 25000000,
"maxBudget": 2500000,
"timeZoneId": 29,
"timeZoneName": "US/EASTERN",
"linearTvReach": 1000,
"linearTvImpressions": 2000,
"linearTvBudget": 1001,
"linearTvMaxReach": 10000,
"linearTvMaxImpressions": 20000,
"linearTvMaxBudget": 10002,
"proposedCampaigns": [
{
"id": 101,
"name": "Sample Campaign",
"startTime": 1747195200000,
"endTime": 1777089600000,
"creativeTypeId": 13,
"duration": 30,
"modelType": "CPM",
"targetedReach": 500000,
"maxTargetedReach": 750000,
"frequencyCap": 3,
"targetedImpressions": 1500000,
"maxTargetedImpressions": 2000000,
"cpm": 2.5,
"minCpm": 1.5,
"maxCpm": 3.5,
"budget": 10000,
"maxBudget": 15000,
"strategy": "Device + Channel"
}
]
}
}

Download proposal​

GET

Generate a signed URL for downloading a Political proposal report in CSV, XLSX, or PDF format. The target proposal must currently have statusId 1 (Converted), 3 (Expired), 4 (Failed), or 6 (Ready) -- any other status is rejected.

Path parameters
proposalId
integer
Proposal ID.
Query parameters
fileType
integer
Type of file to download.
Supported values
1Excel
2CSV
3PDF
Response 200
{
"success": true,
"data": {
"proposalReportUrl": "https://example.s3.amazonaws.com/planner/proposal/report/download/12345/proposal_report.xlsx"
}
}

Get proposal summary​

GET

Get a proposal summary including reach/impressions, bid landscape, device graph, and channel graph data.

Path parameters
proposalId
integer
Proposal ID.
Response properties
reachImpressions
object
Reach and impressions summary.
reachImpressions object properties
impressions
integer
Total impressions.
reach
integer
Total reach.
iqmReach
integer
IQM estimated reach.
bidLandscape
object
Bid landscape data grouped by creative type.
bidLandscape object properties
cpm
number
CPM value.
percentile
integer
Percentile.
impressions
integer
Impressions at this CPM.
deviceGraph
object
Device type distribution.
deviceGraph object properties
device
string
Device type name.
impressions
integer
Impressions for device type.
percentage
number
Percentage of total.
channelGraph
object
Channel type distribution.
channelGraph object properties
channel
string
Channel type name.
impressions
integer
Impressions for channel type.
percentage
number
Percentage of total.
Response 200
{
"success": true,
"data": {
"reachImpressions": {
"impressions": 23213,
"reach": 10,
"iqmReach": 206567705
},
"bidLandscape": {
"Audio": [
{ "cpm": 0, "percentile": 0, "impressions": 0 },
{ "cpm": 2, "percentile": 10, "impressions": 1261382900 }
]
},
"deviceGraph": {
"deviceTypes": [
{ "device": "CTV", "impressions": 94828374242, "percentage": 50.53 }
]
},
"channelGraph": {
"channelTypes": [
{ "channel": "CTV", "impressions": 47780138694, "percentage": 25.46 }
]
}
}
}

Get list of strategies​

GET

Get a list of strategies for a specific plan, including campaign metrics, budgeting data, and targeting arrays.

Query parameters
planId
integer required
The plan ID to retrieve strategies for.
Response properties
id
integer
Strategy ID.
name
string
Strategy name.
startDate
integer
Unix epoch start date, in milliseconds.
endDate
integer
Unix epoch end date, in milliseconds.
duration
integer
Duration in days.
strategyTypeId
integer
Strategy type ID.
Supported values
1Maximum reach
2Maximum impressions
campaignsCount
integer
Number of campaigns.
proposalId
integer
Linked proposal ID.
budget
number
Strategy budget.
frequency
integer
Frequency cap.
reach
integer
Estimated reach.
impressions
integer
Estimated impressions.
cpm
number
Cost per thousand impressions.
creatives
array of integers
Creative type IDs.
Supported values
0All
11Image
13HTML
14Video
15Native
17Audio
devices
array of integers
Device type IDs.
Supported values
20300001Mobile
20300002Desktop
20300003Connected TV
20300004Tablet
20399999Unknown
channels
array of integers
Channel type IDs.
Supported values
21100001App
21100002OTT App
21100003Web
Response 200
{
"success": true,
"data": [
{
"id": 3001,
"name": "sample strategy",
"startDate": 1709654400000,
"endDate": 1717430400000,
"duration": 10,
"strategyTypeId": 1,
"campaignsCount": 5,
"proposalId": 1,
"budget": 50000.00,
"frequency": 3,
"reach": 750000,
"impressions": 2250000,
"cpm": 22.22,
"creatives": [1, 2, 3],
"devices": [1, 2],
"channels": [5, 6, 7]
}
]
}

Get strategy details​

GET

Get the details of a single Political strategy by ID.

Path parameters
strategyId
integer
Strategy ID.
Response properties
id
integer
Strategy ID.
name
string
Strategy name.
startDate
integer
Unix epoch start date, in milliseconds.
endDate
integer
Unix epoch end date, in milliseconds.
duration
integer
Duration in days.
strategyTypeId
integer
Strategy type ID.
Supported values
1Maximum reach
2Maximum impressions
campaignsCount
integer
Number of campaigns.
budget
number
Strategy budget.
frequency
integer
Frequency cap.
reach
integer
Estimated reach.
impressions
integer
Estimated impressions.
cpm
number
Cost per thousand impressions.
creatives
array of integers
Creative type IDs.
Supported values
0All
11Image
13HTML
14Video
15Native
17Audio
devices
array of integers
Device type IDs.
Supported values
20300001Mobile
20300002Desktop
20300003Connected TV
20300004Tablet
20399999Unknown
channels
array of integers
Channel type IDs.
Supported values
21100001App
21100002OTT App
21100003Web
Response 200
{
"success": true,
"data": {
"id": 3001,
"name": "sample strategy",
"startDate": 1709654400000,
"endDate": 1717430400000,
"duration": 10,
"strategyTypeId": 1,
"campaignsCount": 5,
"budget": 50000,
"frequency": 3,
"reach": 750000,
"impressions": 2250000,
"cpm": 22.22,
"creatives": [1, 2, 3],
"devices": [1, 2],
"channels": [5, 6, 7]
}
}

Political proposal Planner management​

Create plan​

POST
POST

Create a new ready or draft Political plan. A ready plan requires name, details, and targeting. A Voter TV+ (objectiveId: 3) plan requires graphId and overview.

A draft plan requires only a name; all other fields are optional but validated if present.

See resource properties for request schema.

Request sample
{
"name": "Plan Name",
"objectiveId": 2,
"totalBudget": 120000,
"details": {
"startDate": 1747195200000,
"endDate": 1777089600000,
"timezoneId": 29,
"frequencyCap": 3
},
"targeting": {
"whiteListedLocation": {
"country": 30100001,
"states": [30200035],
"dma": [30900026],
"city": [30436781, 30436782],
"county": [30318981],
"congressionalDistrict": [30617273],
"stateHouse": [30803564],
"stateSenate": [30718340],
"zipCodes": [10001]
},
"blackListedLocation": {
"country": 30100001,
"states": [30200003],
"dma": [30900139],
"city": [30442811],
"county": [30321244],
"congressionalDistrict": [30601009],
"stateHouse": [30800263],
"stateSenate": [30701056],
"zipCodes": [10002]
},
"device": {
"deviceTypeIds": [20300004, 20300003],
"channelTypeIds": [11, 12]
},
"inventory": {
"openExchange": null,
"inventoryGroupIds": [3904859, 3897153]
},
"creative": {
"creativeTypeIds": [11, 13],
"isTvAutoBuying": true
},
"whitelistedAudiences": [1142625, 1143191, 1156665, 1144602, 1157452, 1159375],
"blacklistedAudiences": [1140931, 1142626, 1143189, 1144600, 1157451, 1159357, 1142239],
"prebidSegments": [32, 422],
"audienceSegments": [323, 232, 12],
"advanced": {
"locations": [8, 9, 10],
"devices": [20300004, 20300003],
"inventoryGroupIds": [3904859, 3897153],
"audienceTypes": [18, 19],
"creatives": [11, 13]
}
}
}
Response 200
{
"success": true,
"data": {
"planId": 123
}
}

Edit plan​

PUT
PUT

Update an existing Political plan or draft plan by ID. Name, details, and targeting are required for ready plans.

See resource properties for request schema.

Path parameters
id
integer
Plan ID.
Response 200
{
"success": true,
"data": {
"planId": 123
}
}

Edit plan name​

PATCH

Update the name of an existing Political plan.

Request schema
id
integer required
Plan ID.
name
string required
Updated plan name.
Request sample
{
"id": 1,
"name": "Update Plan Name"
}
Response 200
{
"success": true,
"data": {
"message": "Plan updated successfully."
}
}

Delete plans​

DELETE

Delete one or more Political plans by IDs. Associated strategies are also deleted, but proposals and proposed campaigns are NOT deleted.

Query parameters
planIds
string
Comma-separated plan IDs to delete.
Response 200
{
"success": true,
"data": {
"message": "Plans have been deleted successfully"
}
}

Activate proposal​

POST

Activate a proposal and all of its proposed campaigns. Provide a strategyId; the system looks up the linked proposal.

Request schema
strategyId
integer required
Strategy ID to activate.
Request sample
{
"strategyId": 42
}
Response 200
{
"success": true,
"data": {
"id": 7,
"message": "Plan A saved successfully."
}
}

Edit proposal​

PUT

Update a proposal's name, date range, and campaign budgeting details, and soft-delete specified campaigns.

Path parameters
proposalId
integer
Proposal ID.
Request schema
name
string
Updated proposal name.
startTime
integer
Unix epoch start date, in milliseconds.
endTime
integer
Unix epoch end date, in milliseconds.
reach
integer
Estimated reach.
impressions
integer
Estimated impressions.
budget
number
Proposal budget.
frequencyCap
integer
Frequency cap.
maxReach
integer
Maximum reach.
maxImpressions
integer
Maximum impressions.
maxBudget
number
Maximum budget.
cpm
number
Cost per thousand impressions.
proposedCampaigns
array of objects
Updated proposed campaign details (see proposal resource properties).
deletedCampaignIds
array of integers
Campaign IDs to soft-delete.
Request sample
{
"name": "Updated Proposal Name",
"startTime": 1778434118000,
"endTime": 1780162118000,
"reach": 600000,
"impressions": 2500000,
"budget": 50000.00,
"frequencyCap": 4,
"maxReach": 650000,
"maxImpressions": 3000000,
"maxBudget": 60000.00,
"cpm": 16.67,
"minCpm": 1,
"maxCpm": 50,
"minImpressions": 100000,
"minReach": 50000,
"minBudget": 10000.00,
"proposedCampaigns": [
{
"id": 1,
"name": "Proposed Campaign ID",
"startTime": 1778434118000,
"endTime": 1780162118000,
"targetedReach": 300000,
"targetedImpressions": 1500000,
"budget": 30000.00,
"frequencyCap": 3,
"maxTargetedReach": 350000,
"maxTargetedImpressions": 2000000,
"maxBudget": 35000.00,
"cpm": 20.00,
"minCpm": 1,
"maxCpm": 50,
"minTargetedImpressions": 50000,
"minTargetedReach": 25000,
"minBudget": 5000.00
}
],
"deletedCampaignIds": [102, 103]
}
Response 200
{
"success": true,
"data": {
"id": 42,
"message": "Proposal updated successfully."
}
}

Edit proposal name​

PATCH

Update the name of an existing Political proposal.

Request schema
id
integer required
Proposal ID.
name
string required
Updated proposal name.
Request sample
{
"id": 1,
"name": "Update Proposal Name"
}
Response 200
{
"success": true,
"data": {
"message": "Proposal updated successfully."
}
}

Generate IO and campaigns​

POST

Convert a Political proposal into an insertion order (IO) with draft campaigns. The proposal status updates to processing and triggers async campaign generation; once completed the status becomes converted. The target proposal must be in ready or failed status.

Path parameters
proposalId
integer
Proposal ID.
Request schema
politicalAdvertiserId
integer required
Political Advertiser profile ID.
startTime
integer required
New Unix epoch start date override, in milliseconds.
endTime
integer
New Unix epoch end date override, in milliseconds.
Request sample
{
"politicalAdvertiserId": 123,
"startTime": 1778434118000,
"endTime": 1780162118000
}
Response 200
{
"success": true,
"data": {
"message": "Campaign generation is in progress"
}
}

Delete proposals​

DELETE

Delete one or more Political proposals by IDs. Associated proposed campaigns are also deleted.

Query parameters
proposalIds
string
Comma-separated proposal IDs to delete.
Response 200
{
"success": true,
"data": {
"message": "Proposals have been deleted successfully"
}
}

Restore proposals​

PATCH

Restore expired proposals back to ready status by recalculating their budgeting based on new start and end dates.

Request schema
proposalIds
array of integers
Proposal IDs to restore.
startTime
integer
New Unix epoch start date, in milliseconds.
endTime
integer
New Unix epoch end date, in milliseconds.
Request sample
{
"proposalIds": [2, 3],
"startTime": 1778434118000,
"endTime": 1780162118000
}
Response 200
{
"success": true,
"data": {
"message": "Proposals restored successfully"
}
}

Create CVA details​

POST

Create a new Custom Voter Audience (CVA) definition. This targeting equation is used to build an audience for a Political plan. The CVA details are stored in the database and can be referenced by ID in future requests. This API does not create an audience (see Create Custom Voter Audience), but it does validate the provided segment IDs and equation string.

Using segment IDs (from Get Custom Voter Audience segment details), you can build a CVA definition with the equation field. Segment IDs in parentheses, separated by a vertical bar (|), will be in an 'or' relationship, which will combine the sets of segments; groups of segments in parentheses, separated by an ampersand (&), will be in an 'and' relationship, which will build an audience based on the intersection of those groups.

You can use the returned id to estimate reach for a Political plan with Estimate plan reach or attach it as a Custom Voter Audience (cva) when creating or updating a Political plan (Create plan).

Request schema
stateIds
array of integers
State IDs.
reach
integer
Your own pre-computed reach estimate for this equation (e.g. from the Get Custom Voter Audience segment details catalogue). This API does not calculate or validate this number -- it's stored as given and later used as this CVA's known reach whenever a Political plan that references it generates strategies.
equation
string
CVA segment equation string, see Get Custom Voter Audience segment details for segment IDs.
Request sample
{
"stateIds": [30200005],
"reach": 1629051,
"equation": "((IQMCVACA069112|(IQMCVACA080323))&(IQMCVACA101616))"
}
Response 200
{
"success": true,
"data": {
"id": 12345
}
}

Update CVA details​

PATCH

Update an existing Custom Voter Audience (CVA) detail record with new state IDs, reach value, and an equation string.

Path parameters
cvaId
integer
CVA ID.
Request schema
stateIds
array of integers
State IDs.
reach
integer
Your own pre-computed reach estimate for this equation (e.g. from the Get Custom Voter Audience segment details catalogue). This API does not calculate or validate this number -- it's stored as given and later used as this CVA's known reach whenever a Political plan that references it generates strategies.
equation
string
CVA segment equation string, see Get Custom Voter Audience segment details for segment IDs.
Request sample
{
"stateIds": [30200005],
"reach": 1629051,
"equation": "((IQMCVACA069112|(IQMCVACA080323))&(IQMCVACA101616))"
}
Response 200
{
"success": true,
"data": {
"id": 12345
}
}

Estimate plan reach​

POST

Estimate the reach for a Political plan based on optional CVA details and targeting criteria. If a cvaId is provided, CVA details are fetched from the database. The targeting and CVA data are forwarded to the data API for reach estimation.

Request schema
cvaId
integer
CVA ID (optional, fetches CVA details if provided).
targeting
object
Targeting object (see plan resource properties).
Request sample
{
"cvaId": 12234,
"targeting": {
"whiteListedLocations": {
"country": 1,
"states": [30200035],
"dma": [30900026],
"city": [30436781],
"county": [30318981],
"congressionalDistrict": [30617273],
"stateHouse": [30803564],
"stateSenate": [30718340],
"zipCodes": [10002]
},
"blackListedLocations": {
"country": 1,
"states": [30200003],
"dma": [30900139],
"city": [30442811],
"county": [30321244],
"congressionalDistrict": [30601009],
"stateHouse": [30800263],
"stateSenate": [30701056],
"zipCodes": [10001]
},
"whiteListedAudienceIds": [1101831, 1101829],
"blackListedAudienceIds": [1101826],
"prebidSegmentIds": [323212],
"audienceSegments": [2133],
"creative": {
"creativeTypeIds": [11, 13, 14],
"isTvAutoBuying": true
},
"device": {
"deviceTypeIds": [20300001, 20300002],
"channelTypeIds": [11]
},
"inventory": {
"openExchange": {
"iabCategories": [123],
"exchanges": [90, 93]
},
"inventoryGroupIds": []
}
}
}
Response 200
{
"success": true,
"data": {
"reach": 10
}
}

Generate custom strategies​

POST

Generate custom strategies for an existing plan by calling the DSI API with the provided targeting and budget parameters. This endpoint persists the resulting strategies, proposals, and campaigns, then returns strategy summaries.

Request schema
planId
integer
Plan ID.
strategyName
string
Custom strategy name.
name
string
Plan name.
objectiveId
integer
Plan objective ID.
Supported values
1Reach forecasting
2Budget estimation
3Voter TV+
totalBudget
number
Total budget.
details
object
Plan details (see plan resource properties).
targeting
object
Targeting object (see plan resource properties).
cva
object
CVA details (see plan resource properties).
Response 200
{
"success": true,
"data": [
{
"id": 1,
"name": "Maximum Reach",
"startDate": 1747195200000,
"endDate": 1777089600000,
"strategyTypeId": 1,
"campaignsCount": 3,
"budget": 40000,
"frequency": 3,
"reach": 500000,
"impressions": 2000000,
"cpm": 15.5,
"creatives": [11, 13],
"devices": [20300004, 20300003],
"channels": [11, 12]
}
]
}

Delete strategy​

DELETE

Delete a custom strategy by ID. Associated proposals and proposed campaigns are NOT deleted. Only custom strategies can be deleted.

Path parameters
strategyId
integer
Strategy ID.
Response 200
{
"success": true,
"data": {
"message": "Custom Strategy 1 has been deleted successfully"
}
}

More Political Planner details​

Get supported parameters​

GET

Get the supported parameters for Political plan configuration including CVA and targeting options. Each parameter value indicates whether it is supported (true) or unsupported (false).

Response 200
{
"success": true,
"data": {
"cva": {
"equation": false,
"stateIds": false,
"segmentIds": false,
"id": true,
"reach": true
},
"targeting": {
"whitelistedLocation": true,
"blacklistedLocation": true,
"whitelistedAudiences": true,
"blacklistedAudiences": true,
"prebidSegments": false,
"audienceSegments": true,
"creative": {
"creativeTypeIds": true
},
"device": {
"deviceTypeIds": true,
"channelTypeIds": true
},
"inventory": true
}
}
}

Get targeting types​

GET

Get the list of available targeting types for Political Planners.

Response properties
id
integer
Targeting type ID.
name
string
Targeting type name.
order
integer
Display order.
displayName
string
Targeting type display name.
Response 200
{
"success": true,
"data": [
{
"id": 1,
"name": "Location",
"order": 1,
"displayName": "Location"
}
]
}

Get strategy types​

GET

Get the list of available strategy types for Political Planners.

Response properties
id
integer
Strategy type ID.
name
string
Strategy type name.
order
integer
Display order.
displayName
string
Strategy type display name.
Response 200
{
"success": true,
"data": [
{
"id": 1,
"name": "maximum_reach",
"order": 1,
"displayName": "Maximum Reach"
},
{
"id": 2,
"name": "maximum_impressions",
"order": 2,
"displayName": "Maximum Impressions"
}
]
}

Get split types​

GET

Get the list of available split types for Political Planners.

Response properties
id
integer
Split type ID.
name
string
Split type name.
order
integer
Display order.
displayName
string
Split type display name.
Response 200
{
"success": true,
"data": [
{
"id": 1,
"name": "ai",
"order": 1,
"displayName": "AI"
},
{
"id": 2,
"name": "manual",
"order": 2,
"displayName": "Manual"
}
]
}

Get plan statuses​

GET

Get the list of available plan statuses for Political Planners.

Response properties
id
integer
Plan status ID.
name
string
Plan status name.
order
integer
Display order.
displayName
string
Plan status display name.
Response 200
{
"success": true,
"data": [
{
"id": 1,
"name": "draft",
"order": 1,
"displayName": "Draft"
},
{
"id": 2,
"name": "ready",
"order": 2,
"displayName": "Ready"
}
]
}

Get plan objectives​

GET

Get the list of available plan objectives for Political Planners.

Response properties
id
integer
Plan objective ID.
name
string
Plan objective name.
order
integer
Display order.
displayName
string
Plan objective display name.
Response 200
{
"success": true,
"data": [
{
"id": 1,
"name": "reach forecasting",
"order": 1,
"displayName": "Reach Forecasting"
},
{
"id": 2,
"name": "budget estimation",
"order": 2,
"displayName": "Budget Estimation"
},
{
"id": 3,
"name": "voter_tv+",
"order": 3,
"displayName": "Voter TV+"
}
]
}

Cross-screen Planner​

Get reach saturation graph​

POST

Fetch cross-screen Planner graph data based on the targeting and budgeting criteria provided, including a Venn-diagram audience overlap breakdown and a line graph of linear TV and CTV reach over time.

info

Computation time for this endpoint may take more than 60 seconds depending on the complexity of the targeting criteria and the size of the proposal being split. Please allow for sufficient time for the request to complete.

Request schema
name
string
Plan name.
objectiveId
integer
Plan objective ID.
Supported values
1Reach forecasting
2Budget estimation
3Voter TV+
totalBudget
number
Total plan budget.
lastVisitedScreen
string
Last visited screen in plan creation.
details
object
Plan details object (see plan resource properties).
targeting
object
Targeting object, including whiteListedLocation, ageGroupSegments, genderSegments, incomeRangeSegments, and ethnicitySegments (see plan resource properties).
Response properties
graphId
string
Unique identifier for the generated graph.
overview
object
Overview metrics.
overview object properties
linearTvCpm
number
Linear TV cost per thousand impressions.
ctvCpm
number
CTV cost per thousand impressions.
grp
number
Gross rating points.
linearTvPercentage
integer
Percentage of budget allocated to linear TV.
ctvFrequency
integer
Average CTV frequency.
audienceOverlap
object
Venn-diagram audience overlap data for the requested targeting and budget.
audienceOverlap object properties
population
integer
Total addressable population.
totalReach
integer
Total combined reach.
linearTvReach
integer
Linear TV reach.
ctvReach
integer
CTV reach.
overlapReach
integer
Reach overlapping between linear TV and CTV.
ctvIncrementalReach
integer
Incremental reach contributed by CTV.
maximumAudienceOverlap
object
Same shape as audienceOverlap, representing the maximum achievable overlap for the requested targeting and budget.
maximumAudienceOverlap object properties
population
integer
Total addressable population.
totalReach
integer
Total combined reach.
linearTvReach
integer
Linear TV reach.
ctvReach
integer
CTV reach.
overlapReach
integer
Reach overlapping between linear TV and CTV.
ctvIncrementalReach
integer
Incremental reach contributed by CTV.
reachSaturation
array of objects
Daily reach saturation data points.
reachSaturation object properties
day
integer
Day number in the flight.
ctvReach
integer
Cumulative CTV reach on this day.
linearTvReach
integer
Cumulative linear TV reach on this day.
overallReach
integer
Cumulative overall reach on this day.
Request sample
{
"name": "This is an example for request",
"objectiveId": 3,
"totalBudget": 1000000,
"lastVisitedScreen": "graph",
"details": {
"startDate": 1781244151000,
"endDate": 1791244151000,
"timezoneId": 29,
"frequencyCap": 3
},
"targeting": {
"whiteListedLocation": {
"country": 3010001,
"states": [2]
},
"ageGroupSegments": [6073147, 6073145, 6073146, 6073141, 6073144, 6073143, 6073142],
"genderSegments": [6189394, 6189395],
"incomeRangeSegments": [5999450, 5999451, 5999443, 5999448, 5999442, 5999446, 5999447, 5999449, 5999444, 5999445, 5999452, 5999453],
"ethnicitySegments": [6189388, 6189390, 6189391, 6189389, 6189392]
}
}
Response 200
{
"success": true,
"data": {
"graphId": "89c9639c44f05be2a3aaef9778fe6a24a04f441657172bba680ad66924a403fe",
"overview": {
"linearTvCpm": 20,
"ctvCpm": 7,
"grp": 180,
"linearTvPercentage": 50,
"ctvFrequency": 3
},
"audienceOverlap": {
"population": 16780000,
"totalReach": 6820000,
"linearTvReach": 4350000,
"ctvReach": 3120000,
"overlapReach": 650000,
"ctvIncrementalReach": 2470000
},
"maximumAudienceOverlap": {
"population": 16780000,
"totalReach": 7200000,
"linearTvReach": 4600000,
"ctvReach": 3400000,
"overlapReach": 800000,
"ctvIncrementalReach": 2600000
},
"reachSaturation": [
{ "day": 1, "ctvReach": 12, "linearTvReach": 14, "overallReach": 20 },
{ "day": 2, "ctvReach": 24, "linearTvReach": 28, "overallReach": 54 },
{ "day": 3, "ctvReach": 36, "linearTvReach": 32, "overallReach": 66 },
{ "day": 4, "ctvReach": 48, "linearTvReach": 34, "overallReach": 78 },
{ "day": 5, "ctvReach": 60, "linearTvReach": 34, "overallReach": 90 },
{ "day": 6, "ctvReach": 72, "linearTvReach": 34, "overallReach": 112 },
{ "day": 7, "ctvReach": 84, "linearTvReach": 34, "overallReach": 114 }
]
}
}

Get demographics keys​

GET

Get active demographics segment definitions used for cross-screen planning audience mapping (e.g. age, gender, income, and ethnicity groupings). Call without parentIds to get the top-level segment keys (categories like Age Group, Income Level). Call with parentIds set to one or more of those keys' ids to get the specific demographics values nested under them (e.g. 65+ under Age Group), each with its own parentId, reach, and display order.

Query parameters
parentIds
array of integers
Segment key ids to fetch demographics values for. Omit to get the top-level segment keys instead.
Response properties
id
integer
Demographics segment ID.
segmentId
integer
Segment ID used for audience targeting.
name
string
Segment display name.
parentId
integer
id of the parent segment key. Only present when parentIds was supplied in the request.
reach
integer
Reach for this demographics value. Only present when parentIds was supplied in the request.
order
integer
Display order of this demographics value. Only present when parentIds was supplied in the request.
Response 200 (segment keys, no parentIds)
{
"success": true,
"data": [
{
"id": 1,
"segmentId": 10,
"name": "Age Group"
},
{
"id": 2,
"segmentId": 2,
"name": "Income Range"
}
]
}
Response 200 (demographics values, parentIds=1,2)
{
"success": true,
"data": [
{
"id": 4,
"segmentId": 10,
"name": "65+",
"parentId": 1,
"reach": 5012322,
"order": 1
},
{
"id": 5,
"segmentId": 20,
"name": "100K+",
"parentId": 2,
"reach": 603242,
"order": 1
}
]
}

Split proposal​

POST

Split an existing proposal across linear TV and CTV using the provided advanced targeting criteria. Only works for cross-screen proposals with a plan objective ID of 3.

info

Computation time for this endpoint may take more than 60 seconds depending on the complexity of the targeting criteria and the size of the proposal being split. Please allow for sufficient time for the request to complete.

Path parameters
proposalId
integer required
Proposal ID to split.
Request schema
splitTypeId
integer
Split type ID.
Supported values
1AI
2Manual
locations
array of integers
Targeting type IDs for locations.
Supported values
1Location
devices
array of integers
Device type IDs.
Supported values
20300001Mobile
20300002Desktop
20300003Connected TV
20300004Tablet
20399999Unknown
inventoryGroupIds
array of integers
Inventory group IDs.
audienceTypes
array of integers
Audience type IDs.
Supported values
1Matched audience
2Segmented audience
3Retargeted audience
4Geofarmed audience
5Contextual audience
6Lookalike audience
7Campaign audience
8Pre-bid audience
9Account Based Marketing (ABM) audience
10Custom Voter Audience (CVA)
11Integrated Care Team (ICT) audience
12Power Segment audience
creatives
array of integers
Creative type IDs.
Supported values
0All
11Image
13HTML
14Video
15Native
17Audio
Response properties
id
integer
Proposal ID.
message
string
Confirmation message.
Request sample
{
"locations": [15]
}
Response 200
{
"success": true,
"data": {
"id": 42,
"message": "Proposal updated successfully."
}
}
Have a question?
Was this page helpful?