Skip to main content

Creative Manifests

Creative manifests are structured specifications that define all the assets and metadata needed to render a creative in a specific format. They pair the requirements defined by Creative Formats with actual asset content. For an overview of how formats, manifests, and creative agents work together, see the Creative Protocol Overview.

Manifest Structure

Basic Structure

{
  format_id: {                 // Format this manifest is for
    agent_url: string;         // Creative agent URL
    id: string;                // Format identifier
  };
  promoted_offering?: string;  // Product being advertised (maps to create_media_buy)
  assets: {
    [asset_id: string]: {      // Keyed by asset_id from format's assets_required
      // Asset type is determined by format specification, not declared here
      // Type-specific fields depend on asset_type defined in format's assets_required

      // Image: url, width, height, format, alt_text
      // Video: url, width, height, duration_ms, format, bitrate_kbps
      // Audio: url, duration_ms, format, bitrate_kbps
      // Text: content, language
      // URL: url, description
      // HTML: content or url, version
      // CSS: content, media
      // JavaScript: content, module_type
      // VAST: url or content, vast_version, vpaid_enabled, duration_ms, tracking_events
      // DAAST: url or content, daast_version, duration_ms, tracking_events, companion_ads
      // Promoted Offerings: brand_manifest, product_selectors, offerings, asset_selectors
      // Webhook: url, method, timeout_ms, response_type, security, supported_macros, required_macros
    }
  };
}

Asset IDs

Each asset in a manifest is keyed by its asset_id, which must match an asset_id defined in the format’s assets_required array. The asset ID serves as the technical identifier for referencing the asset requirement in the format specification. How Asset IDs Work: When a format defines required assets:
{
  "assets_required": [
    {
      "asset_id": "banner_image",
      "asset_type": "image",
      "required": true
    },
    {
      "asset_id": "clickthrough_url",
      "asset_type": "url",
      "required": true
    }
  ]
}
Your manifest must use those exact asset IDs as keys:
{
  "assets": {
    "banner_image": {        // ← Matches asset_id from format
      "asset_type": "image",
      "url": "https://cdn.example.com/banner.jpg",
      "width": 300,
      "height": 250
    },
    "clickthrough_url": {    // ← Matches asset_id from format
      "asset_type": "url",
      "url": "https://example.com/landing"
    }
  }
}
Common Asset IDs (vary by format):
  • banner_image, hero_image: Primary visual assets
  • logo: Brand logo
  • headline, description: Text content
  • cta_text: Call-to-action button text
  • video_file: Video content
  • vast_tag: VAST XML for video delivery
  • clickthrough_url: Landing page URL
Always check the specific format’s assets_required to see which asset IDs are required.

Complete Example

Here’s a complete creative manifest showing the current structure without redundant fields:
{
  "format_id": {
    "agent_url": "https://creative.adcontextprotocol.org",
    "id": "display_300x250"
  },
  "promoted_offering": "Premium Dog Food",
  "assets": {
    "banner_image": {
      "url": "https://cdn.example.com/banner.jpg",
      "width": 300,
      "height": 250,
      "format": "jpg"
    },
    "headline": {
      "content": "Nutrition Dogs Love",
      "language": "en"
    },
    "description": {
      "content": "Made with real chicken and wholesome grains",
      "language": "en"
    },
    "clickthrough_url": {
      "url": "https://example.com/products/premium-dog-food",
      "description": "Product landing page"
    }
  }
}
Note: Asset types (image, text, url) are not declared in the manifest. They are determined by looking up each asset_id in the format specification’s assets_required array. The format tells us that banner_image should be type image, headline should be type text, etc.

Types of Creative Manifests

Creative manifests can be static, dynamic, or hybrid - reflecting the three creative agent modalities above.

Static Manifests

Static manifests contain all assets ready for immediate rendering. These are produced by creative agents in Static Asset Delivery or Prompt to Static Rendering modes.
{
  "format_id": {
    "agent_url": "https://creative.adcontextprotocol.org",
    "id": "native_responsive"
  },
  "assets": {
    "hero_image": {              // asset_id from format spec
      "asset_type": "image",
      "url": "https://cdn.example.com/hero.jpg",
      "width": 1200,
      "height": 627,
      "format": "jpg",
      "alt": "Product image"
    },
    "logo": {                    // asset_id from format spec
      "asset_type": "image",
      "url": "https://cdn.example.com/logo.png",
      "width": 100,
      "height": 100,
      "format": "png"
    },
    "headline": {                // asset_id from format spec
      "asset_type": "text",
      "content": "Premium Quality You Can Trust"
    },
    "description": {             // asset_id from format spec
      "asset_type": "text",
      "content": "Discover why veterinarians recommend our formula"
    },
    "cta_text": {                // asset_id from format spec
      "asset_type": "text",
      "content": "Learn More"
    }
  }
}
Use Cases:
  • Traditional display advertising
  • Pre-rendered video ads
  • Static native ads
  • Fixed creative campaigns

