FARA Foreign Influence Intelligence & Monitoring is an Apify actor on ApifyForge. Monitor U.S. FARA foreign-agent activity, don't just search it. Scored registrant and foreign-principal profiles, diligence-routing decisions, foreign-principal influence replay, and cross-run change detection — what... It costs $0.04 per result-returned. Best for teams who need automated fara foreign influence intelligence & monitoring data extraction and analysis. Not ideal for use cases requiring real-time streaming data or sub-second latency. Maintenance pulse: 90/100. Last verified March 27, 2026. Built by Ryan Clinton (ryanclinton on Apify).
FARA Foreign Influence Intelligence & Monitoring
FARA Foreign Influence Intelligence & Monitoring is an Apify actor available on ApifyForge at $0.04 per result-returned. Monitor U.S. FARA foreign-agent activity, don't just search it. Scored registrant and foreign-principal profiles, diligence-routing decisions, foreign-principal influence replay, and cross-run change detection — what changed, who to watch, why now — from official DOJ data.
Best for teams who need automated fara foreign influence intelligence & monitoring data extraction and analysis.
Not ideal for use cases requiring real-time streaming data or sub-second latency.
What to know
- Results depend on the availability and structure of upstream data sources.
- Large-scale runs may be subject to platform rate limits.
- Requires an Apify account — free tier available with limited monthly usage.
Maintenance Pulse
90/100Cost Estimate
How many results do you need?
Pricing
Pay Per Event model. You only pay for what you use.
| Event | Description | Price |
|---|---|---|
| result-returned | Charged per screening result returned. | $0.04 |
Example: 100 events = $4.00 · 1,000 events = $40.00
Documentation

The moat is memory, not records. Most FARA tools tell you what exists; this one accumulates what changed and tells you what deserves attention today. Point it at the U.S. Department of Justice FARA (Foreign Agents Registration Act) database, name a watchlist, and every scheduled run remembers the last — building a longitudinal picture of foreign-influence activity that a same-day clone of the public records can't reproduce. Each run hands back a ranked attention queue (what changed, why now), so you read the three things that moved, not the three hundred that didn't.
Search the FARA database for foreign agent registrations, then get each registrant scored for descriptive foreign-influence exposure with a diligence-routing recommendation. Look up lobbying firms, PR agencies, and consultants registered as foreign agents, including their foreign principals, filing documents, and registration status. Get structured profiles combining data from three separate FARA API endpoints into a single unified record per registrant.
FARA Foreign Agent Registration Search queries the official efile.fara.gov API to build comprehensive registrant profiles. Each profile includes the registrant's name, address, registration and termination dates, a list of foreign principals (the governments, entities, or persons they represent), links to all filing documents, and an exposure decision (tier, score, recommended action, jurisdiction-nexus flags). Name a watchlist to monitor the same set across runs and get told what changed. The actor handles the FARA API's strict rate limits (5 requests per 10 seconds) automatically with built-in throttling and retry logic.
FARA registration is a lawful, public disclosure regime. The exposure score is descriptive context for a diligence workflow (breadth of foreign principals, nexus to jurisdictions on published U.S. government lists, and how active the representation is) — it is not an allegation of wrongdoing, and the recommended action is diligence routing, never a prohibition.
Built for analysts, compliance teams, journalists, and policy researchers who need not just FARA records, but a structured feed of registrants, foreign principals, filing activity, and diligence-routing signals — with optional cross-run change detection so a scheduled run tells you what moved.
Most FARA tools answer "who is registered?" This one is built to answer the questions that come next: what changed, who to care about, and why now. Name a watchlist (or portfolio) and the actor accumulates memory across runs — it tracks each foreign principal's footprint over time (is the Government of Turkey expanding its U.S. representation?), each agent's momentum (which firms are winning foreign-representation business?), and the filing-activity velocity behind both. The longer you run it on a schedule, the more that accumulated history is worth — and a same-day clone of the public records can't reproduce it.
What do you need to do?
| Need | What this actor does |
|---|---|
| Find every agent representing a country | country search |
| Monitor new foreign-influence activity | name a watchlist / portfolio |
| Build compliance / diligence workflows | exposure tier + recommended action |
| Feed a SIEM / case system | structured JSON + webhooks |
| Build an entity graph | outputEntity: relationships (Neo4j/Gephi/Maltego edges) |
| Analyse a foreign principal across all its agents | outputEntity: principals |
| Track filing activity over time | outputEntity: timeline |
Why this over raw DOJ search?
| Capability | DOJ eFile site | Basic scraper | This actor |
|---|---|---|---|
| Unified registrant profile | Partial | Partial | Yes |
| Principal relationships (flat, graph-ready) | Manual | Yes | Yes |
| Filing-document signals | Manual | No | Yes |
| Cross-run change detection | No | Rare | Yes |
| Foreign-influence exposure routing | No | No | Yes |
| Dashboard digest | No | No | Yes |
| API / webhook ready | No | Basic | Yes |
Why this is different
Most FARA tools tell you what exists. This one tells you what changed.
Most FARA tools give you records. This one accumulates memory.
Most FARA tools answer "Who represents Turkey?" This one answers "Is Turkey expanding its U.S. representation footprint?", with the per-run countHistory, representationTrend, and majorEvents to prove it.
The enduring entities are the foreign principals — the governments, embassies, state-owned enterprises, and sovereign funds that persist while their agents come and go. This actor tracks them longitudinally, so the value compounds the longer you run it on a schedule. That accumulated state is the part a competitor can't backfill after the fact.

