Skip to main content

Brand Manifest

The Brand Manifest is a standardized format for identifying the advertiser and providing brand context in AdCP. It tells publishers who the advertiser is (for policy compliance and business purposes) and optionally provides brand guidelines, assets, and product catalogs for creative generation. Brand manifests can be provided either inline as a JSON object or by URL reference to a hosted manifest file.

Overview

Brand manifests solve a key problem: how to efficiently identify advertisers and provide brand context without requiring complex authorization flows or repeated data entry. The brand manifest provides:
  • Advertiser identity: Publishers know who they’re doing business with (KYC/policy compliance)
  • Brand guidelines: Colors, fonts, tone, and visual identity for creative generation
  • Asset libraries: Logos, images, and videos for creative assembly
  • Product catalogs: SKUs and offerings for promotional targeting
  • Consistent identity: Same brand information reused across all requests

Key Benefits

  • Know Your Customer: Publishers can verify advertisers meet their standards
  • Minimal Friction: Start with just a name or URL, expand as needed
  • Cacheable: Same brand manifest reused across all requests
  • Standardized: Consistent format across all AdCP implementations
  • Flexible: Supports SMB to enterprise use cases
  • AI-Optimized: Structured for easy ingestion by creative agents

Providing Brand Manifests

Inline JSON Object

Provide the brand manifest directly in the request:
{
  "brand_manifest": {
    "url": "https://bobsfunburgers.com",
    "name": "Bob's Fun Burgers",
    "colors": {
      "primary": "#FF6B35"
    }
  }
}

URL String

Reference a hosted brand manifest file with a URL string:
{
  "brand_manifest": "https://cdn.acmecorp.com/brand-manifest.json"
}
The manifest at the URL must conform to the brand-manifest.json schema. Benefits of URL references:
  • Centralized management: Update brand information in one place
  • Version control: Track changes to brand guidelines over time
  • Reduced payload size: Large manifests don’t bloat every request
  • CDN caching: Leverage edge caching for faster access
  • Consistency: Same manifest across all campaigns and platforms

Use Cases

Minimal Manifest (Sales Agents / Media Buying Only)

If you’re building a sales agent focused purely on media buying, you can provide a minimal manifest. The brand manifest is required so publishers know who the advertiser is (for policy compliance and business purposes), but you don’t need extensive brand details unless you’re using creative generation or optimization features. Minimal inline manifest:
{
  "name": "ACME Corporation",
  "url": "https://acmecorp.com"
}
Or even simpler for brands with URLs:
{
  "url": "https://acmecorp.com"
}
Or reference a minimal hosted manifest:
"https://acmecorp.com/.well-known/brand-manifest.json"
This minimal approach provides:
  • Advertiser identity for publisher KYC and policy compliance
  • Basic business information for reporting and tracking
  • Future extensibility if you later need creative generation
You can safely skip colors, fonts, logos, product catalogs, and tone unless your use case requires them.

SMB / Ad Hoc Creative Generation

For small businesses or one-off campaigns needing creative generation, a minimal brand manifest with a URL provides enough context:
{
  "url": "https://bobsfunburgers.com"
}
Creative agents can infer brand information from the URL, pulling logos, colors, and style from the website.

Enterprise / Established Brand

For established brands with defined guidelines, host the manifest on a CDN: Hosted at https://cdn.acmecorp.com/brand-manifest.json:
{
  "url": "https://acmecorp.com",
  "name": "ACME Corporation",
  "logos": [
    {
      "url": "https://cdn.acmecorp.com/logo-square-dark.png",
      "tags": ["dark", "square"],
      "width": 512,
      "height": 512
    },
    {
      "url": "https://cdn.acmecorp.com/logo-horizontal-light.png",
      "tags": ["light", "horizontal"],
      "width": 1200,
      "height": 400
    }
  ],
  "colors": {
    "primary": "#FF6B35",
    "secondary": "#004E89",
    "accent": "#F7931E",
    "background": "#FFFFFF",
    "text": "#1A1A1A"
  },
  "fonts": {
    "primary": "Helvetica Neue",
    "secondary": "Georgia"
  },
  "tone": "professional and trustworthy",
  "tagline": "Innovation You Can Trust",
  "product_catalog": {
    "feed_url": "https://acmecorp.com/products.rss",
    "feed_format": "google_merchant_center"
  },
  "industry": "technology",
  "target_audience": "business decision-makers aged 35-55"
}
Reference in requests:
{
  "brand_manifest": "https://cdn.acmecorp.com/brand-manifest.json"
}

