Skip to content

Conversation

@bokelley
Copy link
Contributor

Summary

  • Add create-content-standards-request/response.json schemas for creating new content standards configurations
  • Add update-content-standards-request/response.json schemas for incremental calibration updates
  • Add languages field (BCP 47 tags) as a required scope parameter - content is evaluated in these languages
  • Reference channels enum (/schemas/enums/channels.json) instead of string array for type safety
  • Remove version field from content standards responses to keep spec clean (versioning handled internally)
  • Add webhook-authentication.json and webhook-config.json schemas (extracted from media-buy)
  • Update all content standards docs with languages examples

Key Design Decisions

Languages field is required in scope - Content standards must specify which languages content will be evaluated in. This aligns with Scope3's Brand Standards API pattern.

Channels use enum reference - Instead of free-form strings, channels now reference the AdCP channels enum (display, video, audio, native, dooh, ctv, podcast, retail, social) for type safety.

No version in responses - Version field removed from API responses. Versioning is an implementation detail that can be handled behind the scenes.

Test plan

  • Schema validation tests pass (212 schemas)
  • Example validation tests pass
  • Unit tests pass (241/241)
  • TypeScript type checking passes
  • Build succeeds

🤖 Generated with Claude Code

- Add create-content-standards-request/response.json schemas
- Add update-content-standards-request/response.json schemas for incremental updates
- Add languages field (BCP 47 tags) to content standards scope
- Reference channels enum instead of string array for type safety
- Remove version field from content standards response (keep spec clean)
- Add webhook-authentication.json and webhook-config.json schemas
- Update all content standards docs with languages examples

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
## Scope Conflict Handling

Multiple standards cannot have overlapping scopes for the same brand/country/channel combination. When creating standards that would conflict:
Multiple standards cannot have overlapping scopes for the same country/channel combination. When creating standards that would conflict:
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

language?

"items": { "$ref": "/schemas/enums/channels.json" },
"description": "Advertising channels. Standards apply to ANY of the listed channels (OR logic)."
},
"languages": {
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

should this be languages_all for consistency? and what does it mean exactly... should we have examples? Like, if the content language is 'en' and that's not in this array, that means "these standards don't apply to English content" or "this buy can only be on English content"?

}
}
},
"floor": {
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

thinking about vendors for this - if a buyer wants to use the garm categories and ratings would this be expressed here? how would a seller agent know which floors to implement? What part of this would be vendor specific (eg IAS floor) vs something the brand should define?

"properties": {
"type": {
"type": "string",
"const": "domain",
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

domains aren't enough here. we need urls

bokelley and others added 3 commits January 18, 2026 17:16
1. Rename languages to languages_any for consistency with countries_all/channels_any
   - Clarifies OR logic: standards apply to content in ANY of listed languages
   - Content in unlisted languages is not covered by these standards

2. Add URL type to calibration exemplars (alongside domain type)
   - Enables page-level granularity for calibration
   - Example: { "type": "url", "value": "https://espn.com/nba/story/12345" }

3. Clarify floor documentation for vendor standards
   - Floors are industry-standard (GARM) or vendor-defined (IAS, DoubleVerify)
   - Seller agent retrieves floor definition from URL

4. Add language to scope conflict detection docs
   - Scope conflicts now consider country/channel/language combination

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Domain-level references are too coarse for calibration - a domain can have
millions of pages with varying content. Calibration exemplars now support:

1. URL references - specific pages to fetch and evaluate
2. Full artifacts - pre-extracted content (text, images, video, audio)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Remove floor field from content-standards schemas (content-standards.json,
  create-content-standards-request.json, update-content-standards-request.json)
- Add documentation note that implementors MUST apply a brand safety floor,
  but AdCP does not define the floor specification
- Update calibration exemplars to use URL type instead of domain type
  (domain is too coarse for calibration - need specific page URLs)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants