/screener/ownership
Full-library transaction screening. Trade-level conditions plus company-level aggregate gates; returns the matching transactions.
Request:
start_date, as_of_dateISO dateWindow on transaction_date; as_of_date also excludes filings submitted after it. as_of_date ≤ today; start_date ≤ as_of_date.
tickers, exclude_tickersstring[]≤ 100 each.
sectorsstring[]The 12 canonical buckets (Industry classification (Pro+)).
trade_filtersobjectaggregate_filtersobject[]≤ 8. Company-level gates — see Filters (/screener/ownership).
group_by_tickerbooltrue → grouped by company. false → flat rows.
sort_bystringGrouped: ticker, txn_count. Flat: transaction_date, filing_date, transaction_value, shares, price_per_share, own_pct_change, split_adjusted_shares, split_adjusted_price.
sort_order"desc" | "asc"pageint ≥ 1page_sizeint 1–100Counts transactions in both modes: with group_by_ticker=true a page holds that many transactions, however few companies they come from.
detailstring"light" leaves out each row's footnote_refs and computed.*.fact_refs, and the start_date_applied echo; "minimal" also leaves out accession_number and company_id. See Response detail.
Pagination cap: page × page_size ≤ 500 (422 above it). When the next page would pass the cap, has_more is false, next_page is null, and _warnings says the limit was reached.
Response:
page, page_size, has_more, next_pagePagination.
as_of_date_applied, start_date_appliedWindow actually used.
resultsgroup_by_ticker=true. Each entry: ticker, issuer, issuer_cik, txn_count (the company's full hit count), transactions.
transactionsgroup_by_ticker=false. Flat rows, each additionally carrying ticker, issuer, issuer_cik and company_id.
anomalies_excluded_countTransactions excluded by the consistency checks; 0 when trade_filters.include_anomalies=true.
credits_used, _warningsEvery row carries accession_number, filing_date, source_url_prefix, insiders, the transaction object, and computed.
Errors: 422 VALIDATION_ERROR, 402 CREDITS_INSUFFICIENT, 403 PLAN_TIER_INSUFFICIENT below Pro, 504 QUERY_TIMEOUT at the 30-second server timeout (charged).
#Filters (/screener/ownership)
trade_filters:
transaction_codestring[]≤ 20. Unknown codes dropped with a warning.
relationshipstring[]is_director, is_officer, is_ten_percent_owner, is_other. OR semantics.
is_derivativeboolprincipal_amount_not_sharesboolOmit for no filter, true for debt-principal rows only, false to exclude them.
include_anomaliesboolDefault false.
exclude_likely_mergedboolDefault false.
include_unresolved_amendmentsboolDefault false.
conditionsobject[]≤ 8. {field, op, value}. field ∈ transaction_value, price_per_share, shares, own_pct_change, split_adjusted_shares, split_adjusted_price.
aggregate_filters: {metric, op, value}, metric ∈ value_acquired, value_disposed, net_value, shares_acquired, shares_disposed, net_shares, txn_count, txn_count_acquired, txn_count_disposed, max_txn_value_acquired, max_txn_value_disposed, distinct_insiders.
Operators (both filter types): >, >=, <, <=, between ([lo, hi], lo ≤ hi).
#Credit formula (/screener/ownership)
POST /screener/ownership charges per call:
credits = max(65, 200
− tickerDiscount // 100 − min(n_tickers, 100); 0 when tickers is omitted
− shortWindowDiscount // 40 when the window is ≤ 90 days
+ fullHistorySurcharge // 80 when start_date is omitted
+ 40 × conditions) // trade conditions + aggregate filtersRange 65–920. Charged even when the result set is empty, and on 504 QUERY_TIMEOUT. No charge on 422 VALIDATION_ERROR, 402 CREDITS_INSUFFICIENT, or 403 PLAN_TIER_INSUFFICIENT (all rejected before any deduction).