Common monitoring tasks
| Task | Where the answer is |
|---|---|
| What deserves attention today? | watchlist.attentionQueue (ranked, with whyNow + changeImportance) |
| Is a foreign principal expanding its U.S. representation? | principalHistory (representationTrend, countHistory, majorEvents) |
| Which firms are winning foreign-representation business? | agentMomentum (trend: expanding / contracting) |
| Which actors sit at the centre of the representation network? | networkSignals + run-level mostRepresentedPrincipals |
| Is filing activity accelerating? | filingSignals.velocityStatus + velocityChangePct |
| How does a country's representation look right now? | countrySummary |
| Which counterparties should a reviewer look at first? | recommendedAction + exposureTier |

Ready-to-run examples
One-click task pages, each preset for a common job (open, hit Run):
- Find U.S. Agents Representing a Foreign Government — every U.S. agent registered for a given government, with exposure decisions.
- Check if a Company Is a Registered Foreign Agent — KYC/due-diligence lookup: principals, filings, and an exposure decision for a firm.
- Monitor New Foreign-Agent Registrations — newly filed registrations since a date, scored for exposure.
- Map a Foreign Government's U.S. Representation Network — registrant→principal graph edges, ready for Neo4j / Gephi / Maltego.
- Which Foreign Principals Have the Most U.S. Agents — aggregate by foreign principal: agent counts, countries, exposure.
- Build a FARA Filing Activity Timeline — chronological filing events per foreign agent.
What data can you extract?
| Data Point | Source | Example |
|---|---|---|
| Registration number | FARA registry | 6942 |
| Registrant name | Registration record | Podesta Group, Inc. |
| Business name | Registration record | Podesta Group |
| Status | Registry lookup | Active, Terminated |
| Registration date | Filing metadata | 01/15/2010 |
| Termination date | Filing metadata | 06/30/2017 |
| Address | Registration record | 1001 G Street NW, Suite 1000 West |
| Foreign principals | Principals endpoint | Name, country, state, registration date |
| Filing documents | Documents endpoint | Type, date, PDF download link |
| Exposure tier | Decision layer | LOW / MEDIUM / HIGH / CRITICAL |
| Exposure score | Decision layer | 72 (0-100, descriptive) |
| Recommended action | Decision layer | enhanced-due-diligence / manual-review / monitor / clear |
| Jurisdiction flags | Published U.S. lists | ADVERSARY_NEXUS, STATE_SPONSOR_NEXUS |
| Adversary countries | 15 CFR §7.4 list | ["Russia", "China"] |
| Change flag (watchlist) | Cross-run diff | NEW / ESCALATED / CHANGED / UNCHANGED |

