Contact support

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/report

In 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 yyyy-MM-dd'T'HH:mm:ss.

For relative dates, use either current-[hour | day | week | month | year]-[number] or now.

See also section “Forecast data for complete day”, later in this document.

"2026-02-13T15:00:00”

 

"current-day-1"

filters Array Optional The list of filters to apply to dimensions. Only forecast data matching all filters in the list are returned (AND condition).

[{"operator": "IN", "field": "publisherId", "values": [73]}]

 

To request forecast data for deal Id 1 AND seatId 2: [dealId = 1, 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 (startDate till endDate).

If omitted, the API returns the total of each metric for the specified period.

Supported values: hour, day.

"day"
sortAsc String Optional

The sort direction of the forecast data.

Supported values:

  • asc (ascending)
  • desc (descending)
"asc"
sortBy String Optional

The dimension or metric used to order the forecast data.

For example, specify the metric availableImpressions to sort the results based on this metric.

"availableImpressions"
startDate String Required

The start date of the forecast data (date excluded).

For absolute dates, use yyyy-MM-dd'T'HH:mm:ss.

For relative dates, use either current-[hour | day | week | month | year]-[number] or now.

"2026-02-13T00:00:00"
timezone String Optional

The timezone in IANA format for startDate and endDate.

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, or semanticSegmentIdArray
  • 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 /VideoAdBreakTypes to 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 outputName field: ,, ), (, &, ;, -.
  • Don't use commas (,) or semicolons (;) in the outputname field 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 the outputName field 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"
   }
]