Multi-SKU Retailer

Large retailers can provide product feeds and asset libraries:
{
  "url": "https://bigretail.com",
  "name": "BigRetail",
  "product_catalog": {
    "feed_url": "https://bigretail.com/catalog.xml",
    "feed_format": "google_merchant_center"
  },
  "disclaimers": [
    {
      "text": "Prices and availability subject to change",
      "context": "pricing",
      "required": true
    }
  ]
}

Brands Without URLs

Some brands don’t have dedicated URLs (white-label products, local businesses, B2B brands). Brand cards support name-only identification:
{
  "name": "Great Value",
  "colors": {
    "primary": "#0071CE",
    "secondary": "#FFC220"
  },
  "tone": "affordable and trustworthy"
}
Common cases for name-only brands:
  • White-label/store brands (e.g., “Great Value”, “Kirkland”)
  • Local businesses without websites
  • B2B brands without public sites
  • Sub-brands under parent company URLs

Brand Manifest Schemas

Brand Manifest Reference (Union Type)

Schema URL: /schemas/v1/core/brand-manifest-ref.json The brand manifest reference is a union type that accepts either:
  1. Inline object: Full brand manifest JSON object
  2. URL reference: Object with manifest_url field pointing to hosted manifest

Brand Manifest Object

Schema URL: /schemas/v1/core/brand-manifest.json The structure of the brand manifest object itself (whether provided inline or hosted at a URL).

Required Fields

Either url OR name is required (both can be provided):
FieldTypeDescription
urlstring (uri)Primary brand URL for context and asset discovery
namestringBrand or business name (required if no URL provided)

Optional Fields

FieldTypeDescription
namestringBrand or business name
logosLogo[]Brand logo assets with semantic tags
colorsColorsBrand color palette (hex format)
fontsFontsBrand typography guidelines
tonestringBrand voice and messaging tone
taglinestringBrand tagline or slogan
product_feedstring (uri)URL to product catalog feed
asset_libraryAssetLibraryReferences to brand asset libraries
disclaimersDisclaimer[]Legal disclaimers for creatives
industrystringIndustry or vertical
target_audiencestringPrimary target audience description
contactContactBrand contact information
metadataMetadataVersion and update tracking

Logo Object

{
  url: string;           // URL to logo asset
  tags?: string[];       // Semantic tags (e.g., "dark", "light", "square", "horizontal")
  width?: number;        // Logo width in pixels
  height?: number;       // Logo height in pixels
}
Common Tags: "dark", "light", "square", "horizontal", "vertical", "icon", "wordmark", "lockup"

Colors Object

{
  primary?: string;      // Primary brand color (#RRGGBB)
  secondary?: string;    // Secondary brand color (#RRGGBB)
  accent?: string;       // Accent color (#RRGGBB)
  background?: string;   // Background color (#RRGGBB)
  text?: string;         // Text color (#RRGGBB)
}

Fonts Object

{
  primary?: string;      // Primary font family name
  secondary?: string;    // Secondary font family name
  font_urls?: string[];  // URLs to web font files
}

Disclaimer Object

{
  text: string;          // Disclaimer text
  context?: string;      // When this applies (e.g., "financial_products", "health_claims")
  required?: boolean;    // Whether this must appear (default: true)
}

Asset Library Object

{
  images?: string;       // URL to image asset library or API
  videos?: string;       // URL to video asset library or API
  templates?: string;    // URL to creative templates library
}

Integration with AdCP Tasks

create_media_buy

