Documentation Index
Fetch the complete documentation index at: https://agenticadvertisingorg-changeset-release-main.mintlify.app/llms.txt
Use this file to discover all available pages before exploring further.
sync_plans
Experimental. Campaign governance (
sync_plans, check_governance, report_plan_outcome, get_plan_audit_logs) is part of AdCP 3.0 as an experimental surface — it may change between 3.x releases with at least 6 weeks’ notice. Sellers implementing it MUST declare governance.campaign in experimental_features. See experimental status for the full contract.Request
Response
How it works
Plans originate in external systems — an agency’s planning tool, a brand’s budget system, an insertion order.sync_plans pushes them to the governance agent so it knows what to validate against.
Syncing a plan that already exists (same plan_id) updates it. The governance agent increments the version and re-evaluates any active campaigns against the updated rules. This handles mid-flight amendments like budget increases or channel additions. Content-standards versions follow a separate pinned-at-buy rule — see content standards versioning.
Multiple campaigns (identified by governance_context in check_governance and report_plan_outcome) can reference the same plan. The governance agent tracks budget across all campaigns tied to a plan.
The plan specifies campaign context — budget, channels, flight dates, and authorized markets. The governance agent resolves applicable policies from the brand’s compliance configuration, but plans can also reference registry policies directly via policy_ids and include campaign-specific rules via custom_policies. This supports both centralized policy management (brand-level) and campaign-specific overrides when the buying team needs additional requirements for a particular campaign.
countries and regions serve two purposes:
- Geo enforcement — The governance agent rejects governed actions targeting outside the plan’s markets. A plan with
regions: ["US-MA"]blocks actions that don’t explicitly target Massachusetts. - Policy resolution — The agent finds all policies whose jurisdictions overlap with the plan’s markets. A plan with
countries: ["US"]is subject to all US federal and state-level policies. A plan with onlyregions: ["US-MA"]is subject to Massachusetts-specific and federal policies.
product-filters, offerings, and create_media_buy — ensuring consistent geo vocabulary across the protocol. A pharma campaign running nationally uses countries: ["US"]; a cannabis campaign limited to legal states uses regions: ["US-CO", "US-CA", "US-MA"].
Plan-hash preimage
Each plan item a buyer supplies here is the preimage the governance agent hashes to produce theplan_hash audit-layer claim carried in every signed governance_context. Canonicalization rules, the closed bookkeeping exclusion list, retention obligations, and the full set of reference test vectors are specified in Plan binding and audit. Governance-agent implementers SHOULD run their hashing code against the eleven vectors under static/compliance/source/test-vectors/plan-hash/ before shipping.
Fields
Request
| Field | Type | Required | Description |
|---|---|---|---|
plans | array | Yes | One or more campaign plans to sync. |
plans[].plan_id | string | Yes | Unique identifier for this plan. |
plans[].brand | BrandRef | Yes | Brand being governed. The governance agent resolves the brand’s compliance configuration to determine applicable policies. |
plans[].objectives | string | Yes | Natural language campaign objectives. Used for strategic alignment validation. |
plans[].budget | object | Yes | Budget parameters. |
plans[].budget.total | number | Yes | Total authorized budget. |
plans[].budget.currency | string | Yes | ISO 4217 currency code. |
plans[].budget.reallocation_threshold | number | Yes | Amount the agent may reallocate without escalation. 0 requires human approval for every reallocation; a value at or above budget.total is effectively unlimited. See specification. |
plans[].budget.per_seller_max_pct | number | No | Maximum percentage of budget that can go to a single seller. |
plans[].budget.allocations | object | No | Optional per-purchase-type budget partitions. Keys are purchase types (media_buy, rights_license, signal_activation, creative_services), values are objects with amount. When present, the governance agent validates spend against both the per-type allocation and the overall total. When absent, all spend counts against the single total regardless of purchase type. Allocations are guardrails, not hard partitions — the sum of allocations MAY differ from the total. |
plans[].channels | object | No | Channel constraints. If omitted, all channels are allowed. |
plans[].flight | object | Yes | Authorized flight dates. Governed actions with dates outside this window are rejected. |
plans[].countries | array | No | ISO 3166-1 alpha-2 country codes for authorized markets. The governance agent rejects governed actions targeting outside these countries and resolves applicable policies by matching against policy jurisdictions. |
plans[].regions | array | No | ISO 3166-2 subdivision codes for authorized sub-national markets (e.g., US-MA). When present, restricts buys to these regions rather than the full country. |
plans[].policy_categories | array | No | Regulatory categories that apply to this campaign (e.g., children_directed, fair_housing). Determines which policy regimes the governance agent enforces. When omitted, governance agents MAY infer from the brand’s industries and campaign objectives. |
plans[].audience | object | No | Audience targeting constraints. Defines who the campaign should reach (include) and must not reach (exclude). See audience constraints. |
plans[].restricted_attributes | array | No | Personal data categories that must not be used for targeting (e.g., health_data, racial_ethnic_origin). GDPR Article 9 special categories. The governance agent flags any audience targeting referencing these attributes. |
plans[].restricted_attributes_custom | array | No | Additional restricted attributes not covered by the enum. Freeform strings for jurisdiction-specific restrictions (e.g., financial_status). |
plans[].min_audience_size | integer | No | Minimum audience segment size for k-anonymity. Applies to the estimated intersection audience when multiple criteria are used. |
plans[].policy_ids | array | No | Registry policy IDs to enforce for this plan. Intersected with the plan’s countries/regions to activate only geographically relevant policies. |
plans[].custom_policies | array | No | Campaign-specific policies using the PolicyEntry shape (policy_id, enforcement, policy text required). Additive only — cannot relax or override registry-sourced policies. See policy resolution. |
plans[].approved_sellers | array/null | No | List of approved seller agent URLs. null means any seller. |
plans[].delegations | array | No | Agents authorized to execute against this plan. See specification. |
plans[].delegations[].agent_url | string | Yes | URL of the delegated agent. |
plans[].delegations[].authority | enum | Yes | full, execute_only, or propose_only. |
plans[].delegations[].budget_limit | object | No | Maximum budget this agent can commit. |
plans[].delegations[].markets | array | No | ISO country/region codes this agent is authorized for. |
plans[].delegations[].expires_at | string | No | ISO 8601 delegation expiration. |
plans[].portfolio | object | No | Portfolio-level governance constraints. See specification. |
plans[].portfolio.member_plan_ids | array | Yes | Plan IDs governed by this portfolio plan. |
plans[].portfolio.total_budget_cap | object | No | Maximum aggregate budget across member plans. |
plans[].portfolio.shared_policy_ids | array | No | Registry policy IDs enforced across all member plans. |
plans[].portfolio.shared_exclusions | array | No | Bespoke exclusion policies applied to all member plans, using the PolicyEntry shape (policy_id, enforcement, policy text required). |
plans[].ext | object | No | Extension data. |
Response
| Field | Type | Description |
|---|---|---|
plans | array | Status for each synced plan. |
plans[].plan_id | string | Plan identifier. |
plans[].status | enum | active (sync succeeded) or error (sync failed). This is the sync result status, not the plan lifecycle status. |
plans[].version | number | Plan version (increments on each sync). |
plans[].categories | array | Validation categories active for this plan. Depends on the governance agent’s declared capabilities. |
plans[].categories[].category_id | string | Validation category identifier. |
plans[].categories[].status | enum | active or inactive. |
plans[].resolved_policies | array | Policies the governance agent will enforce for this plan. Includes explicitly referenced and auto-applied policies. |
plans[].resolved_policies[].policy_id | string | Registry policy ID. |
plans[].resolved_policies[].source | enum | explicit (referenced in config or plan) or auto_applied (matched by jurisdiction/policy category). |
plans[].resolved_policies[].enforcement | enum | must, should, or may. |
plans[].resolved_policies[].reason | string | Why this policy was included. |
Audience constraints
Plans can declare audience targeting constraints using theaudience field. Each constraint is an audience selector — either a reference to a specific signal or a natural language description.
Signal reference — points to a specific signal in a data provider’s catalog:
check_governance. Signal references enable structural matching; descriptions require semantic comparison.
Restricted attributes
Therestricted_attributes field declares personal data categories that must not be used for targeting. Values are GDPR Article 9 special categories: racial_ethnic_origin, political_opinions, religious_beliefs, trade_union_membership, health_data, sex_life_sexual_orientation, genetic_data, biometric_data.
The governance agent matches these against signal definitions that declare their own restricted_attributes. Signals with matching attributes are blocked from targeting. For signals without declared attributes, the governance agent falls back to semantic inference from the signal name and description.
Policy categories
Thepolicy_categories field declares which regulatory regimes apply. Categories are defined in the policy registry and group related regulations — for example, children_directed covers COPPA, UK AADC, and GDPR Article 8.
Policy categories are distinct from brand.industries. Industries describe what a company does; policy categories describe what regulatory regimes apply to a specific campaign. A pharmaceutical company (industries: ["pharmaceuticals"]) running a general awareness campaign might not need pharmaceutical_advertising as a policy category if the campaign doesn’t promote specific drugs.
Error codes
| Code | Recovery | Description |
|---|---|---|
INVALID_PLAN | correctable | Plan is missing required fields or has invalid values. |
REFERENCE_NOT_FOUND | correctable | Brand domain could not be resolved via the Brand Protocol. The governance agent cannot determine applicable compliance policies without a valid brand reference. error.field MUST identify the brand field that failed to resolve. |
BUDGET_BELOW_COMMITTED | correctable | Cannot reduce budget below the amount already committed (on plan update). |
Related tasks
check_governance— Validate actions against this planreport_plan_outcome— Report outcomes back to update plan stateget_plan_audit_logs— View plan state and audit trail