> ## Documentation Index
> Fetch the complete documentation index at: https://docs.adcontextprotocol.org/llms.txt
> Use this file to discover all available pages before exploring further.

# Pricing Models

> AdCP pricing models — CPM, CPCV, CPP, CPC, CPA, time-based, and DOOH pricing. Publisher-declared, buyer-selected model with rate card support.

AdCP supports multiple pricing models to accommodate different advertising channels and business objectives. Publishers declare which pricing models they support, and buyers select from available options.

## Publisher-Declared, Buyer-Selected Model

### How It Works

1. **Publishers declare pricing options** in their products via `pricing_options` array (each with unique `pricing_option_id`)
2. **Buyers discover available options** through `get_products`
3. **Buyers select a specific option** when creating a media buy via `pricing_option_id`
4. **Delivery is measured** according to the declared `delivery_measurement` provider

### Key Benefits

* **Flexibility**: Publishers can offer multiple pricing models for the same inventory
* **Currency Support**: Publishers specify supported currencies; buyers must match
* **Market Standards**: Each channel (TV, video, display, performance) can use its natural pricing unit
* **Clear Expectations**: Both parties agree on pricing before campaign launch

## Measurement & Source of Truth

### Measurement Provider as Source of Truth

**The product declares the measurement provider, and the buyer accepts that provider as the source of truth for the buy.**

Publishers specify their measurement provider in the product:

```json theme={null}
{
  "product_id": "premium_video",
  "delivery_measurement": {
    "provider": "Google Ad Manager with IAS viewability verification",
    "notes": "MRC-accredited viewability measurement. 50% in-view for 1 second (display) or 2 seconds (video)."
  }
}
```

**Common Measurement Providers:**

* **Ad Servers**: Google Ad Manager, Freewheel, SpringServe
* **Attention Metrics**: Adelaide, Lumen, TVision
* **Third-Party Verification**: IAS, DoubleVerify, Scope3
* **TV/Audio Measurement**: Nielsen, Comscore, iSpot.tv, Triton Digital
* **DOOH**: Geopath, Vistar, Place Exchange

By accepting the product, buyers agree to use the declared measurement provider as the authoritative source for delivery metrics.

### Measurement Terms and Performance Standards

Beyond declaring a provider, sellers can publish structured terms on products — and buyers can negotiate them at buy creation. These are two separate concerns:

* **`measurement_terms`** — Who counts the billing metric and what happens when thresholds are breached (makegoods)
* **`performance_standards`** — What rate thresholds apply (viewability, IVT, completion, brand safety, attention)

```json theme={null}
{
  "product_id": "premium_guaranteed_video",
  "delivery_measurement": {
    "provider": "Google Ad Manager with DoubleVerify verification",
    "notes": "MRC-accredited viewability. DV IVT filtering enabled."
  },
  "measurement_terms": {
    "billing_measurement": {
      "vendor": { "domain": "admanager.google.com" },
      "max_variance_percent": 10
    },
    "makegood_policy": {
      "available_remedies": ["additional_delivery", "credit", "invoice_adjustment"]
    }
  },
  "performance_standards": [
    {
      "metric": "viewability",
      "threshold": 0.70,
      "standard": "mrc",
      "vendor": { "domain": "doubleverify.com" }
    },
    {
      "metric": "ivt",
      "threshold": 0.05,
      "vendor": { "domain": "doubleverify.com" }
    },
    {
      "metric": "completion_rate",
      "threshold": 0.80,
      "vendor": { "domain": "doubleverify.com" }
    }
  ]
}
```

**Measurement terms fields:**

* **`billing_measurement`** — Which vendor's count of the billing metric (determined by `pricing_model`) governs invoicing. `max_variance_percent` defines the threshold at which the non-billing party's count divergence triggers resolution.
* **`makegood_policy`** — Closed menu of remedies available when any performance standard or billing variance is breached. Three remedy types: `additional_delivery` (extend/add impressions, like-for-like), `credit` (toward future buys), `invoice_adjustment` (reduce current invoice). Seller proposes from this menu; buyer accepts or disputes.

**Performance standards fields:**

Each entry in the `performance_standards` array specifies:

* **`metric`** — What is measured: `viewability`, `ivt`, `completion_rate`, `brand_safety`, `attention_score`
* **`threshold`** — Rate as a decimal (0-1). Whether this is a floor or ceiling depends on the metric: viewability, completion\_rate, brand\_safety, attention\_score are floors (must exceed); ivt is a ceiling (must not exceed).
* **`standard`** — Required for viewability (`"mrc"` or `"groupm"`). Omit for other metrics.
* **`vendor`** — Who measures it, identified by domain. When agreed on a confirmed package, creatives MUST include tracker assets from specified vendors.

