KeyVex docs

Documentation

How to connect your AI agent to KeyVex and query the 60+ tools. The free public endpoint needs no account or API key — point your MCP client at it and go. It's rate-limited; accounts and higher-quota tiers are rolling out (see below).

What is KeyVex

KeyVex is a public-data API for US financial and government disclosures — SEC filings, congressional trades, FEC campaign finance, federal contracts and grants, lobbying, regulatory enforcement, sanctions, macroeconomic indicators, and more. It's built agent-first and delivered as a remote Model Context Protocol (MCP) server, so any MCP client — Claude, Cursor, or your own agent — connects once and can query all 60+ tools with no glue code. And because the endpoint is plain HTTP, you can also call it directly with curl or any HTTP client — handy for non-agent, programmatic use.

All data is public-record information sourced directly from US government agencies. KeyVex normalizes and indexes it; KeyVex does not provide investment advice, derived signals, or trading recommendations.

Quickstart

1. Start on the free tier — no signup needed

KeyVex's free public MCP endpoint is openly accessible — no account, no API key, no consent flow. Point your client at the URL below and start calling tools. The free endpoint is rate-limited (see Rate limits); for higher volume, see Accounts & tiers.

2. Choose your AI

KeyVex has two MCP endpoints — same 60+ tools on both:

https://mcp.keyvex.com        # free public endpoint — no account, rate-limited per IP
https://mcp.keyvex.com/pro    # sign in with your KeyVex account — your plan's quota + history

Pick your client for step-by-step setup:

Using something else? Any client that speaks MCP's standard Streamable HTTP transport works — point it at https://mcp.keyvex.com; the free endpoint needs no authentication headers.

Set up: Claude

claude.ai or Claude Desktop — the easiest path, no files to edit:

  • 1. Open claude.ai (or Claude Desktop) and go to Settings → Connectors.
  • 2. Click Add custom connector.
  • 3. Name it KeyVex and paste this as the URL, then click Add:
    https://mcp.keyvex.com
  • 4. That's it — no sign-in or consent step. To check it worked, start a new chat and ask: "What are the biggest congressional trades this month?" Claude should call a KeyVex tool and answer with real filings.

Have a KeyVex account? In step 3, paste https://mcp.keyvex.com/pro instead. The first time Claude calls a tool, it shows a Connect card — sign in with your keyvex.com login and your plan's quota and history apply from then on. Full details: Use your plan in Claude.

