Manage deals with the API
Overview
With the Auction Package API, developers can automate the creation, editing, updating, and pausing of deals. For complete field-level reference, see the live Swagger documentation. This help page focuses on surface coverage, behavioral rules, and integration guidance.
Swagger UI
You can use the Swagger UI to explore and test the API endpoints interactively.
Authentication
The authentication workflow involves Equativ’s authentication provider (Auth0) and Equativ’s own Maestro user API.
Required information
To authenticate and use the Maestro API, you need the following credentials, which will be provided by your Equativ contact:
- the
client_idandclient_secret - the
usernameandpasswordused to access the Maestro platform
Treat any received credentials as confidential and don't share them with third parties.
Authentication workflow
Step 1: Request the access token from Auth0
Request the access token from Equativ’s authentication provider Auth0:
curl --request POST \
--url 'https://´smartadserver.eu.auth0.com/oauth/token' \
--header 'content-type: application/x-www-form-urlencoded' \
--data-urlencode 'grant_type=http://auth0.com/oauth/grant-type/password-realm' \
--data 'realm=Username-Password-Authentication' \
--data 'audience=api.demand.smartadserver.com' \
--data-urlencode 'username={username}' \
--data-urlencode 'password={password}' \
--data 'client_id={client id}' \
--data 'client_secret={client secret}'In the response, you will receive the access token, which has a time to live of 10 hours (36000 seconds):
{
"access_token":"<access token>",
"expires_in": 36000,
"token_type": "Bearer"
}Step 2: Request the user token
With the access token obtained in Step 1, you must now request the user token, which you will use in all future API requests:
curl --request GET \
--url https://demand-api.eqtv.io/authorize \
--header 'Authorization: Bearer <access token>'The response body will only contain the user token which has a time to live of 10 hours.
Step 3: Use the user token in API requests
Use the user token obtained in Step 2 in the Authorization header of all your API requests:
curl --request GET \
--url https://demand-api.eqtv.io/deals \
--header 'Authorization: Bearer <user token>'Work with Maestro Auction Package API
Endpoint
The endpoint for the Maestro Auction Package API is:
https://demand-api.eqtv.io/Data minimization
To ensure performance, security, and privacy, make sure you retrieve only the data your application requires.
Limits
- Within a 5-minute window, you can authenticate a maximum of 10 times. Any additional authentication attempts during this period will be unsuccessful.
- By default, the API allows up to 500 requests per day for deal updates and 15 requests per day for deal creations. Exceeding these limits will result in an error message. These limits reset daily.
Request and response headers
| Header | Direction | Description |
|---|---|---|
Location |
POST response | The URL of the newly created resource |
X-HistoryId |
POST response | The history tracking ID for the created deal |
X-CopyOfDealId |
POST request | The new deal created as a copy of the specified deal ID |
X-Pagination-Total-Count |
GET /deals response | The total number of items across all pages |
Link |
GET /deals response | The RFC 5988 pagination links (first, next, prev, last) |
Reference lookups
The following reference tables describe enum values used in deal objects.
Deal types (typeId)
| Value | Name |
|---|---|
| 1 | PrivateAuction |
| 2 | DirectDeal |
| 3 | GuaranteedDeal |
Deal priorities (priorityId)
| Value | Description |
|---|---|
| 1 | Low |
| 2 | Medium |
| 3 | High |
Deal criticalities (dealCriticalityId)
| Value | Description |
|---|---|
| 1 | Standard |
| 2 | High |
Capping time frames (timeFrameId)
Document the available values (for example, hourly, daily, weekly, lifetime—get exact values from the codebase or Swagger doc).
Impression types (impressionTypeIds)
| Value | Name |
|---|---|
| 0 | Display |
| 1 | Native |
| 2 | In-Stream |
| 3 | Out-Stream |
| 4 | Audio |
| 5 | Unknown |
Platforms (platformIds)
| Value | Name |
|---|---|
| 1 | Desktop |
| 2 | Tablet |
| 3 | Smartphone |
| 4 | TV |
| 5 | SetTopBox |
| 6 | GameConsole |
Pricing models (pricingModel)
| Value | Name |
|---|---|
| 0 | Variable floor |
| 1 | Fixed price |
| 2 | Custom floor |
| 3 | Guaranteed price |
Sort filters (sortBy)
Document available sortBy values for the GET /deals endpoint.
DSP caller restrictions: the following lookups are blocked for DSP callers: identity providers, third-party providers, and domain lists. These resources return a 403 Forbidden error when called with DSP credentials.
Retrieve resources: GET /<RESOURCE>
Before creating a deal, you need to aggregate the identifiers of each of the filters you want to apply, such as publisher ID, country ID, buyer ID, or partner. The path to retrieve these identifiers is the same for all available resources.
Available resources
- buyers
- partners
- dsps
- countries
- publishers
- impressionTypes
- inventoryTypes
- cities
- states
- regions
- dmas
- videoPlacementTypes
- adBreakTypes
- videoPlayerSizeBuckets
- audienceSegmentProviders
- semanticSegmentProviders
- audienceSegments
- semanticSegments
- platforms
Parameters
The following query parameters can be used to filter the results:
| Query parameter | Definition |
|---|---|
Ids |
A comma-separated list of identifiers to fetch for the specified resource |
extendedSearch |
The string to search in the resource’s name |
limit |
An integer to limit the results to the n first items |
offset |
An integer to offset the results by an increment of n items |
Example for extendedSearch with limit
The following example requests the items containing "London" in the countries resource with a limit of three items to be returned:
https://demand-api.eqtv.io/cities?extendedSearch=London&limit=3The following example shows the corresponding response:
[
{
"name": "London",
"countryId": 78,
"regionId": 164,
"stateId": 2531,
"isArchived": false,
"extendedName": "London - Greater London - United Kingdom",
"id": 71284
},
{
"name": "London",
"countryId": 93,
"regionId": 249,
"stateId": 2124,
"isArchived": false,
"extendedName": "London - Ontario - Canada",
"id": 12226
},
{
"name": "London",
"countryId": 152,
"regionId": 128,
"stateId": 2192,
"isArchived": false,
"extendedName": "London - Ohio - United States",
"id": 5946
}
]Example of search for specified partners
The following example requests the partner IDs 76 and 75:
https://demand-api.eqtv.io/partners?ids=76,75The following example shows the corresponding response:
[
{
"name": "Google DV360",
"isMultiBuyerDealForbidden": false,
"isArchived": false,
"id": 76
},
{
"name": "The Trade Desk",
"isMultiBuyerDealForbidden": false,
"isArchived": false,
"id": 75
}
]Hyperlocal targeting
For more information about hyperlocal targeting, see Hyperlocal targeting fields.
Create deal: POST /deals
The POST /deals method creates a deal.
General fields
You must specify at least one buyerId or dspId to create or edit a deal. partnerIds are deprecated and no longer supported.
| Field name | Type | Necessity | Definition | Example |
|---|---|---|---|---|
beginDate endDate
|
datetime ISO 8601 | mandatory | The deal’s start and end dates. A value of null for both fields (see example) indicates that the deal is always on (no start or end date) |
"beginDate": null, "endDate": null, |
buyerIds |
array of int (id) | mandatory (if no dspIds) |
The buyer seat IDs allowed to bid on the deal. Setting both buyerIds and dspIds isn't allowed. Resource: GET /buyers
|
"buyerIds": [3548], "dspIds": [] |
dspIds |
array of int (id) | mandatory (if no buyerIds) |
The DSP IDs allowed to bid on the deal. Setting both dspIds and buyerIds isn't allowed. Resource: GET /dsps
|
"dspIds": [75], "buyerIds": [] |
expirationDate |
datetime ISO 8601 | optional | The deal's expiration date | "2026-06-29T21:59:59+00:00" |
expirationDateUtc |
datetime ISO 8601 | read-only | The expiration date in UTC (returned in GET responses) | "2026-06-29T21:59:59Z" |
callerDealIds |
array of string | optional | The caller-side deal IDs | ["261828702428"] |
currency |
string (currency symbol) | mandatory | The deal currency | "currency": "EUR" |
isActive |
boolean | mandatory | A field indicating if the deal is active (true) or paused (false) | "isActive": true |
isDisabledByRegulator |
boolean | read-only | A field indicating if a regulator has disabled the deal. | "isDisabledByRegulator": false |
isParentDeal |
boolean | read-only | A field indicating if the deal is a parent deal | "isParentDeal": false |
name |
string | mandatory | The deal name | "name": "This is the deal name" |
spoTargetingIds |
array of int | optional | The SPO target IDs | "spoTargetingIds": [1, 2] |
identityProviderId |
integer | optional | The identity provider ID. Required for frequency capping. | "identityProviderId": 42 |
thirdPartyProviderCosts |
array of object | optional | Third-party provider cost configurations. | "thirdPartyProviderCosts": [{"providerId": 5, "costRate": 0.10}] |
The partnerIds field has been deprecated and removed from the API. Using partnerIds in POST /deals or PUT /deals requests will return an error. Pre-existing deals remain fully operational, but partnerIds will no longer appear in any API response.
Some DSPs don't support multiple-buyer deal targeting. If you attempt to create a deal targeting one of these DSPs, the API will return the following error: { "message": "Your deal cannot target DSPs that do not support multiple-buyer targeting: {dspId}" }
Contact your Equativ representative to check which DSPs are compatible with multi-buyer targeting.
Pricing fields
| Field name | Type | Necessity | Definition |
|---|---|---|---|
CompanyVendorCostRate |
number (2 decimals) |
optional | The company vendor cost rate, also known as curator margin. This field should be used when creating variable floor deals. The CompanyVendorCostRate must be expressed as a percentage of the sold price, for example, CompanyVendorCostRate = 0.15 expresses a 15% margin. For more information about curator margin, see Create deals. |
managementVendorCostCpm |
number (2 decimals) | optional | A management vendor cost expressed as a CPM value. |
managementVendorCostRate |
number (2 decimals) | optional | A management vendor cost rate. |
minCompanyVendorCost |
number (2 decimals) |
optional | The minimum company vendor cost, also known as curator margin. This field should be used when creating Custom floor and Fixed price deals. The minCompanyVendorCost must be expressed as an absolute value, for example, minCompanyVendorCost = 4 expresses a 4$ margin. For more information about curator margin, see Create deals. |
price |
number (2 decimals) |
mandatory |
The buyer side price:
|
pricingModel |
integer | mandatory |
The pricing model:
|
Pricing examples
| Example | Snippet |
|---|---|
|
Variable floor with floor price
|
"pricingModel": 0, "price": 4, "companyVendorCostRate": 0
|
|
Variable floor with publisher floor
|
"pricingModel": 0, "price": 0, "companyVendorCostRate": 0.15
|
|
Custom floor
|
"pricingModel": 2, "price": 8, "minCompanyVendorCost": 3
|
|
Fixed price
|
"pricingModel": 1, "price": 10, "minCompanyVendorCost": 3
|
Guaranteed price
Guaranteed price deals have the following constraints:
-
Single buyer required: exactly one
buyerIdmust be specified. - Buyer eligibility: the buyer must be eligible for guaranteed deals (check with your Equativ contact).
- Format restrictions: only Display, In-Stream, and Out-Stream impression types are supported.
-
Date immutability rules:
-
Pre-flight (before
beginDate):beginDateandendDatecan be changed. -
In-flight (between
beginDateandendDate):beginDatecannot be changed;endDatecan only be extended. -
Post-flight (after
endDate): dates cannot be changed.
-
Pre-flight (before
Targeting fields
At least one targeting criterion must be applied to create or edit a deal.
| Field name | Type | Definition | Resource/Value | Example |
|---|---|---|---|---|
apiCompliance |
boolean | The compliancy with the IAB’s VPAID or OMSDK measurement specifications | "isVpaidCompliant": boolean "isOmSdkCompliant": boolean |
"apiCompliance": { "isVpaidCompliant": false, "isOmSdkCompliant": false }
|
audienceSegmentsTargeting |
string |
Audience segments, provided by the AudienceSegmentProviders
|
GET /AudienceSegmentProviders GET /AudienceSegments | "audienceSegmentsTargeting": "102590" |
cityIds |
array of int/string | The city IDs | GET /cities |
"cityIds": [ "448013", "14352" ], "cityIds": [ 448013, 14352 ]
|
countryCodes |
array of codes | The country codes, specified as per ISO 3166 | GET /countries |
"countryCodes": [ "FRA" ]
|
creativeSizes |
array of strings | The sets of creative heights and widths | GET /CreativeBannerSizes |
"creativeSizes": [ "300*250", "320*50", "300*600", "728*90", ]
|
ctvOttIds |
array of int | The CTV and OTT targeting IDs | GET /ctvOtt | "ctvOttIds": [1, 4, 7] |
ctvCategoryIds |
array of int | The CTV category targeting IDs | GET /ctvCategories |
|
ctvChannelIds |
array of int | The CTV channel targeting IDs | GET /ctvChannels |
|
ctvDistributorIds |
array of int | The CTV distributor targeting IDs | GET /ctvDistributors |
|
ctvNetworkIds |
array of int | The CTV network targeting IDs | GET /ctvNetworks |
|
dmaIds |
array of int | The DMA IDs (USA only) | GET /DMAs |
"dmaIds": [ "644", "821" ]
|
impressionTypeIds |
array of int | The different types of the impression: Display, Native, In-Stream, and Out-stream | GET /impressiontypes |
"impressionTypeIds": [ 1 ]
|
inventoryTypeIds |
array of int | The inventory types, indicating the environments where the ad can be displayed: "Web", "WebMobile", or "MobileApp" | GET /inventorytypes |
"inventoryTypeIds": [ 0 ]
|
isCTV |
boolean | The targeting of connected TV inventory | “isCTV”:boolean | "isCTV": false, |
platformIds |
array of int | The platform, such as "Desktop", "Tablet", "Smartphone" | GET /platforms |
"platformIds": [ 1 ]
|
publishers/networks |
array of int | The list of publishers/networks | GET /publishers |
"networkIds": [ 1, 13, 50 ]
|
regionIds |
array of int | The region IDs | GET /regions |
"regionIds": [ "239", "88" ]
|
semanticSegmentsTargeting |
string |
Semantic contextual segments
The example targets:
|
GET /SemanticSegmentProviders GET /SemanticSegments | "semanticSegmentsTargeting": "7822,8630;12486;not 7825" |
stateIds |
array of int | The state IDs | GET /states |
"stateIds": [ "1749", "2144" ]
|
videoAdBreakTypeIds |
array of int | The video ad break type IDs for in-stream video | GET /videoadbreaktypes |
"videoAdBreakTypeIds": [ "3" ]
|
videoCompletionTargetingPercentage |
integer | The video completion target rate (formula: completely viewed video ads/started video ads | Value from 0 to 100 (int) | "videoCompletionTargetingPercentage": 75 |
videoPlacementTypeIds |
array of int | The placement type IDs for video formats | GET /videoplacementtypes |
"videoPlacementTypeIds": [ "1" ]
|
videoPlayerSizeDimension |
integer | The minimum video player size At least one of the two values must be specified (width and/or height) | "minHeight": int "minWidth": int |
"videoPlayerSizeDimension": { "minWidth": 1152, "minHeight": 648 }
|
viewabilityTargetingPercentage |
integer | The viewability target rate (formula: viewable impression/impressions) | Value from 0 to 100 (int) | "viewabilityTargetingPercentage": 50 |
Delivery capping
Delivery capping controls the volume of impressions or spend for a deal.
| Field | Type | Definition |
|---|---|---|
overallCapUnits |
integer | The maximum number of impressions |
overallCapCents |
integer | The maximum total spend (in cents) |
dailyCapUnits |
integer | The maximum daily impressions |
dailyCapCents |
integer | The maximum daily spend (in cents) |
pacingMode |
string | Delivery pacing mode: Even or Asap |
Frequency capping
Frequency capping limits how many times a user sees the deal's ads.
| Field | Type | Definition |
|---|---|---|
timeFrameId |
integer | The capping time frame (see Reference lookups) |
impressions |
integer | The maximum impressions per user per time frame |
Prerequisite: An identityProviderId must be set on the deal, and the identity provider must support frequency capping. Without this, frequency capping settings are ignored.
Publisher budget allocations
When delivery capping is set, you can allocate budgets per publisher:
| Field | Type | Definition |
|---|---|---|
| publisherId | integer | The publisher ID |
| shareAllocation | number | The percentage share of the total budget |
| adjustedTarget | number | The adjusted delivery target |
| softCapped | boolean | A field indicating if the cap is soft |
Constraint: beginDate and endDate are required when delivery capping (budgetIds) is configured.
Example of deal creation with targeting criteria
{
"isActive": true,
"name": "Fake API Deal",
"pricingModel": 1,
"price": 5,
"minCompanyVendorCost": 2,
"currency": "GBP",
"buyerIds": [
3548,
3541
],
"dspIds": [],
"salesPersonUserId": 277,
"beginDate": null,
"endDate": "2023-01-23T23:59:59Z",
"platformIds": [
1
],
"audienceSegmentsTargeting": "102590",
"semanticSegmentsTargeting": "7822,8630;12486;not 7825",
"countryCodes": [
"FRA"
],
"networkIds": [
1,
13,
50
],
"impressionTypeIds": [
0
],
"inventoryTypeIds": [
0
],
"cityIds": [],
"stateIds": [],
"regionIds": [],
"dmaIds": [],
"viewabilityTargetingPercentage": 50,
"videoCompletionTargetingPercentage": 50,
"ctrTargetingPercentage": 0,
"videoPlacementTypeIds": [],
"videoAdBreakTypeIds": [],
"countryCodesPostalCodes": [],
"videoPlayerSizeBucketIds": [],
"apiCompliance": {
"isVpaidCompliant": false,
"isOmSdkCompliant": false
},
"isCTV": false,
"videoPlayerSizeDimension": {
"minHeight": null,
"minWidth": null
},
"creativeSizes": []
}Example deal targeting a DSP
{
"isActive": true,
"name": "Fake API Deal - DSP Targeting",
"pricingModel": 1,
"price": 5,
"minCompanyVendorCost": 2,
"currency": "GBP",
"buyerIds": [],
"dspIds": [75],
"salesPersonUserId": 277,
"beginDate": null,
"endDate": "2026-06-30T23:59:59Z",
"platformIds": [1],
"audienceSegmentsTargeting": "",
"semanticSegmentsTargeting": "",
"countryCodes": ["FRA"],
"networkIds": [1, 13, 50],
"impressionTypeIds": [0],
"inventoryTypeIds": [0],
"cityIds": [],
"stateIds": [],
"regionIds": [],
"dmaIds": [],
"viewabilityTargetingPercentage": 50,
"videoCompletionTargetingPercentage": 0,
"ctrTargetingPercentage": 0,
"videoPlacementTypeIds": [],
"videoAdBreakTypeIds": [],
"countryCodesPostalCodes": [],
"videoPlayerSizeBucketIds": [],
"apiCompliance": {
"isVpaidCompliant": false,
"isOmSdkCompliant": false
},
"isCTV": false,
"videoPlayerSizeDimension": {
"minHeight": null,
"minWidth": null
},
"creativeSizes": []
}
Hyperlocal targeting fields
Hyperlocal targeting is an advanced form of geotargeting, using precise coordinates and a radius.
| Field name | Type | Definition | Example |
|---|---|---|---|
coordinates |
object | The coordinates, each consisting of a name, latitude, longitude and radius. |
"coordinates": [ { "name": "Loc 1", "latitude": 0.6435, "longitude": 45.0, "radius": 500 }]
|
hyperLocalTargeting |
object | The hyperlocal targeting, used to target geolocations with high precision, based on longitude, latitude, and radius. |
"hyperLocalTargeting": { "precision": 1, "coordinates": [ { "name": "Loc 1", "latitude": 0.6435, "longitude": 45.0, "radius": 500 } ]}
|
latitude |
double | The latitude value of the coordinate. Value must be between -90 and 90. Values must be in decimal degrees with a dot (“.”) used as separator, for example, 41.40338 | "latitude": 0.6435 |
longitude |
double | The longitude value of the coordinate. Value must be between -180 and 180. Values must be in decimal degrees with a dot (“.”) used as separator, for example, 41.40338 | "longitude": 45.0 |
name |
string | The name of the coordinate. This value is optional and will be generated automatically, if not provided. | "name": "Eiffel Tower" |
precision |
int |
Specifies if the hyperlocal targeting is based on GPS coordinates or IP addresses:
|
"precision": 1 |
radius |
int | The distance in meters around the specified longitude and latitude | "radius": 500 |
Example of deal creation with hyperlocal targeting criteria
The following example shows a request with hyperlocal parameters, highlighted in green.
{
"isActive": true,
"name": "Test HTL",
"pricingModel": 0,
"price": 0.34,
"companyVendorCostRate": null,
"currency": "EUR",
"buyerIds": [
117556
],
"dspIds": [],
"beginDate": null,
"endDate": null,
"isDspSyncEnabled": false,
"ctvOttIds": [],
"ctvCategoryIds": [],
"ctvChannelIds": [],
"ctvDistributorIds": [],
"ctvNetworkIds": [],
"platformIds": [],
"templateIds": [],
"audienceSegmentsTargeting": "",
"semanticSegmentsTargeting": "",
"domainCategorySegmentsTargeting": "",
"countryCodes": ["FRA"],
"networkIds": [],
"impressionTypeIds": [],
"inventoryTypeIds": [
1
],
"cityIds": [],
"stateIds": [],
"regionIds": [],
"dmaIds": [],
"videoPlacementTypeIds": [],
"videoAdBreakTypeIds": [],
"countryCodesPostalCodes": [],
"videoPlayerSizeBucketIds": [],
"apiCompliance": {
"isVpaidCompliant": false,
"isOmSdkCompliant": false
},
"isRewardedVideo": null,
"isCTV": false,
"videoPlayerSizeDimension": {},
"skippable": null,
"creativeSizes": [],
"childrenDealIds": [],
"contentGenreNames": null,
"contentCategoryNames": null,
"contentContextIds": null,
"contentIds": null,
"contentLanguageIso6391Alpha2Codes": null,
"contentChannelNames": null,
"contentNetworkNames": null,
"videoMaxAdDurationIds": [],
"scoNodeBucketIds": [],
"domains": null,
"domainListId": null,
"hyperLocalTargeting": {
"precision": 1,
"coordinates": [
{
"name": "Loc 1",
"latitude": 0.6435,
"longitude": 45.0,
"radius": 500
},
{
"name": "Loc 2",
"latitude": 20.0003,
"longitude": -40.5,
"radius": 5000
},
{
"name": "(0, 45) - 1500 m",
"latitude": 0.0,
"longitude": 45.0,
"radius": 1500
},
{
"name": "Loc 3",
"latitude": 50.32455,
"longitude": 45.0,
"radius": 500
}
]
}
}Hyperlocal targeting and geotargeting combined
If you set a hyperlocal radius that spans multiple countries, you might inadvertently target regions beyond your intended area. By integrating additional geotargeting parameters, such as country or city boundaries, you can ensure more precise targeting and avoid cross-border issues.
Retrieve list of deals GET /deals
The GET /deals method retrieves the entire list of deals created by the company.
Item limitation
The response is limited to 100 items. To get more items, make another request using the offset parameter.
The following example requests the 100 to 200 items of the deal list:
GET https://demand-api.eqtv.io/deals?offset=100Use the limit parameter to reduce the number of results.
The following example requests a maximum of two deals:
GET https://demand-api.eqtv.io/deals?limit=2The API returns X-Pagination-Total-Count (total number of items) and RFC 5988 Link headers for pagination. Note that the limit parameter is silently clamped to a maximum of 100.
Filter reference
| Parameter | Type | Description |
|---|---|---|
createdOrModifiedSince |
datetime | The timestamp used to filter deals created or modified after this date. The API interprets this value in UTC. |
isArchived |
boolean | The flag used to filter deals by their archived status. |
isSoonExpired |
boolean | The flag used to filter for deals that are expiring soon. |
isParentDeal |
boolean | The flag used to filter for parent deals only. |
sortBy |
string | The field used to sort the results (see Reference lookups). |
sortAsc |
boolean | The sort direction (true = ascending). |
metricsBeginDate |
datetime | The start date for metric calculations. |
metricsEndDate |
datetime | The end date for metric calculations. |
buyerIds |
comma-separated int | The list of buyer IDs used to filter the results. |
dspIds |
comma-separated int | The list of DSP IDs used to filter the results. |
partnerIds |
comma-separated int | The list of partner IDs used to filter the results. |
formatIds |
comma-separated int | The list of format IDs used to filter the results. |
platformIds |
comma-separated int | The list of platform IDs used to filter the results. |
Example of deal list retrieval response
The following example shows a deal list response containing two deals.
[
{
"semanticSegmentsDataCost": 0.0,
"audienceSegmentsDataCost": 0.0,
"updatedAt": "2022-06-22T13:01:00Z",
"isArchived": false,
"isEditable": true,
"name": "AP_US_Mobile_InApp_Smadex",
"createdAt": "2022-06-15T12:45:00Z",
"isActive": true,
"typeId": 1,
"dealId": "841126260456",
"pricingModel": 0,
"customVendorCost": 0.0,
"currency": "USD",
"isExclusive": false,
"isDealPlus": true,
"dealCriticalityId": 2,
"throttlingRate": 0.99,
"platformIds": [
3
],
"countryCodes": [
"USA"
],
"keywordTargeting": "",
],
"priorityId": 3,
"semanticSegmentsTargeting": "",
"audienceSegmentsTargeting": "",
"inventoryTypeIds": [
1,
2
],
"impressionTypeIds": [
0
],
"price": 1.224,
"domainListId": 9812,
"apiCompliance": {
"isOmSdkCompliant": false,
"isVpaidCompliant": false
},
"salesPersonUserId": 146,
"keywordIdsTargeting": "",
"id": 4728209
},
{
"semanticSegmentsDataCost": 0.0,
"audienceSegmentsDataCost": 0.96,
"viewabilityDataCost": 0.0,
"updatedAt": "2022-06-21T03:01:00Z",
"isArchived": false,
"isEditable": true,
"name": "InfoPro - Security & Antivirus",
"createdAt": "2022-05-30T10:31:00Z",
"isActive": true,
"typeId": 1,
"dealId": "761583477993",
"pricingModel": 0,
"customVendorCost": 0.0,
"companyVendorCostRate": 0.2,
"currency": "EUR",
"isExclusive": false,
"isDealPlus": true,
"dealCriticalityId": 2,
"throttlingRate": 0.99,
"countryCodes": [
"FRA"
],
"keywordTargeting": "",
],
"priorityId": 3,
"semanticSegmentsTargeting": "",
"audienceSegmentsTargeting": "26249",
"inventoryTypeIds": [
0,
1
],
"impressionTypeIds": [
0
],
"viewabilityTargetingPercentage": 70.0,
"price": 0.333,
"apiCompliance": {
"isOmSdkCompliant": false,
"isVpaidCompliant": false
},
"salesPersonUserId": 107,
"keywordIdsTargeting": "",
"id": 3960526
}
]GET responses return a DemandDeal shape that includes computed cost fields not present in write requests: semanticSegmentsDataCost, audienceSegmentsDataCost, viewabilityDataCost, videoCompletionDataCost. These fields are read-only.
Hyperlocal targeting
For more information about hyperlocal targeting, see Hyperlocal targeting fields.
Retrieve deal information: GET /deals/<Id>
The GET /deals/<Id> method retrieves the information about a specific deal, where <Id> is a deal identifier set by Equativ, to be taken from the deal list response received using the GET /deals method. This identifier isn't to be confused with the "DealId" identifying the deal across SSPs and DSPs.
Example of deal information retrieval
The following example retrieves information about the specified deal ID 1327581:
GET https://demand-api.eqtv.io/deals/1327581The response contains:
-
dealId 129531443390: the ID used to identify the deal across SSPs and DSPs -
id 1327581: the deal ID set by Equativ, taken from the deal list response received using the GET /deals method
{
"semanticSegmentsDataCost": 0.0,
"audienceSegmentsDataCost": 0.0,
"updatedAt": "2023-01-23T11:02:00Z",
"isArchived": false,
"isEditable": true,
"name": "AP_Mexico_Display_CTR+2_domains_Dynadmic",
"createdAt": "2021-06-18T15:34:00Z",
"isActive": true,
"typeId": 1,
"dealId": "129531443390",
"pricingModel": 0,
"customVendorCost": 0.0,
"currency": "USD",
"isExclusive": false,
"isDealPlus": true,
"dealCriticalityId": 2,
"throttlingRate": 0.8,
"countryCodes": [
"MEX"
],
"keywordTargeting": "",
],
"dspIds": [],
"priorityId": 3,
"semanticSegmentsTargeting": "",
"audienceSegmentsTargeting": "",
"price": 0.0,
"domainListId": 3404,
"apiCompliance": {
"isOmSdkCompliant": false,
"isVpaidCompliant": false
},
"keywordIdsTargeting": "",
"id": 1327581
}Hyperlocal targeting
For more information about hyperlocal targeting, see Hyperlocal targeting fields.
Edit deal: PUT /deals
The PUT /deals updates a specified deal, where <Id> is a deal identifier set by Equativ, to be taken from the deal list response received using the GET /deals method. This identifier isn't to be confused with the DealId identifying the deal across SSPs and DSPs.
⚠️ Warning: when updating a deal using the PUT method, you must include all relevant fields in the request body. Any fields that aren't explicitly included in the update request will be reset to their default values. If you omit any field, it won't retain its current value but will instead revert to the system's default state.
Example of deal editing
The following example edits the specified deal ID 1327581:
PUT https://demand-api.eqtv.io/deals/1327581The request body contains:
-
dealId 129531443390: the ID used to identify the deal across SSPs and DSPs -
id 1327581: the deal ID set by Equativ, taken from the deal list response received using the GET /deals method
{
"semanticSegmentsDataCost": 0.0,
"audienceSegmentsDataCost": 0.0,
"updatedAt": "2023-01-23T11:02:00Z",
"isArchived": false,
"isEditable": true,
"name": "AP_Mexico_Display_CTR+2_domains_Dynadmic",
"createdAt": "2021-06-18T15:34:00Z",
"isActive": true,
"typeId": 1,
"dealId": "129531443390",
"pricingModel": 0,
"customVendorCost": 0.0,
"currency": "USD",
"isExclusive": false,
"isDealPlus": true,
"dealCriticalityId": 2,
"throttlingRate": 0.8,
"countryCodes": [
"MEX"
],
"keywordTargeting": "",
"dspIds": [75],
"priorityId": 3,
"semanticSegmentsTargeting": "",
"audienceSegmentsTargeting": "",
"price": 0.0,
"domainListId": 3404,
"apiCompliance": {
"isOmSdkCompliant": false,
"isVpaidCompliant": false
},
"keywordIdsTargeting": "",
"id": 1327581
}Even for deals originally created with partnerIds, any PUT request must now use dspIds. Using partnerIds in a PUT request will result in an error.
Hyperlocal targeting
For more information about hyperlocal targeting, see Hyperlocal targeting fields.
Delete deal: DELETE /deals/{id}
The DELETE method removes a specified deal.
DELETE https://demand-api.eqtv.io/deals/{id}
Where {id} is the deal identifier set by Equativ, taken from the deal list response received using the GET /deals method. This identifier is not to be confused with the "DealId" identifying the deal across SSPs and DSPs.
Domain lists: POST and DELETE /deals/{id}/domainlists
Add a domain list: POST /deals/{id}/domainlists
Associates a domain list with a deal.
POST https://demand-api.eqtv.io/deals/{id}/domainlists
Request body:
```json
{
"domainListId": 1234
}Remove a domain list: DELETE /deals/{id}/domainlists
Removes the domain list association from a deal.
DELETE https://demand-api.eqtv.io/deals/{id}/domainlists
DSP restriction: Domain list endpoints aren't available for DSP callers.
Count breakdown: GET /deals/countBreakdown
Returns a breakdown of deal counts by status.
GET https://demand-api.eqtv.io/deals/countBreakdown
Validation rules
Immutability
-
currencyandpricingModelcannot be changed after deal creation. -
isDspSyncEnabledcannot be reverted tofalseonce set totrue.
Geotargeting exclusivity
- Only one geo targeting type can be active at a time (countries, regions, cities, states, DMAs, or postal codes).
-
hyperLocalTargetingrequires at least one other geo field (e.g.,countryCodes) to be set.
Guaranteed price deal constraints
- Dates follow phase-based immutability rules (see Guaranteed Price section).
- Only Display, In-Stream, and Out-Stream formats are allowed.
- Exactly one eligible buyer is required.
Budget constraint
-
beginDateandendDateare required whenbudgetIdsare set.
Frequency capping prerequisite
-
identityProviderIdmust be set and the provider must support frequency capping.
Deal reporting
For more information about deal reporting, see Manage reports with the API.