{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/daily-dev/json-schema/daily-dev-def-19-schema.json",
  "title": "FeedPostExplain",
  "description": "Why For You ranked the post where it did. The score multiplies the factor fields: 1 is neutral, above 1 raises the post and below 1 lowers it. Optional fields are absent rather than null.",
  "x-generated": "2026-10-30",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/daily-dev-openapi.json#/components/schemas/def-19",
  "type": [
    "object",
    "null"
  ],
  "additionalProperties": true,
  "properties": {
    "lane": {
      "type": "string",
      "description": "What put the post in For You. chal is the personalized ranking and the only lane with the fields below; other lanes, such as popular fill-ins, carry only lane."
    },
    "v": {
      "type": "integer",
      "description": "Version of this shape"
    },
    "score": {
      "type": "number",
      "description": "The score For You orders by, highest first. It has no fixed scale."
    },
    "position": {
      "type": "integer",
      "description": "Where the post was placed, absent when the ranking did not pick it"
    },
    "base": {
      "type": "object",
      "additionalProperties": true,
      "properties": {
        "value": {
          "type": "number",
          "description": "A score multiplier. How much readers clicked, upvoted and commented on the post compared with a typical post."
        },
        "prior_lift": {
          "type": "number",
          "description": "How far the source's past engagement lifts a post with few readers yet above the platform average"
        },
        "viewers": {
          "type": "integer",
          "description": "Readers the post was shown to"
        }
      }
    },
    "match": {
      "type": "object",
      "additionalProperties": true,
      "description": "The reader's topic that matches the post best, absent when a follow alone brought it in",
      "properties": {
        "tag": {
          "type": "string"
        },
        "origin": {
          "type": "string",
          "description": "declared: followed, inferred: learned from reading, set: given a weight by the reader"
        },
        "role": {
          "type": "string",
          "description": "central when the post is about the topic, side when it only touches it"
        },
        "role_weight": {
          "type": "number",
          "description": "How much the role counts toward the topic match"
        },
        "strength": {
          "type": "string",
          "description": "How much reading backs the topic: strong, moderate, confirmed or early_signal"
        },
        "weight": {
          "type": "number",
          "description": "The topic's weight after the reader's control"
        },
        "computed_weight": {
          "type": "number",
          "description": "The topic's weight before the reader's control"
        },
        "recency": {
          "type": "number"
        },
        "stories": {
          "type": "integer",
          "description": "Stories on the topic the reader acted on positively"
        },
        "hidden_stories": {
          "type": "integer",
          "description": "Stories on the topic the reader hid"
        },
        "hide_penalty": {
          "type": "number",
          "description": "What the hidden stories took off the weight"
        },
        "control": {
          "type": "string",
          "description": "The reader's control on the topic: boost, demote, stop_learning or weight"
        },
        "factor": {
          "type": "number",
          "description": "A score multiplier. Topic match."
        }
      }
    },
    "follow": {
      "type": "object",
      "additionalProperties": true,
      "properties": {
        "kind": {
          "type": "string",
          "description": "source, squad or author: the follow that counted, absent without one"
        },
        "factor": {
          "type": "number",
          "description": "A score multiplier. Follow, with the level the reader set on the source or author."
        },
        "source_control": {
          "type": "string",
          "description": "The reader's control on the post's source: boost, demote, off or weight"
        },
        "author_control": {
          "type": "string",
          "description": "The reader's control on the post's author: boost, demote, off or weight"
        }
      }
    },
    "age": {
      "type": "object",
      "additionalProperties": true,
      "properties": {
        "days": {
          "type": "number",
          "description": "Days since the post came out"
        },
        "factor": {
          "type": "number",
          "description": "A score multiplier. Freshness: older posts slowly fade."
        }
      }
    },
    "seen": {
      "type": "object",
      "additionalProperties": true,
      "properties": {
        "shows": {
          "type": "integer",
          "description": "Times For You already showed the post to the reader"
        },
        "factor": {
          "type": "number",
          "description": "A score multiplier. Seen before."
        }
      }
    },
    "slot": {
      "type": "object",
      "additionalProperties": true,
      "description": "The variety adjustments, only on picked posts",
      "properties": {
        "source_repeat": {
          "type": "number",
          "description": "A score multiplier. Lowers the post when the feed already has posts from its source."
        },
        "topic_repeat": {
          "type": "number",
          "description": "A score multiplier. Lowers the post when the feed already has posts on its topic."
        },
        "same_headline": {
          "type": "number",
          "description": "A score multiplier. Lowers the post when the feed already covers the same story."
        },
        "waiting": {
          "type": "number",
          "description": "A score multiplier. Topic's turn: raises a topic the reader likes that has not shown up for a while."
        },
        "waiting_tag": {
          "type": "string",
          "description": "The topic whose turn it was"
        },
        "pick_score": {
          "type": "number",
          "description": "The score after these adjustments"
        }
      }
    },
    "reasons": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Only on a left-out post: why For You left it out"
    }
  }
}