Claude Desktop via config file (advanced — only if you prefer editing config by hand). Desktop's claude_desktop_config.json only accepts local servers, so a remote url entry is silently ignored; bridge it with mcp-remote instead (needs Node.js installed):

  • 1. Open the config file — Windows: %APPDATA%\Claude\claude_desktop_config.json · Mac: ~/Library/Application Support/Claude/claude_desktop_config.json (create it if it doesn't exist).
  • 2. Paste this and save:
    {
      "mcpServers": {
        "keyvex": {
          "command": "npx",
          "args": ["-y", "mcp-remote", "https://mcp.keyvex.com"]
        }
      }
    }
  • 3. Fully quit and reopen Claude Desktop. KeyVex appears in the tools menu of a new chat.

Claude Code (the terminal tool) — one command, done:

claude mcp add --transport http keyvex https://mcp.keyvex.com

Or with your plan, using the API key from your KeyVex account:

claude mcp add --transport http keyvex https://mcp.keyvex.com/pro \
  --header "Authorization: Bearer kvx_live_YOUR_KEY"

Set up: ChatGPT

ChatGPT supports custom MCP connectors on paid plans (Plus / Pro / Business / Enterprise / Edu) with Developer mode enabled:

  • 1. Enable Developer mode. Settings → Apps & Connectors (on some plans: ConnectorsAdvanced) → turn on Developer mode. On Business / Enterprise a workspace admin has to enable it first.
  • 2. Add the connector. In the same Connectors / Apps settings, choose Create / Add custom connector, name it KeyVex, and paste https://mcp.keyvex.com as the MCP server URL. No authentication — leave auth set to none.
  • 3. Turn it on in chat. In a new chat, open the composer's tool picker (the + / tools button) and enable the KeyVex connector — it's also available as a source in Deep Research.
  • 4. Try it. Ask: "What are the biggest congressional trades this month?" ChatGPT should call a KeyVex tool and answer with real filings.

OpenAI has been renaming this surface (Connectors ↔ Apps), so labels may differ slightly — look for "custom connector" plus "developer mode."

Set up: Cursor

  • 1. In Cursor, open Settings → MCP and click Add new global MCP server — this opens ~/.cursor/mcp.json. (For one project only, create .cursor/mcp.json in the project folder instead.)
  • 2. Paste this and save:
    {
      "mcpServers": {
        "keyvex": {
          "url": "https://mcp.keyvex.com"
        }
      }
    }
  • 3. Back in Settings → MCP, KeyVex should show a green dot with its tools listed. To try it, ask the agent chat: "What are the biggest congressional trades this month?"

On a KeyVex plan? Use this version instead — it sends your API key with every request, so your plan's daily quota and history window apply. Replace kvx_live_YOUR_KEY with the key from your KeyVex account:

{
  "mcpServers": {
    "keyvex": {
      "url": "https://mcp.keyvex.com/pro",
      "headers": { "Authorization": "Bearer kvx_live_YOUR_KEY" }
    }
  }
}

Set up: Windsurf

  • 1. In Windsurf, open Settings → Cascade → MCP and choose to add / configure a server — this opens ~/.codeium/windsurf/mcp_config.json (you can also edit that file directly).
  • 2. Paste this and save — note Windsurf's field is serverUrl, not url:
    {
      "mcpServers": {
        "keyvex": {
          "serverUrl": "https://mcp.keyvex.com"
        }
      }
    }
  • 3. Click the refresh button in Cascade's MCP toolbar. KeyVex and its tools appear in the list. To try it, ask Cascade: "What are the biggest congressional trades this month?"

On a KeyVex plan? Use this version instead — it sends your API key with every request, so your plan's daily quota and history window apply. Replace kvx_live_YOUR_KEY with the key from your KeyVex account:

{
  "mcpServers": {
    "keyvex": {
      "serverUrl": "https://mcp.keyvex.com/pro",
      "headers": { "Authorization": "Bearer kvx_live_YOUR_KEY" }
    }
  }
}

Set up: VS Code

VS Code uses MCP through GitHub Copilot Chat, so you need a Copilot subscription with the Copilot Chat extension installed.

  • 1. In your project folder, create a file at .vscode/mcp.json.
  • 2. Paste this and save — note VS Code's top-level key is servers, not mcpServers:
    {
      "servers": {
        "keyvex": {
          "type": "http",
          "url": "https://mcp.keyvex.com"
        }
      }
    }
  • 3. VS Code shows a Start hint above the server entry — click it (or just save; it starts on demand).
  • 4. Open Copilot Chat, switch to Agent mode, and check the tools picker — KeyVex's tools are listed. Try: "What are the biggest congressional trades this month?"

On a KeyVex plan? Use this version instead — it sends your API key with every request, so your plan's daily quota and history window apply. Replace kvx_live_YOUR_KEY with the key from your KeyVex account:

{
  "servers": {
    "keyvex": {
      "type": "http",
      "url": "https://mcp.keyvex.com/pro",
      "headers": { "Authorization": "Bearer kvx_live_YOUR_KEY" }
    }
  }
}

Heads-up: .vscode/mcp.json lives inside your project — if the project is in a shared git repo, don't commit your key.

3. Make a query

Ask your agent something that touches KeyVex data:

"Show me the largest congressional trades in the past 30 days
 with party and committee context."

The agent will pick the right tools (get_congressional_trades and get_member_profile), run them in parallel, and synthesize an answer.

4. Verify with curl (optional)

You can hit the endpoint directly without any client. Health check:

curl https://mcp.keyvex.com/

Returns server version, tool count, and the full tool list as JSON. List all tools via MCP:

curl -X POST https://mcp.keyvex.com/ \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}'

No Authorization header is needed. The response is a JSON-RPC envelope containing the full schema of every tool.

Authentication, accounts & tiers

The free public endpoint is authless. KeyVex's free MCP endpoint at mcp.keyvex.com is openly accessible — no account, no API key, no OAuth flow, and no consent screen. Any MCP client can connect and call any tool. It advertises this in its health-check response: {"auth":"none",...}.

It's rate-limited (60 requests / 60-second window per IP) — generous for evaluation and light use. For sustained higher volume you create an account and use an API key.

The free endpoint stays open because every tool serves data already public by federal mandate (SEC filings, USAspending records, congressional disclosures, etc.) — there's nothing user-specific to gate on, and skipping auth removes a setup step for the agent developer.

Abuse prevention. Because the free endpoint is open, two mechanisms protect it from runaway use:

  • A per-IP rate limit caps each calling IP at 60 requests per 60-second sliding window. Exceed it and the endpoint returns HTTP 429 with a Retry-After header.
  • A Cloud Run instance cap bounds the worst-case server load even under a coordinated flood.

Accounts & higher tiers. You can create a free account at keyvex.com (email, Google, or phone) and we'll issue you an API key — keys are stored only as a hash, never in the clear. Your account's plan (Free / Pro / Premium) sets your daily call quota and history window on both the REST API and the /pro MCP endpoint below. The free public endpoint at mcp.keyvex.com stays authless and free.

Use your plan in Claude — the /pro connector

To use your KeyVex account's tier through Claude (or any OAuth-capable MCP client), connect to the account-aware endpoint instead of the public one:

https://mcp.keyvex.com/pro

Here's the flow, step by step:

  • 1. Add the connector. In Claude's Connectors settings, add a custom connector pointing at https://mcp.keyvex.com/pro. It connects immediately — the tool list loads without signing in.
  • 2. Sign in on first use. The first time Claude actually calls a tool, it shows an inline Connect card. Click it, sign in with your KeyVex account (the same login as keyvex.com), and Claude retries the call automatically. One-time step per client.
  • 3. Your plan applies live. Every call is metered at your account's current tier — daily quota and history window (Free: 1 year · Pro: 5 years · Premium: full archive). Upgrades and downgrades take effect on your very next call; there's nothing to reconnect or refresh.

Prefer your API key? Header-capable clients — Claude Code, Cursor, scripts — can skip OAuth entirely and send the same kvx_live_ key you use on the REST API, as either header:

# Claude Code
claude mcp add --transport http keyvex https://mcp.keyvex.com/pro \
  --header "Authorization: Bearer kvx_live_YOUR_KEY"

# or raw HTTP — x-api-key works too
curl -X POST https://mcp.keyvex.com/pro \
  -H "x-api-key: kvx_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"get_congressional_trades","arguments":{"ticker":"NVDA"}}}'

An expired or invalid credential returns 401 — Claude responds by refreshing its token or re-showing the Connect card, so a stale session heals itself. The tool surface is identical on both endpoints; the only differences are quota and history depth.

REST API (HTTP)

Besides the MCP connector, KeyVex exposes the same data as a plain REST API at https://api.keyvex.com — for AI-generated scripts, agents, and apps that make ordinary HTTP requests instead of speaking MCP. If you ask an AI to "build me something with KeyVex," this is the surface its code calls.

Base URL & OpenAPI spec

The machine-readable OpenAPI 3.1 spec lists every endpoint and parameter — point any AI at it and it can write correct code on the first try:

https://api.keyvex.com/openapi.json

Authentication

The REST API is key-only (unlike the free MCP endpoint). Create a free account at keyvex.com, generate a key, and send it on every request in the x-api-key header:

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

Free key = every dataset, 1 year of history, 60 requests/day. A free key returns complete rows (not a preview) across all datasets within a 1-year history window; Pro extends the window to 5 years, Premium to the full archive, and paid tiers raise the daily cap, which resets at midnight Eastern. A missing or invalid key returns 401.

Endpoints

All 60+ tools are exposed as GET /v1/<name> — the tool name without the get_ prefix, hyphenated. A few examples:

GET /v1/congressional-trades?ticker=NVDA
GET /v1/insider-transactions?ticker=AAPL
GET /v1/institutional-holdings
GET /v1/federal-contracts
GET /v1/lobbying-filings
GET /v1/material-events

Responses are JSON — { "results": [...], "count": N, "has_more": bool }. See the OpenAPI spec for the full list of all 54 endpoints and their parameters.

Tool reference

KeyVex exposes 60+ tools. All are read-only. Every tool's full schema (parameters, filters, response shape) is returned by the MCP tools/list method. The table below is a one-line summary.

SEC filings & market structure

get_insider_transactionsSEC Form 4 / 5 — executive insider buys, sells, option exercises, RSU activity
get_planned_insider_salesSEC Form 144 — planned insider sales with 10b5-1 plan flag
get_institutional_holdingsSEC Form 13F — quarterly institutional fund holdings
get_activist_stakesSEC Schedule 13D / 13G — activist and 5%+ beneficial ownership
get_nport_filingsSEC Form N-PORT — mutual fund monthly portfolio metadata
get_fund_holdingsSEC N-PORT primary-document XML — per-security fund holdings + derivatives
get_registration_statementsSEC Form S-1 / S-3 — IPO and shelf registration statements
get_tender_offersSEC Schedule TO — third-party + issuer tender offers
get_private_placementsSEC Form D — Regulation D exempt offerings
get_material_eventsSEC Form 8-K — M&A, executive changes, earnings, material events
get_proxy_filingsSEC Schedule 14A — proxy statements (DEF 14A annual + merger)
get_fundamentalsSEC EDGAR XBRL — income statement, balance sheet, cash flow per filing
get_sec_fails_to_deliverSEC bi-monthly Fails-to-Deliver settlement data
get_sec_comment_lettersSEC EDGAR UPLOAD / CORRESP — comment-letter correspondence between SEC staff and filers
get_reg_a_offeringsSEC Form 1-A — Regulation A+ offering statements
get_crowdfunding_offeringsSEC Form C — Regulation Crowdfunding offerings
get_money_market_fundsSEC Form N-MFP3 — monthly money market fund portfolio reports
get_investment_advisersSEC Form ADV — registered investment adviser registry (monthly extract)
get_delistingsSEC Form 25 / Form 15 — exchange delistings and deregistrations

Congressional activity

get_congressional_tradesSenate eFD + House Clerk Periodic Transaction Reports (member stock trades)
get_member_profileCurrent senators, representatives, committee assignments, contact info
get_annual_financial_disclosuresForm 278 / Public Financial Disclosure (Senate eFD)
get_billsCongress.gov bills + resolutions (HR / S / HJ / SJ / HC / SC / HR / SRes)
get_roll_call_votesHouse + Senate roll-call votes

Campaign finance & influence

get_fec_candidate_profileFEC candidates and linked principal committees
get_fec_contributionsFEC Schedule A — aggregated campaign contributions (totals by candidate / committee / employer / state + donor leaderboard)
get_fec_disbursementsFEC Schedule B — itemized committee disbursements (vendors, media buys, transfers)
get_fec_independent_expendituresFEC Schedule E — super-PAC ads supporting/opposing candidates
get_lobbying_filingsSenate LDA — quarterly lobbying registrations and spend
get_foreign_agentsDOJ FARA — foreign agent registrations and principal relationships
get_lobbyist_contributionsSenate LD-203 — lobbyist political contribution reports

Federal awards

get_federal_contractsUSAspending — federal procurement contract awards
get_federal_grantsUSAspending — federal grant + assistance awards

Regulatory & compliance

get_enforcement_actionsSEC + DOJ + CFTC + OCC + FDIC + FTC + Federal Reserve + FinCEN enforcement press releases
get_ofac_sdnUS Treasury OFAC Specially Designated Nationals sanctions list
get_screening_listUS Consolidated Screening List — 12 export-control / sanctions lists
get_federal_register_documentsFederal Register — rules, proposed rules, notices, presidential documents
get_osha_enforcementDOL/OSHA — workplace-safety inspections and violations with penalties (1980s→present)
get_epa_enforcementEPA ECHO — federal civil environmental enforcement cases with penalties (1977→present)
get_nlrb_casesNLRB — unfair-labor-practice charges + union representation petitions
get_ferc_filingsFERC eLibrary — energy-regulatory dockets (rate cases, certificates, hydro)
get_oig_exclusionsHHS-OIG LEIE — list of excluded healthcare individuals / entities
get_consumer_complaintsCFPB Consumer Complaint Database
get_product_recallsFDA (drug / device / food) + CPSC consumer-product recalls
get_government_publicationsGovInfo — committee reports, public laws, hearings, GAO reports
get_fda_approvalsFDA — drug approvals (Drugs@FDA) plus device 510(k) clearances and PMA approvals
get_bank_financialsFDIC BankFind Suite — quarterly bank call-report financials
get_open_paymentsCMS Open Payments — industry payments to physicians and teaching hospitals (live passthrough)
get_nonprofit_filingsIRS Form 990 / 990-EZ / 990-PF / 990-T — nonprofit filings with financials and officer compensation
get_drug_adverse_eventsopenFDA FAERS — drug adverse-event reports (live passthrough)
get_fema_disastersOpenFEMA — federal disaster declarations
get_h1b_filingsDOL OFLC — H-1B Labor Condition Application disclosures

Macroeconomic & markets

get_economic_indicatorsBLS + FRED + EIA — employment, CPI, rates, GDP, energy series
get_treasury_auctionsUS Treasury Bills / Notes / Bonds / TIPS / FRN auctions
get_cftc_cot_reportsCFTC Commitments of Traders — weekly futures + options positioning

Innovation & IP

get_corporate_patentsUSPTO Open Data Portal — US patent applications keyed on the corporate applicant (IP owner); live-first over any company

Reference & market data

get_aircraft_registryFAA releasable aircraft database — registered aircraft and owners
get_company_profileAssembled company reference profile — name, CIK, tickers, SIC, addresses, business summary, CEO + board, per-field provenance

unified_search is the cross-source meta-tool. Pass one or more identifiers (ticker, company_name, cusip, company_cik, bioguide_id, recipient_uei) and it fans out across every applicable tool in parallel, returning a unified envelope.

Useful when you want a full picture of an entity without manually calling 10 tools:

{
  "method": "tools/call",
  "params": {
    "name": "unified_search",
    "arguments": { "ticker": "NVDA" }
  }
}

The fan-out hits insider transactions, congressional trades, institutional holdings, activist stakes, federal contracts, material events, fundamentals, and more — whichever tools match the identifier you passed. get_lobbying_filings is the one collection deliberately excluded from the fan-out (substring scans on 51K+ filings are too slow to parallelize); call it directly for lobbying queries.

Rate limits

How KeyVex meters usage depends on how you connect.

Authless public endpoint. The open mcp.keyvex.com endpoint needs no account or key — it exists so MCP clients and connectors (for example the Claude Connector, where users can't sign up to test) can call it immediately. Access is restricted, and it's rate-limited per IP at 60 requests per 60-second sliding window. Exceed the window and the endpoint returns HTTP 429 with a Retry-After header indicating how long to wait.

Authenticated tiers. Create an account and send an API key for a higher, per-account daily quota that resets at midnight Eastern:

  • Free — 60 calls / day, all datasets, 1 year of history.
  • Pro — 10,000 calls / day, all datasets, 5 years of history.
  • Premium — 100,000 calls / day, all datasets, full historical archive.

History windows. Time-series datasets return records within your tier's window (Free/keyless: 1 year · Pro: 5 years · Premium: full archive). Every response subject to a window carries a history_floor field plus a history_note so agents always know the range they're seeing. Reference datasets (member profiles, sanctions & screening lists, OIG exclusions, foreign-agent registrations, economic indicators) are always served in full — capping a current-state compliance list would make it wrong, so we don't.

Exceed your daily quota and calls return HTTP 429 with a Retry-After header until the next reset. A server-side concurrent instance cap additionally bounds worst-case load under coordinated traffic — you should never see it unless you're actively trying to flood the server.

For most agent workflows (a few tool calls per user question, the occasional batch catch-up) you'll never hit a limit. To raise your quota or extend your history window, see Accounts & tiers or compare plans.

Data freshness

Two different clocks govern how current a record is, and it helps to keep them separate.

1. Poll cadence — how often KeyVex re-checks each source. KeyVex caches normalized data in Firestore and refreshes it on this schedule:

  • SEC filings (most types): hourly
  • SEC Form 4: every 30 minutes
  • 13F: every 4 hours
  • Congressional trades: daily, 6 AM ET
  • FEC contributions, federal contracts, lobbying: daily
  • Bills, votes, member profiles: daily
  • XBRL fundamentals: weekly
  • FARA, OFAC, screening lists, recalls: daily
  • Economic indicators: daily

2. Source-publication lag — how recent the data itself can be. Several agencies publish in batches well after the events they describe, so the newest record a tool can return is bounded by the source's own release schedule — not by how often KeyVex polls. Polling every 30 minutes cannot surface data the SEC has not published yet. The main lagged sources:

  • Fails-to-deliver (get_sec_fails_to_deliver): SEC publishes a half-month batch ~2-4 weeks after that half-month closes, so the latest settlement date typically trails today by 2-4 weeks.
  • Product recalls (get_product_recalls): FDA / CPSC datasets commonly post 4-6 weeks after a recall is initiated.
  • 13F institutional holdings (get_institutional_holdings): funds file quarterly, up to 45 days after quarter-end — a quarterly snapshot, never intraday.
  • N-PORT fund holdings (get_fund_holdings, get_nport_filings): monthly filings released on a ~30-60 day public-availability delay.
  • Congressional PTRs (get_congressional_trades): members may file up to 30-45 days after a trade, so the disclosure date lags the trade date.

So a record from a few weeks ago on a lagged tool is the source operating normally, not a stale cache. Each tool response includes a scraped_at or last_modified_date field showing exactly when KeyVex last polled, and lagged tools restate their own publication cadence in the tool description.

Troubleshooting

I get HTTP 429 Too Many Requests

Your IP exceeded the 60-requests-per-minute rate limit. The response body and the Retry-After header indicate how long to wait. If your legitimate use case requires higher sustained volume, email contact@keyvex.com.

A tool returns an empty result set when I expect data

Common causes:

  • Filter too narrow. The MCP filter parameters AND together — try widening the date range or removing one filter.
  • Source genuinely has no data for that query. Some sources (e.g., FARA, Senate roll-call votes for some sessions) have low overall volume. The empty response is correct.
  • Data not yet ingested. If you're querying for events from the last hour, check the refresh cadence — some sources update only daily.
My MCP client is asking for an authentication URL or consent flow

It shouldn't. KeyVex serves auth: none in its health-check response and does not return a WWW-Authenticate header on any 401 (because we never return 401 for auth reasons — there's nothing to authenticate). If your client is forcing an OAuth flow regardless, check the client's MCP server configuration — some clients default to OAuth discovery and need to be explicitly told the server is authless. You can also paste a dummy Bearer token if your client requires the field; we'll ignore it.

Can I get historical data older than what a tool returns by default?

Most tools accept since and until date filters, and the historical depth varies by source:

  • SEC Form 4 insider transactions: back to 2006. KeyVex serves the SEC's quarterly bulk ownership dataset, which begins 2006 Q1. (Electronic Form 4 was mandated in 2003, but the bulk dataset itself starts in 2006 — querying 2003-2005 returns nothing.)
  • XBRL fundamentals: back to 2009, when XBRL tagging became mandatory for large filers. (Some period-end values reach 2006 as prior-year comparatives embedded in those early filings.)
  • FEC contributions: back to the 1976 cycle. Reaching older cycles requires the cycle parameter (e.g. cycle: 1980) — since/until alone stay within the current cycle, so an old date range with no cycle returns empty. Pair cycle with a since/until window or a committee / candidate / state / employer filter to scope the result.

If a date range returns less than you expect, check the data freshness section — and note that on lagged sources the newest records trail today by weeks (source-publication lag).

How do I report a bug or request a feature?

Email contact@keyvex.com with the tool name, the exact query parameters you sent, the response you received, and what you expected. We typically reply within one business day.

Support

Primary support contact: contact@keyvex.com

Founders read this inbox directly. Typical response time is within one business day. For urgent issues (production outage, breaking change), include "URGENT" in the subject.

For privacy, terms, and data-handling questions, see the privacy policy. For status and version, see the public health check at https://mcp.keyvex.com/ (returns server version and current tool list as JSON, no authentication required).