Why use FARA Foreign Agent Registration Search?
The FARA efile website provides basic search, but assembling a complete picture of a registrant requires clicking through multiple pages and endpoints: the registrant list, the foreign principals list, and the documents list. Cross-referencing entities across these datasets manually is tedious and error-prone, especially when researching dozens of registrants or tracking all agents working for a specific country.
This actor combines all three API endpoints into a single query. Search by registrant name, foreign principal, country, or registration number and get back unified profiles with everything in one record.
Built on the Apify platform, FARA Foreign Agent Registration Search gives you:
- Scheduling -- monitor new registrations weekly or monthly
- API access -- trigger searches programmatically from Python, JavaScript, or any HTTP client
- Monitoring -- get notified when runs complete or fail
- Integrations -- connect to Zapier, Make, Google Sheets, or webhooks

Features
- Multi-filter search -- search by registrant name, foreign principal name, country, registration number, or new registrations since a specific date
- Unified profiles -- combines registrant data, foreign principals, and filing documents from 3 separate API endpoints into one record
- Status filtering -- search active agents, terminated agents, or both
- Foreign principal lookup -- find which U.S. agents represent a specific foreign government or entity
- Document links -- includes direct links to registration statements, supplemental statements, and other FARA filings
- New registration monitoring -- filter for registrants registered after a specific date to track new foreign lobbying activity
- Rate limit handling -- built-in throttling (2.1 seconds between requests) with automatic retry on 429 responses
- Direct lookup -- look up a specific registrant by registration number for instant access
- Foreign-influence exposure scoring -- a descriptive 0-100 exposure score, tier, and diligence-routing recommendation per registrant, with an auditable component breakdown
- Filing-document signals -- rule-based flags (recent supplemental, informational materials, termination, latest document age) derived from each registrant's filings
- Relationship & filing output entities -- pivot to one flat row per registrant-principal pair (graph-ready) or per filing document
- Cross-run change feed -- name a watchlist and a scheduled run reports new registrations, status changes, new/removed principals, new documents, and exposure escalations;
diffOnlymode emits only what changed - Dashboard digest -- a single run-level record with tier counts, top principal countries, top document types, top agents by principal count, and a ranked review queue
- Flexible name matching --
contains,exact, orfuzzy(token-set) registrant-name matching
Use cases for searching FARA data
Investigative journalism
Journalists research which U.S. lobbying firms and PR agencies represent foreign governments. Search by country to identify all agents working for a specific nation and review their filing documents.
Policy research and advocacy
Think tanks and policy organizations track foreign lobbying activity around specific legislation. Monitor new registrations and filing documents to understand which foreign interests are active on Capitol Hill.
Compliance and due diligence
Law firms and compliance teams verify whether business partners or counterparties are registered as foreign agents. FARA registration status is a key data point in KYC (Know Your Customer) and anti-corruption due diligence.
Academic research
Political scientists study patterns in foreign lobbying -- which countries hire the most agents, how lobbying spending correlates with policy outcomes, and how the FARA registry has evolved over time.
Competitive intelligence for lobbying firms
Government affairs firms track which competitors are picking up foreign principal contracts and which countries are actively seeking new U.S. representation.
National security analysis
Security analysts monitor registrations linked to adversarial nations to track potential foreign influence operations.
How to search FARA registrations
- Choose a search filter -- Enter a registrant name, foreign principal name, country, registration number, or new-since date. At least one filter is required.
- Set status filter -- Choose whether to search active agents, terminated agents, or both.
- Configure options -- Enable or disable foreign principal and document fetching depending on how much detail you need.
- Run the actor -- Click "Start" to begin the search. The actor fetches registrants, filters matches, then enriches each with principals and documents.
- Download results -- Once finished, download your data as JSON, CSV, or Excel from the Dataset tab.
Input parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
registrantName | string | No* | -- | Search for registrant/agent by name (case-insensitive substring match). |
foreignPrincipalName | string | No* | -- | Search by foreign principal name (the government, entity, or person represented). |
country | string | No* | -- | Filter by country of foreign principal (e.g., China, Russia, Saudi Arabia). |
registrationNumber | string | No* | -- | Look up a specific registrant by FARA registration number. |
status | string | No | Active | Registration status filter: Active, Terminated, or Both. |
includeDocuments | boolean | No | true | Fetch filing document links for each registrant. Slower due to rate limits. |
includePrincipals | boolean | No | true | Fetch foreign principals for each registrant. |
newSinceDate | string | No* | -- | Only return registrants registered after this date (MM-DD-YYYY format). |
maxResults | integer | No | 50 | Maximum number of registrant profiles to return (1-5,000). |
matchMode | string | No | contains | How registrantName is matched: contains (substring), exact (full-string), or fuzzy (token-set similarity — catches word reorderings and minor variants). |
minExposureTier | string | No | -- | Only return registrants at or above this exposure tier (LOW/MEDIUM/HIGH/CRITICAL). Lower-tier registrants are counted in the summary, never dropped silently. |
outputProfile | string | No | standard | Detail per registrant: minimal (decision only), standard (+ risk factors), full (+ raw principal/document arrays). |
outputMode | string | No | records | records = one row per registrant + a run summary. dashboard = a single digest record (counts, tiers, review queue, top countries, top document types, top agents), no per-registrant rows. |
outputEntity | string | No | registrants | Row grain: registrants (unified profile), relationships (graph edges source→target/REPRESENTS, Neo4j/Gephi/Maltego-ready), filings (one row per filing document), principals (aggregate by foreign principal — registrant counts, countries, agents), or timeline (one chronological event per filing). Charged per registrant regardless of grain. |
watchlistName | string | No | -- | Name a watchlist to enable cross-run monitoring. Results are diffed against your last run under the same name and tagged with temporalSignals (change flag, reasons, events). Leave blank for a stateless one-off screen. |
portfolioName | string | No | -- | Alias for watchlistName — same cross-run monitoring, friendlier term for portfolio tracking. watchlistName wins if both are set. |
watchMode | string | No | fullWithDiff | Only applies with a watchlist: fullWithDiff emits every registrant with its diff; diffOnly emits only registrants that changed since the last run (a clean change feed). The summary always covers the full screened set. |
proxyConfiguration | object | Yes | Apify Proxy | Required. The FARA source restricts automated access from shared/datacenter IPs on its per-registrant endpoints, so foreign-principal and document enrichment needs a proxy. Apify Proxy (datacenter) is the default and works; if principals or documents come back empty, switch the proxy group to Residential. |
*At least one search filter is required.
Input examples
Search by country:
{
"country": "China",
"status": "Active",
"maxResults": 50
}
Look up a specific registration:
{
"registrationNumber": "6942"
}
Search by registrant name:
{
"registrantName": "Mercury",
"status": "Both",
"includeDocuments": true,
"includePrincipals": true
}
Find new registrations:
{
"newSinceDate": "01-01-2025",
"maxResults": 100
}
Search by foreign principal:
{
"foreignPrincipalName": "Embassy",
"status": "Active",
"maxResults": 25
}
Input tips
- Start with principals disabled for speed -- Fetching foreign principals requires additional API calls per registrant. Disable
includePrincipalsandincludeDocumentsfor faster initial searches, then re-run with full detail on interesting results. - Use country filter for broad searches -- Searching by country across active registrants gives you a complete picture of which firms represent a specific nation.
- Combine name and country -- Use both
registrantNameandcountrytogether to narrow results when searching for a specific firm's work for a particular country.
Output example
Each item in the output dataset represents one FARA registrant profile:
{
"recordType": "registrant",
"registrationNumber": "6942",
"registrantName": "Mercury Public Affairs, LLC",
"businessName": "Mercury Public Affairs",
"status": "Active",
"registrationDate": "03/15/2019",
"terminationDate": null,
"address": "1001 G Street NW, Suite 1000 West",
"city": "Washington",
"state": "DC",
"zip": "20001",
"country": "United States",
"foreignPrincipals": [
{
"name": "Republic of Turkey",
"country": "TURKEY",
"state": "",
"registrationDate": "03/15/2019"
}
],
"filingDocuments": [
{
"type": "Registration Statement",
"stampedDate": "2019-03-20T00:00:00",
"documentUrl": "https://efile.fara.gov/docs/6942-Registration-Statement-20190320.pdf"
}
],
"totalPrincipals": 1,
"totalDocuments": 2,
"exposureScore": 33,
"exposureTier": "MEDIUM",
"recommendedAction": "monitor",
"grade": "C",
"scoreBreakdown": {
"jurisdictionNexus": 0,
"principalBreadth": 7,
"recentActivity": 10,
"documentActivity": 15,
"statusSignal": 8,
"total": 33
},
"filingSignals": {
"hasRecentSupplemental": true,
"hasInformationalMaterials": true,
"hasTermination": false,
"latestDocumentType": "Supplemental Statement",
"latestDocumentAgeDays": 14,
"documentCount": 6,
"documentsLast90Days": 4,
"documentsPrior90Days": 1,
"activitySpike": true,
"dormant": false,
"actualSupplementals": 3,
"expectedSupplementals": 4,
"filingCompleteness": 75
},
"riskFactors": [
"1 distinct foreign-principal country",
"Filed or registered within the last 12 months"
],
"jurisdictionFlags": [],
"principalCountries": ["TURKEY"],
"adversaryCountries": [],
"activeDisseminationActivity": false,
"summary": "Mercury Public Affairs, LLC: MEDIUM foreign-influence exposure; representing 1 jurisdiction(s) (TURKEY).",
"agentContract": {
"recommendedAction": "monitor",
"exposureTier": "MEDIUM",
"requiresHumanReview": false
},
"sourceUrl": "https://efile.fara.gov/ords/fara/f?p=1235:11:::NO::P11_REG_NUMBER:6942"
}
In watchlist mode each record also carries a temporalSignals block (changeFlag, changeReasons[], previousScore, scoreDelta, events[], firstSeenAt, runsSeen), and the run emits a recordType: "summary" (or "dashboard") record with tier/action counts, top principal countries, the highest-exposure registrant, a ranked reviewQueue, and requiresHumanReview. The same summary is mirrored to the SUMMARY key-value store key.

