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
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:url — the property is identified by apple_podcast_id, and the audio asset uses a secured URL):
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
variant_id to distinguish between them:
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
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: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:- Use
signed_urlby default for one-off asset delivery. The consumer performs an ordinary HTTPSGET; no additional authentication integration is required. - Use
service_accountfor established, higher-volume relationships where the asset origin has already authorized a workload identity controlled by the consumer. - Use
bearer_tokenonly when the origin cannot support either option. Tokens must be short-lived and scoped to the individual asset.
Signed URLs (recommended)
For one-off access, place the complete pre-signed URL in the asset’surl and mark the access method:
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.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: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
Theproperty_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.
Related
- Content Standards Overview - How artifacts fit into the content standards workflow
- calibrate_content - Sending artifacts for calibration