**Negotiation flow:**

1. Seller publishes `measurement_terms` and `performance_standards` on the product (defaults)
2. Buyer proposes overrides on the package request at `create_media_buy`
3. Seller accepts (echoes on confirmed package), rejects (`TERMS_REJECTED`), or adjusts (returns modified terms)
4. If a threshold is breached, seller proposes a remedy from the agreed `makegood_policy`; buyer accepts or disputes

When the buyer omits these fields, the product's defaults apply.

### Cancellation Policy

Guaranteed products can declare a `cancellation_policy` with the minimum notice period required before cancellation takes effect:

```json theme={null}
{
  "product_id": "premium_guaranteed_video",
  "delivery_type": "guaranteed",
  "cancellation_policy": {
    "notice_period": { "interval": 30, "unit": "days" },
    "cancellation_fee": { "type": "percent_remaining", "rate": 0.5 }
  }
}
```

**Cancellation fee types:**

* **`percent_remaining`** — Percentage of remaining committed spend (requires `rate`, e.g., `0.5` for 50%)
* **`full_commitment`** — Buyer owes the full committed budget regardless of delivery
* **`fixed_fee`** — Flat monetary amount (requires `amount` in the buy's currency)
* **`none`** — No cancellation fee (cancellation with notice is free)

Unlike `measurement_terms`, cancellation policy is not a negotiation surface — the seller declares it and the buyer accepts it by creating a media buy against the product. A guaranteed buy canceled without sufficient notice incurs the declared cancellation fee.

### Best Practices

**For Publishers:**

* Clearly identify your measurement provider (ad server and any third-party verification)
* Explain your measurement methodology in plain language
* For DOOH, specify your audience measurement source (e.g., Geopath, venue sensors)

**For Buyers:**

* Review the measurement provider before committing budget
* Ensure the provider meets your campaign requirements
* Negotiate audit rights in contracts if needed

## Supported Pricing Models

### CPM (Cost Per Mille)

**Cost per 1,000 impressions** - Traditional display advertising pricing.

**Use Cases**: Display, native, banner advertising

**Example**:

```json theme={null}
{
  "$schema": "https://adcontextprotocol.org/schemas/v3/pricing-options/cpm-option.json",
  "pricing_option_id": "cpm_usd_guaranteed",
  "pricing_model": "cpm",
  "fixed_price": 12.50,
  "currency": "USD",
  "min_spend_per_package": 5000
}
```

**Billing**: Charged per 1,000 ad impressions served

***

### vCPM (Viewable Cost Per Mille)

**Cost per 1,000 viewable impressions** - Payment only for impressions meeting MRC viewability standard.

**Use Cases**: Display, native, video advertising with viewability guarantee

**Viewability Standard**: MRC (Media Rating Council) standard requires:

* **Display ads**: 50% of pixels in-view for at least 1 continuous second
* **Video ads**: 50% of pixels in-view for at least 2 continuous seconds

**Example**:

```json theme={null}
{
  "$schema": "https://adcontextprotocol.org/schemas/v3/pricing-options/vcpm-option.json",
  "pricing_option_id": "vcpm_usd_guaranteed",
  "pricing_model": "vcpm",
  "fixed_price": 18.50,
  "currency": "USD",
  "min_spend_per_package": 5000
}
```

**Billing**: Charged per 1,000 viewable impressions (impressions meeting MRC viewability threshold). Viewability is measured by the declared measurement provider.

**Measurement**: When available, publishers declare their viewability measurement provider in the optional `delivery_measurement` field. Common providers include IAS (Integral Ad Science), DoubleVerify, MOAT, and Google Active View.

***

### CPCV (Cost Per Completed View)

**Cost per 100% video/audio completion** - Payment only for fully completed views.

**Use Cases**: Video campaigns, audio ads, pre-roll video

**Example**:

```json theme={null}
{
  "$schema": "https://adcontextprotocol.org/schemas/v3/pricing-options/cpcv-option.json",
  "pricing_option_id": "cpcv_usd_guaranteed",
  "pricing_model": "cpcv",
  "fixed_price": 0.15,
  "currency": "USD"
}
```

**Billing**: Charged only when viewer completes 100% of the video/audio ad. Completion is measured by the declared measurement provider.

***

### CPV (Cost Per View)

**Cost per view at threshold** - Payment when viewer reaches publisher-defined threshold.

**Use Cases**: Video campaigns with shorter completion requirements

**Example**:

```json theme={null}
{
  "$schema": "https://adcontextprotocol.org/schemas/v3/pricing-options/cpv-option.json",
  "pricing_option_id": "cpv_usd_50pct",
  "pricing_model": "cpv",
  "fixed_price": 0.08,
  "currency": "USD",
  "parameters": {
    "view_threshold": 0.5
  }
}
```

**Billing**: Charged when viewer reaches threshold (e.g., 50% completion, 30 seconds)

**Parameters**:

* `view_threshold`: Decimal from 0.0 to 1.0 (e.g., 0.5 = 50% completion)

***

### CPP (Cost Per Point)

**Cost per Gross Rating Point** - Traditional TV/radio buying metric.

**Use Cases**: Connected TV, linear TV, radio, audio streaming

**Example**:

```json theme={null}
{
  "$schema": "https://adcontextprotocol.org/schemas/v3/pricing-options/cpp-option.json",
  "pricing_option_id": "cpp_usd_a18-49",
  "pricing_model": "cpp",
  "fixed_price": 250.00,
  "currency": "USD",
  "parameters": {
    "demographic": "A18-49",
    "min_points": 50
  },
  "min_spend_per_package": 12500
}
```

**Billing**: Charged per rating point delivered to target demographic

**Parameters**:

* `demographic`: Target demographic (e.g., "A18-49", "W25-54", "M35+")
* `min_points`: Minimum GRP commitment required

**Metrics Reported**:

* `grps`: Total Gross Rating Points delivered
* `reach`: Unique individuals reached
* `frequency`: Average frequency per individual

**Measurement Requirements**:

CPP pricing requires **certified demographic measurement**. Publishers should declare their measurement provider:

```json theme={null}
{
  "pricing_model": "cpp",
  "fixed_price": 250.00,
  "delivery_measurement": {
    "provider": "Nielsen DAR",
    "notes": "Panel-based demographic measurement for A18-49. GRP reports available weekly."
  }
}
```

**Common Measurement Providers for CPP**:

* **Nielsen DAR/TV**: Industry-standard TV measurement
* **Comscore**: Campaign Ratings for CTV
* **iSpot.tv**: Advanced TV analytics
* **Triton Digital**: Audio/streaming measurement

Buyers should verify the measurement provider meets their campaign requirements before accepting CPP deals.

***

### CPC (Cost Per Click)

**Cost per click** - Performance-based pricing for engagement.

**Use Cases**: Direct response campaigns, search ads, social advertising

**Example**:

```json theme={null}
{
  "pricing_model": "cpc",
  "currency": "USD",
  "floor_price": 0.50,
  "max_bid": true,
  "price_guidance": {
    "p50": 1.20,
    "p75": 2.00
  }
}
```

**Billing**: Charged only when user clicks the ad

***

### CPA (Cost Per Acquisition)

**Cost per conversion event** - Advertiser pays when a defined conversion occurs.

**Use Cases**: Retail media (pay per order), lead generation, app install campaigns, commerce media

**Example**:

```json theme={null}
{
  "$schema": "https://adcontextprotocol.org/schemas/v3/pricing-options/cpa-option.json",
  "pricing_option_id": "cpa_usd_purchase",
  "pricing_model": "cpa",
  "event_type": "purchase",
  "fixed_price": 5.00,
  "currency": "USD"
}
```

**Billing**: Charged a fixed price when the specified `event_type` fires. The pricing option declares what event triggers billing — this is independent of `optimization_goals`, which controls delivery optimization.

**Parameters**:

* `event_type` (required): The conversion event that triggers billing. Uses the standard event type enum (e.g., `purchase`, `lead`, `app_install`, `add_to_cart`, `subscribe` for paid subscriptions, `follow` for free durable opt-ins).
* `event_source_id` (optional): When present, only events from this specific source count toward billing. Must match an event source configured via `sync_event_sources`. When omitted, any event of the specified `event_type` counts.

**Example** (different rates by event source):

```json theme={null}
{
  "pricing_options": [
    {
      "pricing_option_id": "cpa_online_purchase",
      "pricing_model": "cpa",
      "event_type": "purchase",
      "event_source_id": "website_pixel",
      "fixed_price": 5.00,
      "currency": "USD"
    },
    {
      "pricing_option_id": "cpa_instore_purchase",
      "pricing_model": "cpa",
      "event_type": "purchase",
      "event_source_id": "instore_attribution",
      "fixed_price": 3.00,
      "currency": "USD"
    }
  ]
}
```

**Pricing vs. optimization**: The CPA pricing option's `event_type` (what triggers billing) is independent of the package's `optimization_goals` (what the platform optimizes delivery toward). For example, a package can use CPA pricing on `lead` events while setting an event goal with `event_sources` containing purchase events and `target: { kind: "per_ad_spend", value: 4.0 }` — billing fires on leads, but delivery is optimized for downstream purchase return.

**Refunds and adjustments**: Refund handling and conversion adjustment policies are commercial terms between buyer and seller. The protocol does not govern clawbacks or billing credits for refunded conversions.

**Note**: CPA replaces the need for separate "CPO" (Cost Per Order) or "CPL" (Cost Per Lead) pricing models. A seller can offer multiple CPA options with different event types, event sources, and prices on the same product.

***

### Flat Rate

**Fixed cost** - Single payment regardless of delivery volume.

**Use Cases**: Sponsorships, takeovers, exclusive placements, branded content, DOOH fixed slots

**Example** (sponsorship):

```json theme={null}
{
  "$schema": "https://adcontextprotocol.org/schemas/v3/pricing-options/flat-rate-option.json",
  "pricing_option_id": "flat_rate_usd_sponsorship",
  "pricing_model": "flat_rate",
  "fixed_price": 50000.00,
  "currency": "USD"
}
```

**Example** (DOOH slot with parameters):

```json theme={null}
{
  "$schema": "https://adcontextprotocol.org/schemas/v3/pricing-options/flat-rate-option.json",
  "pricing_option_id": "flat_rate_usd_dooh_morning",
  "pricing_model": "flat_rate",
  "fixed_price": 5000.00,
  "currency": "USD",
  "parameters": {
    "type": "dooh",
    "daypart": "morning_commute",
    "duration_hours": 4,
    "sov_percentage": 25,
    "loop_duration_seconds": 15,
    "estimated_impressions": 120000
  }
}
```

**Billing**: Fixed cost for the entire campaign period regardless of delivery volume.

**DOOH parameters** (`parameters.type: "dooh"`):

* `sov_percentage`: Guaranteed share of voice as a percentage (0-100)
* `loop_duration_seconds`: Duration of ad loop rotation in seconds
* `min_plays_per_hour`: Minimum guaranteed plays per hour
* `venue_package`: Named collection of screens
* `duration_hours`: Duration of the slot in hours (e.g., 24 for a full-day takeover)
* `daypart`: Named daypart (e.g., `morning_commute`, `evening_rush`)
* `estimated_impressions`: Audience impression estimate (informational, not a delivery guarantee)

Sponsorship flat\_rate options omit `parameters` — the fixed price covers the placement without DOOH-specific constraints.

***

### Time (Cost Per Time Unit)

**Cost per time unit** - Rate scales with campaign duration, enabling self-serve sponsorships.

**Use Cases**: Homepage takeovers, section sponsorships, premium placements where price depends on booking duration

**Example**:

```json theme={null}
{
  "$schema": "https://adcontextprotocol.org/schemas/v3/pricing-options/time-option.json",
  "pricing_option_id": "time_usd_daily",
  "pricing_model": "time",
  "fixed_price": 50000.00,
  "currency": "USD",
  "parameters": {
    "time_unit": "day",
    "min_duration": 1,
    "max_duration": 30
  }
}
```

**Billing**: Cost = `fixed_price` x number of `time_unit`s in the campaign flight. For example, a 3-day campaign at \$50,000/day = \$150,000 total.

**Parameters**:

* `time_unit` (required): `"hour"`, `"day"`, `"week"`, or `"month"`
* `min_duration` (optional): Minimum booking duration in time units
* `max_duration` (optional): Maximum booking duration in time units

**Time Unit Calculation**:

| Time Unit | Calculation                               |
| --------- | ----------------------------------------- |
| `hour`    | rate x hours in flight                    |
| `day`     | rate x calendar days in flight            |
| `week`    | rate x weeks (seller-defined rounding)    |
| `month`   | rate x months (seller-defined pro-rating) |

**Comparison with Flat Rate**:

| Aspect              | Flat Rate               | Time                    |
| ------------------- | ----------------------- | ----------------------- |
| Semantics           | Fixed total cost        | Rate x duration         |
| `fixed_price` means | Total campaign cost     | Cost per time unit      |
| Buyer flexibility   | Must negotiate duration | Self-serve any duration |
| Use case            | Fixed sponsorships      | Scalable sponsorships   |

***

## Digital Out-of-Home (DOOH) Pricing

DOOH advertising uses existing pricing models—typically **CPM** or **flat\_rate**—with optional parameters to describe the inventory allocation.

### Basic Concepts

* **CPM for DOOH**: Priced per thousand impressions, where impressions are calculated based on venue traffic (e.g., Geopath data)
* **Flat rate for DOOH**: Fixed cost for specific duration or allocation (hourly, daily, or exclusive takeover)

### Simple Example: Billboard Takeover

```json theme={null}
{
  "product_id": "billboard_takeover",
  "name": "Premium Billboard - 24 Hour Takeover",
  "pricing_options": [{
    "pricing_model": "flat_rate",
    "fixed_price": 50000.00,
    "currency": "USD"
  }],
  "delivery_measurement": {
    "provider": "Geopath",
    "notes": "Venue traffic data updated monthly. Estimated 2.5M impressions over 24 hours."
  }
}
```

### DOOH parameters (optional)

For flat\_rate DOOH inventory, publishers may include a `parameters` object with `"type": "dooh"`. See the [flat\_rate pricing model](#flat-rate) section above for a complete example and full field list.

**Note**: DOOH measurement and buying practices vary by market. Publishers should clearly explain their measurement methodology and inventory allocation in the product description and `delivery_measurement` field.

***

## Price Breakdown

When buyer and seller have negotiated discounts and commissions, the `price_breakdown` object discloses how `fixed_price` was derived from the rate card. This is optional — sellers who don't need breakdowns omit it entirely, with zero overhead to existing implementations.

`price_breakdown` is a planning-layer construct. It exists on pricing options and confirmed packages within AdCP — it does not propagate into impression-level OpenRTB bid requests or responses.

### Structure

```json theme={null}
{
  "pricing_option_id": "cpm_eur_premium",
  "pricing_model": "cpm",
  "fixed_price": 11.90,
  "currency": "EUR",
  "price_breakdown": {
    "list_price": 14.00,
    "adjustments": [
      { "kind": "discount", "name": "volume", "rate": 0.15, "description": "12x frequency discount" },
      { "kind": "commission", "name": "agency", "rate": 0.15, "description": "Agency commission" },
      { "kind": "settlement", "name": "cash_discount", "rate": 0.02, "description": "2% discount for payment within 10 days" }
    ]
  }
}
```

* `list_price` — the rate card or base price before any adjustments
* `adjustments` — ordered list of adjustments, each categorized by `kind`
* `fixed_price` (on the parent pricing option) — must equal the result of applying all `fee` and `discount` adjustments sequentially to `list_price`

Implementations should ignore unrecognized fields in `price_breakdown` and its adjustments to support forward compatibility.

### Adjustment Kinds

Adjustments fall into four kinds based on their economic effect:

| Kind         | Effect on buyer price     | Effect on publisher revenue | When applied                                                  |
| ------------ | ------------------------- | --------------------------- | ------------------------------------------------------------- |
| `fee`        | Increases it              | Increases it                | Before quoting — walks `list_price` up toward `fixed_price`   |
| `discount`   | Reduces it                | Reduces it                  | Before quoting — walks `list_price` down toward `fixed_price` |
| `commission` | None — budget includes it | Reduces it (revenue split)  | Revenue allocation between intermediary and publisher         |
| `settlement` | None — post-invoice       | Reduces actual payment      | At invoicing or payment time                                  |

**Fees** increase what the buyer pays. Ad serving fees, data/targeting surcharges, and brand safety verification costs are additive to the base price. Without fee adjustments, these would be opaque within `list_price`.

**Discounts** reduce what the buyer pays. Volume discounts, negotiated rates, and early booking discounts all lower both the buyer's cost and the publisher's revenue.

**Commissions** are revenue splits. The buyer's price and budget don't change — commission determines how the payment is divided between the intermediary (e.g., agency) and the publisher. Budgets are always managed inclusive of commissions. Multiple commission adjustments compound sequentially, like discounts — e.g., a 15% agency commission followed by a 5% trading desk fee means the publisher receives `budget × 0.85 × 0.95`.

**Settlement adjustments** are applied at invoicing or payment time (e.g., a cash discount for early payment). They don't affect the committed price or budget. Retroactive rebates and performance incentives are out of scope for `price_breakdown` and would be handled through reconciliation workflows.

### Beneficiary

Each adjustment may include an optional `beneficiary` field identifying who receives the adjustment's value. This is most useful for commission adjustments in multi-intermediary chains:

```json theme={null}
{ "kind": "commission", "name": "agency", "rate": 0.15, "beneficiary": "mediaagency.example.com" },
{ "kind": "commission", "name": "trading_desk", "rate": 0.05, "beneficiary": "tradingdesk.example.com" }
```

The value can be a sellers.json domain, an AdCP account ID, or a human-readable party name.

### Invariant

The invariant is: `list_price` with all `fee` and `discount` adjustments applied sequentially equals `fixed_price`. Commission and settlement adjustments don't participate — they're disclosed for transparency. If no fee or discount adjustments are present, `fixed_price` must equal `list_price`.

This invariant applies only when `fixed_price` is present on the parent object. For auction-based packages (where only `bid_price` exists), `price_breakdown` is informational — see [On Confirmed Packages](#on-confirmed-packages).

Fee and discount adjustments compound in array order using these formulas:

```
For rate-based fees:        running = running × (1 + rate)
For amount-based fees:      running = running + amount
For rate-based discounts:   running = running × (1 − rate)
For amount-based discounts: running = running − amount
```

All monetary values are rounded to the precision of the currency (e.g., 2 decimal places for EUR/USD) at each step. The invariant holds after rounding.

Example with mixed adjustments:

```
list_price: 12.00
  fee, amount: 2.00          → 12.00 + 2.00 = 14.00
  discount, rate: 0.15       → 14.00 × 0.85 = 11.90
fixed_price: 11.90 ✓
```

For the structure example above: 14.00 × (1 − 0.15) = 11.90 ✓ (no fee adjustments in that example)

### Rate vs. Amount

Each adjustment must include exactly one of `rate` or `amount`:

* `rate` — decimal proportion, strictly between 0 and 1 exclusive (0 \< rate \< 1), e.g., 0.15 for 15%
* `amount` — positive number (> 0) in the pricing option's currency

```json theme={null}
{ "kind": "discount", "name": "volume", "rate": 0.15 }
{ "kind": "discount", "name": "negotiated", "amount": 2.00, "description": "Flat rate reduction" }
```

### Budgets and Commission

Budgets are always denominated at the `fixed_price` level, inclusive of commissions. If a buyer commits €10,000 at an €11.90 CPM, that €10,000 is the buyer's cost. The agency takes their commission from that amount; the publisher receives the remainder.

This means a buyer agent comparing rates across sellers can use `fixed_price` directly — it's the actual cost per unit, regardless of the underlying commission structure.

### On Confirmed Packages

The `price_breakdown` field also appears on the package response (confirmed line item). It is seller-populated — buyer agents should treat it as read-only.

**Fixed-price packages** echo the pricing option's breakdown:

```json theme={null}
{
  "package_id": "pkg_12345",
  "product_id": "premium_display",
  "pricing_option_id": "cpm_eur_premium",
  "fixed_price": 11.90,
  "budget": 10000,
  "price_breakdown": {
    "list_price": 14.00,
    "adjustments": [
      { "kind": "discount", "name": "volume", "rate": 0.15, "description": "12x frequency discount" },
      { "kind": "commission", "name": "agency", "rate": 0.15, "description": "Agency commission" },
      { "kind": "settlement", "name": "cash_discount", "rate": 0.02, "description": "2% for payment within 10 days" }
    ]
  }
}
```

**Auction-based packages** use `price_breakdown` to disclose commission and settlement terms against the clearing price. For auction packages, `list_price` is set to the clearing price since there is no rate card derivation to disclose. The discount invariant does not apply — the breakdown is informational only:

```json theme={null}
{
  "package_id": "pkg_67890",
  "product_id": "premium_display",
  "pricing_option_id": "cpm_eur_auction",
  "bid_price": 12.50,
  "budget": 10000,
  "price_breakdown": {
    "list_price": 12.50,
    "adjustments": [
      { "kind": "commission", "name": "agency", "rate": 0.15, "description": "Agency commission" },
      { "kind": "settlement", "name": "cash_discount", "rate": 0.02, "description": "2% for payment within 10 days" }
    ]
  }
}
```

***

## Eligible Adjustments

Publishers can declare which adjustment kinds apply to a pricing option using `eligible_adjustments`. This tells buyer agents upfront whether discounts, commissions, or settlement terms are available — before any negotiation begins.

```json theme={null}
{
  "pricing_option_id": "cpm_eur_standard",
  "pricing_model": "cpm",
  "fixed_price": 14.00,
  "currency": "EUR",
  "eligible_adjustments": ["fee", "discount", "commission", "settlement"]
}
```

When `eligible_adjustments` is present, the buyer knows which kinds of adjustments to expect or request. When absent, no adjustments are pre-declared — the buyer should check `price_breakdown` if present for any adjustments that were already applied.

This field pairs with `price_breakdown`: `eligible_adjustments` signals what is *possible*, while `price_breakdown` shows what was *applied*.

***

## Multi-Currency Support

Publishers can offer the same product in multiple currencies:

```json theme={null}
{
  "product_id": "premium_video",
  "pricing_options": [
    {
      "pricing_option_id": "cpm_usd_guaranteed",
      "pricing_model": "cpm",
      "fixed_price": 45.00,
      "currency": "USD"
    },
    {
      "pricing_option_id": "cpm_eur_guaranteed",
      "pricing_model": "cpm",
      "fixed_price": 40.00,
      "currency": "EUR"
    },
    {
      "pricing_option_id": "cpm_gbp_guaranteed",
      "pricing_model": "cpm",
      "fixed_price": 35.00,
      "currency": "GBP"
    }
  ]
}
```

**Buyer Responsibility**: Buyers must select a currency that the publisher supports.

## Fixed vs. Auction Pricing

### Fixed Pricing (`fixed_price` present)

* Publisher sets a fixed price
* Price is guaranteed and predictable
* Common for guaranteed inventory
* Include `fixed_price` field

### Auction Pricing (`fixed_price` absent)

* Final price determined through auction
* Publisher provides `floor_price` (hard minimum) and optional `price_guidance` (percentile hints)
* Bid-based auction models (`cpm`, `vcpm`, `cpc`, `cpcv`, `cpv`) may also include optional `max_bid: true` to explicitly signal `bid_price` is treated as buyer maximum willingness to pay (ceiling mode)
* Common for non-guaranteed inventory
* Buyer submits `bid_price` in media buy request

**Auction Example**:

```json theme={null}
{
  "pricing_option_id": "cpcv_usd_auction",
  "pricing_model": "cpcv",
  "currency": "USD",
  "floor_price": 0.08,
  "max_bid": true,
  "price_guidance": {
    "p25": 0.10,
    "p50": 0.12,
    "p75": 0.15,
    "p90": 0.18
  }
}
```

## Buyer Selection Process

Each package specifies its own pricing option, which determines currency and pricing model:

```json theme={null}
{
  "start_time": "2025-01-01T00:00:00Z",
  "end_time": "2025-01-31T23:59:59Z",
  "brand": {
    "domain": "acmecorp.com"
  },
  "brief": "Q1 Brand Campaign",
  "packages": [{
    "product_id": "premium_ctv",
    "format_ids": [{"agent_url": "https://creative.adcontextprotocol.org", "id": "video_30s"}],
    "pricing_option_id": "cpcv_usd_auction",
    "budget": 50000,
    "pacing": "even",
    "bid_price": 0.16
  }]
}
```

**How it works:**

1. Package selects `pricing_option_id` from product (e.g., "cpcv\_usd\_auction")
2. Pricing option determines currency, pricing model, and fixed vs auction
3. Package `budget` is in the pricing option's currency
4. Auction-based pricing requires `bid_price`; it is the exact honored price unless `max_bid: true`, which switches it to a maximum-willingness-to-pay ceiling
5. Sellers validate currency compatibility across packages

## Reporting Metrics by Pricing Model

Different pricing models report different primary metrics:

| Pricing Model | Primary Metric        | Secondary Metrics                                      |
| ------------- | --------------------- | ------------------------------------------------------ |
| CPM           | impressions           | clicks, ctr, spend                                     |
| vCPM          | viewable\_impressions | impressions, viewability\_rate, spend                  |
| CPCV          | completed\_views      | impressions, completion\_rate, spend                   |
| CPV           | views                 | impressions, quartile\_data, spend                     |
| CPP           | grps                  | reach, frequency, spend                                |
| CPC           | clicks                | impressions, ctr, spend                                |
| CPA           | conversions           | conversion\_value, cost\_per\_acquisition, roas, spend |
| Flat Rate     | N/A                   | impressions, reach, frequency                          |
| Time          | N/A                   | impressions, reach, frequency                          |

## Example: Multi-Model CTV Product

A publisher offering Connected TV inventory with multiple pricing options:

```json theme={null}
{
  "product_id": "ctv_premium_sports",
  "name": "Premium Sports CTV",
  "description": "High-engagement sports content on CTV devices",
  "format_ids": [
    {
      "agent_url": "https://creative.adcontextprotocol.org",
      "id": "video_15s"
    },
    {
      "agent_url": "https://creative.adcontextprotocol.org",
      "id": "video_30s"
    }
  ],
  "delivery_type": "guaranteed",
  "pricing_options": [
    {
      "pricing_option_id": "cpm_usd_guaranteed",
      "pricing_model": "cpm",
      "fixed_price": 55.00,
      "currency": "USD",
      "min_spend_per_package": 15000
    },
    {
      "pricing_option_id": "cpcv_usd_guaranteed",
      "pricing_model": "cpcv",
      "fixed_price": 0.22,
      "currency": "USD",
      "min_spend_per_package": 15000
    },
    {
      "pricing_option_id": "cpp_usd_m18-49",
      "pricing_model": "cpp",
      "fixed_price": 300.00,
      "currency": "USD",
      "parameters": {
        "demographic": "M18-49",
        "min_points": 50
      },
      "min_spend_per_package": 15000
    }
  ]
}
```

A buyer could choose CPP pricing if they're planning TV buys, CPCV if optimizing for engagement, or CPM for reach-based campaigns.

## Negotiated and Premium Pricing

Premium sellers — particularly in OOH, CTV sponsorships, and direct deals — often finalize pricing through negotiation rather than publishing fixed rates. AdCP supports this workflow through the existing brief-to-proposal path without requiring a separate quote or price-on-request mechanism.

### Sellers are not required to publish wholesale prices

Product discovery (`get_products`) does not require sellers to disclose wholesale or clearing prices. Sellers may publish products with limited or no public pricing detail — for example, a CTV sponsorship product with audience and format information but no `pricing_options`. The product is discoverable, but the buyer must submit a brief to receive a proposal with actual pricing.

### Selective brief response

Sellers control which briefs they respond to and what pricing they offer. When a seller receives a brief for inventory they choose not to transact on, the protocol-native options are:

* **Omit the product from the proposal entirely** — the buyer sees no proposal for that inventory, signaling unavailability for this request
* **Return `PROPOSAL_NOT_COMMITTED`** — an explicit signal that the seller reviewed the brief but is not offering a committable proposal at this time

Neither requires the seller to disclose why they declined. This is the protocol-native equivalent of "price not available without negotiation."

### The existing flow covers negotiated deals

The standard path for negotiated-price inventory is:

1. **Seller publishes products** with descriptive metadata (audience, formats, properties) but without wholesale pricing
2. **Buyer submits a brief** via `get_products` describing their campaign goals and budget parameters
3. **Seller returns a proposal** with negotiated pricing tailored to the specific brief — or declines to propose
4. **Buyer refines or accepts** the proposal, then passes the `proposal_id` into `create_media_buy`

This mirrors how premium direct deals work today: the seller sees the brief, decides whether to engage, and offers terms specific to the opportunity.

## Best Practices

### For Publishers

1. **Offer relevant pricing models** - Match pricing to your inventory type and buyer expectations
2. **Set appropriate minimums** - Use `min_spend_per_package` to ensure campaign viability
3. **Provide price guidance** - For auction pricing, give realistic floor and percentile data
4. **Consider multi-currency** - Support currencies of your target markets
5. **Document parameters** - Clearly explain thresholds, demographics, and action types

### For Buyers

1. **Select appropriate model** - Choose pricing that aligns with campaign objectives
2. **Match currency** - Ensure you select a currency the publisher supports
3. **Set realistic budgets** - Account for minimum spend requirements
4. **Align goals with pricing** - Set delivery goals that match your pricing model
5. **Monitor relevant metrics** - Focus on the metrics that matter for your pricing model

## Related Documentation

* [Media Products](/docs/media-buy/product-discovery/media-products) - Product model reference
* [Creating Media Buys](/docs/media-buy/task-reference/create_media_buy) - How to select pricing when buying
* [Delivery Reporting](/docs/media-buy/task-reference/get_media_buy_delivery) - Understanding metrics by pricing model
* [Glossary](/docs/reference/glossary) - Pricing and metric definitions
