Creator pillar · v0.14.0
audience-snapshot AudienceSnapshot
Daily aggregate of audience activity for one channel on one date. Path-shape: `creator/audience-snapshots/YYYY-MM-DD-{channel-slug}.yaml`. Core activity row is fetched daily; demographic / geographic / traffic-source breakdowns are fetched on a weekly cadence (the connector decides — empty `*_breakdown` vectors are valid for a day where only the core row was synced).
$id · https://corpospec.com/schemas/v0.14.0/audience-snapshot.schema.json
Fields
| Field | Type | Required | Description |
|---|---|---|---|
| average_view_duration_seconds | number | yes | |
| average_view_percentage | number | yes | |
| channel | PathRef | yes | Path-based cross-reference relative to .corpospec/ root. Pattern: `^[a-z0-9_-]+(/[a-z0-9_.-]+)+$` |
| comments | integer | yes | Aggregate count only; comment text and author identities not synced. |
| date | IsoDate | yes | Activity day. Connectors normalise to the platform's reporting timezone (e.g. YouTube Analytics buckets in Pacific time). |
| dislikes | integer | yes | |
| engaged_views | integer | yes | |
| estimated_minutes_watched | integer | yes | |
| id | PathRef | yes | CorpoSpec PathRef (e.g. `creator/audience-snapshots/2026-05-05-unstarter-yt`). |
| likes | integer | yes | |
| provenance | SyncProvenance | yes | Provenance metadata stamped on every synced atomic record across the creator pillar. Per-record granularity; the `retention_tier` reflects the strictest tier of any field on the record so the cache-purge job can decide conservatively. Field-level retention distinctions are documented in each entity type's struct doc-comments — the schema documents the static taxonomy, the data carries only the per-fetch state. |
| shares | integer | yes | |
| subscribers_gained | integer | yes | |
| subscribers_lost | integer | yes | |
| thumbnail_impressions | integer | yes | Number of times the channel's video thumbnails were shown to viewers (impression count). |
| thumbnail_impressions_ctr | number | yes | Click-through rate on `thumbnail_impressions` as a percentage. |
| videos_added_to_playlists | integer | yes | |
| videos_removed_from_playlists | integer | yes | |
| views | integer | yes | |
| age_gender_breakdown | AgeGenderBreakdown[] | — | |
| content_type_breakdown | ContentTypeBreakdown[] | — | |
| country_breakdown | CountryBreakdown[] | — | |
| device_breakdown | DeviceBreakdown[] | — | |
| live_on_demand_breakdown | LiveOnDemandBreakdown[] | — | |
| operating_system_breakdown | OperatingSystemBreakdown[] | — | |
| playback_location_breakdown | PlaybackLocationBreakdown[] | — | |
| premium_subscriber_stats | PremiumSubscriberStats? | — | Per-channel activity attributable to the host platform's premium subscription tier. Optional — absent when the host platform does not surface premium-tier metrics for the channel. |
| subscribed_status_breakdown | SubscribedStatusBreakdown[] | — | |
| traffic_source_breakdown | TrafficSourceBreakdown[] | — |
Definitions
Shared types referenced within this schema.
AgeGenderBreakdown
Age-group × gender breakdown row.
type: object
AgeGroup
Age-group bucket. Aggregate-level only; never identifies a single
viewer. Wire form preserves the numeric-range convention common to
analytics APIs that report demographics this way (e.g. YouTube
Analytics' `ageGroup` dimension emits `age13-17`, `age18-24`, …).
enum: "age13_17", "age18_24", "age25_34", "age35_44", "age45_54", "age55_64", "age65_plus"
ContentTypeBreakdown
Content-type breakdown — Shorts vs VOD vs livestream.
type: object
CountryBreakdown
Country-distribution row.
type: object
CreatorContentType
Authoritative content-type classification from the host platform's
analytics surface, where one is exposed (e.g. YouTube Analytics'
`creatorContentType` dimension). The best available signal for
separating short-form, long-form, livestream, and story content in
audience aggregates; the connector reconciles `Video.kind` against
this where the host platform supports it.
enum: "live_stream", "shorts", "story", "video_on_demand", "unspecified"
DataClass
Classification of a synced field's data sensitivity. Drives subject-
rights workflows and cache-purge retention decisions.
DeviceBreakdown
Device-distribution row.
type: object
DeviceType
Device type reported by analytics surfaces. Connectors map their
native device taxonomies onto the closest member.
enum: "desktop", "game_console", "mobile", "tablet", "tv", "automotive", "wearable", "unknown_platform"
Gender
Gender bucket reported by analytics surfaces. `user_specified`
captures platforms that expose self-declared options beyond the
female/male binary.
enum: "female", "male", "user_specified"
IsoCountry
ISO 3166-1 alpha-2 country code.
pattern: ^[A-Z]{2}$
IsoDate
ISO 8601 date (YYYY-MM-DD).
type: string
LiveOnDemandBreakdown
Live-vs-on-demand split row.
type: object
LiveOrOnDemand
Live-vs-on-demand discriminator on a daily aggregate row.
enum: "live", "on_demand"
OperatingSystem
Operating system reported by analytics surfaces.
enum: "android", "ios", "windows", "macintosh", "linux", "chrome_cast", "firefox", "play_station", "xbox", "other"
OperatingSystemBreakdown
Operating-system-distribution row.
type: object
PathRef
Path-based cross-reference relative to .corpospec/ root.
Pattern: `^[a-z0-9_-]+(/[a-z0-9_.-]+)+$`
pattern: ^[a-z0-9_-]+(/[a-z0-9_.-]+)+$
PlaybackLocation
Playback location reported by analytics surfaces. Connectors map
their native location dimensions onto the closest member.
PlaybackLocationBreakdown
Playback-location-distribution row.
type: object
PremiumSubscriberStats
Per-channel audience activity attributable to the host platform's
premium subscription tier, where the platform exposes one (e.g.
YouTube Premium / formerly "YouTube Red"). Tracks the slice of views
and watch-time that originated from premium subscribers; absent when
the platform does not surface premium-tier metrics.
type: object
RetentionTier
Retention policy applied to a synced record. Tiers are named after the
discipline they impose; the connector layer maps each upstream surface
onto the appropriate tier.
- `thirty_day_strict` — atomic records that auto-purge or refresh at
the thirty-day boundary. The dominant tier on platforms whose
Terms of Service impose a thirty-day cache discipline on derived
data (e.g. YouTube Developer Policies §III.E.4 for Data API
outputs).
- `thirty_day_aggregate_with_lineage` — atomic record purges at
thirty days; the aggregate computed from it may be retained when
accompanied by explicit `derived_from` + `derivation_method`
lineage.
- `auth_lifetime` — atomic record retains against active OAuth
authorisation; tears down on token revocation or tenant deletion.
Used for analytics surfaces whose ToS explicitly exempt them from
the thirty-day rule (e.g. YouTube Analytics API per §III.E.4).
- `creator_authored` — data the tenant originates rather than fetches;
no upstream-platform retention constraint applies.
- `metadata_indefinite` — structural identifiers and immutable
timestamps the upstream ToS explicitly permits to retain.
SourceAttribution
Source attribution for a synced field. Records the kind of upstream
surface that produced the value; combined with the parent record's
`platform`, this fully attributes any value back to its origin.
Open-ended by design: new connector kinds (e.g. monetary or content-
owner APIs) extend without breaking changes. The platform discriminator
(`Channel.platform`) carries the brand identity; this enum carries
only the kind of API surface the value came from.
SubscribedStatus
Subscribed-status discriminator on a daily aggregate row. Splits
audience activity by whether the viewer is subscribed to the channel
at the time of the play.
enum: "subscribed", "unsubscribed"
SubscribedStatusBreakdown
Subscribed-status breakdown row.
type: object
SyncProvenance
Provenance metadata stamped on every synced atomic record across the
creator pillar. Per-record granularity; the `retention_tier` reflects
the strictest tier of any field on the record so the cache-purge job
can decide conservatively. Field-level retention distinctions are
documented in each entity type's struct doc-comments — the schema
documents the static taxonomy, the data carries only the per-fetch
state.
type: object
TrafficSourceBreakdown
Traffic-source-distribution row.
type: object
TrafficSourceType
Traffic-source type reported by analytics surfaces. The eighteen
members cover the union of categories surveyed across major creator
analytics APIs; values prefixed `platform_` denote platform-internal
sources (the platform's own search, channel pages, recommendation
surfaces) that map onto each platform's native enum at the connector
boundary.
Reference in your YAML
# yaml-language-server: $schema=https://corpospec.com/schemas/v0.14.0/audience-snapshot.schema.json