Recipe: Lobbying activity

The task

You want a company’s federal political footprint: lobbying disclosures, PAC finances, federal contract awards, and regulatory engagement.

Tools used: search_filings (senate-lobbying pack — exposed on the combined gateway as senate_lobbying_search_filings, see below), search_committees + committee_financials (+ optionally search_contributions), usa_recipient_profile, search_documents (federal-register pack, similarly exposed as federal_register_search_documents).

Calls: 4-6.

Copy-paste prompt

Map <company>'s federal political footprint using Pipeworx: lobbying disclosures (spend, issue
areas), PAC receipts, federal contract awards, and any Federal Register engagement. For the
contract-awards figure, confirm the awards actually name <company> as the recipient — don't just
report a number that happened to match a keyword search.

What a good answer looks like

senate_lobbying_search_filings({ client_name: "Microsoft", filing_year: 2025 })

returns (live call, 2026-08-06 — trimmed):

{
  "total": 88,
  "filings": [
    {
      "registrant": "AKIN GUMP STRAUSS HAUER & FELD",
      "client": "MICROSOFT CORPORATION",
      "filing_year": 2025, "period": "1st Quarter (Jan 1 - Mar 31)",
      "type": "Registration", "issues": ["Computer Industry", "Science/Technology"]
    }
  ]
}

A trustworthy answer has:

  • registrant distinct from client — lobbying firms report income (what the client paid them); in-house lobbyists report expenses. Don’t sum the two as if they were the same unit.
  • issues naming the actual issue-area codes filed, not a paraphrase.
  • for FEC data, a committee_id you can chain into committee_financials for cycle-by-cycle totals.

A plausible-sounding failure looks like a huge, real, correctly-formatted dollar figure — for the wrong company. This is live, not hypothetical, and it’s the single biggest risk in this recipe:

usa_recipient_profile({ recipient_name: "Microsoft", start_date: "2025-01-01", end_date: "2025-12-31" })
// → { recipient_name: "Microsoft", total_results: 0, awards: [
//     { award_id: "36C10B22F0089", recipient_name: "DELL FEDERAL SYSTEMS L.P",
//       award_amount: 1590136261.87, awarding_agency: "Department of Veterans Affairs",
//       description: "VA MICROSOFT ENTERPRISE LICENSE AGREEMENT." },
//     { award_id: "FA877223F0001", recipient_name: "DELL MARKETING L.P.",
//       award_amount: 1271592441.44, awarding_agency: "Department of Defense",
//       description: "MICROSOFT ESA AGREEMENT" },
//     ...
//   ] }

Every award here is real. None of them were awarded to Microsoft — every recipient_name in the results says Dell. Microsoft only appears in the contract description (Dell resells Microsoft licensing to federal agencies under its own contract vehicle). If you read the top-level recipient_name: "Microsoft" echo and report the award totals as “Microsoft’s federal contract awards,” you’d be attributing hundreds of millions of dollars in Dell revenue to the wrong company. Checked against source (mcps/usaspending/src/index.ts, recipientProfile): the tool sends your recipient_name to USAspending as a free-text keyword search across award text (including descriptions), not as an actual recipient-name filter. Always check that awards[].recipient_name matches the company you asked about before reporting any dollar figure from this tool — filed as fleet task #161 for a fix.

Step-by-step tool calls

On the combined gateway endpoint, pack-local names that collide across packs are exposed slug-prefixed. Both search_filings and search_documents collide (senate-lobbying vs. sec-xbrl for the former; Federal Register vs. Swedish Riksdagen vs. USPTO PTAB for the latter) — the examples below use the resolved prefixed names, which is the reliable form. (Bare search_filings with ambiguous arguments currently returns a hard ambiguous_tool_name error rather than guessing; bare search_documents currently auto-routes to Federal Register via the collision router, but don’t rely on that continuing to hold as more packs ship.)

1. Lobbying disclosures

senate_lobbying_search_filings({ client_name: "Microsoft", filing_year: 2025 })

Aggregate by quarter for a trend. Lobbying firms report income; in-house lobbyists report expenses — sum only within one type.

2. PAC finances

search_committees({ query: "Microsoft" })
// → committees whose name matches (PACs, super PACs), with committee IDs — live example returns
//   both "MICROSOFT CORPORATION STAKEHOLDERS VOLUNTARY PAC - MSVPAC" and an unrelated 1996-era
//   "COMMITTEE TO FIGHT MICROSOFT CORP" (opposition PAC, not affiliated) — check the name

committee_financials({ committee_id: "C00227546" })
// → { cycles: [ { cycle: 2026, receipts: 1253480.95, disbursements: 1305253.04,
//     cash_on_hand: 241153.16, contributions: 1253480.95 }, ... ] }

For itemized donors — who gave to the PAC, employer, amount, date — chain search_contributions with the committee ID:

search_contributions({ committee_id: "C00227546", cycle: 2026 })
// → { total: 16280, contributions: [ { contributor: "LORD, KATHRINE", amount: 1300,
//     employer: "MICROSOFT", occupation: "DIR GTM MGR", city: "REDMOND" }, ... ] }

Note the direction: this is money coming into the committee from individual donors, not the PAC’s own outbound giving to candidates — don’t characterize this as “the PAC gave $X to candidate Y” from this data.

3. Federal contract awards — verify the recipient

usa_recipient_profile({ recipient_name: "Microsoft", start_date: "2025-01-01", end_date: "2025-12-31" })

Check every awards[].recipient_name against the company you queried before summing or reporting — see “What a good answer looks like” above. Companies that both lobby and hold large federal contracts (as an actual, verified recipient) have a different posture than ones that just lobby.

4. Federal Register engagement

federal_register_search_documents({ query: "Microsoft" })

Use this to spot proposed-rule comments and mentions, but expect low relevance on a bare company name — live-verified, a plain "Microsoft" query returned 10,000 hits, with the top results being unrelated IRS meeting notices held over “Microsoft Teams.” Narrow with agency or type filters, or search topically instead (e.g. the issue areas surfaced by the lobbying filings) and check for the company by name within results.

Citation pattern

Microsoft federal political footprint (2025): 88 Senate LDA filings per Senate LDA, top issue areas Computer Industry / Science-Technology. Microsoft Corporation Stakeholders PAC (MSVPAC) 2026-cycle-to-date receipts $1.25M per FEC. Federal contract awards: not independently confirmed — the keyword-search tool’s results were all awarded to other companies (Dell) reselling Microsoft licensing, not Microsoft directly; no verified Microsoft-as-recipient figure available pending fleet task #161.

Use the prompt

prompts/get({ name: "lobbying_activity", arguments: { company: "Microsoft" } })

Caveats

  • usa_recipient_profile is a keyword search, not a recipient filter — it can attribute another company’s contract dollars to the company you queried. Always verify awards[].recipient_name before reporting a figure (fleet task #161).
  • Lobbying disclosures lag 45 days after the quarter ends. Q1 2026 isn’t fully visible until mid-May.
  • Affiliated PACs, and unaffiliated similarly-named ones. search_committees can return both a company’s real PAC and an unrelated opposition committee with the company’s name in its title (see the live example above) — check designation/organization_type, not just the name match.
  • search_contributions shows money into a committee, not the committee’s outbound giving — don’t characterize inbound itemized donations as the PAC’s political spending.
  • Soft money / 501(c)(4)s. Not in FEC data. Public lobbying disclosures are the floor, not the full picture.
  • search_filings and search_documents both collide across multiple packs. Use the slug-prefixed names shown above rather than the bare form.

Last reviewed August 6, 2026