{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "/schemas/3.1.0-rc.4/creative/asset-types/index.json",
  "title": "AdCP Asset Type Registry",
  "description": "Registry of asset types used in AdCP creative manifests. Each asset type defines the structure of actual content payloads (what you send), not requirements or constraints (which belong in format specifications).",
  "version": "1.0.0",
  "lastUpdated": "2026-05-30",
  "asset_types": {
    "image": {
      "description": "Static image asset (JPG, PNG, GIF, WebP, SVG)",
      "schema": "/schemas/core/assets/image-asset.json",
      "typical_use": "Hero images, logos, product photos, backgrounds"
    },
    "video": {
      "description": "Hosted video file asset (MP4, WebM, MOV)",
      "schema": "/schemas/core/assets/video-asset.json",
      "typical_use": "Video ads, product demos, brand stories"
    },
    "audio": {
      "description": "Audio file asset (MP3, AAC, M4A, WAV, OGG)",
      "schema": "/schemas/core/assets/audio-asset.json",
      "typical_use": "Audio ads for streaming, podcasts, radio"
    },
    "vast": {
      "description": "VAST XML tag for third-party video ad serving",
      "schema": "/schemas/core/assets/vast-asset.json",
      "typical_use": "Third-party served video ads with VAST 2.0-4.2"
    },
    "daast": {
      "description": "DAAST XML tag for third-party audio ad serving",
      "schema": "/schemas/core/assets/daast-asset.json",
      "typical_use": "Third-party served audio ads with DAAST 1.0-1.1"
    },
    "vast_tracker": {
      "description": "A single URL bound to a VAST `TrackingEvents` event (start, quartile, complete, etc.). Assembled into the VAST `TrackingEvents` block by the sales agent. For `Impression` URLs, use `url` asset with `url_type: \"tracker_pixel\"` instead.",
      "schema": "/schemas/core/assets/vast-tracker-asset.json",
      "typical_use": "Decomposed VAST event trackers on CTV/video formats where the creative agent emits per-event URLs rather than a complete VAST tag"
    },
    "daast_tracker": {
      "description": "Audio-side analogue of vast_tracker: a single URL bound to a DAAST `TrackingEvents` event.",
      "schema": "/schemas/core/assets/daast-tracker-asset.json",
      "typical_use": "Decomposed DAAST event trackers on audio formats"
    },
    "pixel_tracker": {
      "description": "Generic renderer-fired HTTP tracker URL — image pixel or JavaScript include — bound to a measurement event (impression, viewability, click, custom). Applies to any web-rendered canonical (image, html5, image_carousel, responsive_creative, sponsored_placement, native_*, plus non-VAST events on video_hosted/audio_hosted). Discriminated union shape with event/method enums formalized in IAB OpenRTB Native 1.2 (`imptrackers[]` / `jstracker` / `eventtrackers[]` / `link.clicktrackers[]`). Scope is RENDERER-FIRED trackers only — conversion pixels that fire on the advertiser's site post-click belong on `sync_event_sources` / `event_log`. Formats with format-specific tracker structures use `vast_tracker` (VAST `<TrackingEvents>`) or `daast_tracker` (DAAST parity) instead.",
      "schema": "/schemas/core/assets/pixel-tracker-asset.json",
      "typical_use": "Measurement-vendor trackers on web-rendered formats — impression/viewability/click pixels the seller's renderer fires at serve time. The bare `url` asset with `url_type: \"tracker_pixel\"` remains valid for VAST/DAAST impression URLs and for v1-compat manifests; new canonical-formats authoring SHOULD use `pixel_tracker` because it carries event + method semantics that bare URLs lose."
    },
    "text": {
      "description": "Plain text content asset",
      "schema": "/schemas/core/assets/text-asset.json",
      "typical_use": "Headlines, descriptions, CTAs, body copy, disclaimers"
    },
    "markdown": {
      "description": "Markdown-formatted text content (CommonMark/GFM)",
      "schema": "/schemas/core/assets/markdown-asset.json",
      "typical_use": "Product specifications, format documentation, rich descriptions, structured content"
    },
    "url": {
      "description": "URL asset for clickthrough, tracking, landing pages",
      "schema": "/schemas/core/assets/url-asset.json",
      "typical_use": "Clickthrough URLs, tracking pixels, impression trackers"
    },
    "html": {
      "description": "HTML5 creative asset for interactive ads",
      "schema": "/schemas/core/assets/html-asset.json",
      "typical_use": "HTML5 display banners, rich media, interactive ads"
    },
    "css": {
      "description": "CSS stylesheet asset for styling",
      "schema": "/schemas/core/assets/css-asset.json",
      "typical_use": "Stylesheets for HTML5 creatives, custom styling"
    },
    "webhook": {
      "description": "Server-side webhook for dynamic creative rendering",
      "schema": "/schemas/core/assets/webhook-asset.json",
      "typical_use": "DCO (Dynamic Creative Optimization), real-time personalization, server-side rendering"
    },
    "javascript": {
      "description": "JavaScript code for dynamic creative logic",
      "schema": "/schemas/core/assets/javascript-asset.json",
      "typical_use": "Third-party tags, custom interaction logic, analytics"
    },
    "zip": {
      "description": "Bundled creative archive (zip) containing index.html and supporting assets",
      "schema": "/schemas/core/assets/zip-asset.json",
      "typical_use": "HTML5 banner bundles with index.html + CSS + JS + images, MRAID-compatible interactive ads"
    },
    "brief": {
      "description": "Campaign-level creative context (creative brief)",
      "schema": "/schemas/core/assets/brief-asset.json",
      "typical_use": "Campaign briefs with objective, messaging, compliance requirements"
    },
    "catalog": {
      "description": "Typed data feed (products, stores, jobs, etc.)",
      "schema": "/schemas/core/assets/catalog-asset.json",
      "typical_use": "Product catalogs, store locators, job feeds for dynamic creatives"
    },
    "card": {
      "description": "Single card in a multi-card creative — image_carousel `cards` slot element",
      "schema": "/schemas/core/assets/card-asset.json",
      "typical_use": "Carousel cards (Meta-style mixed-media, Pinterest collections), Snap collection cards. Each card carries its own media (image OR video), optional headline, optional landing_page_url. The carousel format's `cards` slot is an array of card-asset values."
    }
  },
  "architecture": {
    "payload_vs_requirements": {
      "description": "Asset schemas define PAYLOAD structure (what you send), not constraints or requirements",
      "payload_examples": [
        "url, width, height, content, duration_ms, format"
      ],
      "requirement_examples": [
        "max_file_size, required: true/false, min_duration, max_duration"
      ],
      "where_requirements_go": "Format specifications contain all constraints in the 'requirements' field of each asset_required item"
    },
    "format_aware_validation": {
      "description": "Creative manifests are validated in the context of their format specification",
      "process": [
        "1. Read format_id from manifest",
        "2. Fetch format specification",
        "3. For each asset in manifest, look up asset_id in format's assets array",
        "4. Validate asset matches the type and requirements defined in the format"
      ]
    },
    "nested_discriminator_pattern": {
      "description": "Asset schemas with internal variants (e.g., VAST and DAAST support both URL-delivery and inline XML) use a two-level discriminator rather than splitting each variant into a separate top-level asset_type. The outer discriminator (`asset_type` on the composite map) selects the asset schema; an inner `oneOf` + `discriminator` inside that schema selects the variant. Future asset types with internal variants should follow this pattern — do not introduce sibling entries like `vast_url` and `vast_inline` at the registry level.",
      "examples": [
        "vast-asset.json: outer asset_type='vast', inner delivery_type='url'|'inline'",
        "daast-asset.json: outer asset_type='daast', inner delivery_type='url'|'inline'"
      ]
    }
  },
  "usage_notes": {
    "format_specs": "Format specifications define what asset_ids are required (e.g., 'hero_image', 'logo'). Each defines its asset type and constraints (dimensions, file size, etc.).",
    "creative_manifests": "Creative manifests provide actual asset content, keyed by asset_id from the format. Each asset value carries an `asset_type` discriminator (one of the registry keys) so validators can select the matching asset schema and report errors against only that branch. The format specification also defines what asset_type each asset_id should have — payload and format should agree.",
    "example_flow": "Format says 'hero_image' must be type 'image' with width 1200, height 627. Manifest provides hero_image: {url: '...', width: 1200, height: 627}. The format spec tells us it's an image type."
  },
  "published_version": "3.1.0-rc.4",
  "adcp_version": "3.1.0-rc.4",
  "baseUrl": "/schemas/3.1.0-rc.4",
  "versioning": {
    "note": "AdCP uses build-time versioning. This directory contains schemas for AdCP 3.1.0-rc.4. Full semantic versions are available at /schemas/{version}/ (e.g., /schemas/2.5.0/). Major version aliases point to the latest release: /schemas/v3/ → /schemas/3.1.0-rc.4/."
  }
}