Automate forecasting (API)
Overview
Use the Forecast API to automate predictions for available inventory in future time ranges.
Discovery forecast
The forecast API data matches the data in the Discovery forecast within the Equativ Monetization Platform. The legacy forecast, described in Use the forecast, doesn't use this API. As the underlying systems differ, you might see discrepancies.
Authentication
To learn how to authenticate, see Get started with Equativ APIs.
API limit
This API is subject to the global limit described in Get started with Equativ APIs: 60 requests per user, per minute.
Endpoint and use case
To retrieve forecast data, send a POST request to the following endpoint:
https://supply-api.eqtv.io/reportIn the request body, include the configuration for your forecast data. You must set the useCaseId to forecast, as shown in the following snippet:
{
"useCaseId": "forecast"
}
Properties
The following table provides all properties of the forecast API with details, descriptions and examples:
| Property | Type | Required / Optional | Description | Example |
|---|---|---|---|---|
dimensions |
Array | Optional | The list of dimensions to include in the forecast data. For a full list of available dimensions, use the /dimensions endpoint. |
["insertionId", "insertionName"] |
endDate |
String | Required |
The end date of the forecast data (date excluded). For absolute dates, use For relative dates, use either See also section “Forecast data for complete day”, later in this document. |
|
filters |
Array | Optional | The list of filters to apply to dimensions. Only forecast data matching all filters in the list are returned (AND condition). |
To request forecast data for deal Id 1 AND seatId 2: |
metrics |
Array | Required | The list of metrics to include in the forecast data. For a full list of available metrics, use the /metrics endpoint. |
["totalInventory", "availableImpressions", "bookedImpressions"] |
periodicity |
String | Optional |
The periodicity for metrics within the specified period ( If omitted, the API returns the total of each metric for the specified period. Supported values: |
"day" |
sortAsc |
String | Optional |
The sort direction of the forecast data. Supported values:
|
"asc" |
sortBy |
String | Optional |
The dimension or metric used to order the forecast data. For example, specify the metric |
"availableImpressions" |
startDate |
String | Required |
The start date of the forecast data (date excluded). For absolute dates, use For relative dates, use either |
"2026-02-13T00:00:00" |
timezone |
String | Optional |
The timezone in IANA format for If omitted, it defaults to the user's network timezone. |
"Europe/Paris" |
useCaseId |
String | Required | The type of requested data. To get forecast data, set it to forecast. |
"forecast" |
The following snippet shows a configuration of forecast data with the properties mentioned in the previous section:
Properties example
{
"startDate": "2026-02-14T00:00:00",
"endDate": "2026-02-15T00:00:00",
"timezone": "Etc/UTC",
"periodicity": "Day",
"metrics": [
"totalInventory",
"availableImpressions",
"bookedImpressions"
],
"dimensions": [
"appOrsiteId",
"appOrsiteName"
],
"filters": [],
"sortBy": "availableImpressions",
"sortAsc": "desc",
"useCaseId": "forecast"
} Metrics
The Forecast API provides the following metrics:
-
totalInventory: The available inventory (impressions available for sale), including reserved inventory from competing, guaranteed insertions. -
availableImpressions: The sum of available inventory and inventory booked by non-guaranteed insertions (priority lower than Normal 4). -
bookedImpressions: Inventory booked by guaranteed insertions (insertion priority greater than or equal to Normal 4).
Dimensions and filters
The following table lists each dimension and filter with the following information:
-
Dimension / Filter: The name of the dimension and/or filter. Note that some exist only as filters, including
audienceSegmentIdArray,packIdArray, orsemanticSegmentIdArray. - Compatible filter operators: The operators you can use for filtering when requesting the given field.
-
Reference endpoints: Use these endpoints to get all items of a given dimension. For example, use the reference endpoint
GET /VideoAdBreakTypesto retrieve all video ad break types, including their Ids. - Description: The description of the dimension or filter.
| Dimension / Filter | Compatible filter operators | Reference endpoint | Description |
|---|---|---|---|
adBreakTypeId |
in / not_in | GET /VideoAdBreakTypes | The type Id of the in-stream video ad break (before, within or after the video content). 1: pre-roll 2: mid-roll 3: post-roll |
adBreakTypeName |
in / not_in | n/a | The type name of the in-stream video ad break (before, within or after the video content). 1: pre-roll 2: mid-roll 3: post-roll |
appOrSiteId |
in / not_in | GET /sites | The Id of the app or site of the publisher, as defined in Equativ’s Monetization Platform. |
appOrSiteName |
in / not_in | n/a | The name of the app or site of the publisher, as defined in Equativ’s Monetization Platform. |
audienceSegmentIdArray |
has_any / has_none | GET /audiencesegments | An array of audience segment Ids. ⚠️ This field can only be used as a filter. |
browserParentId |
in / not_in | GET /browsers | The user's parent browser Id, representing all versions of the given browser. |
browserParentName |
in / not_in | n/a | The user's parent browser name, representing all versions of the given browser. |
cityId |
in / not_in | GET /cities | The Id of the city where the ad opportunity occurs. |
cityName |
in / not_in | n/a | The name of the city where the ad opportunity occurs. |
continentId |
in / not_in | GET /continents | The Id of the continent where the ad opportunity occurs. |
countryId |
in / not_in | GET /countries | The Id of the country where the ad opportunity occurs, following the ISO 3166-1 standard. |
countryName |
in / not_in | n/a | The name of the country where the ad opportunity occurs, following the ISO 3166-1 standard. |
deviceTypeId |
in / not_in | GET /platforms | The type Id of the device. 1: Desktop 2: Tablet 3: Smartphone 4: TV 5: Set Top Box 6: Game console 7: Other connected device |
deviceTypeName |
in / not_in | n/a | The type name of the device. 1: Desktop 2: Tablet 3: Smartphone 4: TV 5: Set Top Box 6: Game console 7: Other connected device |
dmaId |
in / not_in | GET /dmas | The Id of the Designated Market Area (DMA), used for regional targeting in the United States. |
dmaName |
in / not_in | n/a | The name of the Designated Market Area (DMA), used for regional targeting in the United States. |
environmentTypeId |
in / not_in | GET /inventorytypes | The type Id of the environment. 0: Web 1: Mobile Web 2: App |
environmentTypeName |
in / not_in | n/a | The type name of the environment. 0: Web 1: Mobile Web 2: App |
formatId |
in / not_in | GET /formats | The Id of the format. |
formatTypeId |
in / not_in | GET /impressiontypes | The type Id of the impression type. 0: Banner 1: VideoInStream 2: Native 3: VideoOutStream 4: Unknown 5: Audio |
formatTypeName |
in / not_in | n/a | The type name of the impression type. 0: Banner 1: VideoInStream 2: Native 3: VideoOutStream 4: Unknown 5: Audio |
hasKeywordKey |
in / not_in | n/a | A filter option to determine if a specific key was present in an ad call. It takes a key as a parameter and returns true if the keyword array contains at least one occurrence of this key. |
hasKeywordKeyValue |
in / not_in | n/a | A filter option used to determine if a specific key-value pair was present in an ad call. It takes a key and a value as parameters and returns true if the keyword array contains at least one occurrence of this key and this value. |
insertionPriorityId |
in / not_in | GET /insertionpriorities | The priority Id of the insertion, for example: 61: Normal 4 62: Normal 3 103: Exclusive 2 104: Exclusive 1 |
osParentId |
in / not_in | GET /operatingsystems | The parent Id of the operating system, representing all versions of the given operating system. |
packIdArray |
has_any / has_none | n/a | An array of pack Ids. ⚠️ This field can only be used as a filter. |
pageId |
in / not_in | GET /pages | The Id of the page, as declared in Equativ's Monetization platform. |
pageName |
in / not_in | n/a | The name of the page, as declared in Equativ's Monetization platform. |
postalCode |
in / not_in | n/a | The postal code, based on the geolocation where the ad opportunity occurs, |
regionId |
in / not_in | GET /regions | The Id of the geographical region where the ad opportunity occurs. |
semanticSegmentIdArray |
has_any / has_none | GET /semanticsegments | An array of semantic segment IDs. ⚠️ This field can only be used as a filter. |
stateId |
in / not_in | GET /states | The Id of the state where the ad opportunity occurs. |
stateName |
in / not_in | n/a | The name of the state where the ad opportunity occurs. |
Filter operators
Use the following operators to filter forecast data. To check compatibility by dimension, see column “Compatible filter operators” in the previous table.
| Filter | Full filter name | Type | Description |
|---|---|---|---|
contains |
contains | String | Keeps only values contained in an element of the specified list. |
gt |
greater than | Integer | Keeps only values greater than the provided value. |
has_any |
has any | Array of Integer | Functions like the in operator. Used for specific filters, including audienceSegmentIdArray, packIdArray, or semanticSegmentIdArray. |
has_none |
has none | Array of Integer | Functions like the not_in operator. Used for specific filters, including audienceSegmentIdArray, packIdArray, or semanticSegmentIdArray. |
in |
in | Array of Integer or String | Keeps only values present in the provided list. |
is |
is | Boolean | Keeps only values equal to the provided value. |
lt |
less than | Integer | Keeps only values less than the provided value. |
not_in |
not in | Array of Integer or String | Keeps only values not present in the provided list. |
Items within a list (inside a pair of squared brackets) are joined by OR logic, while the lists themselves are joined by AND logic.
The following snippet shows how to keep only the data matching the values 1234 or 5678 of the appOrSiteId field:
Filter example with "in" operator
"startDate": "2026-02-14T00:00:00",
"endDate": "2026-02-15T00:00:00",
"timezone": "Etc/UTC",
"periodicity": "Day",
"metrics": [
"totalInventory",
"availableImpressions",
"bookedImpressions"
],
"dimensions": [
"appOrsiteId",
"appOrsiteName"
],
"filters": [
[
{
"operator": "in",
"field": "appOrSiteId",
"values": [
1234,5678
]
}
]
],
"sortBy": "availableImpressions",
"sortAsc": "desc"
"useCaseId": "forecast"
}To get only guaranteed competing insertions, you can set the gt (greater than) filter on the insertionPriorityId field. The following snippet gets competing insertions on the appOrSiteId with the Id 1234. The filter insertionPriorityId is set to “greater than 50” to include only the insertions on guaranteed priority levels.
Filter example for guaranteed, competing insertions
{
"metrics": [
"bookedImpressions"
],
"dimensions": [
"insertionId",
"insertionName",
"insertionPriorityId"
],
"startDate": "2026-02-14T00:00:00",
"endDate": "2026-02-15T00:00:00",
"filters": [
[
{
"operator": "gt",
"field": "insertionPriorityId",
"values": [
50
]
}
],
[
{
"operator": "IN",
"field": "appOrSiteId",
"values": [
1234
]
}
]
],
"sortAsc": "desc",
"timezone": "Etc/UTC",
"useCaseId": "forecast"
}Forecast data for complete day
To request forecast data for a complete day, set the endDate to 00:00:00 of the following day.
For example, to cover all of September 1, 2025, set the following:
"startDate": "2025-09-01T00:00:00",
"endDate": "2025-09-02T00:00:00"Setting the endDate to 2025-09-01T23:59:59 only includes forecast data from 2025-09-01T00:00:00 till 2025-09-01T23:00:00.
Output names
You can specify a custom outputName for a dimension or metric. The retrieved forecast data will then use the specified output name as column header, rather than the default name.
- Don't use the following special characters in the
outputNamefield:,,),(,&,;,-. - Don't use commas (
,) or semicolons (;) in theoutputnamefield to prevent errors in the csv files containing the forecast data. The API uses semicolons as the default field separator. Field names containing semicolons might be incorrectly split into two columns. While the API automatically wraps fields in quotation marks to ensure proper processing, using semicolons in theoutputNamefield is not recommended.
The following snippet shows how to change the field name seatName to customSeatName in the API response:
{
...
"dimensions": [
{
"Field": "seatName",
"OutputName": "customSeatName"
}
]
...
}Response sample
The following snippet shows an example of a response containing forecast data. A successful request returns a 200 OK status.
[
{
"totalInventory": 85369330,
"bookedImpressions": 5454910,
"availableImpressions": 79914420,
"day": "1771027200000",
"appOrSiteId": 1234,
"appOrSiteName": "siteA"
},
{
"totalInventory": 23462300,
"bookedImpressions": 475870,
"availableImpressions": 22986430,
"day": "1771027200000",
"appOrSiteId": 5678,
"appOrSiteName": "siteB"
}
]