{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://www.followthefilings.io/schema/ftf-feed-v1.schema.json",
  "title": "FTF Data — Morning Feed payload (v1)",
  "description": "One delivery of the FTF Data morning feed: scored signals from SEC Form 4 filings and Senate periodic transaction reports, plus the cleaning decisions that produced them. Every field below is always present; a value that is not known is null rather than omitted.",
  "type": "object",
  "additionalProperties": false,
  "required": [
    "schema_version",
    "product",
    "generated_at",
    "window",
    "scope",
    "signals",
    "cleaning",
    "disclaimer"
  ],
  "properties": {
    "schema_version": {
      "description": "Version of this payload contract. Breaking changes increment the major part.",
      "type": "string",
      "const": "1.0"
    },
    "product": {
      "type": "string",
      "description": "Human-readable product name for this feed."
    },
    "generated_at": {
      "description": "When this payload was produced (UTC, ISO-8601).",
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z$"
    },
    "window": {
      "description": "Filing-date window the signals were scored over.",
      "type": "object",
      "additionalProperties": false,
      "required": [
        "days",
        "as_of"
      ],
      "properties": {
        "days": {
          "type": [
            "integer",
            "null"
          ],
          "minimum": 1,
          "description": "Length of the scoring window, in filing days."
        },
        "as_of": {
          "type": [
            "string",
            "null"
          ],
          "description": "Last filing day included in the window (YYYY-MM-DD)."
        }
      }
    },
    "scope": {
      "description": "What this feed covers — and what it does not. Stated in every delivery.",
      "type": "object",
      "additionalProperties": false,
      "required": [
        "forms",
        "table",
        "congress",
        "multi_owner_filings",
        "reconciliation"
      ],
      "properties": {
        "forms": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "minItems": 1,
          "description": "SEC form types read for this feed."
        },
        "table": {
          "type": "string",
          "description": "Which part of the Form 4 is in scope. Table II (derivative) transactions are not delivered."
        },
        "congress": {
          "type": "string",
          "description": "Congressional coverage. The House side is not covered at all — stated in every delivery so it is never assumed."
        },
        "multi_owner_filings": {
          "type": "string",
          "description": "How filings with several reporting owners are attributed."
        },
        "reconciliation": {
          "description": "Public page where the daily EDGAR reconciliation is published, difference and all.",
          "type": "string",
          "format": "uri"
        }
      }
    },
    "signals": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/signal"
      },
      "description": "Scored signals for this window, highest score first."
    },
    "cleaning": {
      "$ref": "#/$defs/cleaning",
      "description": "What the cleaning layer removed before this delivery."
    },
    "disclaimer": {
      "type": "string",
      "description": "Standing disclaimer shipped with every delivery."
    }
  },
  "$defs": {
    "signal": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "type",
        "score",
        "summary",
        "issuer",
        "metrics",
        "price_check",
        "filings"
      ],
      "properties": {
        "type": {
          "type": "string",
          "enum": [
            "insider_cluster_buy",
            "insider_serial_buy",
            "insider_pair_buy",
            "holder_accumulation",
            "insider_net_sell",
            "late_filing",
            "insider_big_tx",
            "congress_mega_ptr",
            "congress_big_trade"
          ],
          "description": "Which kind of pattern this signal describes."
        },
        "score": {
          "description": "Our internal ranking score. It orders candidates by size, dispersion and recency — it is not a prediction and carries no view on the security.",
          "type": "number"
        },
        "summary": {
          "description": "One-line description of the signal, in plain English.",
          "type": "string"
        },
        "issuer": {
          "description": "Null for congressional signals, which have no single issuer.",
          "oneOf": [
            {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "ticker",
                "name"
              ],
              "properties": {
                "ticker": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Issuer ticker as filed. Filings that carry no ticker are parked upstream, never delivered with a blank."
                },
                "name": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Issuer name as filed."
                }
              }
            },
            {
              "type": "null"
            }
          ]
        },
        "metrics": {
          "type": "object",
          "description": "Type-specific measurements. The shape depends on 'type' and is defined per type below."
        },
        "price_check": {
          "description": "Filed price compared against that day's market close. Null when the signal was outside the checked set.",
          "oneOf": [
            {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "status",
                "ratio",
                "reason"
              ],
              "properties": {
                "status": {
                  "type": "string",
                  "enum": [
                    "consistent",
                    "not_checked"
                  ],
                  "description": "consistent = filed price sits inside the accepted band against that day's close. not_checked = the comparison could not be made; see reason."
                },
                "ratio": {
                  "description": "filed price / market close. Present when status is consistent.",
                  "type": [
                    "number",
                    "null"
                  ]
                },
                "reason": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "enum": [
                    "no_market_reference",
                    "missing_price_date_or_ticker",
                    null
                  ],
                  "description": "Why the check was not made. Null when status is consistent."
                }
              }
            },
            {
              "type": "null"
            }
          ]
        },
        "filings": {
          "description": "Transaction-level breakdown behind the signal. Null when not requested for this delivery.",
          "oneOf": [
            {
              "type": "array",
              "items": {
                "$ref": "#/$defs/filing"
              },
              "minItems": 1
            },
            {
              "type": "null"
            }
          ]
        }
      },
      "allOf": [
        {
          "if": {
            "properties": {
              "type": {
                "const": "insider_cluster_buy"
              }
            }
          },
          "then": {
            "properties": {
              "metrics": {
                "$ref": "#/$defs/metrics_cluster"
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "const": "insider_serial_buy"
              }
            }
          },
          "then": {
            "properties": {
              "metrics": {
                "$ref": "#/$defs/metrics_serial"
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "const": "insider_big_tx"
              }
            }
          },
          "then": {
            "properties": {
              "metrics": {
                "$ref": "#/$defs/metrics_big_tx"
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "const": "congress_mega_ptr"
              }
            }
          },
          "then": {
            "properties": {
              "metrics": {
                "$ref": "#/$defs/metrics_mega_ptr"
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "const": "congress_big_trade"
              }
            }
          },
          "then": {
            "properties": {
              "metrics": {
                "$ref": "#/$defs/metrics_big_trade"
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "const": "insider_pair_buy"
              }
            }
          },
          "then": {
            "properties": {
              "metrics": {
                "$ref": "#/$defs/metrics_cluster"
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "const": "holder_accumulation"
              }
            }
          },
          "then": {
            "properties": {
              "metrics": {
                "$ref": "#/$defs/metrics_holder"
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "const": "insider_net_sell"
              }
            }
          },
          "then": {
            "properties": {
              "metrics": {
                "$ref": "#/$defs/metrics_net_sell"
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "const": "late_filing"
              }
            }
          },
          "then": {
            "properties": {
              "metrics": {
                "$ref": "#/$defs/metrics_late_filing"
              }
            }
          }
        }
      ]
    },
    "metrics_cluster": {
      "description": "Several distinct insiders bought the same issuer inside the window. Flow fields (buy/sell/net, transaction dates, filing lag, issuer class) added September 2026.",
      "type": "object",
      "additionalProperties": false,
      "required": [
        "distinct_owners",
        "owners",
        "transactions",
        "total_usd",
        "avg_price",
        "single_price_pattern",
        "officer_or_director_count",
        "last_tx_date",
        "buy_usd",
        "sell_usd",
        "net_usd",
        "tx_first",
        "tx_last",
        "tx_days",
        "filing_lag_bdays_max",
        "late_filed_n",
        "issuer_class"
      ],
      "properties": {
        "distinct_owners": {
          "type": "integer",
          "minimum": 0,
          "description": "Number of different insiders in the cluster."
        },
        "owners": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "The insiders in the cluster, as filed."
        },
        "transactions": {
          "type": [
            "integer",
            "null"
          ],
          "minimum": 0,
          "description": "Number of transaction lines behind the cluster."
        },
        "total_usd": {
          "type": [
            "number",
            "null"
          ],
          "description": "Sum of the cluster's transaction values, in USD."
        },
        "avg_price": {
          "type": [
            "number",
            "null"
          ],
          "description": "Mean filed price across the cluster's lines."
        },
        "single_price_pattern": {
          "description": "True when the cluster's prices are identical to the cent — a placement or program pattern rather than discretionary buying. Clusters of three or more such owners are excluded upstream; this flag marks the two-owner case that is kept but labelled.",
          "type": [
            "boolean",
            "null"
          ]
        },
        "officer_or_director_count": {
          "type": [
            "integer",
            "null"
          ],
          "minimum": 0,
          "description": "How many of the owners are officers or directors rather than passive holders."
        },
        "last_tx_date": {
          "type": [
            "string",
            "null"
          ],
          "description": "Most recent transaction date in the cluster."
        },
        "buy_usd": {
          "type": [
            "number",
            "null"
          ],
          "description": "Open-market purchases (code P) by all insiders of the issuer inside the candidate window, USD."
        },
        "sell_usd": {
          "type": [
            "number",
            "null"
          ],
          "description": "Open-market sales (code S) by all insiders of the issuer inside the candidate window, USD."
        },
        "net_usd": {
          "type": [
            "number",
            "null"
          ],
          "description": "buy_usd minus sell_usd. Buy-side signal types require this to be positive."
        },
        "tx_first": {
          "type": [
            "string",
            "null"
          ],
          "description": "Earliest transaction date among the purchases behind the signal."
        },
        "tx_last": {
          "type": [
            "string",
            "null"
          ],
          "description": "Latest transaction date among the purchases behind the signal."
        },
        "tx_days": {
          "type": [
            "integer",
            "null"
          ],
          "minimum": 0,
          "description": "Number of distinct transaction dates behind the signal (sessions, not rows)."
        },
        "filing_lag_bdays_max": {
          "type": [
            "integer",
            "null"
          ],
          "minimum": 0,
          "description": "Largest transaction-to-filing lag in business days. Form 4 is due within two business days; larger values mean late filing."
        },
        "late_filed_n": {
          "type": [
            "integer",
            "null"
          ],
          "minimum": 0,
          "description": "How many purchase rows were filed later than two business days after the transaction."
        },
        "issuer_class": {
          "type": [
            "string",
            "null"
          ],
          "enum": [
            "operating",
            "registered_fund",
            "unknown",
            null
          ],
          "description": "Issuer class from the SEC submissions record: operating company, registered investment fund, or unknown (not yet looked up)."
        }
      }
    },
    "metrics_serial": {
      "description": "One insider bought the same issuer across several sessions inside the window. Flow fields (buy/sell/net, transaction dates, filing lag, issuer class) added September 2026.",
      "type": "object",
      "additionalProperties": false,
      "required": [
        "owner",
        "transactions",
        "total_usd",
        "avg_price",
        "last_tx_date",
        "buy_usd",
        "sell_usd",
        "net_usd",
        "tx_first",
        "tx_last",
        "tx_days",
        "filing_lag_bdays_max",
        "late_filed_n",
        "issuer_class",
        "trading_days"
      ],
      "properties": {
        "owner": {
          "type": [
            "string",
            "null"
          ],
          "description": "Reporting owner name exactly as it appears on the filing."
        },
        "transactions": {
          "type": [
            "integer",
            "null"
          ],
          "minimum": 0,
          "description": "Number of separate sessions the owner bought in."
        },
        "total_usd": {
          "type": [
            "number",
            "null"
          ],
          "description": "Sum of the owner's transaction values in the window, in USD."
        },
        "avg_price": {
          "type": [
            "number",
            "null"
          ],
          "description": "Mean filed price across those transactions."
        },
        "last_tx_date": {
          "type": [
            "string",
            "null"
          ],
          "description": "Most recent transaction date for this owner."
        },
        "buy_usd": {
          "type": [
            "number",
            "null"
          ],
          "description": "Open-market purchases (code P) by all insiders of the issuer inside the candidate window, USD."
        },
        "sell_usd": {
          "type": [
            "number",
            "null"
          ],
          "description": "Open-market sales (code S) by all insiders of the issuer inside the candidate window, USD."
        },
        "net_usd": {
          "type": [
            "number",
            "null"
          ],
          "description": "buy_usd minus sell_usd. Buy-side signal types require this to be positive."
        },
        "tx_first": {
          "type": [
            "string",
            "null"
          ],
          "description": "Earliest transaction date among the purchases behind the signal."
        },
        "tx_last": {
          "type": [
            "string",
            "null"
          ],
          "description": "Latest transaction date among the purchases behind the signal."
        },
        "tx_days": {
          "type": [
            "integer",
            "null"
          ],
          "minimum": 0,
          "description": "Number of distinct transaction dates behind the signal (sessions, not rows)."
        },
        "filing_lag_bdays_max": {
          "type": [
            "integer",
            "null"
          ],
          "minimum": 0,
          "description": "Largest transaction-to-filing lag in business days. Form 4 is due within two business days; larger values mean late filing."
        },
        "late_filed_n": {
          "type": [
            "integer",
            "null"
          ],
          "minimum": 0,
          "description": "How many purchase rows were filed later than two business days after the transaction."
        },
        "issuer_class": {
          "type": [
            "string",
            "null"
          ],
          "enum": [
            "operating",
            "registered_fund",
            "unknown",
            null
          ],
          "description": "Issuer class from the SEC submissions record: operating company, registered investment fund, or unknown (not yet looked up)."
        },
        "trading_days": {
          "type": [
            "integer",
            "null"
          ],
          "minimum": 0,
          "description": "Distinct trading days the owner bought on (a serial signal requires three or more inside a 10-trading-day window)."
        }
      }
    },
    "metrics_big_tx": {
      "description": "A single large Form 4 transaction.",
      "type": "object",
      "additionalProperties": false,
      "required": [
        "owner",
        "owner_title",
        "tx_date",
        "tx_code",
        "shares",
        "price",
        "value",
        "accession"
      ],
      "properties": {
        "owner": {
          "type": [
            "string",
            "null"
          ],
          "description": "Reporting owner name exactly as it appears on the filing."
        },
        "owner_title": {
          "type": [
            "string",
            "null"
          ],
          "description": "Officer title as filed. Null when the filing states none."
        },
        "tx_date": {
          "type": [
            "string",
            "null"
          ],
          "description": "Date of the transaction itself, as filed — not the date the filing was accepted."
        },
        "tx_code": {
          "description": "Form 4 transaction code as filed. P = open-market purchase, S = sale.",
          "type": [
            "string",
            "null"
          ]
        },
        "shares": {
          "type": [
            "number",
            "null"
          ],
          "description": "Share count as filed."
        },
        "price": {
          "description": "Price per share as filed. Where a filing reports a weighted average, that is the number carried here.",
          "type": [
            "number",
            "null"
          ]
        },
        "value": {
          "type": [
            "number",
            "null"
          ],
          "description": "shares x price, as filed."
        },
        "accession": {
          "type": [
            "string",
            "null"
          ],
          "description": "SEC accession number of the filing. Any line can be opened on EDGAR with it."
        }
      }
    },
    "metrics_mega_ptr": {
      "description": "A Senate periodic transaction report covering an unusually large number of trades.",
      "type": "object",
      "additionalProperties": false,
      "required": [
        "politician",
        "trades_all",
        "equity_trades",
        "buys",
        "est_total_usd",
        "tickers",
        "ptr_link"
      ],
      "properties": {
        "politician": {
          "type": [
            "string",
            "null"
          ],
          "description": "Filer name as published by the Senate eFD portal."
        },
        "trades_all": {
          "type": [
            "integer",
            "null"
          ],
          "minimum": 0,
          "description": "Every transaction line on the report, including non-equity assets."
        },
        "equity_trades": {
          "type": [
            "integer",
            "null"
          ],
          "minimum": 0,
          "description": "Lines identifiable as equity trades."
        },
        "buys": {
          "type": [
            "integer",
            "null"
          ],
          "minimum": 0,
          "description": "Equity lines reported as purchases."
        },
        "est_total_usd": {
          "description": "Midpoint estimate: Senate PTRs disclose amounts as ranges, never exact figures.",
          "type": [
            "number",
            "null"
          ]
        },
        "tickers": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Tickers appearing on the report."
        },
        "ptr_link": {
          "type": [
            "string",
            "null"
          ],
          "description": "Link to the periodic transaction report this line came from."
        }
      }
    },
    "metrics_big_trade": {
      "description": "A single large congressional trade line.",
      "type": "object",
      "additionalProperties": false,
      "required": [
        "politician",
        "ticker",
        "tx_type",
        "amount_range",
        "transaction_date",
        "disclosure_date",
        "ptr_link"
      ],
      "properties": {
        "politician": {
          "type": [
            "string",
            "null"
          ],
          "description": "Filer name as published by the Senate eFD portal."
        },
        "ticker": {
          "type": [
            "string",
            "null"
          ],
          "description": "Ticker as reported on the disclosure."
        },
        "tx_type": {
          "type": [
            "string",
            "null"
          ],
          "description": "Transaction type as reported (for example Purchase, Sale)."
        },
        "amount_range": {
          "description": "As disclosed — a range, not an exact amount.",
          "type": [
            "string",
            "null"
          ]
        },
        "transaction_date": {
          "type": [
            "string",
            "null"
          ],
          "description": "Date of the trade as reported."
        },
        "disclosure_date": {
          "type": [
            "string",
            "null"
          ],
          "description": "Date the report was filed. The gap to transaction_date is the disclosure lag."
        },
        "ptr_link": {
          "type": [
            "string",
            "null"
          ],
          "description": "Link to the periodic transaction report this line came from."
        }
      }
    },
    "filing": {
      "description": "One transaction line as filed. Only accession is guaranteed non-null; every other field is null when the filing did not carry it.",
      "type": "object",
      "additionalProperties": false,
      "required": [
        "owner",
        "title",
        "is_director",
        "is_officer",
        "is_ten_percent_owner",
        "tx_date",
        "shares",
        "price",
        "value",
        "accession",
        "acceptance_datetime",
        "detected_at"
      ],
      "properties": {
        "owner": {
          "type": [
            "string",
            "null"
          ],
          "description": "Reporting owner name exactly as it appears on the filing."
        },
        "title": {
          "type": [
            "string",
            "null"
          ],
          "description": "Officer title as filed. Null when the filing states none."
        },
        "is_director": {
          "type": [
            "boolean",
            "null"
          ],
          "description": "Director flag as filed. Null when the filing does not state it — never inferred."
        },
        "is_officer": {
          "type": [
            "boolean",
            "null"
          ],
          "description": "Officer flag as filed. Null when the filing does not state it."
        },
        "is_ten_percent_owner": {
          "type": [
            "boolean",
            "null"
          ],
          "description": "Ten-percent-owner flag as filed. Null when the filing does not state it."
        },
        "tx_date": {
          "type": [
            "string",
            "null"
          ],
          "description": "Date of the transaction itself, as filed — not the date the filing was accepted."
        },
        "shares": {
          "type": [
            "number",
            "null"
          ],
          "description": "Share count as filed."
        },
        "price": {
          "type": [
            "number",
            "null"
          ],
          "description": "Price per share as filed. Where the filing reports a weighted average across lots, that average is the number carried here."
        },
        "value": {
          "type": [
            "number",
            "null"
          ],
          "description": "shares x price, as filed."
        },
        "accession": {
          "description": "SEC accession number. Any line can be checked against the original filing on EDGAR with it.",
          "type": "string"
        },
        "acceptance_datetime": {
          "description": "EDGAR acceptance time. Known only for filings picked up on the intraday feed; null otherwise.",
          "type": [
            "string",
            "null"
          ]
        },
        "detected_at": {
          "description": "When our pipeline first saw this row (UTC). This is our detection log, not an SEC field.",
          "type": [
            "string",
            "null"
          ]
        }
      }
    },
    "cleaning": {
      "description": "What the cleaning layer removed before this delivery. Nothing is dropped silently: every removal is listed under 'removed'.",
      "type": "object",
      "additionalProperties": false,
      "required": [
        "duplicate_rows_collapsed",
        "ticker_less_filings_parked",
        "sub_threshold_candidates_suppressed",
        "price_data_unavailable",
        "counts",
        "removed"
      ],
      "properties": {
        "duplicate_rows_collapsed": {
          "type": "integer",
          "minimum": 0,
          "description": "Identical lines that appeared under more than one accession and were collapsed to one."
        },
        "ticker_less_filings_parked": {
          "type": "integer",
          "minimum": 0,
          "description": "Filings with no usable ticker, held back rather than delivered blank."
        },
        "sub_threshold_candidates_suppressed": {
          "type": "integer",
          "minimum": 0,
          "description": "Candidates below the size threshold for this feed."
        },
        "price_data_unavailable": {
          "type": "integer",
          "minimum": 0,
          "description": "Candidates for which no market reference price was available to check against."
        },
        "counts": {
          "type": "object",
          "additionalProperties": false,
          "required": [
            "amendment_superseded",
            "impossible_value",
            "bulk_event_excluded",
            "price_mismatch",
            "fund_issuer_excluded"
          ],
          "properties": {
            "amendment_superseded": {
              "type": "integer",
              "minimum": 0,
              "description": "Lines replaced by a later filing of the same transaction."
            },
            "impossible_value": {
              "type": "integer",
              "minimum": 0,
              "description": "Lines whose filed numbers cannot be true."
            },
            "bulk_event_excluded": {
              "type": "integer",
              "minimum": 0,
              "description": "Issuers excluded as a program, placement or IPO-related event."
            },
            "price_mismatch": {
              "type": "integer",
              "minimum": 0,
              "description": "Candidates dropped on the price-sanity check."
            },
            "fund_issuer_excluded": {
              "type": "integer",
              "minimum": 0,
              "description": "Issuers classified as registered investment funds (SEC submissions record); their Form 4 purchases are fund-share subscriptions and produce no insider signal."
            }
          },
          "description": "Removal counts by reason. Derived from the 'removed' list, so the two can never disagree."
        },
        "removed": {
          "type": "array",
          "items": {
            "oneOf": [
              {
                "$ref": "#/$defs/removed_amendment"
              },
              {
                "$ref": "#/$defs/removed_impossible"
              },
              {
                "$ref": "#/$defs/removed_bulk"
              },
              {
                "$ref": "#/$defs/removed_price"
              },
              {
                "$ref": "#/$defs/removed_fund_issuer"
              }
            ]
          },
          "description": "Every removal, itemised. This list is the reason we can say nothing is dropped silently."
        }
      }
    },
    "removed_amendment": {
      "description": "A row superseded by a later filing of the same transaction; the corrected version is kept.",
      "type": "object",
      "additionalProperties": false,
      "required": [
        "code",
        "ticker",
        "owner",
        "tx_date",
        "shares",
        "price",
        "dropped_accession",
        "superseded_by"
      ],
      "properties": {
        "code": {
          "const": "amendment_superseded",
          "description": "Removal reason."
        },
        "ticker": {
          "type": [
            "string",
            "null"
          ],
          "description": "Issuer ticker as filed. Filings that carry no ticker are parked upstream, never delivered with a blank."
        },
        "owner": {
          "type": [
            "string",
            "null"
          ],
          "description": "Reporting owner name exactly as it appears on the filing."
        },
        "tx_date": {
          "type": [
            "string",
            "null"
          ],
          "description": "Date of the transaction itself, as filed — not the date the filing was accepted."
        },
        "shares": {
          "type": [
            "number",
            "null"
          ],
          "description": "Share count as filed."
        },
        "price": {
          "type": [
            "number",
            "null"
          ],
          "description": "Price per share as filed. Where the filing reports a weighted average across lots, that average is the number carried here."
        },
        "dropped_accession": {
          "type": [
            "string",
            "null"
          ],
          "description": "Accession of the line that was dropped."
        },
        "superseded_by": {
          "type": [
            "string",
            "null"
          ],
          "description": "Accession of the filing kept in its place."
        }
      }
    },
    "removed_impossible": {
      "description": "A row whose filed numbers cannot be true (for example a price field reading billions per share).",
      "type": "object",
      "additionalProperties": false,
      "required": [
        "code",
        "ticker",
        "owner",
        "shares",
        "price",
        "value",
        "accession"
      ],
      "properties": {
        "code": {
          "const": "impossible_value",
          "description": "Removal reason."
        },
        "ticker": {
          "type": [
            "string",
            "null"
          ],
          "description": "Issuer ticker as filed. Filings that carry no ticker are parked upstream, never delivered with a blank."
        },
        "owner": {
          "type": [
            "string",
            "null"
          ],
          "description": "Reporting owner name exactly as it appears on the filing."
        },
        "shares": {
          "type": [
            "number",
            "null"
          ],
          "description": "Share count as filed."
        },
        "price": {
          "type": [
            "number",
            "null"
          ],
          "description": "The filed price that failed the plausibility bound."
        },
        "value": {
          "type": [
            "number",
            "null"
          ],
          "description": "shares x price, as filed."
        },
        "accession": {
          "type": [
            "string",
            "null"
          ],
          "description": "SEC accession number of the filing. Any line can be opened on EDGAR with it."
        }
      }
    },
    "removed_bulk": {
      "description": "An issuer where three or more filers printed one identical price on one day — a program, placement or IPO-related event rather than independent buying.",
      "type": "object",
      "additionalProperties": false,
      "required": [
        "code",
        "ticker",
        "owners",
        "total_usd"
      ],
      "properties": {
        "code": {
          "const": "bulk_event_excluded",
          "description": "Removal reason."
        },
        "ticker": {
          "type": [
            "string",
            "null"
          ],
          "description": "Issuer ticker as filed. Filings that carry no ticker are parked upstream, never delivered with a blank."
        },
        "owners": {
          "type": "integer",
          "minimum": 0,
          "description": "How many filers printed the identical price."
        },
        "total_usd": {
          "type": [
            "number",
            "null"
          ],
          "description": "Combined value of the excluded lines, in USD."
        }
      }
    },
    "removed_price": {
      "description": "A candidate whose filed price fell outside the accepted band against that day's market close.",
      "type": "object",
      "additionalProperties": false,
      "required": [
        "code",
        "ticker",
        "candidate_price",
        "market_close",
        "ratio",
        "tx_date"
      ],
      "properties": {
        "code": {
          "const": "price_mismatch",
          "description": "Removal reason."
        },
        "ticker": {
          "type": [
            "string",
            "null"
          ],
          "description": "Issuer ticker as filed. Filings that carry no ticker are parked upstream, never delivered with a blank."
        },
        "candidate_price": {
          "type": [
            "number",
            "null"
          ],
          "description": "Price carried by the candidate."
        },
        "market_close": {
          "type": [
            "number",
            "null"
          ],
          "description": "Reference close used for the comparison."
        },
        "ratio": {
          "type": [
            "number",
            "null"
          ],
          "description": "candidate_price / market_close."
        },
        "tx_date": {
          "type": [
            "string",
            "null"
          ],
          "description": "Date of the transaction itself, as filed — not the date the filing was accepted."
        }
      }
    },
    "metrics_holder": {
      "description": "A 10% holder (not an officer or director) accumulating the issuer across sessions. The most ordinary reading is an ongoing accumulation program reported as required.",
      "type": "object",
      "additionalProperties": false,
      "required": [
        "owner",
        "owners",
        "transactions",
        "trading_days",
        "total_usd",
        "avg_price",
        "last_tx_date",
        "buy_usd",
        "sell_usd",
        "net_usd",
        "tx_first",
        "tx_last",
        "tx_days",
        "filing_lag_bdays_max",
        "late_filed_n",
        "issuer_class"
      ],
      "properties": {
        "owner": {
          "type": [
            "string",
            "null"
          ],
          "description": "Reporting holder name as filed (null when several holders)."
        },
        "owners": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "All holders behind the signal."
        },
        "transactions": {
          "type": [
            "integer",
            "null"
          ],
          "minimum": 0,
          "description": "Number of transaction lines behind the signal."
        },
        "trading_days": {
          "type": [
            "integer",
            "null"
          ],
          "minimum": 0,
          "description": "Number of distinct transaction dates behind the signal (sessions, not rows)."
        },
        "total_usd": {
          "type": [
            "number",
            "null"
          ],
          "description": "Sum of the purchase values behind the signal, in USD."
        },
        "avg_price": {
          "type": [
            "number",
            "null"
          ],
          "description": "Mean filed price across the lines behind the signal."
        },
        "last_tx_date": {
          "type": [
            "string",
            "null"
          ],
          "description": "Most recent transaction date behind the signal."
        },
        "buy_usd": {
          "type": [
            "number",
            "null"
          ],
          "description": "Open-market purchases (code P) by all insiders of the issuer inside the candidate window, USD."
        },
        "sell_usd": {
          "type": [
            "number",
            "null"
          ],
          "description": "Open-market sales (code S) by all insiders of the issuer inside the candidate window, USD."
        },
        "net_usd": {
          "type": [
            "number",
            "null"
          ],
          "description": "buy_usd minus sell_usd. Buy-side signal types require this to be positive."
        },
        "tx_first": {
          "type": [
            "string",
            "null"
          ],
          "description": "Earliest transaction date among the purchases behind the signal."
        },
        "tx_last": {
          "type": [
            "string",
            "null"
          ],
          "description": "Latest transaction date among the purchases behind the signal."
        },
        "tx_days": {
          "type": [
            "integer",
            "null"
          ],
          "minimum": 0,
          "description": "Number of distinct transaction dates behind the signal (sessions, not rows)."
        },
        "filing_lag_bdays_max": {
          "type": [
            "integer",
            "null"
          ],
          "minimum": 0,
          "description": "Largest transaction-to-filing lag in business days. Form 4 is due within two business days; larger values mean late filing."
        },
        "late_filed_n": {
          "type": [
            "integer",
            "null"
          ],
          "minimum": 0,
          "description": "How many purchase rows were filed later than two business days after the transaction."
        },
        "issuer_class": {
          "type": [
            "string",
            "null"
          ],
          "enum": [
            "operating",
            "registered_fund",
            "unknown",
            null
          ],
          "description": "Issuer class from the SEC submissions record: operating company, registered investment fund, or unknown (not yet looked up)."
        }
      }
    },
    "metrics_net_sell": {
      "description": "A buying pattern exists, but the issuer's insiders were net sellers over the window. Carried so that the buying is never presented without the selling.",
      "type": "object",
      "additionalProperties": false,
      "required": [
        "owners",
        "transactions",
        "total_usd",
        "sellers",
        "last_tx_date",
        "buy_usd",
        "sell_usd",
        "net_usd",
        "tx_first",
        "tx_last",
        "tx_days",
        "filing_lag_bdays_max",
        "late_filed_n",
        "issuer_class"
      ],
      "properties": {
        "owners": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Buyers behind the pattern."
        },
        "transactions": {
          "type": [
            "integer",
            "null"
          ],
          "minimum": 0,
          "description": "Number of transaction lines behind the signal."
        },
        "total_usd": {
          "type": [
            "number",
            "null"
          ],
          "description": "Purchases behind the pattern, USD."
        },
        "sellers": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Insiders who sold inside the window."
        },
        "last_tx_date": {
          "type": [
            "string",
            "null"
          ],
          "description": "Most recent transaction date behind the signal."
        },
        "buy_usd": {
          "type": [
            "number",
            "null"
          ],
          "description": "Open-market purchases (code P) by all insiders of the issuer inside the candidate window, USD."
        },
        "sell_usd": {
          "type": [
            "number",
            "null"
          ],
          "description": "Open-market sales (code S) by all insiders of the issuer inside the candidate window, USD."
        },
        "net_usd": {
          "type": [
            "number",
            "null"
          ],
          "description": "buy_usd minus sell_usd. Buy-side signal types require this to be positive."
        },
        "tx_first": {
          "type": [
            "string",
            "null"
          ],
          "description": "Earliest transaction date among the purchases behind the signal."
        },
        "tx_last": {
          "type": [
            "string",
            "null"
          ],
          "description": "Latest transaction date among the purchases behind the signal."
        },
        "tx_days": {
          "type": [
            "integer",
            "null"
          ],
          "minimum": 0,
          "description": "Number of distinct transaction dates behind the signal (sessions, not rows)."
        },
        "filing_lag_bdays_max": {
          "type": [
            "integer",
            "null"
          ],
          "minimum": 0,
          "description": "Largest transaction-to-filing lag in business days. Form 4 is due within two business days; larger values mean late filing."
        },
        "late_filed_n": {
          "type": [
            "integer",
            "null"
          ],
          "minimum": 0,
          "description": "How many purchase rows were filed later than two business days after the transaction."
        },
        "issuer_class": {
          "type": [
            "string",
            "null"
          ],
          "enum": [
            "operating",
            "registered_fund",
            "unknown",
            null
          ],
          "description": "Issuer class from the SEC submissions record: operating company, registered investment fund, or unknown (not yet looked up)."
        }
      }
    },
    "metrics_late_filing": {
      "description": "Purchases whose Form 4 was filed later than two business days after the transaction — an information event (the filing), not fresh buying.",
      "type": "object",
      "additionalProperties": false,
      "required": [
        "owners",
        "transactions",
        "total_usd",
        "last_tx_date",
        "buy_usd",
        "sell_usd",
        "net_usd",
        "tx_first",
        "tx_last",
        "tx_days",
        "filing_lag_bdays_max",
        "late_filed_n",
        "issuer_class"
      ],
      "properties": {
        "owners": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "All reporting owners behind the signal, as filed."
        },
        "transactions": {
          "type": [
            "integer",
            "null"
          ],
          "minimum": 0,
          "description": "Number of transaction lines behind the signal."
        },
        "total_usd": {
          "type": [
            "number",
            "null"
          ],
          "description": "Sum of the purchase values behind the signal, in USD."
        },
        "last_tx_date": {
          "type": [
            "string",
            "null"
          ],
          "description": "Most recent transaction date behind the signal."
        },
        "buy_usd": {
          "type": [
            "number",
            "null"
          ],
          "description": "Open-market purchases (code P) by all insiders of the issuer inside the candidate window, USD."
        },
        "sell_usd": {
          "type": [
            "number",
            "null"
          ],
          "description": "Open-market sales (code S) by all insiders of the issuer inside the candidate window, USD."
        },
        "net_usd": {
          "type": [
            "number",
            "null"
          ],
          "description": "buy_usd minus sell_usd. Buy-side signal types require this to be positive."
        },
        "tx_first": {
          "type": [
            "string",
            "null"
          ],
          "description": "Earliest transaction date among the purchases behind the signal."
        },
        "tx_last": {
          "type": [
            "string",
            "null"
          ],
          "description": "Latest transaction date among the purchases behind the signal."
        },
        "tx_days": {
          "type": [
            "integer",
            "null"
          ],
          "minimum": 0,
          "description": "Number of distinct transaction dates behind the signal (sessions, not rows)."
        },
        "filing_lag_bdays_max": {
          "type": [
            "integer",
            "null"
          ],
          "minimum": 0,
          "description": "Largest transaction-to-filing lag in business days. Form 4 is due within two business days; larger values mean late filing."
        },
        "late_filed_n": {
          "type": [
            "integer",
            "null"
          ],
          "minimum": 0,
          "description": "How many purchase rows were filed later than two business days after the transaction."
        },
        "issuer_class": {
          "type": [
            "string",
            "null"
          ],
          "enum": [
            "operating",
            "registered_fund",
            "unknown",
            null
          ],
          "description": "Issuer class from the SEC submissions record: operating company, registered investment fund, or unknown (not yet looked up)."
        }
      }
    },
    "removed_fund_issuer": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "code",
        "ticker",
        "rows",
        "total_usd"
      ],
      "properties": {
        "code": {
          "const": "fund_issuer_excluded",
          "description": "Removal reason."
        },
        "ticker": {
          "type": [
            "string",
            "null"
          ],
          "description": "Issuer ticker as filed."
        },
        "rows": {
          "type": "integer",
          "minimum": 0,
          "description": "Purchase lines excluded for this fund issuer."
        },
        "total_usd": {
          "type": [
            "number",
            "null"
          ],
          "description": "Sum of the excluded purchase values, in USD."
        }
      },
      "description": "Registered investment fund issuer: purchases are fund-share subscriptions, not insider buying."
    }
  }
}
