Skip to main content

Account state

AdCP accounts are stateful containers. Before a buyer can run a campaign on a seller’s platform, they build up state on the account: product catalogs, creative assets, audience lists, conversion tracking. Each piece of state has its own sync task, its own approval workflow, and its own lifecycle. This is different from earlier versions of AdCP where accounts were billing references and most operations were stateless. In AdCP 3.0, the account is the central object that ties everything together.

State domains

An account holds six categories of state, each managed by a dedicated task:
DomainSync taskWhat it managesLifecycle
Identitysync_accountsWho the buyer is, which brand, billing termsSetup once, update rarely
Catalogssync_catalogsProduct feeds, inventory, stores, promotions, offeringsContinuous — feeds update hourly/daily
Creativessync_creativesCreative assets with format-specific manifestsPer-campaign, updated as needed
Audiencessync_audiencesFirst-party CRM audience listsIncremental — add/remove members over time
Event sourcessync_event_sourcesConversion tracking configuration (pixels, S2S, app events)Setup once per source, rarely changes
Governancesync_governanceGovernance agent configuration for this accountSetup once per account, update when governance agents change
Campaignscreate_media_buyActive campaigns with packages and targetingCreated when ready, updated throughout flight
Each sync task follows the same pattern:
  • Upsert semantics — items are matched by ID, created if new, updated if existing
  • Discovery mode — omit the items array to see what’s already on the account
  • Async approval — platforms may review items before activating them
  • Per-item status — individual items can succeed or fail independently

Setup sequence

A typical buying workflow builds account state in dependency order. Each step requires the previous steps to be complete:

1. Establish the account

sync_accounts declares who the buyer is and how they pay. The seller acknowledges the relationship and returns status and billing terms.
{
  "accounts": [{
    "brand": { "domain": "acme-corp.com" },
    "operator": "pinnacle-media.com",
    "billing": "operator"
  }]
}

2. Sync catalogs

sync_catalogs makes product data available on the account. Formats declare what catalog types they need via catalog asset types in their assets array, so the buyer syncs the right feeds before submitting creatives.
{
  "account": { "account_id": "acct_001" },
  "catalogs": [
    {
      "catalog_id": "product-feed",
      "type": "product",
      "url": "https://feeds.acme.com/products.xml",
      "feed_format": "google_merchant_center",
      "update_frequency": "daily"
    },
    {
      "catalog_id": "store-locations",
      "type": "store",
      "url": "https://feeds.acme.com/stores.json",
      "feed_format": "custom",
      "update_frequency": "weekly"
    }
  ]
}
The platform fetches and validates each feed. Items may be approved, rejected, or flagged — similar to Google Merchant Center reviewing product listings.

3. Configure event sources

sync_event_sources sets up conversion tracking so the platform can attribute outcomes to ad exposure.
{
  "account": { "account_id": "acct_001" },
  "event_sources": [{
    "event_source_id": "web-pixel",
    "name": "Website Conversions",
    "type": "pixel",
    "events": ["purchase", "add_to_cart", "lead"]
  }]
}

4. Configure governance

sync_governance registers governance agents on the account. Once configured, sellers with governance support will call check_governance before confirming media buys.
{
  "account": { "account_id": "acct_001" },
  "governance_agents": [{
    "agent_url": "https://governance.acme-corp.com/adcp",
    "domains": ["campaign", "creative", "content_standards"]
  }]
}
Changing governance agents on a live account affects all active campaigns. If a governance agent is removed, sellers will stop calling check_governance for that domain. If a new agent is added, existing campaigns are not retroactively validated — only new transactions go through the updated governance configuration.

5. Sync creatives

sync_creatives submits creative assets that reference the catalogs synced in step 2. For catalog-driven formats, the creative’s catalogs field references synced catalogs by catalog_id instead of embedding items inline.
{
  "account": { "account_id": "acct_001" },
  "creatives": [{
    "creative_id": "product-carousel",
    "format_id": {
      "agent_url": "https://creative.retailer.com/adcp",
      "id": "product_carousel_with_inventory"
    },
    "catalogs": [{
      "catalog_id": "product-feed",
      "type": "product",
      "tags": ["summer"]
    }],
    "assets": {
      "banner_image": {
        "url": "https://cdn.acmecorp.com/carousel-hero.jpg",
        "width": 1200,
        "height": 628
      }
    }
  }]
}

6. Upload audiences

sync_audiences uploads first-party audience lists for targeting. Members are hashed before sending.
{
  "account": { "account_id": "acct_001" },
  "audiences": [{
    "audience_id": "high-value-customers",
    "name": "High Value Customers",
    "add": [
      { "hashed_email": "a1b2c3..." },
      { "hashed_email": "d4e5f6..." }
    ]
  }]
}

7. Create the campaign

With all state in place, create_media_buy activates a campaign that references the synced state:
{
  "account": { "account_id": "acct_001" },
  "name": "Summer Product Launch",
  "packages": [{
    "product_id": "sponsored-products",
    "creative_ids": ["product-carousel"],
    "targeting_overlay": {
      "audiences": { "include": ["high-value-customers"] }
    }
  }]
}

Discovery

Every sync task supports discovery mode: call the task without an items array to see what state already exists on the account. This is how a buying agent learns what a seller already knows about the brand.
// What catalogs does this account have?
{ "account": { "account_id": "acct_001" } }

// Response: catalogs already on the account
{
  "catalogs": [
    { "catalog_id": "product-feed", "action": "unchanged", "item_count": 1250 },
    { "catalog_id": "store-locations", "action": "unchanged", "item_count": 45 }
  ]
}
This matters because sellers may already have brand data from other sources — a retailer might have the brand’s product catalog from their commerce platform, or a publisher might have creatives from a previous campaign. Discovery lets the buyer build on existing state rather than re-uploading everything.

Approval workflows

Sync tasks are often asynchronous. The platform may need to review items before they’re active:
  • Catalogs: Product listings go through content policy checks. Items can be approved, rejected, or flagged with warnings.
  • Creatives: Generative creatives require human approval. Traditional creatives may need policy review.
  • Audiences: Platforms need time to match hashed identifiers against their user base.
  • Event sources: Conversion tracking may require pixel verification.
All sync tasks support push_notification_config for webhook callbacks when processing completes. For long-running operations, the platform returns async status updates (working, input-required, submitted) that the buyer polls or receives via webhook.

State dependencies

Some state depends on other state. The platform enforces these dependencies:
  • Creatives reference catalogs — a creative that uses catalog_id: "product-feed" requires that catalog to be synced first
  • Campaigns reference creatives and audiencescreate_media_buy requires the referenced creative_ids and audience IDs to exist on the account
  • Event sources enable optimization — optimization goals on packages reference event sources for attribution
If a dependency is missing, the platform returns an error explaining what needs to be synced first.

Stateless vs stateful operations

Not everything requires account state. Some tasks are stateless queries:
Stateless (no account needed)Stateful (account required)
get_products — discover inventorycreate_media_buy — buy inventory
list_creative_formats — discover formatssync_creatives — upload creatives
get_signals — discover signalsactivate_signal — activate signals
get_adcp_capabilities — discover featuressync_catalogs — upload catalogs
The pattern: discovery is stateless, execution is stateful. You can browse a seller’s inventory without an account. You need an account to buy.
  • Accounts and agents — Account identity, billing models, and sync_accounts details
  • Async operations — How async approval workflows work
  • Webhooks — Receiving notifications when async operations complete
  • Catalogs — Typed data feeds that provide the items publishers render in ads