SCENARIOS / SC-012 / PROGRAMMATIC ADS
SC-012 Ad Tech

Programmatic Ads

A real-time-bidding exchange — publishers, slots, bids, impressions and clicks.

Async Tick FSM
PUBLISHER SLOT BID REQ BID WIN BID ADX AUCTION IMP CLICK
SC-012 / SCHEMATICAd Tech
Clock 120 Hz tick
Update Asynchronous
Geographies NA / EMEA / APAC / LATAM
Formats Banner / Video / Native / …
Tables 7
OVERVIEW

An ad-tech exchange modelled from publisher onboarding through to clicks. Approved publishers open ad slots; each request becomes a bid request that fans out across exchanges, segmented by device type, geo region and country, IAB category and ad format. Format drives bid-floor tier and viewability. Winning bids resolve to impressions, and impressions to clicks, while advertisers run campaigns against daily budgets.

High-volume, deeply-segmented event data of exactly the shape ad-tech analytics works on — auctions, win rates, viewability and click-through — generated with consistent foreign keys from bid request to impression to click. A realistic substrate for funnel, attribution and pacing analysis.

TRAITS
Async
Independent, event-driven timelines
Tick
Discrete fixed-step time
FSM
Entities are finite-state machines
SCHEMA

Linked tables with guaranteed referential integrity.

TABLECOLUMNSDESCRIPTION
publisher ID, geo_region, iab_category, exchange, ad_slots, violations, tier, current_state One row per publisher: region, content category, exchange, slot count and standing.
adslot ID, geo_region, ad_format, exchange, requests, publisher_id, current_state Ad slots opened by a publisher: format, exchange and request volume.
bidrequest ID, geo_region, country, device_type, ad_format, exchange, bid_price, campaign_id, current_state One row per bid request: device, geo, format, clearing price and winning campaign.
impression ID, geo_region, device_type, ad_format, campaign_id, bid_request_id, current_state Impressions served from a won bid request.
click ID, geo_region, device_type, campaign_id, impression_id, current_state Clicks attributed to an impression.
advertiser ID, geo_region, iab_category, campaigns, daily_budget, current_state Advertisers: category, campaign count and daily budget.
campaign ID, geo_region, iab_category, ad_format, device_type, impressions_served, clicks, total_spend, advertiser_id, current_state Campaigns: targeting, delivery counters and spend, owned by an advertiser.
LIVE API

Generated REST endpoints. Also exposed as MCP tools.

POST /scenarios/programmatic-ads/experiments Seed a new exchange
POST /scenarios/programmatic-ads/experiments/{eid}/run Advance N turns, or request an event
GET /scenarios/programmatic-ads/experiments/{eid}/entities/bidrequest Query bid requests and clearing prices
GET /scenarios/programmatic-ads/experiments/{eid}/events Append-only event log
GET /scenarios/programmatic-ads/experiments/{eid}/dataset Download the exported dataset
SEMANTIC LAYER

OSI-compatible definition, emitted with the dataset.

# programmatic-ads.osi.yaml — emitted automatically
semantic_model:
  name: "programmatic-ads"
  source: "duckdb://programmatic-ads.db"
  entities:
    - name: publisher
      primary_key: id
  dimensions:
    - name: state
      type: categorical
    - name: t
      type: time
  measures:
    - name: row_count
      agg: count
    - name: active
      agg: sum
      filter: "state = 'ACTIVE'"