{"openapi":"3.1.0","info":{"title":"KeyVex API","version":"0.78.1","description":"US public financial-disclosure data — congressional trades, insider filings (Form 4), lobbying, Treasury auctions, member profiles. Requires an API key — create a free one at https://keyvex.com and send it as the header `x-api-key: <YOUR_KEY>`. A free key returns full data, capped at 60 requests/day; paid tiers raise the cap. The daily allowance resets at midnight Eastern."},"servers":[{"url":"https://api.keyvex.com"}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"x-api-key"}}},"security":[{"ApiKeyAuth":[]}],"paths":{"/v1/insider-filings":{"get":{"operationId":"get_insider_filings","summary":"Returns FILING-LEVEL records from SEC Form 3/4/5 filings — one row per filing (accession)","description":"Returns FILING-LEVEL records from SEC Form 3/4/5 filings — one row per filing (accession). Use this when the user asks: list an issuer's insider filings, find a specific accession, filter by form type (Form 4 trades vs Form 3 initial statements vs Form 5 annual vs their /A amendments), count filings over a period, or size a filing (how many transaction / holding rows it has) before pulling detail.  This is the filing INDEX. For the actual trades use get_insider_transactions; for the positions use get_insider_holdings. They join on accession_number.  Source: SEC bulk Form 3/4/5 dataset (insider_filings_v2), 2006→present, refreshed quarterly. Each row carries the SUBMISSION envelope (company_cik, company_name, ticker, document_type, filing_date, period_of_report, is_amendment), ALL reporting owners (reporting_owners[]), signature rows, and per-table counts (nonderiv_trans_count, deriv_trans_count, nonderiv_holding_count, deriv_holding_count, footnote_count).  Useful filter combos:   ticker='AAPL', document_type='4'          all Apple Form 4 filings   company_cik='0000320193', is_amendment=true   Apple's amended filings only   accession_number='0000320193-26-000078'   one specific filing's envelope   ticker='TSLA', since='2025-01-01'          TSLA insider filings this year   ticker='NVDA', reporting_owner_name='Huang'   NVDA filings involving Huang  document_type values are the raw SEC form codes: '3', '4', '5' and their amendments '3/A', '4/A', '5/A'.","parameters":[{"name":"accession_number","in":"query","required":false,"description":"Exact EDGAR accession number — returns that one filing's envelope directly.","schema":{"type":"string"}},{"name":"ticker","in":"query","required":false,"description":"Exact issuer ticker (e.g., 'AAPL', 'BRK.B').","schema":{"type":"string"}},{"name":"company_cik","in":"query","required":false,"description":"Issuer CIK (10-digit, leading-zero padded). All of that company's insider filings.","schema":{"type":"string"}},{"name":"company_name","in":"query","required":false,"description":"Case-insensitive substring against issuer company name (e.g., 'Apple', 'Tesla').","schema":{"type":"string"}},{"name":"document_type","in":"query","required":false,"description":"Exact SEC form code: '3' (initial), '4' (changes), '5' (annual), or amendments '3/A' / '4/A' / '5/A'.","schema":{"type":"string"}},{"name":"is_amendment","in":"query","required":false,"description":"True returns only amendments (/A forms); false returns only originals. Omit for both.","schema":{"type":"boolean"}},{"name":"reporting_owner_name","in":"query","required":false,"description":"Case-insensitive substring matched against ANY reporting owner on the filing (scans reporting_owners[]). Best combined with ticker/company_cik.","schema":{"type":"string"}},{"name":"since","in":"query","required":false,"description":"ISO date (YYYY-MM-DD). Only filings with filing_date >= this date.","schema":{"type":"string"}},{"name":"until","in":"query","required":false,"description":"ISO date (YYYY-MM-DD). Only filings with filing_date <= this date.","schema":{"type":"string"}},{"name":"sort_by","in":"query","required":false,"description":"Sort field. Only filing_date is supported. Default: filing_date.","schema":{"type":"string","enum":["filing_date"]}},{"name":"sort_order","in":"query","required":false,"description":"Default: desc (most recent filings first).","schema":{"type":"string","enum":["desc","asc"]}},{"name":"limit","in":"query","required":false,"description":"Maximum records to return. Default 50, max 500.","schema":{"type":"integer"}}],"responses":{"200":{"description":"JSON envelope: { results: [...], count, has_more }."},"400":{"description":"Invalid parameter."},"401":{"description":"Missing or invalid API key."},"402":{"description":"This tool requires a higher plan (upgrade_required). Retrying will not help."},"429":{"description":"Tier rate/quota limit reached (rate_limited). Retry-After points at the reset."}}}},"/v1/insider-holdings":{"get":{"operationId":"get_insider_holdings","summary":"Returns per-security INSIDER POSITIONS from SEC Form 3/4/5 filings — one row per holding line reported by a corporate insider (director, officer, or 10%+ beneficial owner)","description":"Returns per-security INSIDER POSITIONS from SEC Form 3/4/5 filings — one row per holding line reported by a corporate insider (director, officer, or 10%+ beneficial owner). Use this when the user asks: what a specific insider currently HOLDS, who the largest insider holders of a stock are, an insider's position across companies, or direct-vs-indirect ownership structure. This is the position (stock) companion to get_insider_transactions (the buys/sells flow).  Source: SEC bulk Form 3/4/5 dataset (insider_holdings_v2), 2006→present, refreshed quarterly. Each row carries the filing envelope (company_cik, company_name, ticker, reporting_owner_cik/name, role flags, filing_date, period_of_report), the position (holding_type nonderiv|deriv, security_title, shrs_owned_following_trans, valu_owned_following_trans, direct_indirect_ownership D|I), and — for derivative holdings — conv_exercise_price, exercise_date, expiration_date, and underlying-security detail.  Useful filter combos:   ticker='NVDA', sort_order='desc'          most-recent NVDA insider holdings   reporting_owner_cik='0001214128'          one insider's positions everywhere   ticker='AAPL', holding_type='deriv'       AAPL insiders' option/RSU positions   ticker='TSLA', is_ten_percent_owner=true  10%+ owners of TSLA   company_cik='0000320193', min_value=1000000  Apple insiders holding >$1M   reporting_owner_name='Musk'               name substring (case-insensitive)  shares/value are 'following the reported transaction' — the position as of that filing, not a live real-time holding. For the trades themselves use get_insider_transactions; ownership ties together via reporting_owner_cik.","parameters":[{"name":"ticker","in":"query","required":false,"description":"Exact issuer ticker (e.g., 'AAPL', 'BRK.B').","schema":{"type":"string"}},{"name":"company_cik","in":"query","required":false,"description":"Issuer CIK (10-digit, leading-zero padded). Returns insider holdings across all reporting periods for that company.","schema":{"type":"string"}},{"name":"company_name","in":"query","required":false,"description":"Case-insensitive substring against issuer company name (e.g., 'Apple', 'Tesla').","schema":{"type":"string"}},{"name":"reporting_owner_cik","in":"query","required":false,"description":"Insider CIK (10-digit, leading-zero padded). Returns one insider's positions across every company they report on.","schema":{"type":"string"}},{"name":"reporting_owner_name","in":"query","required":false,"description":"Case-insensitive substring against the insider's name (e.g., 'Musk', 'Cook').","schema":{"type":"string"}},{"name":"holding_type","in":"query","required":false,"description":"'nonderiv' = direct securities (common stock); 'deriv' = derivative holdings (options, RSUs, warrants, convertibles). Omit for both.","schema":{"type":"string","enum":["nonderiv","deriv"]}},{"name":"direct_indirect_ownership","in":"query","required":false,"description":"'D' direct ownership, 'I' indirect (held via trust, LLC, family member, etc.).","schema":{"type":"string","enum":["D","I"]}},{"name":"is_director","in":"query","required":false,"description":"True returns only holdings reported by directors.","schema":{"type":"boolean"}},{"name":"is_officer","in":"query","required":false,"description":"True returns only holdings reported by officers.","schema":{"type":"boolean"}},{"name":"is_ten_percent_owner","in":"query","required":false,"description":"True returns only holdings reported by 10%+ beneficial owners.","schema":{"type":"boolean"}},{"name":"min_shares","in":"query","required":false,"description":"Minimum shares owned following the reported transaction. Use to focus on large positions.","schema":{"type":"number"}},{"name":"min_value","in":"query","required":false,"description":"Minimum USD value owned following the reported transaction. Use to focus on large positions.","schema":{"type":"number"}},{"name":"since","in":"query","required":false,"description":"ISO date (YYYY-MM-DD). Only holdings whose period_of_report >= this date.","schema":{"type":"string"}},{"name":"until","in":"query","required":false,"description":"ISO date (YYYY-MM-DD). Only holdings whose period_of_report <= this date.","schema":{"type":"string"}},{"name":"sort_by","in":"query","required":false,"description":"Sort field. Only period_of_report is supported. Default: period_of_report.","schema":{"type":"string","enum":["period_of_report"]}},{"name":"sort_order","in":"query","required":false,"description":"Default: desc (most recent reporting period first).","schema":{"type":"string","enum":["desc","asc"]}},{"name":"limit","in":"query","required":false,"description":"Maximum records to return. Default 50, max 500.","schema":{"type":"integer"}}],"responses":{"200":{"description":"JSON envelope: { results: [...], count, has_more }."},"400":{"description":"Invalid parameter."},"401":{"description":"Missing or invalid API key."},"402":{"description":"This tool requires a higher plan (upgrade_required). Retrying will not help."},"429":{"description":"Tier rate/quota limit reached (rate_limited). Retry-After points at the reset."}}}},"/v1/insider-transactions":{"get":{"operationId":"get_insider_transactions","summary":"Returns executive insider transactions filed on SEC Form 4 — open-market purchases and sales by officers, directors, and 10%-owners of public companies","description":"Returns executive insider transactions filed on SEC Form 4 — open-market purchases and sales by officers, directors, and 10%-owners of public companies. Each record is one transaction line item from one filing.  Use this when the user asks about: insider buying or selling at a specific company, all recent insider activity across the market, transactions by a specific officer, or large insider trades by value.  Form 4 is the fastest insider-trade signal in the public record — must be filed within 2 business days of the trade. The reporting_lag_days field tells you how stale a particular disclosure is.  Returns BOTH non-derivative rows (direct common-stock buys/sells, RSU vests, grants, gifts, tax-withholding sales) AND derivative rows (option exercises, warrant conversions, RSU/PSU activity). Filter to one or the other with is_derivative; filter to specific transaction codes with transaction_codes.  Common transaction codes:   P open-market purchase   |  S open-market sale   A grant / award / RSU vest  |  M exercise of derivative   X exercise of in/at-the-money derivative  |  C conversion of derivative   F payment of exercise price or tax with shares  |  G bona fide gift   D disposition to issuer (forced)  |  I 401(k)/ESPP  |  V voluntary  Useful filter combos:   transaction_codes=['P']              open-market buys only (highest signal)   transaction_codes=['M','X']          option exercises (cash-out trigger)   transaction_codes=['A']              grants / RSU vests   is_derivative=true                   all option/RSU/warrant activity   is_derivative=false, transaction_type='sell', min_value=1000000                                        large open-market sells of common stock  Optional include_baseline=true: also returns matching Form 3 initial- ownership records (the insider's *starting* position when they first became an insider) under a `baselines` field. Use this when you need to know how big a sale is relative to the insider's full position — Form 4 alone shows the delta, Form 3 anchors the baseline. Requires ticker or company_cik to be set. Baseline rows with is_nil_filing=true are 'no securities owned' Form 3s (~half of all filings) — the insider filed but started with ZERO holdings; shares_owned 0 is the position, not missing data.  data_source SELECTS WHICH BACKING COLLECTION:   'bulk_v2' (DEFAULT as of 2026-05-24) — `insider_transactions_v2`     collection populated by SEC quarterly bulk Forms 3/4/5 TSV bundles.     Deeper history (2006q1 → latest published quarter, ~9.9M rows).     ⚠ RECENCY: the bulk dataset ends at the last PUBLISHED quarter     (SEC releases it ~2 weeks after quarter end). On simple recency     queries (descending sort, no v2-only filters) filings newer than     that boundary are AUTO-MERGED from the live daily feed, so the     default view stays current — coverage_warning says when this     happened. For post-boundary browsing with v2-only filters, query     data_source:'legacy' directly.     INLINED FOOTNOTES (footnote_refs[] with resolved text on every row),     aff10b5one 10b5-1 plan flag, full reporting_owners array, schema_era.     Filters: ticker, company_cik, reporting_owner_cik,     reporting_owner_name (substring), row_type ('nonderiv'|'deriv'),     trans_codes, aff10b5one, schema_era ('pre_2023'|'2023_plus'),     since/until, sort_by ('transaction_date'|'filing_date').     BACKWARD-COMPAT: every v2 row also carries the LEGACY field aliases     (disclosure_date, transaction_code, shares, price_per_share,     total_value, acquired_disposed, shares_owned_after, officer_name,     is_derivative, reporting_lag_days, data_source, sec_filing_url) so     callers reading the old field names keep working. The     `transaction_type` field carries the legacy 'buy'|'sell' semantic     (synthesized from trans_code + trans_acquired_disp_cd, identical     algorithm to the legacy scraper); the v2 nonderiv|deriv discriminator     lives at `row_type`.   'legacy' — `insider_trades` collection populated by KeyVex's daily     EDGAR scraper. Shallower coverage (2022+), no footnotes, no     aff10b5one, ~91% fewer filings in the same window than bulk_v2.     Filters: ticker, company_cik, officer_name, transaction_type     (buy|sell), is_derivative, transaction_codes, min_value, since/until,     sort_by (disclosure_date|transaction_date|total_value).     Use this only when you specifically need the legacy doc shape with     NO v2-extension fields.  SEC-SOURCE DATE CONVENTIONS — read raw values with these in mind:  KeyVex preserves SEC's authoritative bytes exactly as published. Two recurring source-data patterns are worth recognizing so agents interpret raw date values correctly:    (1) PERPETUAL-INSTRUMENT SENTINEL — exercise_date or expiration_date   values of 2050-12-31 / 2050-08-31 ARE SEC's established convention   for instruments with no calendar expiration (Deferred Stock Units,   certain Non-Qualified Stock Options, Units of Limited Partnership   Interest, similar perpetual or condition-vested derivatives). Read   these as 'no expiration,' not as literal calendar dates in 2050.   This is a fact about SEC's schema, not an inference.    (2) ANOMALOUS-YEAR FILER-ENTRY PATTERN — date values with   out-of-range year components — e.g., 0012-11-21 or 0025-07-25   (likely 2-digit years entered into a 4-digit field), or 2027-01-25   on a 2026 filing / 2028-03-19 on a 2024 filing (likely single-digit   transpositions) — appear to be filer data-entry typos preserved   verbatim from SEC's primary filings. KeyVex verified on a stratified   spot-check that these values are byte-identical between SEC's primary   XML and SEC's bulk extract (22 / 22 matches across all observed   pattern faces); the SEC-to-KeyVex transit is faithful. The pattern   is ongoing — observed across filings from 2014 through 2026, not   legacy-only. Cross-reference filing_date to infer the likely   intended year.    (3) NUMERIC PRECISION — for data_source='bulk_v2', shares and   price_per_share mirror SEC's BULK Form 345 extract, which rounds to   2 decimals (e.g. 474.6, where the primary XML shows 474.598). That   rounding is SEC's, in the bulk feed — KeyVex stores the bulk value   verbatim (no rounding in the loader). Audit v2 numerics against the   bulk extract (the source of record), not the XML primary document,   which carries fuller precision. Dates and transaction codes DO match   the XML exactly.  Pure-publisher posture: KeyVex mirrors SEC's exact bytes, documents these conventions and filer quirks rather than altering them, and never silently 'corrects' a value to KeyVex's guess of what was meant. A customer auditing KeyVex against EDGAR's source of record for each row (the bulk Form 345 extract for v2 rows) will find a byte-for-byte match.  MACHINE-READABLE FLAGS — responses include a `source_metadata` block on rows where the above SEC-source patterns are detected. The block is keyed by field name, with an array of flag strings per field: `sec_perpetual_sentinel` (assertive — exact-string match on a known SEC sentinel value); `anomalous_year_likely_filer_entry` (calibrated — year outside the plausible range on transaction_date, exercise_date, expiration_date, or period_of_report; covers filing-pipeline data quality issues across the upstream-actor stack including filer typos, filing-agent default-epoch substitutions, and other cause-classes where the year falls outside any plausible range). Presence is the signal: clean rows have NO `source_metadata` field at all (not an empty object — the field is omitted entirely). Absence means 'no SEC source quirks detected,' NOT 'certified clean by audit' — agents weigh the difference. The raw source date values are preserved unchanged; the flag block carries KeyVex's labeled interpretation alongside, never replacing.","parameters":[{"name":"ticker","in":"query","required":false,"description":"Stock symbol filter, e.g. 'AAPL'. Case-insensitive.","schema":{"type":"string"}},{"name":"company_cik","in":"query","required":false,"description":"SEC CIK number (10-digit, padded with leading zeros). Alternative to ticker when known.","schema":{"type":"string"}},{"name":"officer_name","in":"query","required":false,"description":"Full or partial officer name; case-insensitive substring match.","schema":{"type":"string"}},{"name":"transaction_type","in":"query","required":false,"description":"Filter by direction (buy/sell). Works on BOTH data_sources. For legacy, this filters the stored field directly. For bulk_v2 (default), the field is derived per row from trans_code + trans_acquired_disp_cd (P→buy, S→sell, acqDisp=A→buy, acqDisp=D→sell, fallback A/M/X/C/I→buy else sell — same algorithm legacy uses); the v2 path pages through Firestore until enough matches are found and reports has_more accurately on the filtered set.","schema":{"type":"string","enum":["buy","sell"]}},{"name":"is_derivative","in":"query","required":false,"description":"Filter to derivative rows (options, RSUs, warrants, convertibles) when true, or non-derivative common-stock rows when false. Omit to see both. Works on BOTH data_sources — on bulk_v2 it maps to row_type ('deriv'/'nonderiv'); passing is_derivative and a conflicting row_type is rejected.","schema":{"type":"boolean"}},{"name":"transaction_codes","in":"query","required":false,"description":"OR-filter on raw SEC transaction codes. Common picks: ['P'] open-market buys; ['S','F'] sells + tax-withholding; ['M','X'] option exercises; ['A'] grants/RSU vests; ['G'] gifts. Max 30 codes. (comma-separated)","schema":{"type":"string"}},{"name":"min_value","in":"query","required":false,"description":"Filter to trades with total_value >= this amount (USD). Use to focus on large trades.","schema":{"type":"number"}},{"name":"since","in":"query","required":false,"description":"ISO date (YYYY-MM-DD). Only records on or after this date, using sort_by as the date field.","schema":{"type":"string"}},{"name":"until","in":"query","required":false,"description":"ISO date (YYYY-MM-DD). Only records on or before this date.","schema":{"type":"string"}},{"name":"sort_by","in":"query","required":false,"description":"Field used for ordering and for the since/until date filters. Default: disclosure_date. Validity differs by data_source: 'transaction_date' works on BOTH; 'disclosure_date' works on both (on the default bulk_v2 it maps to filing_date); 'total_value' is LEGACY-ONLY — bulk_v2 rejects it, so to rank by trade size on bulk_v2 use min_amount to filter and sort by transaction_date instead.","schema":{"type":"string","enum":["disclosure_date","transaction_date","total_value"]}},{"name":"sort_order","in":"query","required":false,"description":"Default: desc (most recent / largest first).","schema":{"type":"string","enum":["desc","asc"]}},{"name":"limit","in":"query","required":false,"description":"Maximum records to return. Default 50, max 500.","schema":{"type":"integer"}},{"name":"include_baseline","in":"query","required":false,"description":"When true, the response includes matching Form 3 initial-ownership records under a `baselines` field — lets you anchor Form 4 deltas to the insider's starting position. Requires ticker or company_cik. Default false. (Legacy data_source only.)","schema":{"type":"boolean"}},{"name":"data_source","in":"query","required":false,"description":"Which backing collection to query. 'bulk_v2' (DEFAULT as of 2026-05-24) = SEC quarterly bulk dataset, 2006q1 → the last PUBLISHED SEC quarter (SEC releases it ~2 weeks after quarter end; the live boundary is stated in coverage_warning). Footnote_refs[] inlined, aff10b5one present, full reporting_owners array, deeper coverage. Rows carry legacy field aliases for backward compat. On simple recency queries (descending, no v2-only filters) filings NEWER than the bulk boundary are automatically merged in from the live daily feed, so the default view stays current. 'legacy' = daily EDGAR scraper output (insider_trades collection, 2022+ only, no footnotes, no 10b5-1 flag) — AND holds ~91% fewer filings than bulk_v2 for the same window. Use 'legacy' ONLY when you specifically need the legacy document shape, or to browse post-boundary filings with filters the auto-merge can't map. bulk_v2 (the default) is authoritative for coverage.","schema":{"type":"string","enum":["legacy","bulk_v2"]}},{"name":"reporting_owner_cik","in":"query","required":false,"description":"Reporting owner CIK (10-digit, zero-padded). bulk_v2 only — legacy uses officer_name substring instead.","schema":{"type":"string"}},{"name":"reporting_owner_name","in":"query","required":false,"description":"Reporting owner name substring (case-insensitive). bulk_v2 only — legacy uses officer_name instead. IMPORTANT: name is matched client-side over a recent window, so it must be ANCHORED by ticker, company_cik, or reporting_owner_cik to search the full history — a name on its own only scans the most recent filings and can miss older trades (the response carries a coverage_warning when used unanchored).","schema":{"type":"string"}},{"name":"row_type","in":"query","required":false,"description":"bulk_v2 only. Source-table discriminator: 'nonderiv' for NONDERIV_TRANS rows (direct common-stock activity), 'deriv' for DERIV_TRANS rows (options/RSUs/warrants). For legacy data, use is_derivative instead.","schema":{"type":"string","enum":["nonderiv","deriv"]}},{"name":"trans_codes","in":"query","required":false,"description":"bulk_v2 only. OR-filter on raw SEC trans_code values (P, S, A, M, X, C, F, G, D, I, V, etc.). Same semantics as legacy transaction_codes but applied to the v2 field name. Max 30 codes. (comma-separated)","schema":{"type":"string"}},{"name":"aff10b5one","in":"query","required":false,"description":"bulk_v2 only. 10b5-1 trading-plan flag. '1' = plan adopted, '0' = no plan, '' = filer left the box blank (most common in 2023q1+ era), 'NOT_TRACKED' = pre-2023 era where the column did not exist on the SEC form. Filers often leave the box blank but disclose the plan in narrative footnotes — check footnote_refs[] for trans_code annotations.","schema":{"type":"string","enum":["1","0","","NOT_TRACKED"]}},{"name":"schema_era","in":"query","required":false,"description":"bulk_v2 only. Form-version era. 'pre_2023' = filings made 2006q1 through 2022q4 (no AFF10B5ONE column). '2023_plus' = filings made 2023q1 onward (AFF10B5ONE column present, matches SEC Rule 10b5-1 amendment compliance date). Driven by FILING-quarter, not transaction_date — a late 2024 filing of an old 2009 trade still gets schema_era=2023_plus.","schema":{"type":"string","enum":["pre_2023","2023_plus"]}},{"name":"include_non_open_market","in":"query","required":false,"description":"Phase A v0.52.0 (2026-05-24): controls whether NON-MARKET events appear in the result. When false (the honest default for direction queries), the result keeps ONLY OPEN_MARKET rows (transaction_nature='OPEN_MARKET') plus INSUFFICIENT_DATA rows (passthrough — unclassified is not the same as confirmed-non-market, never silently dropped). It excludes BOTH NON_OPEN_MARKET_TRANSFER (gifts G, tax-withhold F, disposition-to-issuer D, will/inheritance W, voting-trust Z, tender U) AND EQUITY_COMP (grants A, exercises M/X/O, 401k/ESPP I, conversions C) — neither is a true open-market trade. Honest-by-default: when transaction_type='buy'|'sell' is set, defaults to FALSE; pass true to opt back in and see all natures. When transaction_type is NOT set, defaults to TRUE (returns everything, honestly tagged); pass false for a clean OPEN_MARKET+INSUFFICIENT_DATA view. The transaction_type field on each row is never mutated by this filter. The response envelope carries `unclassifiable_records_retained: N` when any INSUFFICIENT_DATA rows passed through, so the caller knows N of the returned rows couldn't be classified.","schema":{"type":"boolean"}}],"responses":{"200":{"description":"JSON envelope: { results: [...], count, has_more }."},"400":{"description":"Invalid parameter."},"401":{"description":"Missing or invalid API key."},"402":{"description":"This tool requires a higher plan (upgrade_required). Retrying will not help."},"429":{"description":"Tier rate/quota limit reached (rate_limited). Retry-After points at the reset."}}}},"/v1/institutional-holdings":{"get":{"operationId":"get_institutional_holdings","summary":"Returns 13F holdings — quarterly snapshots of equity positions held by institutional investment managers with $100M+ AUM, filed with the SEC","description":"Returns 13F holdings — quarterly snapshots of equity positions held by institutional investment managers with $100M+ AUM, filed with the SEC. Each record is one (fund, security, quarter) tuple.  Use this when the user asks about: which institutions hold a stock, a fund's portfolio, position changes quarter-over-quarter, or 'whale' activity in a specific name.  Reporting lag: up to 45 days after quarter end. A 2026-Q1 filing typically appears in mid-May 2026. The most recent quarter visible always lags real time.  Important: 13F covers institutional managers ≥ $100M AUM but does NOT include short positions, cash, options (with rare exceptions), or non-US-listed equities. It's a snapshot of long equity positions only. For 'did the fund increase its AAPL stake?' questions, check the position_change field — values are 'new', 'increased', 'decreased', 'closed', or 'unchanged' relative to the same fund's prior quarter.","parameters":[{"name":"ticker","in":"query","required":false,"description":"Filter to holdings of one stock by US ticker, e.g. 'AAPL'. Case-insensitive.","schema":{"type":"string"}},{"name":"cusip","in":"query","required":false,"description":"Alternative to ticker — 9-character SEC CUSIP identifier. Useful when a security has multiple share classes with different tickers.","schema":{"type":"string"}},{"name":"fund_name","in":"query","required":false,"description":"Full or partial fund name; case-insensitive substring match. Examples: 'Berkshire', 'Bridgewater', 'Citadel'.","schema":{"type":"string"}},{"name":"fund_cik","in":"query","required":false,"description":"SEC CIK of the fund (10-digit, padded). Preferred over fund_name when known. Berkshire Hathaway = '0001067983'.","schema":{"type":"string"}},{"name":"quarter","in":"query","required":false,"description":"Period ending date in YYYY-MM-DD form (e.g. '2026-03-31'). Defaults to all quarters available in the database.","schema":{"type":"string"}},{"name":"position_change","in":"query","required":false,"description":"Filter to position-change type. Common queries: 'increased' for funds adding to a position, 'closed' for funds that exited.","schema":{"type":"string","enum":["new","increased","decreased","closed","unchanged"]}},{"name":"min_value","in":"query","required":false,"description":"Filter to positions with market_value >= this amount (USD). Use to focus on large positions.","schema":{"type":"number"}},{"name":"sort_by","in":"query","required":false,"description":"Field used for ordering. Default: market_value (largest positions first).","schema":{"type":"string","enum":["market_value","shares_held","shares_change_pct"]}},{"name":"sort_order","in":"query","required":false,"description":"Default: desc (largest first).","schema":{"type":"string","enum":["desc","asc"]}},{"name":"limit","in":"query","required":false,"description":"Maximum records to return. Default 50, max 500.","schema":{"type":"integer"}}],"responses":{"200":{"description":"JSON envelope: { results: [...], count, has_more }."},"400":{"description":"Invalid parameter."},"401":{"description":"Missing or invalid API key."},"402":{"description":"This tool requires a higher plan (upgrade_required). Retrying will not help."},"429":{"description":"Tier rate/quota limit reached (rate_limited). Retry-After points at the reset."}}}},"/v1/congressional-trades":{"get":{"operationId":"get_congressional_trades","summary":"Returns trade records disclosed by U.S","description":"Returns trade records disclosed by U.S. members of Congress under the STOCK Act — Senate eFD and House Clerk Periodic Transaction Reports (PTRs). Each record is one disclosed transaction by a member or their immediate family.  Use this when the user asks about: who in Congress traded a specific stock, what trades a specific member made, recent congressional trading activity, or filings within a date range.  Important: This data is *disclosed* trades, with reporting lag up to 45 days. The disclosure_date is when the public could first see the trade; the transaction_date is when the trade actually happened. For 'what did Congress just disclose buying' questions, sort by disclosure_date. For 'what did Congress hold around a specific market event', filter by transaction_date.  Each amount is a range like '$1,001 - $15,000' (Senate filers report ranges, not exact amounts). The amount_min and amount_max fields parse those bounds for filtering. STOCK Act allows reporting in 11 standard ranges from $1,001 up to over $50,000,000.","parameters":[{"name":"ticker","in":"query","required":false,"description":"Stock symbol filter, e.g. 'AAPL'. Case-insensitive. Leave empty to query across all tickers.","schema":{"type":"string"}},{"name":"member_name","in":"query","required":false,"description":"Full or partial member name; case-insensitive substring match. Examples: 'Collins', 'Pelosi'.","schema":{"type":"string"}},{"name":"bioguide_id","in":"query","required":false,"description":"Member's permanent congressional ID, e.g. 'C001035' for Susan Collins. Preferred over member_name when known. Pair with get_member_profile to enrich a trade with the member's party/state/committee assignments.","schema":{"type":"string"}},{"name":"chamber","in":"query","required":false,"description":"Filter to one chamber. Senate PTRs are HTML-parsed from efdsearch.senate.gov. House PTRs are PDF-parsed from disclosures-clerk.house.gov.","schema":{"type":"string","enum":["senate","house"]}},{"name":"transaction_type","in":"query","required":false,"description":"Filter by disclosed transaction type. 'buy' = Purchase (P); 'sell' = Sale, full or partial (S); 'exchange' = Exchange (E) — bond maturities, corporate spin-offs, and share-class exchanges, which are disclosed trades too. Leave empty to include all three.","schema":{"type":"string","enum":["buy","sell","exchange"]}},{"name":"owner","in":"query","required":false,"description":"Who owns the asset. STOCK Act covers spouse and dependent children's trades too — this filter narrows to one ownership category.","schema":{"type":"string","enum":["Self","Spouse","Joint","Dependent"]}},{"name":"since","in":"query","required":false,"description":"ISO date (YYYY-MM-DD). Only records on or after this date, using sort_by as the date field.","schema":{"type":"string"}},{"name":"until","in":"query","required":false,"description":"ISO date (YYYY-MM-DD). Only records on or before this date.","schema":{"type":"string"}},{"name":"min_amount","in":"query","required":false,"description":"Filter to trades with amount_min >= this value (USD). Use to focus on larger disclosed trades. Note: amount ranges are minimums, so '$1,001 - $15,000' has amount_min=1001.","schema":{"type":"number"}},{"name":"sort_by","in":"query","required":false,"description":"Field used by since/until and ordering. Default: disclosure_date (when the public first saw the trade).","schema":{"type":"string","enum":["disclosure_date","transaction_date"]}},{"name":"sort_order","in":"query","required":false,"description":"Default: desc (most recent first).","schema":{"type":"string","enum":["desc","asc"]}},{"name":"limit","in":"query","required":false,"description":"Maximum records to return. Default 50, max 500.","schema":{"type":"integer"}},{"name":"include_non_open_market","in":"query","required":false,"description":"Phase A v0.52.0 (2026-05-24): controls whether NON-MARKET events appear in the result. When false (honest default for direction queries), keeps ONLY OPEN_MARKET rows plus INSUFFICIENT_DATA rows (passthrough — unclassified is not the same as confirmed non-market, never silently dropped). Excludes both NON_OPEN_MARKET_TRANSFER (charitable contributions, gifts, donations detected in `comment`) AND EQUITY_COMP (rare for congressional but handled identically for parity). Honest-by-default: with transaction_type='buy'|'sell' → defaults to FALSE so a charitable contribution can't pollute a sell-total query. Without transaction_type → defaults to TRUE (everything tagged honestly). The transaction_type field on each row is NEVER mutated. Example: `member_name:'Pelosi', transaction_type:'sell'` by default EXCLUDES Pelosi's Trinity University contribution; `include_non_open_market:true` re-includes it. Envelope carries `unclassifiable_records_retained: N` when any INSUFFICIENT_DATA rows passed through.","schema":{"type":"boolean"}}],"responses":{"200":{"description":"JSON envelope: { results: [...], count, has_more }."},"400":{"description":"Invalid parameter."},"401":{"description":"Missing or invalid API key."},"402":{"description":"This tool requires a higher plan (upgrade_required). Retrying will not help."},"429":{"description":"Tier rate/quota limit reached (rate_limited). Retry-After points at the reset."}}}},"/v1/planned-insider-sales":{"get":{"operationId":"get_planned_insider_sales","summary":"Returns Form 144 filings — notices of proposed sale by corporate insiders (officers, directors, 10%+ holders) under Rule 144 of the Securities Act","description":"Returns Form 144 filings — notices of proposed sale by corporate insiders (officers, directors, 10%+ holders) under Rule 144 of the Securities Act. Each record is one planned-sale line from one filing.  Use this when the user asks about: insiders who have announced they're about to sell, upcoming insider sales at a specific company, large planned sales by value, or which executives are signaling intent to exit positions.  Form 144 is a *forward-looking* signal. It's filed BEFORE the actual sale, which later lands as a Form 4. The complement to get_insider_transactions: that tool tells you what insiders just did, this one tells you what they're about to do. Filing thresholds: ≥5,000 shares OR ≥$50,000 aggregate value.  The aggregate_market_value is the insider's estimate at filing time; the actual sale price/value can differ. The approximate_sale_date is also an estimate — the real Form 4 transaction_date may be days later.  Most Form 144 filings list one security line, but a single filing can cover multiple share classes (e.g., separate Class A + Class B). Each line is returned as its own record.","parameters":[{"name":"ticker","in":"query","required":false,"description":"Stock symbol filter, e.g. 'AAPL'. Case-insensitive.","schema":{"type":"string"}},{"name":"company_cik","in":"query","required":false,"description":"SEC CIK number (10-digit, padded with leading zeros). Alternative to ticker when known.","schema":{"type":"string"}},{"name":"filer_name","in":"query","required":false,"description":"Full or partial filer name; case-insensitive substring match. Example: 'Cook' matches Tim Cook's filings. NOTE: plain substring (not word-boundary) match — a short surname can match mid-word too (e.g. 'Huang' also matches 'CHUANG'). Pass a longer/fuller name to disambiguate a specific person.","schema":{"type":"string"}},{"name":"min_value","in":"query","required":false,"description":"Filter to filings with aggregate_market_value >= this amount (USD). Use to focus on large planned sales.","schema":{"type":"number"}},{"name":"since","in":"query","required":false,"description":"ISO date (YYYY-MM-DD). Only records on or after this date, using sort_by as the date field.","schema":{"type":"string"}},{"name":"until","in":"query","required":false,"description":"ISO date (YYYY-MM-DD). Only records on or before this date.","schema":{"type":"string"}},{"name":"sort_by","in":"query","required":false,"description":"Field used for ordering and for the since/until date filters. Default: filing_date.","schema":{"type":"string","enum":["filing_date","approximate_sale_date","aggregate_market_value"]}},{"name":"sort_order","in":"query","required":false,"description":"Default: desc (most recent / largest first).","schema":{"type":"string","enum":["desc","asc"]}},{"name":"limit","in":"query","required":false,"description":"Maximum records to return. Default 50, max 500.","schema":{"type":"integer"}}],"responses":{"200":{"description":"JSON envelope: { results: [...], count, has_more }."},"400":{"description":"Invalid parameter."},"401":{"description":"Missing or invalid API key."},"402":{"description":"This tool requires a higher plan (upgrade_required). Retrying will not help."},"429":{"description":"Tier rate/quota limit reached (rate_limited). Retry-After points at the reset."}}}},"/v1/activist-stakes":{"get":{"operationId":"get_activist_stakes","summary":"Returns Schedule 13D / 13G beneficial-ownership disclosures — filings made by anyone holding ≥5% of a class of registered equity securities","description":"Returns Schedule 13D / 13G beneficial-ownership disclosures — filings made by anyone holding ≥5% of a class of registered equity securities. Each record is one reporting person on one filing (joint filings emit multiple rows under the same accession_number).  Use this when the user asks about: who's accumulating large stakes, activist campaigns, takeover targets, hostile bids, or institutional concentration in a name. Also for 'who owns this company at the 5%+ level?' questions.  Two flavors, distinguished by `is_activist`:   - **13D (is_activist=true)**: filer signals INTENT TO INFLUENCE     control. Activist campaigns, takeover stakes, hostile bidders.   - **13G (is_activist=false)**: filer is PASSIVE. Mutual funds,     advisers, banks, insurers, qualified institutional holders.  Filter `is_activist: true` to see only the takeover-style filings — much higher signal-to-noise than the 13G firehose, which is dominated by routine quarterly disclosures from Vanguard, BlackRock, etc.  COVERAGE FLOOR: KeyVex's ingestion of Schedule 13D/G filings begins January 2024. Filings before 2024 are not in the collection. A 13D/G query for activity in 2023 or earlier returns zero records — this is the collection's coverage boundary, not a per-entity gap.  13D/A and 13G/A AMENDMENT EXIT FILINGS: when a filer reports they have divested below the 5% threshold, the resulting row carries shares_owned: 0 and percent_of_class: 0. These rows are CORRECT — an exit IS zero — not missing data. To distinguish active stakes from exit filings, filter by shares_owned > 0 or by min_percent_of_class.  The full 'Item 4: Purpose of Transaction' narrative on a 13D lives on the HTML side of the filing — not exposed by this tool. Follow the sec_filing_url for that.","parameters":[{"name":"ticker","in":"query","required":false,"description":"Issuer stock symbol filter, e.g. 'AAPL'. Case-insensitive.","schema":{"type":"string"}},{"name":"company_cik","in":"query","required":false,"description":"Issuer SEC CIK (10-digit, padded with leading zeros). Alternative to ticker.","schema":{"type":"string"}},{"name":"cusip","in":"query","required":false,"description":"9-character CUSIP of the security being reported on. Useful for cross-class filings (preferred vs common).","schema":{"type":"string"}},{"name":"filer_name","in":"query","required":false,"description":"Full or partial filer name; case-insensitive substring match. Example: 'BlackRock' matches all BlackRock entities.","schema":{"type":"string"}},{"name":"filer_cik","in":"query","required":false,"description":"Filer (reporting person) CIK. Exact match.","schema":{"type":"string"}},{"name":"is_activist","in":"query","required":false,"description":"Filter to 13D filings only (true) or 13G only (false). Omit to include both. Use is_activist=true to surface takeover/activist signal.","schema":{"type":"boolean"}},{"name":"filing_type","in":"query","required":false,"description":"Exact filing type. /A variants are amendments. Original 13D/G filings (no /A) signal a fresh crossing of the 5% threshold.","schema":{"type":"string","enum":["SCHEDULE 13D","SCHEDULE 13D/A","SCHEDULE 13G","SCHEDULE 13G/A"]}},{"name":"min_percent_of_class","in":"query","required":false,"description":"Filter to filings where percent_of_class >= this value. Use to focus on large/concentrated stakes.","schema":{"type":"number"}},{"name":"since","in":"query","required":false,"description":"ISO date (YYYY-MM-DD). Only records on or after this date, using sort_by as the date field.","schema":{"type":"string"}},{"name":"until","in":"query","required":false,"description":"ISO date (YYYY-MM-DD). Only records on or before this date.","schema":{"type":"string"}},{"name":"sort_by","in":"query","required":false,"description":"Field used for ordering and for the since/until date filters. Default: filing_date.","schema":{"type":"string","enum":["filing_date","event_date","percent_of_class","shares_owned"]}},{"name":"sort_order","in":"query","required":false,"description":"Default: desc (most recent / largest first).","schema":{"type":"string","enum":["desc","asc"]}},{"name":"limit","in":"query","required":false,"description":"Maximum records to return. Default 50, max 500.","schema":{"type":"integer"}}],"responses":{"200":{"description":"JSON envelope: { results: [...], count, has_more }."},"400":{"description":"Invalid parameter."},"401":{"description":"Missing or invalid API key."},"402":{"description":"This tool requires a higher plan (upgrade_required). Retrying will not help."},"429":{"description":"Tier rate/quota limit reached (rate_limited). Retry-After points at the reset."}}}},"/v1/federal-contracts":{"get":{"operationId":"get_federal_contracts","summary":"Returns federal contract awards from USAspending.gov — government spending data sourced from Treasury/GSA","description":"Returns federal contract awards from USAspending.gov — government spending data sourced from Treasury/GSA. Each record is one prime contract award (BPA Call, Purchase Order, Delivery Order, or Definitive Contract). Modifications appear as separate records.  Use this when the user asks about: who's getting federal contracts, how much a specific recipient (Lockheed Martin, RTX, Raytheon, Booz Allen, etc.) won this year/quarter, contracts by industry (NAICS code) or product type (PSC code), or to cross-reference congressional trading with contract awards.  Cross-source pattern (the political-alpha play):   1. get_congressional_trades(ticker:'LMT', since:'2026-01-01') —      find LMT trades by members of Congress.   2. get_federal_contracts(recipient_name:'Lockheed Martin',      since:'2026-01-01') — find LMT contract awards.   3. Compare timing — trades within 30 days before a major contract      are the high-signal cases.  recipient_name is a case-insensitive substring match — use the parent name ('Lockheed Martin') to catch all subsidiaries.  COVERAGE — live passthrough (source:'live'): each call queries USAspending's API over the full dataset (2007-10 onward), with recipient/NAICS/PSC/min-amount/date filters applied server-side. The response's `total_count` is USAspending's authoritative award count for your filtered query — USE IT for volume answers (the `results` array is just the requested page). `total_count` is omitted when a recipient_uei / awarding_agency filter (or dates keyed to a non-last_modified sort) is active — those apply after the upstream query. On USAspending outage the tool falls back to a recent cached window (source:'cache' + coverage_warning) — don't infer volume there.","parameters":[{"name":"recipient_name","in":"query","required":false,"description":"Recipient name substring; case-insensitive match. Example: 'Lockheed Martin' matches 'LOCKHEED MARTIN CORP', 'LOCKHEED MARTIN MISSILES AND FIRE CONTROL', etc.","schema":{"type":"string"}},{"name":"recipient_uei","in":"query","required":false,"description":"Unique Entity Identifier (replaced DUNS in 2022). 12-character alphanumeric. Exact match.","schema":{"type":"string"}},{"name":"awarding_agency","in":"query","required":false,"description":"Awarding agency exact name. Examples: 'Department of Defense', 'National Aeronautics and Space Administration', 'Department of Health and Human Services'.","schema":{"type":"string"}},{"name":"naics_code","in":"query","required":false,"description":"6-digit North American Industry Classification System code. Example: '541710' (R&D in Physical/Engineering/Life Sciences). Exact match.","schema":{"type":"string"}},{"name":"psc_code","in":"query","required":false,"description":"Product or Service Code (4-character). Example: 'AR33' (R&D Space Flight Advanced Development). Exact match.","schema":{"type":"string"}},{"name":"min_amount","in":"query","required":false,"description":"Filter to awards with award_amount >= this value (USD). Use to focus on large contracts.","schema":{"type":"number"}},{"name":"since","in":"query","required":false,"description":"ISO date (YYYY-MM-DD). Only records on or after this date, using sort_by as the date field.","schema":{"type":"string"}},{"name":"until","in":"query","required":false,"description":"ISO date (YYYY-MM-DD). Only records on or before this date.","schema":{"type":"string"}},{"name":"sort_by","in":"query","required":false,"description":"Field used for ordering and for the since/until filters. Default: last_modified_date (most-recently-modified first).","schema":{"type":"string","enum":["last_modified_date","start_date","award_amount","total_outlays"]}},{"name":"sort_order","in":"query","required":false,"description":"Default: desc.","schema":{"type":"string","enum":["desc","asc"]}},{"name":"limit","in":"query","required":false,"description":"Maximum records to return. Default 50, max 500.","schema":{"type":"integer"}}],"responses":{"200":{"description":"JSON envelope: { results: [...], count, has_more }."},"400":{"description":"Invalid parameter."},"401":{"description":"Missing or invalid API key."},"402":{"description":"This tool requires a higher plan (upgrade_required). Retrying will not help."},"429":{"description":"Tier rate/quota limit reached (rate_limited). Retry-After points at the reset."}}}},"/v1/federal-grants":{"get":{"operationId":"get_federal_grants","summary":"Returns federal GRANTS and cooperative agreements from USAspending","description":"Returns federal GRANTS and cooperative agreements from USAspending. Distinct universe from get_federal_contracts — recipients here are universities, non-profits, state and local agencies, research labs, healthcare institutions, public-private partnerships.  Award type codes covered: 02 (Block Grant), 03 (Formula Grant), 04 (Project Grant — most common), 05 (Cooperative Agreement).  Killer query patterns:   - All NIH R01 grants this quarter: cfda_number='93.847' + since=...   - State and local infrastructure funding: awarding_agency='Department of Transportation' + min_amount=1000000   - Recipient-specific grant history: recipient_name='Stanford'   - Recipient by federal UEI: recipient_uei='ABC123XYZ' (most precise)  Source: api.usaspending.gov — official Treasury federal-spending data. Awards covering both COVID/IIJA emergency-funding codes and routine appropriations. Pure-publisher posture: raw award data, no derived rankings or performance scores.  Filter combinations note: server-side indexes support one equality filter (recipient_uei / awarding_agency / cfda_number) plus a date or amount sort. Substring on recipient_name applied client-side after a wider pre-fetch window.  COVERAGE — live passthrough (source:'live'): each call queries USAspending's API over the full dataset (2007-10 onward), with recipient/CFDA/min-amount/date filters applied server-side. The response's `total_count` is USAspending's authoritative grant count for your filtered query — USE IT for volume answers (the `results` array is just the requested page). `total_count` is omitted when a recipient_uei / awarding_agency filter (or dates keyed to a non-last_modified sort) is active — those apply after the upstream query. Note: live cfda_number matching is against the award's FULL assistance-listings array (awards can carry several CFDAs); the cached fallback matches the primary listing only. On USAspending outage the tool falls back to a recent cached window (source:'cache' + coverage_warning) — don't infer volume there.","parameters":[{"name":"recipient_name","in":"query","required":false,"description":"Case-insensitive substring on recipient_name (e.g., 'Stanford', 'Mayo Clinic'). Substring filter; client-side.","schema":{"type":"string"}},{"name":"recipient_uei","in":"query","required":false,"description":"Exact federal UEI (Unique Entity ID) — most precise.","schema":{"type":"string"}},{"name":"awarding_agency","in":"query","required":false,"description":"Exact awarding-agency name (e.g., 'National Science Foundation', 'Department of Energy').","schema":{"type":"string"}},{"name":"cfda_number","in":"query","required":false,"description":"Catalog of Federal Domestic Assistance program number (e.g., '93.847' = NIH R01 research grants, '20.939' = highway safety improvement). Filter to one program.","schema":{"type":"string"}},{"name":"min_amount","in":"query","required":false,"description":"Inclusive lower bound on award_amount in dollars.","schema":{"type":"number"}},{"name":"since","in":"query","required":false,"description":"Inclusive lower bound on last_modified_date (YYYY-MM-DD).","schema":{"type":"string"}},{"name":"until","in":"query","required":false,"description":"Inclusive upper bound on last_modified_date (YYYY-MM-DD).","schema":{"type":"string"}},{"name":"sort_by","in":"query","required":false,"description":"Sort key. Default: last_modified_date.","schema":{"type":"string","enum":["last_modified_date","start_date","award_amount","total_outlays"]}},{"name":"sort_order","in":"query","required":false,"description":"Default: desc.","schema":{"type":"string","enum":["asc","desc"]}},{"name":"limit","in":"query","required":false,"description":"Max records. Default 50, max 500.","schema":{"type":"integer"}}],"responses":{"200":{"description":"JSON envelope: { results: [...], count, has_more }."},"400":{"description":"Invalid parameter."},"401":{"description":"Missing or invalid API key."},"402":{"description":"This tool requires a higher plan (upgrade_required). Retrying will not help."},"429":{"description":"Tier rate/quota limit reached (rate_limited). Retry-After points at the reset."}}}},"/v1/member-profile":{"get":{"operationId":"get_member_profile","summary":"Returns Congressional member profiles from the unitedstates/ congress-legislators catalog","description":"Returns Congressional member profiles from the unitedstates/ congress-legislators catalog. Each record is one current House Representative or Senator, keyed by bioguide_id (the permanent member identifier — e.g., 'C001035' for Susan Collins).  Use this when the user asks about: which committees a member sits on, who chairs the Senate Banking Committee, all Republicans on House Armed Services, party/state/district lookup for a specific member, or to enrich congressional_trades records with member context (party + state + committee assignments).  Filter by bioguide_id for a direct fetch; by member_name for a case-insensitive substring search; by committee_id (e.g., 'HSAS' for House Armed Services, 'SSAF' for Senate Agriculture, 'HSAG15' for the Forestry & Horticulture subcommittee under House Ag) to find all members of a committee. Combine state + chamber + party for caucus-level queries.  Committee codes follow the Library of Congress 'Thomas' convention:   House full committees: HSAG (Agriculture), HSAS (Armed Services),     HSAP (Appropriations), HSBA (Financial Services), HSED     (Education), HSEN (Energy & Commerce), HSII (Natural Resources),     HSJU (Judiciary), HSWM (Ways and Means), etc.   Senate full committees: SSAF (Ag), SSAS (Armed Services), SSAP     (Appropriations), SSBK (Banking), SSCM (Commerce), SSEG     (Energy), SSFI (Finance), SSHR (HELP), SSJU (Judiciary), etc.   Subcommittees append the subcommittee thomas_id: HSAG15, HSBA00.  Photo URLs are constructed (theunitedstates.io/images/congress/ original/{bioguide_id}.jpg) but Cloudflare-protected — clients fetch directly. Senate class field (1/2/3) on senators only.","parameters":[{"name":"bioguide_id","in":"query","required":false,"description":"Permanent member identifier — letter + 6 digits (e.g., 'C001035' for Susan Collins, 'P000197' for Nancy Pelosi). Direct doc lookup, fastest path.","schema":{"type":"string"}},{"name":"member_name","in":"query","required":false,"description":"Case-insensitive substring against full_name. Example: 'Pelosi' returns Nancy Pelosi.","schema":{"type":"string"}},{"name":"state","in":"query","required":false,"description":"2-letter state abbreviation (e.g., 'ME', 'CA'). Filters to members from that state — useful with chamber=senate to get the 2 senators from a state.","schema":{"type":"string"}},{"name":"chamber","in":"query","required":false,"description":"Filter to House Representatives or Senators.","schema":{"type":"string","enum":["house","senate"]}},{"name":"party","in":"query","required":false,"description":"'Democrat' | 'Republican' | 'Independent' | etc. Exact match — uses the YAML's spelling.","schema":{"type":"string"}},{"name":"committee_id","in":"query","required":false,"description":"Thomas committee code (full committee like 'HSAS' or subcommittee like 'HSAG15'). Returns all members of that committee.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Maximum records to return. Default 50, max 600 (~current Congress size).","schema":{"type":"integer"}}],"responses":{"200":{"description":"JSON envelope: { results: [...], count, has_more }."},"400":{"description":"Invalid parameter."},"401":{"description":"Missing or invalid API key."},"402":{"description":"This tool requires a higher plan (upgrade_required). Retrying will not help."},"429":{"description":"Tier rate/quota limit reached (rate_limited). Retry-After points at the reset."}}}},"/v1/material-events":{"get":{"operationId":"get_material_events","summary":"Returns Form 8-K filings — the SEC's 'current report' form, filed within 4 business days of any material event at a publicly-traded company","description":"Returns Form 8-K filings — the SEC's 'current report' form, filed within 4 business days of any material event at a publicly-traded company. Each record is one filing, with `item_codes` declaring WHAT kind of event(s) it covers.  Use this when the user asks about: recent CEO/CFO departures or appointments, M&A announcements, earnings releases, big contract wins, restructurings, going-concern warnings, exec compensation changes, or any 'what just happened at this company' question.  Item codes (most-used; many more exist):   1.01  Entry into a Material Definitive Agreement   1.02  Termination of a Material Definitive Agreement   2.01  Completion of Acquisition or Disposition of Assets   2.02  Results of Operations (earnings releases live here)   2.03  Creation of a Material Direct Financial Obligation   3.01  Notice of Delisting / Failure to Satisfy Listing Rule   3.02  Unregistered Sales of Equity Securities   4.01  Changes in Registrant's Certifying Accountant   5.02  Departure / Election / Appointment of Officers + Directors   5.07  Submission of Matters to a Vote of Security Holders   7.01  Regulation FD Disclosure   8.01  Other Events (catch-all)   9.01  Financial Statements and Exhibits — NOTE: nearly every 8-K         ticks this 'paperwork box.' Searching JUST for 9.01 returns         the firehose; combine it with another item_code to focus.  `item_codes` filter is OR-semantic: pass an array, match any filing containing AT LEAST ONE of those codes. Capped at 30 codes per query (Firestore array-contains-any limit). Examples: ['5.02'] for exec changes; ['1.01','2.01'] for any deal activity (LOI or close); ['2.02'] for earnings.  Amendments (8-K/A) get their own row with `is_amendment: true`. The original 8-K stays in place. v1 does NOT populate `original_accession_number`; agents can find candidates by matching (ticker, period_of_report) across rows. Filter `is_amendment: false` for clean original-only views.  v1 does not extract the prose body — `primary_document_url` points agents at the source HTML for direct fetch. The structured items are what's queryable here.","parameters":[{"name":"ticker","in":"query","required":false,"description":"Stock symbol filter, e.g. 'AAPL'. Case-insensitive.","schema":{"type":"string"}},{"name":"company_cik","in":"query","required":false,"description":"SEC CIK number (10-digit, padded with leading zeros). Alternative to ticker.","schema":{"type":"string"}},{"name":"item_codes","in":"query","required":false,"description":"Array of item codes to filter on (OR semantics). E.g., ['5.02'] for exec changes, ['1.01','2.01'] for any deal activity. Max 30 codes per query. (comma-separated)","schema":{"type":"string"}},{"name":"is_amendment","in":"query","required":false,"description":"Filter to only original 8-Ks (false) or only amendments / 8-K/A filings (true). Omit to include both.","schema":{"type":"boolean"}},{"name":"since","in":"query","required":false,"description":"ISO date (YYYY-MM-DD). Only records on or after this date, using sort_by as the date field.","schema":{"type":"string"}},{"name":"until","in":"query","required":false,"description":"ISO date (YYYY-MM-DD). Only records on or before this date.","schema":{"type":"string"}},{"name":"sort_by","in":"query","required":false,"description":"Field used for ordering and for since/until filters. filing_date = when filed with SEC; period_of_report = when the underlying event occurred. Default: filing_date. NOTE: a small number of 8-Ks (Reg-FD-only filings, item-7.01 disclosures) lack period_of_report at the SEC source — those rows fall back to filing_date ordering automatically, so sort_by='period_of_report' won't bury them.","schema":{"type":"string","enum":["filing_date","period_of_report"]}},{"name":"sort_order","in":"query","required":false,"description":"Default: desc (most recent first).","schema":{"type":"string","enum":["desc","asc"]}},{"name":"limit","in":"query","required":false,"description":"Maximum records to return. Default 50, max 500.","schema":{"type":"integer"}}],"responses":{"200":{"description":"JSON envelope: { results: [...], count, has_more }."},"400":{"description":"Invalid parameter."},"401":{"description":"Missing or invalid API key."},"402":{"description":"This tool requires a higher plan (upgrade_required). Retrying will not help."},"429":{"description":"Tier rate/quota limit reached (rate_limited). Retry-After points at the reset."}}}},"/v1/lobbying-filings":{"get":{"operationId":"get_lobbying_filings","summary":"Returns Lobbying Disclosure Act (LDA) filings — quarterly LD-2 reports filed by registered lobbyist firms with the Senate Office of Public Records","description":"Returns Lobbying Disclosure Act (LDA) filings — quarterly LD-2 reports filed by registered lobbyist firms with the Senate Office of Public Records. Each record covers one (registrant, client, quarter) tuple, listing income paid, issues lobbied on, and government entities contacted.  Use this when the user asks about: who's paying lobbyists, what issues a company is lobbying on, which senators or agencies a firm is contacting, lobbying spend by industry or sector, or to cross lobbying activity against congressional trades or federal contracts for political-influence analysis.  Each filing has a `lobbying_activities` array (one entry per issue area worked on) plus three flattened summary arrays at top level:   - general_issue_codes: 3-char codes (DEF, HEA, TRA, ENV, FIN, ...)   - government_entities: agencies/branches contacted   - lobbyist_names: lobbyists who worked the issue Top-level arrays support indexed queries; the nested array carries issue-level descriptions and lobbyist position info.  `general_issue_codes` filter is OR-semantic — pass an array, match any filing containing AT LEAST ONE of those codes (max 30, per Firestore array-contains-any). Examples: ['DEF'] for defense, ['HEA','MMM'] for health + Medicare/Medicaid, ['TAX','FIN'] for tax + financial services.  Income vs expenses (IMPORTANT for ranking by spend): the LDA mandates a hard split. Third-party lobbying firms report `income` (what the client paid them); in-house corporate lobbying departments report `expenses` (what they spent). The two fields are mutually exclusive — any given filing has one or the other, not both. In practice ~30% of filings have income, ~70% have expenses, with a small population reporting neither (administrative registrations). So `sort_by=income` ranks the third-party-firm subset; for an actual top-spenders leaderboard, agents should fetch both populations and sum `income + expenses` per filing client-side. v1.1 polish will add a derived `total_lobbying_spend` field that does this sum server-side for indexed queries. client_is_government is true when the client is a government body (US states often hire lobbyists).  Activity descriptions are truncated at 5000 chars during ingestion to stay under Firestore's per-doc cap; agents can fetch the full filing via filing_document_url for the unbounded prose.","parameters":[{"name":"registrant_name","in":"query","required":false,"description":"Substring match against the lobbying firm's name (case-insensitive). E.g., 'Akin Gump', 'Brownstein'.","schema":{"type":"string"}},{"name":"client_name","in":"query","required":false,"description":"Substring match against the paying client's name (case-insensitive). E.g., 'Pfizer', 'Lockheed Martin', 'STATE OF CALIFORNIA'.","schema":{"type":"string"}},{"name":"filing_year","in":"query","required":false,"description":"Calendar year of the reporting period (NOT the filing date).","schema":{"type":"integer"}},{"name":"filing_period","in":"query","required":false,"description":"Reporting period within filing_year. Quarters for LD-2; mid_year/year_end for LD-203 contributions windows.","schema":{"type":"string","enum":["first_quarter","second_quarter","third_quarter","fourth_quarter","mid_year","year_end"]}},{"name":"general_issue_codes","in":"query","required":false,"description":"Array of 3-char issue codes (OR semantics). E.g., ['DEF'] for defense, ['HEA','MMM'] for health+Medicare. Max 30 codes per query. (comma-separated)","schema":{"type":"string"}},{"name":"government_entity","in":"query","required":false,"description":"Substring match against any government entity contacted. E.g., 'SENATE', 'Treasury', 'FDA', 'Defense, Dept of'.","schema":{"type":"string"}},{"name":"min_income","in":"query","required":false,"description":"Filter to filings with income >= this amount (USD). Use to focus on big-dollar lobbying spend.","schema":{"type":"number"}},{"name":"since","in":"query","required":false,"description":"ISO date (YYYY-MM-DD). Only records on or after this date, using sort_by as the date field.","schema":{"type":"string"}},{"name":"until","in":"query","required":false,"description":"ISO date (YYYY-MM-DD). Only records on or before this date.","schema":{"type":"string"}},{"name":"sort_by","in":"query","required":false,"description":"Field used for ordering and for since/until filters. Default: dt_posted (when the filing was submitted).","schema":{"type":"string","enum":["dt_posted","filing_year","income"]}},{"name":"sort_order","in":"query","required":false,"description":"Default: desc (most recent / largest first).","schema":{"type":"string","enum":["desc","asc"]}},{"name":"limit","in":"query","required":false,"description":"Maximum records to return. Default 50, max 500.","schema":{"type":"integer"}}],"responses":{"200":{"description":"JSON envelope: { results: [...], count, has_more }."},"400":{"description":"Invalid parameter."},"401":{"description":"Missing or invalid API key."},"402":{"description":"This tool requires a higher plan (upgrade_required). Retrying will not help."},"429":{"description":"Tier rate/quota limit reached (rate_limited). Retry-After points at the reset."}}}},"/v1/lobbyist-contributions":{"get":{"operationId":"get_lobbyist_contributions","summary":"Returns LD-203 semiannual contribution reports — what registered lobbyists and lobbying firms themselves contribute: FECA campaign contributions, honorary expenses, event/meeting costs, and presidential-library / inaugural-committee donations, each item naming the HONOREE (the covered official who benefited)","description":"Returns LD-203 semiannual contribution reports — what registered lobbyists and lobbying firms themselves contribute: FECA campaign contributions, honorary expenses, event/meeting costs, and presidential-library / inaugural-committee donations, each item naming the HONOREE (the covered official who benefited). This is the reverse angle of get_lobbying_filings: filings show who pays lobbyists; LD-203 shows where the lobbyists' own money goes. Coverage: 2008→present (~40K filings/year; roughly half are 'no contributions' certifications, excluded by default — set include_empty=true to see them).  Record shape: one record per filing — filer (lobbyist name or registrant firm), filing_year + period (mid_year | year_end), nested contribution_items[] (contribution_type, contributor_name, payee_name, honoree_name, amount, date), flattened honoree_names[] / payee_names[] / contribution_types[], and contributions_total_usd (simple sum of item amounts).  Filters: honoree_name is the political join — substring against any item's honoree (e.g., 'schumer'). registrant_name matches the firm; lobbyist_name the individual filer; payee_name the receiving committee. contribution_type exact values: 'feca' (campaign money), 'honorary', 'meeting', 'presidential_library', 'inaugural_committee'.  Cross-source: pair with get_fec_contributions (the FEC's view of the same FECA money, itemized ≥$200), get_lobbying_filings (the same registrant's client work), get_member_profile (resolve the honoree to party/state/committees).  Pure-publisher posture: filings as posted to the Senate LDA system; contributions_total_usd is arithmetic, not a score.","parameters":[{"name":"filing_uuid","in":"query","required":false,"description":"Direct lookup by LDA filing UUID. Fastest path.","schema":{"type":"string"}},{"name":"registrant_name","in":"query","required":false,"description":"Case-insensitive substring against the lobbying firm / organization name.","schema":{"type":"string"}},{"name":"lobbyist_name","in":"query","required":false,"description":"Case-insensitive substring against the individual lobbyist's name.","schema":{"type":"string"}},{"name":"honoree_name","in":"query","required":false,"description":"Case-insensitive substring against any item's honoree — the covered official who benefited (e.g., 'schumer').","schema":{"type":"string"}},{"name":"payee_name","in":"query","required":false,"description":"Case-insensitive substring against any item's payee (the committee/entity paid).","schema":{"type":"string"}},{"name":"contribution_type","in":"query","required":false,"description":"Exact type: 'feca', 'honorary', 'meeting', 'presidential_library', 'inaugural_committee'.","schema":{"type":"string"}},{"name":"filing_year","in":"query","required":false,"description":"Filing year (2008→present).","schema":{"type":"integer"}},{"name":"filer_type","in":"query","required":false,"description":"Who filed: the individual lobbyist or the registrant firm.","schema":{"type":"string","enum":["lobbyist","registrant"]}},{"name":"include_empty","in":"query","required":false,"description":"Include 'no contributions' certifications (~half of all filings). Default false.","schema":{"type":"boolean"}},{"name":"since","in":"query","required":false,"description":"dt_posted lower bound (YYYY-MM-DD inclusive).","schema":{"type":"string"}},{"name":"until","in":"query","required":false,"description":"dt_posted upper bound (YYYY-MM-DD inclusive).","schema":{"type":"string"}},{"name":"sort_order","in":"query","required":false,"description":"Default: desc (most recently posted first).","schema":{"type":"string","enum":["asc","desc"]}},{"name":"limit","in":"query","required":false,"description":"Maximum filings to return. Default 50, max 500.","schema":{"type":"integer"}}],"responses":{"200":{"description":"JSON envelope: { results: [...], count, has_more }."},"400":{"description":"Invalid parameter."},"401":{"description":"Missing or invalid API key."},"402":{"description":"This tool requires a higher plan (upgrade_required). Retrying will not help."},"429":{"description":"Tier rate/quota limit reached (rate_limited). Retry-After points at the reset."}}}},"/v1/annual-financial-disclosures":{"get":{"operationId":"get_annual_financial_disclosures","summary":"Returns Form 278 (Public Financial Disclosure / Annual Financial Disclosure) filings — the annual snapshot members of Congress file each year showing assets, income sources, liabilities, transactions, gifts, outside positions, and (for spouse + dependent children) the same","description":"Returns Form 278 (Public Financial Disclosure / Annual Financial Disclosure) filings — the annual snapshot members of Congress file each year showing assets, income sources, liabilities, transactions, gifts, outside positions, and (for spouse + dependent children) the same.  SCOPE — v1 covers BOTH chambers: Senate (Senate eFD) and House (House Clerk). Filed by every senator and representative (and senior executive-branch officials, federal judges) by May 15 each year.  Use this when the user asks about: a member's asset composition, outside income sources, board seats / outside positions, liabilities (mortgages, loans), or for compliance / news reporting on annual disclosures.  CONTENT — when a filing's schedules were machine-parsed, `content_parsed` is true and the record carries structured `assets` (Schedule A) and `liabilities` arrays plus `asset_count` / `liability_count`. Values are SOURCE-FAITHFUL: `value_range` / `amount_range` are the disclosed RANGES verbatim (e.g., '$50,001 - $100,000'), NOT point estimates — KeyVex does not collapse a range to a single number. Net-worth roll-up is intentionally NOT provided (it would be a KeyVex-derived aggregate, not a disclosed value). When schedules are unavailable — Senate PAPER (scanned-image) filings, which carry no machine-readable text, or the occasional parse skip — `content_parsed` is false and `coverage_note` names the limitation; follow `report_url` to read the original. This honest coverage boundary is never a silent omission.  Different from get_congressional_trades: PTRs are per-trade real-time notices (filed within 30-45 days), while Form 278 is the year-end balance-sheet snapshot. Combine both for the full activity + position view of a member.  Report types: 'Annual' (yearly filing covering prior calendar year), 'New Filer' (initial disclosure on entering office), 'Termination' (final disclosure on leaving office), 'Combined' (annual+termination for filer who left mid-year), 'Amendment' (correction of a prior filing), 'Other' (rare).","parameters":[{"name":"bioguide_id","in":"query","required":false,"description":"Filer's bioguide_id (e.g., 'P000197' for Nancy Pelosi). Exact match. Most precise filter — BUT recently-filed records from new filers / candidates not yet in the member catalog have an empty bioguide_id until catalog back-fill runs (same as the party field below). So a bioguide_id query is not guaranteed exhaustive of a brand-new member's filings yet; cross-check with member_name for very recent filers.","schema":{"type":"string"}},{"name":"member_name","in":"query","required":false,"description":"Substring match against the filer's full name (case-insensitive). E.g., 'Pelosi', 'Mitch McConnell'. Use bioguide_id when possible for precision.","schema":{"type":"string"}},{"name":"chamber","in":"query","required":false,"description":"Filter to one chamber ('senate' or 'house'). v1 covers both.","schema":{"type":"string","enum":["senate","house"]}},{"name":"state","in":"query","required":false,"description":"Two-letter state code (e.g., 'CA', 'TX'). Exact match. Empty for candidate filings (the Senate eFD covers candidates too).","schema":{"type":"string"}},{"name":"party","in":"query","required":false,"description":"Party affiliation. Empty until back-fill from the member catalog runs; safer to filter by bioguide_id or member_name in the meantime.","schema":{"type":"string"}},{"name":"filing_year","in":"query","required":false,"description":"The year of the FILING period being reported on (NOT the date filed). Most filers report the prior calendar year — e.g., a May 2026 Annual filing has filing_year=2025. New Filer reports cover the partial year up to filing.","schema":{"type":"integer"}},{"name":"report_type","in":"query","required":false,"description":"Filter to one filing flavor. Default is unfiltered (returns all types).","schema":{"type":"string","enum":["Annual","New Filer","Termination","Combined","Amendment","Periodic","Other"]}},{"name":"since","in":"query","required":false,"description":"ISO date (YYYY-MM-DD). Lower bound on the chosen sort_by field. Defaults to filtering by filing_date.","schema":{"type":"string"}},{"name":"until","in":"query","required":false,"description":"ISO date (YYYY-MM-DD). Upper bound on the chosen sort_by field.","schema":{"type":"string"}},{"name":"sort_by","in":"query","required":false,"description":"Field to sort by. Default 'filing_date' (most recent filings first).","schema":{"type":"string","enum":["filing_date","filing_year"]}},{"name":"sort_order","in":"query","required":false,"description":"Sort direction. Default 'desc'.","schema":{"type":"string","enum":["desc","asc"]}},{"name":"limit","in":"query","required":false,"description":"Max records to return (1-500). Default 50.","schema":{"type":"integer"}}],"responses":{"200":{"description":"JSON envelope: { results: [...], count, has_more }."},"400":{"description":"Invalid parameter."},"401":{"description":"Missing or invalid API key."},"402":{"description":"This tool requires a higher plan (upgrade_required). Retrying will not help."},"429":{"description":"Tier rate/quota limit reached (rate_limited). Retry-After points at the reset."}}}},"/v1/fec-candidate-profile":{"get":{"operationId":"get_fec_candidate_profile","summary":"Returns FEC-registered candidate profiles (House, Senate, President) and — when include_committees=true (default) — each candidate's associated FEC committees in the same response","description":"Returns FEC-registered candidate profiles (House, Senate, President) and — when include_committees=true (default) — each candidate's associated FEC committees in the same response. Use this when the user asks about: who's running in race X, the campaign finance ID for a member, what PAC is sponsoring a candidate, or to bridge from a Congressional member name to their FEC committee_id before looking up contributions (v1.1 tool).  Source: api.open.fec.gov — the official Federal Election Commission public-disclosure API. Records include current sitting members, primary challengers, defeated candidates, future-cycle registrants, and presidential candidates. Cycles tracked: 2022, 2024, 2026.  Filter by candidate_id for the fastest direct lookup. Otherwise use candidate_name (case-insensitive substring) optionally narrowed by office + state + cycle. FEC names are typically filed as LASTNAME, FIRSTNAME (e.g., 'MCCORMICK, DAVE' for Dave McCormick).  Office codes: H (House), S (Senate), P (President). Party codes: DEM (Democratic), REP (Republican), LIB (Libertarian), GRE (Green), IND (Independent), OTH (Other). Incumbent_challenge: I (Incumbent), C (Challenger), O (Open seat). When active_only=true, only candidates with candidate_status='C' (currently filing) are returned.  Committee designations on returned committees: P (Principal campaign committee — the primary donation recipient), A (Authorized — accepts donations on candidate's behalf), B (Lobbyist), D (Leadership PAC), J (Joint fundraiser), U (Unauthorized). The Principal (P) committee is the one you want for 'donations to X's campaign'.  Committee types: H (House campaign), S (Senate campaign), P (Presidential campaign), Q (PAC qualified), N (PAC non-qualified), O (Super PAC), I (Independent expenditure non-PAC), X/Y/Z (Party), V/W (Carey/hybrid). For 'follow the money to Senator X', look for designation=P, committee_type=S among the returned committees.","parameters":[{"name":"candidate_id","in":"query","required":false,"description":"FEC-assigned candidate ID (immutable across cycles), e.g., 'S6PA00091' for Pat Toomey, 'P80003338' for Mitt Romney's 2008 presidential bid. Direct doc lookup, fastest path.","schema":{"type":"string"}},{"name":"candidate_name","in":"query","required":false,"description":"Case-insensitive substring against the FEC-filed candidate name (typically LASTNAME, FIRSTNAME format). Example: 'mccormick' or 'collins'.","schema":{"type":"string"}},{"name":"office","in":"query","required":false,"description":"Office code: H=House, S=Senate, P=President. Narrows ambiguous name matches.","schema":{"type":"string","enum":["H","S","P"]}},{"name":"state","in":"query","required":false,"description":"2-letter state abbreviation (e.g., 'PA', 'CA'). Empty for President. Combine with office=S to find the senators from a state.","schema":{"type":"string"}},{"name":"district","in":"query","required":false,"description":"House district as 2-digit string ('01'-'53') or 'AL' for at-large. Senate/President leave blank.","schema":{"type":"string"}},{"name":"party","in":"query","required":false,"description":"Party code: DEM | REP | LIB | GRE | IND | OTH.","schema":{"type":"string"}},{"name":"cycle","in":"query","required":false,"description":"Election cycle year (e.g., 2026). Returns candidates whose cycles[] includes this value. Common cycles: 2022, 2024, 2026.","schema":{"type":"integer"}},{"name":"active_only","in":"query","required":false,"description":"When true, restricts to candidate_inactive=false (currently active filers). Default false (includes withdrawn / defeated / inactive).","schema":{"type":"boolean"}},{"name":"include_committees","in":"query","required":false,"description":"When true (default), each returned candidate is enriched with a `committees` array containing all FEC committees linked via candidate_ids[]. The principal campaign committee (designation='P') is listed first. Set false to skip the committee fetch for faster responses when you only need candidate profile fields.","schema":{"type":"boolean"}},{"name":"sort_by","in":"query","required":false,"description":"Sort key. Default: last_file_date (most recent first).","schema":{"type":"string","enum":["name","last_file_date","active_through"]}},{"name":"sort_order","in":"query","required":false,"description":"Default: desc.","schema":{"type":"string","enum":["asc","desc"]}},{"name":"limit","in":"query","required":false,"description":"Maximum candidates to return. Default 50, max 500.","schema":{"type":"integer"}}],"responses":{"200":{"description":"JSON envelope: { results: [...], count, has_more }."},"400":{"description":"Invalid parameter."},"401":{"description":"Missing or invalid API key."},"402":{"description":"This tool requires a higher plan (upgrade_required). Retrying will not help."},"429":{"description":"Tier rate/quota limit reached (rate_limited). Retry-After points at the reset."}}}},"/v1/fec-contributions":{"get":{"operationId":"get_fec_contributions","summary":"Returns FEC Schedule A contribution data — money flowing INTO federal committees — in AGGREGATED form","description":"Returns FEC Schedule A contribution data — money flowing INTO federal committees — in AGGREGATED form. Individual donors are never exposed as searchable per-record rows: the FEC sale-or-use rule (11 CFR 104.15) permits aggregated presentation only, so this tool serves group totals and a bounded donor leaderboard (the same posture as Quiver Quantitative's public pages).  Source: api.open.fec.gov (official FEC API), queried live per request with a cached-rollup fallback (responses carry source: live | cache).  THREE MODES (pick one):  1. Aggregate totals — pass group_by:   - group_by='employer' + recipient_committee_id + cycle → total +     count per employer for that committee (FEC-computed, all itemized     rows). E.g. which employers' workforces fund committee X.   - group_by='state' + recipient_committee_id + cycle → geographic     fundraising pattern for a committee.   - group_by='candidate' + cycle (optionally candidate_id) → per-     candidate cycle receipts, itemized-individual share, disbursements,     cash on hand. Sorted by receipts DESC — 'who raised the most'.   - group_by='committee' + recipient_committee_id (cycle optional) →     that committee's cycle totals. Top-committee LISTS come from the     rollup cache and may lag a day.   - group_by='cycle' + candidate_id or recipient_committee_id →     per-cycle rows across cycles (fundraising trajectory).  2. Donor leaderboard — pass leaderboard=true + cycle + EXACTLY ONE    scope: recipient_committee_id | candidate_id | contributor_state |    contributor_employer. Returns top individual donors as name +    employer + summed total + contribution count. No addresses, no    city/ZIP, no per-record rows. The response's leaderboard.complete    flag is true when every itemized row ≥ min_amount (default $1,000)    for the scope was aggregated — totals are then exact; otherwise the    pull hit its page cap and ranks are amount-weighted approximations.  3. Per-record (NON-INDIVIDUAL only) — pass entity_type (COM, CCM, PAC,    PTY, CAN, ORG) with optional recipient_committee_id / candidate_id /    contributor_state / cycle / amount / date filters, or sub_id for a    direct lookup. Individual (IND) rows are never returned per-record;    memo subtotals are excluded by default (exclude_memos=false to    include). Useful for PAC-to-PAC transfer analysis.  There is NO contributor_name search and no individual street/city/ZIP anywhere in this tool's output — by design, permanently.  Killer query patterns:   - Who raised the most this cycle? group_by='candidate' + cycle=2026.   - Who funds Senator X? get_fec_candidate_profile → principal     committee → leaderboard=true + recipient_committee_id + cycle.   - Which employers' staff fund committee Y? group_by='employer' +     recipient_committee_id + cycle.   - Where does committee Y's money come from? group_by='state' +     recipient_committee_id + cycle.   - PAC-to-PAC flows into committee Z? entity_type='PAC' +     recipient_committee_id.","parameters":[{"name":"group_by","in":"query","required":false,"description":"Aggregate mode: group totals by this axis. employer/state require recipient_committee_id + cycle (the FEC computes those per committee). cycle requires candidate_id or recipient_committee_id.","schema":{"type":"string","enum":["employer","state","candidate","committee","cycle"]}},{"name":"leaderboard","in":"query","required":false,"description":"Leaderboard mode: top individual donors (name + employer + summed total, no locality) for ONE bounded scope. Requires cycle + exactly one of recipient_committee_id | candidate_id | contributor_state | contributor_employer.","schema":{"type":"boolean"}},{"name":"recipient_committee_id","in":"query","required":false,"description":"FEC committee ID (e.g. 'C00401224'). Scope for group_by='employer'/'state'/'committee'/'cycle', leaderboard scope, or per-record filter. Use get_fec_candidate_profile to find a candidate's principal committee.","schema":{"type":"string"}},{"name":"candidate_id","in":"query","required":false,"description":"FEC candidate ID (e.g. 'S8GA00180'). Scope for group_by='candidate'/'cycle', leaderboard scope, or per-record filter.","schema":{"type":"string"}},{"name":"contributor_state","in":"query","required":false,"description":"2-letter state code. Leaderboard scope (top donors from a state) or per-record filter (non-individual rows).","schema":{"type":"string"}},{"name":"contributor_employer","in":"query","required":false,"description":"Employer name (FEC substring match). LEADERBOARD SCOPE ONLY — top donors reporting this employer. Not available as a per-record filter.","schema":{"type":"string"}},{"name":"entity_type","in":"query","required":false,"description":"Per-record mode selector — NON-INDIVIDUAL types only: COM (committee), CCM (candidate committee), PAC, PTY (party), CAN (candidate), ORG (organization). IND and UNK are not accepted: individual contributions are served aggregated only.","schema":{"type":"string","enum":["COM","CCM","PAC","PTY","CAN","ORG"]}},{"name":"sub_id","in":"query","required":false,"description":"Per-record mode: direct doc lookup by FEC sub_id. Returns the row only when it is a non-individual contribution.","schema":{"type":"string"}},{"name":"cycle","in":"query","required":false,"description":"Election cycle year (2-year transaction period, e.g. 2026). Required for leaderboard and group_by='employer'/'state'; defaults to the current cycle for group_by='candidate'.","schema":{"type":"integer"}},{"name":"min_amount","in":"query","required":false,"description":"Leaderboard: itemization floor for aggregated rows (default 1000; 200 = FEC itemization floor). Per-record: inclusive lower bound on amount.","schema":{"type":"number"}},{"name":"max_amount","in":"query","required":false,"description":"Per-record mode: inclusive upper bound on amount.","schema":{"type":"number"}},{"name":"since","in":"query","required":false,"description":"Per-record mode: inclusive lower bound on contribution_receipt_date (YYYY-MM-DD).","schema":{"type":"string"}},{"name":"until","in":"query","required":false,"description":"Per-record mode: inclusive upper bound on contribution_receipt_date (YYYY-MM-DD).","schema":{"type":"string"}},{"name":"exclude_memos","in":"query","required":false,"description":"Per-record mode: when true (DEFAULT) filters out memoed_subtotal rows (FEC duplicates that double-count dollars). Leaderboards always exclude them.","schema":{"type":"boolean"}},{"name":"sort_by","in":"query","required":false,"description":"Per-record mode sort key. Default: contribution_receipt_date.","schema":{"type":"string","enum":["contribution_receipt_date","contribution_receipt_amount"]}},{"name":"sort_order","in":"query","required":false,"description":"Per-record mode: default desc.","schema":{"type":"string","enum":["asc","desc"]}},{"name":"limit","in":"query","required":false,"description":"Max rows (aggregate/per-record) or max donors (leaderboard, default 100). Default 50, max 500.","schema":{"type":"integer"}}],"responses":{"200":{"description":"JSON envelope: { results: [...], count, has_more }."},"400":{"description":"Invalid parameter."},"401":{"description":"Missing or invalid API key."},"402":{"description":"This tool requires a higher plan (upgrade_required). Retrying will not help."},"429":{"description":"Tier rate/quota limit reached (rate_limited). Retry-After points at the reset."}}}},"/v1/fec-disbursements":{"get":{"operationId":"get_fec_disbursements","summary":"Returns FEC Schedule B disbursements — itemized records of money flowing OUT of a federal committee: vendor payments, media / ad buys, consulting fees, payroll, and committee-to-committee transfers","description":"Returns FEC Schedule B disbursements — itemized records of money flowing OUT of a federal committee: vendor payments, media / ad buys, consulting fees, payroll, and committee-to-committee transfers. The OUT-flow counterpart to get_fec_contributions (Schedule A, money IN).  Source: api.open.fec.gov/v1/schedules/schedule_b/ — the official FEC public-disclosure API. Live queries cover every itemized row; the cached fallback subset carries a $1,000+ ingestion floor (filters small-vendor / payroll noise).  Publication-lag caveat: disbursements only surface when the spending committee FILES its report — monthly filers lag ~20 days, quarterly filers up to ~50 days after the spend. Short since/until windows on recent dates will miss rows whose reports haven't been filed yet.  Killer query patterns:   - What does candidate X's campaign spend money on? Pass     spender_committee_id (their principal campaign committee from     get_fec_candidate_profile). Sort by amount DESC for big spends.   - Which campaigns pay consulting firm Y? Pass recipient_name='Y'.   - Ad-spending patterns: disbursement_purpose_category='ADVERTISING'     + cycle=2026 + sort_by=disbursement_amount DESC.   - Money moving between committees: disbursement_purpose_category=     'TRANSFERS' — recipient_committee_id on each row names the     receiving committee.  Filter combinations note: server-side indexes support one equality filter (spender_committee_id / candidate_id / disbursement_purpose_category / recipient_state) combined with date or amount sort + cycle. Other filters (recipient_name substring, entity_type, exclude_memos) are applied client-side after a wider pre-fetch.  Purpose categories (disbursement_purpose_category): ADVERTISING, CONSULTING, CONTRIBUTIONS, FUNDRAISING, PAYROLL (labeled 'SALARIES' on some rows), TRANSFERS, TRAVEL, ADMINISTRATIVE, MATERIALS, EVENTS, LOANS, REFUNDS, POLLING, OTHER.  Memo rows: FEC tags certain aggregate / subtotal rows with memoed_subtotal=true. These DUPLICATE dollars already counted on other rows — KeyVex DEFAULTS to exclude_memos=true to show real money movement; pass exclude_memos=false to include the raw memo rows (e.g. for matching FEC's own row counts).","parameters":[{"name":"sub_id","in":"query","required":false,"description":"FEC sub_id (globally unique row ID). Direct doc lookup, fastest.","schema":{"type":"string"}},{"name":"spender_committee_id","in":"query","required":false,"description":"FEC committee ID doing the spending (e.g., 'C00580100'). Use get_fec_candidate_profile to find the principal committee for a candidate.","schema":{"type":"string"}},{"name":"recipient_name","in":"query","required":false,"description":"Case-insensitive substring against the payee's filed name (vendor, consulting firm, committee, or individual). Substring filter (client-side on the cached path).","schema":{"type":"string"}},{"name":"candidate_id","in":"query","required":false,"description":"FEC candidate ID tied to the disbursement (e.g., 'S6PA00091'). NOTE: only populated on candidate-linked rows; most vendor payments carry no candidate_id — prefer spender_committee_id for a campaign's full spending picture.","schema":{"type":"string"}},{"name":"recipient_state","in":"query","required":false,"description":"2-letter US state code of the recipient (e.g., 'CA', 'TX').","schema":{"type":"string"}},{"name":"disbursement_purpose_category","in":"query","required":false,"description":"FEC's normalized purpose bucket (e.g., 'ADVERTISING', 'CONSULTING', 'CONTRIBUTIONS', 'FUNDRAISING', 'TRANSFERS', 'TRAVEL', 'PAYROLL', 'OTHER').","schema":{"type":"string"}},{"name":"entity_type","in":"query","required":false,"description":"Recipient entity type code: IND (individual), COM (committee), CCM (candidate committee), PAC, PTY (party), CAN (candidate), ORG (organization — most vendors), UNK (unknown).","schema":{"type":"string","enum":["IND","COM","CCM","PAC","PTY","CAN","ORG","UNK"]}},{"name":"min_amount","in":"query","required":false,"description":"Inclusive lower bound on disbursement_amount in dollars. KeyVex's cached subset holds $1,000+ rows; live queries cover every itemized row.","schema":{"type":"number"}},{"name":"max_amount","in":"query","required":false,"description":"Inclusive upper bound on disbursement_amount.","schema":{"type":"number"}},{"name":"since","in":"query","required":false,"description":"Inclusive lower bound on disbursement_date (YYYY-MM-DD).","schema":{"type":"string"}},{"name":"until","in":"query","required":false,"description":"Inclusive upper bound on disbursement_date (YYYY-MM-DD).","schema":{"type":"string"}},{"name":"cycle","in":"query","required":false,"description":"Election cycle year (2-year transaction period). Common values: 2026, 2024, 2022.","schema":{"type":"integer"}},{"name":"exclude_memos","in":"query","required":false,"description":"When true (DEFAULT), filters out rows flagged memoed_subtotal=true — FEC's aggregate / subtotal duplicates that double-count the same dollars across multiple rows. Pass exclude_memos=false to include them (useful for matching FEC's own raw row counts).","schema":{"type":"boolean"}},{"name":"sort_by","in":"query","required":false,"description":"Sort key. Default: disbursement_date.","schema":{"type":"string","enum":["disbursement_date","disbursement_amount"]}},{"name":"sort_order","in":"query","required":false,"description":"Default: desc (most recent / largest first).","schema":{"type":"string","enum":["asc","desc"]}},{"name":"limit","in":"query","required":false,"description":"Maximum disbursements to return. Default 50, max 500.","schema":{"type":"integer"}}],"responses":{"200":{"description":"JSON envelope: { results: [...], count, has_more }."},"400":{"description":"Invalid parameter."},"401":{"description":"Missing or invalid API key."},"402":{"description":"This tool requires a higher plan (upgrade_required). Retrying will not help."},"429":{"description":"Tier rate/quota limit reached (rate_limited). Retry-After points at the reset."}}}},"/v1/fec-independent-expenditures":{"get":{"operationId":"get_fec_independent_expenditures","summary":"Returns FEC Schedule E independent expenditures — money spent BY a super PAC (or IE-only PAC) uncoordinatedly FOR or AGAINST a federal candidate","description":"Returns FEC Schedule E independent expenditures — money spent BY a super PAC (or IE-only PAC) uncoordinatedly FOR or AGAINST a federal candidate. Hallmark vehicle for political ad spending since Citizens United (2010).  Critical signal: support_oppose_indicator — 'S' = support, 'O' = oppose. A single candidate often has dozens of S and O entries across many super PACs in one cycle. Filter by support_oppose='O' to find attack ads; 'S' to find positive ads.  Source: api.open.fec.gov/v1/schedules/schedule_e/. F24 filings (24-hour notices within 20 days of an election) and F5 (quarterly IE reports) both flow through this endpoint.  Killer query patterns:   - Attack ads on Senator X: candidate_id='S6PA00091' + support_oppose='O'   - Recent spend across a cycle: support_oppose='O' + since='2025-01-01'   - Top political ad vendors: payee_name='AXIOM' (substring)   - Negative spend in a race: candidate_office_state='PA' + support_oppose='O'  Filter combinations note: server-side indexes support one equality filter (candidate_id / committee_id / support_oppose / candidate_office_state) + a date / amount sort. Other filters (payee_name, description, exclude_memos) are applied client-side. NOTE on cycle: the FEC leaves two_year_transaction_period null on many rows, so the `cycle` filter is INCOMPLETE (it undercounts) and is not currently indexed — scope a cycle by DATE instead, e.g. since='2025-01-01' for the 2026 cycle.","parameters":[{"name":"sub_id","in":"query","required":false,"description":"FEC sub_id (globally unique row ID). Direct doc lookup.","schema":{"type":"string"}},{"name":"committee_id","in":"query","required":false,"description":"FEC committee that spent the money (typically a super PAC).","schema":{"type":"string"}},{"name":"candidate_id","in":"query","required":false,"description":"Target candidate being supported or opposed.","schema":{"type":"string"}},{"name":"support_oppose","in":"query","required":false,"description":"'S' = filter to ads supporting the target; 'O' = filter to ads opposing. Omit for both.","schema":{"type":"string","enum":["S","O"]}},{"name":"payee_name","in":"query","required":false,"description":"Case-insensitive substring on the payee_name (ad agency, media buyer, vendor). Client-side filter.","schema":{"type":"string"}},{"name":"description","in":"query","required":false,"description":"Case-insensitive substring on disbursement_description (free-text purpose of the spend, e.g., 'tv ad', 'mailer', 'digital advertising'). Client-side filter.","schema":{"type":"string"}},{"name":"candidate_office","in":"query","required":false,"description":"Office of the target candidate: H/S/P.","schema":{"type":"string","enum":["H","S","P"]}},{"name":"candidate_office_state","in":"query","required":false,"description":"2-letter state code of the target candidate (e.g., 'PA', 'TX').","schema":{"type":"string"}},{"name":"min_amount","in":"query","required":false,"description":"Inclusive lower bound on expenditure_amount in dollars.","schema":{"type":"number"}},{"name":"max_amount","in":"query","required":false,"description":"Inclusive upper bound on expenditure_amount.","schema":{"type":"number"}},{"name":"since","in":"query","required":false,"description":"Inclusive lower bound on expenditure_date (YYYY-MM-DD).","schema":{"type":"string"}},{"name":"until","in":"query","required":false,"description":"Inclusive upper bound on expenditure_date (YYYY-MM-DD).","schema":{"type":"string"}},{"name":"cycle","in":"query","required":false,"description":"Election cycle (2-year transaction period), e.g. 2026/2024/2022. INCOMPLETE — the FEC leaves this field (two_year_transaction_period) null on many rows, so filtering by cycle undercounts, and the cycle index is not provisioned (a cycle query currently returns INDEX_MISSING). For complete cycle coverage, scope by DATE instead: since='<cycle start>' (e.g. since='2025-01-01' for the 2026 cycle).","schema":{"type":"integer"}},{"name":"exclude_memos","in":"query","required":false,"description":"When true (DEFAULT), filters out rows flagged memoed_subtotal=true — FEC's aggregate / receipt-account duplicates that double-count the same dollars across multiple rows. Top-spender queries are misleading without this filter. Pass exclude_memos=false to include the raw memo rows.","schema":{"type":"boolean"}},{"name":"sort_by","in":"query","required":false,"description":"Sort key. Default: expenditure_date.","schema":{"type":"string","enum":["expenditure_date","expenditure_amount"]}},{"name":"sort_order","in":"query","required":false,"description":"Default: desc.","schema":{"type":"string","enum":["asc","desc"]}},{"name":"limit","in":"query","required":false,"description":"Max records. Default 50, max 500.","schema":{"type":"integer"}}],"responses":{"200":{"description":"JSON envelope: { results: [...], count, has_more }."},"400":{"description":"Invalid parameter."},"401":{"description":"Missing or invalid API key."},"402":{"description":"This tool requires a higher plan (upgrade_required). Retrying will not help."},"429":{"description":"Tier rate/quota limit reached (rate_limited). Retry-After points at the reset."}}}},"/v1/tender-offers":{"get":{"operationId":"get_tender_offers","summary":"Returns SEC Schedule TO filings — public tender offer disclosures","description":"Returns SEC Schedule TO filings — public tender offer disclosures. Use this when the user asks about: who's bidding to acquire company X, what M&A offers are in flight, share buyback announcements, amendments to existing tender offers (price increases / extensions), or to pair with 13D activist stakes for the 'stake → bid' story.  Source: SEC EDGAR full-text search. Forms covered: SC TO-T (third- party tender offer — someone outside the company bidding for shares), SC TO-T/A (amendments), SC TO-I (issuer tender offer — company buying back its own shares), SC TO-I/A (issuer amendments).  v1 returns filing metadata only — bidder + target + form type + filing date + URL. Offer price, shares sought, and expiration date live inside the HTML attachment at primary_document_url; agents follow that URL to read the substantive terms. Amendment filings share the same target/bidder/file_number as the original offer; use file_number to group an amendment chain.  Pure-publisher posture: KeyVex does not derive 'likely to close' or 'expected premium' signals. The data here is what was filed, no more.","parameters":[{"name":"accession_number","in":"query","required":false,"description":"EDGAR accession number (e.g., '0001140361-26-020397'). Direct doc lookup, fastest path.","schema":{"type":"string"}},{"name":"target_ticker","in":"query","required":false,"description":"Target company ticker (e.g., 'KZR'). For SC TO-T this is the company being bid for; for SC TO-I this is the company buying back its own shares (target == bidder).","schema":{"type":"string"}},{"name":"target_cik","in":"query","required":false,"description":"Target's SEC CIK (10-digit zero-padded). Use when ticker is ambiguous (multiple share classes).","schema":{"type":"string"}},{"name":"target_name","in":"query","required":false,"description":"Case-insensitive substring against target_name. Useful when ticker isn't known (e.g., private companies in TO-T filings).","schema":{"type":"string"}},{"name":"bidder_cik","in":"query","required":false,"description":"Bidder's SEC CIK. Find all tender offers by a particular acquirer.","schema":{"type":"string"}},{"name":"bidder_name","in":"query","required":false,"description":"Case-insensitive substring against bidder_name. Bidders in SC TO-T are often private SPVs ('2025 Acquisition Company, LLC') — use this to find them by issuer / parent name.","schema":{"type":"string"}},{"name":"form_type","in":"query","required":false,"description":"Exact form match. Useful for narrowing to amendments only ('SC TO-T/A') or original offers only ('SC TO-T').","schema":{"type":"string","enum":["SC TO-T","SC TO-T/A","SC TO-I","SC TO-I/A"]}},{"name":"third_party_only","in":"query","required":false,"description":"When true, restricts to SC TO-T family (third-party offers). Default false.","schema":{"type":"boolean"}},{"name":"issuer_only","in":"query","required":false,"description":"When true, restricts to SC TO-I family (issuer buybacks). Default false.","schema":{"type":"boolean"}},{"name":"exclude_amendments","in":"query","required":false,"description":"When true, drops /A amendment filings. Default false (amendments included).","schema":{"type":"boolean"}},{"name":"since","in":"query","required":false,"description":"Filing date lower bound (ISO YYYY-MM-DD inclusive).","schema":{"type":"string"}},{"name":"until","in":"query","required":false,"description":"Filing date upper bound (ISO YYYY-MM-DD inclusive).","schema":{"type":"string"}},{"name":"sort_order","in":"query","required":false,"description":"Default: desc (most recent filings first).","schema":{"type":"string","enum":["asc","desc"]}},{"name":"limit","in":"query","required":false,"description":"Maximum filings to return. Default 50, max 500.","schema":{"type":"integer"}}],"responses":{"200":{"description":"JSON envelope: { results: [...], count, has_more }."},"400":{"description":"Invalid parameter."},"401":{"description":"Missing or invalid API key."},"402":{"description":"This tool requires a higher plan (upgrade_required). Retrying will not help."},"429":{"description":"Tier rate/quota limit reached (rate_limited). Retry-After points at the reset."}}}},"/v1/bills":{"get":{"operationId":"get_bills","summary":"Returns congressional bill metadata from api.congress.gov","description":"Returns congressional bill metadata from api.congress.gov. Use this when the user asks about: bills introduced this Congress, the status of a specific bill, House vs Senate bill volume, what bills mention a topic, or to bridge from a roll-call vote (legislation_type + legislation_number) to the underlying bill.  Source: api.congress.gov v3 (Library of Congress). Covers ALL bill types: HR (House Bill), S (Senate Bill), HRES (House Simple Resolution), SRES (Senate Simple Resolution), HJRES (House Joint Resolution), SJRES (Senate Joint Resolution), HCONRES (House Concurrent Resolution), SCONRES (Senate Concurrent Resolution).  v1A returns metadata only: title, type + number, originating chamber, latest action (date + text), and links. Sponsors, cosponsors, full action history, bill text, and CRS summaries live at `api_url` (structured JSON) and `congress_gov_url` (public HTML). Agents follow those for prose detail.  Bill identifiers are stable composite keys formatted as {congress}-{TYPE}-{number}, e.g., '119-HR-134', '119-S-1234', '118-HJRES-5'. Use bill_id for the fastest direct lookup.  Pure-publisher posture: KeyVex returns what's in the public record. No legislative outcome predictions, no 'likely to pass' signals.","parameters":[{"name":"bill_id","in":"query","required":false,"description":"Composite bill identifier ('{congress}-{TYPE}-{number}', e.g., '119-HR-134'). Direct doc lookup, fastest path.","schema":{"type":"string"}},{"name":"congress","in":"query","required":false,"description":"Congress number (e.g., 119 = January 2025 onward; 118 = January 2023 - January 2025).","schema":{"type":"integer"}},{"name":"bill_type","in":"query","required":false,"description":"Type code. HR/S are bills; HRES/SRES are simple resolutions (single-chamber, non-binding); HJRES/SJRES are joint resolutions (both chambers, can become law); HCONRES/SCONRES are concurrent resolutions (both chambers, non-binding).","schema":{"type":"string","enum":["HR","S","HRES","SRES","HJRES","SJRES","HCONRES","SCONRES"]}},{"name":"title","in":"query","required":false,"description":"Case-insensitive substring against bill title. Useful for topic searches ('artificial intelligence', 'border security', etc.).","schema":{"type":"string"}},{"name":"origin_chamber","in":"query","required":false,"description":"Filter to bills originating in one chamber.","schema":{"type":"string","enum":["House","Senate"]}},{"name":"since","in":"query","required":false,"description":"Latest-action date lower bound (ISO YYYY-MM-DD inclusive). Useful for 'what's moved recently'. NOTE: this filters the most-recent floor/committee action, which can move with activity even on a bill introduced a year ago. For 'introduced in the last N months' questions, use introduced_since instead.","schema":{"type":"string"}},{"name":"until","in":"query","required":false,"description":"Latest-action date upper bound (ISO YYYY-MM-DD inclusive).","schema":{"type":"string"}},{"name":"introduced_since","in":"query","required":false,"description":"Introduction-date lower bound (ISO YYYY-MM-DD inclusive). The right filter for 'bills introduced in the last N months' — distinct from since/until, which track latest action. Older bill records may have an empty introduction_date if they were ingested before that field was added; those will be excluded from introduced_since/introduced_until results until the bill is re-scraped.","schema":{"type":"string"}},{"name":"introduced_until","in":"query","required":false,"description":"Introduction-date upper bound (ISO YYYY-MM-DD inclusive).","schema":{"type":"string"}},{"name":"sort_by","in":"query","required":false,"description":"Sort key. Default: latest_action_date (most recently active first). Use introduction_date to sort by when the bill was originally introduced.","schema":{"type":"string","enum":["latest_action_date","update_date","introduction_date"]}},{"name":"sort_order","in":"query","required":false,"description":"Default: desc.","schema":{"type":"string","enum":["asc","desc"]}},{"name":"limit","in":"query","required":false,"description":"Maximum bills to return. Default 50, max 500.","schema":{"type":"integer"}}],"responses":{"200":{"description":"JSON envelope: { results: [...], count, has_more }."},"400":{"description":"Invalid parameter."},"401":{"description":"Missing or invalid API key."},"402":{"description":"This tool requires a higher plan (upgrade_required). Retrying will not help."},"429":{"description":"Tier rate/quota limit reached (rate_limited). Retry-After points at the reset."}}}},"/v1/roll-call-votes":{"get":{"operationId":"get_roll_call_votes","summary":"Returns congressional roll-call vote metadata (House + Senate) from api.congress.gov","description":"Returns congressional roll-call vote metadata (House + Senate) from api.congress.gov. Use this when the user asks about: recent votes in either chamber, votes on a specific bill, votes by date range, or to chain to per-member positions via the source_data_url.  Sources: api.congress.gov v3 for House votes; senate.gov XML (legislative/LIS/roll_call_lists/) for Senate votes — joined into one collection. Captures roll-call (recorded) votes only — voice votes and unanimous-consent passages aren't roll calls and don't appear here.  v1A returns vote-level metadata: chamber, roll call number, vote type, result, the legislation being voted on (linked via bill_id), and links to the Clerk's authoritative XML data. Per-member positions (yea/nay/present/not voting per bioguide_id) live in the XML at source_data_url; agents fetch that directly when they need member detail. v1.1 will add a separate roll_call_member_votes tool/ collection for queryable per-member positions.  Vote identifiers are stable composite keys: '{chamber}-{congress}- {session}-{rcNumber}', e.g., 'house-119-1-240' or 'senate-119-1-15'.  Common vote_type values: 'Yea-And-Nay' (regular recorded vote), '2/3 Yea-And-Nay' (suspension of rules, requires 2/3 majority), 'Recorded Vote', 'Quorum'. Common result values: 'Passed', 'Failed', 'Agreed to', 'Rejected', 'Motion Agreed To', 'Motion Failed'.  When a vote is on a bill, legislation_type + legislation_number are populated and bill_id is set to the composite key — use that to join to get_bills. For procedural votes (motion to recommit, motion to adjourn, etc.), those fields may be empty.  Amendment + Senate detail: House votes ON AN AMENDMENT carry amendment_number, amendment_author (sponsor + label), and amendment_type (e.g. 'HAMDT'). Senate votes carry vote_title (descriptive title — e.g. a confirmation or motion), measure (the specific measure a question references, e.g. 'S.Amdt. 5740'), and en_bloc_matters[] (one {issue, question, result} per matter when a batch of nominations is decided en bloc). All are empty / [] where not applicable.","parameters":[{"name":"vote_id","in":"query","required":false,"description":"Composite vote identifier ('{chamber}-{congress}-{session}-{rcNumber}', e.g., 'house-119-1-240'). Direct doc lookup, fastest path.","schema":{"type":"string"}},{"name":"congress","in":"query","required":false,"description":"Congress number (e.g., 119).","schema":{"type":"integer"}},{"name":"session_number","in":"query","required":false,"description":"Session within the Congress. Session 1 = first calendar year of the Congress; Session 2 = second year.","schema":{"type":"integer","enum":[1,2]}},{"name":"chamber","in":"query","required":false,"description":"Filter to House or Senate roll calls.","schema":{"type":"string","enum":["house","senate"]}},{"name":"bill_id","in":"query","required":false,"description":"Filter to votes on a specific bill (composite key like '119-HR-134'). Use to chain a bill lookup → votes on that bill.","schema":{"type":"string"}},{"name":"legislation_type","in":"query","required":false,"description":"Filter to votes on a specific legislation type.","schema":{"type":"string","enum":["HR","S","HRES","SRES","HJRES","SJRES","HCONRES","SCONRES"]}},{"name":"result","in":"query","required":false,"description":"Substring match against result text (e.g., 'passed', 'failed', 'agreed').","schema":{"type":"string"}},{"name":"since","in":"query","required":false,"description":"Vote-start date lower bound (ISO YYYY-MM-DD inclusive).","schema":{"type":"string"}},{"name":"until","in":"query","required":false,"description":"Vote-start date upper bound (ISO YYYY-MM-DD inclusive).","schema":{"type":"string"}},{"name":"sort_by","in":"query","required":false,"description":"Default: start_date (most recent votes first).","schema":{"type":"string","enum":["start_date","update_date"]}},{"name":"sort_order","in":"query","required":false,"description":"Default: desc.","schema":{"type":"string","enum":["asc","desc"]}},{"name":"limit","in":"query","required":false,"description":"Maximum votes to return. Default 50, max 500.","schema":{"type":"integer"}}],"responses":{"200":{"description":"JSON envelope: { results: [...], count, has_more }."},"400":{"description":"Invalid parameter."},"401":{"description":"Missing or invalid API key."},"402":{"description":"This tool requires a higher plan (upgrade_required). Retrying will not help."},"429":{"description":"Tier rate/quota limit reached (rate_limited). Retry-After points at the reset."}}}},"/v1/private-placements":{"get":{"operationId":"get_private_placements","summary":"Returns SEC Form D filings — Reg D / Rule 506 private placement offering notices","description":"Returns SEC Form D filings — Reg D / Rule 506 private placement offering notices. Use this when the user asks about: who's raising private capital right now, new VC fund formations, private equity raises, real-estate syndicates, hedge fund launches, who's claiming Rule 506(b) vs 506(c) exemption, or to identify directors / executive officers of newly-formed entities.  Source: SEC EDGAR full-text search + per-filing primary_doc.xml. All Reg D filings (504 / 506(b) / 506(c)) plus Section 4(a) exempt offerings flow through here. Form D must be filed within 15 days of the first sale.  Each record carries: issuer entity (name, CIK, address, jurisdiction of incorporation, entity type), offering data (industry group, investment fund type for pooled funds, total offering / sold / remaining, minimum investment, federal_exemptions claimed), filing metadata (file_date, date_of_first_sale, is_amendment), and a related_persons[] array of directors / executive officers / promoters.  Federal exemption codes (federal_exemptions array):   06b   — Rule 506(b) (no general solicitation; up to 35 non-accredited)   06c   — Rule 506(c) (general solicitation OK; all accredited)   04(2) — Section 4(a)(2) (statutory private placement)   3C    — ICA Section 3(c) (3(c)(1), 3(c)(5), 3(c)(7) etc. — common for funds)   3C.1  — ICA 3(c)(1) (up to 100 investors)   3C.7  — ICA 3(c)(7) (qualified purchasers only)  Common industry_group_type values:   'Pooled Investment Fund' (with investment_fund_type='Venture Capital   Fund' | 'Private Equity Fund' | 'Hedge Fund' | 'Other Investment Fund')   'Technology', 'Real Estate', 'Health Care', 'Energy', 'Financial   Services', 'Manufacturing', 'Other'.  Direct filing_id lookup is fastest (accession number). Substring filters on issuer_name, industry_group_type, investment_fund_type, and jurisdiction_of_inc enable topic-style queries. Combine federal_exemption + min_amount_sold for 'who's raising real money under 506(c)' analyses.","parameters":[{"name":"filing_id","in":"query","required":false,"description":"EDGAR accession number (e.g., '0002131143-26-000001'). Direct doc lookup, fastest.","schema":{"type":"string"}},{"name":"issuer_cik","in":"query","required":false,"description":"Issuer's SEC CIK (1-10 digits; we zero-pad internally).","schema":{"type":"string"}},{"name":"issuer_name","in":"query","required":false,"description":"Case-insensitive substring against the issuer's filed entity name. NOTE: matched over a recent-filing window, so it reliably finds CURRENT filers but can miss an issuer whose Form D filings are older than that window. To pull a specific issuer's full filing history regardless of date, use issuer_cik (most reliable).","schema":{"type":"string"}},{"name":"issuer_state","in":"query","required":false,"description":"Issuer's state (2-letter code, e.g., 'CA', 'NY', 'DE'). Note many funds incorporate in DE while operating elsewhere.","schema":{"type":"string"}},{"name":"jurisdiction_of_inc","in":"query","required":false,"description":"Substring against state of incorporation (e.g., 'delaware', 'cayman').","schema":{"type":"string"}},{"name":"industry_group_type","in":"query","required":false,"description":"Substring against the top-level industry classification (e.g., 'technology', 'real estate', 'pooled investment').","schema":{"type":"string"}},{"name":"investment_fund_type","in":"query","required":false,"description":"Substring against the fund subtype, populated when industry_group_type is 'Pooled Investment Fund' (e.g., 'venture capital', 'private equity', 'hedge').","schema":{"type":"string"}},{"name":"federal_exemption","in":"query","required":false,"description":"Filter to filings claiming a specific exemption code via array-contains. Common: '06b' (506(b)), '06c' (506(c)), '3C.1', '3C.7'.","schema":{"type":"string"}},{"name":"is_amendment","in":"query","required":false,"description":"When set, restricts to D/A amendments (true) or original D filings (false). Default: both.","schema":{"type":"boolean"}},{"name":"min_amount_sold","in":"query","required":false,"description":"Minimum total_amount_sold (USD). Filters out trivial offerings — use 1000000 for 'real raises'.","schema":{"type":"number"}},{"name":"since","in":"query","required":false,"description":"date_of_first_sale lower bound (YYYY-MM-DD inclusive).","schema":{"type":"string"}},{"name":"until","in":"query","required":false,"description":"date_of_first_sale upper bound (YYYY-MM-DD inclusive).","schema":{"type":"string"}},{"name":"sort_by","in":"query","required":false,"description":"Default: file_date (most recently filed first).","schema":{"type":"string","enum":["file_date","date_of_first_sale","total_amount_sold"]}},{"name":"sort_order","in":"query","required":false,"description":"Default: desc.","schema":{"type":"string","enum":["asc","desc"]}},{"name":"limit","in":"query","required":false,"description":"Maximum filings to return. Default 50, max 500.","schema":{"type":"integer"}}],"responses":{"200":{"description":"JSON envelope: { results: [...], count, has_more }."},"400":{"description":"Invalid parameter."},"401":{"description":"Missing or invalid API key."},"402":{"description":"This tool requires a higher plan (upgrade_required). Retrying will not help."},"429":{"description":"Tier rate/quota limit reached (rate_limited). Retry-After points at the reset."}}}},"/v1/crowdfunding-offerings":{"get":{"operationId":"get_crowdfunding_offerings","summary":"Returns SEC Form C filings — Regulation Crowdfunding offerings, 2016-05→present: startup raises on Wefunder / StartEngine / Republic and other funding portals","description":"Returns SEC Form C filings — Regulation Crowdfunding offerings, 2016-05→present: startup raises on Wefunder / StartEngine / Republic and other funding portals. One record per filing with the issuer (legal form, jurisdiction, incorporation date, website), the PORTAL (name + CIK + CRD), offering terms (security type — SAFEs appear as 'Other' with the description, price, target and maximum amounts, deadline, oversubscription), and the issuer's own DISCLOSED FINANCIALS (total assets, cash, revenue, net income, debt — current + prior fiscal year, dollars) plus employee count. Use this when the user asks about: startup crowdfunding activity, what a company raised on a portal, portal market share, early-stage issuers in a state, or revenue/assets of a crowdfunding company.  filing_type maps the form family: 'offering' (C, C/A) | 'progress_update' (C-U) | 'annual_report' (C-AR — re-discloses financials yearly) | 'termination' (C-TR). is_withdrawal covers the -W variants. One issuer CIK typically has a chain: C → C-U → C-AR… — filter cik + sort asc to read it. Financial fields are null where a variant omits them.  Reg A+ (Form 1-A 'mini-IPOs') is a different form family — planned as its own dataset; Reg D private placements are in get_private_placements.  Pure-publisher posture: issuer-reported numbers verbatim — Form C financials are self-reported and generally unaudited (reviewed at most); treat them accordingly.","parameters":[{"name":"accession_number","in":"query","required":false,"description":"Direct lookup by EDGAR accession number.","schema":{"type":"string"}},{"name":"cik","in":"query","required":false,"description":"Issuer CIK (any zero-padding).","schema":{"type":"string"}},{"name":"issuer_name","in":"query","required":false,"description":"Case-insensitive substring against issuer (or SPV co-issuer) name.","schema":{"type":"string"}},{"name":"portal_name","in":"query","required":false,"description":"Case-insensitive substring against the funding portal (e.g. 'wefunder', 'startengine').","schema":{"type":"string"}},{"name":"filing_type","in":"query","required":false,"description":"Form-family filter (see description).","schema":{"type":"string","enum":["offering","progress_update","annual_report","termination"]}},{"name":"jurisdiction","in":"query","required":false,"description":"Issuer's state/country of organization (two-letter, e.g. 'DE').","schema":{"type":"string"}},{"name":"since","in":"query","required":false,"description":"Filing date lower bound (YYYY-MM-DD inclusive).","schema":{"type":"string"}},{"name":"until","in":"query","required":false,"description":"Filing date upper bound (YYYY-MM-DD inclusive).","schema":{"type":"string"}},{"name":"sort_order","in":"query","required":false,"description":"Sort by filing date. Default desc.","schema":{"type":"string","enum":["asc","desc"]}},{"name":"limit","in":"query","required":false,"description":"Maximum filings. Default 50, max 500.","schema":{"type":"integer"}}],"responses":{"200":{"description":"JSON envelope: { results: [...], count, has_more }."},"400":{"description":"Invalid parameter."},"401":{"description":"Missing or invalid API key."},"402":{"description":"This tool requires a higher plan (upgrade_required). Retrying will not help."},"429":{"description":"Tier rate/quota limit reached (rate_limited). Retry-After points at the reset."}}}},"/v1/reg-a-offerings":{"get":{"operationId":"get_reg_a_offerings","summary":"Returns SEC Form 1-A filings — Regulation A+ 'mini-IPO' offering statements, 2015-06→present: companies raising up to $20M (Tier 1) or $75M (Tier 2) from the public without a full IPO","description":"Returns SEC Form 1-A filings — Regulation A+ 'mini-IPO' offering statements, 2015-06→present: companies raising up to $20M (Tier 1) or $75M (Tier 2) from the public without a full IPO. One record per filing with the issuer (SIC code, jurisdiction, year incorporated, employees, city/state), tier election, offering terms (security types, count, price, total aggregate amount, estimated net), service providers WITH FEES (underwriter, sales commissions, auditor, legal), and the issuer's summary financials from Part I (cash, assets, liabilities, equity, revenues, net income). Use this when the user asks about: Reg A / Reg A+ raises, mini-IPOs, small- cap capital formation, who's underwriting or auditing small offerings, or issuer financials before a raise.  form family: '1-A' initial | '1-A/A' amendment | '1-A POS' post-qualification amendment (is_post_qualification) | -W withdrawals (is_withdrawal, metadata-level). One offering typically chains 1-A → 1-A/A… → qualification → 1-A POS updates — filter cik + sort asc to read it.  Coverage (honest): the offering-statement family only. The Reg A+ periodic reports — 1-K annual (with actual proceeds raised), 1-SA semiannual, 1-Z exit — use different schemas and are a planned separate dataset. Offering circulars (253G) are prose documents — follow filing_index_url.  Pure-publisher posture: issuer-reported Part I numbers verbatim.","parameters":[{"name":"accession_number","in":"query","required":false,"description":"Direct lookup by EDGAR accession number.","schema":{"type":"string"}},{"name":"cik","in":"query","required":false,"description":"Issuer CIK (any zero-padding).","schema":{"type":"string"}},{"name":"issuer_name","in":"query","required":false,"description":"Case-insensitive substring against issuer name.","schema":{"type":"string"}},{"name":"tier","in":"query","required":false,"description":"Tier election: Tier1 (≤$20M, state review) or Tier2 (≤$75M, preempts state review).","schema":{"type":"string","enum":["Tier1","Tier2"]}},{"name":"jurisdiction","in":"query","required":false,"description":"Issuer's jurisdiction of organization (two-letter, e.g. 'DE').","schema":{"type":"string"}},{"name":"since","in":"query","required":false,"description":"Filing date lower bound (YYYY-MM-DD inclusive).","schema":{"type":"string"}},{"name":"until","in":"query","required":false,"description":"Filing date upper bound (YYYY-MM-DD inclusive).","schema":{"type":"string"}},{"name":"sort_order","in":"query","required":false,"description":"Sort by filing date. Default desc.","schema":{"type":"string","enum":["asc","desc"]}},{"name":"limit","in":"query","required":false,"description":"Maximum filings. Default 50, max 500.","schema":{"type":"integer"}}],"responses":{"200":{"description":"JSON envelope: { results: [...], count, has_more }."},"400":{"description":"Invalid parameter."},"401":{"description":"Missing or invalid API key."},"402":{"description":"This tool requires a higher plan (upgrade_required). Retrying will not help."},"429":{"description":"Tier rate/quota limit reached (rate_limited). Retry-After points at the reset."}}}},"/v1/product-recalls":{"get":{"operationId":"get_product_recalls","summary":"Returns safety recalls from federal agencies — drug recalls (FDA), medical device recalls (FDA), food/dietary supplement recalls (FDA), and (coming in v1A.1) vehicle recalls (NHTSA) and consumer-product recalls (CPSC)","description":"Returns safety recalls from federal agencies — drug recalls (FDA), medical device recalls (FDA), food/dietary supplement recalls (FDA), and (coming in v1A.1) vehicle recalls (NHTSA) and consumer-product recalls (CPSC). Use this when the user asks about: recent recalls for a specific company or product, FDA Class I (most severe) recalls, active vehicle recalls by make/model, food contamination recalls, drug shortages and recalls, or to add a 'product-safety event' flag to insider activity / 8-K filings / enforcement actions.  Sources (filter via the `source` enum):   fda_drug   — openFDA /drug/enforcement.json. Drug recalls including                prescription, OTC, biologics. Class I/II/III severity.   fda_device — openFDA /device/enforcement.json. Medical device recalls                (implants, diagnostics, equipment, software). Same                classification scheme.   fda_food   — openFDA /food/enforcement.json. Food + dietary supplements.                Pathogen contamination, allergen mislabeling, etc.   cpsc       — saferproducts.gov RestWebServices/Recall. Consumer-product                recalls (clothing, electronics, toys, batteries, etc.). No                severity classification; classification field is null.   nhtsa      — Vehicle, tire, equipment, child-seat recalls. Deferred to                v1A.1 (api.nhtsa.gov bulk endpoint pending investigation).  Cross-source pairing pattern:   Recall → 8-K Item 7.01/8.01:  pair with get_material_events   Recall → insider sells:       pair with get_insider_transactions   Recall → SEC/DOJ follow-on:   pair with get_enforcement_actions   Recall → company filings:     pair with get_proxy_filings (DEF 14A risk factors)  Each record is one recall. Identifier format: `{source}-{recall_number}` (e.g., 'fda_drug-D-1234-2026'). FDA classifications:   Class I   — serious adverse health consequence or death   Class II  — temporary or reversible health consequence   Class III — unlikely to cause adverse health consequence  Source freshness (per-source publication cadence, not KeyVex bug):   CPSC publishes within ~1-2 days; recent data flows hourly-fresh.   openFDA's snapshot updates every ~10-14 days, and each snapshot   carries recall_initiation_date values that LAG the snapshot date   by another 30-45 days (the time between FDA classifying a recall   and openFDA exposing it). Net: FDA records in this collection   typically run ~4-6 weeks behind real-world recall dates, while   CPSC is current. A default desc-by-date sort therefore looks   CPSC-heavy at the top even when FDA matters more for the query.   Filter by source='fda_*' to see FDA-only and avoid the skew.  classification filter scope: 'classification' is an FDA-only field. CPSC records always have classification=null (CPSC doesn't use the FDA severity scheme). Filtering by classification excludes ALL CPSC rows by definition. The query response surfaces this with a notice in coverage_warning when the filter is set.","parameters":[{"name":"source","in":"query","required":false,"description":"Filter to a single agency / category. Omit to see all sources combined.","schema":{"type":"string","enum":["fda_drug","fda_device","fda_food","nhtsa","cpsc"]}},{"name":"recall_number","in":"query","required":false,"description":"Recall identifier as filed (e.g., FDA 'D-1234-2026'). Combine with source for direct doc lookup, fastest path.","schema":{"type":"string"}},{"name":"recalling_firm","in":"query","required":false,"description":"Case-insensitive substring against the recalling firm name (e.g., 'Pfizer', 'Toyota', 'Whole Foods').","schema":{"type":"string"}},{"name":"product_description","in":"query","required":false,"description":"Case-insensitive substring against the product description (e.g., 'lithium', 'romaine', 'airbag').","schema":{"type":"string"}},{"name":"classification","in":"query","required":false,"description":"FDA severity classification. Class I is most severe (death / serious harm). Ignored for NHTSA / CPSC records.","schema":{"type":"string","enum":["Class I","Class II","Class III"]}},{"name":"status","in":"query","required":false,"description":"Exact match. Common values: 'Ongoing', 'Completed', 'Terminated', 'Recall Initiated'.","schema":{"type":"string"}},{"name":"vehicle_make","in":"query","required":false,"description":"NHTSA-only filter. Vehicle make, uppercase (e.g., 'TOYOTA', 'FORD'). Ignored for other sources.","schema":{"type":"string"}},{"name":"vehicle_model","in":"query","required":false,"description":"NHTSA-only filter. Case-insensitive substring against vehicle model. Ignored for other sources.","schema":{"type":"string"}},{"name":"since","in":"query","required":false,"description":"ISO date (YYYY-MM-DD). Only recalls whose recall_initiation_date is on or after this date.","schema":{"type":"string"}},{"name":"until","in":"query","required":false,"description":"ISO date (YYYY-MM-DD). Only recalls whose recall_initiation_date is on or before this date.","schema":{"type":"string"}},{"name":"sort_by","in":"query","required":false,"description":"Default: recall_initiation_date.","schema":{"type":"string","enum":["recall_initiation_date","posted_date"]}},{"name":"sort_order","in":"query","required":false,"description":"Default: desc (most recent first).","schema":{"type":"string","enum":["desc","asc"]}},{"name":"limit","in":"query","required":false,"description":"Maximum records to return. Default 50, max 500.","schema":{"type":"integer"}}],"responses":{"200":{"description":"JSON envelope: { results: [...], count, has_more }."},"400":{"description":"Invalid parameter."},"401":{"description":"Missing or invalid API key."},"402":{"description":"This tool requires a higher plan (upgrade_required). Retrying will not help."},"429":{"description":"Tier rate/quota limit reached (rate_limited). Retry-After points at the reset."}}}},"/v1/fda-approvals":{"get":{"operationId":"get_fda_approvals","summary":"Returns FDA approval / clearance events: drug approval actions from Drugs@FDA, medical-device 510(k) clearances, and device PMA (premarket approval) decisions","description":"Returns FDA approval / clearance events: drug approval actions from Drugs@FDA, medical-device 510(k) clearances, and device PMA (premarket approval) decisions. Full history (drugs to 1939, 510(k) to 1976, PMA to the 1960s). This is the BULLISH twin of get_product_recalls — the catalyst dataset for biotech and medtech tickers. Use this when the user asks about: new drug approvals for a company or ingredient, priority-review approvals, tentative generic (ANDA) approvals, device clearances by company or product code, PMA supplements, or to pair an approval date with insider trades / 8-K filings / fundamentals.  Sources (filter via the `source` enum):   drugsfda — Drugs@FDA submission actions. One record per submission              decision (ORIG = original approval, SUPPL = supplemental).              decision_code: AP (approved) | TA (tentative approval —              generic approved but blocked by patent/exclusivity).              review_priority: PRIORITY | STANDARD — PRIORITY reviews              are the higher-signal events. application_number prefix              tells the product class: NDA (new drug), ANDA (generic),              BLA (biologic).   510k     — Device premarket notifications. decision_code SESE              ('substantially equivalent' — cleared) dominates ~98%.              approval_type: Traditional | Special | Abbreviated.   pma      — Device premarket approvals (Class III, highest-risk              devices — implants, life-sustaining). Originals AND              supplements (supplement_number, supplement_reason).              decision_code: APPR (approved) | OK30 (30-day supplement              accepted) dominate. openFDA ships no description text for              PMA codes; decision_description mirrors the code.  review_priority='EXPEDITED' marks devices under expedited review; 'PRIORITY' marks priority-review drugs. Empty = standard / not flagged.  Company matching: `applicant` is a substring filter on the sponsor / applicant name AS FILED (e.g., 'Pfizer', 'Boston Scientific'). FDA records carry no ticker or CIK — subsidiaries file under their own names, so try the operating-company name, not the holding company.  source_url points at the accessdata.fda.gov detail page (approval letters, labels, review documents). Pure-publisher posture: no derived 'approval odds' or price-impact signals.","parameters":[{"name":"id","in":"query","required":false,"description":"Direct lookup ('drugsfda-{applNo}-{subType}{n}', '510k-{kNumber}', 'pma-{pmaNumber}-{suppl|ORIG}'). Fastest path.","schema":{"type":"string"}},{"name":"source","in":"query","required":false,"description":"Filter to one feed: drugsfda (drug approval actions), 510k (device clearances), pma (Class III device approvals).","schema":{"type":"string","enum":["drugsfda","510k","pma"]}},{"name":"category","in":"query","required":false,"description":"Coarser filter: drug (= drugsfda) or device (= 510k + pma together).","schema":{"type":"string","enum":["drug","device"]}},{"name":"application_number","in":"query","required":false,"description":"Exact match on the FDA application number (e.g., 'NDA020123', 'ANDA213414', 'K260369', 'P250013').","schema":{"type":"string"}},{"name":"applicant","in":"query","required":false,"description":"Case-insensitive substring against the sponsor / applicant company name (e.g., 'pfizer', 'medtronic').","schema":{"type":"string"}},{"name":"product_name","in":"query","required":false,"description":"Case-insensitive substring against product/trade/device name AND generic name / active ingredients (e.g., 'semaglutide', 'stent').","schema":{"type":"string"}},{"name":"decision_code","in":"query","required":false,"description":"Exact decision code: AP / TA (drugs), SESE etc. (510k), APPR / OK30 etc. (PMA).","schema":{"type":"string"}},{"name":"review_priority","in":"query","required":false,"description":"PRIORITY (drugs), STANDARD (drugs), or EXPEDITED (devices). The high-signal filter for catalyst hunting.","schema":{"type":"string","enum":["PRIORITY","STANDARD","EXPEDITED"]}},{"name":"product_code","in":"query","required":false,"description":"Exact FDA device product code (e.g., 'OLO', 'MNQ'). Devices only.","schema":{"type":"string"}},{"name":"since","in":"query","required":false,"description":"Decision date lower bound (YYYY-MM-DD inclusive).","schema":{"type":"string"}},{"name":"until","in":"query","required":false,"description":"Decision date upper bound (YYYY-MM-DD inclusive).","schema":{"type":"string"}},{"name":"sort_order","in":"query","required":false,"description":"Default: desc (most recent decisions first).","schema":{"type":"string","enum":["asc","desc"]}},{"name":"limit","in":"query","required":false,"description":"Maximum events to return. Default 50, max 500.","schema":{"type":"integer"}}],"responses":{"200":{"description":"JSON envelope: { results: [...], count, has_more }."},"400":{"description":"Invalid parameter."},"401":{"description":"Missing or invalid API key."},"402":{"description":"This tool requires a higher plan (upgrade_required). Retrying will not help."},"429":{"description":"Tier rate/quota limit reached (rate_limited). Retry-After points at the reset."}}}},"/v1/drug-adverse-events":{"get":{"operationId":"get_drug_adverse_events","summary":"Returns FDA FAERS drug adverse-event reports — every adverse-event / medication-error report submitted to FDA (~20M, 2004→present, growing ~2M/yr)","description":"Returns FDA FAERS drug adverse-event reports — every adverse-event / medication-error report submitted to FDA (~20M, 2004→present, growing ~2M/yr). LIVE passthrough to openFDA: results reflect FDA's current data and `total_count` is openFDA's authoritative count for the filtered query (the results array is just the requested page). Use this when the user asks about: safety signals on a drug, adverse events by reaction type, death/hospitalization outcome counts for a product, a manufacturer's adverse-event footprint, or to pair a safety-signal trend with recalls, approvals, or insider activity.  count_by returns TOP TERMS + COUNTS instead of records (e.g. count_by:'reaction' with drug:'ozempic' → the most-reported reactions for that drug) — the right first move for 'what are the side effects of X' questions; follow with a record query for detail. Records are openFDA's fields verbatim: deeply nested (patient.drug[] with openFDA annotations, patient.reaction[]), 5-15KB each — keep limit small.  Matching: drug matches brand name, generic name, or the verbatim reported product as a PHRASE ('ozempic', 'semaglutide'); reaction is a MedDRA term phrase ('myocardial infarction'); serious=true filters to reports with a serious outcome; outcome picks one specific flag (death, hospitalization, …). since/until window on receivedate (when FDA received the report).  CRITICAL honesty note (FDA's own): FAERS reports are UNVERIFIED and establish NEITHER causation NOR incidence — anyone can report, duplicates exist, reporting is stimulated by publicity, and there is no denominator (prescriptions dispensed). Counts are a reporting signal, not a risk measure. Surface this caveat when presenting counts.  Pure-publisher posture: FDA's records verbatim — no derived safety scores.","parameters":[{"name":"drug","in":"query","required":false,"description":"Drug name phrase — brand ('ozempic'), generic ('semaglutide'), or reported product name.","schema":{"type":"string"}},{"name":"manufacturer","in":"query","required":false,"description":"Manufacturer name phrase (openFDA annotation, e.g. 'novo nordisk').","schema":{"type":"string"}},{"name":"reaction","in":"query","required":false,"description":"MedDRA reaction term phrase (e.g., 'pancreatitis', 'myocardial infarction').","schema":{"type":"string"}},{"name":"serious","in":"query","required":false,"description":"true = serious reports only (death, hospitalization, disability, …); false = non-serious only.","schema":{"type":"boolean"}},{"name":"outcome","in":"query","required":false,"description":"One specific seriousness outcome flag.","schema":{"type":"string","enum":["death","life_threatening","hospitalization","disability","congenital_anomaly","other"]}},{"name":"country","in":"query","required":false,"description":"Country where the event occurred (ISO-2, e.g. 'US').","schema":{"type":"string"}},{"name":"since","in":"query","required":false,"description":"FDA receive-date lower bound (YYYY-MM-DD inclusive).","schema":{"type":"string"}},{"name":"until","in":"query","required":false,"description":"FDA receive-date upper bound (YYYY-MM-DD inclusive).","schema":{"type":"string"}},{"name":"count_by","in":"query","required":false,"description":"Facet mode: return top terms + counts instead of records (reaction | drug | brand | manufacturer | country).","schema":{"type":"string","enum":["reaction","drug","brand","manufacturer","country"]}},{"name":"limit","in":"query","required":false,"description":"Records per page (default 10, max 100 — records are heavy). In count_by mode: facet rows (default 25, max 1000).","schema":{"type":"integer"}},{"name":"skip","in":"query","required":false,"description":"Pagination offset (openFDA hard cap 25,000). Not used in count_by mode.","schema":{"type":"integer"}}],"responses":{"200":{"description":"JSON envelope: { results: [...], count, has_more }."},"400":{"description":"Invalid parameter."},"401":{"description":"Missing or invalid API key."},"402":{"description":"This tool requires a higher plan (upgrade_required). Retrying will not help."},"429":{"description":"Tier rate/quota limit reached (rate_limited). Retry-After points at the reset."}}}},"/v1/bank-financials":{"get":{"operationId":"get_bank_financials","summary":"Returns quarterly financials for every FDIC-insured US bank — FDIC BankFind Suite (RIS) data derived from Call Reports, one record per (bank, quarter-end) from 1984 to the present","description":"Returns quarterly financials for every FDIC-insured US bank — FDIC BankFind Suite (RIS) data derived from Call Reports, one record per (bank, quarter-end) from 1984 to the present. Covers ~4,400 active institutions per modern quarter, most of which never file with the SEC — this is the banking-sector complement to get_fundamentals. Use this when the user asks about: a specific bank's assets / deposits / profitability / capital ratios, bank league tables ('largest banks in Texas'), deposit flight or brokered-deposit reliance, nonperforming-asset trends, or to pair bank fundamentals with OCC/FDIC/Fed enforcement actions and CFPB complaints.  Record shape: identity (cert = FDIC certificate number, the stable bank key; name/city/state), balance sheet in $ THOUSANDS (total_assets, total_deposits, equity_capital, net_loans_leases, securities, loan buckets, brokered_deposits, insured-deposit estimates), income statement in $ thousands (net_income, interest income/expense, noninterest income/expense, provisions), and FDIC-computed ratios in percent (roa, roe, net_interest_margin, efficiency_ratio, leverage_ratio, tier1_risk_based_ratio, cet1_ratio, total_risk_based_ratio, nonperforming_assets_ratio, net_chargeoffs_ratio, loans_to_core_deposits).  CONVENTIONS (Call Report): income-statement items are YEAR-TO-DATE (Q3 net_income = nine months, not the quarter alone; Q4 = full year); ratios are FDIC's annualized computations; roe_quarterly is the single-quarter ROE. Balance-sheet items are point-in-time.  Matching a bank: cert (FDIC certificate #) is exact and stable — resolve it once via a name substring query, then use cert for history. Banks are subsidiaries: 'JPMorgan Chase Bank, National Association' (cert 628) is the insured bank, not the NYSE-listed holding company — for the parent's SEC financials use get_fundamentals.  League tables: report_date='<quarter-end>' + sort_by='total_assets' (e.g., report_date '2026-03-31'). Quarter-ends are 03-31 / 06-30 / 09-30 / 12-31. Latest quarter fills in progressively for ~60 days after quarter end as banks file.  Pure-publisher: FDIC's numbers as published, no derived health scores.","parameters":[{"name":"id","in":"query","required":false,"description":"Direct lookup: '{cert}-{YYYY-MM-DD}' (e.g., '3511-2026-03-31'). Fastest path.","schema":{"type":"string"}},{"name":"cert","in":"query","required":false,"description":"FDIC certificate number (exact) — the stable bank identifier (e.g., 3511 = Wells Fargo Bank NA, 628 = JPMorgan Chase Bank NA).","schema":{"type":"integer"}},{"name":"name","in":"query","required":false,"description":"Case-insensitive substring against the institution name (e.g., 'silicon valley', 'first republic').","schema":{"type":"string"}},{"name":"state","in":"query","required":false,"description":"Two-letter state code (exact, e.g., 'CA', 'TX').","schema":{"type":"string"}},{"name":"report_date","in":"query","required":false,"description":"Exact quarter-end (YYYY-MM-DD: 03-31 / 06-30 / 09-30 / 12-31). Combine with sort_by='total_assets' for league tables.","schema":{"type":"string"}},{"name":"since","in":"query","required":false,"description":"report_date lower bound (YYYY-MM-DD inclusive).","schema":{"type":"string"}},{"name":"until","in":"query","required":false,"description":"report_date upper bound (YYYY-MM-DD inclusive).","schema":{"type":"string"}},{"name":"sort_by","in":"query","required":false,"description":"Default report_date. total_assets requires an exact report_date filter (league-table mode).","schema":{"type":"string","enum":["report_date","total_assets"]}},{"name":"sort_order","in":"query","required":false,"description":"Default: desc.","schema":{"type":"string","enum":["asc","desc"]}},{"name":"limit","in":"query","required":false,"description":"Maximum records to return. Default 50, max 500.","schema":{"type":"integer"}}],"responses":{"200":{"description":"JSON envelope: { results: [...], count, has_more }."},"400":{"description":"Invalid parameter."},"401":{"description":"Missing or invalid API key."},"402":{"description":"This tool requires a higher plan (upgrade_required). Retrying will not help."},"429":{"description":"Tier rate/quota limit reached (rate_limited). Retry-After points at the reset."}}}},"/v1/enforcement-actions":{"get":{"operationId":"get_enforcement_actions","summary":"Returns SEC + DOJ + CFTC + OCC + FDIC + FTC + Federal Reserve + FinCEN enforcement-related actions","description":"Returns SEC + DOJ + CFTC + OCC + FDIC + FTC + Federal Reserve + FinCEN enforcement-related actions. Eight regulators, one tool. Use this when the user asks about: recent SEC charges, DOJ indictments, CFTC derivatives/swaps enforcement, OCC national-bank examination actions, FDIC bank-failure announcements or insured-deposit transfers, FTC antitrust / consumer-protection cases, Federal Reserve actions against banks and individual bankers, FinCEN anti-money-laundering (BSA) penalties, insider trading prosecutions, FCPA actions, fraud cases, or to add a 'negative event' flag to a ticker or person by cross-checking against insider trades, activist filings, or tender offers.  Sources:   source='sec'  — SEC press releases (sec.gov/news/pressreleases.rss).                   Rolling ~50-item RSS window; refreshes daily. SEC                   enforcement and policy statements are mixed in the                   same feed — filter by title substring (e.g.,                   'charges', 'fraud', 'insider trading') to narrow.   source='doj'  — DOJ press releases (justice.gov/api/v1/press_releases.json).                   Latest ~200 records refreshed daily; rich metadata                   including agency_component (issuing division) and                   topics[]. Common components: 'Criminal Division',                   'Antitrust Division', 'Tax Division', 'Civil Division',                   'Office of Public Affairs', 'United States Attorneys'.   source='cftc' — CFTC press releases (cftc.gov/PressRoom/PressReleases).                   HTML index scrape (no RSS). Rolling ~50-item window.                   Covers derivatives/swaps enforcement, prediction-market                   jurisdiction, spoofing prosecutions, and policy actions.                   v1A index-only (no body extracted) — follow `url` for                   the substantive announcement.   source='occ'  — OCC news releases (occ.treas.gov/news-issuances/                   news-releases/<year>/...). Covers national-bank                   enforcement, examination findings, capital/leverage                   rules, interagency announcements. Yearly index. Both                   OCC-only (`nr-occ-...`) and interagency (`nr-ia-...`)                   releases included; bulletins filtered out.   source='fdic' — FDIC press releases (fdic.gov/news/press-releases).                   Covers bank failures + insured-deposit transfers,                   exam-result releases, deposit-insurance rule changes,                   CRA evaluations. Bank-failure announcements are some                   of the highest-signal FDIC items for agents.   source='ftc'  — FTC press releases (ftc.gov RSS). Antitrust, merger                   reviews, deceptive-practices and consumer-protection                   enforcement. Rolling recent window.   source='fed'  — Federal Reserve enforcement actions (full history                   from the Board's enforcement-actions CSV). One record                   per action per party: cease-and-desist orders, civil                   money penalties, prohibitions from banking, written                   agreements — against BOTH banking organizations and                   individual bankers. topics[] holds the action type(s);                   agency_component holds the bank (or the individual's                   affiliated bank); terminated_date is set once the Fed                   terminates the action (absent = still open).   source='fincen'—FinCEN enforcement actions (fincen.gov, complete                   history). Rare, high-profile anti-money-laundering /                   Bank Secrecy Act penalties (e.g., TD Bank, Paxful,                   Brink's). topics[] holds the institution category;                   release_number holds the matter number; url points at                   the consent-order PDF.  v1A scope: metadata + teaser + description (capped ~3000 chars; empty for CFTC v1A). Full prose lives at `url` — agents follow for the substantive announcement. Pure-publisher posture: no derived 'severity' or 'outcome prediction' signals.  Identifier format: action_id is 'sec-{guid-or-slug}', 'doj-{uuid}', 'cftc-{release-number}', 'occ-{slug}', 'fdic-{slug}', 'ftc-{slug}', 'fed-{date}-{party}-{action}', or 'fincen-{matter-number}'. Stable across re-scrapes.  Cross-source tip: pair with get_insider_transactions to detect insider trades by executives at companies later named in enforcement charges, or with get_activist_stakes to spot enforcement-driven exit attempts.","parameters":[{"name":"action_id","in":"query","required":false,"description":"Direct lookup ('sec-{guid}', 'doj-{uuid}', or 'cftc-{release-number}'). Fastest path.","schema":{"type":"string"}},{"name":"source","in":"query","required":false,"description":"Filter to one issuing agency: sec (SEC), doj (DOJ), cftc (CFTC), occ (OCC bank-regulator), fdic (FDIC bank-regulator), ftc (FTC antitrust + consumer protection), fed (Federal Reserve bank + individual-banker actions), fincen (FinCEN anti-money-laundering penalties).","schema":{"type":"string","enum":["sec","doj","cftc","occ","fdic","ftc","fed","fincen"]}},{"name":"title","in":"query","required":false,"description":"Case-insensitive substring against the title / headline (e.g., 'insider trading', 'fraud', 'antitrust').","schema":{"type":"string"}},{"name":"text","in":"query","required":false,"description":"Case-insensitive substring against title + teaser + description combined. Use for company-name / person-name searches.","schema":{"type":"string"}},{"name":"agency_component","in":"query","required":false,"description":"Substring against the issuing DOJ component (e.g., 'criminal division', 'fraud section', 'antitrust'). Empty for most SEC items.","schema":{"type":"string"}},{"name":"topic","in":"query","required":false,"description":"Filter by DOJ topic tag (array-contains, e.g., 'Financial Fraud', 'Cybercrime', 'Public Corruption').","schema":{"type":"string"}},{"name":"since","in":"query","required":false,"description":"Published date lower bound (YYYY-MM-DD inclusive).","schema":{"type":"string"}},{"name":"until","in":"query","required":false,"description":"Published date upper bound (YYYY-MM-DD inclusive).","schema":{"type":"string"}},{"name":"sort_order","in":"query","required":false,"description":"Default: desc (most recent announcements first).","schema":{"type":"string","enum":["asc","desc"]}},{"name":"limit","in":"query","required":false,"description":"Maximum actions to return. Default 50, max 500.","schema":{"type":"integer"}}],"responses":{"200":{"description":"JSON envelope: { results: [...], count, has_more }."},"400":{"description":"Invalid parameter."},"401":{"description":"Missing or invalid API key."},"402":{"description":"This tool requires a higher plan (upgrade_required). Retrying will not help."},"429":{"description":"Tier rate/quota limit reached (rate_limited). Retry-After points at the reset."}}}},"/v1/epa-enforcement":{"get":{"operationId":"get_epa_enforcement","summary":"Returns EPA federal CIVIL enforcement cases from ICIS FE&C (the EPA's Integrated Compliance Information System) via the ECHO bulk download — ~135K cases, EPA-lead administrative and judicial civil actions","description":"Returns EPA federal CIVIL enforcement cases from ICIS FE&C (the EPA's Integrated Compliance Information System) via the ECHO bulk download — ~135K cases, EPA-lead administrative and judicial civil actions. CRIMINAL prosecutions are NOT in this source, and neither are state-lead actions. Refreshed weekly by EPA (~Saturday).  Use this when the user asks about: EPA fines / penalties against a company, Clean Air Act / Clean Water Act / RCRA / Superfund enforcement, environmental violations by facility or state, settlements and consent decrees, or supplemental environmental projects (SEPs).  Record shape (one doc per case, joins pre-flattened): case_number (RR-YYYY-NNNN), case_name, defendants[] (names), statutes[] + primary_statute (CWA, CAA, FIFRA, SDWA, RCRA, TSCA, CERCLA, EPCRA), activity_type ('administrative' | 'judicial'), activity_status + status_date, penalties from the CASE_PENALTIES table — fed_penalty, state_local_penalty, sep_amount, compliance_action_cost, cost recoveries, penalty_collected — settlement_lodged_date (earliest; only ~34% of cases lodge, mostly judicial) + settlement_entered_date (latest) + settlements_count, facilities[] (name, city, state, NAICS, FRS registry ID), region_code, doj_docket_number, enf_outcome, voluntary_self_disclosure, multimedia, summary_text, and source_url (the ECHO case report page).  Date filters (since/until) and the default sort use status_date — the case's last status-change date, present on every case. Sorting by fed_penalty cannot be combined with since/until (numeric field).  Cross-source: pair with get_enforcement_actions (press-release actions from 8 other regulators), get_federal_contracts (whether an EPA defendant still wins federal awards), and get_material_events (8-K environmental-liability disclosures).  Pure-publisher posture: EPA's case records as published — no derived severity scores or compliance opinions.","parameters":[{"name":"case_number","in":"query","required":false,"description":"Direct lookup by ICIS case number, format RR-YYYY-NNNN (e.g., 'HQ-1998-0303').","schema":{"type":"string"}},{"name":"defendant_name","in":"query","required":false,"description":"Case-insensitive substring against defendant names + case name (e.g., 'caterpillar', 'exxon').","schema":{"type":"string"}},{"name":"state","in":"query","required":false,"description":"Two-letter state code of a named facility (e.g., 'TX'). Derived from the case's facilities.","schema":{"type":"string"}},{"name":"primary_statute","in":"query","required":false,"description":"Lead statute code (RANK_ORDER=1): CWA (Clean Water Act), CAA (Clean Air Act), FIFRA (pesticides), SDWA (drinking water), RCRA (hazardous waste), TSCA (toxic substances), CERCLA (Superfund), EPCRA (right-to-know). Rare others: AIM, MPRSA, MWTA.","schema":{"type":"string"}},{"name":"activity_type","in":"query","required":false,"description":"administrative = EPA's own formal actions (~93% of cases); judicial = DOJ-filed civil court cases.","schema":{"type":"string","enum":["administrative","judicial"]}},{"name":"min_penalty","in":"query","required":false,"description":"Only cases with fed_penalty >= this amount (USD).","schema":{"type":"number"}},{"name":"fiscal_year","in":"query","required":false,"description":"EPA fiscal year of the case (e.g., 2024).","schema":{"type":"integer"}},{"name":"since","in":"query","required":false,"description":"status_date lower bound (YYYY-MM-DD inclusive).","schema":{"type":"string"}},{"name":"until","in":"query","required":false,"description":"status_date upper bound (YYYY-MM-DD inclusive).","schema":{"type":"string"}},{"name":"sort_by","in":"query","required":false,"description":"Default: status_date. fed_penalty surfaces the largest federal penalties (cannot be combined with since/until).","schema":{"type":"string","enum":["status_date","fed_penalty"]}},{"name":"sort_order","in":"query","required":false,"description":"Default: desc.","schema":{"type":"string","enum":["asc","desc"]}},{"name":"limit","in":"query","required":false,"description":"Maximum records to return. Default 50, max 500.","schema":{"type":"integer"}}],"responses":{"200":{"description":"JSON envelope: { results: [...], count, has_more }."},"400":{"description":"Invalid parameter."},"401":{"description":"Missing or invalid API key."},"402":{"description":"This tool requires a higher plan (upgrade_required). Retrying will not help."},"429":{"description":"Tier rate/quota limit reached (rate_limited). Retry-After points at the reset."}}}},"/v1/nport-filings":{"get":{"operationId":"get_nport_filings","summary":"Returns SEC Form N-PORT filings — monthly portfolio reports from registered investment companies (mutual funds, ETFs, closed-end funds)","description":"Returns SEC Form N-PORT filings — monthly portfolio reports from registered investment companies (mutual funds, ETFs, closed-end funds). Use this when the user asks about: recent fund portfolio filings, when a specific fund family last reported, monthly cadence of fund disclosures, or to bridge from a fund trust name to the primary_doc.xml that contains full per-holding portfolio detail.  Source: SEC EDGAR full-text search. Covers both NPORT-P (original filing) and NPORT-P/A (amendments). N-PORT is filed within 60 days of each month-end; period_ending tells you which month the report covers.  v1A returns metadata only: filer trust name + CIK, period_ending, filing type, SEC investment company file number (e.g., '811-21864'), filer state + state of incorporation, and the URL to the full primary_doc.xml. Per-holding portfolio detail (every security in the fund's portfolio with quantity, fair value, currency, etc.) lives in that XML — agents follow the URL when they need security-level data.  Pairs with get_institutional_holdings (13F): 13F is quarterly, filed by INVESTMENT MANAGERS (Berkshire, Vanguard, BlackRock); N-PORT is monthly, filed by the FUND TRUST. Together = fresher snapshots across two complementary universes (manager-level vs fund-level).","parameters":[{"name":"filing_id","in":"query","required":false,"description":"EDGAR accession number. Direct doc lookup, fastest.","schema":{"type":"string"}},{"name":"filer_cik","in":"query","required":false,"description":"Fund trust's SEC CIK (1-10 digits; we zero-pad internally).","schema":{"type":"string"}},{"name":"filer_name","in":"query","required":false,"description":"Case-insensitive substring against the fund trust name (e.g., 'wisdomtree', 'vanguard', 'fidelity').","schema":{"type":"string"}},{"name":"period_ending","in":"query","required":false,"description":"Filter to a specific reporting period — the month-end the filing covers (YYYY-MM-DD).","schema":{"type":"string"}},{"name":"sec_file_number","in":"query","required":false,"description":"SEC Investment Company file number, e.g., '811-21864'. Each fund trust has a stable number.","schema":{"type":"string"}},{"name":"is_amendment","in":"query","required":false,"description":"When set, restricts to NPORT-P/A amendments (true) or original NPORT-P (false). Default: both.","schema":{"type":"boolean"}},{"name":"since","in":"query","required":false,"description":"file_date lower bound (YYYY-MM-DD inclusive).","schema":{"type":"string"}},{"name":"until","in":"query","required":false,"description":"file_date upper bound (YYYY-MM-DD inclusive).","schema":{"type":"string"}},{"name":"sort_by","in":"query","required":false,"description":"Default: file_date (most recently filed first). period_ending sorts by the month the report covers.","schema":{"type":"string","enum":["file_date","period_ending"]}},{"name":"sort_order","in":"query","required":false,"description":"Default: desc.","schema":{"type":"string","enum":["asc","desc"]}},{"name":"limit","in":"query","required":false,"description":"Maximum filings to return. Default 50, max 500.","schema":{"type":"integer"}}],"responses":{"200":{"description":"JSON envelope: { results: [...], count, has_more }."},"400":{"description":"Invalid parameter."},"401":{"description":"Missing or invalid API key."},"402":{"description":"This tool requires a higher plan (upgrade_required). Retrying will not help."},"429":{"description":"Tier rate/quota limit reached (rate_limited). Retry-After points at the reset."}}}},"/v1/money-market-funds":{"get":{"operationId":"get_money_market_funds","summary":"Returns Form N-MFP3 monthly money-market fund reports — one record per (fund series, month): fund category (Government / Prime / Single State…), net assets, shares outstanding, weighted average maturity (wam_days) and life (wal_days), the fund's DAILY daily/weekly liquid-asset percentages for the month (verbatim fractions of 1 — the money-market stress series), monthly gross subscriptions/redemptions, and stable-NAV posture","description":"Returns Form N-MFP3 monthly money-market fund reports — one record per (fund series, month): fund category (Government / Prime / Single State…), net assets, shares outstanding, weighted average maturity (wam_days) and life (wal_days), the fund's DAILY daily/weekly liquid-asset percentages for the month (verbatim fractions of 1 — the money-market stress series), monthly gross subscriptions/redemptions, and stable-NAV posture. Use this when the user asks about: money-market fund assets or flows, fund liquidity levels, WAM positioning as a rates signal, prime-vs- government fund dynamics, or a specific fund family's money funds.  The adviser_file_number (801-…) joins get_investment_advisers for the manager's full ADV profile; registrant cik joins other EDGAR datasets. Each fund files monthly — filter series_id + sort report_date asc to read one fund's history; filter by report_date (since/until) for a cross-fund month snapshot.  Coverage: 2010-11→present across all THREE form generations, with per-era cadence differences kept verbatim: N-MFP3 records (2024-06→) carry DAILY liquidity/shadow-NAV/yield series with real dates; N-MFP2 records (2016-10→2024-06) carry WEEKLY Friday points labeled with the source's own fridayWeek1..5 keys in the date field (the filing reports week numbers, not dates — never fabricated); original N-MFP records (2010-11→2016-10) carry single month-end shadow-NAV + yield points and NO liquidity percentages (that reporting began with the 2014 reforms). series_name is empty before 2024 (not in the older XML). The per-security portfolio schedule and per-class yields live in the filing XML — follow source_url (v1.1 scope).  Pure-publisher posture: the fund's reported numbers verbatim — no derived stress scores; liquidity thresholds are for agents to apply.","parameters":[{"name":"accession_number","in":"query","required":false,"description":"Direct lookup by EDGAR accession number.","schema":{"type":"string"}},{"name":"cik","in":"query","required":false,"description":"Registrant CIK (any zero-padding).","schema":{"type":"string"}},{"name":"series_id","in":"query","required":false,"description":"EDGAR series ID (e.g. 'S000096464') — one fund's monthly history.","schema":{"type":"string"}},{"name":"fund_name","in":"query","required":false,"description":"Case-insensitive substring against registrant or series name.","schema":{"type":"string"}},{"name":"fund_category","in":"query","required":false,"description":"Verbatim N-MFP category: 'Government', 'Prime', 'Single State', 'Other Tax Exempt', …","schema":{"type":"string"}},{"name":"is_retail_fund","in":"query","required":false,"description":"Filter to retail (true) / institutional (false) funds.","schema":{"type":"boolean"}},{"name":"since","in":"query","required":false,"description":"report_date lower bound (YYYY-MM-DD inclusive).","schema":{"type":"string"}},{"name":"until","in":"query","required":false,"description":"report_date upper bound (YYYY-MM-DD inclusive).","schema":{"type":"string"}},{"name":"sort_by","in":"query","required":false,"description":"Default report_date (newest month first).","schema":{"type":"string","enum":["report_date","net_assets"]}},{"name":"sort_order","in":"query","required":false,"description":"Default desc.","schema":{"type":"string","enum":["asc","desc"]}},{"name":"limit","in":"query","required":false,"description":"Maximum records. Default 50, max 500.","schema":{"type":"integer"}}],"responses":{"200":{"description":"JSON envelope: { results: [...], count, has_more }."},"400":{"description":"Invalid parameter."},"401":{"description":"Missing or invalid API key."},"402":{"description":"This tool requires a higher plan (upgrade_required). Retrying will not help."},"429":{"description":"Tier rate/quota limit reached (rate_limited). Retry-After points at the reset."}}}},"/v1/fund-holdings":{"get":{"operationId":"get_fund_holdings","summary":"Returns per-security holdings from SEC Form N-PORT primary documents — one row per investment-or-security line in a mutual fund / ETF / closed-end fund's monthly portfolio report","description":"Returns per-security holdings from SEC Form N-PORT primary documents — one row per investment-or-security line in a mutual fund / ETF / closed-end fund's monthly portfolio report. Use this when the user asks about: which funds hold a specific stock or bond, a fund's complete portfolio composition, fund-level derivative exposure (swaps, options, futures), repo positions, concentration by issuer, or to compose 'which ETFs added X this month' / 'which funds shorted Y' style queries.  Source: parsed from each NportFiling's primary_doc.xml. Covers all asset categories N-PORT reports: equities (EC common, EP preferred), debt (DBT, ABS, MBS, UST, USTPS, STIV, SN, LT, MMF), derivatives (DCO commodity, DCR credit, DE equity, DFE fx, DIR rate, DR other), repos (REPO, RP), cash (CASH).  Useful filter combos:   ticker='NVDA'                       all funds holding NVDA   cusip='037833100'                   AAPL by CUSIP (more reliable than ticker for N-PORT)   is_derivative=true, filer_name='BlackRock'                                        BlackRock's full derivative book   derivative_type='swap'              every swap position in the universe   asset_cat='REPO'                    repos and reverse-repo exposure   payoff_profile='Short'              short positions only   min_pct_of_portfolio=5              concentrated positions (>=5% of NAV)   filer_cik='0000884394'              one fund's complete portfolio  Each holding ties to its parent NportFiling via filing_id. Read the parent for fund metadata (file_date, file_number, amendment flag); read the holding for security-level detail. is_derivative + derivative_type distinguish structured derivative rows from straight equity/debt holdings.  Counterparty, strike, expiration, leg-level terms, and other deep derivative sub-block fields are NOT extracted in v1A — agents follow the parent filing's primary_document_url for that level of detail.  COVERAGE: holdings rows exist for N-PORT filings FILED 2026-05-12 onward (when row-level extraction shipped). Earlier filings are metadata-only in get_nport_filings — follow primary_document_url for their holdings. An empty result for an older filing means not-extracted, not an empty fund.","parameters":[{"name":"filing_id","in":"query","required":false,"description":"EDGAR accession number — returns all holdings from one specific N-PORT filing (one fund-month).","schema":{"type":"string"}},{"name":"filer_cik","in":"query","required":false,"description":"Fund trust CIK (10-digit, padded with leading zeros). Returns the trust's holdings across all reporting months.","schema":{"type":"string"}},{"name":"filer_name","in":"query","required":false,"description":"Case-insensitive substring against fund trust name (e.g., 'iShares', 'Vanguard', 'SPDR').","schema":{"type":"string"}},{"name":"period_ending","in":"query","required":false,"description":"Reporting month-end (YYYY-MM-DD). Restricts results to one reporting period.","schema":{"type":"string"}},{"name":"name","in":"query","required":false,"description":"Case-insensitive substring against the holding issuer name (e.g., 'Apple', 'Treasury', 'Goldman Sachs').","schema":{"type":"string"}},{"name":"cusip","in":"query","required":false,"description":"Exact 9-character CUSIP. Most reliable identifier for equity and debt holdings in N-PORT.","schema":{"type":"string"}},{"name":"ticker","in":"query","required":false,"description":"Exact ticker symbol if filer included it in the identifiers block (less common than CUSIP).","schema":{"type":"string"}},{"name":"isin","in":"query","required":false,"description":"Exact ISIN if filer included it in the identifiers block.","schema":{"type":"string"}},{"name":"asset_cat","in":"query","required":false,"description":"Exact asset-category code. Examples: 'EC' common stock, 'DBT' debt, 'DE' equity derivative, 'DIR' rate derivative, 'REPO' repurchase agreement, 'UST' US Treasury, 'CASH' cash.","schema":{"type":"string"}},{"name":"is_derivative","in":"query","required":false,"description":"True returns only derivative rows (asset_cat starting with 'D'). False returns only non-derivative rows. Omit for both.","schema":{"type":"boolean"}},{"name":"derivative_type","in":"query","required":false,"description":"Structural derivative type, derived from which `<derivativeInfo>` child element is present in the filing.","schema":{"type":"string","enum":["future","forward","swap","option","warrant","swaption","other"]}},{"name":"country","in":"query","required":false,"description":"ISO-2 country code of the holding (e.g., 'US', 'GB', 'JP').","schema":{"type":"string"}},{"name":"payoff_profile","in":"query","required":false,"description":"Filter to long or short positions per N-PORT payoffProfile field.","schema":{"type":"string","enum":["Long","Short"]}},{"name":"min_value_usd","in":"query","required":false,"description":"Minimum fair value in USD. Use to focus on large positions only.","schema":{"type":"number"}},{"name":"min_pct_of_portfolio","in":"query","required":false,"description":"Minimum percentage of fund net assets (0-100 scale). Use to focus on concentrated positions.","schema":{"type":"number"}},{"name":"since","in":"query","required":false,"description":"ISO date (YYYY-MM-DD). Only holdings whose period_ending >= this date.","schema":{"type":"string"}},{"name":"until","in":"query","required":false,"description":"ISO date (YYYY-MM-DD). Only holdings whose period_ending <= this date.","schema":{"type":"string"}},{"name":"sort_by","in":"query","required":false,"description":"Default: value_usd.","schema":{"type":"string","enum":["value_usd","pct_of_portfolio","period_ending"]}},{"name":"sort_order","in":"query","required":false,"description":"Default: desc (largest / most recent first).","schema":{"type":"string","enum":["desc","asc"]}},{"name":"limit","in":"query","required":false,"description":"Maximum records to return. Default 50, max 500.","schema":{"type":"integer"}}],"responses":{"200":{"description":"JSON envelope: { results: [...], count, has_more }."},"400":{"description":"Invalid parameter."},"401":{"description":"Missing or invalid API key."},"402":{"description":"This tool requires a higher plan (upgrade_required). Retrying will not help."},"429":{"description":"Tier rate/quota limit reached (rate_limited). Retry-After points at the reset."}}}},"/v1/registration-statements":{"get":{"operationId":"get_registration_statements","summary":"Returns SEC Form S-1 / S-3 / S-3ASR registration statements — securities offering registrations filed with the SEC","description":"Returns SEC Form S-1 / S-3 / S-3ASR registration statements — securities offering registrations filed with the SEC. Use this when the user asks about: which companies are going public (IPO pipeline via S-1), shelf registrations (S-3 / S-3ASR — company registers securities to sell over multiple offerings without re-registering; large established issuers use the automatic S-3ASR variant), recent secondary offerings, registration amendments updating prior filings, or to bridge from a company name / ticker to the prospectus prose.  Forms covered:   S-1    — Initial registration (IPO + first-time registrants)   S-1/A  — Amendment to an S-1   S-3    — Shelf registration (issuers meeting reporting / market-cap            criteria; lets them issue securities over time without            re-registering each time)   S-3/A  — Amendment to an S-3   S-3ASR — Automatic shelf registration. The shelf form used by            Well-Known Seasoned Issuers (large established companies            like Apple, Ford, most of the S&P 500). Effective on            filing. These issuers file S-3ASR, NOT plain S-3.  Source: SEC EDGAR full-text search. Returns one record per filing, deduped by accession. Exhibit attachments (EX-10, opinion letters, fee tables, etc.) are filtered out — only the canonical form types are returned.  v1A is metadata only. Each record has filer name + CIK + optional ticker + SEC file_number, state, SIC code(s), and URLs. Substantive prospectus content (offering size, share counts, use of proceeds, risk factors, financial statements) lives at primary_document_url — agents follow for the prose.  SCOPE — covers S-1 (IPO), S-3 + S-3ASR (shelf, including WKSI auto shelves), plus /A amendments. S-8 employee-benefit-plan registrations, S-4 merger/acquisition registrations, and F-series foreign-issuer forms are NOT ingested. 424B prospectus supplements (offering takedowns off an existing shelf) are out of scope — query the shelf registration itself.  Amendment chains: all amendments share the same sec_file_number as the original. Use sec_file_number filter to fetch an entire amendment chain.  Pure-publisher posture: KeyVex doesn't derive 'likely-to-IPO' or 'price-target' signals from registration filings.","parameters":[{"name":"filing_id","in":"query","required":false,"description":"EDGAR accession number. Direct doc lookup.","schema":{"type":"string"}},{"name":"filer_name","in":"query","required":false,"description":"Case-insensitive substring against the filer's entity name (e.g., 'kraneshares', 'karyopharm'). NOTE: matched over a recent-filing window, so it reliably finds CURRENT filers but can miss an issuer whose registrations are older than that window. To pull a specific issuer's full registration history regardless of date, use filer_cik (most reliable) — e.g. Circle Internet Group is filer_cik 0001876042.","schema":{"type":"string"}},{"name":"filer_cik","in":"query","required":false,"description":"Filer's SEC CIK (1-10 digits).","schema":{"type":"string"}},{"name":"filer_ticker","in":"query","required":false,"description":"Ticker symbol (e.g., 'KPTI'). Often empty for IPO-stage S-1 filers (they don't have a ticker yet).","schema":{"type":"string"}},{"name":"filing_type","in":"query","required":false,"description":"Exact filing-type match.","schema":{"type":"string","enum":["S-1","S-1/A","S-3","S-3/A","S-3ASR"]}},{"name":"s1_only","in":"query","required":false,"description":"When true, restricts to S-1 family (S-1 + S-1/A) — the IPO / first-time pool.","schema":{"type":"boolean"}},{"name":"s3_only","in":"query","required":false,"description":"When true, restricts to S-3 family (S-3 + S-3/A + S-3ASR) — the shelf pool, including automatic shelf registrations filed by Well-Known Seasoned Issuers.","schema":{"type":"boolean"}},{"name":"exclude_amendments","in":"query","required":false,"description":"When true, drops /A amendments. Default false.","schema":{"type":"boolean"}},{"name":"sec_file_number","in":"query","required":false,"description":"SEC-assigned registration file number ('333-XXXXXX'). Stable across amendments — use to fetch a full amendment chain.","schema":{"type":"string"}},{"name":"since","in":"query","required":false,"description":"file_date lower bound (YYYY-MM-DD inclusive).","schema":{"type":"string"}},{"name":"until","in":"query","required":false,"description":"file_date upper bound (YYYY-MM-DD inclusive).","schema":{"type":"string"}},{"name":"sort_order","in":"query","required":false,"description":"Default: desc (most recently filed first).","schema":{"type":"string","enum":["asc","desc"]}},{"name":"limit","in":"query","required":false,"description":"Maximum filings to return. Default 50, max 500.","schema":{"type":"integer"}}],"responses":{"200":{"description":"JSON envelope: { results: [...], count, has_more }."},"400":{"description":"Invalid parameter."},"401":{"description":"Missing or invalid API key."},"402":{"description":"This tool requires a higher plan (upgrade_required). Retrying will not help."},"429":{"description":"Tier rate/quota limit reached (rate_limited). Retry-After points at the reset."}}}},"/v1/sec-comment-letters":{"get":{"operationId":"get_sec_comment_letters","summary":"Returns SEC comment-letter correspondence: form UPLOAD (the SEC's letter TO the company — the questions) and CORRESP (the company's response)","description":"Returns SEC comment-letter correspondence: form UPLOAD (the SEC's letter TO the company — the questions) and CORRESP (the company's response). The Division of Corporation Finance sends these during filing reviews; they're released ~20+ business days after the review closes. Coverage 2005→present. Use this when the user asks about: whether a company is (or was) under SEC review, accounting-quality red flags before they become enforcement, the back-and-forth around an IPO registration, or to pair with fundamentals / insider activity ('were insiders selling while the SEC was asking questions?').  Reading a thread: filter by ticker or cik, sort date_filed asc — a review is an alternating UPLOAD/CORRESP chain; the final short UPLOAD is typically the 'review complete' letter. v1A is metadata-only: follow filing_index_url for the letter text.  released_date is set on records captured from EDGAR's daily indexes (the dissemination day); older backfilled records carry only date_filed (the letter's own date) — dissemination day isn't recoverable historically and KeyVex never fabricates it.  A comment letter is ROUTINE, not an accusation — most large filers get reviewed on a cycle (Sarbanes-Oxley §408 requires review at least every 3 years). Signal comes from thread LENGTH, topic, and recency, which agents judge from the letter text.  Pure-publisher posture: EDGAR index records as published.","parameters":[{"name":"accession_number","in":"query","required":false,"description":"Direct lookup by EDGAR accession number (e.g., '0000000000-26-004788').","schema":{"type":"string"}},{"name":"form","in":"query","required":false,"description":"UPLOAD = SEC's letter to the company; CORRESP = the company's response.","schema":{"type":"string","enum":["UPLOAD","CORRESP"]}},{"name":"ticker","in":"query","required":false,"description":"Exact ticker (resolved from CIK; '' for unlisted filers).","schema":{"type":"string"}},{"name":"cik","in":"query","required":false,"description":"SEC CIK (any zero-padding).","schema":{"type":"string"}},{"name":"company_name","in":"query","required":false,"description":"Case-insensitive substring against the company name as indexed.","schema":{"type":"string"}},{"name":"since","in":"query","required":false,"description":"Letter date lower bound (YYYY-MM-DD inclusive).","schema":{"type":"string"}},{"name":"until","in":"query","required":false,"description":"Letter date upper bound (YYYY-MM-DD inclusive).","schema":{"type":"string"}},{"name":"sort_order","in":"query","required":false,"description":"Default desc. Use asc with a ticker filter to read a review thread in order.","schema":{"type":"string","enum":["asc","desc"]}},{"name":"limit","in":"query","required":false,"description":"Maximum letters to return. Default 50, max 500.","schema":{"type":"integer"}}],"responses":{"200":{"description":"JSON envelope: { results: [...], count, has_more }."},"400":{"description":"Invalid parameter."},"401":{"description":"Missing or invalid API key."},"402":{"description":"This tool requires a higher plan (upgrade_required). Retrying will not help."},"429":{"description":"Tier rate/quota limit reached (rate_limited). Retry-After points at the reset."}}}},"/v1/delistings":{"get":{"operationId":"get_delistings","summary":"Returns SEC delisting and deregistration filings: the Form 25 family (notification of removal from listing on a national exchange under Rule 12d2-2) and the Form 15 family (certification terminating or suspending a security class's registration — the 'going dark' filing that ends SEC reporting; 15F variants are the foreign-private-issuer equivalents)","description":"Returns SEC delisting and deregistration filings: the Form 25 family (notification of removal from listing on a national exchange under Rule 12d2-2) and the Form 15 family (certification terminating or suspending a security class's registration — the 'going dark' filing that ends SEC reporting; 15F variants are the foreign-private-issuer equivalents). Use this when the user asks: was/is a company being delisted, which companies went dark recently, what securities did an exchange remove, or to pair with tender offers / 8-Ks / insider sales around an exit event.  Reading a record: action='delisting' (25 family) vs 'deregistration' (15 family) is a faithful form→rule mapping, not an opinion. 25-NSE is filed BY THE EXCHANGE against the issuer (exchange_name/exchange_cik are set) — typically the involuntary path; a bare Form 25 is filed by the issuer itself (voluntary withdrawal, e.g. after a merger). rule_provision carries the cited Rule 12d2-2 provision verbatim — the provision distinguishes the grounds for removal; agents can read the cited paragraph. A merger close typically produces a Form 25 AND a Form 15 within weeks.  EDGAR coverage: Form 15 family 1994→present; issuer-filed Form 25 from mid-2001; exchange-filed 25-NSE from 2005 Q4 (the Rule 12d2-2 amendments moved exchange filings onto EDGAR — earlier removals were paper-filed and are not in EDGAR). security_class / rule_provision / exchange fields are populated from the structured 25-NSE XML; 15-family records are metadata-level — follow filing_index_url for the document.  Pure-publisher posture: EDGAR records as published.","parameters":[{"name":"accession_number","in":"query","required":false,"description":"Direct lookup by EDGAR accession number (e.g., '0000876661-26-000593').","schema":{"type":"string"}},{"name":"form","in":"query","required":false,"description":"Verbatim form type. 25-NSE = exchange-filed removal; 25 = issuer-filed; 15-12B/15-12G/15-15D = deregistration by registration section; 15F-* = foreign private issuers; /A = amendment.","schema":{"type":"string","enum":["25","25/A","25-NSE","25-NSE/A","15-12B","15-12B/A","15-12G","15-12G/A","15-15D","15-15D/A","15F-12B","15F-12B/A","15F-12G","15F-12G/A","15F-15D","15F-15D/A"]}},{"name":"action","in":"query","required":false,"description":"Form family: 'delisting' = Form 25 family (exchange removal); 'deregistration' = Form 15 family (going dark).","schema":{"type":"string","enum":["delisting","deregistration"]}},{"name":"ticker","in":"query","required":false,"description":"Exact ticker (resolved from CIK; '' for unlisted filers).","schema":{"type":"string"}},{"name":"cik","in":"query","required":false,"description":"Issuer SEC CIK (any zero-padding).","schema":{"type":"string"}},{"name":"company_name","in":"query","required":false,"description":"Case-insensitive substring against the issuer name.","schema":{"type":"string"}},{"name":"since","in":"query","required":false,"description":"Filing date lower bound (YYYY-MM-DD inclusive).","schema":{"type":"string"}},{"name":"until","in":"query","required":false,"description":"Filing date upper bound (YYYY-MM-DD inclusive).","schema":{"type":"string"}},{"name":"sort_order","in":"query","required":false,"description":"Sort by filing date. Default desc (newest first).","schema":{"type":"string","enum":["asc","desc"]}},{"name":"limit","in":"query","required":false,"description":"Maximum records to return. Default 50, max 500.","schema":{"type":"integer"}}],"responses":{"200":{"description":"JSON envelope: { results: [...], count, has_more }."},"400":{"description":"Invalid parameter."},"401":{"description":"Missing or invalid API key."},"402":{"description":"This tool requires a higher plan (upgrade_required). Retrying will not help."},"429":{"description":"Tier rate/quota limit reached (rate_limited). Retry-After points at the reset."}}}},"/v1/investment-advisers":{"get":{"operationId":"get_investment_advisers","summary":"Returns SEC Form ADV registry records — every SEC-registered investment adviser (~17K RIAs) and exempt reporting adviser (~6.5K ERAs, mostly private-fund advisers), from the SEC's monthly roster extract","description":"Returns SEC Form ADV registry records — every SEC-registered investment adviser (~17K RIAs) and exempt reporting adviser (~6.5K ERAs, mostly private-fund advisers), from the SEC's monthly roster extract. One record per firm (CRD number) with regulatory AUM (discretionary / non-discretionary / total, Item 5F), employees and IA reps, client counts, custody flags (Item 9A), and disciplinary disclosure flags (Item 11, verbatim sub-question codes). Use this when the user asks: who advises/manages money, how big is an adviser, largest RIAs by state, advisers with disciplinary history, or to vet a firm before pairing with enforcement / holdings data.  firm_type: 'registered' RIAs report regulatory AUM; 'exempt_reporting' ERAs do NOT report Item 5F — their AUM fields are null by construction (they report private-fund data instead; see adviserinfo_url for Section 7.B detail).  Registry posture: this is a CURRENT-ROSTER snapshot refreshed monthly, not an event history. snapshot_month is the last month the firm appeared — a stale snapshot_month means the firm dropped off the roster (deregistered). min_aum filters on total regulatory AUM and requires the default aum_total sort. CIK is the join key to EDGAR datasets (13F institutional holdings, enforcement).  v1A maps a curated ~30-field subset of Form ADV Part 1A's 448-column grid; adviserinfo_url links the firm's full IAPD page.  Pure-publisher posture: the SEC's roster as published. A disciplinary FLAG is a disclosure, not a verdict — agents read the detail on IAPD.","parameters":[{"name":"crd","in":"query","required":false,"description":"Direct lookup by firm CRD number (e.g., '38').","schema":{"type":"string"}},{"name":"cik","in":"query","required":false,"description":"Exact EDGAR CIK (any zero-padding) — the join key to 13F / enforcement data.","schema":{"type":"string"}},{"name":"firm_type","in":"query","required":false,"description":"'registered' = SEC-registered RIAs (report AUM); 'exempt_reporting' = ERAs (AUM fields null).","schema":{"type":"string","enum":["registered","exempt_reporting"]}},{"name":"firm_name","in":"query","required":false,"description":"Case-insensitive substring against primary business or legal name.","schema":{"type":"string"}},{"name":"state","in":"query","required":false,"description":"Two-letter main-office state code (e.g., 'NY').","schema":{"type":"string"}},{"name":"country","in":"query","required":false,"description":"Main-office country, verbatim (e.g., 'United States').","schema":{"type":"string"}},{"name":"has_disciplinary_disclosures","in":"query","required":false,"description":"Filter to firms with (true) / without (false) Item 11 disclosures.","schema":{"type":"boolean"}},{"name":"min_aum","in":"query","required":false,"description":"Minimum total regulatory AUM in dollars (registered firms only; requires sort_by aum_total).","schema":{"type":"number"}},{"name":"sort_by","in":"query","required":false,"description":"Default aum_total (largest first).","schema":{"type":"string","enum":["aum_total","latest_adv_filing_date"]}},{"name":"sort_order","in":"query","required":false,"description":"Default desc.","schema":{"type":"string","enum":["asc","desc"]}},{"name":"limit","in":"query","required":false,"description":"Maximum firms to return. Default 50, max 500.","schema":{"type":"integer"}}],"responses":{"200":{"description":"JSON envelope: { results: [...], count, has_more }."},"400":{"description":"Invalid parameter."},"401":{"description":"Missing or invalid API key."},"402":{"description":"This tool requires a higher plan (upgrade_required). Retrying will not help."},"429":{"description":"Tier rate/quota limit reached (rate_limited). Retry-After points at the reset."}}}},"/v1/sec-fails-to-deliver":{"get":{"operationId":"get_sec_fails_to_deliver","summary":"Returns SEC Fails-to-Deliver (FTD) rows — daily settlement failures by ticker / CUSIP / date","description":"Returns SEC Fails-to-Deliver (FTD) rows — daily settlement failures by ticker / CUSIP / date. Each row is one ticker on one settlement date where a clearing-member's short sale FAILED to deliver shares.  Signal value: persistent FTDs are a contrarian short-squeeze leading indicator. When the daily FTD quantity spikes on a ticker, it often means naked short pressure overwhelming locate supply or settlement / locate mechanism breaking down. The Reg SHO Threshold Securities list (FTDs > 0.5% of issued shares for 5+ consecutive days) is a derived view; this tool exposes the underlying daily data.  Source: SEC bi-monthly cnsfails<YYYYMM><a|b>.zip files at sec.gov/files/data/fails-deliver-data/. Published ~1 week after each half-month settlement period. Coverage: every U.S.-listed security with a recorded settlement failure during the period.  Killer query patterns:   - Daily FTD history for a ticker: ticker='GME' + sort_by='settlement_date'   - Largest FTDs this month: min_value=1000000 + sort_by='fail_value'   - Squeeze setup candidates: min_quantity=100000 + recent dates   - Look-up by CUSIP: cusip='B6S7WD106' (foreign issuers, complex names)  Derived field: fail_value = quantity_fails × price (dollar magnitude of the failure on that day). Reference price comes from the SEC's posted value at settlement.  Note: FTDs are bi-monthly batch-published, not real-time. SEC releases each half-month batch (cnsfails<YYYYMM>a = days 1-15, b = 16-end) roughly 2-4 weeks AFTER that half-month period closes, so the most recent settlement date can be 2-4 weeks behind today (e.g. in mid-June the latest published batch is first-half-May, with settlement dates through ~May 15). That apparent lag is the SEC publish cadence, not a KeyVex freshness gap.","parameters":[{"name":"id","in":"query","required":false,"description":"Direct doc lookup ({YYYY-MM-DD}-{cusip}). Fastest path.","schema":{"type":"string"}},{"name":"ticker","in":"query","required":false,"description":"Ticker symbol (uppercased automatically).","schema":{"type":"string"}},{"name":"cusip","in":"query","required":false,"description":"Exact CUSIP (preferred for foreign issuers / class shares).","schema":{"type":"string"}},{"name":"since","in":"query","required":false,"description":"Inclusive lower bound on settlement_date (YYYY-MM-DD).","schema":{"type":"string"}},{"name":"until","in":"query","required":false,"description":"Inclusive upper bound on settlement_date (YYYY-MM-DD).","schema":{"type":"string"}},{"name":"min_quantity","in":"query","required":false,"description":"Inclusive lower bound on quantity_fails (shares). E.g., 100000 surfaces only large failures.","schema":{"type":"number"}},{"name":"min_value","in":"query","required":false,"description":"Inclusive lower bound on fail_value (dollars). E.g., 1000000 surfaces only $1M+ failures.","schema":{"type":"number"}},{"name":"sort_by","in":"query","required":false,"description":"Sort key. Default: settlement_date.","schema":{"type":"string","enum":["settlement_date","quantity_fails","fail_value"]}},{"name":"sort_order","in":"query","required":false,"description":"Default: desc.","schema":{"type":"string","enum":["asc","desc"]}},{"name":"limit","in":"query","required":false,"description":"Max records. Default 50, max 500.","schema":{"type":"integer"}}],"responses":{"200":{"description":"JSON envelope: { results: [...], count, has_more }."},"400":{"description":"Invalid parameter."},"401":{"description":"Missing or invalid API key."},"402":{"description":"This tool requires a higher plan (upgrade_required). Retrying will not help."},"429":{"description":"Tier rate/quota limit reached (rate_limited). Retry-After points at the reset."}}}},"/v1/ofac-sdn":{"get":{"operationId":"get_ofac_sdn","summary":"Returns OFAC Specially Designated Nationals (SDN) sanctions list entries","description":"Returns OFAC Specially Designated Nationals (SDN) sanctions list entries. Use this for: compliance screening, KYC, sanctions-program queries (e.g., 'who's on the Russia SDN list'), or cross-referencing named individuals / entities against the canonical US sanctions list.  Source: US Treasury OFAC — sanctionslistservice.ofac.treas.gov. ~19,000 entries refreshed daily. Each entry represents a person, entity, vessel, or aircraft sanctioned by the US government under one or more programs (CUBA, IRAN, SDGT [terrorism], NPWMD [WMD proliferation], RUSSIA-EO14024, etc.).  US persons (citizens, residents, US-domiciled companies) are legally prohibited from transacting with SDNs — this is the canonical list banks screen against.  Filter by name substring for primary lookups. entity_type values: 'individual', 'entity', 'vessel', 'aircraft', or empty. program is a substring filter against the comma-delimited Program field (e.g., 'iran', 'russia', 'narcotics'). remarks substring catches aliases, DOB / passport references, and related-party hints.  Direct ent_num lookup is fastest (OFAC's stable entity number).  WHAT'S NOT IN v1A (data-model limitations to know about): the schema does NOT include designation_date (when OFAC originally added the entry). OFAC's basic SDN.csv source file only provides 12 columns and omits this — the date lives in OFAC's advanced XML and a separate 'Recent Actions' page on their site. So 'sanctions added in the last N days' is not directly queryable via this tool — point users at ofac.treasury.gov/recent-actions for that specific question. v1.1 polish will add advanced-XML ingestion to capture designation_date. Also: there's no since/until filter and no date sort option for the same reason — the only sort options are name and ent_num.  Pure-publisher posture: KeyVex returns OFAC's published list as-is. No derived 'risk score' or 'similarity match' — agents handle fuzzy matching downstream. For compliance use, agents should also consult the US Consolidated Screening List (get_screening_list) which spans 12 export-control / sanctions lists from State + Commerce + Treasury.","parameters":[{"name":"ent_num","in":"query","required":false,"description":"Direct OFAC entity number lookup. Fastest path.","schema":{"type":"string"}},{"name":"name","in":"query","required":false,"description":"Case-insensitive substring against the primary listed name (e.g., 'kim jong un', 'gazprom').","schema":{"type":"string"}},{"name":"entity_type","in":"query","required":false,"description":"Filter to one entity type. 'entity' covers companies / orgs; 'individual' for people; 'vessel' / 'aircraft' for transports.","schema":{"type":"string","enum":["individual","entity","vessel","aircraft"]}},{"name":"program","in":"query","required":false,"description":"Substring against the comma-delimited program field (e.g., 'IRAN', 'RUSSIA', 'SDGT' for terrorism, 'NARCOTICS').","schema":{"type":"string"}},{"name":"remarks","in":"query","required":false,"description":"Substring against free-text remarks (aliases, DOB / passport references, related-party hints).","schema":{"type":"string"}},{"name":"sort_by","in":"query","required":false,"description":"Default: ent_num.","schema":{"type":"string","enum":["ent_num","name"]}},{"name":"sort_order","in":"query","required":false,"description":"Default: asc.","schema":{"type":"string","enum":["asc","desc"]}},{"name":"limit","in":"query","required":false,"description":"Maximum entries to return. Default 50, max 500.","schema":{"type":"integer"}}],"responses":{"200":{"description":"JSON envelope: { results: [...], count, has_more }."},"400":{"description":"Invalid parameter."},"401":{"description":"Missing or invalid API key."},"402":{"description":"This tool requires a higher plan (upgrade_required). Retrying will not help."},"429":{"description":"Tier rate/quota limit reached (rate_limited). Retry-After points at the reset."}}}},"/v1/federal-register-documents":{"get":{"operationId":"get_federal_register_documents","summary":"Returns Federal Register documents — the daily-published collection of US executive branch regulatory + administrative actions","description":"Returns Federal Register documents — the daily-published collection of US executive branch regulatory + administrative actions. Use this for: regulatory tracking (what's the SEC / EPA / FDA proposing this week?), executive order monitoring, public-comment-period tracking, lobbying tie-in (cross-reference with get_lobbying_filings for 'who's pushing which rule'), or compliance forward-look on proposed regulations.  Source: federalregister.gov public REST API. Comprehensive — every Federal Register publication appears here.  Document types (document_type field):   'Rule'                  — final regulation (in effect)   'Proposed Rule'         — agency rule open for public comment   'Notice'                — formal notice (sunshine acts, hearings,                             authorizations, determinations, etc.)   'Presidential Document' — executive orders, proclamations, memoranda  Agency filtering: agency_slug uses URL-safe identifiers like 'securities-and-exchange-commission', 'environmental-protection-agency', 'food-and-drug-administration', 'federal-trade-commission'. Filter via agency_slug for exact-match; agency_name does case-insensitive substring for fuzzier 'I know the name but not the slug' lookups.  Composite document numbers (e.g., '2026-09385') are GPO-assigned and stable. Direct document_number lookup is fastest.  Pure-publisher posture: KeyVex returns the daily publication record as-is. No 'regulatory risk score' or 'likely-to-finalize' signals.","parameters":[{"name":"document_number","in":"query","required":false,"description":"GPO-assigned document number (e.g., '2026-09385'). Direct doc lookup, fastest.","schema":{"type":"string"}},{"name":"title","in":"query","required":false,"description":"Case-insensitive substring against the document title.","schema":{"type":"string"}},{"name":"document_type","in":"query","required":false,"description":"Exact filter to one document type. 'Proposed Rule' is the high-value one for compliance forward-look.","schema":{"type":"string","enum":["Rule","Proposed Rule","Notice","Presidential Document"]}},{"name":"agency_slug","in":"query","required":false,"description":"Agency slug for exact filter (e.g., 'securities-and-exchange-commission', 'environmental-protection-agency').","schema":{"type":"string"}},{"name":"agency_name","in":"query","required":false,"description":"Case-insensitive substring against full agency names. Use when you don't know the slug.","schema":{"type":"string"}},{"name":"text","in":"query","required":false,"description":"Substring against title + abstract + excerpts combined. Use for topic searches ('climate', 'ai', 'cryptocurrency').","schema":{"type":"string"}},{"name":"since","in":"query","required":false,"description":"publication_date lower bound (YYYY-MM-DD inclusive).","schema":{"type":"string"}},{"name":"until","in":"query","required":false,"description":"publication_date upper bound (YYYY-MM-DD inclusive).","schema":{"type":"string"}},{"name":"sort_order","in":"query","required":false,"description":"Default: desc (newest first).","schema":{"type":"string","enum":["asc","desc"]}},{"name":"limit","in":"query","required":false,"description":"Maximum documents to return. Default 50, max 500.","schema":{"type":"integer"}}],"responses":{"200":{"description":"JSON envelope: { results: [...], count, has_more }."},"400":{"description":"Invalid parameter."},"401":{"description":"Missing or invalid API key."},"402":{"description":"This tool requires a higher plan (upgrade_required). Retrying will not help."},"429":{"description":"Tier rate/quota limit reached (rate_limited). Retry-After points at the reset."}}}},"/v1/fema-disasters":{"get":{"operationId":"get_fema_disasters","summary":"Returns federal disaster declarations from OpenFEMA — every DR (major disaster), EM (emergency), and FM (fire management) declaration since 1953, one record per (declaration, designated county)","description":"Returns federal disaster declarations from OpenFEMA — every DR (major disaster), EM (emergency), and FM (fire management) declaration since 1953, one record per (declaration, designated county). ~70K records. Use this when the user asks about: hurricanes / floods / wildfires / severe storms hitting a state or county, which counties were designated for FEMA assistance, active vs closed-out disasters, or to anchor an insurance / construction / utility / muni-credit question to the official federal declaration.  Record shape: fema_declaration_string ('DR-4728-CA'), declaration type + date, incident_type ('Hurricane', 'Flood', 'Fire', 'Severe Storm'...), declaration_title ('HURRICANE IAN'), designated_area (county) + FIPS codes, and the four assistance-program flags (individual_assistance, individuals_households_program, public_assistance, hazard_mitigation) — public_assistance=true is the infrastructure-rebuild-money flag.  A single disaster spans MANY records (one per designated county): filter fema_declaration_string or disaster_number for all areas of one event; filter state + since for a state's recent disasters.  Cross-source: follow a declaration with get_federal_contracts / get_federal_grants (recipient_name or date-windowed) for the rebuild spend, and get_material_events for insurer 8-Ks after major events.  Pure-publisher posture: FEMA's declarations as published — no derived damage estimates or exposure scores.","parameters":[{"name":"id","in":"query","required":false,"description":"Direct lookup: '{declarationString}-{fips}' (e.g., 'DR-4728-CA-06037').","schema":{"type":"string"}},{"name":"fema_declaration_string","in":"query","required":false,"description":"Exact declaration (e.g., 'DR-4728-CA') — returns every designated county for that event.","schema":{"type":"string"}},{"name":"disaster_number","in":"query","required":false,"description":"Exact FEMA disaster number (e.g., 4728).","schema":{"type":"integer"}},{"name":"state","in":"query","required":false,"description":"Two-letter state / territory code (e.g., 'FL', 'PR').","schema":{"type":"string"}},{"name":"declaration_type","in":"query","required":false,"description":"DR = major disaster, EM = emergency, FM = fire management.","schema":{"type":"string","enum":["DR","EM","FM"]}},{"name":"incident_type","in":"query","required":false,"description":"Exact incident type (e.g., 'Hurricane', 'Flood', 'Fire', 'Severe Storm', 'Tornado', 'Earthquake').","schema":{"type":"string"}},{"name":"title","in":"query","required":false,"description":"Case-insensitive substring against declaration title + designated area (e.g., 'ian', 'maui').","schema":{"type":"string"}},{"name":"since","in":"query","required":false,"description":"Declaration date lower bound (YYYY-MM-DD inclusive).","schema":{"type":"string"}},{"name":"until","in":"query","required":false,"description":"Declaration date upper bound (YYYY-MM-DD inclusive).","schema":{"type":"string"}},{"name":"sort_order","in":"query","required":false,"description":"Default: desc (most recent declarations first).","schema":{"type":"string","enum":["asc","desc"]}},{"name":"limit","in":"query","required":false,"description":"Maximum records to return. Default 50, max 500.","schema":{"type":"integer"}}],"responses":{"200":{"description":"JSON envelope: { results: [...], count, has_more }."},"400":{"description":"Invalid parameter."},"401":{"description":"Missing or invalid API key."},"402":{"description":"This tool requires a higher plan (upgrade_required). Retrying will not help."},"429":{"description":"Tier rate/quota limit reached (rate_limited). Retry-After points at the reset."}}}},"/v1/proxy-filings":{"get":{"operationId":"get_proxy_filings","summary":"Returns Schedule 14A proxy filings — the document public companies send shareholders ahead of annual or special meetings","description":"Returns Schedule 14A proxy filings — the document public companies send shareholders ahead of annual or special meetings. Each record is one filing carrying executive compensation tables, board nominations, shareholder proposals, auditor info, and voting matters.  Use this when the user asks about: executive compensation, board elections, shareholder proposals, M&A votes, proxy contests, auditor changes, say-on-pay outcomes, or upcoming annual meetings.  Coverage: the full DEF 14A family back to 2016 for the US public-company universe (sourced from EDGAR's complete quarterly full-index); a daily feed keeps it current. Rows are tagged with a company's PRIMARY common ticker — for dual-class issuers (e.g. GOOGL/GOOG, BRK-A/BRK-B) query by company_cik to retrieve every share class in one shot.  Filing types (the four-form DEF 14A family):   DEF 14A   — Definitive proxy (the annual-meeting filing)   DEFA14A   — Additional materials (supplements to a prior DEF 14A)   DEFM14A   — Merger-related proxy (filed when shareholders vote on M&A)   DEFR14A   — Revised definitive proxy (amendments to a prior DEF 14A)  Convenience flags derived from filing_type:   is_merger_related   — true for DEFM14A   is_amendment        — true for DEFR14A   is_additional_materials — true for DEFA14A  period_of_report population (IMPORTANT for filtering / sorting):   - Recent-window rows (filed ~2024-onward via the daily feed /     per-ticker pull): DEF 14A primaries ~100% populated (meeting/record     date); DEFA14A/DEFM14A/DEFR14A typically EMPTY (correct-as-filed —     SEC's submissions API leaves those reportDate fields blank).   - Historical backfilled rows (the bulk of 2016-2024 depth, sourced     from EDGAR's full-index): period_of_report is EMPTY for all form     types — the index carries no report date.   - Bottom line: filter/sort by filing_date for chronological queries;     period_of_report is not reliably present across the collection.  v1A is metadata-only: ticker, company name, CIK, filing type, dates, primary document URL. The proxy body is not extracted in v1. `primary_document_url` points agents at the source HTML for direct fetch when they need exec comp tables or proposal text.","parameters":[{"name":"ticker","in":"query","required":false,"description":"Stock symbol filter, e.g. 'AAPL'. Case-insensitive.","schema":{"type":"string"}},{"name":"company_cik","in":"query","required":false,"description":"SEC CIK number (10-digit, padded). Alternative to ticker.","schema":{"type":"string"}},{"name":"filing_type","in":"query","required":false,"description":"Exact filing-type filter. Use 'DEFM14A' for M&A-vote proxies only, 'DEF 14A' for annual proxies only.","schema":{"type":"string","enum":["DEF 14A","DEFA14A","DEFM14A","DEFR14A"]}},{"name":"is_merger_related","in":"query","required":false,"description":"Convenience flag: filter to DEFM14A only.","schema":{"type":"boolean"}},{"name":"is_amendment","in":"query","required":false,"description":"Convenience flag: filter to DEFR14A (revised) only.","schema":{"type":"boolean"}},{"name":"since","in":"query","required":false,"description":"ISO date (YYYY-MM-DD). Only records on or after this date.","schema":{"type":"string"}},{"name":"until","in":"query","required":false,"description":"ISO date (YYYY-MM-DD). Only records on or before this date.","schema":{"type":"string"}},{"name":"sort_by","in":"query","required":false,"description":"Default filing_date.","schema":{"type":"string","enum":["filing_date","period_of_report"]}},{"name":"sort_order","in":"query","required":false,"description":"Default desc.","schema":{"type":"string","enum":["desc","asc"]}},{"name":"limit","in":"query","required":false,"description":"Default 50, max 500.","schema":{"type":"integer"}}],"responses":{"200":{"description":"JSON envelope: { results: [...], count, has_more }."},"400":{"description":"Invalid parameter."},"401":{"description":"Missing or invalid API key."},"402":{"description":"This tool requires a higher plan (upgrade_required). Retrying will not help."},"429":{"description":"Tier rate/quota limit reached (rate_limited). Retry-After points at the reset."}}}},"/v1/treasury-auctions":{"get":{"operationId":"get_treasury_auctions","summary":"Returns Treasury security auctions — Bills (≤1yr), Notes (2-10yr), Bonds (20-30yr), TIPS (inflation-protected), and FRNs (floating-rate)","description":"Returns Treasury security auctions — Bills (≤1yr), Notes (2-10yr), Bonds (20-30yr), TIPS (inflation-protected), and FRNs (floating-rate). Each record is one CUSIP issuance with announcement metadata + post- auction results.  Key signal fields agents care about:   - bid_to_cover_ratio: demand. >2.5 strong, <2.0 weak.   - high_yield / average_yield: market clearing rate.   - direct_bidder / indirect_bidder breakdowns: domestic vs foreign demand.   - soma_holdings + soma_included: Fed System Open Market Account     allocation. A live measure of Fed QE/QT activity on each issue.  Records have a two-stage lifecycle: announcement (results fields null) → post-auction (full results populated). Idempotent saves on cusip + auction_date overwrite cleanly when results publish.  Security types: 'Bill', 'Note', 'Bond', 'TIPS', 'FRN', 'CMB' (cash- management bill). Use security_type filter to focus on one term group. Note: Treasury reports TIPS and FRNs under security_type Note/Bond with an inflation-indexed / floating-rate flag (not as their own type); filtering security_type:'TIPS' or 'FRN' here resolves to those flags for convenience.","parameters":[{"name":"cusip","in":"query","required":false,"description":"Filter to one specific CUSIP issuance.","schema":{"type":"string"}},{"name":"security_type","in":"query","required":false,"description":"e.g. 'Bill', 'Note', 'Bond', 'TIPS', 'FRN', 'CMB'.","schema":{"type":"string"}},{"name":"reopening","in":"query","required":false,"description":"Filter to reopenings (new tranches of an existing CUSIP) only when true.","schema":{"type":"boolean"}},{"name":"min_offering_amount","in":"query","required":false,"description":"Filter to auctions with offering_amount >= this dollar amount.","schema":{"type":"number"}},{"name":"min_bid_to_cover","in":"query","required":false,"description":"Filter to auctions with bid_to_cover_ratio >= this value (e.g. 2.5 for strong-demand auctions only).","schema":{"type":"number"}},{"name":"since","in":"query","required":false,"description":"ISO date YYYY-MM-DD. Applied to sort_by field.","schema":{"type":"string"}},{"name":"until","in":"query","required":false,"description":"ISO date YYYY-MM-DD.","schema":{"type":"string"}},{"name":"sort_by","in":"query","required":false,"description":"Default auction_date.","schema":{"type":"string","enum":["auction_date","issue_date","maturity_date","offering_amount","bid_to_cover_ratio"]}},{"name":"sort_order","in":"query","required":false,"description":"Default desc.","schema":{"type":"string","enum":["desc","asc"]}},{"name":"limit","in":"query","required":false,"description":"Default 50, max 500.","schema":{"type":"integer"}}],"responses":{"200":{"description":"JSON envelope: { results: [...], count, has_more }."},"400":{"description":"Invalid parameter."},"401":{"description":"Missing or invalid API key."},"402":{"description":"This tool requires a higher plan (upgrade_required). Retrying will not help."},"429":{"description":"Tier rate/quota limit reached (rate_limited). Retry-After points at the reset."}}}},"/v1/economic-indicators":{"get":{"operationId":"get_economic_indicators","summary":"Returns observations of key US macro, energy, and fiscal indicators from four sources:   - BLS (Bureau of Labor Statistics): the canonical labor + price     statistics","description":"Returns observations of key US macro, energy, and fiscal indicators from four sources:   - BLS (Bureau of Labor Statistics): the canonical labor + price     statistics. ~20-series watchlist covering unemployment, payrolls,     wages, CPI, PPI, productivity. Most monthly, ECI/productivity     quarterly.   - FRED (Federal Reserve Economic Data, St Louis Fed): rates, money     supply, GDP, PCE inflation, mortgage rates, jobless claims, Fed     balance sheet, breakeven inflation, dollar index, consumer     sentiment. ~30-series watchlist. Some daily (rates, dollar),     weekly (mortgage, Fed assets, jobless claims), monthly, quarterly.   - EIA (Energy Information Administration): WTI + Brent crude oil     spot prices, Henry Hub natural gas, US gasoline retail price, US     crude oil production. Unique energy data not in BLS or FRED.     Mostly weekly cadence.   - FiscalData (Treasury Bureau of the Fiscal Service): total public     debt outstanding TO THE PENNY, daily, 1993→present (split into     debt held by the public vs intragovernmental); Monthly Treasury     Statement gross receipts / outlays / deficit-or-surplus; average     interest rate actually paid on each Treasury security class     (Bills/Notes/Bonds/TIPS/FRN + nonmarketable, 2001→present).  Filter to one source via `source: 'bls' | 'fred' | 'eia' | 'fiscaldata'`. Default returns all four unified — `series_id` disambiguates across catalogs.  Use this when the user asks about: unemployment rate, jobs report, nonfarm payrolls, CPI / PCE / inflation, Fed Funds rate, Treasury yields, mortgage rates, yield-curve inversion, money supply / M2, Fed balance sheet / QE / QT activity, GDP, housing starts, retail sales, consumer sentiment, jobless claims, trade balance, dollar strength, national debt / debt ceiling levels, monthly federal deficit, interest cost on the debt, or general macro context for cross-source analysis.  Categories (for filtering):   - rates          — Fed Funds, Treasury yields, mortgage, corporate bonds   - gdp            — Real + nominal GDP, GDP growth rate   - activity       — Industrial production, housing starts, retail sales   - inflation      — CPI/PPI (BLS) + PCE/Core PCE/breakevens (FRED)   - employment     — Unemployment rates (U-3, U-6), payrolls, jobless claims   - labor-force    — Labor force participation rate   - wages          — Average hourly earnings, employment cost index   - hours          — Average weekly hours   - productivity   — Nonfarm productivity, unit labor costs   - money          — M2, Fed total assets, overnight reverse repo   - debt           — Federal debt (FRED quarterly + FiscalData daily to-the-penny),                     Treasury general account   - fiscal         — MTS monthly receipts, outlays, deficit/surplus (positive =                     deficit, negative = surplus, per Treasury's sign convention)   - trade          — Trade balance, trade-weighted dollar index   - sentiment      — U Michigan Consumer Sentiment   - energy         — WTI/Brent crude, Henry Hub natural gas, retail gasoline,                     US crude production (EIA)  Period format is fixed-width per cadence so lexicographic sort = chronological:   - 2026M04 (April 2026), 2026Q01 (Q1 2026), 2026A01 (annual 2026),     2026W18 (week 18 of 2026), 2026D258 (day-of-year 258).  Set `latest_only=true` to get one record per series (the most-recent observation) — useful for 'where are things now' snapshot questions. Daily series under latest_only return only the latest day per series (deduped client-side); without it you can pull arbitrary history.  Pure-publisher posture: the unit on each series is documented in the `unit` field; we do not compute year-over-year deltas, seasonally adjust differently, or derive 'real' vs 'nominal' versions — agents do those calculations on top.","parameters":[{"name":"source","in":"query","required":false,"description":"Filter to one source. Omit to query all four. BLS = canonical labor + price stats. FRED = rates, money, GDP, PCE inflation, sentiment. EIA = energy prices + production. FiscalData = Treasury debt to the penny, MTS budget totals, avg interest rates on the debt.","schema":{"type":"string","enum":["bls","fred","eia","fiscaldata"]}},{"name":"series_id","in":"query","required":false,"description":"Exact series ID. BLS examples: 'LNS14000000' (U-3), 'CES0000000001' (payrolls), 'CUUR0000SA0' (CPI). FRED examples: 'DFF' (Fed Funds), 'DGS10' (10Y Treasury), 'PCEPILFE' (Core PCE), 'M2SL' (M2), 'WALCL' (Fed assets), 'UMCSENT' (sentiment). FiscalData examples: 'FISCAL-DEBT-TOTAL-DAILY' (daily national debt), 'FISCAL-MTS-DEFICIT-MONTHLY' (monthly deficit/surplus).","schema":{"type":"string"}},{"name":"category","in":"query","required":false,"description":"Bucket filter.","schema":{"type":"string","enum":["employment","labor-force","wages","hours","inflation","productivity","rates","gdp","activity","money","debt","fiscal","trade","sentiment","energy"]}},{"name":"period_type","in":"query","required":false,"description":"Cadence filter.","schema":{"type":"string","enum":["monthly","quarterly","semiannual","annual","weekly","daily"]}},{"name":"since_year","in":"query","required":false,"description":"Calendar-year lower bound (inclusive).","schema":{"type":"integer"}},{"name":"until_year","in":"query","required":false,"description":"Calendar-year upper bound (inclusive).","schema":{"type":"integer"}},{"name":"latest_only","in":"query","required":false,"description":"When true, return only the most-recent observation per series. Useful for 'current state' snapshots.","schema":{"type":"boolean"}},{"name":"sort_by","in":"query","required":false,"description":"Default period (chronological).","schema":{"type":"string","enum":["period","value","year"]}},{"name":"sort_order","in":"query","required":false,"description":"Default desc.","schema":{"type":"string","enum":["desc","asc"]}},{"name":"limit","in":"query","required":false,"description":"Default 50, max 500.","schema":{"type":"integer"}}],"responses":{"200":{"description":"JSON envelope: { results: [...], count, has_more }."},"400":{"description":"Invalid parameter."},"401":{"description":"Missing or invalid API key."},"402":{"description":"This tool requires a higher plan (upgrade_required). Retrying will not help."},"429":{"description":"Tier rate/quota limit reached (rate_limited). Retry-After points at the reset."}}}},"/v1/cftc-cot-reports":{"get":{"operationId":"get_cftc_cot_reports","summary":"Returns CFTC Commitments of Traders (COT) report rows — weekly aggregated futures + options-on-futures positioning by trader class","description":"Returns CFTC Commitments of Traders (COT) report rows — weekly aggregated futures + options-on-futures positioning by trader class. The COT report is the macro positioning dataset for U.S. futures markets. Released every Friday 3:30 PM ET for the prior Tuesday close.  Trader classes (legacy futures-only report):   - Non-commercial (large speculators — hedge funds, CTAs)   - Commercial (hedgers — producers, swap dealers)   - Non-reportable (small speculators)  Killer query patterns:   - Macro positioning snapshot this week: latest_only=true (gives the     latest report row for every contract in one query)   - Large-spec extremes in S&P: commodity_name='S&P 500 STOCK INDEX'     + sort_by='noncomm_net' + sort_order='desc'   - Gold positioning history: commodity_name='GOLD' + since='2026-01-01'   - Currency COT: contract_market_name substring 'YEN' / 'EURO'  Source: publicreporting.cftc.gov/resource/jun7-fc8e.json (Socrata API, free, unauthenticated). Covers EVERY regulated U.S. futures + options- on-futures contract — agricultural commodities, metals, energy, financials, FX, crypto. Pure-publisher posture: raw positioning numbers, no derived sentiment scores.  Key derived fields (computed from raw): noncomm_net (large-spec net), comm_net (hedger net), nonrept_net (small-spec net). Concentration fields show top-4 / top-8 trader net long/short concentration.","parameters":[{"name":"id","in":"query","required":false,"description":"Direct doc lookup ({contract_code}-{YYYY-MM-DD}). Fastest path.","schema":{"type":"string"}},{"name":"cftc_contract_market_code","in":"query","required":false,"description":"Exact CFTC contract code (e.g., '13874A' = E-mini S&P 500, '088691' = Gold, '067651' = Crude Oil WTI).","schema":{"type":"string"}},{"name":"contract_market_name","in":"query","required":false,"description":"Case-insensitive substring on contract_market_name (e.g., 'S&P 500', 'GOLD', 'CRUDE OIL', 'JAPANESE YEN'). Client-side filter.","schema":{"type":"string"}},{"name":"commodity_name","in":"query","required":false,"description":"Exact commodity name from CFTC's catalog (e.g., 'S&P 500 STOCK INDEX', 'GOLD', 'CRUDE OIL', 'EURO FX').","schema":{"type":"string"}},{"name":"since","in":"query","required":false,"description":"Inclusive lower bound on report_date (YYYY-MM-DD).","schema":{"type":"string"}},{"name":"until","in":"query","required":false,"description":"Inclusive upper bound on report_date (YYYY-MM-DD).","schema":{"type":"string"}},{"name":"latest_only","in":"query","required":false,"description":"When true, returns only the most recent report row per contract (one row per contract instead of weekly history).","schema":{"type":"boolean"}},{"name":"sort_by","in":"query","required":false,"description":"Sort key. Default: report_date.","schema":{"type":"string","enum":["report_date","open_interest","noncomm_net","comm_net"]}},{"name":"sort_order","in":"query","required":false,"description":"Default: desc.","schema":{"type":"string","enum":["asc","desc"]}},{"name":"limit","in":"query","required":false,"description":"Max records. Default 50, max 500.","schema":{"type":"integer"}}],"responses":{"200":{"description":"JSON envelope: { results: [...], count, has_more }."},"400":{"description":"Invalid parameter."},"401":{"description":"Missing or invalid API key."},"402":{"description":"This tool requires a higher plan (upgrade_required). Retrying will not help."},"429":{"description":"Tier rate/quota limit reached (rate_limited). Retry-After points at the reset."}}}},"/v1/oig-exclusions":{"get":{"operationId":"get_oig_exclusions","summary":"Returns entries on the HHS Office of Inspector General 'List of Excluded Individuals/Entities' (LEIE)","description":"Returns entries on the HHS Office of Inspector General 'List of Excluded Individuals/Entities' (LEIE). Anyone on this list is barred from billing Medicare, Medicaid, or any federal healthcare program. Updated monthly by OIG; KeyVex re-scrapes monthly and overwrites.  Use this when the user asks about: healthcare-fraud exclusions, Medicare/Medicaid program integrity, due-diligence on a healthcare contractor or provider, geographic concentration of exclusions, or a specific person/business listed on LEIE.  Cross-source tip: pair with get_federal_contracts to flag contractors who appear on the exclusion list. A government contractor with an OIG exclusion is a real compliance red flag.  Statutory exclusion types (the most common):   - 1128a1  Conviction of program-related crimes   - 1128a2  Conviction relating to patient abuse   - 1128a3  Felony conviction relating to healthcare fraud   - 1128a4  Felony conviction relating to controlled substances   - 1128b4  License revocation, suspension, surrender   - 1128b5  Exclusion or suspension under federal/state healthcare   - 1128b7  Fraud, kickbacks, and other prohibited activities   - 1128b8  Entities controlled by a sanctioned individual  Scope: the LEIE lists only CURRENTLY-ACTIVE exclusions — OIG removes a party once reinstated (reinstatements are a separate OIG publication not ingested here). So every record is, by definition, an active exclusion, and reinstatement_date is effectively always empty.  Pure-publisher posture: we surface the listing as-published. Some names match common-name individuals who aren't the excluded party — the agent / user is responsible for context disambiguation (DOB, address, NPI).","parameters":[{"name":"name","in":"query","required":false,"description":"Case-insensitive substring against full_name (covers both individuals and businesses).","schema":{"type":"string"}},{"name":"business_name","in":"query","required":false,"description":"Case-insensitive substring against business_name only.","schema":{"type":"string"}},{"name":"state","in":"query","required":false,"description":"Two-letter state code (e.g. 'NY', 'CA'). Case-insensitive.","schema":{"type":"string"}},{"name":"city","in":"query","required":false,"description":"Case-insensitive substring against city.","schema":{"type":"string"}},{"name":"general_category","in":"query","required":false,"description":"Exact match (case-sensitive): 'PHARMACY', 'PHYSICIAN', 'OTHER BUSINESS', 'DME COMPANY', 'CLINIC', etc.","schema":{"type":"string"}},{"name":"specialty","in":"query","required":false,"description":"Case-insensitive substring against specialty.","schema":{"type":"string"}},{"name":"exclusion_type","in":"query","required":false,"description":"Statutory code (e.g. '1128a1', '1128b5').","schema":{"type":"string"}},{"name":"npi","in":"query","required":false,"description":"Exact 10-digit National Provider Identifier.","schema":{"type":"string"}},{"name":"is_business","in":"query","required":false,"description":"Filter to businesses only (true) or individuals only (false).","schema":{"type":"boolean"}},{"name":"since","in":"query","required":false,"description":"ISO date (YYYY-MM-DD). Applied to sort_by field.","schema":{"type":"string"}},{"name":"until","in":"query","required":false,"description":"ISO date (YYYY-MM-DD).","schema":{"type":"string"}},{"name":"sort_by","in":"query","required":false,"description":"Default exclusion_date.","schema":{"type":"string","enum":["exclusion_date"]}},{"name":"sort_order","in":"query","required":false,"description":"Default desc.","schema":{"type":"string","enum":["desc","asc"]}},{"name":"limit","in":"query","required":false,"description":"Default 50, max 500.","schema":{"type":"integer"}}],"responses":{"200":{"description":"JSON envelope: { results: [...], count, has_more }."},"400":{"description":"Invalid parameter."},"401":{"description":"Missing or invalid API key."},"402":{"description":"This tool requires a higher plan (upgrade_required). Retrying will not help."},"429":{"description":"Tier rate/quota limit reached (rate_limited). Retry-After points at the reset."}}}},"/v1/open-payments":{"get":{"operationId":"get_open_payments","summary":"Returns CMS Open Payments records — the Sunshine Act database of every payment / transfer of value from drug + device manufacturers and GPOs to US physicians, non-physician practitioners, and teaching hospitals (~15M records per program year, 2019→present)","description":"Returns CMS Open Payments records — the Sunshine Act database of every payment / transfer of value from drug + device manufacturers and GPOs to US physicians, non-physician practitioners, and teaching hospitals (~15M records per program year, 2019→present). LIVE passthrough to CMS's own API: results reflect CMS's current data and `total_count` is CMS's authoritative count for the filtered query (the results array is just the requested page). Use this when the user asks about: pharma/device money to doctors, a company's physician-payment footprint, speaker-fee / consulting / royalty programs, industry funding of research (with ClinicalTrials.gov IDs), or physician ownership stakes in manufacturers.  payment_type selects the dataset (schemas differ; rows are CMS's fields verbatim):   general (default) — meals, travel, consulting, speaker fees,     royalties, honoraria. Fields incl. nature_of_payment_or_transfer     _of_value, name_of_drug_or_biological_or_device_or_medical     _supply_1, covered_recipient_specialty_1.   research — research payments incl. name_of_study,     clinicaltrials_gov_identifier, preclinical_research_indicator.   ownership — physician ownership/investment interests     (total_amount_invested_usdollars, value_of_interest,     terms_of_interest); recipient fields are physician_*.  summarize=true returns CMS's own pre-aggregated per-(company, nature) totals for the year — transaction counts + dollar totals per payment nature. The nature codes in that dataset ship without a public CMS legend; KeyVex labels the seven codes it has VERIFIED by exact count+total reconciliation against detail data (1=Consulting Fee, 2=Speaker/faculty compensation, 6=Food and Beverage, 7=Travel and Lodging, 9=Charitable Contribution, 10=Royalty or License, 14=Grant); unverified codes pass through with an empty label rather than a guess.  Matching: company is a substring (matches subsidiaries: 'pfizer' catches PFIZER INC.); recipient names are EXACT (CMS stores uppercase; we uppercase for you); npi is the exact National Provider Identifier — the precise join key to get_oig_exclusions. Payments are attributed to the manufacturer AS FILED — no ticker/CIK; try the operating-company name.  Program years: 2019 through the latest published year (CMS refreshes semiannually; year defaults to the latest). Pagination: limit ≤ 500 per page (CMS cap), use offset for more.  Pure-publisher posture: CMS's records verbatim — no derived influence scores. Disclosure ≠ wrongdoing; these are lawful, statutorily-disclosed payments.","parameters":[{"name":"year","in":"query","required":false,"description":"Program year (e.g., 2023). Default: latest published year.","schema":{"type":"integer"}},{"name":"payment_type","in":"query","required":false,"description":"Dataset: general (default — meals/consulting/speaker fees), research, or ownership (physician stakes).","schema":{"type":"string","enum":["general","research","ownership"]}},{"name":"company","in":"query","required":false,"description":"Substring against the paying manufacturer / GPO name (e.g., 'pfizer', 'medtronic').","schema":{"type":"string"}},{"name":"recipient_last_name","in":"query","required":false,"description":"Recipient physician / practitioner last name (exact, case-insensitive).","schema":{"type":"string"}},{"name":"recipient_first_name","in":"query","required":false,"description":"Recipient first name (exact, case-insensitive).","schema":{"type":"string"}},{"name":"npi","in":"query","required":false,"description":"Recipient National Provider Identifier (exact, 10 digits). Precise join key to get_oig_exclusions.","schema":{"type":"string"}},{"name":"state","in":"query","required":false,"description":"Two-letter recipient state code (e.g., 'TX').","schema":{"type":"string"}},{"name":"nature","in":"query","required":false,"description":"Substring against nature of payment (general only; e.g., 'consulting', 'speaker', 'royalty', 'food').","schema":{"type":"string"}},{"name":"product","in":"query","required":false,"description":"Substring against the associated drug / device name (general only; e.g., 'eliquis', 'ozempic').","schema":{"type":"string"}},{"name":"summarize","in":"query","required":false,"description":"true = CMS's pre-aggregated per-(company, nature) yearly totals instead of individual payments.","schema":{"type":"boolean"}},{"name":"limit","in":"query","required":false,"description":"Records per page. Default 25, max 500 (CMS page cap).","schema":{"type":"integer"}},{"name":"offset","in":"query","required":false,"description":"Pagination offset into the filtered result set.","schema":{"type":"integer"}}],"responses":{"200":{"description":"JSON envelope: { results: [...], count, has_more }."},"400":{"description":"Invalid parameter."},"401":{"description":"Missing or invalid API key."},"402":{"description":"This tool requires a higher plan (upgrade_required). Retrying will not help."},"429":{"description":"Tier rate/quota limit reached (rate_limited). Retry-After points at the reset."}}}},"/v1/consumer-complaints":{"get":{"operationId":"get_consumer_complaints","summary":"Returns consumer complaints filed with the Consumer Financial Protection Bureau (CFPB)","description":"Returns consumer complaints filed with the Consumer Financial Protection Bureau (CFPB). Each record is one filing against a bank, credit reporting agency, mortgage servicer, debt collector, fintech, or crypto firm — with company response status, timeliness flag, and (when consented) consumer narrative.  Use this when the user asks about: complaint volume against a specific company, top issues at a credit reporting agency, regional complaint patterns, untimely responses by a financial institution, or as a leading indicator of upcoming CFPB/OCC/FDIC enforcement action.  COVERAGE — live passthrough (source:'live'): each call queries CFPB's own search API over the FULL 15.7M+ complaint database, full history, current as of CFPB's publication. The response's `total_count` is CFPB's authoritative count for your filtered query — USE IT for volume answers (the `results` array is just the requested page). `total_count` is omitted when an `issue` or `sub_product` filter is active (those apply after the upstream query, so the upstream total wouldn't match). If CFPB is unreachable the tool falls back to a small cached sample (source:'cache' + coverage_warning) — do NOT infer volume in that mode. Note: `company` matching is word-based against the company name ('experian', 'wells fargo'), not arbitrary-substring.  Product taxonomy (the top categories):   - 'Credit reporting or other personal consumer reports' — Equifax,     Experian, TransUnion. ~80% of recent complaint volume.   - 'Debt collection'   - 'Mortgage'   - 'Credit card or prepaid card'   - 'Checking or savings account'   - 'Payday loan, title loan, or personal loan'   - 'Money transfer, virtual currency, or money service'   - 'Vehicle loan or lease'   - 'Student loan'  Company-response values: 'Closed with explanation', 'Closed with non-monetary relief', 'Closed with monetary relief', 'In progress', 'Untimely response', 'Closed without relief'.  Cross-source tip: pair with get_enforcement_actions(source:'cftc'|'occ'| 'fdic'|'sec'|'doj', text:'<company>') to see if complaint volume preceded a formal enforcement action.","parameters":[{"name":"id","in":"query","required":false,"description":"Direct lookup by CFPB complaint_id.","schema":{"type":"string"}},{"name":"company","in":"query","required":false,"description":"Case-insensitive substring against company name (e.g., 'experian', 'jpmorgan', 'capital one').","schema":{"type":"string"}},{"name":"product","in":"query","required":false,"description":"Exact product match (e.g., 'Mortgage', 'Debt collection', 'Credit reporting or other personal consumer reports').","schema":{"type":"string"}},{"name":"sub_product","in":"query","required":false,"description":"Exact sub-product match.","schema":{"type":"string"}},{"name":"issue","in":"query","required":false,"description":"Case-insensitive substring against the issue field (e.g., 'incorrect information', 'fraud', 'debt is not yours').","schema":{"type":"string"}},{"name":"state","in":"query","required":false,"description":"Two-letter state code (e.g., 'CA', 'NY'). Case-insensitive.","schema":{"type":"string"}},{"name":"submitted_via","in":"query","required":false,"description":"Channel filter.","schema":{"type":"string","enum":["Web","Phone","Postal mail","Fax","Referral","Email"]}},{"name":"timely_response","in":"query","required":false,"description":"Filter to complaints with timely company response (within CFPB's 15-day window) or not.","schema":{"type":"boolean"}},{"name":"since","in":"query","required":false,"description":"ISO date (YYYY-MM-DD). Applied to sort_by field.","schema":{"type":"string"}},{"name":"until","in":"query","required":false,"description":"ISO date (YYYY-MM-DD).","schema":{"type":"string"}},{"name":"sort_by","in":"query","required":false,"description":"Default date_received.","schema":{"type":"string","enum":["date_received","date_sent_to_company"]}},{"name":"sort_order","in":"query","required":false,"description":"Default desc.","schema":{"type":"string","enum":["desc","asc"]}},{"name":"limit","in":"query","required":false,"description":"Default 50, max 500.","schema":{"type":"integer"}}],"responses":{"200":{"description":"JSON envelope: { results: [...], count, has_more }."},"400":{"description":"Invalid parameter."},"401":{"description":"Missing or invalid API key."},"402":{"description":"This tool requires a higher plan (upgrade_required). Retrying will not help."},"429":{"description":"Tier rate/quota limit reached (rate_limited). Retry-After points at the reset."}}}},"/v1/fundamentals":{"get":{"operationId":"get_fundamentals","summary":"Returns XBRL-tagged financial fundamentals from public-company 10-K and 10-Q filings, sourced from SEC EDGAR's company-facts API","description":"Returns XBRL-tagged financial fundamentals from public-company 10-K and 10-Q filings, sourced from SEC EDGAR's company-facts API. Each record is one observation of one concept at one period end.  Use this when the user asks about: revenue, profit, margins, cash position, debt, shareholder equity, EPS, share count, operating vs. financing cash flow, or any line-item-level financial state of a public company.  v1A scope: a curated 40-concept watchlist covering:   - income_statement: Revenues / RevenueFromContractWithCustomer /     CostOfRevenue / GrossProfit / OperatingExpenses / R&D / SG&A /     OperatingIncomeLoss / InterestExpense / IncomeTaxExpenseBenefit /     NetIncomeLoss   - balance_sheet: Assets / AssetsCurrent / Cash / AccountsReceivable     / Inventory / PP&E / Goodwill / Liabilities / LongTermDebt /     StockholdersEquity / CommonStockSharesOutstanding   - cash_flow: NetCash{Operating/Investing/Financing}Activities /     PaymentsToAcquirePPE (capex) / PaymentsForRepurchaseOfCommonStock     / PaymentsOfDividends / DepreciationDepletionAndAmortization   - metrics: EarningsPerShareBasic/Diluted, weighted-avg share counts   - entity: EntityCommonStockSharesOutstanding (dei taxonomy)  Key cautions on the data:   - The same concept can appear in multiple units (e.g., 'USD' and     'USD/shares' for EPS). Filter by unit if you need a specific shape.   - Many concepts have BOTH year-to-date cumulative observations AND     quarterly-period observations on 10-Q filings. The `frame` field     (e.g., 'CY2025Q3') marks the per-quarter point-period observation;     rows with empty `frame` are typically cumulative YTD.   - Older filings may use deprecated concept names; KeyVex catalog     includes both modern and legacy names where companies migrated     (e.g., Revenues AND RevenueFromContractWithCustomerExcludingAssessedTax).  Set `latest_only=true` to get one record per (ticker × concept) — the most-recent observation. Useful for 'current state' snapshots.  Pure-publisher posture: values are AS FILED. We do NOT compute derived ratios (P/E, ROE, ROIC), YoY/QoQ deltas, or 'real' vs nominal versions. Agents calculate those on top.","parameters":[{"name":"ticker","in":"query","required":false,"description":"Stock symbol filter, e.g. 'AAPL'. Case-insensitive.","schema":{"type":"string"}},{"name":"company_cik","in":"query","required":false,"description":"SEC CIK number. Alternative to ticker.","schema":{"type":"string"}},{"name":"concept","in":"query","required":false,"description":"Exact XBRL tag name (e.g., 'NetIncomeLoss', 'Revenues', 'Assets', 'CashAndCashEquivalentsAtCarryingValue'). Case-sensitive.","schema":{"type":"string"}},{"name":"category","in":"query","required":false,"description":"Bucket filter when you don't know the exact concept name.","schema":{"type":"string","enum":["income_statement","balance_sheet","cash_flow","metrics","entity"]}},{"name":"fiscal_year","in":"query","required":false,"description":"Filter to one fiscal year — the year the financials DESCRIBE (the company's own fiscal-year label, derived from the original filing), NOT the filing year. Handles non-December fiscal years: e.g. NVDA's year ending 2024-01-28 is fiscal_year 2024, Apple's ending 2024-09-28 is 2024. For point-in-time period filtering, period_end / since / until and frame are also available.","schema":{"type":"integer"}},{"name":"fiscal_period","in":"query","required":false,"description":"Filter to one fiscal period.","schema":{"type":"string","enum":["Q1","Q2","Q3","Q4","FY"]}},{"name":"form","in":"query","required":false,"description":"Filter to one filing form.","schema":{"type":"string","enum":["10-K","10-Q","10-K/A","10-Q/A"]}},{"name":"since","in":"query","required":false,"description":"ISO date YYYY-MM-DD. Applied to sort_by field.","schema":{"type":"string"}},{"name":"until","in":"query","required":false,"description":"ISO date YYYY-MM-DD.","schema":{"type":"string"}},{"name":"latest_only","in":"query","required":false,"description":"When true, return only the most-recent observation per (ticker × concept). Default false.","schema":{"type":"boolean"}},{"name":"sort_by","in":"query","required":false,"description":"Default period_end.","schema":{"type":"string","enum":["period_end","filed_date","value"]}},{"name":"sort_order","in":"query","required":false,"description":"Default desc.","schema":{"type":"string","enum":["desc","asc"]}},{"name":"limit","in":"query","required":false,"description":"Default 50, max 500.","schema":{"type":"integer"}}],"responses":{"200":{"description":"JSON envelope: { results: [...], count, has_more }."},"400":{"description":"Invalid parameter."},"401":{"description":"Missing or invalid API key."},"402":{"description":"This tool requires a higher plan (upgrade_required). Retrying will not help."},"429":{"description":"Tier rate/quota limit reached (rate_limited). Retry-After points at the reset."}}}},"/v1/government-publications":{"get":{"operationId":"get_government_publications","summary":"Returns recent congressional + oversight publications from GovInfo across four collections","description":"Returns recent congressional + oversight publications from GovInfo across four collections. Use this when the user asks about:   - Committee reports on a specific bill or topic   - Recently signed public laws (the 'did it become law' signal)   - Congressional hearing transcripts (testimony from regulators,     CEOs, expert witnesses)   - GAO oversight reports (independent reviews of federal agencies     + programs, often precede SEC/DOJ enforcement on the same target)  Collections (filter via the `collection` enum):   CRPT       — Congressional Reports. Includes committee reports                accompanying bills (House hrpt / Senate srpt). Real-                time signal on what's about to move on the floor.   PLAW       — Public + Private Laws. Bills that were signed into                law. The 'what actually got done' record.   CHRG       — Congressional Hearings. Transcripts of House +                Senate committee hearings — testimony from agency                heads, executives, expert witnesses. Hearings often                PRECEDE enforcement actions (the public 'why did                this happen' conversation).   GAOREPORTS — GAO oversight reports. Independent congressional                oversight. NOTE: GovInfo's GAO collection is a                historical archive (~16.5K reports) that is not                receiving recent updates — GAO now publishes current                reports on gao.gov directly. Use this for historical                GAO research; recent reports won't appear here.  Identifier format: each `package_id` is GovInfo's globally-unique ID (e.g., 'CRPT-119hrpt27' for House Report 27 of the 119th Congress, 'PLAW-119publ12' for Public Law 12, 'CHRG-119hhrg54321' for House hearing 54321). Direct doc lookup by package_id is fastest.  Cross-source pairing pattern:   Hearing → trade by attending member: get_congressional_trades(       bioguide_id:'...', since:'<hearing date>')   GAO report on agency → SEC follow-on: get_enforcement_actions(       text:'<agency name>', since:'<GAO report date>')   Committee report → bill passage: get_bills + get_roll_call_votes  Full document body (PDF / HTML / XML) lives at `package_link`; v1A returns only metadata — agents follow the link for content.","parameters":[{"name":"package_id","in":"query","required":false,"description":"GovInfo packageId. Direct doc lookup, fastest. Example: 'CRPT-119hrpt27'.","schema":{"type":"string"}},{"name":"collection","in":"query","required":false,"description":"Filter to one collection: CRPT (committee reports), PLAW (public laws), CHRG (hearings), GAOREPORTS (GAO).","schema":{"type":"string","enum":["CRPT","PLAW","CHRG","GAOREPORTS"]}},{"name":"doc_class","in":"query","required":false,"description":"Sub-class within the collection. Examples: 'hrpt' (House report), 'srpt' (Senate report), 'pub' (public law), 'pvt' (private law), 'hr' (House hearing), 's' (Senate hearing).","schema":{"type":"string"}},{"name":"congress","in":"query","required":false,"description":"Congress number as string (e.g., '119').","schema":{"type":"string"}},{"name":"title","in":"query","required":false,"description":"Case-insensitive substring against the package title.","schema":{"type":"string"}},{"name":"since","in":"query","required":false,"description":"ISO date (YYYY-MM-DD). Only documents whose date_issued is on or after this date.","schema":{"type":"string"}},{"name":"until","in":"query","required":false,"description":"ISO date (YYYY-MM-DD). Only documents whose date_issued is on or before this date.","schema":{"type":"string"}},{"name":"sort_by","in":"query","required":false,"description":"Default: date_issued.","schema":{"type":"string","enum":["date_issued","last_modified"]}},{"name":"sort_order","in":"query","required":false,"description":"Default: desc (most recent first).","schema":{"type":"string","enum":["desc","asc"]}},{"name":"limit","in":"query","required":false,"description":"Maximum records to return. Default 50, max 500.","schema":{"type":"integer"}}],"responses":{"200":{"description":"JSON envelope: { results: [...], count, has_more }."},"400":{"description":"Invalid parameter."},"401":{"description":"Missing or invalid API key."},"402":{"description":"This tool requires a higher plan (upgrade_required). Retrying will not help."},"429":{"description":"Tier rate/quota limit reached (rate_limited). Retry-After points at the reset."}}}},"/v1/h1b-filings":{"get":{"operationId":"get_h1b_filings","summary":"Returns H-1B Labor Condition Applications from the Department of Labor's quarterly disclosure files — one record per LCA with employer, job title, O*NET-SOC occupation code, offered wage vs DOL prevailing wage, worksite location, and employer risk flags (h1b_dependent, willful_violator)","description":"Returns H-1B Labor Condition Applications from the Department of Labor's quarterly disclosure files — one record per LCA with employer, job title, O*NET-SOC occupation code, offered wage vs DOL prevailing wage, worksite location, and employer risk flags (h1b_dependent, willful_violator). Covers H-1B, H-1B1 (Chile / Singapore), and E-3 (Australia) visa classes. Use this when the user asks about: a company's hiring activity or wage levels for specific roles, tech-hiring trends by state or occupation, offered vs prevailing wage gaps, or outsourcing-firm staffing patterns.  IMPORTANT interpretation notes (stated so agents don't over-read): an LCA is filed BEFORE the H-1B petition and can cover multiple positions (total_worker_positions) — it signals hiring INTENT, not an approved visa or a hire. Certified ≫ actual visas issued. Wage fields are as filed; wage_unit varies (Year / Hour / Month / Week / Bi-Weekly) — normalize before comparing.  Matching: employer_name is a substring over legal name + DBA (e.g., 'infosys', 'amazon'). soc_code is the precise occupation filter (e.g., '15-1252.00' Software Developers). case_status values: 'Certified', 'Certified - Withdrawn', 'Denied', 'Withdrawn'.  Coverage: FY2024→present from DOL's quarterly files (fiscal_year / fiscal_quarter on each record; ~400-550K filings per quarter).  Pure-publisher posture: DOL's disclosure rows as filed — no derived 'real wage' normalization or employer scoring.","parameters":[{"name":"case_number","in":"query","required":false,"description":"Direct lookup by DOL case number (e.g., 'I-200-26083-726723').","schema":{"type":"string"}},{"name":"employer_name","in":"query","required":false,"description":"Case-insensitive substring against employer legal name + DBA (e.g., 'google', 'tata').","schema":{"type":"string"}},{"name":"job_title","in":"query","required":false,"description":"Case-insensitive substring against the job title (e.g., 'machine learning').","schema":{"type":"string"}},{"name":"soc_code","in":"query","required":false,"description":"Exact O*NET-SOC occupation code (e.g., '15-1252.00' = Software Developers).","schema":{"type":"string"}},{"name":"visa_class","in":"query","required":false,"description":"Exact: 'H-1B', 'H-1B1 Chile', 'H-1B1 Singapore', 'E-3 Australian'.","schema":{"type":"string"}},{"name":"case_status","in":"query","required":false,"description":"Exact: 'Certified', 'Certified - Withdrawn', 'Denied', 'Withdrawn'.","schema":{"type":"string"}},{"name":"worksite_state","in":"query","required":false,"description":"Two-letter worksite state (e.g., 'CA', 'TX').","schema":{"type":"string"}},{"name":"since","in":"query","required":false,"description":"Decision date lower bound (YYYY-MM-DD inclusive).","schema":{"type":"string"}},{"name":"until","in":"query","required":false,"description":"Decision date upper bound (YYYY-MM-DD inclusive).","schema":{"type":"string"}},{"name":"sort_order","in":"query","required":false,"description":"Default: desc (most recent decisions first).","schema":{"type":"string","enum":["asc","desc"]}},{"name":"limit","in":"query","required":false,"description":"Maximum filings to return. Default 50, max 500.","schema":{"type":"integer"}}],"responses":{"200":{"description":"JSON envelope: { results: [...], count, has_more }."},"400":{"description":"Invalid parameter."},"401":{"description":"Missing or invalid API key."},"402":{"description":"This tool requires a higher plan (upgrade_required). Retrying will not help."},"429":{"description":"Tier rate/quota limit reached (rate_limited). Retry-After points at the reset."}}}},"/v1/osha-enforcement":{"get":{"operationId":"get_osha_enforcement","summary":"Returns OSHA workplace-safety enforcement records from the Department of Labor's enforcement data: inspection cases (who was inspected, where, why, when) with optional violation citations attached (standard cited, violation type, penalties, abatement dates)","description":"Returns OSHA workplace-safety enforcement records from the Department of Labor's enforcement data: inspection cases (who was inspected, where, why, when) with optional violation citations attached (standard cited, violation type, penalties, abatement dates). Use this when the user asks about: a company's workplace-safety record, OSHA penalties or citations, fatality/catastrophe investigations, inspection activity by state or industry (NAICS), or contractor safety screening.  Result rows are INSPECTIONS. Pass include_violations=true to attach each inspection's citations under a `violations` array (or pass activity_nr for a direct lookup, which always includes them). min_penalty keeps only inspections with at least one violation whose initial or current penalty meets the threshold (implies include_violations).  insp_type codes (DOL's own legend): A=Accident, B=Complaint, C=Referral, D=Monitoring, E=Variance, F=FollowUp, G=Unprog Rel, H=Planned, I=Prog Related, J=Unprog Other, K=Prog Other, L=Other-L, M=Fat/Cat (fatality/catastrophe), N=Unprog Emph. Each record carries insp_type_label with the decoded value. Violation viol_type codes: S=Serious, W=Willful, R=Repeat, O=Other, U=Unclassified. Violations carry delete_flag='X' when the source later deleted the citation — rows are kept with the flag, never dropped.  Filter combinations note: server-side indexes support ONE of state / naics_code combined with the open_date sort + since/until. Other filters (establishment_name substring, insp_type, state+naics together, min_penalty) post-filter client-side over a widened fetch window. sort_by=case_mod_date is the 'recently updated cases' firehose and cannot be combined with state / naics_code / since / until.  Pure-publisher posture: DOL's enforcement rows as published — codes kept verbatim (with the source's own legend decoded alongside), no safety scoring. Each record's source_url links to the osha.gov establishment inspection-detail page.","parameters":[{"name":"activity_nr","in":"query","required":false,"description":"Direct lookup by OSHA inspection activity number (e.g., '317465899'). Returns the inspection with its violations attached. Fastest path.","schema":{"type":"string"}},{"name":"establishment_name","in":"query","required":false,"description":"Case-insensitive substring against the inspected establishment's name (e.g., 'amazon', 'dollar general'). Client-side filter.","schema":{"type":"string"}},{"name":"state","in":"query","required":false,"description":"Two-letter site state (e.g., 'TX', 'CA').","schema":{"type":"string"}},{"name":"naics_code","in":"query","required":false,"description":"Exact NAICS industry code of the inspected site (e.g., '238160' roofing contractors). Note: '000000' on many pre-NAICS-era records.","schema":{"type":"string"}},{"name":"insp_type","in":"query","required":false,"description":"One-letter inspection-type code (e.g., 'M' Fat/Cat, 'B' Complaint, 'H' Planned — full legend in the tool description).","schema":{"type":"string"}},{"name":"since","in":"query","required":false,"description":"Inspection open_date lower bound (YYYY-MM-DD inclusive).","schema":{"type":"string"}},{"name":"until","in":"query","required":false,"description":"Inspection open_date upper bound (YYYY-MM-DD inclusive).","schema":{"type":"string"}},{"name":"min_penalty","in":"query","required":false,"description":"Keep only inspections with at least one violation whose initial or current penalty is >= this amount (dollars). Implies include_violations=true.","schema":{"type":"number"}},{"name":"include_violations","in":"query","required":false,"description":"When true, attaches each returned inspection's violation citations under a `violations` array (standard, type, penalties, abatement/contest dates). Default false.","schema":{"type":"boolean"}},{"name":"sort_by","in":"query","required":false,"description":"Sort key. Default: open_date. case_mod_date = most recently UPDATED cases (cannot combine with state/naics_code/since/until).","schema":{"type":"string","enum":["open_date","case_mod_date"]}},{"name":"sort_order","in":"query","required":false,"description":"Default: desc (most recent first).","schema":{"type":"string","enum":["asc","desc"]}},{"name":"limit","in":"query","required":false,"description":"Maximum inspections to return. Default 50, max 500.","schema":{"type":"integer"}}],"responses":{"200":{"description":"JSON envelope: { results: [...], count, has_more }."},"400":{"description":"Invalid parameter."},"401":{"description":"Missing or invalid API key."},"402":{"description":"This tool requires a higher plan (upgrade_required). Retrying will not help."},"429":{"description":"Tier rate/quota limit reached (rate_limited). Retry-After points at the reset."}}}},"/v1/nlrb-cases":{"get":{"operationId":"get_nlrb_cases","summary":"Returns NLRB (National Labor Relations Board) case filings: unfair- labor-practice charges and union representation/election petitions","description":"Returns NLRB (National Labor Relations Board) case filings: unfair- labor-practice charges and union representation/election petitions. Use this when the user asks about: union organizing at a company, labor disputes or ULP charges, union election petitions and outcomes, decertification efforts, or a company's labor-relations record.  Case numbers follow {region}-{type}-{sequence}, e.g. '03-CA-390171' (NLRB Region 03, CA charge). The middle code determines the case family: C-cases are ULP CHARGES against an employer (CA) or a union (CB, CC, CD, CE, CG, CP) — allegations of unlawful labor practices. R-cases are REPRESENTATION petitions — RC (union seeks certification), RD (employees seek decertification), RM (employer-filed), plus UD/UC/AC unit matters. Each record carries case_type ('ULP' or 'representation') and case_subtype (the raw code).  The `name` field is the named party on the filing — usually the employer, but on CB/CC-type charges it is the union being charged. employer_name matches against it as a substring. Representation cases carry eligible_voters, certified_representative (filled after a won election), and unit_sought (the bargaining-unit description).  FRESHNESS CAVEAT: cases mutate after filing — status flips Open→Closed and date_closed / reason_closed / certified_representative fill in later. The daily sync re-pulls a trailing 180-day date_filed window, so those fields on cases FILED MORE THAN ~180 DAYS AGO may lag the source until a periodic full re-pull; the source_url case page is always current.  Filter combinations note: server-side indexes support ONE of state / case_type combined with the date_filed sort + since/until. Other filters (employer_name substring, case_subtype, status, region, state+case_type together) post-filter client-side over a widened fetch window.  Pure-publisher posture: NLRB's public case rows as published — no outcome scoring. Each record's source_url links to the nlrb.gov public case page (which also carries docket activity and related documents not in this dataset).","parameters":[{"name":"case_number","in":"query","required":false,"description":"Direct lookup by NLRB case number (e.g., '03-CA-390171'). Fastest path.","schema":{"type":"string"}},{"name":"employer_name","in":"query","required":false,"description":"Case-insensitive substring against the named party (e.g., 'starbucks', 'amazon'). Usually the employer; on CB-type charges the union. Client-side filter.","schema":{"type":"string"}},{"name":"state","in":"query","required":false,"description":"Two-letter state/territory code of the case site (e.g., 'NY', 'CA', 'PR').","schema":{"type":"string"}},{"name":"case_type","in":"query","required":false,"description":"Case family: 'ULP' = unfair-labor-practice charges (C-cases), 'representation' = election/unit petitions (R-cases).","schema":{"type":"string","enum":["ULP","representation"]}},{"name":"case_subtype","in":"query","required":false,"description":"Exact case-number code (e.g., 'CA' charge against employer, 'CB' against union, 'RC' certification petition, 'RD' decertification). Client-side filter.","schema":{"type":"string"}},{"name":"status","in":"query","required":false,"description":"Case status. Client-side filter.","schema":{"type":"string","enum":["Open","Closed"]}},{"name":"region","in":"query","required":false,"description":"Two-digit NLRB region number from the case-number prefix (e.g., '03' Buffalo, '13' Chicago). Client-side filter.","schema":{"type":"string"}},{"name":"since","in":"query","required":false,"description":"date_filed lower bound (YYYY-MM-DD inclusive).","schema":{"type":"string"}},{"name":"until","in":"query","required":false,"description":"date_filed upper bound (YYYY-MM-DD inclusive).","schema":{"type":"string"}},{"name":"sort_by","in":"query","required":false,"description":"Sort key. Only date_filed is supported (the default).","schema":{"type":"string","enum":["date_filed"]}},{"name":"sort_order","in":"query","required":false,"description":"Default: desc (most recently filed first).","schema":{"type":"string","enum":["asc","desc"]}},{"name":"limit","in":"query","required":false,"description":"Maximum cases to return. Default 50, max 500.","schema":{"type":"integer"}}],"responses":{"200":{"description":"JSON envelope: { results: [...], count, has_more }."},"400":{"description":"Invalid parameter."},"401":{"description":"Missing or invalid API key."},"402":{"description":"This tool requires a higher plan (upgrade_required). Retrying will not help."},"429":{"description":"Tier rate/quota limit reached (rate_limited). Retry-After points at the reset."}}}},"/v1/ferc-filings":{"get":{"operationId":"get_ferc_filings","summary":"Returns FERC eLibrary document records — every public filing at the Federal Energy Regulatory Commission: Issuances (orders, notices, delegated letters BY FERC) and Submittals (rate filings, tariff changes, compliance reports, protests, hydro license paperwork TO FERC) across the Electric, Natural Gas, Oil, Hydro, Rulemaking, and General libraries (~1,300 documents/week)","description":"Returns FERC eLibrary document records — every public filing at the Federal Energy Regulatory Commission: Issuances (orders, notices, delegated letters BY FERC) and Submittals (rate filings, tariff changes, compliance reports, protests, hydro license paperwork TO FERC) across the Electric, Natural Gas, Oil, Hydro, Rulemaking, and General libraries (~1,300 documents/week). Use this when the user asks about: a FERC docket or rate case, pipeline / utility / hydro regulatory activity, FERC orders affecting a company, or energy infrastructure proceedings.  The DOCKET NUMBER is the join key across a proceeding. Format: PREFIX + two-digit year + sequence, e.g. 'ER26-1234' (Electric rate), 'RP26-930' (gas pipeline rate), 'CP26-15' (gas pipeline certificate/construction), 'P-5737' (hydro project — no year), 'EL26-50' (Electric complaint/investigation), 'RM26-3' (rulemaking). docket_number accepts the root ('RP26-930') or a full sub-docket ('RP26-930-000'). Records carry docket_numbers (verbatim) plus docket_prefixes for quick classification.  Record shape: accession_number (e.g. '20260708-3001' — the unique document key), category ('Issuance' | 'Submittal'), description, filed/issued/posted dates, class_types (document class + type), libraries, authors[] / recipients[], and transmittal file metadata. Documents themselves are NOT in the record — agents download the primary attached file via source_url (eLibrary filedownload link).  Pure-publisher posture: FERC's search metadata as published — no outcome predictions or case scoring.","parameters":[{"name":"accession_number","in":"query","required":false,"description":"Direct lookup by FERC accession number (e.g. '20260708-3001').","schema":{"type":"string"}},{"name":"docket_number","in":"query","required":false,"description":"Docket number — root ('RP26-930', 'P-5737') or full sub-docket ('RP26-930-000'). Returns every document in that proceeding.","schema":{"type":"string"}},{"name":"library","in":"query","required":false,"description":"FERC library — code or name: E/Electric, G/Gas, O/Oil, H/Hydro, RM/Rulemaking, Gen/General. (Rare multi-library documents carry a concatenated value like 'RulemakingElectric' — FERC's own encoding — and only match that exact string.)","schema":{"type":"string"}},{"name":"category","in":"query","required":false,"description":"Issuance = BY FERC (orders, notices); Submittal = TO FERC (company filings).","schema":{"type":"string","enum":["Issuance","Submittal"]}},{"name":"class_type","in":"query","required":false,"description":"Case-insensitive substring against document class + type (e.g. 'order', 'tariff', 'protest', 'environmental').","schema":{"type":"string"}},{"name":"text","in":"query","required":false,"description":"Case-insensitive substring against the document description (e.g. a company name).","schema":{"type":"string"}},{"name":"since","in":"query","required":false,"description":"Lower bound (YYYY-MM-DD inclusive) on the sort_by date field.","schema":{"type":"string"}},{"name":"until","in":"query","required":false,"description":"Upper bound (YYYY-MM-DD inclusive) on the sort_by date field.","schema":{"type":"string"}},{"name":"sort_by","in":"query","required":false,"description":"Default posted_date (when FERC published the document — filings can post up to ~4 days after filing).","schema":{"type":"string","enum":["posted_date","filed_date"]}},{"name":"sort_order","in":"query","required":false,"description":"Default: desc (most recent first).","schema":{"type":"string","enum":["asc","desc"]}},{"name":"limit","in":"query","required":false,"description":"Maximum records to return. Default 50, max 500.","schema":{"type":"integer"}}],"responses":{"200":{"description":"JSON envelope: { results: [...], count, has_more }."},"400":{"description":"Invalid parameter."},"401":{"description":"Missing or invalid API key."},"402":{"description":"This tool requires a higher plan (upgrade_required). Retrying will not help."},"429":{"description":"Tier rate/quota limit reached (rate_limited). Retry-After points at the reset."}}}},"/v1/foreign-agents":{"get":{"operationId":"get_foreign_agents","summary":"Returns FARA registrations — US persons and firms registered with the DOJ as agents of a foreign principal under the Foreign Agents Registration Act","description":"Returns FARA registrations — US persons and firms registered with the DOJ as agents of a foreign principal under the Foreign Agents Registration Act. Use this when the user asks about: who is a registered foreign agent, which US firms work for a particular foreign government, recently-registered foreign agents, or to add a 'foreign- influence' flag to a lobbying firm, law firm, or PR firm.  Each record is one registrant ↔ foreign-principal relationship — a registrant representing three foreign principals appears as three records. The single highest-signal filter is foreign_principal_country:   foreign_principal_country='CHINA'  → every US agent acting for a                                        Chinese principal  Source: efile.fara.gov (DOJ National Security Division). v1A covers ACTIVE registrations. The registrant↔principal linkage is included; per-document filing detail and compensation figures are not — follow source_url to FARA eFile for those.  Cross-source pairing pattern:   FARA + get_lobbying_filings  — FARA is foreign-principal representation;       LDA is domestic lobbying. A firm in both is lobbying Congress on       behalf of a foreign government.   FARA + get_fec_contributions — foreign-agent firms whose people also       make political contributions.   FARA + get_congressional_trades — influence-and-trades overlay.  Identifier: registration_number is the FARA registration number. has_foreign_principal=false records are registrants with no currently- active foreign principal (still queryable as registered agents).  History: registrations that LEAVE DOJ's active list are kept with status:'terminated' (+ termination_observed_date) rather than deleted — a terminated registration is still real history. Default queries return BOTH; filter status:'active' for the current roster only.","parameters":[{"name":"registration_number","in":"query","required":false,"description":"Exact FARA registration number. Fastest lookup.","schema":{"type":"string"}},{"name":"registrant_name","in":"query","required":false,"description":"Case-insensitive substring against the US registrant (agent) name.","schema":{"type":"string"}},{"name":"foreign_principal_name","in":"query","required":false,"description":"Case-insensitive substring against the foreign principal's name.","schema":{"type":"string"}},{"name":"foreign_principal_country","in":"query","required":false,"description":"Country of the foreign principal, matched uppercase (e.g. 'CHINA', 'RUSSIA', 'SAUDI ARABIA'). The key foreign-influence filter.","schema":{"type":"string"}},{"name":"has_foreign_principal","in":"query","required":false,"description":"Filter to records that carry a foreign-principal relationship (true) or registrants with no active foreign principal (false).","schema":{"type":"boolean"}},{"name":"status","in":"query","required":false,"description":"Registration status: 'active' = currently on DOJ's list; 'terminated' = left the list since ingestion (kept as history). Omit for both.","schema":{"type":"string","enum":["active","terminated"]}},{"name":"since","in":"query","required":false,"description":"ISO date (YYYY-MM-DD). Only records on or after this date, by sort_by.","schema":{"type":"string"}},{"name":"until","in":"query","required":false,"description":"ISO date (YYYY-MM-DD). Only records on or before this date.","schema":{"type":"string"}},{"name":"sort_by","in":"query","required":false,"description":"Default: registration_date.","schema":{"type":"string","enum":["registration_date","foreign_principal_reg_date"]}},{"name":"sort_order","in":"query","required":false,"description":"Default: desc (most recent first).","schema":{"type":"string","enum":["desc","asc"]}},{"name":"limit","in":"query","required":false,"description":"Maximum records to return. Default 50, max 500.","schema":{"type":"integer"}}],"responses":{"200":{"description":"JSON envelope: { results: [...], count, has_more }."},"400":{"description":"Invalid parameter."},"401":{"description":"Missing or invalid API key."},"402":{"description":"This tool requires a higher plan (upgrade_required). Retrying will not help."},"429":{"description":"Tier rate/quota limit reached (rate_limited). Retry-After points at the reset."}}}},"/v1/screening-list":{"get":{"operationId":"get_screening_list","summary":"Returns entries from the US Consolidated Screening List (CSL) — the combined feed of twelve federal export-screening lists","description":"Returns entries from the US Consolidated Screening List (CSL) — the combined feed of twelve federal export-screening lists. Use this when the user asks about: whether a company or person is on a US screening / sanctions / denied-party list, trade-compliance screening of a counterparty, BIS Entity List members, Military End User designations, or to add a 'restricted party' flag to a federal contractor or foreign agent.  The CSL unifies twelve lists (filter via source_short):   SDN  — Specially Designated Nationals (Treasury/OFAC)   EL   — Entity List (Commerce/BIS)   DPL  — Denied Persons List (Commerce/BIS)   MEU  — Military End User List (Commerce/BIS)   UVL  — Unverified List (Commerce/BIS)   CMIC — Non-SDN Chinese Military-Industrial Complex Companies (Treasury)   CAP  — Capta List (Treasury)   DTC  — ITAR Debarred (State)   ISN  — Nonproliferation Sanctions (State)   MBS  — Non-SDN Menu-Based Sanctions List (Treasury)   PLC  — Palestinian Legislative Council List (Treasury)   SSI  — Sectoral Sanctions Identifications List (Treasury)  Broader than get_ofac_sdn — the SDN list is just one source here. For the OFAC-SDN deep view use get_ofac_sdn; for 'on ANY US list' screening use this tool.  Cross-source pairing: pair with get_federal_contracts to flag a contractor that also appears on a screening list, and with get_foreign_agents for the foreign-entity overlay.  Each record carries name + alt_names, the source list, sanctions programs, addresses, distinct countries, and identification documents.","parameters":[{"name":"name","in":"query","required":false,"description":"Case-insensitive substring matched against the entry name AND its alternate names / aliases.","schema":{"type":"string"}},{"name":"source_short","in":"query","required":false,"description":"Filter to one source list by short code: SDN, EL, DPL, MEU, UVL, CMIC, CAP, DTC, ISN, MBS, PLC, SSI.","schema":{"type":"string"}},{"name":"type","in":"query","required":false,"description":"Filter by entry type.","schema":{"type":"string","enum":["Entity","Individual","Vessel","Aircraft"]}},{"name":"country","in":"query","required":false,"description":"ISO-2 country code (e.g. 'CN', 'RU', 'IR'). Matches entries with an address in that country.","schema":{"type":"string"}},{"name":"program","in":"query","required":false,"description":"Case-insensitive substring against the entry's sanctions / control programs.","schema":{"type":"string"}},{"name":"sort_by","in":"query","required":false,"description":"Default: name.","schema":{"type":"string","enum":["name"]}},{"name":"sort_order","in":"query","required":false,"description":"Default: asc (alphabetical by name).","schema":{"type":"string","enum":["asc","desc"]}},{"name":"limit","in":"query","required":false,"description":"Maximum records to return. Default 50, max 500.","schema":{"type":"integer"}}],"responses":{"200":{"description":"JSON envelope: { results: [...], count, has_more }."},"400":{"description":"Invalid parameter."},"401":{"description":"Missing or invalid API key."},"402":{"description":"This tool requires a higher plan (upgrade_required). Retrying will not help."},"429":{"description":"Tier rate/quota limit reached (rate_limited). Retry-After points at the reset."}}}},"/v1/aircraft-registry":{"get":{"operationId":"get_aircraft_registry","summary":"Returns FAA aircraft registrations — the releasable registry of ~314K currently US-registered aircraft, one record per N-number: the aircraft (manufacturer, model, seats, engines, weight class, year built, engine type), and the REGISTRANT — name, type (Individual / Corporation / LLC / Government / Co-Owned, the FAA's own legend, with the verbatim code), address, and up to five co-owner names","description":"Returns FAA aircraft registrations — the releasable registry of ~314K currently US-registered aircraft, one record per N-number: the aircraft (manufacturer, model, seats, engines, weight class, year built, engine type), and the REGISTRANT — name, type (Individual / Corporation / LLC / Government / Co-Owned, the FAA's own legend, with the verbatim code), address, and up to five co-owner names. Use this when the user asks: who owns an aircraft (by N-number), what aircraft a company / person / nonprofit registers, corporate-jet fleets, aircraft registered in a state, or to join tail numbers seen in flight-tracking data to owners.  Lookups: n_number is a direct hit ('N123AB' or '123AB'). registrant_name matches the primary registrant AND co-owner names. Note: many corporate jets register through trustee banks (e.g. 'BANK OF UTAH TRUSTEE') or aircraft-management LLCs — an absent company name is NOT proof the company has no aircraft.  Registry posture: a CURRENT-roster snapshot refreshed monthly from the FAA's daily-updated file. snapshot_date is the last snapshot a record appeared in — stale means since deregistered. Deregistered- aircraft history (the FAA DEREG file) is a planned follow-up.  Pure-publisher posture: FAA records verbatim; type labels are the FAA's own documentation legends, never our inference.","parameters":[{"name":"n_number","in":"query","required":false,"description":"Direct lookup by registration (with or without the N prefix).","schema":{"type":"string"}},{"name":"registrant_name","in":"query","required":false,"description":"Case-insensitive substring against registrant + co-owner names.","schema":{"type":"string"}},{"name":"state","in":"query","required":false,"description":"Two-letter registrant state (e.g., 'TX').","schema":{"type":"string"}},{"name":"registrant_type_code","in":"query","required":false,"description":"FAA code: 1 Individual, 2 Partnership, 3 Corporation, 4 Co-Owned, 5 Government, 7 LLC, 8 Non-Citizen Corp, 9 Non-Citizen Co-Owned.","schema":{"type":"string","enum":["1","2","3","4","5","7","8","9"]}},{"name":"aircraft_type_code","in":"query","required":false,"description":"FAA code: 4 fixed-wing single-engine, 5 fixed-wing multi-engine, 6 rotorcraft, 1 glider, 2 balloon, 9 gyroplane, H hybrid lift, O other.","schema":{"type":"string","enum":["1","2","3","4","5","6","7","8","9","H","O"]}},{"name":"manufacturer","in":"query","required":false,"description":"Case-insensitive substring against the manufacturer (e.g., 'gulfstream', 'cessna').","schema":{"type":"string"}},{"name":"sort_by","in":"query","required":false,"description":"Default last_action_date (most recent registry activity first).","schema":{"type":"string","enum":["last_action_date","year_mfr"]}},{"name":"sort_order","in":"query","required":false,"description":"Default desc.","schema":{"type":"string","enum":["asc","desc"]}},{"name":"limit","in":"query","required":false,"description":"Maximum records. Default 50, max 500.","schema":{"type":"integer"}}],"responses":{"200":{"description":"JSON envelope: { results: [...], count, has_more }."},"400":{"description":"Invalid parameter."},"401":{"description":"Missing or invalid API key."},"402":{"description":"This tool requires a higher plan (upgrade_required). Retrying will not help."},"429":{"description":"Tier rate/quota limit reached (rate_limited). Retry-After points at the reset."}}}},"/v1/corporate-patents":{"get":{"operationId":"get_corporate_patents","summary":"Returns US patent applications from the USPTO Open Data Portal, keyed on the APPLICANT (the corporate owner)","description":"Returns US patent applications from the USPTO Open Data Portal, keyed on the APPLICANT (the corporate owner). Each record is one application's front-page metadata: title, applicant(s), first inventor + inventor count, filing/effective dates, status, entity size, application type. Follow source_url (USPTO Patent Center) for the full file wrapper / documents.  Use this when the user asks: what is a company patenting, how many patents did a company file (and when), recent patents in a company's portfolio, or to cross-reference R&D output against insider/congressional activity, contracts, or fundamentals for the same company.  company_name is the corporate APPLICANT and matches case-insensitively, but patents are filed under an IP-HOLDING ENTITY, not the household brand. Use the full legal applicant string for best recall — e.g. 'Google LLC', 'Microsoft Technology Licensing, LLC', 'Amazon Technologies, Inc.', 'QUALCOMM Incorporated', 'International Business Machines Corporation', 'Meta Platforms, Inc.', 'NVIDIA Corporation', 'Lockheed Martin Corporation', 'The Boeing Company', 'Apple Inc.', 'Intel Corporation', 'Tesla, Inc.'.  COVERAGE — live-first (source:'live'): when company_name is set, each call queries USPTO live over the full ~12.9M-application index (the whole filing history of that applicant, most-recent first), with since/until on filing_date applied at the source. On USPTO outage the tool falls back to a cached recent slice for a dozen tracked big filers (source:'cache' + coverage_warning) — don't infer totals there. With NO company_name it serves that same recent cache (browse). application_number is a direct lookup.","parameters":[{"name":"company_name","in":"query","required":false,"description":"Corporate applicant (IP-holding entity), case-insensitive. Triggers a LIVE USPTO query over that applicant's full history. Use the full legal entity, e.g. 'Microsoft Technology Licensing, LLC' (not 'Microsoft'), 'Google LLC' (not 'Google').","schema":{"type":"string"}},{"name":"application_number","in":"query","required":false,"description":"Exact USPTO application number for a direct lookup (cache). Example: '17/123456'.","schema":{"type":"string"}},{"name":"since","in":"query","required":false,"description":"ISO date (YYYY-MM-DD). Only applications with filing_date on or after this date.","schema":{"type":"string"}},{"name":"until","in":"query","required":false,"description":"ISO date (YYYY-MM-DD). Only applications with filing_date on or before this date.","schema":{"type":"string"}},{"name":"sort_order","in":"query","required":false,"description":"Order by filing_date. Default: desc (most-recent first).","schema":{"type":"string","enum":["desc","asc"]}},{"name":"limit","in":"query","required":false,"description":"Maximum records to return. Default 50, max 200.","schema":{"type":"integer"}}],"responses":{"200":{"description":"JSON envelope: { results: [...], count, has_more }."},"400":{"description":"Invalid parameter."},"401":{"description":"Missing or invalid API key."},"402":{"description":"This tool requires a higher plan (upgrade_required). Retrying will not help."},"429":{"description":"Tier rate/quota limit reached (rate_limited). Retry-After points at the reset."}}}},"/v1/nonprofit-filings":{"get":{"operationId":"get_nonprofit_filings","summary":"Returns IRS Form 990-series e-filing records — the registry of every e-filed nonprofit return the IRS has released, 2017→present (~5.5M filings; ~400-750K/yr)","description":"Returns IRS Form 990-series e-filing records — the registry of every e-filed nonprofit return the IRS has released, 2017→present (~5.5M filings; ~400-750K/yr). One record per return: EIN, organization name, return type (990 = full; 990EZ = small; 990PF = private foundation; 990T = unrelated business income; the 2019-era index also carries IRS codes 990EO/990O verbatim), the tax period covered (YYYYMM), and the IRS release year. Use this when the user asks: does nonprofit X file with the IRS, when did a foundation last file, which returns has an EIN filed, or to anchor a nonprofit's identity (EIN) before joining grants / lobbying / OIG data by name.  Records carry the filing's extracted FINANCIALS: total_revenue, total_expenses, total_assets_eoy, net_assets_eoy, and officers[] — top 25 by reported compensation with name/title. Coverage (reconciled 2026-07-08): 100% for release years 2019-2026, 97% for 2018, 69% for 2017 — the shortfall is IRS-side (the pre-2017 XML archives that held those filings' documents were retired by the IRS; the registry rows remain, without financials). Meanings follow the form: for 990T, total_revenue is unrelated-business taxable income. Officer compensation is as reported to the IRS. sub_date is set only for 2019-era records (later IRS indexes carry only the year — KeyVex never fabricates dates); tax_period is the reliable time axis. A nonprofit's fiscal year varies — tax_period 202506 means the period ENDING June 2025.  Pure-publisher posture: the IRS index rows as published.","parameters":[{"name":"object_id","in":"query","required":false,"description":"Direct lookup by IRS OBJECT_ID.","schema":{"type":"string"}},{"name":"ein","in":"query","required":false,"description":"Employer Identification Number (any format — digits extracted).","schema":{"type":"string"}},{"name":"name","in":"query","required":false,"description":"Case-insensitive substring against the organization name.","schema":{"type":"string"}},{"name":"return_type","in":"query","required":false,"description":"IRS code verbatim: '990', '990EZ', '990PF', '990T' (also '990EO'/'990O' in 2019-era records).","schema":{"type":"string"}},{"name":"submission_year","in":"query","required":false,"description":"IRS release/index year (2017→present; financials partial for 2017 — IRS retired the pre-2017 XML archives).","schema":{"type":"integer"}},{"name":"since","in":"query","required":false,"description":"tax_period lower bound — 'YYYY-MM' or 'YYYYMM' (inclusive).","schema":{"type":"string"}},{"name":"until","in":"query","required":false,"description":"tax_period upper bound — 'YYYY-MM' or 'YYYYMM' (inclusive).","schema":{"type":"string"}},{"name":"sort_order","in":"query","required":false,"description":"Sort by tax_period. Default desc.","schema":{"type":"string","enum":["asc","desc"]}},{"name":"limit","in":"query","required":false,"description":"Maximum records. Default 50, max 500.","schema":{"type":"integer"}}],"responses":{"200":{"description":"JSON envelope: { results: [...], count, has_more }."},"400":{"description":"Invalid parameter."},"401":{"description":"Missing or invalid API key."},"402":{"description":"This tool requires a higher plan (upgrade_required). Retrying will not help."},"429":{"description":"Tier rate/quota limit reached (rate_limited). Retry-After points at the reset."}}}},"/v1/company-profile":{"get":{"operationId":"get_company_profile","summary":"Returns ONE company's reference profile: legal name, CIK, tickers + exchanges, SIC industry classification, state of incorporation, HQ and mailing addresses, phone, fiscal year end, EIN, former names, a plain-English business summary (condensed from the latest 10-K Item 1), CEO + board of directors (from the latest DEF 14A proxy), federal- contract activity summary (USAspending join, with a ready-to-run get_federal_contracts query), company logo reference, and — on paid plans — the latest end-of-day closing price (price_eod; Close Prices from Tiingo.com)","description":"Returns ONE company's reference profile: legal name, CIK, tickers + exchanges, SIC industry classification, state of incorporation, HQ and mailing addresses, phone, fiscal year end, EIN, former names, a plain-English business summary (condensed from the latest 10-K Item 1), CEO + board of directors (from the latest DEF 14A proxy), federal- contract activity summary (USAspending join, with a ready-to-run get_federal_contracts query), company logo reference, and — on paid plans — the latest end-of-day closing price (price_eod; Close Prices from Tiingo.com). For price HISTORY use get_daily_prices. The price_iex_last / price_tngolast intraday fields remain unlicensed stubs.  ⚠ ASSEMBLED REFERENCE DATA — unlike KeyVex's mirror datasets, this profile is NOT byte-faithful government mirroring. Fields are assembled from multiple bases and each carries its own provenance envelope: source, source_type (mirrored | derived | self_collected | asserted | licensed), fetched_at, as_of, and per-field meta (e.g. the SEC accession number every derived field traces to). A field that cannot be established is UNKNOWN with a machine-readable reason; a field staler than its declared cadence reads as INSUFFICIENT_DATA (value retained for knowing consumption). Factual data only — no ratings, rankings, scores, or opinions.  Leadership staleness note: CEO/board come from the latest annual proxy and can lag mid-year changes; meta.leadership_change_events_since_proxy lists any 8-K Item 5.02 (officer/director change) filings made after the proxy — follow up with get_material_events for the detail.  Lookup is by ticker OR cik (exactly one required). Ticker matches the company's current EDGAR-listed tickers; renamed/delisted tickers miss — use the CIK. An ambiguous ticker (multiple CIKs) returns an error naming the candidate CIKs rather than guessing.","parameters":[{"name":"ticker","in":"query","required":false,"description":"Company ticker, e.g. 'AAPL', 'BRK-B' (EDGAR hyphen convention for class shares). Exactly one of ticker/cik.","schema":{"type":"string"}},{"name":"cik","in":"query","required":false,"description":"SEC CIK, padded or not ('320193' or '0000320193'). Exactly one of ticker/cik.","schema":{"type":"string"}}],"responses":{"200":{"description":"JSON envelope: { results: [...], count, has_more }."},"400":{"description":"Invalid parameter."},"401":{"description":"Missing or invalid API key."},"402":{"description":"This tool requires a higher plan (upgrade_required). Retrying will not help."},"429":{"description":"Tier rate/quota limit reached (rate_limited). Retry-After points at the reset."}}}},"/v1/daily-prices":{"get":{"operationId":"get_daily_prices","summary":"Returns daily end-of-day closing-price history for one US-listed ticker (stocks, ETFs, mutual funds — including delisted tickers, so historical analysis is survivorship-bias-free)","description":"Returns daily end-of-day closing-price history for one US-listed ticker (stocks, ETFs, mutual funds — including delisted tickers, so historical analysis is survivorship-bias-free). Coverage extends back as far as 1962 for the oldest names, subject to plan history limits. PAID PLANS ONLY.  Each row: date, close (as-traded), adj_close (split+dividend adjusted — use THIS for charts and return calculations), div_cash (dividend with that ex-date), split_factor (e.g. 4 = 4:1 split that session).  The full requested window returns in ONE call — no pagination. For multi-year ranges prefer frequency='weekly' or 'monthly' (last bar per period; dividends summed, split factors compounded) to keep responses compact: 10 years daily ≈ 2,500 rows vs ~120 monthly.  One call = one ticker. Compare securities with multiple calls. Close Prices from Tiingo.com.","parameters":[{"name":"ticker","in":"query","required":true,"description":"Ticker symbol, e.g. 'AAPL', 'SPY', 'BRK-B' (hyphen for share classes).","schema":{"type":"string"}},{"name":"since","in":"query","required":false,"description":"ISO date YYYY-MM-DD inclusive. Default: earliest your plan allows.","schema":{"type":"string"}},{"name":"until","in":"query","required":false,"description":"ISO date YYYY-MM-DD inclusive. Default: latest available.","schema":{"type":"string"}},{"name":"frequency","in":"query","required":false,"description":"Downsampling. Default daily. Use weekly/monthly for multi-year charts.","schema":{"type":"string","enum":["daily","weekly","monthly"]}}],"responses":{"200":{"description":"JSON envelope: { results: [...], count, has_more }."},"400":{"description":"Invalid parameter."},"401":{"description":"Missing or invalid API key."},"402":{"description":"This tool requires a higher plan (upgrade_required). Retrying will not help."},"429":{"description":"Tier rate/quota limit reached (rate_limited). Retry-After points at the reset."}}}},"/v1/unified-search":{"get":{"operationId":"unified_search","summary":"Identifier-driven cross-collection fan-out search","description":"Identifier-driven cross-collection fan-out search. Pass one or more entity identifiers — ticker, bioguide_id, company_cik, recipient_uei, company_name, or cusip — and this tool queries every collection where that field is indexed, returning results grouped by source in one envelope.  Use this for high-level 'tell me everything about X' questions before drilling into specific source tools. Replaces 6-10 sequential tool calls with a single fan-out.  Identifier coverage:   - ticker → 13 collections (company_profile, insider_trades,     institutional_holdings, congressional_trades, planned_insider_sales,     initial_ownership_baselines, activist_ownership, material_events,     proxy_filings, xbrl_fundamentals, tender_offers, registration_statements,     nport_holdings)   - bioguide_id → 2 collections (congressional_trades, annual_financial_disclosures)   - company_cik → 11 collections (company_profile, insider_trades,     planned_insider_sales, initial_ownership_baselines, activist_ownership,     material_events, proxy_filings, xbrl_fundamentals, private_placements,     registration_statements, nport_filings)   - recipient_uei → 1 collection (federal_contracts)   - company_name → 5 name-keyed collections (federal_contracts,     enforcement_actions, consumer_complaints, product_recalls,     fda_approvals) AND auto-     resolves to ticker + company_cik via EDGAR's catalog, cascading into     every ticker/CIK adapter above. The unlock for 'tell me everything about     Wells Fargo' hitting up to 20 collections in one call. (lobbying_filings is     excluded from the fan-out — its 51K-record substring scan is too slow     for parallel federation; call get_lobbying_filings directly instead.)   - cusip → 4 collections (institutional_holdings, activist_ownership,     nport_holdings, treasury_auctions)  Multiple identifiers can be combined to narrow each source's query (e.g., ticker + bioguide_id will filter congressional_trades by both).  Name resolution: when only company_name is supplied, the resolved ticker and CIK come from EDGAR's company_tickers_exchange.json (US-listed names only). Foreign-only or private companies won't resolve to a ticker, but name-keyed collections (CFPB, lobbying, etc.) still receive the substring filter directly.  Performance note: company_name fan-out includes substring-filtered collections (lobbying_filings 51K+, federal_contracts) which scan a 5K- record window per source. The full cascade can take 10-40s depending on Firestore region. When latency matters more than coverage, pass `sources` to whitelist only the ticker/CIK-keyed adapters (typically <1s total).  Per-source result count is capped via per_source_limit (default 5, max 50). One slow or failing source returns an error block instead of blocking the rest — check sources_queried vs sources_with_results to see what landed.  When you need full result counts and richer filters on one specific collection, call that collection's dedicated tool directly afterward.","parameters":[{"name":"ticker","in":"query","required":false,"description":"Stock symbol. Case-insensitive. Fans out to 13 collections.","schema":{"type":"string"}},{"name":"bioguide_id","in":"query","required":false,"description":"Congressional bioguide ID (e.g. P000197 for Pelosi). Fans out to 2 collections.","schema":{"type":"string"}},{"name":"company_cik","in":"query","required":false,"description":"SEC CIK number for an issuer (10-digit, leading zeros). Fans out to 8 SEC collections.","schema":{"type":"string"}},{"name":"recipient_uei","in":"query","required":false,"description":"USAspending recipient UEI. Fans out to federal_contracts only.","schema":{"type":"string"}},{"name":"company_name","in":"query","required":false,"description":"Issuer name (e.g., 'Lockheed Martin', 'Wells Fargo'). Resolves to ticker + CIK via EDGAR catalog (if US-listed) AND substring-filters name-keyed collections (federal_contracts, enforcement_actions, consumer_complaints, product_recalls, fda_approvals). For a company's lobbying activity, call get_lobbying_filings directly — it is excluded here for fan-out latency.","schema":{"type":"string"}},{"name":"cusip","in":"query","required":false,"description":"9-character CUSIP security identifier. Fans out to institutional_holdings, activist_ownership, nport_holdings, treasury_auctions.","schema":{"type":"string"}},{"name":"since","in":"query","required":false,"description":"ISO date (YYYY-MM-DD). Applied to each collection's primary date field.","schema":{"type":"string"}},{"name":"until","in":"query","required":false,"description":"ISO date (YYYY-MM-DD). Inclusive upper bound.","schema":{"type":"string"}},{"name":"per_source_limit","in":"query","required":false,"description":"Max records per source. Default 5, max 50.","schema":{"type":"integer"}},{"name":"limit","in":"query","required":false,"description":"Alias for per_source_limit (this is a fan-out, so the cap is per source). Default 5, max 50.","schema":{"type":"integer"}},{"name":"sources","in":"query","required":false,"description":"Optional whitelist of source names. Default: all collections that index the provided identifier(s). (comma-separated)","schema":{"type":"string"}}],"responses":{"200":{"description":"JSON envelope: { results: [...], count, has_more }."},"400":{"description":"Invalid parameter."},"401":{"description":"Missing or invalid API key."},"402":{"description":"This tool requires a higher plan (upgrade_required). Retrying will not help."},"429":{"description":"Tier rate/quota limit reached (rate_limited). Retry-After points at the reset."}}}},"/v1/logos/{ticker}":{"get":{"operationId":"get_ticker_logo","summary":"Ticker logo (512x512 PNG)","description":"Company logo for a US-listed ticker as a 512x512 PNG, keyed by ticker. Two styles: 'standalone' (default — the transparent mark) or 'box' (the mark on a 3D brand-color tile). 5,000+ symbols available. All tiers; one metered call per image.","parameters":[{"name":"ticker","in":"path","required":true,"description":"Ticker symbol, e.g. AAPL or BRK-B.","schema":{"type":"string"}},{"name":"variant","in":"query","required":false,"description":"Logo style: 'standalone' (default) is the transparent mark; 'box' is the mark on a 3D brand-color background tile.","schema":{"type":"string","enum":["standalone","box"]}}],"responses":{"200":{"description":"PNG image.","content":{"image/png":{"schema":{"type":"string","format":"binary"}}}},"401":{"description":"Missing or invalid API key."},"402":{"description":"This tool requires a higher plan (upgrade_required). Retrying will not help."},"404":{"description":"No logo for this ticker."},"429":{"description":"Tier rate/quota limit reached (rate_limited). Retry-After points at the reset."}}}},"/v1/photos/{bioguideId}":{"get":{"operationId":"get_member_photo","summary":"Congressional member photo (JPEG)","description":"Official portrait of a current member of Congress as a JPEG (450x550), keyed by bioguide ID. Self-hosted mirror of the public-domain congressional portrait collection — pairs with get_member_profile, whose photo_url field points here. All tiers; one metered call per image. Members whose official portrait hasn't been published yet return 404.","parameters":[{"name":"bioguideId","in":"path","required":true,"description":"Member's bioguide ID, e.g. P000197 (Nancy Pelosi).","schema":{"type":"string","pattern":"^[A-Z][0-9]{6}$"}}],"responses":{"200":{"description":"JPEG image.","content":{"image/jpeg":{"schema":{"type":"string","format":"binary"}}}},"401":{"description":"Missing or invalid API key."},"402":{"description":"This tool requires a higher plan (upgrade_required). Retrying will not help."},"404":{"description":"No photo for this member."},"429":{"description":"Tier rate/quota limit reached (rate_limited). Retry-After points at the reset."}}}}}}