Dynamic Manifests

Dynamic manifests include endpoints or code for real-time generation. These are produced by creative agents in Prompt to Dynamic Rendering mode (DCO/Generative).
{
  "format_id": {
    "agent_url": "https://creative.adcontextprotocol.org",
    "id": "display_dynamic_300x250"
  },
  "assets": {
    "dynamic_content": {
      "asset_type": "webhook",
      "url": "https://creative-agent.example.com/render/campaign-123",
      "method": "POST",
      "timeout_ms": 500,
      "supported_macros": ["WEATHER", "TIME", "DEVICE_TYPE", "COUNTRY"],
      "response_type": "html",
      "security": {
        "method": "hmac_sha256",
        "hmac_header": "X-Signature"
      },
      "fallback_required": true
    },
    "fallback_image": {
      "asset_type": "image",
      "url": "https://cdn.example.com/fallback-300x250.jpg",
      "width": 300,
      "height": 250,
      "format": "jpg"
    }
  }
}
Use Cases:
  • Weather-based creative
  • Time-of-day personalization
  • Product availability messaging
  • Real-time inventory updates
Note: For client-side dynamic rendering, use html or javascript asset types with embedded tags instead of webhooks. Dynamic manifests can mix asset types - some assets may be static (images, videos) while others are dynamic (webhooks, tags with macros). For example, a video VAST tag with a static hero video but a personalized end card webhook.

DOOH Manifests with Impression Tracking

Digital Out-of-Home (DOOH) creatives use impression tracking just like other formats, but with venue-specific macros instead of device identifiers.
{
  "format_id": {
    "agent_url": "https://creative.adcontextprotocol.org",
    "id": "dooh_billboard_1920x1080"
  },
  "promoted_offering": "Premium Coffee Blend",
  "assets": {
    "billboard_image": {
      "asset_type": "image",
      "url": "https://cdn.example.com/billboard-1920x1080.jpg",
      "width": 1920,
      "height": 1080,
      "format": "jpg"
    },
    "impression_tracker": {
      "asset_type": "url",
      "url_type": "tracker",
      "url": "https://tracking.example.com/imp?screen={SCREEN_ID}&venue={VENUE_TYPE}&ts={PLAY_TIMESTAMP}&lat={VENUE_LAT}&lon={VENUE_LONG}"
    }
  }
}
DOOH-Specific Macros (see Universal Macros for complete list):
  • {SCREEN_ID} - Unique identifier for the physical screen
  • {VENUE_TYPE} - Venue category (airport, mall, transit, highway, retail)
  • {VENUE_LAT} / {VENUE_LONG} - Physical location coordinates
  • {PLAY_TIMESTAMP} - When creative displayed (Unix timestamp)
  • {DWELL_TIME} - Average viewer dwell time at this location
The mechanics are identical to digital impression tracking - a URL fires when the ad displays. The difference is DOOH uses fixed venue context instead of dynamic device identifiers.

Working with Manifests

Creating Manifests

Manifests are JSON structures that can be created in two ways: 1. Manual Assembly Construct manifests directly by pairing format requirements with your assets:
{
  "format_id": {
    "agent_url": "https://creative.adcontextprotocol.org",
    "id": "native_responsive"
  },
  "promoted_offering": "Premium Salmon Formula",
  "assets": {
    "hero_image": {
      "asset_type": "image",
      "url": "https://cdn.example.com/salmon-hero.jpg",
      "width": 1200,
      "height": 627
    },
    "headline": {
      "asset_type": "text",
      "content": "New Premium Salmon Formula"
    }
  }
}
2. AI-Generated (Optional) Use build_creative to have a creative agent generate manifests from natural language briefs. See Generative Creative for details.

Validating Manifests

Before using a manifest, validate it against format requirements:
  1. Format Compatibility: Ensure format_id matches intended format
  2. Required Assets: All required asset_id values from the format are present as keys in the manifest’s assets object
  3. Asset Key Matching: Each key in the manifest’s assets object MUST match an asset_id from the format’s assets_required array
  4. Asset Specifications: Each asset meets format requirements (dimensions, file size, duration, etc.)
  5. Macro Support: Dynamic manifests properly handle required macros
What happens with invalid asset keys?
  • Missing required asset_id: Creative agents MUST reject the manifest with an error listing which required assets are missing
  • Unknown asset_id: Creative agents MUST reject manifests containing asset keys that don’t match any asset_id in the format. This catches typos and incompatible formats immediately.
  • Wrong asset_type: If an asset doesn’t match the type requirement for that asset_id in the format specification, reject with a clear type mismatch error