Output fields
| Field | Type | Description |
|---|---|---|
registrationNumber | string | FARA registration number |
registrantName | string | Name of the registered agent |
businessName | string | Business/company name of the registrant |
status | string | Registration status: Active, Terminated, or New |
registrationDate | string | Date of initial registration |
terminationDate | string/null | Date registration was terminated (null if still active) |
address | string | Street address of the registrant |
city | string | City |
state | string | State |
zip | string | ZIP code |
country | string | Country of the registrant |
foreignPrincipals | object[]/null | List of foreign principals with name, country, state, and registration date (null if not requested) |
filingDocuments | object[]/null | List of filing documents with type, stamped date, and document URL (null if not requested) |
totalPrincipals | number/null | Count of foreign principals |
totalDocuments | number/null | Count of filing documents |
exposureScore | number | 0-100 descriptive foreign-influence exposure |
exposureTier | string | LOW / MEDIUM / HIGH / CRITICAL |
recommendedAction | string | Diligence routing: clear / monitor / manual-review / enhanced-due-diligence |
grade | string | A-F at-a-glance band (A = lowest exposure) |
scoreBreakdown | object | Component contributions to exposureScore: jurisdictionNexus + principalBreadth + recentActivity + documentActivity + statusSignal (total capped at 100) |
filingSignals | object | Rule-based document signals: hasRecentSupplemental, hasInformationalMaterials, hasTermination, latestDocumentType, latestDocumentAgeDays, documentCount, filing-activity signals documentsLast90Days, documentsPrior90Days, activitySpike, dormant (active + no filing in 365+ days), velocityChangePct (filing volume change, last 90 days vs prior 90), velocityStatus (accelerating / steady / decelerating / inactive), and supplemental-cadence actualSupplementals / expectedSupplementals / filingCompleteness (0-100, from FARA's 6-month supplemental rule) |
networkSignals | object | { degree, networkRole } — how many foreign principals this registrant represents + a plain-language centrality role (hub / connected / peripheral). The run summary's mostRepresentedPrincipals lists the principal-side hubs. |
riskFactors | string[] | Human-readable factors behind the score (omitted on minimal profile) |
jurisdictionFlags | string[] | ADVERSARY_NEXUS (15 CFR §7.4), STATE_SPONSOR_NEXUS (U.S. State Dept) |
principalCountries | string[] | Distinct foreign-principal countries |
adversaryCountries | string[] | Principal countries on the 15 CFR §7.4 foreign-adversary list |
activeDisseminationActivity | boolean | Currently distributing a principal's informational materials |
summary | string | Plain-English one-line exposure summary |
agentContract | object | Compact { recommendedAction, exposureTier, requiresHumanReview } for agents/webhooks |
temporalSignals | object | Cross-run change block (watchlist mode only) |
sourceUrl | string | Direct URL to the registrant's page on efile.fara.gov |
Output entities
Set outputEntity to reshape the same screened data for different consumers:
registrants(default) — one unified profile per registrant (the shape above).relationships— graph-ready edges, one row per registrant-principal pair withsource(registrant) →target(principal) andrelationship: "REPRESENTS", plus the exposure context. Drops straight into Neo4j, Gephi, Linkurious, Memgraph, or Maltego to map the agent → foreign-principal → country network.filings— one row per filing document (type, stamped date, PDF link, named principal).timeline— one chronological event per filing, with a stableeventType(NEW_REGISTRATION/SUPPLEMENTAL_STATEMENT/AMENDMENT/TERMINATION/INFORMATIONAL_MATERIALS/ …). Sort byeventDatefor an activity timeline.principals— flip the view: one aggregate record per foreign principal, withactiveRegistrants,totalRegistrants,countries,highestExposure, and theagentsrepresenting it. Answers "who represents the Government of Turkey, and how exposed are they?" Counts cover the run's result set, not all-time FARA history.
For a flat compliance export, use outputEntity: registrants with outputProfile: minimal (decision fields only). Every grain is charged per registrant, never per reshaped row.
Monitoring & longitudinal stats
When you set a watchlistName (or portfolioName), each run diffs against your last run under that name and accumulates memory across runs. The first run is a baseline (every registrant NEW, trend: NEW); change signals accrue from the second run onward.
Per registrant (in temporalSignals):
changeFlag(NEW / UNCHANGED / CHANGED / ESCALATED / DEESCALATED) +changeReasons[]+events[].changeSummary— compact{ newPrincipals, newDocuments, newCountry, escalated }for one-field alert rules.agentMomentum—{ newPrincipals, lostPrincipals, trend }where trend isexpanding/contracting/stable: is this firm winning or losing foreign-representation business?
Per foreign principal — the influence replay (on outputEntity: principals records, principalHistory):
registrantCountTrend(up / down / stable / new) vs last run +previousRegistrantCount+registrantCountDelta.representationTrend(expanding / contracting / stable / new) over the whole accumulated history — is this principal expanding its U.S. representation over time?countHistory—[{ runAt, count }], the representation footprint across every run (replay how China's footprint moved over 12 months).majorEvents—REPRESENTATION_EXPANDED/REPRESENTATION_CONTRACTED/NEW_COUNTRY.countriesSeen(union across all runs) +firstSeenAt+runsSeen.
Run-level (in watchlist):
attentionQueue— the digest answer to "what deserves attention today": each changed entity withwhyNow(the change reasons) +changeImportance(high / medium / low), ranked. Branch onchangeImportance == "high"to route only what matters.monitoringSummary—{ newRegistrants, newPrincipals, newDocuments, escalations, changed }.historical—{ averageExposure, maxExposure, trend (UP/DOWN/FLAT), changesLast30d, changesLast90d, totalRunsTracked }.

Country intelligence
When you supply a country, the run summary adds a countrySummary — { country, activeAgents, terminatedAgents, totalAgents, distinctPrincipals, newAgents (watchlist only), topRegistrants, topPrincipals } — the country-level read journalists and analysts reach for. The summary also carries mostRepresentedPrincipals (foreign principals represented by the most agents — the hubs of the representation network), and every registrant record carries networkSignals.degree (how many foreign principals it represents).

Cost
Pay-per-result: you are charged per registrant returned (charged per registrant even when outputEntity expands one registrant into many relationship or filing rows). dashboard mode returns a single digest and is charged as one result. Registrants filtered out below your minExposureTier are not returned and not charged, so minExposureTier and dashboard mode are the levers for paying only for what matters. New Apify accounts receive $5 of free platform credits each month.
Search FARA data using the API
Python
from apify_client import ApifyClient
client = ApifyClient("YOUR_API_TOKEN")
run = client.actor("ryanclinton/fara-foreign-agents").call(run_input={
"country": "China",
"status": "Active",
"includePrincipals": True,
"includeDocuments": True,
"maxResults": 25,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(f"{item['registrantName']} (#{item['registrationNumber']})")
for fp in item.get("foreignPrincipals") or []:
print(f" Principal: {fp['name']} ({fp['country']})")
JavaScript
import { ApifyClient } from "apify-client";
const client = new ApifyClient({ token: "YOUR_API_TOKEN" });
const run = await client.actor("ryanclinton/fara-foreign-agents").call({
country: "China",
status: "Active",
includePrincipals: true,
includeDocuments: true,
maxResults: 25,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
for (const item of items) {
console.log(`${item.registrantName} (#${item.registrationNumber})`);
(item.foreignPrincipals || []).forEach(fp =>
console.log(` Principal: ${fp.name} (${fp.country})`)
);
}
cURL
# Start the actor run
curl -X POST "https://api.apify.com/v2/acts/ryanclinton~fara-foreign-agents/runs?token=YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"country": "China",
"status": "Active",
"maxResults": 25
}'
# Fetch results (replace DATASET_ID from the run response)
curl "https://api.apify.com/v2/datasets/DATASET_ID/items?token=YOUR_API_TOKEN&format=json"
How the FARA search works
The actor builds unified registrant profiles by combining data from three FARA API v1 endpoints:

Step 1: Fetch registrant list
Depending on input filters, the actor fetches either active registrants, terminated registrants, both, or new registrations since a date. The FARA API returns all registrants in a single response per status category, so the actor loads the full list and filters locally by name and country.
Step 2: Filter and match
Registrant name matching uses case-insensitive substring search against both the Registrant_Name and Business_Name fields. Country filtering matches against each registrant's foreign-principal countries (country lives on the principal, not the registrant), so a country or foreignPrincipalName filter fetches principals for each candidate registrant to check for matches -- this is slower due to rate limits.
Step 3: Enrich with principals and documents
For each matched registrant (up to maxResults), the actor fetches the foreign principals list and filing documents from their respective API endpoints. The FARA API has a strict rate limit of 5 requests per 10 seconds, so the actor enforces a 2.1-second delay between requests with automatic 10-second backoff on 429 responses.
Step 4: Build unified profile
The registrant data, principals, and documents are merged into a single profile object. Field names in the FARA API are inconsistent (sometimes Registration_Number, sometimes Reg_Number), so the actor tries multiple key variations with case-insensitive matching.

Limitations
- Rate limits -- The FARA API allows only 5 requests per 10 seconds. Searches with many results and full enrichment (principals + documents) are inherently slow. A search returning 100 registrants with full enrichment takes approximately 10 minutes.
- API field inconsistency -- The FARA API uses inconsistent field names across responses. The actor handles known variations, but unexpected changes to the API could cause missing fields.
- No full-text search -- The actor searches by registrant name, principal name, and country only. It does not search within the content of filing documents.
- Local filtering -- The FARA API does not support server-side filtering by name. The actor downloads all registrants of the specified status and filters locally, which means even narrow searches require fetching the complete registrant list.
- Date format -- The
newSinceDateparameter requires MM-DD-YYYY format (U.S. date format), matching the FARA API's expected format. - No pagination -- The FARA API returns all registrants in a single response. The
maxResultsparameter limits output after filtering, not API calls.
Integrations
- Zapier -- Trigger workflows when new foreign agent registrations are detected.
- Make -- Build automated monitoring pipelines for foreign lobbying activity.
- Google Sheets -- Export registrant profiles to Google Sheets for collaborative analysis.
- Apify API -- Call the actor programmatically from any language or platform.
- Webhooks -- Get notified when a search completes and process results automatically.
Use in Dify
Drop this actor into Dify workflows via the Apify plugin's Run Actor node. Each registrant returns scored, classified, and routed as structured JSON -- enhanced-due-diligence / manual-review / monitor / clear plus the exposureTier and requiresHumanReview boolean your downstream node branches on. A raw FARA scraper pointed at the same registry returns registrant rows you still have to triage; this returns the diligence decision.
- Actor ID:
ryanclinton/fara-foreign-agents - Sample input (screen everyone representing a foreign principal from a given country):
{
"country": "Russia",
"status": "Active",
"minExposureTier": "MEDIUM",
"outputProfile": "standard"
}
A Dify if/else node routes on the per-registrant recommendedAction:
recommendedAction == "enhanced-due-diligence"→ open an EDD case / alert the compliance channelrecommendedAction == "manual-review"→ queue for an analystrecommendedAction == "monitor"→ add to a watchlist, no action nowrecommendedAction == "clear"→ log and continue
The compact agentContract object (recommendedAction, exposureTier, requiresHumanReview) lets an agent branch on one boolean — requiresHumanReview == true is the single gate for "stop and escalate." The riskFactors[] array is plain-English and usable verbatim in a case note or Slack message — no LLM rewriting needed.
Opt-in modes Dify workflows can leverage: set watchlistName to turn a scheduled run into a change feed (each record carries temporalSignals.changeFlag — branch on ESCALATED to fire an alert only when a registrant's exposure rose), or outputMode: "dashboard" to get a single run-level digest record instead of per-registrant rows.
FAQ
What is FARA? The Foreign Agents Registration Act (FARA) is a U.S. law that requires persons acting as agents of foreign principals in a political or quasi-political capacity to disclose their relationship with the foreign principal, as well as activities, receipts, and disbursements in support of those activities. It is administered by the DOJ's FARA Registration Unit.
What types of entities register under FARA? Lobbying firms, law firms, PR agencies, consultants, and individuals who engage in political activities, public relations, or lobbying on behalf of foreign governments, political parties, or entities controlled by foreign governments.
How current is the FARA data? The data comes from the official efile.fara.gov API, which is the DOJ's electronic filing system. Registrations and documents are available as soon as they are processed by the FARA Registration Unit.
Can I search for all agents representing a specific country?
Yes. Use the country filter with the country name (e.g., "China", "Russia", "Saudi Arabia"). The actor will return all registrants associated with foreign principals from that country.
Why is the search slow when using foreign principal name filter? When filtering by foreign principal name, the actor must fetch the principals list for each candidate registrant to check for matches. With the FARA API's rate limit of 5 requests per 10 seconds, this adds approximately 2 seconds per registrant checked.
What document types are in the filings? Common document types include Registration Statement, Supplemental Statement, Amendment, Exhibit A (agreement), Exhibit B (activities), Short-Form Registration Statement, and Termination filings.
Can I download the actual filing PDFs?
Yes. Each document in the filingDocuments array includes a documentUrl that links directly to the PDF filing on efile.fara.gov.
Related actors
| Actor | How to combine |
|---|---|
| Website Contact Scraper | Find contact information for registered lobbying firms identified in FARA searches |
| B2B Lead Gen Suite | Build comprehensive profiles of lobbying firms combining FARA data with business intelligence |
| WHOIS Domain Lookup | Research domain ownership for entities mentioned in FARA filings |
Support
Found a bug or have a feature request? Open an issue in the Issues tab on this actor's page. For custom compliance or research solutions, reach out through the Apify platform.
Related actors
Bulk Email Verifier — MX, SMTP & Disposable Detection at Scale
Verify email deliverability in bulk — MX records, SMTP mailbox checks, disposable detection (55K+ domains), role-based flagging, catch-all detection, domain health scoring (SPF/DKIM/DMARC), and confidence scores. $0.005/email, no subscription.
CFPB Complaint Intelligence — Vendor Risk & Screening
Turn 5M+ CFPB consumer complaints into decisions: screen companies pass / review / fail, score complaint-handling risk, monitor what changed since last run, benchmark cohorts, and build audit-ready due-diligence packs. Filter by company, product, state, and date. No API key.
Company Deep Research — SEC, GitHub, DNS & Social
Research any company from a domain. Get website metadata, Wikipedia summary, GitHub repos & stars, SEC EDGAR filings & ticker, academic papers, DNS records, and social media profiles in one JSON report.
SEC EDGAR Filing Search & Signal Engine — Risk, Events & Alerts
Search, rank, and monitor SEC EDGAR filings by keyword, company, or ticker. Every result carries an event category (8-K taxonomy), risk flags, and a signal score; watchlists add cross-filing pattern alerts. Filter by form type and date. Structured JSON with direct document links.
Ready to try FARA Foreign Influence Intelligence & Monitoring?
Run it on your own Apify account. Apify offers a free tier with $5 of monthly credits.
Open on Apify Store