SponserdIQ

Skills Reference

Skills are advanced analytics queries executed via the run_skill tool. Each skill is invoked by name with skill-specific parameters passed in the params map.

run_skill(skill_name: "find_competitors", params: {"brand_name": "Nike"})

Live Research Pattern

Most entity-centric skills attach a live-research block to their response. SponserdIQ provides the proprietary structured context (portfolio, citations, renewals); the calling Claude executes the recommended live web searches to add what our DB can't know (current contract values, recent exec hires, RFPs, market news). Combined synthesis is something neither stock Claude nor SponserdIQ alone can produce.

Two shapes share id / query field names so callers see consistent structure:

research_protocol — the deep shape, used by the three flagship live-research skills (pitch_brief_for_brand, compare_with_live, challenge_protocol):

"research_protocol": {
  "purpose": "",
  "queries": [
    {
      "id": "recent_deal_announcements",
      "query": "Nike sponsorship announcement 2026",
      "extract": { "new_deals": "list of {property_name, url, date}" },
      "compare_against": "portfolio[].property_name"
    }
  ],
  "output_schema": { /* how Claude should structure the synthesis */ }
}

live_research_hints — the lightweight shape, attached to a curated subset of entity-centric skills. 1–3 deterministic queries with a one-line purpose, no extraction schemas:

"live_research_hints": [
  {
    "id": "recent_brand_news",
    "purpose": "verify the last 90 days of news for Nike",
    "query": "Nike sponsorship news 2026"
  }
]

Skills returning either shape: every skill listed below as "live-research" returns a block. Pure-aggregate skills (segment counts, market overviews) intentionally don't — forced hints would be noise rather than signal.

Relational Skills

Skills that analyze relationships between brands and properties.

find_competitors

Finds brands that sponsor the same properties as a given brand, ranked by overlap count.

Parameter Type Required Description
brand_name string yes The brand to find competitors for
limit integer no Max competitors to return (default: 20)

Returns: each competitor entry includes healthy_overlap_count alongside overlap_count — narrows the overlap to properties whose scrape is currently fresh, distinguishing live competitive presence from historical rivalry.

similar_entities

Finds the brands or properties most semantically SIMILAR to a given one, by embedding cosine similarity (k-nearest-neighbors). Unlike find_competitors (shared-property overlap), this ranks by what the entity is — so it surfaces lookalikes even when they share no sponsorships yet. Ideal for prospecting ("brands like Gatorade").

Parameter Type Required Description
entity_name string yes The brand or property to find lookalikes for
entity_type string no brand or property (default: auto — brand first, then property)
limit integer no Max lookalikes (default: 10, max: 50)

Returns: a ranked similar list of {id, name, similarity} (cosine similarity in [-1, 1], higher = closer) plus live_research_hints. Returns similar: [] with a note when the entity has no embedding cached yet.

coverage_gaps

Identifies properties where a brand's competitors are active but the brand is not. Useful for finding expansion opportunities.

Returns: each gap entry includes healthy_competitor_count alongside competitor_count — narrows to competitors whose specific sponsorship at that property is fresh, so you target gaps where rivals are still actively present, not just historically present.

Parameter Type Required Description
brand_name string yes The brand to check coverage for
segment string no Filter to a specific property segment
limit integer no Max results (default: 25)

sponsor_prospects

Finds prospective sponsors for a property -- brands active in similar properties (same segment, league, or region) that do not yet sponsor the target property.

Parameter Type Required Description
property_name string yes The property to find prospects for
limit integer no Max results (default: 25)

Returns: for each prospect, a healthy_similar_property_count alongside similar_property_count. The healthy count narrows the similarity score to properties whose scrape is currently fresh — useful for filtering rankings inflated by stale dormant sponsorships.

co_sponsorship_patterns

Identifies brands that frequently appear alongside a given brand at the same properties. Unlike competitors (same industry), co-sponsors are often complementary brands targeting similar audiences.

Parameter Type Required Description
brand_name string yes The brand to analyze
limit integer no Max results (default: 20)

Returns: each co-sponsor entry includes healthy_co_occurrence_count alongside co_occurrence_count — narrows the affinity signal to properties whose scrape is currently fresh, so you see current market affinity rather than historical noise.

property_comparison

Compares two properties side by side -- sponsor overlap, tier distribution, industry mix, and category gaps.

Parameter Type Required Description
property_a string yes First property name
property_b string yes Second property name

Returns: each property summary includes last_successful_scrape_at and a renewal_breakdown (active/at_risk/stale/inconclusive counts) — surfaces underlying scrape health so you don't compare a well-scraped property against a stale one without context.

industry_crossover

Analyzes which industries tend to co-sponsor at the same properties. Given an anchor industry, finds which other industries frequently appear alongside it.

Parameter Type Required Description
industry string yes The anchor industry to analyze
segment string no Filter to a specific property segment
limit integer no Max co-occurring industries to return (default: 15)

brand_overlap_matrix

Builds a pairwise property overlap matrix for multiple brands. Unlike find_competitors (single brand), this shows the full competitive landscape across the top N brands in an industry.

Parameter Type Required Description
industry string no Filter brands by industry
brand_names string no Comma-separated list of specific brands
limit integer no Max brands in matrix (default: 10)

Temporal Skills

Skills that leverage longitudinal scraping data to track changes over time.

trending_sponsors

Identifies brands with the most new sponsorships discovered within a recent period.

Parameter Type Required Description
days integer no Look-back period in days (default: 90)
limit integer no Max results (default: 20)