Creative agents that implement build_creative handle validation automatically. For manually constructed manifests, validate against the format specification returned by list_creative_formats. Format-Aware Validation: Creative manifest validation MUST be performed in the context of the format specification. The format defines what type each asset_id should be, eliminating any validation ambiguity. Asset type information is NOT included in the manifest itself - it’s determined by looking up the asset_id in the format’s assets_required array.

Validation Flow

When a creative agent receives a manifest for validation:
  1. Extract format_id from the manifest
  2. Fetch format specification from the format registry (local or remote based on agent_url)
  3. For each asset key in manifest.assets:
    • Look up the asset_id in format.assets_required
    • If not found → reject with error “Unknown asset_id ‘banner_imag’ not defined in format”
    • If found → determine the expected asset_type from the format requirement
    • Fetch the asset type schema (e.g., /schemas/v1/core/assets/image-asset.json)
    • Validate the asset payload against that schema
    • Validate the asset meets any additional constraints in the format’s requirements field
  4. Check all required assets are present (where required: true in format spec)
  5. Validate type-specific constraints (dimensions, file size, duration, etc.)
The format specification is the single source of truth for what type each asset_id should be and what constraints apply. Validation is runtime, not schema-time: The JSON schema for creative manifests uses a flexible pattern (^[a-z0-9_]+$) for asset keys because the valid keys depend on which format you’re using. Validation against the specific format’s assets_required happens when you submit the manifest to a creative agent.

Previewing Manifests

Use the preview_creative task to see how a manifest will render:
{
  "format_id": {
    "agent_url": "https://creative.adcontextprotocol.org",
    "id": "native_responsive"
  },
  "creative_manifest": {
    "format_id": {
      "agent_url": "https://creative.adcontextprotocol.org",
      "id": "native_responsive"
    },
    "assets": {
      "hero_image": {
        "url": "https://cdn.example.com/hero.jpg",
        "width": 1200,
        "height": 627
      },
      // ... other assets
    }
  },
  "macro_values": {
    "CLICK_URL": "https://example.com/landing",
    "CACHE_BUSTER": "12345"
  }
}
The creative agent returns preview URLs and renderings.

Submitting Manifests

Manifests are submitted to the creative library using sync_creatives, then referenced by ID in media buys:
{
  "task": "sync_creatives",
  "parameters": {
    "creatives": [
      {
        "creative_id": "native-salmon-v1",
        "name": "Salmon Special Native Ad",
        "format_id": {
          "agent_url": "https://creative.adcontextprotocol.org",
          "id": "native_responsive"
        },
        "manifest": {
          "format_id": {
            "agent_url": "https://creative.adcontextprotocol.org",
            "id": "native_responsive"
          },
          "promoted_offering": "Fresh Pacific Salmon",
          "assets": {
            "headline": {
              "asset_type": "text",
              "content": "Fresh Pacific Salmon - 20% Off Today"
            },
            "main_image": {
              "asset_type": "image",
              "url": "https://cdn.example.com/salmon.jpg",
              "width": 1200,
              "height": 628
            }
          }
        }
      }
    ]
  }
}
Then reference in media buys by creative_id. Each manifest is for a single format.

Macro Substitution in Manifests

Manifests support macro placeholders for dynamic values. AdCP uses universal macros that work consistently across all publishers. See Universal Macros for complete documentation on available macros, macro substitution process, and format-specific macro support.

Best Practices

For Creative Agents

  1. Complete Manifests: Include all required assets for the format
  2. Validate Assets: Ensure assets meet format specifications
  3. Provide Fallbacks: Include fallback assets for dynamic creatives
  4. Document Macros: Clearly specify which macros are used
  5. Version Assets: Use versioned URLs for asset management

For Publishers

  1. Validate on Receipt: Check manifests against format requirements
  2. Cache Assets: Pre-fetch and cache hosted assets
  3. Handle Failures: Implement fallback rendering for dynamic manifests
  4. Support Macros: Implement full Universal Macro support
  5. Provide Templates: Offer rendering templates for custom formats

For Buyers

  1. Validate Manifests: Ensure manifests match format requirements (manually or via build_creative)
  2. Preview First: Always preview manifests before submission
  3. Test Macros: Verify macro substitution works as expected
  4. Optimize Assets: Ensure assets are properly sized and compressed
  5. Organize Libraries: Use creative libraries for asset management

Advanced Topics

Repeatable Asset Groups

For carousel, slideshow, and multi-asset formats, see the Carousel & Multi-Asset Formats guide for complete documentation on repeatable asset groups.

Schema Reference