Include brand manifest in media buy creation to provide context for creative generation:
{
  "buyer_ref": "campaign_2024_q1",
  "promoted_offering": "ACME Pro Widget",
  "brand_manifest": {
    "url": "https://acmecorp.com",
    "name": "ACME Corporation",
    "tone": "professional and innovative"
  },
  "packages": [...],
  "budget": {...}
}

build_creative

Use brand manifest to inform creative generation:
{
  "message": "Create a native ad highlighting our new product launch",
  "format_id": {
    "agent_url": "https://creative.adcontextprotocol.org",
    "id": "display_native"
  },
  "brand_manifest": {
    "url": "https://acmecorp.com",
    "logos": [
      {
        "url": "https://cdn.acmecorp.com/logo-square.png",
        "tags": ["square", "dark"]
      }
    ],
    "colors": {
      "primary": "#FF6B35",
      "secondary": "#004E89"
    },
    "tone": "professional and trustworthy"
  }
}

Best Practices

1. Start Simple, Expand as Needed

Begin with just a URL. Add more fields only when the URL-based inference isn’t sufficient:
// ✅ Good starting point
{
  "url": "https://mybrand.com"
}

// ✅ Add details when needed
{
  "url": "https://mybrand.com",
  "logos": [...],
  "colors": {...}
}

2. Use Semantic Tags for Logos

Tags help creative agents select appropriate logo variants:
{
  "logos": [
    {"url": "...", "tags": ["dark", "square"]},      // For light backgrounds
    {"url": "...", "tags": ["light", "square"]},     // For dark backgrounds
    {"url": "...", "tags": ["dark", "horizontal"]},  // Wide layouts
    {"url": "...", "tags": ["icon"]}                 // Small placements
  ]
}

3. Cache and Reuse Brand Manifests

Brand cards are designed to be cached. Use URL strings for automatic caching:
// Reference hosted manifest (cacheable by URL)
const brandManifestUrl = "https://cdn.acmecorp.com/brand-manifest.json";

// Reuse across requests - agents can cache the manifest
await createMediaBuy({ brand_manifest: brandManifestUrl, ... });
await buildCreative({ brand_manifest: brandManifestUrl, ... });
await buildCreative({ brand_manifest: brandManifestUrl, ... }); // Same manifest, different creative
Or cache inline manifests yourself:
// Cache inline manifest once
const brandManifest = {
  url: "https://acmecorp.com",
  colors: {...},
  logos: [...]
};

// Reuse across requests
await createMediaBuy({ brand_manifest: brandManifest, ... });
await buildCreative({ brand_manifest: brandManifest, ... });

4. Product Feeds for Multi-SKU

Large retailers should provide product feeds:
{
  "url": "https://retailer.com",
  "product_feed": "https://retailer.com/products.json"
}
Supported Feed Formats: RSS, JSON Feed, Product CSV

5. Asset Libraries for Enterprise

Enterprise brands with large asset libraries should provide API endpoints:
{
  "asset_library": {
    "images": "https://assets.brand.com/api/images",
    "videos": "https://assets.brand.com/api/videos"
  }
}

Evolution and Versioning

Brand cards are versioned using the metadata.version field:
{
  "url": "https://brand.com",
  "metadata": {
    "version": "2.1",
    "updated_date": "2024-03-15T10:00:00Z"
  }
}
Version updates:
  • Patch (2.0.1): Fix typos, update contact info
  • Minor (2.1.0): Add new assets, update colors
  • Major (3.0.0): Complete rebrand, new identity

Migration from brand_guidelines

For implementations using the legacy brand_guidelines field in build_creative: Before (Legacy):
{
  "brand_guidelines": {
    "colors": ["#FF6B35", "#004E89"],
    "fonts": ["Helvetica Neue"],
    "tone": "professional"
  }
}
After (Brand Manifest):
{
  "brand_manifest": {
    "url": "https://brand.com",
    "colors": {
      "primary": "#FF6B35",
      "secondary": "#004E89"
    },
    "fonts": {
      "primary": "Helvetica Neue"
    },
    "tone": "professional"
  }
}