This document is a companion to the Triton Digital Booking API ("BAPI") documentation.
The Triton Digital ad delivery engine does criteria matching using a language very similar to Druid's. The criteria is expressed in JSON format and supports multiple levels of operators.
The object supports the syntax described below.
AND/OR
The and/or criteria takes a list of criteria in an array, defined in the fields dimension. (Plural; note the "s" in "fields.")
Example: AND
{
"type":"and"
"fields":[{<criteria>},{<criteria>}]
}
Example: OR
{
"type":"or"
"fields":[{<criteria>},{<criteria>}]
}
NOT
The not criteria takes one criteria defined in the field dimension. (Singular; no "s" in "field.")
{
"type":"not",
"field":{<criteria>}
}
EQUALS
Defines a criteria where the values must match. Letter case is ignored when values match. ("tomato" = "TomaTO").
Value must be specified as a String, even if the value is numeric.
{
"type":"equals",
"dimension":"city-geonames-id",
"value":"6077243"
}
ISDEFINED
Defines a criteria where a given dimension must have a value. Most probably used in conjunction with equals and bound criteria.
{
"type":"isDefined",
"dimension":"age"
}
IN
Defines a criteria where a list of values can match. At least one element from the list must match in order for the criteria to be true. (Plural; note the "s" in "values.")
Values must be specified as Strings, even if the values are numeric.
{
"type":"in",
"dimension":"dma",
"values":["631", "734", "724"]
}
BOUND
Bound represents ranges of numbers. A bound must specify at least the lower or upper bound. A bound is inclusive.
Basic validation will be applied in order to ensure:
"lower" must be lower than "upper."
"lower" and "greater" must be positive integers.
At least one of "lower" or "greater" must be specified.
# 18+
{
"type":"bound",
"dimension":"age",
"lower":18
}
# 40-49
{
"type":"bound",
"dimension":"age",
"lower":40,
"upper":49
}
SPATIAL
Spatial represents a group of properties to describe a coordinate. Only the coordinate dimension currently supports this type. The radius is expressed in kilometers.
{
"type": "spatial",
"dimension": "coordinates",
"bound": {
"type": "radius",
"coords": [45.5376917, -73.9279362],
"radius": 10
}
}
Note: "coords" = [<latitude>, <longitude>]
All-In-One Example
This format allows targeting to be applied using any and/or/not logic that is needed.
Below is an example that uses all notions described above:
Click to expand an example that uses all notions described above:
{
"type": "or",
"fields": [
{
"type": "and",
"fields": [
{
"type": "and",
"fields": [
{
"type": "or",
"fields": [
{
"type": "equals",
"dimension": "agent-device",
"value": "android-generic"
}
]
}
]
},
{
"type": "and",
"fields": [
{
"type": "or",
"fields": [
{
"type": "equals",
"dimension": "country",
"value": "US"
}
]
}
]
},
{
"type": "and",
"fields": [
{
"type": "or",
"fields": [
{
"type": "bound",
"dimension": "age",
"lower": 18
}
]
}
]
}
]
},
{
"type": "and",
"fields": [
{
"type": "and",
"fields": [
{
"type": "or",
"fields": [
{
"type": "equals",
"dimension": "dmp-segments",
"value": "71"
}
]
}
]
}
]
}
]
}
Targeting Dimensions
In order for the Tap UI to render the targeting rules properly, the following structure should be respected in the Booking API (not applicable to the Avails API):
{
"_comment": "Ruleset Level: Multiple Rulesets can be created, each evaluated as OR",
"type": "or",
"fields": [
{
"_comment": "Within a Ruleset, each rule is evaluated as AND. Same dimension can be repeated but usually different dimensions are used at this level",
"type": "and",
"fields": [
{
"_comment": "Within a Rule, each value set to EXCLUDE is evaluated as AND."
"type": "and",
"fields": [
{
"_comment": "Within a Rule, each INCLUDE value is evaluated as OR. At this level we should always have the same logical dimension",
"type": "or",
"fields": [
{"type": "equals", "dimension": "postalcode", "value": "90210"},
{"type": "spatial", "dimension": "coordinates", "latitude": 40.5478735, "longitude": -74.3378837, "radius": 2}
}
]
}
]
}
]
}
]
}
Content Targeting
Scheme: https://platformservices.streamtheworld.com/content-targeting/schemes/c.xml
Dimension | PossibleValue(s) | Supported Type(s) | Validator / Notes | Flight | Ad Quality | Exclusivity | Forecasting | Deal |
---|---|---|---|---|---|---|---|---|
station | <id> | equals, in | https://tritonsecurity.tritondigital.com/v2/docs#operation/search-stations (requires JWT Bearer token) | Yes | Yes | Yes | Yes | Yes |
episode-id-rss | <string> | equals, in | No validation This value is the result of the RSS ID, hashed with SHA256. | Yes | No | No | No | Yes |
publish-date-epoch-days | <number> | bound | Basic BOUND validation. Evaluates against pubDate | Yes | No | No | Yes | Yes |
publish-date-age-days | <number> | bound | Basic BOUND validation. Evaluates against pubDate | Yes | No | No | Yes | Yes |
content-tags | <string> | equals, in | No validation All "tags" will be evaluated against this dimension. List of tags found in Scheme:
Match should allow AND statements. | Yes | No | No | Yes | Yes |
contextual-tags | <string> | equals, in |
| Yes | No | No | Yes | No |
station-genre-shoutcast | <string> | equals, in | Open API: https://tritonsecurity.tritondigital.com/v2/docs#operation/get-genres (requires JWT Bearer token) | Yes | No | No | Yes | No |
iab-v2-category | <string> | equals, in | Open API: | No | No | No | No | Yes |
content-language | <string> | equals, in | Open API: | No | No | No | No | Yes |
station-market | <string> | equals, in | Open API: https://tritonsecurity.tritondigital.com/v2/docs#operation/get-markets (requires JWT Bearer token) | Yes | Yes | No | Yes | Yes |
station-group | <string> | equals, in | Open API: https://tritonsecurity.tritondigital.com/v2/docs#operation/get-groups (requires JWT Bearer token) | Yes | Yes | No | Yes | Yes |
position-in-break | <string> | equals, in | first, last Value "last" is only valid for podcast delivery method. | Yes | No | No | Yes | Yes |
delivery-method | <string> | in | Possible values: "streaming", "progressive", "download" | No | No | No | No | Yes |
feed-type | <string> | in | Possible values: "instream", "ondemand", "podcast" | No | No | No | No | Yes |
position | <string> | in | Possible values: "preroll", "midroll", "postroll" | No | No | No | No | Yes |
reseller-contract | <string> | equals, in | Possible values: | Yes | No | No | Yes | No |
Listener Targeting
Scheme: https://platformservices.streamtheworld.com/content-targeting/schemes/p.xml
Player/Device
Dimension | Possible Value(s) | Supported Type(s) | Validator | Flight | Ad quality | Exclusivity | Forecasting | Deal |
---|---|---|---|---|---|---|---|---|
agent | <string> | equals, in | Yes | No | No | Yes | Yes | |
agent-family | <string> | equals, in | Yes | No | No | Yes | Yes | |
agent-device | <string> | equals, in | Yes |
| No | Yes | Yes | |
agent-device-family | <string> | equals, in | Yes | No | No | Yes | Yes | |
agent-os | <string> | equals, in | Yes | No | No | Yes | Yes | |
agent-platform | <string> | equals, in | Yes | No | No | Yes | Yes | |
addressable | <string> | in | Possible values: | No | No | No | No | Yes |
omid-capable | <number> 1 = Supported 0 = Not supported | in | Cannot be used if the flight delivery_method is "Live" or "Podcast". | Yes | No | No | No | Yes |
Demography
Dimension | Possible Value(s) | Supported Type(s) | Validator | Flight | Ad Quality | Exclusivity | Forecasting | Deal |
---|---|---|---|---|---|---|---|---|
age | 0-125 | equals, in, bound | <code> | Yes | No | No | Yes | Yes |
gender | m, f, o | equals, in | <code> | Yes | No | No | Yes | Yes |
Geography
Dimension | Possible Value(s) | Supported Type(s) | Validator / Notes | Flight | Ad Quality | Exclusivity | Forecasting | Deal |
---|---|---|---|---|---|---|---|---|
in-market | <boolean> | equals | true, false | Yes | No | No | Yes | Yes |
ip | <string> | equals, in | A valid IPV4 IP | Yes | No | No | No | Yes |
country | <string> | equals, in | https://refdata.tritondigital.com/docs#operation/geov2-get-countries | Yes | No | No | Yes | Yes |
region-iso | <string> | equals, in | https://refdata.tritondigital.com/docs#operation/geov2-get-country-regions | Yes | No | No | Yes | Yes |
city-geonames-id | <string> | equals, in | https://refdata.tritondigital.com/docs#operation/geov2-get-region-children | Yes | No | No | Yes | Yes |
dma | <string> | equals, in | https://refdata.tritondigital.com/docs#operation/geov2-get-country-regions | Yes |
| No | Yes | Yes |
all-msa | <string> | equals, in | https://refdata.tritondigital.com/docs#operation/geov2-get-country-regions | Yes | No | No | Yes | Yes |
subregion-iso | <string> | equals, in | https://refdata.tritondigital.com/docs#operation/geov2-get-region-children | Yes |
| No | Yes | Yes |
longitude, latitude, radius | - | longitude: -180 to 180 latitude: -90 to 90 radius: 1 to 20,000 KM Refer to the spatial type for details. | Yes |
| No | Yes | Yes | |
postalcode | <string> | equals, in | No validation. | Yes | No | No | Yes | Yes |
Other
Dimension | Possible Value(s) | Supported Type(s) | Validator | Flight | Ad Quality | Exclusivity | Forecasting | Deal |
---|---|---|---|---|---|---|---|---|
dmp-segments | <id> | equals, in | Segment ID must be an id found in one of the DMP providers enabled for the Organization's Publisher. Match should allow AND statements. | Yes | No | No | Yes | Yes |
ttag | <string> | equals, in | No validation Match should allow AND statements. | Yes |
| No | Yes | Yes |
dist | <string> | equals, in | String size must be between 1 and 256 characters (no empty values accepted). | Yes |
| No | Yes | Yes |
<custom-parameter> | <string> | equals, in | Targeting Scheme: Attribute Group = "custom-parameter" https://platformservices.streamtheworld.com/content-targeting/schemes/p.xml The Custom Parameters are arbitrary dimensions defined in the Targeting Scheme upon request. In order to Target these dimensions, the attribute "group"="custom-parameter" needs to be provided alongside the dimension. E.g.:
| Yes | No | No | Yes for terminalid | Yes |
Time Targeting (aka dayparts)
Dimension | Possible Value(s) | Supported Type(s) | Validator | Flight | Ad Quality | Exclusivity | Forecasting | Deal |
---|---|---|---|---|---|---|---|---|
day-of-week | <number> 1 = Monday | equals, in, bound | 1 to 7 | Yes | No | No | Yes | No |
hour | <number> | equals, in, bound | 0 to 23 | Yes | No | No | Yes | No |
Brand Safety
Dimension | Possible Value(s) | Validator | Flight | Ad Quality | Exclusivity | Forecasting | Deal |
---|---|---|---|---|---|---|---|
bs-adult | Related = Value 1 Likely Related = Value 2 Likely Unrelated = Value 3 Unrelated = Value 4 | Basic BOUND validation. | Yes | No | No | Yes | Yes |
bs-arms | Basic BOUND validation. | Yes | No | No | Yes | Yes | |
bs-crime | Basic BOUND validation. | Yes | No | No | Yes | Yes | |
bs-dealth-injury | Basic BOUND validation. | Yes | No | No | Yes | Yes | |
bs-drugs | Basic BOUND validation. | Yes | No | No | Yes | Yes | |
bs-hate-speech | Basic BOUND validation. | Yes | No | No | Yes | Yes | |
bs-military-conflict | Basic BOUND validation. | Yes | No | No | Yes | Yes | |
bs-obscenity | Basic BOUND validation. | Yes | No | No | Yes | Yes | |
bs-online-piracy | Basic BOUND validation. | Yes | No | No | Yes | Yes | |
bs-spam-hurtful-sites | Basic BOUND validation. | Yes | No | No | Yes | Yes | |
bs-terrorism | Basic BOUND validation. | Yes | No | No | Yes | Yes | |
bs-tobacco | Basic BOUND validation | Yes | No | No | Yes | Yes |
When using lower and upper values, best practice is to always use 4 for upper. For example:
"fields":[
{
"dimension":"bs-arms",
"lower":2,
"upper":4,
"type":"bound"
},
"fields":[
{
"dimension":"bs-drugs",
"lower":4,
"upper":4,
"type":"bound"
},
Feedback
Send any comments or corrections to docs@tritondigital.com. (This is a NO REPLY email address used only for documentation feedback. For customer support, go here.)