Migrating signals
AdCP 3.0 rc.1 makes three changes to the Signals Protocol: delivery target flattening, structured pricing options, and usage reporting simplification.Deliver-to flattening
The nesteddeliver_to object in get_signals requests is replaced by two top-level fields.
| beta.3 | rc.1 | Notes |
|---|---|---|
deliver_to.destinations | destinations | Moved to top level |
deliver_to.countries | countries | Moved to top level |
test=false
test=false
Pricing options
The legacypricing object (with a single cpm field) is replaced by a pricing_options array. Each option is a discriminated union on model.
| beta.3 | rc.1 | Notes |
|---|---|---|
pricing: { cpm: 2.50 } | pricing_options[] | Array of pricing model objects |
| Implicit pricing selection | pricing_option_id on activate_signal | Explicit buyer commitment |
| No idempotency | idempotency_key on report_usage | Prevents duplicate billing |
Three pricing models
CPM — Fixed cost per thousand impressions:Activation with pricing
When activating a signal, pass the selectedpricing_option_id:
test=false
Usage reporting
report_usage adds idempotency_key and removes the kind and operator_id fields.
| beta.3 | rc.1 | Notes |
|---|---|---|
kind field | Removed | Usage records are self-describing via signal_agent_segment_id or standards_id |
operator_id field | Removed | Account reference provides operator identity |
| No idempotency | idempotency_key | Client-generated UUID prevents duplicate billing on retries |
pricing_option_id in the usage record must match the one passed at activation, allowing the vendor to verify the correct rate was applied.
Migration steps
Flatten deliver_to
Move
deliver_to.destinations and deliver_to.countries to top-level fields in get_signals requests.Parse pricing_options array
Update signal response parsing to read
pricing_options (array) instead of pricing (object). Switch on model field to determine the pricing type.Select pricing at activation
When calling
activate_signal, pass the selected pricing_option_id from the signal’s pricing_options array.Add idempotency_key to report_usage
Generate a unique key (UUID) for each
report_usage call. Retries with the same key are idempotent.Remove kind and operator_id
Remove
kind and operator_id from usage records. Usage type is determined by the presence of signal_agent_segment_id (signals) or standards_id (governance).Track pricing_option_id through lifecycle
Store the
pricing_option_id at activation time and pass it in report_usage records so the vendor can verify billing.Signals Protocol
Full reference for signal discovery, activation, usage reporting, and pricing models.
Related: Pricing | Optimization goals | AdCP 3.0 overview