Skip to main content
Create a media buy from selected packages or execute a proposal. Handles validation, approval if needed, and campaign creation. Supports two modes:
  • Manual Mode: Provide packages array with explicit line item configurations
  • Proposal Mode: Provide proposal_id and total_budget to execute a proposal from get_products
Response Time: Instant to days (returns completed, working < 120s, or submitted for hours/days) Request Schema: /schemas/v2/media-buy/create-media-buy-request.json Response Schema: /schemas/v2/media-buy/create-media-buy-response.json

Quick Start

Create a simple media buy with two packages:

Request Parameters

* Either packages OR (proposal_id + total_budget) must be provided.

TotalBudget Object

Package Object

Response

Success Response

Error Response

Note: Responses use discriminated unions - you get either success fields OR errors, never both. Always check for errors before accessing success fields.

Common Scenarios

Campaign with Targeting

Add geographic restrictions and frequency capping:

Campaign with Conversion Optimization

Set a per_ad_spend target for conversion-optimized delivery. The product must declare support in conversion_tracking.supported_targets, and you must have an event source configured via sync_event_sources:

Catalog-driven packages

A catalog-driven package allocates a single budget envelope to an entire catalog of items. Instead of creating separate packages per item, the platform optimizes delivery across all catalog items based on performance. This is the AdCP equivalent of catalog-based campaign types such as Google Performance Max or Meta Dynamic Product Ads. Include the catalogs field in a package to make it catalog-driven. Each catalog should have a distinct type (e.g., one product catalog, one store catalog). The referenced catalogs must already be synced via sync_catalogs. Job campaign with synced job catalog:
test=false
Retail media with product catalog and store catchment targeting:
test=false
The platform distributes budget across catalog items based on performance. For per-item reporting, use get_media_buy_delivery which returns by_catalog_item breakdowns. Creative variants for catalog-driven packages represent individual catalog items rendered as ads.

Campaign with Inline Creatives

Upload creatives at the same time as creating the campaign:

Campaign with Reporting Webhook

Receive automated reporting notifications:

Executing a Proposal

Execute a proposal from get_products without manually constructing packages:
When executing a proposal:
  • The publisher converts allocation percentages to actual budgets using total_budget
  • Packages are created automatically based on the proposal’s allocations
  • All other fields (brand, start_time, end_time, etc.) work the same as manual mode
See Proposals for the complete workflow.

Error Handling

Common errors and resolutions: Example error response:

Key Concepts

Format Specification

Format IDs are required for each package because:
  • Publishers create placeholder creatives in ad servers
  • Both parties know exactly what creative assets are needed
  • Validation ensures products support requested formats
  • Progress tracking shows which assets are missing
See Format Workflow below for complete details.

Brand reference

The brand field identifies the advertiser for policy compliance and business purposes.
Full brand identity data (colors, fonts, product catalog) is resolved from brand.json at execution time. See brand.json.

Pricing & Currency

Each package specifies its pricing_option_id, which determines:
  • Currency (USD, EUR, etc.)
  • Pricing model (CPM, CPCV, CPP, etc.)
  • Rate and whether it’s fixed or auction-based
Packages can use different currencies when sellers support it. See Pricing Models.

Targeting Overlays

Use sparingly - most targeting should be in your brief and handled through product selection. Use overlays only for:
  • Geographic restrictions (RCT testing, regulatory compliance)
  • Frequency capping
  • AXE segment inclusion/exclusion
See Targeting for details.

Format Workflow

Why Format Specification Matters

When creating a media buy, format specification enables:
  1. Placeholder Creation - Publisher creates placeholders in ad server with correct specs
  2. Validation - System validates products support requested formats
  3. Clear Expectations - Both parties know exactly what’s needed
  4. Progress Tracking - Track which assets are missing vs. required
  5. Technical Setup - Ad server configured before creatives arrive

Complete Workflow

Format Validation

Publishers MUST validate:
  • All formats are supported by the product
  • Format specifications match list_creative_formats output
  • Creative requirements can be fulfilled within timeline
Invalid format example:

Flight date validation

When a package specifies start_time or end_time, sellers SHOULD validate that:
  • Both dates fall within the media buy’s date range
  • start_time is before end_time
Out-of-range or inverted dates SHOULD return an INVALID_REQUEST error:

Asynchronous Operations

This task can complete instantly or take days depending on complexity and approval requirements. The response includes a status field that tells you what happened and what to do next. Note: For the complete status list see Task Lifecycle.

Immediate Success (completed)

The task completed synchronously. No async handling needed.Request:
test=false
Response:

Long-Running (submitted)

The task is queued for manual approval. Configure a webhook to receive updates.Request with webhook:
test=false
Initial response:
Webhook POST when approved:

Error (failed)

Response:
For complete async handling patterns, see Async Operations.

Usage Notes

  • Total budget is distributed across packages based on individual budget values
  • Both media buys and packages have buyer_ref fields for tracking
  • Creative assets must be uploaded before deadline for campaign activation
  • AXE segments enable advanced audience targeting
  • Pending states (working, submitted) are normal, not errors
  • Orchestrators MUST handle pending states as part of normal workflow
  • Inline creatives: The creatives array creates NEW creatives only. To update existing creatives, use sync_creatives. To assign existing library creatives, use creative_assignments instead.

Policy Compliance

Brand and products are validated during creation. Policy violations return errors:
Publishers should ensure:
  • Brand/products align with selected packages
  • Creatives match declared brand/products
  • Campaign complies with all advertising policies

Next Steps

After creating a media buy:
  1. Upload Creatives: Use sync_creatives before deadline
  2. Monitor Status: Use get_media_buy_delivery
  3. Optimize: Use provide_performance_feedback
  4. Update: Use update_media_buy to modify campaign

Learn More