Insights API
Insights reports are one of IQM's analytics tools that help Advertisers quickly identify trends and apply precise adjustments to deliver better results for campaigns.
With pre-defined metrics and dimensions, Insights reports can be generated for the following areas:
| Type | Description | Notes |
|---|---|---|
| Campaign Bidding Insights | Campaign Bidding Insights capture rejected campaigns and segment them based on rejection reason, allowing you to assess which parameters are limiting a campaign’s success. | |
| Audience Insights report | Audience Insights reports provide in-depth reports of audience characteristics, interests, and behaviors to give you a deeper understanding of your target audience and create targeted and personalized advertising strategies. | |
| Power Segment Insights (PSI) | PSI reports provide audience data for pre-defined political personality segments, such as office-holders, candidates, and other public figures. Available to political vertical Advertisers only. | |
| Audience Quality (AQ) Insights report | AQ Insights reports leverage third-party healthcare data from PurpleLab to confirm audience exposure based on patient-level targeting criteria including prescriptions, diagnoses, and procedures. | |
| Voter Level Data (VLD) Insights report | VLD Insights reports offer information about targeting in current or prior political campaigns. These reports include ad exposure, engagement data, demographic data, and voting-history details by voter. | |
| Script Lift Study (SLS) Insights report | SLS Insights reports include key details about prescribing behaviors and how they are influenced by current and previous healthcare campaigns. | |
| Provider Level Data (PLD) Insights report | PLD Insights reports include details about healthcare professionals targeted in your campaigns, and provide similar details as VLD Insights reports while adhering to healthcare data privacy regulations. | PLD Insights, NLD Insights, and ICT Insights reports are handled by the Report templates endpoints with the category parameter. |
| Nurse Level Data (NLD) Insights report | NLD Insights reports offer deeper visibility into how Non-NPI nurses engage with your campaigns. They uncover ad-exposure, engagement, demographic, and physician-specialty data to reveal reach and impact. | |
| Integrated Care Team (ICT) Insights report | ICT Insights reports uncover key details about the ICT Audiences you’ve targeted in previous and current campaigns. |
Some Insights reports will need to be enabled by an administrator to access. By default VLD, PLD, SLS, and AQ Insights reports are not accessible to Advertiser users.
You can check an Advertiser's access to Insights reports with the Get Customer config details endpoint.
More resources
- Create an Insights report tutorial
- Reporting and analytics Help Center articles
- Audience Quality Insights reports Help Center articles
- Power Segment Insights report overview Help Center articles
- Voter Level Data (VLD) Insights reports Help Center articles
- Script Lift Study (SLS) Insights reports Help Center articles
- Provider Level Data (PLD) Insights reports Help Center articles
- Nurse Level Data (NLD) Insights reports Help Center articles
- Integrated Care Team (ICT) Insights reports Help Center articles
Authentication
Use the following header parameters for all requests:
| Headers | |
|---|---|
Authentication string required | Authentication bearer token. See Sign up and authenticate. |
X-IAA-OW-ID integer required | Organization Workspace ID header. |
Insights report details
Get a list of Insights reports
GETGet a list of Insights reports available in the database.
An Insights id can be used to perform various actions in Insights report management endpoints.
| Query parameters | |
|---|---|
searchField string | Filter results by search field. |
pageSize integer | Number of entries returned per page, default: 20. |
pageNo integer | Page number of retrieved data. |
sortBy string | Sorts by ascending (+) or descending (-), default: -id. |
Response properties
id integer | Insights report ID. |
typeId integer | Insights report type ID. |
statusId integer | Insights report status ID. |
namestring | Insights report name. |
sourceIdinteger | Insights report source ID. |
createdAtinteger | Unix epoch timestamp of Insights creation date, in milliseconds. |
- JSON
- TypeScript
{
"success": true,
"data": {
"totalRecords": 1,
"filterRecords": 1,
"insightsData": [
{
"id": 123,
"typeId": 1,
"statusId": 2,
"name": "demo_insights",
"sourceId": 123,
"createdAt": 1687848574780
}
]
}
}
See TypeScript prerequisites for usage.
import {
getInstance
} from "prerequisites"
const axios = getInstance();
interface Responses {
200: {
content: {
"application/json": {
success: boolean;
data: {
totalRecords: number;
filterRecords: number;
insightsData: {
id: number;
typeId: number;
statusId: number;
name: string;
sourceId: number;
createdAt: number
}
}
}
};
};
};
function getInsightsDetailList(): Promise<Responses> {
const options = {
method: 'GET',
url: 'https://api.iqm.com/api/v3/ins/insights/list',
params: {
query?: {
searchField?: `string`,
pageSize?: `number`,
pageNo?: `number`,
sortBy?: `string`,
}
}
};
return axios.request(options).then(({ data }: { data: Responses }) => data);
}
Get Campaign Bidding Insights
GETCampaign Bidding Insights provides a list of bid rejection reasons for a given campaign ID.
A campaign must meet the following eligibility criteria to generate Campaign Bidding Insights:
- More than 1 impression captured
- "running," "expired" (within last two weeks), "paused" status
- Must have been active within the last two weeks
- Campaign type: "advanced"
| Path parameters | |
|---|---|
campaignId integer | Campaign ID. |
| Query parameters | |
|---|---|
dateRangeStart integer required | Unix epoch timestamp, in milliseconds. |
dateRangeEnd integer required | Unix epoch timestamp, in milliseconds. |
Response properties
rejectionListobject | List of bid rejection reasons. | ||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||
campaignSettings object | Campaign settings. | |||||||||
ioBudget object | IO Budget. | |||||||||
inventoryTargeting object | Inventory targeting. | |||||||||
campaignBidPrice object | Campaign bid price. | |||||||||
locationTargeting object | Location targeting. | |||||||||
deviceTargeting object | Device targeting. | |||||||||
creativeSettings object | Creative settings. | |||||||||
advanceTargeting object | Advanced targeting. | |||||||||
audienceTargeting object | Audience targeting. | |||||||||
bidStrategy object | Bid strategy. | |||||||||
campaignBudget object | Campaign budget. | |||||||||
demographicsTargeting object | Demographics targeting. | |||||||||
undefined object | Undefined. | |||||||||
| ||||||||||
title string | Object title. |
rejectedBids integer | Rejected bids count. |
description string | description. |
subReasonInfo object | List of sub-reasons info. |
topMainReasons object
topSubReasons object
totalBids integer
lostBids integer
totalWins integer
Bid rejection descriptions
| ||||||||||||
inactiveAccount | Bids dropped off because Advertiser's account with IQM is inactive. |
insufficientBalance | Bids dropped off because there is an insufficient balance in your account. |
creativeSettings subReasonInfo object properties
creativeRollPosition | Bids dropped off because the roll position (pre-, mid-, post-roll) didn't match the campaign's required roll position. |
creativePlayerSize | Bids dropped off because player size did not match campaign's required player size. |
creativeDimension | Bids dropped off due to the size of creative. |
creativeUnavailable | Bids dropped off due to the campaign's creative settings, such as creative type, dimensions, duration and others. |
ioBudgetaudienceUnavailablecampaignBidPriceoperatingSystemdeviceTargeting subReasonInfo object properties
manufacturer | Bids dropped off because the Manufacturer did not match the campaign's Manufacturer parameters. |
deviceType | Bids dropped off because the Device Type did not match the campaign's Device Type targeting parameters. |
channels | Bids dropped off because Channels did not match the campaign's Channel Targeting Parameters. |
networkTypes | Bids dropped off because Network Type did not match the campaign's Network Type requirements. |
carrier | Bids dropped off because Carrier did not match the campaign's Carrier requirements. |
- JSON
- TypeScript
{
"success": true,
"data": {
"totalRequests": 100,
"rejectionList": {
"campaignSettings": {
"title": "Campaign Settings",
"rejectedBids": 0,
"description": "Campaign is filtered due to Campaign Settings set in the campaign.",
"subReasonInfo": {}
},
"ioBudget": {
"title": "IO Budget",
"rejectedBids": 0,
"description": null,
"subReasonInfo": {}
},
"inventoryTargeting": {
"title": "Inventory Targeting",
"rejectedBids": 0,
"description": "Campaign is filtered due to Inventory Targeting.",
"subReasonInfo": {}
},
"campaignBidPrice": {
"title": "Campaign Bid Price",
"rejectedBids": 0,
"description": "Campaign is filtered because the bid price is lower than the floor price received from the exchange.",
"subReasonInfo": {}
},
"locationTargeting": {
"title": "Location Targeting",
"rejectedBids": 0,
"description": "Campaign is filtered due to Location Targeting.",
"subReasonInfo": {}
},
"deviceTargeting": {
"title": "Device Targeting",
"rejectedBids": 0,
"description": "Campaign is filtered due to Device Targeting.",
"subReasonInfo": {}
},
"creativeSettings": {
"label": "Creative Settings",
"rejectedBids": 100,
"description": "Campaign is filtered due to non-matching creative dimensions found in the request",
"subReasonInfo": {
"creativeDimension": {
"label": "Creative Dimensions",
"droppedRequests": 100,
"description": "Campaign is filtered due to non-matching creative dimensions found in the request."
}
}
},
"advanceTargeting": {
"title": "Advanced Targeting",
"rejectedBids": 0,
"description": null,
"subReasonInfo": {}
},
"audienceTargeting": {
"title": "Audience Targeting",
"rejectedBids": 0,
"description": "Campaign is filtered due to Audience Targeting.",
"subReasonInfo": {}
},
"bidStrategy": {
"title": "Bid Strategy",
"rejectedBids": 0,
"description": "Campaign is filtered due to bid strategy setting applied in campaign.",
"subReasonInfo": {}
},
"campaignBudget": {
"title": "Campaign Budget",
"rejectedBids": 0,
"description": "Campaign is filtered because the campaign budget is now unavailable for further bidding.",
"subReasonInfo": {}
},
"demographicsTargeting": {
"title": "Demographics Targeting",
"rejectedBids": 0,
"description": "Campaign is filtered due to Demographics Targeting.",
"subReasonInfo": {}
},
"undefined": {
"title": "Undefined",
"rejectedBids": 0,
"description": "Campaign is filtered due to Undefined reasons.",
"subReasonInfo": {}
}
},
"topMainReasons": {
"creativeSettings": 100
},
"topSubReasons": {
"creativeDimension": 100
},
"totalBids": 0,
"lostBids": 0,
"totalWins": 0
}
}
{
"success": false,
"errorObjects": [
{
"error": "Date Range End must be greater than Date Range Start"
}
]
}
See TypeScript prerequisites for usage.
import {
getInstance
} from "prerequisites"
const axios = getInstance();
interface Responses {
200: {
content: {
"application/json": {
success: boolean;
data: {
totalRequests: number;
rejectionList: {
campaignSettings: {
title: string;
rejectedBids: number;
description: string;
subReasonInfo: {}
};
ioBudget: {
title: string;
rejectedBids: number;
description: string;
subReasonInfo: {}
};
inventoryTargeting: {
title: string;
rejectedBids: number;
description: string;
subReasonInfo: {}
};
campaignBidPrice: {
title: string;
rejectedBids: number;
description: string;
subReasonInfo: {}
};
locationTargeting: {
title: string;
rejectedBids: number;
description: string;
subReasonInfo: {}
};
deviceTargeting: {
title: string;
rejectedBids: number;
description: string;
subReasonInfo: {}
};
creativeSettings: {
title: string;
rejectedBids: number;
description: string;
subReasonInfo: {
creativeDimension: {
label: string;
droppedRequests: number;
description: string;
}
}
};
advancedTargeting: {
title: string;
rejectedBids: number;
description: string;
subReasonInfo: {}
};
audienceTargeting: {
title: string;
rejectedBids: number;
description: string;
subReasonInfo: {}
};
bidStrategy: {
title: string;
rejectedBids: number;
description: string;
subReasonInfo: {}
};
campaignBudget: {
title: string;
rejectedBids: number;
description: string;
subReasonInfo: {}
};
demographicsTargeting: {
title: string;
rejectedBids: number;
description: string;
subReasonInfo: {}
};
undefined: {
title: string;
rejectedBids: number;
description: string;
subReasonInfo: {}
}
};
topMainReasons: {
creativeSettings: number
};
topSubReasons: {
creativeSettings: number
};
totalBids: number;
lostBids: number;
totalWins: number;
}
}
};
};
422: {
content: {
"application/json": {
success: boolean;
errorObjects: {
error: string;
}[]
}
};
};
};
function getCampaignBiddingInsight(): Promise<Responses> {
const options = {
method: 'GET',
url: 'https://api.iqm.com/api/v3/ins/campaign/bid-insights/{campaignId}',
params: {
query: {
dateRangeStart: `number`,
dateRangeEnd: `number`,
}
}
};
return axios.request(options).then(({ data }: { data: Responses }) => data);
}
Get Insights reports count by type
GETGet a count of Insights reports by type ID. See list of Insights report type IDs.
Response properties
data object | Name-Value pairs of insightsTypeId and count. |
- JSON
- TypeScript
{
"success": true,
"data": {
"1": 32,
"3": 20
}
}
See TypeScript prerequisites for usage.
import {
getInstance
} from "prerequisites"
const axios = getInstance();
interface Responses {
200: {
content: {
"application/json": {
success: boolean;
data: {
[insightsTypeId: number]: number;
}
}
};
};
};
function getInsightsTypeWiseCount(): Promise<Responses> {
const options = {
method: 'GET',
url: 'https://api.iqm.com/api/v3/ins/insights/type-wise-count',
};
return axios.request(options).then(({ data }: { data: Responses }) => data);
}
Get eligible campaigns
GETGet a status-wise list of eligible campaigns for generation of PLD, ICT, or NLD Insights reports.
Eligible campaign IDs can be used in the Calculate Insights computation and Create report template endpoints.
| Query parameters | |
|---|---|
reportType string required | Type of report: pld, ict, or nld. |
Response properties
running array of objects | Campaigns with running status. | |||||
paused array of objects | Campaigns with paused status. | |||||
expired array of objects | Campaigns with expired status. | |||||
Campaign object properties
| ||||||
- JSON
- TypeScript
{
"success": true,
"data": {
"running": [
{
"campaignId": 451351,
"campaignTimezoneId": 29
}
],
"paused": [
{
"campaignId": 451350,
"campaignTimezoneId": 29
}
],
"expired": [
{
"campaignId": 470839,
"campaignTimezoneId": 29
}
]
}
}
{
"success": false,
"errorObjects": [
{
"error": "Invalid report type provided : vlds"
}
]
}
See TypeScript prerequisites for usage.
import {
getInstance
} from "prerequisites"
const axios = getInstance();
interface Responses {
200: {
content: {
"application/json": {
success: boolean;
data: {
running: {
campaignId: number;
campaignTimezoneId: number;
}[];
paused: {
campaignId: number;
campaignTimezoneId: number;
}[];
expired: {
campaignId: number;
campaignTimezoneId: number;
}[];
}
}
};
};
}
function getEligibleCampaigns(): Promise<Responses> {
const options = {
method: 'GET',
url: 'https://api.iqm.com/api/v3/ins/insights/eligible-campaigns',
params: {
query: {
reportType: `string`,
}
}
};
return axios.request(options).then(({ data }: { data: Responses }) => data);
}
Calculate Insights computation
POSTCompute the cost and impressions for creation of PLD, ICT, or NLD Insights reports based on the provided campaign IDs and date range.
The computation calculates the chargeable impressions and cost based on the markup charged to the Organization. This returns an estimate only; it doesn't create a report or charge the account.
| Request schema | |
|---|---|
category string required | Insights type category: pld, ict, or nld. |
campaignIds array of integers required | Campaign IDs for which to compute the report. |
startDate integer required | Unix epoch timestamp of report start date, in milliseconds. |
endDate integer required | Unix epoch timestamp of report end date, in milliseconds. |
reportId integer | ID of an existing report (for example, a failed one) to price its regeneration. When set, the other fields aren't needed. |
Response properties
ioId integer | Insertion order ID. |
ioName string | Insertion order name. |
startDate integer | Unix epoch timestamp of report start date, in milliseconds. |
endDate integer | Unix epoch timestamp of report end date, in milliseconds. |
campaignIds array of integers | Campaign IDs included in the computation. |
reportCreatable boolean | Indicates whether the report can be created. |
chargeableImps integer | Number of chargeable impressions. |
chargedImps integer | Impressions already paid for by an earlier report of the same type. These aren't billed again. |
chargeableCost number | Chargeable cost amount. |
chargedCost number | Cost of impressions already paid for by an earlier report of the same type. This isn't billed again. |
fundsAvailable boolean | Indicates whether sufficient funds are available. |
effectiveRate number | Rate per 1,000 impressions (CPM) for this report type. |
templateId integer | Associated template ID. |
- JSON
- TypeScript
{
"category": "pld",
"campaignIds": [451351, 451352],
"startDate": 1640995200000,
"endDate": 1643673599000
}
{
"success": true,
"data": {
"ioId": 101,
"ioName": "Test IO",
"startDate": 1742898000000,
"endDate": 1774238399000,
"campaignIds": [11011],
"reportCreatable": true,
"chargeableImps": 100,
"chargedImps": 25,
"chargeableCost": 345.23,
"chargedCost": 45.21,
"fundsAvailable": true,
"effectiveRate": 3.45,
"templateId": 111
}
}
{
"success": false,
"errorObjects": [
{
"error": "Date range is invalid or exceeds maximum allowed period"
}
]
}
See TypeScript prerequisites for usage.
import {
getInstance
} from "prerequisites"
const axios = getInstance();
interface Responses {
200: {
content: {
"application/json": {
success: boolean;
data: {
ioId: number;
ioName: string;
startDate: number;
endDate: number;
campaignIds: number[];
reportCreatable: boolean;
chargeableImps: number;
chargedImps: number;
chargeableCost: number;
chargedCost: number;
fundsAvailable: boolean;
effectiveRate: number;
templateId: number;
}
}
};
};
}
function computeInsightsReports(): Promise<Responses> {
const options = {
method: 'POST',
url: 'https://api.iqm.com/api/v3/ins/insights/computation',
requestBody: {
content: {
"application/json": {
category: `string`,
campaignIds: `number[]`,
startDate: `number`,
endDate: `number`,
}
}
}
};
return axios.request(options).then(({ data }: { data: Responses }) => data);
}
Insights report management
Delete Insights report record
DELETEDelete records from the database for valid Insights reports IDs passed.
| Query parameters | |
|---|---|
insightsIds string | Comma separated Insights report IDs to delete. |
Response properties
deletedIds array of integers | Deleted Insights report records. |
invalidIDs array of integers | Invalid IDs. |
- JSON
- TypeScript
{
"success": true,
"data": {
"deletedIds": [
35,
34
],
"invalidIds": [
33,
1
]
}
}
See TypeScript prerequisites for usage.
import {
getInstance
} from "prerequisites"
const axios = getInstance();
interface Responses {
200: {
content: {
"application/json": {
success: boolean;
data: {
deletedIds: number[];
invalidIds: number[];
}
}
};
};
};
function deleteInsights(): Promise<Responses> {
const options = {
method: 'DELETE',
url: 'https://api.iqm.com/api/v3/ins/insights/delete',
params: {
query: {
insightsId: `array of numbers`
}
}
};
return axios.request(options).then(({ data }: { data: Responses }) => data);
}
Regenerate Insights report
POSTRegenerates an Insights report.
| Path parameters | |
|---|---|
insightsIds string | Comma separated Insights report IDs to regenerate. |
Response properties
success boolean | Indicates Insights report was successfully regenerated: true. |
data string | Success message. |
- JSON
- TypeScript
{
"success": true,
"data": "Insights regenerated successfully."
}
{
"success": false,
"errorObjects": [
{
"error": "error message."
}
]
}
See TypeScript prerequisites for usage.
import {
getInstance
} from "prerequisites"
const axios = getInstance();
interface Responses {
200: {
content: {
"application/json": {
success: boolean;
data: string;
}
};
};
422: {
content: {
"application/json": {
success: boolean;
errorObjects: Array<{ error: string }>;
}
};
};
};
function regenerateInsights_1(): Promise<Responses> {
const options = {
method: 'POST',
url: 'https://api.iqm.com/api/v3/ins/insights/regenerate/{insightsId}',
params: {
path: {
insightsId: `number`
}
}
};
return axios.request(options).then(({ data }: { data: Responses }) => data);
}
Send Insights report email
POSTSend an attached Insights report file via email to specified recipients.
| Query parameters | |
|---|---|
id integer | Insights report ID. |
attachmentType string | File type of report: pdf or xlsx. |
recipientEmails string | Comma separated string of emails to send Insights report to, up to 15. |
| Request schema | |
|---|---|
file string | Multipart/form-data format. |
Response properties
success boolean | Indicates Insights report email was successfully sent: true. |
data string | Success message. |
- JSON
- TypeScript
{
"file": "string"
}
{
"success": true,
"data": "Insights-1 pdf email sent successfully."
}
See TypeScript prerequisites for usage.
import {
getInstance
} from "prerequisites"
const axios = getInstance();
interface Responses {
200: {
content: {
"application/json": {
success: boolean;
data: string
}
};
};
};
function sendInsightsEmail(): Promise<Responses> {
const options = {
method: 'POST',
url: 'https://api.iqm.com/api/v3/ins/send-email',
params: {
query: {
id: `number`,
attachmentType: `string`,
recipientEmails: `string`,
},
},
requestBody?: {
content: {
"application/json": {
file?: `string`
}
}
}
};
return axios.request(options).then(({ data }: { data: Responses }) => data);
}
Audience Insights report
Get a list of eligible audiences
GETGet a list of audiences eligible for an Insights report.
Audiences must have a minimum of 10,000 uniques to be eligible for Insights report generation.
| Query parameters | |
|---|---|
searchField string | Filter results by search field. |
pageSize integer | Number of entries returned per page, default: 20. |
pageNo integer | Page number of retrieved data. |
sortBy string | Sorts by ascending (+) or descending (-), default: -id. |
Response properties
insightsData object | Insights report data details. | |||||||||
| ||||||||||
id integer | Audience ID. |
audienceName string | Audience name. |
matchRate integer | The percentage of matched records compared to a reference set. |
uniques integer | Count of unique audiences reached. |
- JSON
- TypeScript
{
"success": true,
"data": {
"totalRecords": 10,
"filteredRecords": 3,
"insightsData": [
{
"id": 12345,
"audienceName": "audience1",
"matchRate": 58.99,
"uniques": 52432
},
{
"id": 12365,
"audienceName": "audience2",
"matchRate": 78.88,
"uniques": 72786
},
{
"id": 12376,
"audienceName": "audience3",
"matchRate": 34.88,
"uniques": 31122
}
]
}
}
See TypeScript prerequisites for usage.
import {
getInstance
} from "prerequisites"
const axios = getInstance();
interface Responses {
200: {
content: {
"application/json": {
success: boolean;
data: {
totalRecords: number;
filteredRecords: number;
insightsData: {
id: number;
audienceName: string;
matchRate: number;
uniques: number;
}[]
}
}
};
};
};
function getInsightsCreateEligibleAudienceList(): Promise<Responses> {
const options = {
method: 'GET',
url: 'https://api.iqm.com/api/v3/ins/audiences/list',
params: {
query?: {
searchField?: `string`,
pageSize?: `number`,
pageNo?: `number`,
sortBy?: `string`,
}
}
};
return axios.request(options).then(({ data }: { data: Responses }) => data);
}
Get Matched audience details
GETGet Matched audience details by audience ID.
| Path parameters | |
|---|---|
audienceId integer | Audience ID. |
Response properties
matchedAudienceData object | Matched Audience Insights report details. | |||||||||||||||||
| ||||||||||||||||||
audienceName string | Audience name. |
matchRate integer | The percentage of matched records compared to a reference set. |
uniques integer | Count of unique audiences reached. |
createdDate integer | Unix epoch timestamp of Audience Insights report creation date, in milliseconds. |
fileTotalCount integer | Total number of records in the uploaded audience file. |
dataCost integer | Fees charged by the platform if the audience is used in any campaign. |
audienceStatusName string | Audience status. |
s3FileName string | S3 file name. |
- JSON
- TypeScript
{
"success": true,
"data": {
"matchedAudienceData": {
"audienceName": "Data Trust NY 4 Cols",
"matchRate": 90.0,
"uniques": 90,
"createdDate": 1728010319,
"fileTotalCount": 100,
"dataCost": 2.0,
"audienceStatusName": "Ready",
"s3FileName": "1728010319692_DataTrust_NY_4_Cols.csv"
}
}
}
See TypeScript prerequisites for usage.
import {
getInstance
} from "prerequisites"
const axios = getInstance();
interface Responses {
200: {
content: {
"application/json": {
success: boolean;
data: {
matchedAudienceData: {
audienceName: string;
matchRate: number;
uniques: number;
createdDate: number;
fileTotalCount: number;
dataCost: number;
audienceStatusName: string;
s3FileName: string;
}
}
}
};
};
};
function getMatchedAudienceDetailsByAudienceId(): Promise<Responses> {
const options = {
method: 'GET',
url: 'https://api.iqm.com/api/v3/ins/audience/matched/{audienceId}',
params: {
path: {
audienceId: `number`
}
}
};
return axios.request(options).then(({ data }: { data: Responses }) => data);
}
Get Matched audience file URL
GETGet Matched audience details as a file URL.
| Path parameters | |
|---|---|
audienceId integer | Audience ID. |
Response properties
audienceFileUrl string | Matched audience file URL. |
- JSON
- TypeScript
{
"success": true,
"data": {
"audienceFileUrl": "https://iqm-data-lake-stage.s3.amazonaws.com/CAM-FILES/Client%3D202029/Audience%3D1099461/1728010319692_DataTrust_NY_4_Cols.csv?response-content-disposition=attachment%3Bfilename%3D1728010319692_DataTrust_NY_4_Cols.csv&response-content-type=application%2Foctet-stream&AWSAccessKeyId=ASIAZSYSEW2IDYRQV256&Signature=bg47k4d9Yr6XEp1%2B2AiQpG6UsH8%3D&x-amz-security-token=IQoJb3JpZ2luX2VjEDwaCXVzLWVhc3QtMSJIMEYCIQDZQ0HdONURAdKClNDJtsxRy2Q%2FuhAVl8j8mkg%2BYySOXAIhALLGdASViJ%2BjqGbMUOeNGVzSKJmWlO4Rndg9%2FwYMeFCvKoQECKT%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEQAhoMNjU4Nzc4NjY2NjQwIgxTA4EPtZELcoAi5R4q2APj0QWXoTRXCAdw7rbtrcGELFLafSFSWkvl2TlAs%2BIXPNNRwL2y2ymFrmlCOxqFCs9DTWR%2FMRvZMmn7CiN%2ByOPem4C8Rp%2BKE6VSTBeMvQrjQIl1l3S0NxluwzOuBiv%2FA2q0%2F2ehoIPkOOl0ecoghzO8%2FZFVPvVjJkWCnm6c8x2MubJXVYZdiOWd2MHaUmMzsIRlvvl4s30JW9iNnHyOdIyHf6JQ2FbYmKSX4SVEPrv7j7kUv3Vr2iffNE%2BQfGYNtQLr7Yu6yjXpko6N6oZ0BpKsw%2BmwgywN%2FWgPBOQUcwZsexrjBkN9%2BMfRWwOKRS%2F6mn80VYRNV%2F2bA0jDzUBVUmATCjmPFx2tovoveIbb7dwm627ulG0yAkJYx4pvn6OFuFQiZ8YMpWd3e9Hdz44Jm01dGZ%2FluW17THYmmIMOmf3UUSSlxjHm6MuzfULBmspjtAFi5apazS8zUVxwMaK2UfcRkWV%2FQjvziaEHNdaI%2FEStWpzz8E9KRApKtPTsU%2BeXtv2ol1O1Z4GgKOqWRquxqr0qD7rwBX2UjE1Vwp86zcQAxZSj84Uqy%2BqVdh1HUX037Tnpt5DIu9zeHQLHDV2KtH9swuDZyjiNa3z8Mmt%2BSO%2F5wzxOgo8srPyYMIyO3rgGOqQBlVBy4y2GJAjMy2fEyseApwBtfXxXtvcet2hHcTZma1iyMjNL9u92XgsVjHY89iBT4cFAfrTn5c8lswph9%2FKyTm%2FoOQpoxPmkoKD5qs1TCuBFXFXMp4d2Clb%2FUkSmqS01aiEkX1%2FrkAF3klbwrC1%2FUKR6%2BaMAahquyYXskHrlqwBHQ9oizw64rkXNIZeSlbfajnNTVmTkhh3QqyEJw9CYZTNN4hk%3D&Expires=1729596011"
}
}
See TypeScript prerequisites for usage.
import {
getInstance
} from "prerequisites"
const axios = getInstance();
interface Responses {
200: {
content: {
"application/json": {
success: boolean;
data: {
audienceFileUrl: string
}
}
};
};
};
function downloadMatchedAudienceFile(): Promise<Responses> {
const options = {
method: 'GET',
url: 'https://api.iqm.com/api/v3/ins/audience/matched/download/{audienceId}',
params: {
path: {
audienceId: `number`
}
}
};
return axios.request(options).then(({ data }: { data: Responses }) => data);
}
Create Audience Insights report
POSTCreate an Insights report for a given audience ID.
Check the list of eligible audiences and Matched audience details endpoints for eligible audiences.
An audience must meet the following eligibility criteria to generate Insights report:
- Must be Matched audience type
- Audience status: "ready"
- Audience reach: 10,000+
- (Recommended) audience creation date within the last year
| Request schema | |
|---|---|
insightsTypeId integer | Insights type ID. |
sourceIds integer | Source IDs. (E.g. audience IDs). |
Response properties
invalidSourceIds array of integers | Invalid source IDs list. | |||||||||||||||
insightsData object | Insights data details. | |||||||||||||||
| ||||||||||||||||
id integer | Audience Insights report ID. |
typeId integer | Insights report type ID. |
statusId integer | Insights report status ID. |
sourceName string | Source name. |
name string | Insights report name. |
sourceId integer | Source ID. |
createdAtinteger | Unix epoch timestamp of Insights report creation date, in milliseconds. |
- JSON
- TypeScript
{
"insightsTypeId": 1,
"sourceIds": [
567895,
925436,
123677
]
}
{
"success": true,
"data": {
"invalidSourceIds": [],
"insightsData": [
{
"id": 1213,
"typeId": 1,
"statusId": 2,
"sourceName": "Data Trust NY 4 Cols",
"name": "Data Trust NY 4 Cols_insights",
"sourceId": 1099461,
"createdAt": 1728366883518
}
]
}
}
See TypeScript prerequisites for usage.
import {
getInstance
} from "prerequisites"
const axios = getInstance();
interface Responses {
200: {
content: {
"application/json": {
success: boolean;
data: {
invalidSourceIds: number[];
insightsData: {
id: number;
typeId: number;
statusId: number;
sourceName: string;
name: string;
sourceId: number;
createdAt: number;
}[]
}
}
};
};
};
function createInsightsDetails(): Promise<Responses> {
const options = {
method: 'POST',
url: 'https://api.iqm.com/api/v3/ins/insights/add',
requestBody: {
content: {
"application/json": {
insightsTypeId?: `number`,
sourceIds?: `array of numbers`,
owId?: `number`,
uowId?: `number`,
}
}
}
};
return axios.request(options).then(({ data }: { data: Responses }) => data);
}
Download Insights report
POSTDownload Insights report for audience (pdf or xlsx) by passing multipart/form-data format.
| Query parameters | |
|---|---|
insightsId integer | Insights report ID. |
fileType string | File type of report: pdf or xlsx. |
| Request schema | |
|---|---|
customLogoFile string | Multipart/form-data format. |
Response properties
insightsReportUrl string | Insights report URL. |
- JSON
- TypeScript
{
"customLogoFile": "string"
}
{
"success": true,
"data": {
"insightsReportUrl": "https://domain.com/insights.pdf"
}
}
See TypeScript prerequisites for usage.
import {
getInstance
} from "prerequisites"
const axios = getInstance();
interface Responses {
200: {
content: {
"application/json": {
success: boolean;
data: {
insightsReportUrl: string;
}
}
};
};
};
function downloadInsights(): Promise<Responses> {
const options = {
method: 'POST',
url: 'https://api.iqm.com/api/v3/ins/insights/download',
params: {
query: {
insightsId: `number`,
fileType: `string`
}
},
requestBody?: {
content: {
"application/json": {
customLogoFile?: `string`
}
}
}
};
return axios.request(options).then(({ data }: { data: Responses }) => data);
}
Power Segment Insights
Power Segment Insights (PSI) is available to Political vertical Advertisers only.
Generate PSI report
POSTInitiates report generation for a Power Segment identified by its taxonomyId. The request is forwarded to the data team after validating the segment's current report status.
Only segments with a status of NotRequested or Failed can be triggered.
See Get Power Segment Insights list.
| Request schema | |
|---|---|
taxonomyId string | Taxonomy ID of the Power Segment. |
Response properties
message string | Success message. |
- JSON
- TypeScript
{
"taxonomyId": "IQMADV0002606"
}
{
"success": true,
"data": {
"message": "Report generation initiated successfully."
}
}
{
"success": false,
"errorObjects": [
{
"error": "Report generation cannot be initiated. Current report status is: Processing"
}
]
}
See TypeScript prerequisites for usage.
import {
getInstance
} from "prerequisites"
const axios = getInstance();
interface Responses {
200: {
content: {
"application/json": {
success: boolean;
data: {
message: string;
}
}
};
};
};
function generatePsiReport(): Promise<Responses> {
const options = {
method: 'POST',
url: 'https://api.iqm.com/api/v3/ins/psi/generate-report',
requestBody: {
content: {
"application/json": {
taxonomyId: `string`,
}
}
}
};
return axios.request(options).then(({ data }: { data: Responses }) => data);
}
Get Power Segment Insights list
GETGet a list of Power Segments and their available reports, based on search, sorting, and pagination criteria.
| Query parameters | |
|---|---|
searchField string | Search Power Segments by name. |
sortBy string | Sorts by ascending (+) or descending (-), allowed values: id, name, category. |
pageNo integer | Page number of retrieved data. |
noOfEntries integer | Number of entries returned per page, default: 20. |
categories array of strings | Filter Power Segments by category name, e.g. CABINET_MEMBERS. |
visibilityScope array of strings | Filter by visibility scope, allowed values: public, private. Default: public. |
Response properties
totalRecords integer | Total number of Power Segments. | ||||||||||||||||||||||
filteredRecords integer | Number of Power Segments matching the search/filter criteria. | ||||||||||||||||||||||
powerSegmentsReports array of objects | Power Segments matching the search/filter criteria. | ||||||||||||||||||||||
object properties
| |||||||||||||||||||||||
- JSON
- TypeScript
{
"success": true,
"data": {
"totalRecords": 2,
"filteredRecords": 2,
"powerSegmentsReports": [
{
"id": 1,
"name": "Donald Trump",
"category": "Neptune",
"reports": [
{
"type": "SPHERE",
"status": "NotRequested",
"generationTime": 3.0,
"sizeInBytes": null,
"taxonomyId": "283230NNJW"
},
{
"type": "ORBIT",
"status": "NotRequested",
"generationTime": 3.0,
"sizeInBytes": null,
"taxonomyId": "56329JJSH67"
}
]
},
{
"id": 2,
"name": "Hillary Clinton",
"category": null,
"reports": [
{
"type": "SPHERE",
"status": "NotRequested",
"generationTime": 3.0,
"sizeInBytes": null,
"taxonomyId": "HHKNW972JL"
}
]
}
]
}
}
See TypeScript prerequisites for usage.
import {
getInstance
} from "prerequisites"
const axios = getInstance();
interface Responses {
200: {
content: {
"application/json": {
success: boolean;
data: {
totalRecords: number;
filteredRecords: number;
powerSegmentsReports: {
id: number;
name: string;
category: string | null;
reports: {
type: string;
status: string;
generationTime: number;
sizeInBytes: number | null;
taxonomyId: string;
}[];
}[];
}
}
};
};
};
function getPowerSegmentInsightsList(): Promise<Responses> {
const options = {
method: 'GET',
url: 'https://api.iqm.com/api/v3/ins/psi/list',
params: {
query: {
searchField?: `string`,
sortBy?: `string`,
pageNo?: `number`,
noOfEntries?: `number`,
categories?: `string[]`,
visibilityScope?: `string[]`,
},
},
};
return axios.request(options).then(({ data }: { data: Responses }) => data);
}
Download PSI report
GETGet a presigned S3 URL for downloading the PSI report PDF for the given taxonomyId. The report must be in Ready status. If the segment's personality is private, only the owning organization can download it.
| Query parameters | |
|---|---|
taxonomyId string required | Taxonomy ID of the Power Segment. |
Response properties
reportURL string | Presigned URL for downloading the PSI report PDF. |
- JSON
- TypeScript
{
"success": true,
"data": {
"reportURL": "https://s3.amazonaws.com/..."
}
}
{
"success": false,
"errorObjects": [
{
"error": "Report is not ready for download."
}
]
}
See TypeScript prerequisites for usage.
import {
getInstance
} from "prerequisites"
const axios = getInstance();
interface Responses {
200: {
content: {
"application/json": {
success: boolean;
data: {
reportURL: string;
}
}
};
};
};
function downloadPsiReport(): Promise<Responses> {
const options = {
method: 'GET',
url: 'https://api.iqm.com/api/v3/ins/psi/download-report',
params: {
query: {
taxonomyId: `string`,
},
},
};
return axios.request(options).then(({ data }: { data: Responses }) => data);
}
Email PSI report
POSTSends the PSI report PDF for the given taxonomyId to the specified email addresses.
If the file is 10 MB or smaller the PDF is attached directly; otherwise the email includes a download link only. The report must be in Ready status.
| Query parameters | |
|---|---|
taxonomyId string required | Taxonomy ID of the Power Segment. |
| Request schema | |
|---|---|
emailIds array of strings | Email addresses to send the report to, 1-15 addresses, each 1-320 characters. |
Response properties
message string | Success message. |
- JSON
- TypeScript
{
"emailIds": ["jane.doe@example.com"]
}
{
"success": true,
"data": {
"message": "Report email sent successfully."
}
}
{
"success": false,
"errorObjects": [
{
"error": "Report is not ready for download."
}
]
}
See TypeScript prerequisites for usage.
import {
getInstance
} from "prerequisites"
const axios = getInstance();
interface Responses {
200: {
content: {
"application/json": {
success: boolean;
data: {
message: string;
}
}
};
};
};
function emailPsiReport(): Promise<Responses> {
const options = {
method: 'POST',
url: 'https://api.iqm.com/api/v3/ins/psi/email',
params: {
query: {
taxonomyId: `string`,
},
},
requestBody: {
content: {
"application/json": {
emailIds: `string[]`,
}
}
}
};
return axios.request(options).then(({ data }: { data: Responses }) => data);
}
Get Power Segment Insights category types
GETGet all Power Segment Insights category types with their names, display names, and display orders.
Use name as the value for the categories filter on Get Power Segment Insights list.
- JSON
- TypeScript
{
"success": true,
"data": [
{ "id": 1, "name": "CABINET_MEMBERS", "displayName": "Cabinet Members", "order": 10 },
{ "id": 2, "name": "GOVERNOR", "displayName": "Governor", "order": 20 },
{ "id": 3, "name": "HOUSE_OF_REPRESENTATIVE", "displayName": "House of Representative", "order": 30 },
{ "id": 4, "name": "SENATOR", "displayName": "Senator", "order": 40 },
{ "id": 5, "name": "MAYOR", "displayName": "Mayor", "order": 50 }
]
}
See TypeScript prerequisites for usage.
import {
getInstance
} from "prerequisites"
const axios = getInstance();
interface Responses {
200: {
content: {
"application/json": {
success: boolean;
data: {
id: number;
name: string;
displayName: string;
order: number;
}[]
}
};
};
}
function getPsiCategoryTypes(): Promise<Responses> {
const options = {
method: 'GET',
url: 'https://api.iqm.com/api/v3/ins/static/psi/category-types',
};
return axios.request(options).then(({ data }: { data: Responses }) => data);
}
Get Power Segment Insights avatar URL
GETGet a presigned S3 URL for the profile avatar image at the given s3Path, scoped to the given taxonomyId. The report must be in Ready status. If the segment's personality is private, only the owning organization can access it.
| Query parameters | |
|---|---|
taxonomyId string required | Taxonomy ID of the Power Segment. |
s3Path string required | S3 URI of the profile avatar image, scoped under the segment's own taxonomy folder. |
Response properties
avatarURL string | Presigned URL for the profile avatar image. |
- JSON
- TypeScript
{
"success": true,
"data": {
"avatarURL": "https://s3.amazonaws.com/..."
}
}
{
"success": false,
"errorObjects": [
{
"error": "Avatar file not found for the provided taxonomyId: IQMADV0002606"
}
]
}
See TypeScript prerequisites for usage.
import {
getInstance
} from "prerequisites"
const axios = getInstance();
interface Responses {
200: {
content: {
"application/json": {
success: boolean;
data: {
avatarURL: string;
}
}
};
};
};
function getAvatarPresignedUrl(): Promise<Responses> {
const options = {
method: 'GET',
url: 'https://api.iqm.com/api/v3/ins/psi/avatar-url',
params: {
query: {
taxonomyId: `string`,
s3Path: `string`,
},
},
};
return axios.request(options).then(({ data }: { data: Responses }) => data);
}
Get Power Segment Insights report data
GETGet the PSI report JSON data from S3 for the given taxonomyId, used to render the Power Segment Insights report viewer. The report must be in Ready status. If the segment's personality is private, only the owning organization can access it.
| Query parameters | |
|---|---|
taxonomyId string required | Taxonomy ID of the Power Segment. |
Response properties
insightType string | Report type: SPHERE or ORBIT. |
data object | Report content used to render the report viewer. Its shape is generated by the backend's page-builder and may change as new block types are introduced. |
- JSON
- TypeScript
{
"success": true,
"data": {
"insightType": "ORBIT",
"data": {
"id": "IQMADV0002606",
"pageData": [
{
"title": "Profile",
"id": 1,
"blocks": [
{
"type": "profileHeader",
"data": {
"firstName": "John",
"lastName": "Doe",
"subjectTitle": "Senator",
"state": "Texas"
}
}
]
}
]
}
}
}
{
"success": false,
"errorObjects": [
{
"error": "This report is private and cannot be accessed"
}
]
}
{
"success": false,
"errorObjects": [
{
"error": "Report is not ready. Current report status is: Processing"
}
]
}
See TypeScript prerequisites for usage.
import {
getInstance
} from "prerequisites"
const axios = getInstance();
interface Responses {
200: {
content: {
"application/json": {
success: boolean;
data: {
insightType: string;
data: Record<string, unknown>;
}
}
};
};
};
function getReportData(): Promise<Responses> {
const options = {
method: 'GET',
url: 'https://api.iqm.com/api/v3/ins/psi/report-data',
params: {
query: {
taxonomyId: `string`,
},
},
};
return axios.request(options).then(({ data }: { data: Responses }) => data);
}
Audience Quality (AQ) Insights report
AQ Insights report eligibility requirements
AQ Insights reports are available for campaigns that meet certain requirements.
Read more about these requirements in our Help Center article.
| Requirement type | Requirement details | Notes |
|---|---|---|
| Campaign vertical | Healthcare. | Any campaign created under a Healthcare Advertiser account is a “Healthcare” campaign. |
| Audience type | Matched (Patient), Segmented (Patient). | |
| Audience status | Ready. | |
| Campaign type | Advanced, and targeting at least one patient audience. | |
| Campaign status | Running, Expired (within the past two years), Paused. | |
| Campaign impressions | 1K or more impressions. | |
| Campaign duration | 14 or more days. |
AQ Insights report resource properties
Resource properties
reportId integer | AQ Insights report ID. |
reportName string | AQ Insights report name. |
campaignId integer | Campaign ID. |
campaignName string | Campaign name. |
statusId integer | AQ Insights report status type ID. |
statusName string | AQ Insights report status name. |
startDate integer | Unix epoch timestamp of start date, in milliseconds. |
endDate integer | Unix epoch timestamp of end date, in milliseconds. |
ioId integer | Insertion order ID. |
ioName string | Insertion order name. |
ioBudgetType integer | Insertion order budget type ID. |
isCampaignEligible boolean | Indicates that campaign is eligible for AQ Insights report: true. |
reportCreatedOn integer | Unix epoch timestamp of creation date, in milliseconds. |
creativeTypeId integer | Creative type ID. |
campaignTimeZoneId integer | Timezone ID. |
fileSizeDetails object | Object containing file sizes by type ID (1: XLSX, 2: CSV). |
aqsReportCreatable boolean | Indicates if AQ Insights report can be generated for the given campaign and date range (true). |
aqsChargeableImps integer | The number of chargeable impressions for the requested AQ Insights report. |
aqsChargedImps integer | The number of impressions for which the AQ Insights report is already generated. |
aqsChargeableCost number | Cost to generate the AQ Insights report. |
aqsChargedCost number | Cost of AQ Insights report that is already generated. |
fundsAvailable boolean | Indicates if sufficient funds are available in the Advertiser's account to generate the AQ Insights report (true). |
effectiveAqsRate number | The effective rate applied for AQ Insights report generation. |
Get list of AQ Insights reports
GETGet a paginated list of AQ Insights reports with detailed information.
A reportId can be used in the Download AQ Insights report and Delete AQ Insights report endpoints.
| Query parameters | |
|---|---|
searchField string | Filter results by search field. |
noOfEntries integer | Number of entries returned per page, default: 200. |
pageNo integer | Page number of retrieved data, default: 1. |
sortBy string | Sorts by ascending (+) or descending (-), default: reportId. |
{
"success": true,
"data": {
"totalRecords": 10,
"reportDataList": [
{
"reportId": 10,
"reportName": "530667_AQS_Insights_7",
"campaignName": "prod-campaign-21145",
"campaignId": 21145,
"statusId": 3,
"statusName": "Completed",
"startDate": 1603152000000,
"endDate": 1603411200000,
"ioId": 5,
"ioName": "Corporate, Inc.",
"isCampaignEligible": false,
"reportCreatedOn": 1721253632000,
"creativeTypeId": 11,
"ioBudgetType": 1,
"campaignTimeZoneId": 29,
"fileSizeDetails": {
"1": 1024,
"2": 1024
}
},
{
"reportId": 9,
"reportName": "530667_AQS_Insights_6",
"campaignName": "Campaign-4949",
"campaignId": 4949,
"statusId": 3,
"statusName": "Completed",
"startDate": 1603152000000,
"endDate": 1603411200000,
"ioId": 15,
"ioName": "Quinton for Mayor",
"isCampaignEligible": false,
"reportCreatedOn": 1720325578000,
"creativeTypeId": 14,
"ioBudgetType": 1,
"campaignTimeZoneId": 29,
"fileSizeDetails": {
"1": 1024,
"2": 1024
}
}
],
"filteredRecords": 10
}
}
Get list of campaigns eligible for AQ Insights reports
GETGet a status-wise list of campaign IDs eligible for AQ Insights report generation.
Response properties
running, paused, expired array of objects | Object array of campaign IDs mapped to each of these three campaign statuses. | |||||
Object properties
| ||||||
{
"success": true,
"data": {
"running": [
{
"campaignId": 451351,
"campaignTimezoneId": 29
}
],
"paused": [
{
"campaignId": 451350,
"campaignTimezoneId": 29
}
],
"expired": [
{
"campaignId": 470839,
"campaignTimezoneId": 29
}
]
}
}
Validate AQ Insights report name
GETValidate the report name for generation of AQ Insights reports. Checks if the name meets length requirements (3-100 characters) and ensures uniqueness within the Organization.
| Query parameters | |
|---|---|
reportName string | Name of report to validate. |
Response properties
available boolean | Indicates if the report name is available: true. |
message string | Validation message. |
{
"success": true,
"data": {
"available": true,
"message": "This AQS report name is valid"
}
}
{
"success": true,
"data": {
"available": false,
"message": "The name 'report_name' is already used by another report, kindly update the name"
}
}
{
"success": false,
"errorObjects": [
{
"error": "Please provide name with at least 3 characters and maximum of 100 characters"
}
]
}
Compute AQ Insights report cost
POSTCompute the cost and impressions for AQ Insights report generation based on the campaign and date range. This returns an estimate only; it doesn't create a report or charge the account.
| Request schema | |
|---|---|
campaignId integer | Campaign ID. |
aqsId integer | AQ Insights report ID (for regeneration). |
aqsName string | AQ Insights report name. |
aqsStartDate integer | Unix epoch timestamp of start date, in milliseconds. |
aqsEndDate integer | Unix epoch timestamp of end date, in milliseconds. |
aqsReportTypeId integer | AQ Insights report type ID. |
aqsAudienceConceptGroups array of objects | Array of audience/concept group mappings. |
{
"campaignId": 1,
"aqsStartDate": 1722311000000,
"aqsEndDate": 1722315000000,
"aqsName": "Dummy AQS Name",
"aqsReportTypeId": 1,
"aqsAudienceConceptGroups": [{
"audienceId": 101,
"conceptGroupId": 202335
}]
}
{
"success": true,
"data": {
"aqsReportCreatable": true,
"campaignId": 1,
"aqsStartDate": 1722311000000,
"aqsEndDate": 1722315000000,
"aqsChargeableImps": 1000,
"aqsChargedImps": 100,
"aqsChargeableCost": 1000,
"aqsChargedCost": 100,
"aqsName": "Dummy AQS Name",
"aqsReportTypeId": 1,
"aqsAudienceConceptGroups": [{
"audienceId": 101,
"conceptGroupId": 202335
}],
"fundsAvailable": true
}
}
{
"success": true,
"data": {
"aqsReportCreatable": false,
"aqsId": 1,
"aqsName": "AQS report 1",
"aqsStatus": 1,
"aqsCreatedOn": 1722315234000,
"campaignId": 1,
"ioId": 1,
"ioName": "Insertion Order Name",
"ioTypeId": 1,
"aqsReportTypeId": 1,
"aqsAudienceConceptGroups": [{
"audienceId": 101,
"conceptGroupId": 202335
}]
}
}
{
"success": true,
"data": {
"aqsReportCreatable": false,
"message": "AQS Insights can't be generated for this campaigns at the moment as another insight with overlapping date range is processing"
}
}
Generate AQ Insights report
POSTGenerate an AQ Insights report. This endpoint calculates the cost for the impressions based on the impressions and mark up charged on the Organization and then creates the AQ Insights reports.
| Request schema | |
|---|---|
campaignId integer | Campaign ID. |
aqsId integer | AQ Insights report ID to regenerate. |
aqsName string | AQ Insights report name. |
aqsStartDate integer | Unix epoch timestamp of start date, in milliseconds. |
aqsEndDate integer | Unix epoch timestamp of end date, in milliseconds. |
aqsReportTypeId integer | AQ Insights report type ID. |
aqsAudienceConceptGroups array of objects | Array of audience/concept group mappings. |
{
"campaignId": 1,
"aqsStartDate": 1722311000000,
"aqsEndDate": 1722315000000,
"aqsName": "Dummy AQS Name",
"aqsReportTypeId": 1,
"aqsAudienceConceptGroups": [{
"audienceId": 101,
"conceptGroupId": 202335
}]
}
{
"aqsId": 1
}
{
"success": true,
"data": {
"aqsReportCreatable": true,
"aqsChargeableImps": 1,
"aqsChargedImps": 1,
"aqsChargeableCost": 1,
"aqsChargedCost": 1,
"fundsAvailable": true,
"effectiveAqsRate": 1
}
}
{
"success": true,
"data": {
"aqsReportCreatable": false,
"aqsId": 1,
"aqsName": "AQS report 1",
"aqsStatus": 1,
"aqsCreatedOn": 1722315234000,
"campaignId": 1,
"ioId": 1,
"ioName": "Insertion Order Name",
"ioTypeId": 1,
"aqsReportTypeId": 1,
"aqsAudienceConceptGroups": [{
"audienceId": 101,
"conceptGroupId": 202335
}]
}
}
{
"success": true,
"data": {
"aqsReportCreatable": false,
"message": "AQS Insights can't be generated for this campaigns at the moment as another insight with overlapping date range is processing"
}
}
Get AQ Insights report types
GETGet available AQ Insights report types. Returns a list of report types that can be generated. Only users from Advertiser Organizations are authorized to access this endpoint.
Response properties
reportTypeData array of objects | Array of report type objects. | |||||||||
Object properties
| ||||||||||
totalRecords integer | Total number of records. | |||||||||
filteredRecords integer | Number of filtered records. | |||||||||
{
"success": true,
"data": {
"reportTypeData": [
{
"id": 1,
"name": "audience",
"label": "Audience",
"order": 1
},
{
"id": 2,
"name": "Campaign",
"label": "Campaign",
"order": 2
}
],
"totalRecords": 2,
"filteredRecords": 2
}
}
Download AQ Insights report
POSTGet a download link for an AQ Insights report in CSV or XLSX format. Only reports with a 'ready' status are eligible for download.
| Request schema | |
|---|---|
fileTypeId integer | File type ID. |
reportId integer | AQ Insights report ID. |
Response properties
reportURL string | AQ Insights report file URL. |
{
"fileTypeId": 1,
"reportId": 50
}
{
"success": true,
"data": {
"reportURL": "https://download.domain.com/aqs-reports/2024-12-03/50_Report.xlsx?X-Amz-Algorithm=AWS4-HMAC"
}
}
More responses
{
"success": false,
"errorObjects": [
{
"error": "Unsupported file type provided. Please use fileType 1 for XLSX or 2 for CSV."
}
]
}
{
"success": false,
"errorObjects": [
{
"error": "Invalid sortBy value."
}
]
}
Email AQ Insights report
POSTSend an AQ Insights report to the provided email address(es) after validating the report ID and email addresses.
| Request schema | |
|---|---|
reportId integer required | AQ Insights report ID to email. |
fileTypeId integer required | File type ID. |
emailIds array of strings required | Recipient email addresses (1–15). |
Response properties
message string | Success message. |
- JSON
- TypeScript
{
"reportId": 50,
"fileTypeId": 1,
"emailIds": ["user1@email.com"]
}
{
"reportId": 50,
"fileTypeId": 2,
"emailIds": ["user1@email.com"]
}
{
"success": true,
"data": {
"message": "AQS report e-mail sent successfully."
}
}
See TypeScript prerequisites for usage.
import {
getInstance
} from "prerequisites"
const axios = getInstance();
interface Responses {
200: {
content: {
"application/json": {
success: boolean;
data: {
message: string;
};
}
};
};
};
function emailAQSReport(): Promise<Responses> {
const options = {
method: 'POST',
url: 'https://api.iqm.com/api/v3/ins/aqs-reports/email',
data: {
reportId: 50,
fileTypeId: 1,
emailIds: ['user1@email.com']
}
};
return axios.request(options).then(({ data }: { data: Responses }) => data);
}
Delete AQ Insights report
DELETEDelete AQ Insights reports that are not marked as deleted and have a 'failed' status. Requires user authorization and checks if the provided AQ Insights report IDs are valid.
| Query parameters | |
|---|---|
reportIds string | Comma-separated AQ Insights report IDs. |
Response properties
success boolean | Indicates report was successfully deleted: true. |
message string | Success message. |
{
"success": true,
"data": {
"message": "255944_AQS_Insights_2 deleted successfully"
}
}
Voter Level Data (VLD) Insights report
VLD Insights eligibility requirements
VLD Insights reports are available for campaigns that meet certain requirements.
Read more about these requirements in our Help Center article.
| Requirement type | Requirement details | Notes |
|---|---|---|
| Campaign vertical | Political. | Any campaign created under a Political Advertiser account is a “Political” campaign. |
| Campaign status | Running, Expired (within the past two years), Paused. | |
| Campaign duration | 3 or more days. | |
| Campaign creation date | September 16, 2024 or later (or earlier upon request to IQM's support team). | |
| Voter location | All US states except Oregon. | Due to privacy laws in the state of Oregon, we are unable to generate the VLD Insights report on any voters located there. Contact your account representative for more detailed information on the legality of reidentifying voters at the user level. |
| Audience type | Matched audience created from L2 IDs, Matched audience created from raw data. | Your campaign must only include the audience types listed in this requirements table. For example, you cannot generate a VLD Insights report for a campaign if it includes a Matched audience created from L2 IDs and a Retargeted audience consisting of your website’s past visitors. The VLD Insights report supports audiences you create using First Name, Last Name, Address, and Phone Number. IQM anonymizes the data in the matching process, encrypts the files, and stores them behind a firewall to protect them against information leaks. |
VLD Insights resource properties
Resource properties
vldId integer | VLD Insights ID. |
vldName string | VLD Insights name. |
vldStatus integer | VLD Insights status type ID. |
ioId integer | Insertion order ID. |
ioName string | Insertion order name. |
ioTypeId integer | Insertion order budget type ID. |
isCampaignEligible boolean | Indicates that campaign is eligible for VLD Insights report: true. |
vldCreatedOn integer | Unix epoch timestamp of creation date, in milliseconds. |
vldStartDate / startDate integer | Unix epoch timestamp of start date, in milliseconds. |
vldEndDate / endDate integer | Unix epoch timestamp of end date, in milliseconds. |
campaignId integer | Campaign ID. |
campaignName string | Campaign name. |
campaignStatus string | Campaign status type. |
creativeTypeId integer | Creative type ID. |
timezoneId integer | Timezone ID. |
vldReportCreatable boolean | Indicates if VLD Insights report can be generated for the given campaign and date range (true). |
vldChargeableImps integer | The number of chargeable impressions for the requested VLD Insights report. |
vldChargedImps integer | The number of impressions for which the VLD Insights report is already generated. |
vldChargeableCost integer | Cost to generate the VLD Insights report. |
vldChargedCost integer | Cost of VLD Insights report that is already generated. |
fundsAvailable boolean | Indicates if sufficient funds are available in the Advertiser's account to generate the VLD Insights report (true). |
effectiveVldRate integer | Margin rate set by the admin and Workspace for generating VLD Insights report. |
Get list of VLD Insights reports
GETGet a list of VLD Insights reports based on search filters.
A vldId can be used in the Generate VLD Insights report, Download VLD Insights report, and Delete VLD Insights report endpoints.
| Query parameters | |
|---|---|
searchField string | Filter results by search field. |
noOfEntries integer | Number of entries returned per page, default: 200. |
pageNo integer | Page number of retrieved data. |
sortBy string | Sorts by ascending (+) or descending (-), default: -vldId. |
- JSON
- TypeScript
{
"success": true,
"data": {
"totalRecords": 10,
"vldReportDataList": [
{
"vldId": 10,
"vldName": "530667_VLD_Insights_7",
"campaignName": "prod-campaign-21145",
"campaignId": 21145,
"vldStatus": 3,
"startDate": 1603152000,
"endDate": 1603411200,
"ioId": 5,
"ioName": "Corporate, Inc.",
"isCampaignEligible": false,
"vldCreatedOn": 1721253632,
"creativeTypeId": 11,
"timezoneId": 29,
"ioTypeId": 1
},
{
"vldId": 9,
"vldName": "530667_VLD_Insights_6",
"campaignName": "Campaign-4949",
"campaignId": 4949,
"vldStatus": 3,
"startDate": 1603152000,
"endDate": 1603411200,
"ioId": 15,
"ioName": "Quinton for Mayor",
"isCampaignEligible": false,
"vldCreatedOn": 1720325578,
"creativeTypeId": 14,
"timezoneId": 29,
"ioTypeId": 1
}
],
"filteredRecords": 10
}
}
See TypeScript prerequisites for usage.
import {
getInstance
} from "prerequisites"
const axios = getInstance();
interface Responses {
200: {
content: {
"application/json": {
success: boolean;
data: {
totalRecords: number;
vldReportDataList: {
vldId: number;
vldName: string;
campaignName: string;
campaignId: number;
vldStatus: number;
startDate: number;
endDate: number;
ioId: number;
ioName: string;
isCampaignEligible: boolean;
vldCreatedOn: number;
creativeTypeId: number;
timezoneId: number;
ioTypeId: number;
}[];
filteredRecords: number;
}
}
};
};
};
function getVLDReportList(): Promise<Responses> {
const options = {
method: 'GET',
url: 'https://api.iqm.com/api/v3/ins/vld-reports',
params: {
query?: {
searchField?: `string`,
pageNo?: `number`,
noOfEntries?: `number`,
sortBy?: `string`,
},
},
};
return axios.request(options).then(({ data }: { data: Responses }) => data);
}
Get list of campaigns eligible for VLD Insights reports
GETGet a list of campaign IDs by status eligible for VLD Insights report generation.
Response properties
running, paused, expired array of objects | Object array of campaign IDs mapped to each of these three campaign statuses. | |||||
Object properties
| ||||||
- JSON
- TypeScript
{
"success": true,
"data": {
"running": [
{
"campaignId": 451351,
"campaignTimezoneId": 29
}
],
"paused": [
{
"campaignId": 451350,
"campaignTimezoneId": 29
}
],
"expired": [
{
"campaignId": 470839,
"campaignTimezoneId": 29
}
]
}
}
See TypeScript prerequisites for usage.
import {
getInstance
} from "prerequisites"
const axios = getInstance();
interface Responses {
200: {
content: {
"application/json": {
success: boolean;
data: {
running: number[];
paused: number[];
expired: number[];
}
}
};
};
};
function getStatusWiseCampaignsForVLDReports(): Promise<Responses> {
const options = {
method: 'GET',
url: 'https://api.iqm.com/api/v3/ins/vld/campaigns',
};
return axios.request(options).then(({ data }: { data: Responses }) => data);
}
Generate VLD Insights report
POSTThis endpoint calculates the cost for the impressions for the VLD Insights reports based on the impressions and mark up charged on the Organization and then creates the VLD Insights reports.
A campaign must meet the following eligibility criteria to generate VLD Insights report:
- Must be Political campaign
- "running," "expired" (within last two years), "paused" status
- Must have duration of 3 or more days
- Creation date: Sept. 16, 2024 or later
- Voter location: all US states (except Oregon)
- Audience type: Matched audience
| Request schema | |
|---|---|
vldStartDate integer | Unix epoch timestamp of start date, in milliseconds. |
vldEndDate integer | Unix epoch timestamp of end date, in milliseconds. |
campaignId integer | Campaign ID. |
vldId integer | Generate Insights report again for VLD Insights ID. |
- JSON
- TypeScript
{
"campaignId": 12345,
"vldStartDate": 1722311000,
"vldEndDate": 1722315000
}
{
"success": true,
"data": {
"vldReportCreated": true,
"campaignId": 1,
"campaignName": "Campaign Name",
"campaignStatus": "running",
"vldStartDate": 1722311000,
"vldEndDate": 1722315000,
"vldChargeableImps": 1000,
"vldChargedImps": 100,
"vldChargeableCost": 1000,
"vldChargedCost": 100,
"fundsAvailable": true
}
}
See TypeScript prerequisites for usage.
import {
getInstance
} from "prerequisites"
const axios = getInstance();
interface Responses {
200: {
content: {
"application/json": {
success: boolean;
data: {
vldReportCreated: boolean;
campaignId: number;
campaignName: string;
campaignStatus: string;
vldStartDate: number;
vldEndDate: number;
vldChargeableImps: number;
vldChargedImps: number;
vldChargeableCost: number;
vldChargedCost: number;
fundsAvailable: boolean
}
}
};
};
};
function generateVLDReports(): Promise<Responses> {
const options = {
method: 'POST',
url: 'https://api.iqm.com/api/v3/ins/vld-report',
requestBody: {
content: {
"application/json": {
campaignId?: `number`,
vldId?: `number`,
vldStartDate?: `number`,
vldEndDate?: `number`,
}
}
}
};
return axios.request(options).then(({ data }: { data: Responses }) => data);
}
Get cost assessment for VLD Insights report
POSTCalculates the cost for the impressions for the VLD Insights report based on impressions and the mark up charged on the Organization. This returns an estimate only; it doesn't create a report or charge the account.
| Request schema | |
|---|---|
campaignId integer | Campaign ID. |
vldStartDate integer | Unix epoch timestamp of start date, in milliseconds. |
vldEndDate integer | Unix epoch timestamp of end date, in milliseconds. |
- JSON
- TypeScript
{
"campaignId": 1,
"vldStartDate": 1722311000,
"vldEndDate": 1722315000
}
{
"success": true,
"data": {
"vldReportCreated": true,
"campaignId": 1,
"campaignName": "Campaign Name",
"campaignStatus": "running",
"vldStartDate": 1722311000,
"vldEndDate": 1722315000,
"vldChargeableImps": 1000,
"vldChargedImps": 100,
"vldChargeableCost": 1000,
"vldChargedCost": 100,
"fundsAvailable": true
}
}
See TypeScript prerequisites for usage.
import {
getInstance
} from "prerequisites"
const axios = getInstance();
interface Responses {
200: {
content: {
"application/json": {
success: boolean;
data: {
vldReportCreated: boolean;
campaignId: number;
campaignName: string;
campaignStatus: string;
vldStartDate: number;
vldEndDate: number;
vldChargeableImps: number;
vldChargedImps: number;
vldChargeableCost: number;
vldChargedCost: number;
fundsAvailable: boolean
}
}
};
};
};
function getChargeableImpressionsDataForVLDReports(): Promise<Responses> {
const options = {
method: 'POST',
url: 'https://api.iqm.com/api/v3/ins/vld-reports/computation',
requestBody: {
content: {
"application/json": {
campaignId?: `number`,
vldId?: `number`,
vldStartDate?: `number`,
vldEndDate?: `number`,
}
}
}
};
return axios.request(options).then(({ data }: { data: Responses }) => data);
}
Download VLD Insights report
POSTGet a download link for a VLD Insights report in CSV or XLSX format.
| Request schema | |
|---|---|
fileTypeId integer | File type ID. |
vldId integer | VLD Insights ID. |
Response properties
vldReportUrl string | VLD Insights report file URL. |
- JSON
- TypeScript
{
"success": true,
"data": {
"vldReportUrl": "https://tem.domain.s3.amazonaws.com/vld-campaigns/ds/2024-08-20/503481_Insights_1.xlsx?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20240820T112818Z&X-Amz-"
}
}
See TypeScript prerequisites for usage.
import {
getInstance
} from "prerequisites"
const axios = getInstance();
interface Responses {
200: {
content: {
"application/json": {
success: boolean;
data: {
vldReportUrl: string;
}
}
};
};
};
function getVLDReportDownloadUrl(): Promise<Responses> {
const options = {
method: 'POST',
url: 'https://api.iqm.com/api/v3/ins/vld-report/download',
requestBody: {
content: {
"application/json": {
fileTypeId?: `number`,
vldId?: `number`,
}
}
}
};
return axios.request(options).then(({ data }: { data: Responses }) => data);
}
Email VLD Insights report
POSTSend a VLD Insights report as an email attachment to specified recipients.
| Request schema | |
|---|---|
reportId integer required | VLD Insights report ID to email. |
fileTypeId integer required | File type ID. |
emailIds array of strings required | Recipient email addresses (1–15). |
Response properties
message string | Success message. |
- JSON
- TypeScript
{
"fileTypeId": 1,
"emailIds": ["user1@email.com"],
"reportId": 50
}
{
"fileTypeId": 2,
"emailIds": ["user1@email.com"],
"reportId": 50
}
{
"success": true,
"data": {
"message": "VLD report e-mail sent successfully."
}
}
See TypeScript prerequisites for usage.
import {
getInstance
} from "prerequisites"
const axios = getInstance();
interface Responses {
200: {
content: {
"application/json": {
success: boolean;
data: {
message: string;
};
}
};
};
};
function sendMailForVlDReport(): Promise<Responses> {
const options = {
method: 'POST',
url: 'https://api.iqm.com/api/v3/ins/vld-report/email',
data: {
fileTypeId: 1,
emailIds: ['user1@email.com'],
reportId: 50
}
};
return axios.request(options).then(({ data }: { data: Responses }) => data);
}
Delete VLD Insights report
DELETEDeletes VLD Insights reports that are not marked as deleted and have a 'failed' status, requires user authorization and checks if the provided VLD Insights report IDs are valid.
| Query parameters | |
|---|---|
vldId integer | VLD Insights ID. |
Response properties
success boolean | Indicates report was successfully deleted: true. |
message string | Success message. |
- JSON
- TypeScript
{
"success": true,
"data": {
"message": "255944_VLD_Insights_2 deleted successfully"
}
}
See TypeScript prerequisites for usage.
import {
getInstance
} from "prerequisites"
const axios = getInstance();
interface Responses {
200: {
content: {
"application/json": {
success: boolean;
data: {
vldReportUrl: string;
}
}
};
};
};
function deleteFailedVLDReport(): Promise<Responses> {
const options = {
method: 'DELETE',
url: 'https://api.iqm.com/api/v3/ins/vld-report',
params: {
query: {
vldIds: `string`
}
}
};
return axios.request(options).then(({ data }: { data: Responses }) => data);
}
Script Lift Study (SLS) Insights report
SLS Insights eligibility requirements
SLS Insights reports are available for Healthcare campaigns that meet certain requirements.
Read more about these requirements in our Help Center article.
| Requirement type | Requirement details | Notes |
|---|---|---|
| Campaign vertical | Healthcare. | Any campaign created under a Healthcare Advertiser account is a “Healthcare” campaign. |
| Campaign status | Running, Expired (within the past two years), Paused. | |
| Campaign impressions | >1 impression. | |
| Campaign duration | 7 or more days. | |
| Campaign start date | [Release date], 2025 or later (or earlier upon request from IQM's support team). | |
| Audience type | Matched audience created from NPI IDs. | The campaign must only include the audience type listed in this requirements table. For example, you won’t be able to generate an SLS Insights report for a campaign if it includes a Matched audience created from NPI IDs and a Retargeted audience consisting of your website’s past visitors. The NPI-based audience must be assigned to the campaign at the time of report creation and while report generation is in progress to remain eligible. |
SLS Insights resource properties
Resource properties
slsId integer | SLS Insights ID. |
slsName string | SLS Insights name. |
campaignIds array of integers | Campaign IDs. |
slsStatusId integer | SLS Insights status type ID. |
startDate integer | Unix epoch timestamp of start date, in milliseconds. |
endDate integer | Unix epoch timestamp of end date, in milliseconds. |
ioId integer | Insertion order ID. |
ioName string | Insertion order name. |
ioTypeId integer | Insertion order budget type ID. |
isCampaignEligible boolean | Indicates that campaign is eligible for SLS Insights report: true. |
slsCreatedOn integer | Unix epoch timestamp of creation date, in milliseconds. |
campaignSlsTimezoneId integer | Timezone ID. |
slsChargeableImps integer | The number of chargeable impressions for the requested SLS Insights report. |
slsChargedImps integer | The number of impressions for which the SLS Insights report is already generated. |
slsChargeableCost integer | Cost to generate the SLS Insights report. |
slsChargedCost integer | Cost of SLS Insights report that is already generated. |
pdfFileSize integer | PDF file size in bytes. |
excelFileSize integer | Excel file size in bytes. |
slsReportTypeIds array of integers | SLS Insights report type IDs. |
Get list of SLS Insights reports
GETGet a list of SLS Insights reports.
An slsId can be used in the Generate SLS Insights report, Download SLS Insights report, and Delete SLS Insights report endpoints.
| Query parameters | |
|---|---|
searchField string | Filter results by search field. |
noOfEntries integer | Number of entries returned per page, default: 200. |
pageNo integer | Page number of retrieved data. |
sortBy string | Sorts by ascending (+) or descending (-), default: -slsId. |
- JSON
- TypeScript
{
"success": true,
"data": {
"totalRecords": 2,
"slsReportDataList": [
{
"slsId": 10,
"slsName": "530667_SLS_Insights_7",
"campaignIds": [
21145,
21146,
21147
],
"slsStatusId": 3,
"slsStatusName": "Failed",
"startDate": 1732165200000,
"endDate": 1732424399000,
"ioId": 5,
"ioName": "Corporate, Inc.",
"isCampaignEligible": false,
"slsCreatedOn": 1721253632,
"campaignSlsTimezoneId": 29,
"ioTypeId": 1,
"pdfFileSize": 2500000,
"excelFileSize": 2500000,
"slsReportTypeIds": [
1,
2,
3
]
},
{
"slsId": 9,
"slsName": "530667_SLS_Insights_6",
"campaignId": [
4949,
5959
],
"slsStatusId": 2,
"slsStatusName": "Processing",
"startDate": 1732165200000,
"endDate": 1732424399000,
"ioId": 15,
"ioName": "Quinton for Mayor",
"isCampaignEligible": false,
"slsCreatedOn": 1720325578,
"campaignSlsTimezoneId": 29,
"ioTypeId": 1,
"slsReportTypeIds": [
1,
3
]
},
],
"filteredRecords": 2
}
}
See TypeScript prerequisites for usage.
Generate SLS Insights report
POSTThis endpoint calculates the cost for the impressions for the SLS Insights reports based on the impressions and markup charged on the Organization and then creates the SLS Insights reports.
SLS Insights reports support three report types: "Pre vs Post Analysis," "Exposed vs Underexposed Analysis," and "Competitive Analysis."
Refer to our Help Center article for more details: SLS Insights Report Overview - SLS Insights Reporting Methods.
| Request schema | |
|---|---|
ioId integer | Insertion order ID. |
campaignIds array of integers | Campaign IDs. |
slsStartDate integer | Unix epoch timestamp of start date, in milliseconds. |
slsEndDate integer | Unix epoch timestamp of end date, in milliseconds. |
slsName string | SLS name, 3–100 characters. Must be unique. |
slsLookbackDuration integer | SLS lookback duration, in months (1–6). |
conceptGroupId string | Concept group ID. |
reportTypes array of integers | Report type IDs. 1: Pre vs Post Analysis. 2: Exposed vs Underexposed Analysis. 3: Competitive Analysis. |
competitorConceptGroupIds array of strings | Competitor concept group IDs. |
slsId integer | SLS Insights ID to regenerate. |
- JSON
- TypeScript
{
"ioId": 1234,
"campaignIds": [
1,
2,
3
],
"slsStartDate": 1722311000,
"slsEndDate": 1722315000,
"slsName": "Dummy SLS Name",
"slsLookbackDuration": 3,
"conceptGroupId": 202335,
"reportTypes": [
1,
2,
3
],
"competitorConceptGroupIds": [
800214,
800215,
800216
]
}
{
"success": true,
"data": {
"slsReportCreated": true,
"campaignIds": [
1,
2,
3
],
"slsStartDate": 1722311000,
"slsEndDate": 1722315000,
"slsChargeableImps": 1000,
"slsChargedImps": 100,
"slsChargeableCost": 1000,
"slsChargedCost": 100,
"slsName": "Dummy SLS Name",
"slsLookbackDuration": 3,
"conceptGroupId": 202335,
"reportTypes": [
1,
2,
3
],
"competitorConceptGroupIds": [
800214,
800215,
800216
],
"fundsAvailable": true
}
}
See TypeScript prerequisites for usage.
import {
getInstance
} from "prerequisites"
const axios = getInstance();
interface Responses {
200: {
content: {
"application/json": {
success: boolean;
data: {
slsReportCreated: number;
campaignIds: number[];
slsStartDate: number;
slsEndDate: number;
slsChargeableImps: number;
slsChargedImps: number;
slsChargeableCost: number;
slsChargedCost: number;
slsName: string;
slsLookbackDuration: number;
conceptGroupId: number;
reportTypes: number[];
competitorConceptGroupIds: number[];
fundsAvailable: boolean;
}
}
};
};
}
function generateSLSReports(): Promise<Responses> {
const options = {
method: 'POST',
url: 'https://api.iqm.com/api/v3/ins/sls-reports',
requestBody: {
content: {
"application/json": {
ioId?: `number`,
campaignIds?: `array of numbers`,
slsId?: `number`,
slsStartDate?: `number`,
slsEndDate?: `number`,
slsName?: `string`,
slsLookbackDuration?: `number`,
conceptGroupId?: `number`,
competitorConceptGroupIds?: `array of numbers`,
reportTypes?: `array of numbers`,
endDate?: `number`,
startDate?: `number`,
id?: `number`,
}
}
}
};
return axios.request(options).then(({ data }: { data: Responses }) => data);
}
SLS Insights reports computation
POSTCalculates the cost for the impressions for the SLS Insights report based on impressions and the markup charged on the Organization. This returns an estimate only; it doesn't create a report or charge the account.
SLS Insights reports support three report types: "Pre vs Post Analysis," "Exposed vs Underexposed Analysis," and "Competitive Analysis."
Refer to our Help Center article for more details: SLS Insights Report Overview - SLS Insights Reporting Methods.
| Request schema | |
|---|---|
ioId integer | Insertion order ID. |
campaignIds array of integers | Campaign IDs. |
slsStartDate integer | Unix epoch timestamp of start date, in milliseconds. |
slsEndDate integer | Unix epoch timestamp of end date, in milliseconds. |
slsName string | SLS name, 3–100 characters. Must be unique. |
slsLookbackDuration integer | SLS lookback duration, in months (1–6). |
conceptGroupId string | Concept group ID. |
reportTypes array of integers | Report type IDs. 1: Pre vs Post Analysis. 2: Exposed vs Underexposed Analysis. 3: Competitive Analysis. |
competitorConceptGroupIds array of strings | Competitor concept group IDs. |
- JSON
- TypeScript
{
"ioId": 1234,
"campaignIds": [
1,
2,
3
],
"slsStartDate": 1722311000,
"slsEndDate": 1722315000,
"slsName": "Dummy SLS Name",
"slsLookbackDuration": 3,
"conceptGroupId": 202335,
"reportTypes": [
1,
2,
3
],
"competitorConceptGroupIds": [
800214,
800215,
800216
]
}
{
"success": true,
"data": {
"slsReportCreated": true,
"campaignIds": [
1,
2,
3
],
"slsStartDate": 1722311000,
"slsEndDate": 1722315000,
"slsChargeableImps": 1000,
"slsChargedImps": 100,
"slsChargeableCost": 1000,
"slsChargedCost": 100,
"slsName": "Dummy SLS Name",
"slsLookbackDuration": 3,
"conceptGroupId": 202335,
"reportTypes": [
1,
2,
3
],
"competitorConceptGroupIds": [
800214,
800215,
800216
],
"fundsAvailable": true
}
}
See TypeScript prerequisites for usage.
import {
getInstance
} from "prerequisites"
const axios = getInstance();
interface Responses {
200: {
content: {
"application/json": {
success: boolean;
data: {
slsReportCreated: number;
campaignIds: number[];
slsStartDate: number;
slsEndDate: number;
slsChargeableImps: number;
slsChargedImps: number;
slsChargeableCost: number;
slsChargedCost: number;
slsName: string;
slsLookbackDuration: number;
conceptGroupId: number;
reportTypes: number[];
competitorConceptGroupIds: number[];
fundsAvailable: boolean;
}
}
};
};
}
function getChargeableImpressionsDataForSLSReports(): Promise<Responses> {
const options = {
method: 'POST',
url: 'https://api.iqm.com/api/v3/ins/sls-reports/computation',
requestBody: {
content: {
"application/json": {
ioId?: `number`,
campaignIds?: `array of numbers`,
slsId?: `number`,
slsStartDate?: `number`,
slsEndDate?: `number`,
slsName?: `string`,
slsLookbackDuration?: `number`,
conceptGroupId?: `number`,
competitorConceptGroupIds?: `array of numbers`,
reportTypes?: `array of numbers`,
endDate?: `number`,
startDate?: `number`,
id?: `number`,
}
}
}
};
return axios.request(options).then(({ data }: { data: Responses }) => data);
}
Validate SLS Insights report name
GETValidate a name for SLS Insights reports.
| Query parameters | |
|---|---|
reportName string | Report name. |
Response properties
success boolean | Indicates successful validation. |
data string | Success message. |
- JSON
- TypeScript
{
"success": true,
"data": "This SLS report name is valid"
}
See TypeScript prerequisites for usage.
import {
getInstance
} from "prerequisites"
const axios = getInstance();
interface Responses {
200: {
content: {
"application/json": {
success: boolean;
data: string;
}
};
};
}
function validateSlsReportName(): Promise<Responses> {
const options = {
method: 'GET',
url: 'https://api.iqm.com/api/v3/ins/sls-reports/validate/name',
params: {
query: {
reportName: `string`
}
}
};
return axios.request(options).then(({ data }: { data: Responses }) => data);
}
Get list of campaigns eligible for SLS Insights reports
GETGet a list of campaign IDs by status eligible for SLS Insights report generation.
Response properties
running, paused, expired array of objects | Object array of campaign IDs mapped to each of these three campaign statuses. | |||||
object properties
| ||||||
- JSON
- TypeScript
{
"success": true,
"data": {
"running": [
{
"campaignId": 516038,
"campaignTimezoneId": 29
}
],
"paused": [
{
"campaignId": 523630,
"campaignTimezoneId": 29
}
],
"expired": [
{
"campaignId": 500291,
"campaignTimezoneId": 29
}
]
}
}
See TypeScript prerequisites for usage.
import {
getInstance
} from "prerequisites"
const axios = getInstance();
interface Responses {
200: {
content: {
"application/json": {
success: boolean;
data: {
running: number[];
paused: number[];
expired: number[];
}
}
};
};
}
function getStatusWiseCampaignsForSLSReports(): Promise<Responses> {
const options = {
method: 'GET',
url: 'https://api.iqm.com/api/v3/ins/sls-reports/campaigns',
params: {
query: {
reportName: `string`
}
}
};
return axios.request(options).then(({ data }: { data: Responses }) => data);
}
Download SLS Insights report
POSTGet a download link for a SLS Insights report in CSV or XLSX format.
| Request schema | |
|---|---|
fileTypeId integer | File type ID. XLSX: 1. CSV: 2. |
reportId integer | SLS Insights report ID. |
Response properties
slsReportUrl string | SLS Insights report file URL. |
- JSON
- TypeScript
{
"fileTypeId": 1,
"reportId": 50
}
{
"success": true,
"data": {
"slsReportUrl": "https://dowload.domain.com/pld-reports/20220101/pld-report-1.xlsx"
}
}
More responses
{
"success": false,
"errorObjects": [
{
"error": "Invalid sortBy value."
}
]
}
See TypeScript prerequisites for usage.
import {
getInstance
} from "prerequisites"
const axios = getInstance();
interface Responses {
200: {
content: {
"application/json": {
success: boolean;
data: {
slsReportUrl: string;
}
}
};
};
}
function getSLSReportDownloadUrl(): Promise<Responses> {
const options = {
method: 'POST',
url: 'https://api.iqm.com/api/v3/ins/sls-reports/download',
requestBody: {
content: {
"application/json": {
fileTypeId?: `number`,
reportId?: `number`,
}
}
}
};
return axios.request(options).then(({ data }: { data: Responses }) => data);
}
Email SLS Insights report
POSTSend an SLS Insights report as an email attachment to specified recipients.
| Request schema | |
|---|---|
reportId integer required | SLS Insights report ID to email. |
fileTypeId integer required | File type ID. |
emailIds array of strings required | Recipient email addresses (1–15). |
Response properties
message string | Success message. |
- JSON
- TypeScript
{
"fileTypeId": 1,
"emailIds": ["user1@email.com"],
"reportId": 50
}
{
"fileTypeId": 3,
"emailIds": ["user1@email.com", "user2@email.com"],
"reportId": 50
}
{
"success": true,
"data": {
"message": "SLS report e-mail sent successfully."
}
}
See TypeScript prerequisites for usage.
import {
getInstance
} from "prerequisites"
const axios = getInstance();
interface Responses {
200: {
content: {
"application/json": {
success: boolean;
data: {
message: string;
};
}
};
};
};
function sendMailForSlsReport(): Promise<Responses> {
const options = {
method: 'POST',
url: 'https://api.iqm.com/api/v3/ins/sls-reports/email',
data: {
fileTypeId: 1,
emailIds: ['user1@email.com'],
reportId: 50
}
};
return axios.request(options).then(({ data }: { data: Responses }) => data);
}
Delete SLS Insights report
DELETEDeletes SLS Insights reports that are not marked as deleted and have a 'failed' status, requires user authorization and checks if the provided SLS Insights report IDs are valid.
| Query parameters | |
|---|---|
slsIds string | Comma separated SLS Insights report IDs. |
Response properties
success boolean | Indicates report was successfully deleted: true. |
message string | Success message. |
- JSON
- TypeScript
{
"success": true,
"data": {
"message": "255944_PLD_Insights_2 deleted successfully"
}
}
See TypeScript prerequisites for usage.
import {
getInstance
} from "prerequisites"
const axios = getInstance();
interface Responses {
200: {
content: {
"application/json": {
success: boolean;
data: {
message: string;
}
}
};
};
}
function deleteFailedSLSReport(): Promise<Responses> {
const options = {
method: 'DELETE',
url: 'https://api.iqm.com/api/v3/ins/sls-reports',
params: {
query: {
slsIds: `string`,
}
}
};
return axios.request(options).then(({ data }: { data: Responses }) => data);
}
Report templates
PLD Insights eligibility requirements
PLD Insights reports are available for Healthcare campaigns that meet certain requirements.
Read more about these requirements in our Help Center article.
| Requirement type | Requirement details | Notes |
|---|---|---|
| Campaign vertical | Healthcare. | Any campaign created under a Healthcare Advertiser account is a “Healthcare” campaign. |
| Campaign status | Running, Expired (within the past 90 days), Paused (within the past 90 days). | |
| Campaign duration | 7 or more days. | |
| Campaign limit | Up to 50 eligible campaigns from the same insertion order (IO) per report. | |
| Audience type | Matched audience created from NPI IDs, Matched audience created from raw data. Patient Matched audiences are not eligible for PLD Insights reporting. |
NLD Insights eligibility requirements
NLD Insights reports are available for Healthcare campaigns that meet certain requirements.
Read more about these requirements in our Help Center article.
| Requirement type | Requirement details | Notes |
|---|---|---|
| Campaign vertical | Healthcare. | Any campaign created under a Healthcare Advertiser account is a “Healthcare” campaign. |
| Campaign type | Advanced. | |
| Campaign status | Running, Expired (within the past 2 years), Paused. | |
| Campaign duration | At least 7 days through yesterday's date. | |
| Campaign limit | Up to 50 eligible campaigns from the same insertion order (IO) per report. | |
| Audience type | Campaign must target at least one Non-NPI Nurse (Matched, Geofarmed, Contextual) audience. |
ICT Insights eligibility requirements
ICT Insights reports are available for Healthcare campaigns that meet certain requirements.
Read more about these requirements in our Help Center article.
| Requirement type | Requirement details | Notes |
|---|---|---|
| Campaign vertical | Healthcare. | Any campaign created under a Healthcare Advertiser account is a “Healthcare” campaign. |
| Campaign type | Advanced. | |
| Campaign status | Running, Expired (within the past 2 years), Paused. | |
| Campaign duration | At least 7 days through yesterday's date. | |
| Campaign limit | Up to 50 eligible campaigns from the same insertion order (IO) per report. | |
| Audience type | Campaign must target at least one Integrated Care Team (ICT) input-type (HCP, Nurse) audience. |
Get list of templates
GETGet a list of all templates for the specified report type with optional filtering and pagination.
A templateId can be used to get Get template details or to update an existing template using the Update report template endpoint.
| Query parameters | |
|---|---|
category string required | Insights type category: pld, ict, or nld. |
searchField string | Filter templates by name. |
noOfEntries integer | Number of entries per page, default: 20. |
pageNo integer | Page number for pagination, default: 1. |
frequencyIds integer | Filter by scheduling frequency IDs. |
statusIds integer | Filter by template status IDs. |
sortBy string | Sorts by ascending (+) or descending (-), default: -templateId. |
Response properties
templateId integer | Template ID. |
name string | Template name. |
frequencyId integer | Scheduling frequency ID. |
startDate integer | Unix epoch timestamp of template start date, in milliseconds. |
endDate integer | Unix epoch timestamp of template end date, in milliseconds. |
timezoneId integer | Timezone ID. |
statusId integer | Template status ID. |
nextRunPreviewUtc integer | Unix epoch timestamp of the next scheduled run (UTC), in milliseconds. |
reportIds array of integers | Associated report IDs. |
campaignIds array of integers | Associated campaign IDs. |
reportStatusSummary array of objects | Summary of report counts by status ID. |
statusSummary array of objects | Summary of template counts by status ID (top-level). |
filteredRecords integer | Number of records matching the applied filters. |
totalRecords integer | Total number of records. |
- JSON
- TypeScript
{
"success": true,
"data": {
"data": [
{
"templateId": 1,
"name": "Monthly ICT Report",
"frequencyId": 2,
"startDate": 1764843796510,
"endDate": 1764843796510,
"timezoneId": 29,
"statusId": 1,
"nextRunPreviewUtc": 1764843796510,
"reportIds": [10001, 10002, 10004],
"campaignIds": [10001, 10003],
"reportStatusSummary": [
{
"id": 1,
"count": 5
},
{
"id": 2,
"count": 2
}
]
}
],
"statusSummary": [
{
"id": 1,
"count": 5
},
{
"id": 2,
"count": 5
}
],
"filteredRecords": 1,
"totalRecords": 10
}
}
See TypeScript prerequisites for usage.
import {
getInstance
} from "prerequisites"
const axios = getInstance();
interface Responses {
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": {
success: boolean;
data: {
data: {
templateId: number;
name: string;
frequencyId: number;
startDate: number;
endDate: number;
timezoneId: number;
statusId: number;
nextRunPreviewUtc: number;
reportIds: number[];
campaignIds: number[];
reportStatusSummary: {
id: number;
count: number;
}[];
}[];
statusSummary: {
id: number;
count: number;
}[];
filteredRecords: number;
totalRecords: number;
}
}
}
};
}
function getAllTemplates(): Promise<Responses> {
const options = {
method: 'GET',
url: 'https://api.iqm.com/api/v3/ins/templates',
params: {
query: {
category: `string`,
searchField?: `string`,
pageNo?: `number`,
noOfEntries?: `number`,
frequencyIds?: `number`,
statusIds?: `number`,
sortBy?: `string`,
}
}
};
return axios.request(options).then(({ data }: { data: Responses }) => data);
}
Get template details
GETGet the details of a template by its template ID.
| Path parameters | |
|---|---|
templateId integer | The ID of the template to retrieve. |
Response properties
templateId integer | Template ID. |
name string | Template name. |
campaignIds array of integers | Associated campaign IDs. |
frequencyId integer | Scheduling frequency ID. |
frequencyDetails object | Scheduling details based on frequency type. |
startDate integer | Unix epoch timestamp of template start date, in milliseconds. |
endDate integer | Unix epoch timestamp of template end date, in milliseconds. |
timezoneId integer | Timezone ID. |
aggregationEnabled boolean | Indicates whether report data is aggregated. |
recipientEmails array of strings | Recipient email addresses. |
statusId integer | Template status ID. |
nextRunPreviewUtc integer | Unix epoch timestamp of the next scheduled run (UTC), in milliseconds. |
firstRunLocked boolean | Indicates whether the first run is locked. |
- JSON
- TypeScript
{
"success": true,
"data": {
"templateId": 1,
"name": "Monthly PLD Report",
"campaignIds": [101, 102, 103],
"frequencyId": 2,
"frequencyDetails": {
"dayOfMonthTypeId": 2,
"dayOfMonth": 15
},
"startDate": 1704067200000,
"endDate": 1735689599000,
"timezoneId": 29,
"aggregationEnabled": true,
"recipientEmails": [
"xyz@gmail.com"
],
"statusId": 1,
"nextRunPreviewUtc": 1706745600000,
"firstRunLocked": true
}
}
See TypeScript prerequisites for usage.
import {
getInstance
} from "prerequisites"
const axios = getInstance();
interface Responses {
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": {
success: boolean;
data: {
templateId: number;
name: string;
campaignIds: number[];
frequencyId: number;
frequencyDetails: {
dayOfWeekId?: number;
dayOfMonthTypeId?: number;
dayOfMonth?: number;
intervalModeId?: number;
intervalValue?: number;
};
startDate: number;
endDate: number;
timezoneId: number;
aggregationEnabled: boolean;
recipientEmails: string[];
statusId: number;
nextRunPreviewUtc: number;
firstRunLocked: boolean;
}
}
}
};
}
function getTemplateById(): Promise<Responses> {
const options = {
method: 'GET',
url: 'https://api.iqm.com/api/v3/ins/templates/{templateId}',
};
return axios.request(options).then(({ data }: { data: Responses }) => data);
}
Get template reports
GETGet the reports for a specific template with optional filtering and pagination.
| Path parameters | |
|---|---|
templateId integer | The ID of the template for which to retrieve reports. |
| Query parameters | |
|---|---|
searchField string | Filter reports by search string. |
noOfEntries integer | Number of entries per page, default: 20. |
pageNo integer | Page number for pagination, default: 1. |
sortBy string | Sorts by ascending (+) or descending (-), default: -reportId. |
statusIds integer | Filter by status IDs. |
frequencyIds integer | Filter by scheduling frequency IDs. |
Response properties
reportId integer | Report ID. |
name string | Report name. |
requestedStartDate integer | Unix epoch timestamp of the report's requested start date, in milliseconds. |
requestedEndDate integer | Unix epoch timestamp of the report's requested end date, in milliseconds. |
statusId integer | Report status ID. |
frequencyId integer | Scheduling frequency ID. |
generatedAt integer | Unix epoch timestamp of when the report was generated, in milliseconds. |
filePaths object | Presigned download URLs for the report files. |
fileSizes object | File sizes in bytes for each format. |
totalRecords integer | Total number of records. |
filteredRecords integer | Number of records matching the applied filters. |
statusSummary array of objects | Summary of report counts by status ID. |
frequencySummary array of objects | Summary of report counts by frequency ID. |
- JSON
- TypeScript
{
"success": true,
"data": {
"data": [
{
"reportId": 180,
"name": "23897_PLD_Insights_7",
"requestedEndDate": 1762885799000,
"requestedStartDate": 1762799400000,
"statusId": 3,
"frequencyId": 3,
"generatedAt": 1764671972077,
"filePaths": {
"csvUrl": "https://.../9876.csv",
"xlsxUrl": "https://.../9876.xlxs",
"pdfUrl": "https://.../9876.pdf",
"zipUrl": "https://.../9876.zip"
},
"fileSizes": {
"csvBytes": 27223,
"xlsxBytes": 98604,
"pdfBytes": 84259,
"zipBytes": 20471
}
}
],
"totalRecords": 2,
"filteredRecords": 1,
"statusSummary": [
{
"id": 3,
"count": 1
},
{
"id": 4,
"count": 1
}
],
"frequencySummary": [
{
"id": 3,
"count": 1
}
]
}
}
See TypeScript prerequisites for usage.
import {
getInstance
} from "prerequisites"
const axios = getInstance();
interface Responses {
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": {
success: boolean;
data: {
data: {
reportId: number;
name: string;
requestedStartDate: number;
requestedEndDate: number;
statusId: number;
frequencyId: number;
generatedAt: number;
filePaths: {
csvUrl: string;
xlsxUrl: string;
pdfUrl: string;
zipUrl: string;
};
fileSizes: {
csvBytes: number;
xlsxBytes: number;
pdfBytes: number;
zipBytes: number;
};
}[];
totalRecords: number;
filteredRecords: number;
statusSummary: {
id: number;
count: number;
}[];
frequencySummary: {
id: number;
count: number;
}[];
}
}
}
};
}
function getReportsForTemplate(): Promise<Responses> {
const options = {
method: 'GET',
url: 'https://api.iqm.com/api/v3/ins/templates/{templateId}/report',
params: {
query: {
searchField?: `string`,
pageNo?: `number`,
noOfEntries?: `number`,
sortBy?: `string`,
statusIds?: `number`,
frequencyIds?: `number`,
}
}
};
return axios.request(options).then(({ data }: { data: Responses }) => data);
}
Validate template name
POSTChecks if the given template name is available (not already in use) within the caller's Organization.
| Request schema | |
|---|---|
name string | Template name to validate (3–100 characters). |
category string | Insights type category: pld, ict, or nld. |
Response properties
available boolean | Indicates whether the template name is available: true or false. |
- JSON
- TypeScript
{
"name": "Monthly PLD Report",
"category": "pld"
}
{
"success": true,
"data": {
"available": true
}
}
{
"success": true,
"data": {
"available": false
}
}
See TypeScript prerequisites for usage.
import {
getInstance
} from "prerequisites"
const axios = getInstance();
interface Responses {
200: {
content: {
"application/json": {
success: boolean;
data: {
available: boolean;
}
}
};
};
}
function validateTemplateName(): Promise<Responses> {
const options = {
method: 'POST',
url: 'https://api.iqm.com/api/v3/ins/templates/validate-name',
requestBody: {
content: {
"application/json": {
name: `string`,
category: `string`,
}
}
}
};
return axios.request(options).then(({ data }: { data: Responses }) => data);
}
Create report template
POSTCreates a report template with the given campaigns and scheduling configuration.
The request defines a template name, associated campaign IDs, frequency and frequency details (daily, weekly, monthly, or custom), template start/end dates, aggregation flag, recipient emails, template status, and report category.
When the template is ACTIVE, the platform will use the configured schedule to trigger periodic report generation.
| Request schema | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
name string | Template name (3–100 characters). | |||||||||||
campaignIds array of integers | Campaign IDs (max 50). | |||||||||||
frequencyId integer | Scheduling frequency ID. | |||||||||||
frequencyDetails object | Scheduling details based on frequency type (see examples). | |||||||||||
| ||||||||||||
dayOfWeekId integer | Day of week (for weekly/custom-weekly). |
dayOfMonthTypeId integer | Day of month type: first day (1), specific day (2), last day (3). |
dayOfMonth integer | Specific day of month (2–28, when dayOfMonthTypeId = 2). |
intervalModeId integer | Custom interval mode: days (501), weeks (502), months (503). |
intervalValue integer | Custom interval value (e.g., every X days/weeks/months). |
startDate integer
endDate integer
aggregationEnabled boolean
recipientEmails array of strings
status string
category string
Response properties
templateId integer | Created template ID. |
nextRunDate integer | Unix epoch timestamp of the next scheduled run, in milliseconds. |
- JSON
- TypeScript
{
"name": "One-Time Template",
"campaignIds": [111, 222, 333],
"frequencyId": 1,
"frequencyDetails": {},
"startDate": 1763145600000,
"endDate": 1765737600000,
"aggregationEnabled": false,
"recipientEmails": [
"a@ws.com"
],
"status": "ACTIVE",
"category": "pld"
}
{
"success": true,
"data": {
"templateId": 101,
"nextRunDate": 1764460800000
}
}
See TypeScript prerequisites for usage.
import {
getInstance
} from "prerequisites"
const axios = getInstance();
interface Responses {
200: {
content: {
"application/json": {
success: boolean;
data: {
templateId: number;
nextRunDate: number;
}
}
};
};
}
function createTemplate(): Promise<Responses> {
const options = {
method: 'POST',
url: 'https://api.iqm.com/api/v3/ins/templates',
requestBody: {
content: {
"application/json": {
name: `string`,
campaignIds: `number[]`,
frequencyId: `number`,
frequencyDetails: {
dayOfWeekId?: `number`,
dayOfMonthTypeId?: `number`,
dayOfMonth?: `number`,
intervalModeId?: `number`,
intervalValue?: `number`,
},
startDate: `number`,
endDate?: `number`,
aggregationEnabled: `boolean`,
recipientEmails?: `string[]`,
status: `string`,
category: `string`,
}
}
}
};
return axios.request(options).then(({ data }: { data: Responses }) => data);
}
Update report template
PATCHApply a partial update to an existing report template. Only the fields present in the request are evaluated and applied.
The platform automatically re-evaluates future executions based on the effective configuration after the update. Past executions and generated reports are never modified.
- Updates only affect future executions
- A resumed template may not necessarily produce a future run
- "One Time" templates (frequency ID 1) execute at most once
- If no future execution exists, nextRunDate will be null
| Path parameters | |
|---|---|
templateId integer | The ID of the template to update. |
Update scenarios
| Change made | Future execution impact |
|---|---|
| Metadata-only update | No impact to future executions. |
| Aggregation flag toggle | Future executions are recalculated. |
| End date modified | Future execution horizon is recalculated. |
| Start date modified | Future execution plan is recalculated. |
| Recurring → Recurring (frequency change) | Future execution pattern changes. |
| Recurring → One-time | One-time execution is triggered. |
| One-time → Recurring | Future recurring executions are scheduled. |
| ACTIVE → INACTIVE | All future executions are stopped. |
| INACTIVE → ACTIVE (recurring) | Future executions resume. |
| Multiple changes in one request | Strongest applicable rule applies. |
Request schema
name string | Template name (3–100 characters). | |||||||||||
recipientEmails array of strings | Recipient email addresses. | |||||||||||
status string | Template status: ACTIVE or INACTIVE. | |||||||||||
frequencyId integer | Scheduling frequency ID. | |||||||||||
frequencyDetails object | Scheduling details based on frequency type. | |||||||||||
| ||||||||||||
dayOfWeekId integer | Day of week (for weekly/custom-weekly). |
dayOfMonthTypeId integer | Day of month type: first day (1), specific day (2), last day (3). |
dayOfMonth integer | Specific day of month (2–28, when dayOfMonthTypeId = 2). |
intervalModeId integer | Custom interval mode: days (501), weeks (502), months (503). |
intervalValue integer | Custom interval value (e.g., every X days/weeks/months). |
startDate integer
endDate integer
aggregationEnabled boolean
Response properties
templateId integer | Updated template ID. |
nextRunDate integer | Unix epoch timestamp of the next scheduled run, in milliseconds (may be null if no future execution exists). |
- JSON
- TypeScript
{
"name": "Updated Template Name"
}
{
"success": true,
"data": {
"templateId": 101,
"nextRunDate": 1764460800000
}
}
See TypeScript prerequisites for usage.
import {
getInstance
} from "prerequisites"
const axios = getInstance();
interface Responses {
200: {
content: {
"application/json": {
success: boolean;
data: {
templateId: number;
nextRunDate: number;
}
}
};
};
}
function updateTemplate(): Promise<Responses> {
const options = {
method: 'PATCH',
url: 'https://api.iqm.com/api/v3/ins/templates/{templateId}',
requestBody: {
content: {
"application/json": {
name?: `string`,
recipientEmails?: `string[]`,
status?: `string`,
frequencyId?: `number`,
frequencyDetails?: {
dayOfWeekId?: `number`,
dayOfMonthTypeId?: `number`,
dayOfMonth?: `number`,
intervalModeId?: `number`,
intervalValue?: `number`,
},
startDate?: `number`,
endDate?: `number`,
aggregationEnabled?: `boolean`,
}
}
}
};
return axios.request(options).then(({ data }: { data: Responses }) => data);
}
Report management
Download report
POSTDownload a PLD, NLD, or ICT Insights report. Only reports with a ready status are eligible for download.
This endpoint validates the report status, file type, and user permissions before generating a pre-signed download URL.
| Request schema | |
|---|---|
reportId integer required | Report ID to download. |
fileTypeId integer required | File type ID: 1 (XLSX), 2 (CSV), 3 (PDF), 4 (ZIP). |
Response properties
reportURL string | Pre-signed download URL for the report. |
- JSON
- TypeScript
{
"fileTypeId": 1,
"reportId": 50
}
{
"success": true,
"data": {
"reportURL": "https://xyz.abc.com/reports/abcd/2024-12-03/50_acbd_Report.xlsx?X-Amz-Algorithm=AWS4-HMAC"
}
}
{
"success": false,
"errorObjects": [
{
"error": "The provided ICT report ID: 50 is not in the ready state."
}
]
}
See TypeScript prerequisites for usage.
import {
getInstance
} from "prerequisites"
const axios = getInstance();
interface Responses {
200: {
content: {
success: boolean;
data: {
reportURL: string;
};
};
};
422: {
content: {
success: boolean;
errorObjects: Array<{ error: string }>;
};
};
};
function downloadReport(): Promise<Responses> {
const options = {
method: 'POST',
url: 'https://api.iqm.com/api/v3/ins/report/download',
data: {
fileTypeId: 1,
reportId: 50
}
};
return axios.request(options).then(({ data }: { data: Responses }) => data);
}
Delete report
DELETEDelete PLD, NLD, or ICT reports that have a failed status.
Reports that are already deleted or do not have a failed status cannot be deleted with this endpoint.
| Query parameters | |
|---|---|
reportIds string required | Comma-separated list of report IDs to delete. |
Response properties
message string | Success or error message. |
- JSON
- TypeScript
{
"success": true,
"data": {
"message": "2 ICT insights deleted successfully"
}
}
{
"success": true,
"data": {
"message": "255944_PLD_Insights_2 deleted successfully"
}
}
{
"success": false,
"errorObjects": [
{
"error": "Some of the provided NLD ID(s) are either already deleted, do not exist, or do not have a 'failed' status."
}
]
}
See TypeScript prerequisites for usage.
import {
getInstance
} from "prerequisites"
const axios = getInstance();
interface Responses {
200: {
content: {
success: boolean;
data: {
message: string;
};
};
};
422: {
content: {
success: boolean;
errorObjects: Array<{ error: string }>;
};
};
};
function deleteReport(): Promise<Responses> {
const options = {
method: 'DELETE',
url: 'https://api.iqm.com/api/v3/ins/report',
params: {
reportIds: '50,51'
}
};
return axios.request(options).then(({ data }: { data: Responses }) => data);
}
Email report
POSTSend a PLD, NLD, or ICT Insights report as an email attachment to specified recipients.
Only reports with a ready status are eligible to be emailed. Reports larger than 25 MB cannot be sent.
| Request schema | |
|---|---|
reportId integer required | Report ID to email. |
fileTypeId integer required | File type ID: 1 (XLSX), 2 (CSV), 3 (PDF), 4 (ZIP). |
emailIds array of strings required | Recipient email addresses (1–15). |
Response properties
message string | Success or error message. |
- JSON
- TypeScript
{
"fileTypeId": 1,
"emailIds": [
"user1@email.com",
"user2@email.com"
],
"reportId": 50
}
{
"success": true,
"data": {
"message": "ICT report e-mail sent successfully."
}
}
{
"success": false,
"data": {
"message": "The provided ICT ID: 50 is not in the ready state."
}
}
See TypeScript prerequisites for usage.
import {
getInstance
} from "prerequisites"
const axios = getInstance();
interface Responses {
200: {
content: {
success: boolean;
data: {
message: string;
};
};
};
422: {
content: {
success: boolean;
data: {
message: string;
};
};
};
};
function emailReport(): Promise<Responses> {
const options = {
method: 'POST',
url: 'https://api.iqm.com/api/v3/ins/report/email',
data: {
fileTypeId: 1,
emailIds: ['user1@email.com'],
reportId: 50
}
};
return axios.request(options).then(({ data }: { data: Responses }) => data);
}
Regenerate report
POSTRegenerate a PLD, NLD, or ICT Insights report that has a failed status.
The report must be associated with a scheduling template. Reports that are already deleted or in a ready/processing state cannot be regenerated.
| Path parameters | |
|---|---|
reportId integer required | Report ID to regenerate. |
Response properties
reportId integer | Report ID that was regenerated. |
templateId integer | Associated template ID. |
nextRunDate integer | Unix epoch timestamp of the next scheduled run, in milliseconds. |
reportName string | Name of the regenerated report. |
- JSON
- TypeScript
{
"success": true,
"data": {
"reportId": 12,
"templateId": 123,
"nextRunDate": 1765774800000,
"reportName": "sample report"
}
}
{
"success": false,
"data": {
"message": "ICT Report ID : 12 is already deleted or is in READY/PROCESSING state."
}
}
{
"success": false,
"data": {
"message": "Please provide valid insights id value."
}
}
See TypeScript prerequisites for usage.
import {
getInstance
} from "prerequisites"
const axios = getInstance();
interface Responses {
200: {
content: {
success: boolean;
data: {
reportId: number;
templateId: number;
nextRunDate: number;
reportName: string;
};
};
};
400: {
content: {
success: boolean;
data: {
message: string;
};
};
};
};
function regenerateReport(): Promise<Responses> {
const options = {
method: 'POST',
url: 'https://api.iqm.com/api/v3/ins/regenerate/report/{reportId}',
};
return axios.request(options).then(({ data }: { data: Responses }) => data);
}
Get more Insights reports details
Get list of Insights types
GETGet a list of Insights types by ID.
| Insights type IDs | |
|---|---|
1 | Audience Insights. |
3 | Voter Level Data. |
4 | Provider Level Data. |
5 | Script Lift Study. |
- JSON
- TypeScript
{
"success": true,
"data": {
"totalRecords": 2,
"filteredRecords": 2,
"insightsTypeData": [
{
"id": 1,
"name": "audiences",
"label": "Audience Insights",
"order": 1
},
{
"id": 3,
"name": "voter_level_data",
"label": "Voter Level Data",
"order": 3
},
{
"id": 4,
"name": "provider_level_data",
"label": "Provider Level Data",
"order": 4
},
{
"id": 5,
"name": "script_life_study",
"label": "Script Lift Study",
"order": 5
}
]
}
}
See TypeScript prerequisites for usage.
import {
getInstance
} from "prerequisites"
const axios = getInstance();
interface Responses {
200: {
content: {
"application/json": {
success: boolean;
data: {
totalRecords: number;
filteredRecords: number;
insightsTypeData: {
id: number;
name: string;
label: string;
order: number;
}[]
}
}
};
};
};
function getInsightsType(): Promise<Responses> {
const options = {
method: 'GET',
url: 'https://api.iqm.com/api/v3/ins/static/insights/type/list',
};
return axios.request(options).then(({ data }: { data: Responses }) => data);
}
Get list of Insights status types
GETGet a list of Insights status types.
| Insights status IDs | |
|---|---|
1 | Processing. |
2 | Ready. |
3 | Failed. |
- JSON
- TypeScript
{
"success": true,
"data": {
"totalRecords": 3,
"filterRecords": 3,
"insightsStatusData": [
{
"id": 1,
"name": "processing",
"label": "Processing",
"order": 1
},
{
"id": 2,
"name": "ready",
"label": "Ready",
"order": 2
},
{
"id": 3,
"name": "failed",
"label": "Failed",
"order": 3
}
]
}
}
See TypeScript prerequisites for usage.
import {
getInstance
} from "prerequisites"
const axios = getInstance();
interface Responses {
200: {
content: {
"application/json": {
success: boolean;
data: {
totalRecords: number;
filterRecords: number;
insightsStatusData: {
id: number;
name: string;
label: string;
order: number;
}[]
}
}
};
};
};
function getInsightsStatus(): Promise<Responses> {
const options = {
method: 'GET',
url: 'https://api.iqm.com/api/v3/ins/static/insights/status/list',
};
return axios.request(options).then(({ data }: { data: Responses }) => data);
}
Get list of template status types
GETGet all possible template statuses with their IDs, names, display names, and display orders.
| Template status IDs | |
|---|---|
1 | Active. |
2 | Inactive. |
- JSON
- TypeScript
{
"success": true,
"data": [
{
"id": 1,
"name": "active",
"displayName": "Active",
"order": 1
},
{
"id": 2,
"name": "inactive",
"displayName": "Inactive",
"order": 2
}
]
}
See TypeScript prerequisites for usage.
import {
getInstance
} from "prerequisites"
const axios = getInstance();
interface Responses {
200: {
content: {
"application/json": {
success: boolean;
data: {
id: number;
name: string;
displayName: string;
order: number;
}[]
}
};
};
}
function getTemplateStatuses(): Promise<Responses> {
const options = {
method: 'GET',
url: 'https://api.iqm.com/api/v3/ins/static/template-status',
};
return axios.request(options).then(({ data }: { data: Responses }) => data);
}
Get scheduling frequencies
GETGet static metadata for scheduling templates, including frequency types, sub-modes, and shared reference lists (day of week, day of month type).
| Frequency type IDs | |
|---|---|
1 | One-Time. |
2 | Daily. |
3 | Weekly. |
4 | Monthly. |
5 | Custom. |
- JSON
- TypeScript
{
"success": true,
"data": {
"frequencyTypes": [
{
"id": 1,
"name": "oneTime",
"displayName": "One-Time",
"order": 1,
"fields": [],
"modes": null
},
{
"id": 2,
"name": "daily",
"displayName": "Daily",
"order": 2,
"fields": [],
"modes": null
},
{
"id": 3,
"name": "weekly",
"displayName": "Weekly",
"order": 3,
"fields": [
{
"id": 301,
"name": "dayOfWeek",
"displayName": "Day of Week",
"order": 1,
"fieldType": "reference",
"min": null,
"max": null,
"allowedValuesRef": "dayOfWeek"
}
],
"modes": null
},
{
"id": 4,
"name": "monthly",
"displayName": "Monthly",
"order": 4,
"fields": [
{
"id": 401,
"name": "dayOfMonthType",
"displayName": "Day of Month Type",
"order": 1,
"fieldType": "reference",
"min": null,
"max": null,
"allowedValuesRef": "dayOfMonthType"
},
{
"id": 402,
"name": "dayOfMonth",
"displayName": "Day of Month",
"order": 2,
"fieldType": "number",
"min": 2,
"max": 28,
"allowedValuesRef": null
}
],
"modes": null
},
{
"id": 5,
"name": "custom",
"displayName": "Custom",
"order": 5,
"fields": null,
"modes": [
{
"id": 501,
"name": "days",
"displayName": "Day(s)",
"order": 1,
"fields": [
{
"id": 50101,
"name": "intervalValue",
"displayName": "Repeats In",
"order": 1,
"fieldType": "number",
"min": 1,
"max": 365,
"allowedValuesRef": null
}
]
},
{
"id": 502,
"name": "weeks",
"displayName": "Week(s)",
"order": 2,
"fields": [
{
"id": 50201,
"name": "intervalValue",
"displayName": "Repeats In",
"order": 1,
"fieldType": "number",
"min": 1,
"max": 52,
"allowedValuesRef": null
},
{
"id": 50202,
"name": "dayOfWeek",
"displayName": "Day of Week",
"order": 2,
"fieldType": "reference",
"min": null,
"max": null,
"allowedValuesRef": "dayOfWeek"
}
]
},
{
"id": 503,
"name": "months",
"displayName": "Month(s)",
"order": 3,
"fields": [
{
"id": 50301,
"name": "intervalValue",
"displayName": "Repeats In",
"order": 1,
"fieldType": "number",
"min": 1,
"max": 12,
"allowedValuesRef": null
},
{
"id": 50302,
"name": "dayOfMonthType",
"displayName": "Day of Month Type",
"order": 2,
"fieldType": "reference",
"min": null,
"max": null,
"allowedValuesRef": "dayOfMonthType"
},
{
"id": 50303,
"name": "dayOfMonth",
"displayName": "Day of Month",
"order": 3,
"fieldType": "number",
"min": 2,
"max": 28,
"allowedValuesRef": null
}
]
}
]
}
],
"references": {
"dayOfWeek": [
{
"id": 1,
"name": "monday",
"displayName": "Monday",
"order": 1
},
{
"id": 2,
"name": "tuesday",
"displayName": "Tuesday",
"order": 2
},
{
"id": 3,
"name": "wednesday",
"displayName": "Wednesday",
"order": 3
},
{
"id": 4,
"name": "thursday",
"displayName": "Thursday",
"order": 4
},
{
"id": 5,
"name": "friday",
"displayName": "Friday",
"order": 5
},
{
"id": 6,
"name": "saturday",
"displayName": "Saturday",
"order": 6
},
{
"id": 7,
"name": "sunday",
"displayName": "Sunday",
"order": 7
}
],
"dayOfMonthType": [
{
"id": 1,
"name": "firstDay",
"displayName": "First Day of Month",
"order": 1
},
{
"id": 2,
"name": "nthDay",
"displayName": "Specific Day (2-28)",
"order": 2
},
{
"id": 3,
"name": "lastDay",
"displayName": "Last Day of Month",
"order": 3
}
]
}
}
}
See TypeScript prerequisites for usage.
import {
getInstance
} from "prerequisites"
const axios = getInstance();
interface FrequencyField {
id: number;
name: string;
displayName: string;
order: number;
fieldType: string;
min: number | null;
max: number | null;
allowedValuesRef: string | null;
}
interface FrequencyMode {
id: number;
name: string;
displayName: string;
order: number;
fields: FrequencyField[];
}
interface FrequencyType {
id: number;
name: string;
displayName: string;
order: number;
fields: FrequencyField[] | null;
modes: FrequencyMode[] | null;
}
interface ReferenceItem {
id: number;
name: string;
displayName: string;
order: number;
}
interface Responses {
200: {
content: {
"application/json": {
success: boolean;
data: {
frequencyTypes: FrequencyType[];
references: {
[key: string]: ReferenceItem[];
}
}
}
};
};
}
function getFrequencyMetadata(): Promise<Responses> {
const options = {
method: 'GET',
url: 'https://api.iqm.com/api/v3/ins/static/scheduling/frequencies',
};
return axios.request(options).then(({ data }: { data: Responses }) => data);
}