Developer GuideCookbookDelegate: Drama & Sport Genre Targeting

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 applied

Genre 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