Documentation
How to connect your AI agent to KeyVex and query the 60+ tools. The open MCP endpoint needs no account or API key: point your MCP client at it and try two datasets. A free account opens most of the catalogue, and paid plans (Basic, Pro, Business) open every tool with higher limits (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,
which is handy for non-agent, programmatic use.
Disclosure data is public-record information sourced from US government agencies; market price data is licensed from Tiingo (Terms §6). KeyVex normalizes and indexes it; KeyVex does not provide investment, legal, tax, or compliance advice, derived signals, or trading recommendations.
Quickstart
1. Try it with no signup, two datasets are open
KeyVex's public MCP endpoint needs no account, no API key and no consent flow. Point your client at the URL below and start calling. The open endpoint serves two datasets so you can evaluate KeyVex before creating anything:
get_congressional_trades, stock trades disclosed by members of Congressget_insider_transactions, SEC Form 3/4/5 insider buys and sells
Every other dataset returns a short message telling you to create a free account.
A free account costs nothing and unlocks most of
the catalogue. Fifteen tools need a paid plan (Basic and up): the two market-data
feeds, unified_search, and twelve of the heaviest datasets. Each one is
marked in the tool reference. See
Accounts & tiers.
2. Choose your AI
KeyVex has two MCP endpoints. Both speak the same protocol; they differ in what they will serve you:
https://mcp.keyvex.com # open endpoint, no account; 2 datasets, 60 calls/day per IP
https://mcp.keyvex.com/pro # sign in with your KeyVex account; your plan's datasets, 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.
KeyVex is also listed on Smithery, which can install it into your client for you.
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
KeyVexand 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: Connectors → Advanced) → 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 pastehttps://mcp.keyvex.comas 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.jsonin 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, noturl:{ "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, notmcpServers:{ "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 public endpoint is authless, and serves two datasets. KeyVex's open MCP endpoint at mcp.keyvex.com needs no account, no API key, no OAuth flow and no consent screen, it advertises this in its health-check response: {"auth":"none",...}. Any MCP client can connect. What it will serve without an account is get_congressional_trades and get_insider_transactions; every other tool returns a message pointing you at a free account.
Note for agent developers: tools/list on the open endpoint returns the full catalogue, not just the two open tools. If your agent enumerates tools and calls them without an API key, it will discover 64 and be able to call only 2. Either send a key, or restrict the agent to the two datasets above.
It's rate-limited (60 requests per 60-second window and 60 tool calls a day, per IP), enough to evaluate. A free account opens most of the catalogue; market data, unified_search, twelve heavier datasets and sustained volume need a paid plan.
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-Afterheader. - 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 / Basic / Pro / Business) sets which tools you can call, your daily calls,
monthly data 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 · Basic: 5 years · Pro and Business: full archive). A plan change applies from your next call once it takes effect: an upgrade at once, a lower plan at the end of the period you've paid for. 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.
With a key on /pro, you can call every tool your plan includes (Free
leaves out fifteen, marked in the tool reference); quota and
history depth follow your plan too. The open endpoint is the one that differs:
without a key it serves two datasets, as described in
Authentication, accounts & tiers.
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 = most datasets, 1 year of history, 60 requests/day. A free
key returns complete rows, not a preview or a sample, within a 1-year history window,
up to 50 rows per call. The exceptions are the two market-data feeds,
get_daily_prices (end-of-day) and get_intraday_quote, which our
data licence permits only on paid plans, plus unified_search and twelve
heavier datasets, each marked "Paid plans only" on its
dataset page. Basic adds all of them
with 5 years of history, Pro and Business extend to the full archive, and paid plans
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. Most tools answer as
{ "results": [...], "count": N, "has_more": bool }; a few have their own
shape: get_company_profile returns one company profile,
get_intraday_quote one quote, get_daily_prices a price
series, and unified_search results grouped by source. See
the OpenAPI spec for the full list of
endpoints and their parameters. The spec is generated from the live server, so it is
always the authoritative count, no number written here can go stale against it.
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. Tools marked (paid plans)
need Basic or higher; a free key cannot call them.
SEC filings & market structure
| get_insider_transactions | SEC Form 4 / 5, executive insider buys, sells, option exercises, RSU activity |
| get_insider_filings | SEC Form 3 / 4 / 5 filing index, one row per filing with its reporting owners and row counts |
| get_insider_holdings | SEC Form 3 / 4 / 5 insider positions, shares and value held after each filing, direct or indirect |
| get_planned_insider_sales | SEC Form 144, planned insider sales with 10b5-1 plan flag |
| get_institutional_holdings | SEC Form 13F, quarterly institutional fund holdings |
| get_activist_stakes | SEC Schedule 13D / 13G, activist and 5%+ beneficial ownership (paid plans) |
| get_nport_filings | SEC Form N-PORT, mutual fund monthly portfolio metadata |
| get_fund_holdings | SEC N-PORT primary-document XML, per-security fund holdings + derivatives (paid plans) |
| get_registration_statements | SEC Form S-1 / S-3, IPO and shelf registration statements |
| get_tender_offers | SEC Schedule TO, third-party + issuer tender offers |
| get_private_placements | SEC Form D, Regulation D exempt offerings |
| get_material_events | SEC Form 8-K, M&A, executive changes, earnings, material events |
| get_proxy_filings | SEC Schedule 14A, proxy statements (DEF 14A annual + merger) |
| get_fundamentals | SEC EDGAR XBRL, income statement, balance sheet, cash flow per filing |
| get_sec_fails_to_deliver | SEC bi-monthly Fails-to-Deliver settlement data |
| get_sec_comment_letters | SEC EDGAR UPLOAD / CORRESP, comment-letter correspondence between SEC staff and filers |
| get_reg_a_offerings | SEC Form 1-A, Regulation A+ offering statements |
| get_crowdfunding_offerings | SEC Form C, Regulation Crowdfunding offerings |
| get_money_market_funds | SEC Form N-MFP3, monthly money market fund portfolio reports (paid plans) |
| get_investment_advisers | SEC Form ADV, registered investment adviser registry (monthly extract) |
| get_delistings | SEC Form 25 / Form 15, exchange delistings and deregistrations |
Congressional activity
| get_congressional_trades | Senate eFD + House Clerk Periodic Transaction Reports (member stock trades) |
| get_member_profile | Current senators, representatives, committee assignments, contact info |
| get_annual_financial_disclosures | Form 278 / Public Financial Disclosure, Senate (eFD) and House (House Clerk) |
| get_bills | Congress.gov bills + resolutions (HR / S / HRES / SRES / HJRES / SJRES / HCONRES / SCONRES) |
| get_roll_call_votes | House + Senate roll-call votes |
Campaign finance & influence
| get_fec_candidate_profile | FEC candidates and linked principal committees |
| get_fec_contributions | FEC Schedule A, aggregated campaign contributions: totals by candidate / committee / employer / state + donor leaderboard (paid plans) |
| get_fec_disbursements | FEC Schedule B, itemized committee disbursements: vendors, media buys, transfers (paid plans) |
| get_fec_independent_expenditures | FEC Schedule E, super-PAC ads supporting/opposing candidates |
| get_lobbying_filings | Senate LDA, quarterly lobbying registrations and spend |
| get_foreign_agents | DOJ FARA, foreign agent registrations and principal relationships |
| get_lobbyist_contributions | Senate LD-203, lobbyist political contribution reports |
Federal awards
| get_federal_contracts | USAspending, federal procurement contract awards (paid plans) |
| get_federal_grants | USAspending, federal grant + assistance awards (paid plans) |
Regulatory & compliance
| get_enforcement_actions | SEC + DOJ + CFTC + OCC + FDIC + FTC + Federal Reserve + FinCEN enforcement press releases |
| get_ofac_sdn | US Treasury OFAC Specially Designated Nationals sanctions list |
| get_screening_list | US Consolidated Screening List, 12 export-control / sanctions lists |
| get_federal_register_documents | Federal Register, rules, proposed rules, notices, presidential documents |
| get_osha_enforcement | DOL/OSHA, workplace-safety inspections and violations with penalties (1980s→present) |
| get_epa_enforcement | EPA ECHO, federal civil environmental enforcement cases with penalties (1977→present) |
| get_nlrb_cases | NLRB, unfair-labor-practice charges + union representation petitions |
| get_ferc_filings | FERC eLibrary, energy-regulatory dockets (rate cases, certificates, hydro) |
| get_oig_exclusions | HHS-OIG LEIE, list of excluded healthcare individuals / entities |
| get_consumer_complaints | CFPB Consumer Complaint Database (paid plans) |
| get_product_recalls | FDA (drug / device / food) + CPSC consumer-product recalls (NHTSA vehicle recalls are not covered) |
| get_government_publications | GovInfo, committee reports, public laws, hearings, GAO reports |
| get_fda_approvals | FDA, drug approvals (Drugs@FDA) plus device 510(k) clearances and PMA approvals |
| get_bank_financials | FDIC BankFind Suite, quarterly bank call-report financials |
| get_open_payments | CMS Open Payments, industry payments to physicians and teaching hospitals, live passthrough (paid plans) |
| get_nonprofit_filings | IRS Form 990 / 990-EZ / 990-PF / 990-T, nonprofit filings with financials and officer compensation |
| get_drug_adverse_events | openFDA FAERS, drug adverse-event reports, live passthrough (paid plans) |
| get_fema_disasters | OpenFEMA, federal disaster declarations |
| get_h1b_filings | DOL OFLC, H-1B Labor Condition Application disclosures |
Macroeconomic & markets
| get_economic_indicators | BLS + FRED + EIA + Treasury FiscalData, employment, CPI, rates, GDP, energy, national-debt series |
| get_treasury_auctions | US Treasury Bills / Notes / Bonds / TIPS / FRN auctions (paid plans) |
| get_cftc_cot_reports | CFTC Commitments of Traders, weekly futures + options positioning |
Innovation & IP
| get_corporate_patents | USPTO Open Data Portal, US patent applications keyed on the corporate applicant (IP owner); live-first over any company (paid plans) |
Reference & market data
| get_aircraft_registry | FAA releasable aircraft database, registered aircraft and owners |
| get_company_profile | Assembled company reference profile, name, CIK, tickers, SIC, addresses, business summary, CEO + board, per-field provenance |
| get_daily_prices | Tiingo end-of-day price history for one US stock, ETF or fund, delisted tickers included (paid plans) |
| get_intraday_quote | Latest intraday price for one US ticker, live from Tiingo's IEX feed (paid plans) |
| get_alerts | Your own watchlist alerts, newest first, for the tickers, members of Congress and contract recipients you watch (needs an account) |
unified_search
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.
It needs a paid plan (Basic and up): a free key cannot call it, and neither can the
open endpoint without a key.
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. Without a key it serves two datasets, and it's rate-limited per
IP at 60 requests per 60-second sliding window and 60 tool calls a day.
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, 100 MB of data / month, most datasets
(not market data,
unified_searchor twelve heavier datasets), 1 year of history, up to 50 rows per call. Up to 30 calls a minute and 3 at once. Logos and member photos: 2 of each a day. - Basic: 10,000 calls / day, 5 GB of data / month, every dataset including market data, 5 years of history. Up to 300 calls a minute and 5 at once. Intraday quotes: 1,000 a day. Logos: 500 a day. Personal, non-commercial use.
- Pro: 50,000 calls / day, 15 GB of data / month, every dataset, full historical archive. Up to 300 calls a minute and 6 at once. Intraday quotes: 5,000 a day. Logos: 2,000 a day. Personal, non-commercial use.
- Business: 50,000 calls / day, 30 GB of data / month, every dataset, full historical archive. Up to 300 calls a minute and 6 at once. Intraday quotes: 5,000 a day. Logos: 2,000 a day. Commercial use (subject to the federal use restrictions in Terms §6A).
- Enterprise: custom limits and licence terms; contact us.
Whichever limit you reach first applies, and each plan also has a daily server-time
budget (currently Free 1 minute, Basic 20 minutes, Pro 90 minutes, Business 3 hours),
which wide or slow requests use the most. A request may count as more than one call
against the daily allowance. Today most count as one; the exceptions are a boxed logo
(2 calls), a member photo (3 calls), and a unified_search sent with a key
to the open mcp.keyvex.com endpoint (one call per dataset it searches).
These weights are configuration and can change, so the
X-KeyVex-Units header on REST, and the result's _meta on MCP,
say what each call counted. A refused request says which
limit was reached and when it resets: daily limits at midnight Eastern, monthly data
on the 1st.
Without an account, the open endpoint serves get_congressional_trades and
get_insider_transactions at 60 calls / day per IP, with 1 year of history.
History windows. Time-series datasets return records within your
tier's window (Free/keyless: 1 year · Basic: 5 years · Pro and Business: 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.
What a refusal looks like. On the REST API, reaching a limit (calls
a minute, calls at once, calls a day, a per-tool daily cap, monthly data or daily
server time) returns HTTP 429 rate_limited with a Retry-After
header: about a minute for the per-minute limit, a few seconds for calls at once, and
the time until the reset for daily and monthly limits. Calling a tool your plan does
not include returns HTTP 402 upgrade_required with no
Retry-After, because waiting will not help. On MCP, the same refusals
arrive as HTTP 200 carrying a JSON-RPC error (code -32000) whose message
names the limit, with the Retry-After header set wherever waiting helps.
The open endpoint's per-IP limit is the exception: it answers HTTP 429. If usage
metering is briefly unavailable, REST answers HTTP 503 with a 30-second
Retry-After. 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 stores normalized data in Postgres and refreshes it on this schedule (Eastern time):
- SEC Form 4: every 30 minutes, 5 AM to 10 PM
- SEC 8-K, Form 3, Form 144, 13D / 13G: hourly, 5 AM to 10 PM
- 13F: every 4 hours
- Other SEC filings (proxies, registration statements, Form D, N-PORT, tender offers and more): daily
- Congressional trades: every 2 hours, 6 AM to 10 PM
- FEC contributions, federal contracts and grants, lobbying: daily
- Bills and roll-call votes: daily; member profiles: weekly
- XBRL fundamentals: Sunday, Wednesday and Friday at 4 AM
- OFAC and the consolidated screening list: twice daily; recalls: daily; FARA: weekly
- 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. Every tool response, on REST and MCP alike,
carries a freshness block: checked_at plus a
datasets list where each entry gives last_updated
(when the KeyVex job behind it last ran), age_hours,
expected_cadence and a status of current,
late, stale or unknown. When anything is
not current, the block adds a notice saying so. Lagged tools also
restate their own publication cadence in the tool description.
Troubleshooting
I get HTTP 429 Too Many Requests
On the open MCP endpoint, your IP sent more than 60 requests in 60 seconds. On the
REST API, your key reached one of its plan's limits: calls a minute, calls at once,
calls a day, a per-tool daily cap (intraday quotes, logos, member photos), monthly
data or daily server time. The response body names the limit and the
Retry-After header says how long to wait. Each plan's numbers are under
Rate limits. On MCP with a key, the same limits come
back as a JSON-RPC error rather than HTTP 429. 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
Check which URL it points at. The open endpoint, https://mcp.keyvex.com,
needs no sign-in: its health check reports "auth":"none" and it never
asks a client to authenticate. The account endpoint,
https://mcp.keyvex.com/pro, does: a tool call without a valid
credential returns HTTP 401 with a WWW-Authenticate header pointing at
KeyVex's OAuth metadata, which is what makes Claude show its Connect card.
On /pro, sign in with your keyvex.com login or send your API key (see
Use your plan in Claude). If you meant to use the open
endpoint, point the client at https://mcp.keyvex.com instead; some
clients default to OAuth discovery and need to be told the server is authless. On the
open endpoint a Bearer token that is not a KeyVex key is ignored and the call is
served as keyless. The REST API is separate: it returns 401 when the
key is missing or invalid.
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
cycleparameter (e.g.cycle: 1980),since/untilalone stay within the current cycle, so an old date range with nocyclereturns empty. Paircyclewith asince/untilwindow 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).
Not investment advice. KeyVex is a data publisher: nothing on this site or in API responses is investment, legal, tax, or compliance advice (Terms §8).