Delegate: Drama & Sport Genre Targeting
Context: Demand source (DSP) with separate creative campaigns for drama and sport content. Different CPMs for each genre. Independent daily budgets so sport doesn’t exhaust the drama budget.
Expected result: Drama inventory bids at $4.50 CPM; sport bids at $5.00 CPM; untagged inventory bids at fallback $1.50 CPM.
How genre flows through the system
Publisher configures content_genre = "drama" on their publisher settings
↓
Auction engine reads genre from publisher config
↓
Bid request includes app.content.genre = "drama"
↓
Delegate rule matches: conditions.content.genre = "drama"
↓
Drama campaign bid appliedGenre is set by the supply source, not inferred. If a supply source hasn’t set a genre, content.genre is absent from the bid request and genre conditions won’t match. Use the fallback rule to capture untagged inventory.
Strategy JSON
{
"version": "1.0",
"dsp_id": "your-dsp-uuid",
"campaigns": [
{
"id": "drama-q1",
"name": "Drama Content",
"active": true,
"priority": 1,
"daily_budget": 200.00
},
{
"id": "sport-q1",
"name": "Sport Content",
"active": true,
"priority": 2,
"daily_budget": 150.00
},
{
"id": "fallback",
"name": "Fallback — Any Content",
"active": true,
"priority": 99
}
],
"rules": [
{
"name": "Drama — CTV",
"campaign_id": "drama-q1",
"conditions": {
"content.genre": ["drama", "thriller", "documentary"],
"device.devicetype": "3"
},
"bid": {
"base_cpm": 4.50,
"max_cpm": 9.00,
"min_cpm": 2.00
},
"priority": 1
},
{
"name": "Sport — CTV",
"campaign_id": "sport-q1",
"conditions": {
"content.genre": ["sport", "sports"],
"device.devicetype": "3"
},
"bid": {
"base_cpm": 5.00,
"max_cpm": 10.00,
"min_cpm": 2.50
},
"priority": 2
},
{
"name": "Fallback — Any CTV",
"campaign_id": "fallback",
"conditions": {
"device.devicetype": "3"
},
"bid": {
"base_cpm": 1.50,
"max_cpm": 3.00,
"min_cpm": 0.80
},
"priority": 99
}
],
"default_bid": 0
}default_bid: 0 — the demand source only bids on CTV. Non-CTV inventory is skipped entirely.
Budget independence
Guide tracks each campaign’s spend separately. When the drama campaign hits $200 for the day, it pauses — sport continues bidding. This prevents one genre from consuming the other’s budget.
If both genre campaigns exhaust their budgets, the fallback campaign has no daily_budget set — it runs without a cap.
Validate in sandbox
# Drama CTV
POST /api/sandbox/simulate-auction
{
"dsp_id": "{DSP_ID}",
"auction": {
"device": { "devicetype": "3" },
"content": { "genre": "drama" },
"bidfloor": 2.00
}
}
# Expected: matched_rule: "Drama — CTV", bid_cpm: 4.50
# Sport CTV
POST /api/sandbox/simulate-auction
{
"dsp_id": "{DSP_ID}",
"auction": {
"device": { "devicetype": "3" },
"content": { "genre": "sport" },
"bidfloor": 2.00
}
}
# Expected: matched_rule: "Sport — CTV", bid_cpm: 5.00
# Untagged CTV (no genre)
POST /api/sandbox/simulate-auction
{
"dsp_id": "{DSP_ID}",
"auction": {
"device": { "devicetype": "3" },
"bidfloor": 0.50
}
}
# Expected: matched_rule: "Fallback — Any CTV", bid_cpm: 1.50