KeyVex
Cross-source

Unified Search

The cross-source meta-tool. Pass one entity — a ticker, company name, CUSIP, SEC CIK, congressional member, or federal recipient — and unified_search fans out across every applicable dataset in parallel, returning a single envelope grouped by source. It's how you get the full picture of an entity without calling a dozen tools yourself.

EndpointGET /v1/unified-search
Fans out toup to 20 collections per query
Authx-api-key — a free key works

How it works

Give it at least one identifier. Each identifier knows which datasets it applies to and queries only those — a ticker fans out to 13 collections, a bioguide_id to the 2 congressional ones, a recipient_uei to federal contracts. Results come back grouped under results_by_source, each with its own count and pagination flag.

Identifiers & controls

tickerStock symbol, e.g. NVDA. Fans out to all 13 equity-linked datasets.
company_nameIssuer name (e.g. Lockheed Martin) — resolved to a ticker / CIK.
company_cikSEC CIK (10-digit, zero-padded). Fans out to the 8 SEC datasets.
cusip9-character CUSIP. Fans out to institutional holdings + fund holdings.
bioguide_idCongressional member ID, e.g. P000197. Fans out to the 2 congressional datasets.
recipient_ueiUSAspending recipient UEI. Fans out to federal contracts.
since / untilISO dates (YYYY-MM-DD) applied to each dataset's primary date field.
per_source_limitMax records returned per source. Default 5, max 50. (limit is an alias.)
sourcesOptional whitelist of source names — restrict the fan-out to specific datasets.

What it returns

A single envelope. Top-level fields:

Example request

curl "https://api.keyvex.com/v1/unified-search?ticker=NVDA" \
  -H "x-api-key: YOUR_KEY"

Response

{
  "query": { "ticker": "NVDA" },
  "results_by_source": {
    "insider_trades":         { "count": 5, "has_more": true,  "results": [ /* Form 4 rows */ ] },
    "congressional_trades":   { "count": 5, "has_more": true,  "results": [ /* member trades */ ] },
    "institutional_holdings": { "count": 5, "has_more": true,  "results": [ /* 13F positions */ ] },
    "company_profile":        { "count": 1, "has_more": false, "results": [ /* identity card */ ] },
    "material_events":        { "count": 5, "has_more": true,  "results": [ /* 8-Ks */ ] },
    "xbrl_fundamentals":      { "count": 5, "has_more": true,  "results": [ ... ] },
    "activist_ownership":     { "count": 3, "has_more": false, "results": [ ... ] }
    /* + planned_insider_sales, proxy_filings, tender_offers,
         registration_statements, nport_holdings, initial_ownership_baselines */
  },
  "total_count": 54,
  "sources_queried": 13,
  "sources_with_results": 13
}

Example questions you can answer

Related datasets

Run a unified search from your AI

Hand any AI your key + the OpenAPI spec and it can fan out across every dataset in one call. Free key = full data, 60 requests/day.

Get a free key OpenAPI spec → REST docs →
← All 60+ datasets