Returns: each brand entry includes healthy_sponsorship_count alongside new_sponsorship_count — the same count narrowed to sponsorships on properties with a fresh successful scrape. Compare the two to separate genuine momentum from scrape-resume bursts.

sponsorship_movement

Population-wide top-movers leaderboard by net sponsorship change (new wins minus AI-verified removals) over a time window, at the user's chosen granularity. Complements brand_portfolio_history (single-brand timeline) with cross-population comparison: "which brands grew the most last quarter?", "which leagues lost the most sponsors?", "what industries are growing fastest in NWSL?".

Parameter Type Required Description
scope string yes Dimension to aggregate by — one of brand, property, industry, segment, league

| direction | string | no | growing (positive net, sorted desc), shrinking (negative net, sorted asc), or both (default — non-zero movers sorted by |net|) | | from | string | no | Window start (ISO-8601 datetime) — pair with to | | to | string | no | Window end (ISO-8601 datetime) — pair with from | | days | integer | no | Window size in days from now (alternative to from/to). Default 90 | | limit | integer | no | Max movers (default 10, max 50) |

Returns: scope, direction, period (resolved window), total_movers, truncated, and movers — each row carries name, new_count (sponsorships first-seen in window, not removed), removed_count (sponsorships soft-removed in window via DataAuditAgent), net_change, and current_active_count for growth-rate context. Brand and property scopes also include id.

removed_count is the AI-verified churn signal (distinct from the timestamp-derived churned_sponsors skill). Visibility model matches the dashboard: quarantined brands, quarantined properties, and deleted/merged brands are excluded from all counts.

Example: "Top 5 brands by net portfolio gain in Q1 2026" → run_skill(sponsorship_movement, {scope: "brand", direction: "growing", from: "2026-01-01T00:00:00Z", to: "2026-03-31T23:59:59Z", limit: 5}) Example: "Which leagues lost the most sponsors in the last 90 days?" → run_skill(sponsorship_movement, {scope: "league", direction: "shrinking"})

churned_sponsors

Identifies sponsors whose last_seen_at has not been refreshed beyond a threshold, indicating likely dropped sponsorships.

Parameter Type Required Description
days integer no Stale threshold in days (default: 90)
property_name string no Filter to a specific property
segment string no Filter by segment
limit integer no Max results (default: 50)

This is the timestamp-derived churn signal — "we haven't seen this sponsorship on a scrape recently". For the AI-verified churn audit trail (deals the autonomous Data Audit Agent searched the web and concluded were genuinely lapsed, with citations), use removed_sponsorships instead. They're complementary: churned_sponsors is fast and probabilistic; removed_sponsorships is slow and definitive.

removed_sponsorships

Audit trail of sponsorships soft-removed by the Data Audit Agent — AI-verified "deal is dead" decisions with the agent's stated reason and full original metadata. Has two modes: flat (default — one row per removed sponsorship) and trend (pass granularity — a removal time-series grouped by property or brand).

Parameter Type Required Description
granularity string no "week" or "month". When set, switches to trend mode (removal counts bucketed over time). Omit for the flat row list.
group_by string no Trend mode only. "property" (default — which properties are losing sponsors) or "brand" (which brands are being removed).
brand_name string no Filter to one brand
property_name string no Filter to one property
reason_contains string no Case-insensitive substring match on removal_reason (e.g. "direction", "still_active")
from string no ISO-8601 datetime — filters removed_at >= from. In trend mode, the window lower bound (defaults to ~12 buckets back)
to string no ISO-8601 datetime — filters removed_at <= to. In trend mode, the window upper bound (defaults to now)
limit integer no Flat mode: max rows (default 50, max 200). Trend mode: max groups (default 20, max 200)

Returns (flat mode): mode: "flat", filters (echoed), total_results, truncated, and removed_sponsorships — each row carries sponsorship_id, brand {id, name}, property {id, name}, tier, source_url, source_type, first_seen_at, last_seen_at, removed_at, removal_reason. Newest-first.

Returns (trend mode): mode: "trend", granularity, group_by, filters (echoed), period {from, to, buckets} (the resolved bucket window), total_groups, truncated, and groups — each carries id, name (the brand or property), total_removed, and a dense, zero-filled series of {bucket_start, removed_count}. Ranked by total_removed desc. The property side is the analog to brand_portfolio_history's weekly removed series (computed live from removed_at); a property's removed_count = distinct sponsors lost in that bucket.

Example: "Show me everything the agent removed for Pisa Pain in the last 30 days." → run_skill(removed_sponsorships, {brand_name: "Pisa Pain", from: "2026-04-18T00:00:00Z"}) Example: "List sponsorships removed under reason 'direction reversed'." → run_skill(removed_sponsorships, {reason_contains: "direction reversed"}) Example: "Plot weekly sponsorship removals per property this quarter." → run_skill(removed_sponsorships, {granularity: "week"}) Example: "Which brands get removed the most, month over month?" → run_skill(removed_sponsorships, {granularity: "month", group_by: "brand"})

new_entrants

Identifies brands new to sports sponsorship -- those where all sponsorships were first seen within a recent window.

Parameter Type Required Description
days integer no Look-back period in days (default: 90)
industry string no Filter by industry
limit integer no Max results (default: 25)

Returns: each brand entry includes a healthy_sponsorship_count alongside sponsorship_count so you can filter scrape-resume artifacts (a brand looking "new" only because its property just resumed scraping after a gap) from genuine net-new entrants.

For brands new to a SPECIFIC segment, league, or region (rather than sports overall), use segment_newcomers.

segment_newcomers

Identifies brands new to a specific scope — a segment, league, or region — within a recent window. Distinct from new_entrants (which is about being new to sports overall): a brand can be a long-time NFL sponsor and a brand-new NWSL sponsor at the same time. This skill surfaces that signal.

