This document maps sponsor PRD requirements to currently available data sources.
Scope:
- Primary sponsor table:
v1_brandReport
- Cross-table dependencies checked:
v1_Channel, v1_IGUser, v2_Creator
- Status definitions:
Have: field is directly present in current storage
Derivable: field can be reliably computed from stored fields
Missing: not present and not safely derivable from current sources
Naming/normalization policy for this mapping:
- YouTube creator identifier terminology:
channelId
- Instagram/TikTok creator identifier terminology:
userId
- Internal fields may still be
cId, igId, etc.; this matrix focuses on API contract naming.
Source Evidence Snapshot
v1_brandReport includes brand identity and sponsor aggregates:
brandId, name, desc, logo, alias, companySize, competitors, industries, country, location, website, socialMedia
- YouTube sponsor aggregates:
channelNumber, videoNumber, videoNumber30d, countryCounts, langCounts, demographic, growth/stat objects
- Instagram sponsor aggregates under
instagram: sponsoredIgIds, channelNumber, postNumber, postNumber30d, countryCounts, langCounts, summary stat objects
- Linkage lists:
cIds (YouTube creators), brandIgIds and instagram.sponsoredIgIds (Instagram handles)
v1_Channel includes YouTube creator profile/performance metadata (cId, cName, countryCode, lang*, nicheIds, topics, demographic blocks, etc.).
v1_IGUser includes Instagram creator profile metadata (igId, igName, countryCode, lang, creatorId, profile/contact structures, etc.).
v2_Creator includes cross-platform creator identity/linking (creatorId, youtubePrimaryId, youtubeId, instagramPrimaryId, instagramId, tiktok*, profile summary).
Note:
- Current
internal/ai-context/sponsors/api-v3/*.json responses are 404 placeholders (sponsor endpoints not yet live in that capture), so this pass uses PRD + table data only.
Request Filters
| PRD Filter | Status | Source / Reason |
|---|
name, industry, country | Have | v1_brandReport.name, industries, country |
sponsoringRegion | Have | v1_brandReport.country1st (and related country ratios/counts) |
channelId (YouTube creator association) | Have | v1_brandReport.cIds |
userId (Instagram creator association) | Have | v1_brandReport.brandIgIds + v1_brandReport.instagram.sponsoredIgIds |
sponsoringPlatforms | Derivable | from presence of videoNumber > 0 and instagram.postNumber > 0 |
totalSponsoredContent | Derivable | videoNumber + instagram.postNumber |
estimatedTotalSpend7d, estimatedTotalSpend30d, estimatedTotalSpend90d | Missing | PRD: daily rollups on v1_brandReport from per-video misc.calculated.ytVideoPrice.priceRaw (YouTube); Instagram pricing not yet in production — filters aggregate per-platform totals once stored |
hasActiveCampaign | Derivable | from videoNumber30d and/or instagram.postNumber30d |
Response Fields
| PRD Field | Status | Source / Reason |
|---|
results[].brandId/name/logo/industries/country | Have | v1_brandReport direct fields |
totalResults, offset, pageSize | Derivable | query/result metadata from service layer |
| PRD Field | Status | Source / Reason |
|---|
brands[].brandId/name/logo/industries/country | Have | v1_brandReport direct fields |
brands[].sponsoringPlatforms | Derivable | derive from YouTube/Instagram sponsor counts |
brands[].totalSponsoredContent | Derivable | videoNumber + instagram.postNumber |
totalBrands | Derivable | count query over sponsor table |
Pagination envelope (offset, pageSize) | Derivable | service layer metadata |
Primary gap:
- None for core list payload, if derivations are accepted as API-layer computations.
| PRD Field | Status | Source / Reason |
|---|
brandId, name, alias, logo | Have | v1_brandReport direct |
description | Derivable | from v1_brandReport.desc (rename) |
companySize, keyPeople, industries, country, location, website, competitors | Have | v1_brandReport direct |
socialMedia[] {platform,url} | Derivable | source is URL array in v1_brandReport.socialMedia; needs parser/normalizer |
sponsoredContentYoutube, sponsoredContentYoutube30d | Have | videoNumber, videoNumber30d |
sponsoredContentInstagram, sponsoredContentInstagram30d | Have | instagram.postNumber, instagram.postNumber30d |
totalSponsoredContent | Derivable | sum of YouTube + Instagram totals |
activePlatforms | Derivable | based on non-zero platform totals |
Primary gap:
- No blocker; mostly naming/shape normalization.
Summary Block
| PRD Field | Status | Source / Reason |
|---|
totalSponsoredCreators | Derivable | channelNumber + instagram.channelNumber |
sponsoredCreatorsYoutube | Have | channelNumber |
sponsoredCreatorsInstagram | Have | instagram.channelNumber |
totalSponsoredContent, platform content totals | Have/Derivable | direct counts + sums from v1_brandReport |
creatorLocationBreakdown (youtube/instagram top countries) | Have/Derivable | countryCounts and instagram.countryCounts |
creatorLanguageBreakdown (youtube/instagram top languages) | Have/Derivable | langCounts and instagram.langCounts |
estimatedTotalSpend30d (summary) | Missing | same rollup plan as search filters; not present in sampled v1_brandReport checks |
Creators Array
| PRD Field | Status | Source / Reason |
|---|
creatorId + platform | Have/Derivable | from sponsor link lists (cIds, sponsoredIgIds) with platform tagging |
displayName, avatar, country, followers, engagementRate, topics, niches | Have (cross-table) | YouTube from v1_Channel; Instagram from v1_IGUser + potentially v2_Creator harmonization |
sponsoredContent URLs | Missing (in checked scope) | requires sponsor-attributed content linkage table(s), not present in sampled files |
sponsoredCount, lastSponsoredDate | Missing (in checked scope) | require content-level sponsorship attribution and timestamps |
Primary gaps:
- Sponsor-attributed per-creator content linkage and spend attribution.
| PRD Field Family | Status | Source / Reason |
|---|
Content counts by window (sponsoredContent*) | Have/Partial | some direct (videoNumber, videoNumber30d, instagram.postNumber, instagram.postNumber30d); additional windows depend on whether corresponding stored fields are consistently available across data |
Totals/statistics (views.totalViews / views30d, likes.totalLikes / likes30d, comments.totalComments / comments30d, avg/median/min/max, growth30d, estimatedTotalSpend*, platform-level estimatedCPM30d / estimatedCPE30d) | Have/Partial | YouTube: rich stat/growth in v1_brandReport; spend rollups are PRD/daily-worker outputs. Instagram: engagement stats Have/Partial; spend fields reserved (null) until pricing pipeline exists |
| PRD Field Family | Status | Source / Reason |
|---|
creatorId, creatorDisplayName, platform | Have/Derivable | via join from sponsor creator IDs to v1_Channel / v1_IGUser |
creatorSponsoredStats, creatorTotalStats, estimatedSpend | Missing/Partial | require sponsor-attributed content performance rollups and spend model outputs |
content[] per-piece fields (contentId, publishTime, views windows, likes, comments, hashtags, etc.) | Missing (in checked scope) | requires sponsor-attributed content tables and historical windows not present in sampled sponsor/creator snapshots |
Primary gaps:
- Per-sponsor per-content attribution dataset and computed rollups.
| PRD Field | Status | Source / Reason |
|---|
YouTube audience demographics (audienceLocations, audienceGender, audienceAvgAge, audienceAgeBreakdown) | Have/Derivable | from v1_brandReport.demographic (country, gender, age distribution) |
| Instagram audience demographics (same shape) | Missing | no equivalent Instagram audience demographic block found in current sponsor sources |
Primary gap:
- Instagram audience aggregation pipeline for sponsored creator pool.
| PRD Requirement | Status | Source / Reason |
|---|
Persisted submissions + lifecycle (accepted / processing / done / rejected) | Missing | requires dedicated submission store |
| Duplicate detection by brand root domain | Derivable + Missing infra | derivable logic exists conceptually using brandId domain norms, but needs submit-path implementation and index |
Abuse controls (disallowed, per-key daily limit) | Missing | requires policy/config + state store |
Cross-Endpoint Naming Alignment Notes
- For sponsor creator-association filters, keep published platform-native terminology:
- YouTube:
channelId
- Instagram/TikTok:
userId
- Internal storage mappings:
- YouTube
channelId -> v1_Channel.cId and sponsor-side v1_brandReport.cIds[]
- Instagram
userId (handle) -> v1_IGUser.igId and sponsor-side v1_brandReport.brandIgIds[] / v1_brandReport.instagram.sponsoredIgIds[]
- Cross-platform identity bridge ->
v2_Creator (youtubePrimaryId, instagramId, etc.)
Prioritized Engineering Discovery Backlog (No Coding)
P0 — Contract + Mapping Clarity
- Finalize sponsor filter contract names in docs and implementation mapping:
- accept canonical:
channelId (YT), userId (IG/TikTok)
- decide whether legacy aliases remain accepted and for how long.
- Publish canonical source map table:
- each sponsor API field -> source field path(s) -> transform rule.
P1 — Derived Field Standardization
- Standardize
socialMedia normalization:
- URL array ->
{ platform, url } with deterministic platform parser.
- Standardize platform activity derivation:
activePlatforms, sponsoringPlatforms, hasActiveCampaign.
- Standardize aggregate derivations:
totalSponsoredContent, summary top-N country/language formatting.
P1 — Cross-Table Dependency Validation
- Validate join keys and quality:
- sponsor (
cIds, sponsoredIgIds) -> v1_Channel / v1_IGUser -> optional harmonization via v2_Creator.
- Define fallback rules when linked creator records are missing or stale.
- Identify authoritative sponsor-attributed content table(s) for:
- per-creator sponsored content URLs/counts
- per-content performance windows (7d/30d/90d)
- latest sponsored timestamps
- Define spend attribution source for:
estimatedTotalSpend7d / estimatedTotalSpend30d / estimatedTotalSpend90d (platform summary + search)
- per-creator
estimatedSpend in performance (sum of priceRaw-family per video, rolling 30d).
P2 — Audience Parity
- Confirm current YouTube audience derivation contract from sponsor demographic.
- Design Instagram audience aggregation source and validation checks to reach schema parity with YouTube block.
- Define submission entity schema (
submissionId, status lifecycle, timestamps, actor key).
- Define dedupe index strategy (root-domain normalization).
- Define abuse controls and observability fields (per-key daily counter, disallowed flag, moderation notes).
Already strong today:
- Sponsor identity/profile data (
sponsor/information core)
- Sponsor list/search base attributes
- High-level YouTube + Instagram sponsorship aggregate counts
- YouTube audience demographics
- Cross-table creator identity foundations (
v1_Channel, v1_IGUser, v2_Creator)
Need to add/confirm before full PRD parity:
- Sponsor-attributed per-content dataset for
sponsor/creators + sponsor/performance detailed sections
- Spend attribution dataset/logic (
estimatedTotalSpend* / per-creator estimatedSpend; YouTube from misc.calculated.ytVideoPrice.priceRaw; Instagram TBD)
- Instagram audience demographics at sponsor-aggregate level
- Sponsor submit persistence + dedupe + anti-abuse state model
Last modified on March 20, 2026