{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/audioalpha-io/json-schema/audioalpha-io-personalized-feed-schema.json",
  "title": "PersonalizedFeed",
  "x-generated": "2026-11-02",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/audioalpha-io-openapi.json#/components/schemas/PersonalizedFeed",
  "type": "object",
  "properties": {
    "snapshot_date": {
      "type": "string",
      "description": "Date of the feed snapshot",
      "format": "date"
    },
    "status": {
      "type": "string",
      "description": "Generation status of the parent daily snapshot. \"completed\" once the snapshot has finished generating (the normal case); \"writing\" while it is being (re)generated, typically during the 00:00–00:01 UTC build window. Always present in the response."
    },
    "assets": {
      "type": "array",
      "description": "Array of favorited assets with their daily snapshots, signals, and quotes",
      "items": {
        "$ref": "#/$defs/FeedAssetEntry"
      }
    },
    "podcasts": {
      "type": "array",
      "description": "Array of favorited podcast with their latest episodes",
      "items": {
        "$ref": "#/$defs/FeedPodcastEntry"
      }
    }
  },
  "$defs": {
    "Episode": {
      "type": "object",
      "properties": {
        "episode_id": {
          "type": "string",
          "description": "Unique episode identifier"
        },
        "display_title": {
          "type": "string",
          "description": "Episode title"
        },
        "subtitle": {
          "type": "string",
          "description": "Episode subtitle"
        },
        "published_utc_date": {
          "type": "string",
          "description": "Publication date in UTC",
          "format": "date"
        },
        "duration_seconds": {
          "type": "integer",
          "description": "Episode duration in seconds"
        },
        "crypto_sentiment_score": {
          "type": "number",
          "description": "α-sentiment score for the episode (0-10 scale)"
        },
        "market_sentiment_category": {
          "type": "string",
          "description": "α-sentiment category (bearish/neutral/bullish)"
        },
        "trad_sentiment_score": {
          "type": "number",
          "description": "Sentiment about traditional financial markets, not crypto (0-10 scale)"
        },
        "transcript_summary": {
          "type": "string",
          "description": "Summary of the episode transcript"
        },
        "mp3_url": {
          "type": "string",
          "description": "URL to the episode mp3",
          "format": "uri"
        },
        "episode_artwork": {
          "type": "string",
          "description": "URL to episode artwork image",
          "format": "uri"
        }
      }
    },
    "FeedAssetEntry": {
      "type": "object",
      "properties": {
        "ticker": {
          "type": "string",
          "description": "Asset ticker symbol — crypto tickers are suffixed with \"-USD\" (e.g. ETH-USD)"
        },
        "snapshot": {
          "allOf": [
            {
              "$ref": "#/$defs/FeedAssetSnapshot"
            }
          ],
          "description": "Daily snapshot data for the asset (null if no mentions)"
        },
        "signals": {
          "type": "array",
          "description": "Trading signals for this asset",
          "items": {
            "$ref": "#/$defs/FeedSignal"
          }
        },
        "quotes": {
          "type": "array",
          "description": "Relevant quotes about this asset",
          "items": {
            "$ref": "#/$defs/FeedQuote"
          }
        }
      }
    },
    "FeedAssetSnapshot": {
      "type": "object",
      "properties": {
        "ticker": {
          "type": "string",
          "description": "Asset ticker symbol — crypto tickers are suffixed with \"-USD\" (e.g. ETH-USD)"
        },
        "status": {
          "type": "string",
          "description": "Generation status of the parent daily snapshot. \"completed\" once the snapshot has finished generating (the normal case); \"writing\" while it is being (re)generated, typically during the 00:00–00:01 UTC build window. Always present in the response."
        },
        "episode_count": {
          "type": "integer",
          "description": "Number of episodes mentioning this asset"
        },
        "attention_share": {
          "type": "number",
          "description": "Proportion of mentions (0-1)"
        },
        "sentiment_mean": {
          "type": "number",
          "description": "α-sentiment mean (0-10 scale)"
        },
        "sentiment_delta_1d": {
          "type": "number",
          "description": "Change vs yesterday (-10 to +10)"
        },
        "sentiment_delta_7d": {
          "type": "number",
          "description": "Change vs 7 days ago"
        },
        "bull_ratio": {
          "type": "number",
          "description": "Proportion of bullish mentions (0-1)"
        },
        "bear_ratio": {
          "type": "number",
          "description": "Proportion of bearish mentions (0-1)"
        },
        "neutral_ratio": {
          "type": "number",
          "description": "Proportion of neutral mentions (0-1)"
        },
        "consensus_score": {
          "type": "number",
          "description": "Host agreement (0-1)"
        },
        "sentiment_momentum": {
          "type": "number",
          "description": "Trend direction and strength"
        },
        "narrative_intensity_norm": {
          "type": "number",
          "description": "Normalized narrative intensity (0-1)"
        },
        "summary": {
          "type": "string",
          "description": "AI-generated summary of discussions about this asset"
        }
      }
    },
    "FeedPodcastEntry": {
      "type": "object",
      "properties": {
        "podcast_id": {
          "type": "string",
          "description": "Unique podcast identifier"
        },
        "podcast_name": {
          "type": "string",
          "description": "Podcast name"
        },
        "episodes": {
          "type": "array",
          "description": "Recent episodes from this podcast",
          "items": {
            "$ref": "#/$defs/Episode"
          }
        }
      }
    },
    "FeedQuote": {
      "type": "object",
      "properties": {
        "rank": {
          "type": "integer",
          "description": "Relevance rank of the quote"
        },
        "selection_reason": {
          "type": "string",
          "description": "Why this quote was selected for the feed"
        },
        "quotes": {
          "allOf": [
            {
              "$ref": "#/$defs/Quote"
            }
          ],
          "description": "The quote object with speaker, text, and sentiment"
        }
      }
    },
    "FeedSignal": {
      "type": "object",
      "properties": {
        "ticker": {
          "type": "string",
          "description": "Asset ticker symbol — crypto tickers are suffixed with \"-USD\" (e.g. ETH-USD)"
        },
        "signal_type": {
          "type": "string",
          "description": "Type of signal (accumulation, volatility_risk, momentum_breakout, liquidity_crisis)"
        },
        "horizon": {
          "type": "string",
          "description": "Time horizon (24h, 7d, 30d)"
        },
        "scenario": {
          "type": "string",
          "description": "Description of the expected scenario"
        },
        "trigger": {
          "type": "string",
          "description": "Conditions that would trigger this scenario"
        },
        "confidence": {
          "type": "number",
          "description": "Confidence level of the signal (0-1)"
        },
        "invalidating_condition": {
          "type": "string",
          "description": "Conditions that would invalidate this signal"
        }
      }
    },
    "Quote": {
      "type": "object",
      "properties": {
        "quote": {
          "type": "string",
          "description": "The extracted quote text"
        },
        "status": {
          "type": "string",
          "description": "Generation status of the parent daily snapshot. \"completed\" once the snapshot has finished generating (the normal case); \"writing\" while it is being (re)generated, typically during the 00:00–00:01 UTC build window. Always present in the response."
        },
        "version_num": {
          "type": "integer",
          "description": "Revision number of the parent snapshot. Only present when version_info=true."
        },
        "version_label": {
          "type": "string",
          "description": "Version label of the parent snapshot (e.g. \"eod_utc\", \"backfill\"). Only present when version_info=true."
        },
        "speaker": {
          "type": "string",
          "description": "Name of the speaker"
        },
        "sentiment_score": {
          "type": "number",
          "description": "α-sentiment score of the quote (0-10 scale)"
        },
        "sentiment_category": {
          "type": "string",
          "description": "α-sentiment category (bearish/neutral/bullish)"
        },
        "ticker": {
          "type": "string",
          "description": "Asset ticker the quote refers to (if applicable) — crypto tickers are suffixed with \"-USD\" (e.g. ETH-USD)"
        },
        "episode_id": {
          "type": "string",
          "description": "ID of the episode containing this quote"
        }
      }
    }
  }
}