Two modes driven by whether brand_name is provided:

  • Discovery (no brand_name) — returns a ranked list of brands newcomers to the scope.
  • Check (brand_name provided) — returns is_newcomer: true | false for that single brand with supporting context.

At least one of segment, league, or region is required.

Parameter Type Required Description
segment string one of three Property segment to scope (e.g. "nwsl")
league string " Property league to scope (e.g. "NWSL")
region string " Property region to scope (e.g. "Southeast")
brand_name string no If set, single-brand check mode
days integer no Window in days (default: 90)
industry string no Filter newcomers by industry (discovery only)
limit integer no Max results (default: 25, discovery only)

Returns: in both modes, a prior_sponsorships_outside_scope count tells you whether the brand has prior sponsorship history elsewhere — non-zero means "expanding into a new vertical", zero means "net-new to sports". Discovery mode also returns a per-brand healthy_sponsorship_count for the same scrape-resume filtering as new_entrants.

Example: "Which brands appeared in NWSL for the first time in the last 90 days?" Example: "Is Modelo new to women's soccer?" → run_skill(segment_newcomers, {segment: "nwsl", brand_name: "Modelo"})

brand_momentum

Analyzes a brand's sponsorship acquisition rate over time. Classifies momentum as accelerating, decelerating, steady, new_entrant, or inactive.

Parameter Type Required Description
brand_name string yes The brand to analyze
months integer no Analysis window in months (default: 6)

Returns: each monthly_activity entry includes new_on_healthy_properties alongside new_sponsorships — the same monthly count narrowed to sponsorships on properties with a fresh successful scrape. Sanity-check the momentum classification against this subcount when the brand's properties are mostly unhealthy.

renewal_tracker

Categorizes sponsorships by freshness relative to the scrape cycle. Catches at-risk deals before they fully churn.

  • active -- last seen within the last scrape cycle (healthy)
  • at_risk -- last seen 1-3 cycles ago (warning)
  • stale -- last seen 3+ cycles ago (likely dropped)
Parameter Type Required Description
league string no Filter by league
segment string no Filter by segment
property_name string no Filter to a specific property

deal_tenure_analysis

Analyzes how long sponsorships have been active using first/last seen dates. Provides average tenure grouped by tier, league, or industry.

Parameter Type Required Description
group_by string no Group results by: tier, league, or industry (default: tier)
league string no Filter by league
segment string no Filter by segment

Returns: each entry in longest_deals and shortest_deals includes a renewal_status field for freshness context — tenure numbers can look "frozen" on properties whose scrape is unhealthy, and the renewal status flags those rows.

Analytics Skills

Skills that provide portfolio-level and market-level analysis.

geographic_analysis

Analyzes regional sponsorship patterns. Can show a brand's geographic spread, a region's sponsor makeup, or overall market distribution by region.

Parameter Type Required Description
brand_name string no Analyze one brand's geographic spread
region string no Analyze one region's sponsor makeup
industry string no Filter by industry

Provide brand_name for a brand's regional coverage and gaps, region for a region deep-dive, or neither for a market-wide geographic overview.

Returns: all three modes include healthy_sponsorship_count per region (or per brand in region-mode) alongside sponsorship_count — narrows to sponsorships on properties whose scrape is currently fresh, distinguishing genuine current geographic presence from stale historical data.

white_space_finder

Surfaces market WHITE SPACE — untapped (zero-deal) and under-served combinations between two canonical dimensions. Builds the canonical cross-tab (same data as the get_market_map tool), then reports the gaps every other tool hides. Market-structural, not entity-anchored — complements the brand-specific coverage_gaps / property_gap_finder.

Parameter Type Required Description
dimension_a string no First canonical axis: industry, segment, league, region, tier, activation, sponsorship_type (default: industry)
dimension_b string no Second canonical axis, same options (default: segment)
limit integer no Max rows in each list (default: 20, max: 100)

Returns: white_space (bucket pairs with zero deals between them, ranked by combined volume — the biggest "nobody bridges these two yet" gaps), thin_pairings (existing pairings with the fewest deals), and a summary of bucket/pairing counts.

property_gap_finder

Finds properties that are underselling compared to their peers -- properties with fewer sponsors than the segment/league average. Flags opportunities for sales outreach.

Parameter Type Required Description
segment string no Scope to a segment
league string no Scope to a league
min_gap_pct integer no Minimum gap below peer average to flag (default: 25)
limit integer no Max results (default: 20)

portfolio_health

Analyzes a property's sponsor portfolio health -- tier distribution, industry diversity, staleness, and a computed health score.

Parameter Type Required Description
property_name string yes The property to analyze
stale_days integer no Staleness threshold in days (default: 90)

Returns: tier distribution, industry distribution, segment-average comparison, a composite health score, and:

  • renewal_breakdown -- {active, at_risk, stale, inconclusive} bucket counts. When the property's own scrape is unhealthy, at-risk and stale counts collapse into inconclusive.
  • property.last_successful_scrape_at -- most recent scrape that produced usable sponsors
  • property.last_enriched_at -- most recent AI enrichment across the property's sponsorships
  • Each entry in stale_sponsors carries a renewal_status field

brand_portfolio_summary

Generates a comprehensive portfolio summary for a brand -- tier breakdown, segment distribution, league spread, regional coverage, and industry peer comparison.

Parameter Type Required Description
brand_name string yes The brand to summarize

