Skip to main content

Artifacts

An artifact is a unit of content adjacent to an ad placement. When evaluating brand suitability, you’re asking: “Is this artifact appropriate for my brand’s ads?”

What Is an Artifact?

Artifacts represent the content context where an ad appears:
  • A news article on a website
  • A podcast segment between ad breaks
  • A video chapter in a YouTube video
  • A social media post in a feed
  • A scene in a CTV show
  • An AI-generated image in a chat conversation
Artifacts are identified by property_id + artifact_id - the property defines where the content lives, and the artifact_id is an opaque identifier for that specific piece of content. The artifact_id scheme is flexible - it could be a URL path, a platform-specific ID, or any consistent identifier the property owner uses internally.

Structure

Schema: artifact.json Web article:
Podcast segment (note: no url — the property is identified by apple_podcast_id, and the audio asset uses a secured URL):
CTV scene (the artifact_id encodes show, season, episode, and scene):

Required Fields

Optional Fields

Variants

The same artifact may have multiple variants:
  • Translations - English version vs Spanish version
  • A/B tests - Different headlines being tested
  • Temporal versions - Content that changed on Wednesday
Use variant_id to distinguish between them:
The combination of artifact_id + variant_id must be unique within a property. This lets you track which variant a user saw and correlate it with delivery reports.

Asset Types

Assets are the actual content within an artifact. Everything is an asset - titles, paragraphs, images, videos.

Text

Roles: title, description, paragraph, heading, caption, quote, list_item Each text asset can have its own language tag for mixed-language content.

Image

Video

Audio

Metadata

Artifact-level metadata describes the artifact as a whole, not individual assets:
This is separate from assets because it’s about the artifact container, not the content itself.

Secured Asset Access

Many assets aren’t publicly accessible—AI-generated images, private conversations, and paywalled content are common examples. The artifact schema supports three access methods without requiring every consumer to understand cloud IAM.

Choosing an access method

Use the simplest method that fits the relationship:
  1. Use signed_url by default for one-off asset delivery. The consumer performs an ordinary HTTPS GET; no additional authentication integration is required.
  2. Use service_account for established, higher-volume relationships where the asset origin has already authorized a workload identity controlled by the consumer.
  3. Use bearer_token only when the origin cannot support either option. Tokens must be short-lived and scoped to the individual asset.
Never place long-lived API keys, service-account private keys, cloud access keys, or other standing credentials in an artifact payload. For one-off access, place the complete pre-signed URL in the asset’s url and mark the access method:
The URL itself is a bearer capability. Producers should scope it to one asset and the shortest practical access window under a documented maximum TTL. Consumers must redact the complete URL from logs, traces, errors, metrics, analytics, model context, and durable storage because providers may place credential material in either its path or query string. Do not forward a signed URL outside its intended recipient or trust boundary.

Workload identity

For ongoing partnerships, the asset origin can authorize an identity already controlled by the component that performs the asset fetch. At fetch time, that component uses its normal cloud credential chain, such as GCP Application Default Credentials or AWS SigV4. No credential is sent in the artifact. If an orchestrator forwards an artifact to a governance agent, it must either fetch the asset itself or arrange out-of-band authorization for the governance agent’s identity.
The service_account.credentials field is deprecated in AdCP 3.2. Its presence denotes only the legacy inline-credential form, not workload-identity authorization. Consumers must continue parsing and validating the field for 3.x wire compatibility, but must not activate received credentials automatically. They may process the legacy form only for a peer explicitly allowlisted for legacy compatibility; otherwise they must reject or quarantine it. New producers must omit it. The field is eligible for removal in 4.0 or later only after the six-month notice and full-release-cycle gates in the deprecation policy are satisfied.

Bearer tokens

When neither signed URLs nor pre-configured workload identity is available, attach a short-lived, asset-scoped token:
Send the token only in the Authorization header to the HTTPS origin authorized for that asset. Never forward the header across redirects. Redact the token from logs, traces, errors, metrics, analytics, model context, and durable storage. For artifacts with many assets, prefer signed URLs or pre-configured workload identity rather than repeating bearer tokens throughout the payload. The asset url may differ from the artifact’s canonical or published URL. For example, a published article at https://news.pinnacle.example/article/123 might have assets served from https://assets.pinnacle.example/secured/....

Safe fetching

Treat every asset URL and its access metadata as untrusted input. Consumers must require HTTPS and, after DNS resolution and after every redirect, reject loopback, link-local, metadata-service, private, and other locally disallowed destinations unless a specific destination was explicitly approved during authenticated onboarding. Access metadata alone must never select an ambient credential: workload identity is limited to the pre-authorized origin and resource prefix, and bearer tokens are limited to the authorized origin. Fail closed on authorization or destination-check failures. Do not retry by switching among signed URLs, workload identity, bearer tokens, or legacy inline credentials. Temporary encrypted caching of signed URLs, tokens, or legacy credentials must end no later than both the credential expiry and the consumer’s configured maximum lifetime.

Access methods at a glance

See Migrating secured asset access for AdCP 3.2 for producer and consumer changes.

Property Identifier Types

The property_id uses standard identifier types from the AdCP property schema:

Artifact ID Schemes

The property owner defines their artifact_id scheme. Examples: The verification agent doesn’t need to understand the scheme - it’s opaque. The property owner uses it to correlate artifacts with their content.