Politicians Stock Tracker (SentiSense)
Track what the U.S. Congress is buying and selling. This skill reads congressional STOCK Act disclosures, the trades that Senators and Representatives are legally required to report, through the read-only SentiSense API: recent trades across all members, the trading history for a single stock, the most active politicians, and a full per-member profile. Amounts, chambers, parties, and the gap between when a trade happened and when it was disclosed all come straight from the official filings.
Read-only educational data interface. Output is informational context, never a personalized buy or sell recommendation.
When to Use
Reach for this skill when the question is about congressional or political trading activity:
- "What did Congress buy this week?" or "recent congressional stock trades"
- "Has any senator or representative traded $NVDA?" (per-ticker congressional history)
- "Show me Nancy Pelosi's stock trades" or any single member's activity
- "Which politicians trade the most?" (most active members by trade count)
- "Did a politician disclose a buy right before the stock moved?" (disclosure-delay context)
This skill pairs naturally with institutional-13f-tracker and insider-trading-tracker: cross-reference a congressional buy against institutional 13F accumulation or insider Form 4 buying on the same ticker. High-conviction reads come from convergence across sources, not from any one signal in isolation.
Do not use it for order entry, portfolio management, or personalized advice. It has no write, trading, or wallet surface; every endpoint is a GET.
What this data actually is (read before interpreting)
- Amounts are ranges, not exact values. STOCK Act filings disclose a dollar band (for example "$1,001 - $15,000"). The API returns the raw
amountRangestring plus parsedamountMin/amountMax. Never present a single precise dollar figure. - "Recent" means recently disclosed, not recently traded. The law asks for a filing within 45 days of the transaction, but late filings exist and some trail the trade by months or more, so read
disclosureDelayDayson every row rather than assuming a ceiling. Each trade carries bothtransactionDateanddisclosureDate, plusdisclosureDelayDays. Always state which date you are quoting. - Chambers are
SENATEandHOUSE. Each trade also carriesparty(a word, such asRepublicanorDemocrat),state, andowner, the filing's own text for whose account it was. Values seen include an empty string andSelf(both the member),Spouse,Joint(the member with a spouse) andDependent. - Source: official House Clerk and Senate eFD filings, updated daily.
Prerequisites
- A free
SENTISENSE_API_KEY. Get one at https://app.sentisense.ai/get-api-key. Send it on every call: a request without a valid key gets at most a shaped crawler-facing preview slice, never the dataset, and that fallback is not a contract you can build on. No key yet? Follow "No key yet" in the0-sentisense-onboardingskill: one POST returns a temporary free key the agent can use right away and a link the user opens to keep it. - Any HTTP client. Plain
curlworks, or Python 3.8+ using only the standard library (urllib,json); no third-party packages required. On macOS python.org installs can raiseCERTIFICATE_VERIFY_FAILED(missing CA certs): run the bundledInstall Certificates.command, use the system/usr/bin/python3, or usecurl. - Network access to
https://app.sentisense.ai. - Read-only scope. Every endpoint here is a GET. Nothing this skill does can place a trade, move money, or modify account state.
| Tier | Quota | Rate | Congressional data |
|---|---|---|---|
| Free | 1,000 requests/month | 30 requests/min | preview slice (top N per endpoint) |
| PRO ($15/mo) | Unlimited | 300 requests/min | full history and full lists |
A free key runs every workflow below at preview depth: preview-gated endpoints return the newest or most active few rows of a real response, and totalCount gives the size of the whole window. The member lookup in workflow 3 goes through /politicians/directory, which a free key gets in full.
Permissions
- Network: HTTPS to app.sentisense.ai only.
- Credentials: SENTISENSE_API_KEY from the environment.
- Shell: none required.
- Files: none.
How to Run
The REST recipe in this file is the primary path. A maintained command-line client is available as the separate sentisense-cli skill for hosts that prefer one.
Issue HTTP GET requests to https://app.sentisense.ai and synthesize the JSON into a concise, sourced answer. Authenticate every request with the X-SentiSense-API-Key header; keep the key in the shell environment and never place it in a query string or in user-facing output.
The politician endpoints return the wrapped envelope { isPreview, previewReason, data }. For /activity, /filings/{ticker}, and /members, .data is a list; for /member/{slug}, .data is an object { profile, recentTrades, topTickers } (read those keys, do not iterate it as a list). When isPreview is true, say so ("showing the free preview slice").
A preview is a slice, not the window. When isPreview is true and totalCount is larger than the rows returned, the rows are the newest (or most active) few of totalCount. Label them that way ("newest 5 of 80 disclosures, free preview"), never tally them as the window, and never infer absence from them: five rows with no purchase is not "Congress did not buy". A free key is never served rows past the preview: on /activity and /member/{slug} an offset at or beyond 5 returns an empty page with isPreview true, so do not page on a free key; report totalCount as the window size and the rows as the preview. A free request whose limit fits inside the preview (5 or fewer) comes back with isPreview: false, yet it is still only the head of the window, so compare totalCount with the rows you hold rather than trusting the flag alone.
A rate-limited call returns 429 with a Retry-After header; back off for the indicated seconds rather than serving a stale value.
rows = raw.get("data", []) if isinstance(raw, dict) else raw
Endpoints
GET /api/v1/politicians/activity: recent congressional trades across all members, sorted by disclosure date (most recently disclosed first). QuerylookbackDays(1-365, default 90) to control the window. Free: the newest 5 rows of the window; PRO: pages the whole window. This feed is paged: querylimit(default 200, max 500; above 500 is clamped) andoffset, and readtotalCountfor the size of the whole window.totalCountsits on the envelope next toisPreview, not insidedata, and on PROoffset + data.length < totalCountmeans another page is waiting (on a free key it never does; see the preview rule above). One call is one page, not the window: a 30-day window runs to several hundred trades and a full year to several thousand, so page any window wider than about a week before counting, ranking or saying who traded what. Each trade:politicianName,firstName,lastName,chamber,party,state,bioguideId,imageUrl,ticker,assetDescription,assetType(Stock,ETF, orStock Option),assetMetadata(null, or{kind:"OPTION", optionType, strikePrice, expirationDate}),transactionType(PURCHASE/SALE/EXCHANGE/OTHER),transactionDate,disclosureDate,disclosureDelayDays,amountRange,amountMin,amountMax,owner,urlSlug.amountMinandamountMaxcan be null on the odd row whose band did not parse; quote the rawamountRangethere and sort it last.GET /api/v1/politicians/filings/{ticker}: congressional trades for one stock, most recently disclosed first. QuerylookbackDays(1-365, default 90) to set the window. Free: the newest 3 rows plustotalCountfor the whole window; PRO: the full list in one response, not paged.GET /api/v1/politicians/members: current members of Congress with trading summaries, sorted by total trade count. Free: the 5 most active members plustotalCount; PRO: the full list in one response. This answers "who trades the most"; it is not a name lookup on a free key, because almost every member sits outside its top 5. Use the returnedurlSlugto drill into a member.GET /api/v1/politicians/directory: every tracked member of Congress and theurlSlugthat identifies them, including members who have left (former: true,servedUntil). Queryq(case-insensitive match on name, state or slug),limit(default 50, max 200) andoffset. Summary only, no trade data. Not tier-gated, so a free key gets the same full response as PRO, and it does not count against the monthly quota. Response:{ isPreview, previewReason, data: { members, totalCount } }(heretotalCountsits insidedata); each member carriesurlSlug,displayName,chamber,party,state. This is the way to turn a name into a slug on any tier.GET /api/v1/politicians/member/{slug}: one politician's profile: summary stats, recent trades, and top tickers. Free: the fullprofileandtopTickers, but only the newest 5recentTrades; PRO: full detail.recentTradesis one page, newest transaction first: querylimit(default 200, max 500) andoffsetto walk it, and readtotalCountfor the size of the whole history.totalCountsits on the envelope next toisPreview, not insidedata. On PRO most members fit in one default page, so the default request usually returns their complete history. ChecktotalCountbefore you summarize anyway, because the tail is extreme: a few dozen members exceed one page and the heaviest single filer has disclosed over twelve thousand trades.profileandtopTickersdescribe the whole history whatever page you request, on either tier.
Workflows
1. This week's congressional trades
Identify your client. Send a User-Agent naming your agent runtime and this skill, for
example OpenClaw/1.4 (politicians-stock-tracker) or ClaudeCode/2.1 (politicians-stock-tracker). Substitute your own runtime and
version if neither matches. You can also volunteer what your agent is called by adding an
agent/<your-agent-name> token inside the same parentheses, as in
OpenClaw/1.4 (politicians-stock-tracker; agent/research-desk). All of it is optional, and it is what tells
us this skill has real integrations behind it, so it gets prioritized and you get notice before it
changes.
curl -s -H "X-SentiSense-API-Key: $SENTISENSE_API_KEY" \
"https://app.sentisense.ai/api/v1/politicians/activity?lookbackDays=7"
Output template:
CONGRESS · LAST {days}d · {n} disclosures
─────────────────────────────────────────
{transactionDate} {member} ({party}-{state}) {ticker} {PURCHASE|SALE} {amountRange} +{disclosureDelayDays}d
{transactionDate} {member} ({party}-{state}) {ticker} {PURCHASE|SALE} {amountRange} +{disclosureDelayDays}d
MOST ACTIVE {member} ({trades}) MOST TRADED {ticker} ({trades})
Order the rows by the top of the amountRange band, largest first, and keep the delay column on every row. party arrives as a word, so shorten it to its initial for the {party}-{state} column. The two footer counts are tallied from the rows you actually received, so say how many that was rather than implying the whole week; on a free key that is the newest 5 of totalCount, so print the header as "newest 5 of {totalCount} disclosures (free preview)" and leave the footer tallies out.
2. Has Congress traded a specific stock?
curl -s -H "X-SentiSense-API-Key: $SENTISENSE_API_KEY" \
"https://app.sentisense.ai/api/v1/politicians/filings/NVDA"
Report purchases vs sales (transactionType), which members and parties, and the transaction-to-disclosure gap.
3. A specific politician's activity
# resolve the name to a slug (works in full on a free key; read data.members[].urlSlug)
curl -s -H "X-SentiSense-API-Key: $SENTISENSE_API_KEY" \
"https://app.sentisense.ai/api/v1/politicians/directory?q=pelosi"
# then pull their profile and history
curl -s -H "X-SentiSense-API-Key: $SENTISENSE_API_KEY" \
"https://app.sentisense.ai/api/v1/politicians/member/{slug}"
When q matches more than one member, pick by displayName, chamber and state, or ask. On PRO, compare totalCount with recentTrades.length and page with offset when the history runs past one page. On a free key the profile and topTickers are whole but recentTrades is the newest 5 of totalCount: report the profile totals and top tickers as the full picture, and the trades as "newest 5 of {totalCount}". For "which politicians trade the most", use /politicians/members instead, which ranks by trade count (top 5 on a free key).
4. Follow the convergence. When a congressional buy lines up with institutional 13F accumulation (institutional-13f-tracker) or insider buying (insider-trading-tracker) on the same ticker, that agreement is the signal worth surfacing. Say so explicitly and cite each source.
Answering well
- Always distinguish
transactionDate(when they traded) fromdisclosureDate(when it was reported), and mention the delay. - Quote the
amountRangeband, never a single invented number. - Attribute party, chamber, and state; flag when
ownerisSpouse,JointorDependentrather than the member alone (an emptyownerandSelfboth mean the member). - Report only what the API returns. Do not infer trades, amounts, or motives that are not in the data, and do not frame any of it as advice. This is public-disclosure data presented for education.
Going further
Free covers every workflow above at a preview depth. PRO ($15/mo) lifts the monthly cap (no monthly limit, just a 300/min rate) and returns full congressional history and full member lists, plus institutional flows, insider detail, and AI insights across the SentiSense API. Apply coupon AGENTS at checkout for a builder launch discount: https://app.sentisense.ai/pricing?coupon=AGENTS
For the full REST reference on every endpoint this skill touches, install the sentisense skill; for the complete CLI command set, install sentisense-cli.
ClawHub Skill: clawhub.ai/TheSentiTrader/politicians-stock-tracker
SentiSense is a read-only financial intelligence API. This data is for informational and educational purposes only, not investment advice.