Returns: the breakdowns above plus renewal_breakdown (deals grouped by renewal status across the brand's portfolio). newest_sponsorship and oldest_sponsorship each include a renewal_status field.

brand_spend_estimate

Rolls a brand's bucketed estimated_value deals into a single annual-spend figure. Sums the bucket low / midpoint / high boundaries across all of the brand's sponsorships, with a validator-coverage breakdown so callers can gauge how much of the estimate is Sonnet-confirmed vs Haiku-only.

Parameter Type Required Description
brand_name string yes The brand to estimate annual sponsorship spend for
include_unvalidated boolean no Include deals where only Haiku ran (no Sonnet validator rationale). Default false — totals reflect validator-confirmed buckets only.

Returns: brand, sponsorship_count, priced_sponsorship_count, total_estimated_annual_spend: {low, midpoint, high}, bucket_distribution, validator_coverage: {validated, low_confidence, proposer_only, avg_confidence}, and per_sponsorship[] — each row contains property_name, tier, bucket, confidence, midpoint_estimate, validator_ran, rationale (Sonnet's free-text grounding for the bucket), and model (which model + outcome produced it).

Bucket midpoints are coarse by design — <$50K → $25K, $50K-$100K → $75K, $100K-$500K → $300K, $500K-$1M → $750K, $1M-$5M → $3M, $5M+ → $7.5M. This is a portfolio-level "whale or fish" answer, not a quote-grade number.

industry_benchmark

Benchmarks a brand's sponsorship portfolio against its industry peers -- sponsorship count, tier distribution, and segment coverage vs the industry average.

Parameter Type Required Description
brand_name string yes The brand to benchmark

market_overview

Provides a high-level overview of the entire sponsorship market -- totals, tier distribution, most active industries, top properties, top brands, and month-over-month growth.

Parameter Type Required Description
top_n integer no Number of top items to return per category (default: 10)

property_attractiveness

Ranks properties by attractiveness using sponsor count, title-tier ratio, and industry diversity. Computes a composite attractiveness score.

Parameter Type Required Description
segment string no Filter by segment
league string no Filter by league
limit integer no Max results (default: 25)

Enrichment Skills

Skills that leverage AI-enriched data for deeper analysis.

activation_exclusivity

Analyzes whether a brand holds exclusive sponsorship activations at its properties. Classifies each property position as exclusive (sole brand in activation), shared (1-2 others), or crowded (3+ others).

Parameter Type Required Description
brand_name string yes The brand to analyze

Returns: each property entry includes healthy_competitor_count and healthy_status alongside competitor_count and statushealthy_* versions only count activation competitors whose own sponsorship is currently fresh. A position listed as crowded with healthy_status: "exclusive" has 3+ historical activation competitors but none currently active. The summary block also includes healthy_exclusive, healthy_shared, healthy_crowded, and healthy_exclusivity_rate.

high_value_prospects

Identifies large companies (enterprise/public with high revenue) that have few or no sponsorships -- brands with budget capacity that are under-indexed in sports sponsorship.

Parameter Type Required Description
min_revenue string no Minimum revenue tier (e.g., $100M-$1B, $1B+)
industry string no Filter by industry
limit integer no Max results (default: 25)

Returns: each prospect entry includes healthy_sponsorship_count alongside sponsorship_count. A prospect with sponsorship_count: 5 but healthy_sponsorship_count: 0 is just as untapped as one with zero sponsorships — the historical deals are on properties we can no longer scrape.

sponsorship_type_breakdown

Analyzes the distribution of sponsorship types across the market (naming rights, presenting, signage, digital, community, etc.) grouped overall, by league, or by segment.

Parameter Type Required Description
group_by string no Group by: overall, league, or segment (default: overall)
segment string no Filter by segment
league string no Filter by league

activation_market_map

Maps sponsorship activations across the market. Shows which activations are most contested vs have openings at specific properties or leagues.

Parameter Type Required Description
league string no Filter by league
segment string no Filter by segment
limit integer no Max activations to return (default: 20)

deal_intelligence

Sales pitch preparation tool. Given a brand and/or property, finds comparable deals, suggests tier positioning, identifies competitors already present, and surfaces opportunity signals like category exclusivity and open tier slots.

Parameter Type Required Description
brand_name string no The brand being pitched
property_name string no The target property
industry string no Industry for comparable deals (defaults to brand's industry)
segment string no Property segment for comparable deals

At least one of brand_name or property_name is required.

Returns: comparable deals, suggested tier positioning, competitors at the target property, and opportunity signals. Renewal-aware fields:

  • property_sponsors_by_renewal -- bucket counts across the target property's current roster
  • Each entry in competitors_at_property carries a renewal_status so you can see which same-industry incumbents are vulnerable
  • An opportunity signal fires when the target property has at-risk or stale same-industry sponsors: "N Industry competitor(s) at risk or stale (Foo, Bar) — category may be opening"
  • Each entry in comparable_deals includes a sources list -- up to 5 primary-source URLs (press releases, news articles, partner pages) that evidenced each deal, so pitch decks can cite directly

Example: "Prepare a pitch for Best Nutrition to sponsor the North Carolina Courage" Example: "Show me comparable healthcare sponsorships and cite the press for each"

source_intelligence

Analyzes data source quality and distribution -- which source URLs produce the most sponsors, which extraction methods are most effective, and which properties have the lowest confidence scores. Also surfaces per-sponsor citation coverage (the rate at which Claude's web search attributes specific URLs to specific sponsors) and the most-cited URLs and domains across the corpus, so you can see which outlets (press releases, Sportico, Forbes, etc.) supply the most evidence.

Parameter Type Required Description
property_name string no Scope to a specific property
league string no Scope to a specific league
limit integer no Max results per section (default: 20)

Returns:

  • top_sources -- source URLs ranked by sponsor count, with average confidence
  • extraction_method_distribution -- counts and avg confidence per method (ai_page / web_search)
  • confidence_by_property -- properties with the lowest average confidence, low-confidence counts
  • citation_coverage -- per-method {total, with_citations, coverage_percent} showing how often each extraction path attaches URLs to individual sponsors. Surfaces the web-search compliance gap (often 50-70%) vs. HTML back-fill (100%).
  • top_cited_urls -- individual URLs cited across the most raw sponsors (deduped per-sponsor)
  • top_cited_domains -- host-level rollup (forbes.com, sportico.com, etc.) so you can see outlet-level patterns rather than per-article detail

Example: "Which external outlets are driving our Angel City FC citations?" Example: "What's our citation coverage by extraction method across the NWSL?"

Live-Research Skills

The three skills below exist primarily to drive the live-research pattern (see "Live Research Pattern" near the top of this doc). Each returns the deep research_protocol block — a purpose, a list of pre-computed search queries with extraction schemas, and an output schema describing how Claude should structure the synthesis.

pitch_brief_for_brand

Sales-ready pitch brief for a brand. Returns the brand's known sponsorship portfolio with sources, plus a research_protocol Claude is meant to execute via live web search to add what our DB can't know — recent deal announcements, marketing-budget signals, exec changes, and RFP/open-inventory signals at a top property.

Parameter Type Required Description
brand_name string yes The brand to build a pitch brief for

Returns:

  • brand — id, name, industry, hq_location, company_size, revenue_range, description
  • portfolio — each known sponsorship with property metadata, tier, dates, renewal_status, and sources (primary-source URLs)
  • portfolio_summary — counts by segment, tier, renewal status; covered segments
  • competing_categories — same-industry brands sharing properties (category-exclusivity angles)
  • research_protocol — 3–4 pre-computed live-research queries with extract schemas plus an output_schema describing the synthesis Claude should produce

Example: "Give me a pitch brief for Nike" Example: "What's the live-research checklist for selling Coca-Cola on a new NWSL deal?"

compare_with_live

Returns SponserdIQ's last-known sponsor list for a property as a baseline and a research_protocol instructing the calling Claude to live-search the property's CURRENT sponsors and emit a structured diff (added / removed / unchanged / uncertain). Inverts the usual flow — our DB is treated as ground truth and the world gets checked against it.

Parameter Type Required Description
property_name string yes The property to diff against live web results

Returns:

  • property — id, name, segment, league, region, last_successful_scrape_at, last_web_search_at
  • baselinesnapshot_taken_at (latest of HTML scrape and web search) and a list of known sponsors with brand_name, industry, tier, dates, sources
  • research_protocol — 3 queries (current sponsors directory, recent partner announcements, departed-sponsor signals) plus a diff_schema defining added / removed / unchanged / uncertain

Example: "Compare Angel City FC's current sponsors against what we have" Example: "What's changed at Atlanta United FC since our last scrape?"

challenge_protocol

Takes a structured claim about a sponsorship (existence, tier, or active) and returns SponserdIQ's supporting evidence plus a challenge_protocol of falsifying live web-search queries. The calling Claude runs the queries, weighs contradictions vs corroborations, and emits a calibrated verdict — lets users get confidence-rated answers instead of accepting the DB at face value.

Parameter Type Required Description
brand_name string yes The brand named in the claim
property_name string yes The property named in the claim
claim_type enum yes sponsorship_exists | tier | active
claim_detail string conditional Required when claim_type is tier (e.g. "title")

Returns:

  • claim — echoed back
  • our_evidencematching_sponsorships (tier, dates, sources per match) and confidence_signals (citation_count, most_recent_evidence_at, extraction_methods)
  • challenge_protocol — the research_protocol shape, with queries deterministic per claim_type:
    • All claim types: sponsorship_ended, official_directory_check (skipped if property has no website_url)
    • Tier claims add: contradictory_holder, tier_downgrade, competitor_signed
  • falsification_schema — describes the verdict shape Claude should emit (verdict / contradictions / corroborations / confidence)

Example: "Verify that Nike is the title sponsor of Angel City FC" Example: "Is Coca-Cola's sponsorship of the Lakers still active?"

Deal-Level Skills

Skills that surface deal-specific fields (notes, estimated value, tenure) and feedback/QA context.

search_deals

Searches sponsorships by the rich fields the main search_sponsorships tool doesn't expose — deal notes, estimated-value substring, and deal tenure (days between first_seen_at and last_seen_at). At least one filter is required.

Parameter Type Required Description
notes_contains string no Case-insensitive substring match on deal_notes
value_contains string no Case-insensitive substring match on estimated_value (free-form string like "$5M/year")
min_tenure_days integer no Minimum days between first_seen_at and last_seen_at
max_tenure_days integer no Maximum days between first_seen_at and last_seen_at
limit integer no Max rows (default 25, max 100)

Returns: results (with brand_name, property_name, tier, deal_notes, estimated_value, tenure_days, renewal_status, timestamps), total_count, and the applied limit.

Example: "Find deals worth over $5M" / "Show me deals that mention naming rights."

get_feedback_activity

Read-side companion to the log_feedback tool — surfaces open-feedback counts and recent entries for a brand or property. At least one of brand_name / property_name must be provided.

Parameter Type Required Description
brand_name string conditional Brand alias (case-insensitive)
property_name string conditional Property name (case-insensitive)
limit integer no Max recent entries (default 10, max 50)

Returns: brand / property scope info, open_count, and entries (category, status, truncated message, timestamp).

Example: "Is anyone flagging data issues on Pepsi?"

low_confidence_extractions

Raw-sponsor extractions below a confidence threshold (and/or flagged needs_review). Review queue for data-quality triage.

Parameter Type Required Description
property_name string no Scope to a specific property
min_confidence number no Minimum confidence (default 0.0)
max_confidence number no Maximum confidence (default 0.7)
only_needs_review boolean no If true, only rows with needs_review: true
limit integer no Max rows (default 25, max 100)

Returns: property scope, filters (echoed), total_count, limit, and extractions with brand_raw, confidence, needs_review, review_reason, extraction_method, source_url, truncated context_text, and classified flag.

Example: "Show me the review queue for Angel City FC."

Cross-Set / Ad-Hoc Query Recipes

Named shortcuts layered on top of the query_sponsorships tool. Each skill below is a thin recipe with pre-baked filters / exclude_filters / group_by / having shapes — use them when an English-named shortcut beats assembling raw query params.

market_presence_gap

Brands active in one scope (A) but absent from another (B). The classic anti-join question ("brands sponsoring in Charlotte but not Greenville?").

Parameter Type Required Description
scope_type string yes region / league / segment / industry / property_name
scope_a string yes Included scope (brands must be present)
scope_b string yes Excluded scope (brands must be absent)
min_sponsorships integer no Minimum sponsorships in A (default 1)
limit integer no Max brands (default 25)

Returns: brands: [{brand_name, count_in_scope_a}], plus echoed scope params and warnings.

top_by_scope

Top-N values of a dimension within an optional scope, ranked by sponsorship count.

Parameter Type Required Description
group_by string yes brand_name / industry / property_name / tier / sponsorship_type
scope_type string no region / league / segment / industry / property_name; omit for global
scope_value string conditional Required iff scope_type is set
limit integer no Default 10, max 100

Returns: rows: [{value, count}], plus scope description ("global" or "region=Southeast").

brands_above_threshold

Brands with ≥ N sponsorships, optionally scoped.

Parameter Type Required Description
min_count integer yes Threshold (≥1)
scope_type string no region / league / segment / industry / property_name
scope_value string conditional Required iff scope_type is set
limit integer no Default 25, max 200

Returns: brands: [{brand_name, sponsorship_count}], sorted desc by count.

Discovery Skills

suggest_next_queries

Deterministic follow-up suggester — maps an intent keyword in the context string to a curated list of next-question suggestions, each with a tool/skill chain. No AI call; cheap and predictable.

Parameter Type Required Description
context string yes Free-form topic, summary, or recent-result description
max_suggestions integer no Max suggestions (default 5, max 20)

Returns: context (echoed) and suggestions (each with suggestion text and a tools array). Falls back to a stable 3-entry list (brand_snapshot, property_snapshot, resolve_entity, get_example_questions) when nothing matches.

Example: "What should I look at next after finding Nike's competitors?"

Segment / Market Skills

Scope-focused siblings to market_overview and new_entrants.

segment_snapshot

Segment-scoped market overview — total sponsorships, top brands, top properties, industry diversity, new-this-period count, and renewal bucket counts within a specific segment.

Parameter Type Required Description
segment string yes Property segment (e.g., womens_soccer, mens_football)
region string no Optional region filter — city, state, or macro-region (canonical+fuzzy). E.g. "Charlotte", "North Carolina", "Southeast".
top_n integer no Top-N per category (default 10, max 50)
months integer no Window for new-this-period count (default 3)

Returns: segment, total_sponsorships, top_brands, top_properties, industries, new_this_period, renewal_counts.

Example: "Give me a market snapshot of NWSL."

first_mover_advantage

For a segment, league, or region, rank brands by the earliest first_seen_at on any sponsorship in that scope — identifies who pioneered the category.

Parameter Type Required Description
segment string conditional Property segment
league string conditional Property league
region string conditional Property region (city, state, or macro-region; canonical+fuzzy)
limit integer no Max brands (default 20, max 100)

At least one of segment / league / region is required.

Returns: filters (echoed), total, first_movers (brand_name, industry, earliest_first_seen_at, tenure_days, sponsorship_count in scope).

Example: "Who were the first Apparel brands to enter NWSL?"

industry_concentration

Property-level market-concentration diagnostic — Herfindahl–Hirschman Index (HHI) over the brand-industry distribution. Bands follow DOJ/FTC guidelines: <1500 diverse, 1500–2500 moderately_concentrated, >2500 highly_concentrated. Works in property mode (full breakdown) or scope mode (per-property summary).

Parameter Type Required Description
property_name string conditional Single-property mode
segment string conditional Scope mode — per-property summaries
league string conditional Scope mode — per-property summaries
region string conditional Scope mode — filter to a region (city, state, or macro-region; canonical+fuzzy)
limit integer no Max properties in scope mode (default 25, max 100)

At least one of property_name, segment, league, or region is required.

Returns (property mode): property, total_sponsorships, industry_count, industry_distribution, hhi, concentration_band. Returns (scope mode): filters, total, properties (each with hhi and concentration_band), ordered desc by HHI.

Example: "How diverse is the Lakers' sponsor base?" / "Which NWSL properties are most industry-concentrated?"

Timeline / Peer Skills

brand_timeline

Chronological view of a brand's sponsorship history — every sponsorship ordered by first_seen_at, annotated with tenure-to-date and current renewal status. Great for pitch prep and storytelling.

Parameter Type Required Description
brand_name string yes The brand to timeline
region string no Optional region filter — city, state, or macro-region (canonical+fuzzy)
limit integer no Max events (default 50, max 200)

Returns: brand (basic info), total_events, timeline (each event with property, league, segment, tier, first_seen_at, last_seen_at, tenure_days, current_renewal_status).

Example: "Show me Pepsi's sponsorship timeline."

brand_portfolio_history

Weekly historical portfolio metrics for ONE brand, sourced from the brand_sponsorship_history weekly snapshot table. Returns up to two years of week-by-week counts so you can plot trends and answer "how has the portfolio shape changed?". Complements brand_timeline (per-sponsorship event log) with portfolio-level aggregate trajectories.

Parameter Type Required Description
brand_name string yes The brand to chart
weeks integer no Number of recent weeks to return (default 12, max 104). Ignored when from/to are provided.
from string no Optional ISO-8601 start date (YYYY-MM-DD). Filters week_start >= from.
to string no Optional ISO-8601 end date (YYYY-MM-DD). Filters week_start <= to.

Returns: brand (basic info), total_weeks, snapshots — each row carries week_start, total, active, at_risk, stale, new, churned, removed, industry_at_capture. Ordered newest-first.

Metric semantics:

  • total / active / at_risk / stale — stock metrics describing the living portfolio at snapshot time. Excludes soft-removed sponsorships.
  • new — flow: sponsorships first seen in the 7-day window before snapshot time.
  • churned — flow: sponsorships whose last_seen_at crossed into stale within the last 30 days (timestamp-derived staleness proxy).
  • removed — flow: sponsorships soft-removed by the Data Audit Agent in the last 7 days (AI-verified deaths with citations). Net portfolio change per week = new - removed.

Example: "How has Coca-Cola's at-risk count trended over the last 6 months?" → run_skill(brand_portfolio_history, {brand_name: "Coca-Cola", weeks: 26}) Example: "How many sponsorships did Nike lose to AI-verified churn last quarter?" → run_skill(brand_portfolio_history, {brand_name: "Nike", from: "2026-01-01", to: "2026-03-31"})

peer_comparison

Given a brand, auto-identifies peers in the same industry + similar company_size/revenue_range and compares portfolio size and segment spread side-by-side. Answers "how are we doing relative to peers?" without the user naming them.

Parameter Type Required Description
brand_name string yes The anchor brand
top_peers integer no Max peers (default 5, max 20)

Returns: anchor (brand + portfolio stats) and peers (each with industry, portfolio stats, segment/league lists).

Example: "How does Nike's portfolio compare to its peers?"

compare_brands

Side-by-side comparator for 2–3 brands — portfolio sizes, segment/league spread, and pairwise shared-property counts. Complements challenge_protocol (tactics) with a vanilla diff view.

Parameter Type Required Description
brand_names array or string yes List of 2–3 brand names (array or comma-separated string)

Returns: brands (each with industry, company_size, revenue_range, total_sponsorships, leagues, segments) and pairwise_overlap (every pair with shared_property_count).

Example: "Compare Nike, Adidas, and Puma side by side."

Renewal / Health Skills

renewal_calendar

Upcoming renewal-risk schedule — currently-active sponsorships bucketed by weeks until they'd cross the at-risk cutoff if no refresh lands. Sales forecasting gold: turns raw last_seen_at dates into "call these N accounts in the next M weeks".

Parameter Type Required Description
segment string no Scope to a segment
league string no Scope to a league
region string no Scope to a region (city, state, or macro-region; canonical+fuzzy)
brand_name string no Scope to a brand
weeks_ahead integer no Window in weeks (default 8, max 26)

Returns: filters (echoed), total_projected, buckets (each with weeks_out, deal_count, deals array including projected_at_risk_at).

Example: "Which NFL deals are coming up for renewal in the next 8 weeks?"

data_freshness_report

Per-property scrape + enrichment health diagnostic — last_successful_scrape_at, last_enriched_at, scrape-unhealthy flag, inconclusive-renewal count, and a recommended action (healthy / rescrape / rescrape_and_reenrich / no_sponsorships). Useful for triaging data-quality concerns.

Parameter Type Required Description
segment string no Scope to a segment
league string no Scope to a league
region string no Scope to a region (city, state, or macro-region; canonical+fuzzy)
limit integer no Max properties (default 25, max 100)

Returns: filters, total, properties (each with health timestamps, sponsorship_count, inconclusive_count, scrape_unhealthy flag, recommendation), and scrape_health_cutoff.

Example: "Which properties have stale scrape data?"

Cluster / Embedding Skills

These act on the discovered (k-means) embedding clusters behind the get_discovered_clusters tool — the emergent behavioral grouping, not the canonical taxonomy. They need a clustering run to have populated embedding_clusters; until then they degrade to a note.

cluster_discovery_for_entity

Shows which discovered cluster a brand or property belongs to (index, label, size) plus the top co-members ranked by cosine closeness. Cluster navigation from any single entity. Distinct from similar_entities (continuous k-NN): this is the entity's HARD k-means assignment.

Parameter Type Required Description
entity_name string yes The brand or property
entity_type string no brand, property, or auto (default)
limit integer no Max co-members (default 10, max 50)

Returns: entity, cluster {index, label, size}, and ranked members ({id, name, similarity}). cluster: nil + a note when unassigned.

cluster_gap_analysis

For ONE brand, find its cluster, then the properties (and a roll-up by any canonical dimension) that its cluster PEERS sponsor but it does NOT — ranked by peer support. The embedding-cluster analogue of coverage_gaps/find_competitors, which rank by shared properties instead.

Parameter Type Required Description
brand_name string yes The brand to analyze
gap_by string no Roll-up dimension (default: segment)
limit integer no Max gap properties (default 20, max 100)
peer_limit integer no Max cluster peers (default 200, max 500)
min_peer_support integer no Min peers backing a gap (default 2)

Returns: cluster, peer_count, gaps (per-property peer support + example peers + top tier), gap_by_dimension.

cluster_peer_benchmarking

Benchmark a brand's portfolio against the other brands in its cluster — "typical or outlier?". Compares portfolio size and per-dimension breadth/mix (tier distribution, segment spread, geographic reach) to the cluster norm across any of the 7 dimensions.

Parameter Type Required Description
brand_name string yes The brand to benchmark
dimensions array no Subset of dimensions (default: all 7)
peer_limit integer no Max cluster peers (default 200, max 500)

Returns: brand_profile, cluster_norms, and deviations (per metric: brand value, cluster mean, ratio, verdict typical/outlier_high/outlier_low).

cross_cluster_bridge_finder

Find entities bridging two behavioral groups. CLUSTER mode (two discovered-cluster refs): property clusters → bridging brands, brand clusters → bridging properties. CATEGORY mode (two canonical sides): brands active on both (e.g. industry=Automotive × segment=Esports). Ranked by min(side_a_deals, side_b_deals).

Parameter Type Required Description
cluster_a / cluster_b string cluster mode Cluster refs (pclus:3/bclus:3 or index)
cluster_type string no Pile for plain indices (default: property)
dimension_a + value_a string category mode First canonical side
dimension_b + value_b string category mode Second canonical side
limit integer no Max bridges (default 25, max 100)

Returns: mode, bridge_entity, side_a/side_b echoes, bridge_count, ranked bridges (id, name, side deal counts, balance_score).

property_cluster_prospects

Seller-side mirror of cluster_gap_analysis. For a property, finds the BRANDS sponsoring its cluster-peer properties that it lacks — a ready-made prospect list, ranked by peer-property support. The embedding-cluster analogue of sponsor_prospects (taxonomy-based); distinct from property_gap_finder (segment-average scan).

Parameter Type Required Description
property_name string yes The property (seller) to prospect for
gap_by string no Roll-up dimension (default: industry)
limit integer no Max prospect brands (default 20, max 100)
peer_limit integer no Max cluster-peer properties (default 200, max 500)
min_peer_support integer no Min peer properties a prospect is on (default 2)

Returns: cluster, peer_count, ranked prospects (per brand: peer_support + example_properties + top_tier they buy at), prospects_by_dimension.

property_cluster_benchmarking

Seller-side mirror of cluster_peer_benchmarking. Benchmarks a property's sponsor base against its embedding-cluster peer properties — "am I typical, or under-monetized vs the properties most like me?" Compares sponsor count + per-dimension sponsor-base breadth/mix to the cluster norm across all 7 dims.

Parameter Type Required Description
property_name string yes The property to benchmark
dimensions array no Subset of dimensions (default: all 7)
peer_limit integer no Max cluster-peer properties (default 200, max 500)

Returns: property_profile (sponsor_count + per-dim distinct + top), cluster_norms, and deviations (per metric: property value, cluster mean, ratio, verdict).

Segment Landscape & Routing Skills

segment_competitive_landscape

Competitive landscape for a canonical dimension value broken down by another dimension: leading breakdown values, concentration (HHI), and over/under-indexing vs the overall market. Both dimensions accept any of the 7 canonical dimensions; pass scope_values to pool segments.

Parameter Type Required Description
scope_value / scope_values string / array yes (one) The dimension value(s) to analyze
scope_dimension string no Dimension the scope belongs to (default: segment)
breakdown_dimension string no Dimension to break down by (default: industry)
limit integer no Max top rows (default 25, max 100)

Returns: top (count + scope_share + market_share + index per value), over_indexed/under_indexed, hhi + concentration_band, scope/market totals.

recommend_analysis

Meta router. Given a scope (a brand, property, or canonical dimension value), computes cheap data-shape signals (volume, concentration, tier diversity, spread, cluster/embedding presence, staleness) and recommends which skills to run, in priority order, with reasons and suggested params.

Parameter Type Required Description
entity_name string one scope A brand or property to profile
entity_type string no brand, property, or auto
dimension + value string one scope A canonical dimension value scope

Returns: scope, signals, and ordered recommendations ({skill, reason, suggested_params}).

Seller-Side Parity Mirrors

Property-anchored mirrors of buyer-anchored skills, so a rights-holder gets the same intelligence pointed the other way. Each takes property_name.

find_property_competitors

Mirror of find_competitors. The OTHER properties sharing the most SPONSORS with yours (rivals for the same sponsor dollars), ranked by overlap. Unlike property_comparison (compare two named properties), this discovers them.

Returns: property, ranked competitors (overlap_count, healthy_overlap_count, shared_sponsors), total_sponsors.

property_timeline

Mirror of brand_timeline. A property's sponsors ordered by first_seen_at with sponsor brand + industry, tenure, and renewal status. Optional industry filter. Pitch-prep storytelling.

Returns: property, total_events, timeline.

property_revenue_estimate

Mirror of brand_spend_estimate. Rolls a property's bucketed sponsorship estimated_values into total annual revenue (low/midpoint/high) + validator coverage. "What's my book worth?" Optional include_unvalidated.

Returns: property, sponsorship counts, total_estimated_annual_revenue, validator_coverage, bucket_distribution, per_sponsorship.

property_momentum

Mirror of brand_momentum. A property's sponsor-acquisition rate recently vs historical → accelerating | decelerating | steady | new_entrant | inactive. Optional months (default 6).

Returns: property, momentum, recent_avg_per_month, historical_avg_per_month, total_new_sponsors, monthly_activity.