<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Oleksyj Mokrousov</title>
    <description>The latest articles on DEV Community by Oleksyj Mokrousov (@alexperigon).</description>
    <link>https://dev.to/alexperigon</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4041800%2F24787fa5-afb1-4649-b76c-7afa15ff43a5.png</url>
      <title>DEV Community: Oleksyj Mokrousov</title>
      <link>https://dev.to/alexperigon</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/alexperigon"/>
    <language>en</language>
    <item>
      <title>Improve AI Output with a News Feed: Ground LLM Answers in Live Coverage</title>
      <dc:creator>Oleksyj Mokrousov</dc:creator>
      <pubDate>Fri, 21 Aug 2026 10:25:48 +0000</pubDate>
      <link>https://dev.to/alexperigon/improve-ai-output-with-a-news-feed-ground-llm-answers-in-live-coverage-81i</link>
      <guid>https://dev.to/alexperigon/improve-ai-output-with-a-news-feed-ground-llm-answers-in-live-coverage-81i</guid>
      <description>&lt;h2&gt;
  
  
  Why LLM answers drift without a live news feed
&lt;/h2&gt;

&lt;p&gt;Teams ship chatbots, research agents, and support copilots that sound confident on last week’s events - then invent partnerships, mix up CEOs, or cite outlets that never ran the story. Model weights are stale. A generic web scrape is noisy. What fixes &lt;strong&gt;AI output&lt;/strong&gt; for current events is a &lt;strong&gt;news feed for AI&lt;/strong&gt;: structured, filterable coverage you retrieve first, then pass into the prompt as evidence.&lt;/p&gt;

&lt;p&gt;Fintech and payments desks see this clearly. A model asked “what is Stripe doing in sponsorships?” without a feed will improvise. The same question with a &lt;strong&gt;grounded AI&lt;/strong&gt; context pack - recent articles and story clusters pinned to the company - stays on published facts.&lt;/p&gt;

&lt;p&gt;Developers usually ask:&lt;/p&gt;

&lt;p&gt;Why does raw LLM output fail on live news without a feed?&lt;/p&gt;

&lt;p&gt;How do you build a filtered news feed as LLM context?&lt;/p&gt;

&lt;p&gt;How do you pack article and story fields into prompts without drowning the model?&lt;/p&gt;

&lt;p&gt;When should you use Articles, Stories, Search Summarizer, or MCP?&lt;/p&gt;

&lt;p&gt;Which filters keep a company or executive context pack clean?&lt;/p&gt;

&lt;p&gt;The sections below answer each in order.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Try it live:&lt;/strong&gt; &lt;a href="https://perigon.io/sandbox?endpoint=articles" rel="noopener noreferrer"&gt;Articles sandbox&lt;/a&gt; · &lt;strong&gt;Read the docs:&lt;/strong&gt; &lt;a href="https://perigon.io/docs/api/entities" rel="noopener noreferrer"&gt;Entities&lt;/a&gt; · &lt;strong&gt;Compare plans:&lt;/strong&gt; &lt;a href="https://perigon.io/products/pricing/apis" rel="noopener noreferrer"&gt;API pricing&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Why raw LLM output fails on live news
&lt;/h2&gt;

&lt;p&gt;An LLM without retrieval answers from training cutoffs and pattern completion. That fails when the user needs &lt;strong&gt;live news for AI&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stale knowledge.&lt;/strong&gt; Product launches, partnerships, and regulatory moves after the cutoff never appear - or appear as confident fiction.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Homonym collisions.&lt;/strong&gt; “Stripe” and “Collison” hit sports, entertainment, and unrelated brands unless the feed uses entity IDs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No citations.&lt;/strong&gt; Fluent prose without publisher, date, and title makes compliance and desk review impossible.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Unscoped volume.&lt;/strong&gt; Dumping the open web into the context window adds forums, reprints, and off-topic inflation pieces that dilute the answer.&lt;/p&gt;

&lt;p&gt;A &lt;strong&gt;RAG news feed&lt;/strong&gt; (retrieve → pack → generate) keeps the model honest: the corpus is your filtered &lt;strong&gt;news data for AI&lt;/strong&gt;, not the entire internet.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to build a filtered news feed as LLM context
&lt;/h2&gt;

&lt;p&gt;Treat Perigon Articles (/v1/all) as the retrieval layer for &lt;strong&gt;LLM context news&lt;/strong&gt;. Resolve the company once, then poll a tight window.&lt;/p&gt;

&lt;p&gt;Worked example - payments company watch:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Role&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Prefer&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Value&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Stripe (payments)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;companyId&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;9c0e5ff08b87453b8f6fa108a73b57b5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stripe (domain pin)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;companyDomain&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;stripe.com when you want domain-linked hits&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Patrick Collison (CEO)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;personWikidataId&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Q7146257&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;On Articles, pass &lt;strong&gt;companyId&lt;/strong&gt; set to 9c0e5ff08b87453b8f6fa108a73b57b5, set &lt;strong&gt;sortBy&lt;/strong&gt; to date, and bound &lt;strong&gt;from&lt;/strong&gt; / &lt;strong&gt;to&lt;/strong&gt; (or &lt;strong&gt;addDateFrom&lt;/strong&gt; for incremental polls). Keep &lt;strong&gt;size&lt;/strong&gt; small for a context pack - often 5 to 15 articles - so the model can read titles and summaries without truncating mid-sentence.&lt;/p&gt;

&lt;p&gt;People search for “Patrick Collison” can return basketball and entertainment Collisons. Keep &lt;strong&gt;personWikidataId&lt;/strong&gt; Q7146257 when the lane is leadership commentary, not the company-wide feed. Deep entity param theory lives in the Company News API guide; this page owns the &lt;strong&gt;improve AI output&lt;/strong&gt; packing pattern.&lt;/p&gt;

&lt;p&gt;For narrative heat without reprint spam, run the same &lt;strong&gt;companyId&lt;/strong&gt; on Stories (/v1/stories/all). Coverage often looks like a sponsorship or partnership cluster - for example a Stripe worldwide partner announcement spanning multiple outlets under one story name - which compresses better into a prompt than eleven near-duplicate headlines.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to pack fields into prompts without drowning the model
&lt;/h2&gt;

&lt;p&gt;Retrieval is not enough. &lt;strong&gt;Ground LLM&lt;/strong&gt; quality depends on what you paste and what you instruct.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Context pack recipe (per hit):&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Title&lt;/p&gt;

&lt;p&gt;Publisher domain&lt;/p&gt;

&lt;p&gt;Publication date&lt;/p&gt;

&lt;p&gt;Short summary or key points (not full body by default)&lt;/p&gt;

&lt;p&gt;Optional company / person names already on the record&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prompt scaffolding:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Instruct the model to answer only from the packed items.&lt;/p&gt;

&lt;p&gt;Require citations as title + domain + date.&lt;/p&gt;

&lt;p&gt;Cap length (bullets or a short brief).&lt;/p&gt;

&lt;p&gt;Say what to do when the pack is empty: admit gaps, do not invent.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Size discipline:&lt;/strong&gt; Prefer recent, entity-pinned hits over a large unsorted dump. Default article order without &lt;strong&gt;sortBy&lt;/strong&gt; date can surface old or off-beat pages first - useless for &lt;strong&gt;AI with live news&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Raise quality with &lt;strong&gt;sourceGroup&lt;/strong&gt; (for example top100) and &lt;strong&gt;excludeLabel&lt;/strong&gt; Opinion, Paid News, or Press Release when you want third-party reporting only.&lt;/p&gt;

&lt;p&gt;Search Summarizer can turn the same filters into one model-written briefing when the deliverable is a digest, not a custom agent reply - see the &lt;a href="https://perigon.io/blog/ai-news-summaries-api-turn-news-search-results-into-executive-briefings" rel="noopener noreferrer"&gt;AI News Summaries guide&lt;/a&gt;. Keep this article on feeding &lt;strong&gt;your&lt;/strong&gt; LLM.&lt;/p&gt;

&lt;h2&gt;
  
  
  When to use Articles, Stories, Summarizer, or MCP
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Job&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Prefer&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Why&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Custom chatbot / agent answers with citations&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Articles&lt;/strong&gt; → your LLM&lt;/td&gt;
&lt;td&gt;You own the prompt, tools, and UX&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fewer reprints in the context window&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Stories&lt;/strong&gt; first, then sample articles&lt;/td&gt;
&lt;td&gt;One narrative per cluster&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;One leadership-ready digest, Perigon-written&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Search Summarizer&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Prompted briefing of the matched set&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IDE / assistant tool access without custom retrieval code&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;MCP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Agent tools over the same news graph - see &lt;a href="https://perigon.io/blog/real-time-news-for-ai-agents-how-perigon-mcp-works" rel="noopener noreferrer"&gt;real-time news for AI agents&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;News feed grounding&lt;/strong&gt; and Summarizer both start from filtered search. Grounding keeps generation in your stack; Summarizer returns the briefing as the API response.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which filters keep a company context pack clean
&lt;/h2&gt;

&lt;p&gt;Group parameters by the grounding job:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Use case&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Params to teach first&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Pin the company&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;companyId&lt;/strong&gt;, optional &lt;strong&gt;companyDomain&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pin an executive&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;personWikidataId&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Freshness for RAG&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;from&lt;/strong&gt; / &lt;strong&gt;to&lt;/strong&gt;, &lt;strong&gt;addDateFrom&lt;/strong&gt;, &lt;strong&gt;sortBy&lt;/strong&gt; date&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Context window budget&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;size&lt;/strong&gt;, &lt;strong&gt;page&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Publisher quality&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;source&lt;/strong&gt;, &lt;strong&gt;sourceGroup&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cut non-reporting noise&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;excludeLabel&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Optional topic fence&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;category&lt;/strong&gt;, &lt;strong&gt;topic&lt;/strong&gt;, short &lt;strong&gt;q&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Start with &lt;strong&gt;companyId&lt;/strong&gt; for Stripe-scale watches. Add &lt;strong&gt;personWikidataId&lt;/strong&gt; only for CEO interview or leadership lanes - company volume and person volume differ sharply (see facts below). Stack &lt;strong&gt;excludeLabel&lt;/strong&gt; and a trusted &lt;strong&gt;sourceGroup&lt;/strong&gt; before you grow &lt;strong&gt;size&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What results look like for grounding
&lt;/h2&gt;

&lt;p&gt;Each Articles hit gives the fields most agents need: title, url (when your product deep-links), pubDate, publisher domain, summary, and linked companies or people. You map those into the context block; you do not need full HTML.&lt;/p&gt;

&lt;p&gt;Stories return a cluster name, summary, article count, and update time - enough to tell the model “this is one partnership narrative with N outlets,” then attach one or two representative article rows if citations matter.&lt;/p&gt;

&lt;p&gt;Pattern check (evergreen shape, not a permanent newsjack): a recent Stripe-linked story can look like a multi-outlet sports-partnership announcement (Ryder Cup worldwide partner framing) with on the order of ten related articles under one cluster - ideal Stories-first packing when reprints would otherwise fill the window.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use cases
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Support and success copilots
&lt;/h3&gt;

&lt;p&gt;Retrieve the last week of &lt;strong&gt;companyId&lt;/strong&gt; coverage before the model answers “what changed for this vendor?” Pack titles and domains so agents cite press, not rumor.&lt;/p&gt;

&lt;h3&gt;
  
  
  Research and analyst agents
&lt;/h3&gt;

&lt;p&gt;Run parallel packs: company feed vs &lt;strong&gt;personWikidataId&lt;/strong&gt; leadership feed. Compare volumes, then ask the model for a short memo with separate citation lists.&lt;/p&gt;

&lt;h3&gt;
  
  
  Product features that “know the news”
&lt;/h3&gt;

&lt;p&gt;Ship a “sources used” panel from the same pack you sent to the model - title, domain, date - so users can audit &lt;strong&gt;grounded AI answers&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  When to ground vs summarize vs monitor
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Goal&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Path&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Improve answers inside your LLM app&lt;/td&gt;
&lt;td&gt;Articles/Stories → context pack → your model&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;One digest without building a packer&lt;/td&gt;
&lt;td&gt;Search Summarizer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Always-on desk briefing product&lt;/td&gt;
&lt;td&gt;Signals on perigon.io/home (product path; not this API recipe)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Entity filter depth&lt;/td&gt;
&lt;td&gt;Company News API guide&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Compose the feed with other filters
&lt;/h2&gt;

&lt;p&gt;Entity pins set who. Dates and &lt;strong&gt;sortBy&lt;/strong&gt; set when. &lt;strong&gt;sourceGroup&lt;/strong&gt; and &lt;strong&gt;excludeLabel&lt;/strong&gt; set quality. Optional &lt;strong&gt;q&lt;/strong&gt; (partnership, pricing, regulation) narrows event language without replacing the allowlist. Poll with &lt;strong&gt;addDateFrom&lt;/strong&gt; so each agent turn only spends tokens on new hits.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stripe grounding at a glance
&lt;/h2&gt;

&lt;p&gt;Payments coverage is continuous: product, partnerships, regulation, and executive commentary move on different cadences. Entity pins keep a &lt;strong&gt;news feed for AI&lt;/strong&gt; on the company instead of every “stripe” metaphor in sports or design.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What that looks like in the index (30 days, pubDate 2026-06-23 to 2026-07-23):&lt;/strong&gt; about &lt;strong&gt;11,000&lt;/strong&gt; articles linked to Stripe (&lt;strong&gt;companyId&lt;/strong&gt; 9c0e5ff08b87453b8f6fa108a73b57b5).&lt;/p&gt;

&lt;p&gt;Leadership is a thinner lane: about &lt;strong&gt;150&lt;/strong&gt; articles for Patrick Collison (&lt;strong&gt;personWikidataId&lt;/strong&gt; Q7146257) in the same window. Pack company and CEO feeds separately so a support copilot does not drown in executive profile pieces - or miss a partnership cluster when it only watched the person ID.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key takeaways
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Improve AI output&lt;/strong&gt; on current events by retrieving a filtered news feed before generation - not by hoping the model remembers.&lt;/p&gt;

&lt;p&gt;Pin entities (&lt;strong&gt;companyId&lt;/strong&gt;, &lt;strong&gt;personWikidataId&lt;/strong&gt;), sort by date, and keep &lt;strong&gt;size&lt;/strong&gt; small enough for reliable citations.&lt;/p&gt;

&lt;p&gt;Pack title, domain, date, and short summary; instruct the model to stay inside the pack.&lt;/p&gt;

&lt;p&gt;Use Stories to compress reprints; use Search Summarizer or MCP when you want a Perigon briefing or agent tools instead of a custom packer.&lt;/p&gt;

&lt;p&gt;Separate company-scale and executive-scale watches - volumes differ, and mixed packs confuse the model.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Get started:&lt;/strong&gt; &lt;a href="https://perigon.io/docs/api/entities" rel="noopener noreferrer"&gt;Entities&lt;/a&gt; · &lt;a href="https://perigon.io/reference" rel="noopener noreferrer"&gt;API reference&lt;/a&gt; · &lt;a href="https://perigon.io/sandbox?endpoint=articles" rel="noopener noreferrer"&gt;Articles sandbox&lt;/a&gt; · &lt;a href="https://perigon.io/products/pricing/apis" rel="noopener noreferrer"&gt;API pricing&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>news</category>
      <category>api</category>
      <category>python</category>
    </item>
    <item>
      <title>Competitor News Monitoring with the News API: Track Rival Companies and Political Rivals</title>
      <dc:creator>Oleksyj Mokrousov</dc:creator>
      <pubDate>Fri, 21 Aug 2026 10:16:47 +0000</pubDate>
      <link>https://dev.to/alexperigon/competitor-news-monitoring-with-the-news-api-track-rival-companies-and-political-rivals-239o</link>
      <guid>https://dev.to/alexperigon/competitor-news-monitoring-with-the-news-api-track-rival-companies-and-political-rivals-239o</guid>
      <description>&lt;h2&gt;
  
  
  Why competitor news monitoring fails on keywords alone
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Competitor news monitoring&lt;/strong&gt; is not searching a rival’s name every morning. Company launches, defense awards, and earnings hit the wire in the same week as political rivals fight for headline share. Keyword &lt;strong&gt;q&lt;/strong&gt; alone cannot keep those lanes clean.&lt;/p&gt;

&lt;p&gt;Search Lockheed, RTX, or defense and you also match namesakes, sports metaphors, and consumer brands. Search Trump or Biden and you also match family members, entertainment rows, and caption noise. The rivals you mean stay hard to compare side by side.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Try it live:&lt;/strong&gt; &lt;a href="https://perigon.io/sandbox?endpoint=articles" rel="noopener noreferrer"&gt;Articles sandbox&lt;/a&gt; · &lt;strong&gt;Docs:&lt;/strong&gt; &lt;a href="https://perigon.io/docs/api/entities" rel="noopener noreferrer"&gt;Entities&lt;/a&gt; · &lt;strong&gt;Plans:&lt;/strong&gt; &lt;a href="https://perigon.io/products/pricing/apis" rel="noopener noreferrer"&gt;API pricing&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This guide answers:&lt;/p&gt;

&lt;p&gt;What is competitor news monitoring on a news API?&lt;/p&gt;

&lt;p&gt;How do you build a rival &lt;strong&gt;company&lt;/strong&gt; watchlist with entities?&lt;/p&gt;

&lt;p&gt;How do you compare &lt;strong&gt;political rivals&lt;/strong&gt; like Trump and Biden?&lt;/p&gt;

&lt;p&gt;How do you compare coverage volume across competitors?&lt;/p&gt;

&lt;p&gt;How do you keep earned coverage vs press-release noise?&lt;/p&gt;

&lt;p&gt;Which recipes fit company CI vs political CI vs Stories?&lt;/p&gt;

&lt;p&gt;Param encyclopedias live in the Company News API guide and Entities docs. Product briefings belong on &lt;a href="https://perigon.io/blog/monitor-defense-industry-news" rel="noopener noreferrer"&gt;Monitor Defense Industry News&lt;/a&gt; or &lt;a href="https://perigon.io/blog/monitor-us-politics-news" rel="noopener noreferrer"&gt;Monitor US Politics News&lt;/a&gt;. This page owns the &lt;strong&gt;API competitive-intelligence workflow&lt;/strong&gt; - companies and people as rivals.&lt;/p&gt;

&lt;h2&gt;
  
  
  What competitor news monitoring means on a news API
&lt;/h2&gt;

&lt;p&gt;On Perigon, competitors are whoever you need to compare in coverage - primes, brands, or political figures. The workflow is the same shape:&lt;/p&gt;

&lt;p&gt;1) Pick a stable rival set.&lt;/p&gt;

&lt;p&gt;2) Resolve each rival to a durable ID (&lt;strong&gt;companyId&lt;/strong&gt; / &lt;strong&gt;companySymbol&lt;/strong&gt;, or &lt;strong&gt;personWikidataId&lt;/strong&gt;).&lt;/p&gt;

&lt;p&gt;3) Run the same Articles (/v1/all) recipe once per rival in one date window.&lt;/p&gt;

&lt;p&gt;4) Compare volume and themes; optionally open Stories when one move reprints everywhere.&lt;/p&gt;

&lt;p&gt;You filter who was linked on the article. You do not scrape competitor websites. You do not call another vendor’s news API.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Rival type&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Resolve with&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Filter on Articles / Stories&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Company / brand&lt;/td&gt;
&lt;td&gt;Companies API&lt;/td&gt;
&lt;td&gt;companySymbol, companyId, companyDomain&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Political figure&lt;/td&gt;
&lt;td&gt;People API&lt;/td&gt;
&lt;td&gt;personWikidataId (prefer) or personName&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Event language&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;Optional q (award, earnings, debate)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Earned-only&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;excludeLabel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reprint collapse&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;Stories with the same entity fence&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  How to build a rival company watchlist with entities
&lt;/h2&gt;

&lt;p&gt;Resolve each rival once on the Companies API (/v1/companies/all). Prefer the parent listed company and a primary &lt;strong&gt;companySymbol&lt;/strong&gt;. Skip subsidiaries and namesakes unless that unit is the desk’s target.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example A - Defense primes as rivals
&lt;/h3&gt;

&lt;p&gt;Live Companies lookup (not a Signals tutorial):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Rival (parent)&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Prefer&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;companyId&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Symbol&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Lockheed Martin Corporation&lt;/td&gt;
&lt;td&gt;Parent - not Rémy Martin / Martin Professional&lt;/td&gt;
&lt;td&gt;2fa32c247a6f4d83be3c163cc685691b&lt;/td&gt;
&lt;td&gt;LMT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RTX (US aerospace / defense)&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;companySymbol&lt;/strong&gt; RTX - name “RTX” can return Danish RTX A/S&lt;/td&gt;
&lt;td&gt;(use symbol; skip f531cda3de2c47128cee041eb5327d83)&lt;/td&gt;
&lt;td&gt;RTX&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Northrop Grumman Corporation&lt;/td&gt;
&lt;td&gt;Parent - not Sperry Marine alone&lt;/td&gt;
&lt;td&gt;7ba58a4019cf48afb56c710b0e8d0ef2&lt;/td&gt;
&lt;td&gt;NOC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The Boeing Company&lt;/td&gt;
&lt;td&gt;Parent - not Boeing Store / BECU&lt;/td&gt;
&lt;td&gt;c825868b46614e598257013cf9f39c03&lt;/td&gt;
&lt;td&gt;BA&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;General Dynamics Corporation&lt;/td&gt;
&lt;td&gt;Parent - not Mission / Land Systems / Electric Boat alone&lt;/td&gt;
&lt;td&gt;a61d0b7101cf411ebcfbacd479586be7&lt;/td&gt;
&lt;td&gt;GD&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Apply it&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Store id + symbol in config.&lt;/p&gt;

&lt;p&gt;Pass &lt;strong&gt;companySymbol&lt;/strong&gt; set to LMT (or Lockheed’s &lt;strong&gt;companyId&lt;/strong&gt;) on Articles.&lt;/p&gt;

&lt;p&gt;Repeat for RTX, NOC, BA, and GD.&lt;/p&gt;

&lt;p&gt;Add &lt;strong&gt;q&lt;/strong&gt; only for move type (award, earnings, partnership).&lt;/p&gt;

&lt;h3&gt;
  
  
  Example recipes (defense)
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;CI question&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Recipe&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;All Lockheed-linked news&lt;/td&gt;
&lt;td&gt;companySymbol=LMT, sort by date&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lockheed awards only&lt;/td&gt;
&lt;td&gt;companySymbol=LMT + q=award OR contract&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RTX vs LMT volume this month&lt;/td&gt;
&lt;td&gt;Two queries, same from/to, compare numResults&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Boeing commercial + defense noise cut&lt;/td&gt;
&lt;td&gt;companySymbol=BA + excludeLabel Non-news&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GD shipbuilding desk&lt;/td&gt;
&lt;td&gt;companyId for General Dynamics Corporation (avoid Electric Boat-only unless needed)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Five-prime morning digest&lt;/td&gt;
&lt;td&gt;Five parallel queries → Summarizer per rival&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Name collisions are the failure mode. “Martin” or “RTX” without entities are research strings, not keys. Refresh IDs when tickers or structure change.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example B - Brand and sponsor rivals (pattern)
&lt;/h3&gt;

&lt;p&gt;The same pattern works outside defense. Resolve each brand on Companies, then run parallel &lt;strong&gt;companySymbol&lt;/strong&gt; or &lt;strong&gt;companyId&lt;/strong&gt; watches - for example Nike (NKE) vs a sportsbook or apparel rival on your book. Keep one query per brand in the same window. Domain filters (&lt;strong&gt;companyDomain&lt;/strong&gt;) help when the rival is private or the ticker is ambiguous. Full ticker/domain cookbook stays in the Company News guide.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to compare political rivals like Trump and Biden
&lt;/h2&gt;

&lt;p&gt;Political &lt;strong&gt;competitors&lt;/strong&gt; are people, not tickers. Resolve each on the People API (/v1/people/all), store &lt;strong&gt;personWikidataId&lt;/strong&gt;, and run parallel Articles queries. Deeper person methodology lives in the political rival mentions guide - the worked pair below is the CI example for this page.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example C - Trump vs Biden (live People lookup)
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Rival&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Prefer this row&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;personWikidataId&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Donald Trump&lt;/td&gt;
&lt;td&gt;US politician / President row - not Donald Trump Jr.&lt;/td&gt;
&lt;td&gt;Q22686&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Joe Biden&lt;/td&gt;
&lt;td&gt;46th President row - not Hunter Biden, Ashley Biden, or singer “Joe”&lt;/td&gt;
&lt;td&gt;Q6279&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;People search for “Donald Trump” also returns Melania, Ivana, and Ivanka. “Joe Biden” also returns Hunter, Ashley, Valerie Biden Owens, and unrelated Joe rows. Pin Wikidata IDs or the wrong human enters the feed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Apply the pair&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Feed A: &lt;strong&gt;personWikidataId&lt;/strong&gt; set to Q22686.&lt;/p&gt;

&lt;p&gt;Feed B: &lt;strong&gt;personWikidataId&lt;/strong&gt; set to Q6279.&lt;/p&gt;

&lt;p&gt;Same &lt;strong&gt;from&lt;/strong&gt; / &lt;strong&gt;to&lt;/strong&gt; window for both.&lt;/p&gt;

&lt;p&gt;Optional fence: &lt;strong&gt;category&lt;/strong&gt; set to Politics and &lt;strong&gt;sourceCountry&lt;/strong&gt; set to us.&lt;/p&gt;

&lt;p&gt;Optional &lt;strong&gt;q&lt;/strong&gt;: debate, executive order, campaign - event language only.&lt;/p&gt;

&lt;h3&gt;
  
  
  Political volume (30 days)
&lt;/h3&gt;

&lt;p&gt;pubDate &lt;strong&gt;2026-06-23&lt;/strong&gt; through &lt;strong&gt;2026-07-23&lt;/strong&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Filter&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;About how many articles&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Trump Q22686&lt;/td&gt;
&lt;td&gt;~980,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Biden Q6279&lt;/td&gt;
&lt;td&gt;~75,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Trump + Politics + US sources&lt;/td&gt;
&lt;td&gt;~290,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Biden + Politics + US sources&lt;/td&gt;
&lt;td&gt;~38,000&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Round large totals; very large person feeds can sit near caps - prefer relative wording. In this window Trump-linked volume sat roughly an order of magnitude above Biden overall, and still several times higher inside the US Politics fence. Use that as triage for coverage heat - not as an election scoreboard.&lt;/p&gt;

&lt;h3&gt;
  
  
  Political recipe table
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;CI question&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Recipe&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Open Trump mention firehose&lt;/td&gt;
&lt;td&gt;personWikidataId=Q22686&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Open Biden mention firehose&lt;/td&gt;
&lt;td&gt;personWikidataId=Q6279&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fairer US politics desk compare&lt;/td&gt;
&lt;td&gt;Each ID + category=Politics + sourceCountry=us&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Debate-week slice&lt;/td&gt;
&lt;td&gt;Each ID + q=debate + same from/to&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Shared narrative heat&lt;/td&gt;
&lt;td&gt;Stories + personWikidataId (one ID per poll)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cut opinion roundups&lt;/td&gt;
&lt;td&gt;excludeLabel Opinion or Non-news on either feed&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Coverage shape (historical overviews - domains only): news.yahoo.com-style politics commentary linked to Trump; nwaonline.com-style White House visit coverage linked to Biden. Treat as pattern checks. A recent Stories shape for Q22686 can look like a multi-outlet foreign-policy or defense cluster that also mentions Trump - useful when the rivalry is a shared narrative, not a single URL.&lt;/p&gt;

&lt;p&gt;For continuous politics product briefings, use Monitor US Politics News. For who wrote the coverage, use election journalist guides.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to compare coverage across competitors
&lt;/h2&gt;

&lt;p&gt;Whether rivals are companies or people, the rule is the same: &lt;strong&gt;one query per rival&lt;/strong&gt;, identical window. Do not OR five tickers or two surnames into one bag if you need share-of-voice numbers.&lt;/p&gt;

&lt;h3&gt;
  
  
  Company Articles volume (same 30 days)
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Rival symbol&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;About how many articles&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;LMT&lt;/td&gt;
&lt;td&gt;~19,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NOC&lt;/td&gt;
&lt;td&gt;~9,200&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RTX&lt;/td&gt;
&lt;td&gt;~5,400&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Lockheed-linked coverage outpaced Northrop and RTX - triage, not proof of wins.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fperigon.io%2F_next%2Fimage%3Furl%3D%252Fapi%252Fmedia%252Ffile%252Fcompetitors_volume.png%26w%3D1200%26q%3D100" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fperigon.io%2F_next%2Fimage%3Furl%3D%252Fapi%252Fmedia%252Ffile%252Fcompetitors_volume.png%26w%3D1200%26q%3D100" alt="competitors_volume.png" width="1200" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Company Stories compression (same window)
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Rival&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Stories clusters (~)&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;LMT&lt;/td&gt;
&lt;td&gt;61&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NOC&lt;/td&gt;
&lt;td&gt;26&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RTX&lt;/td&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Tens of thousands of articles become tens of narratives. Use Articles for volume; use Stories when an earnings print or award reprints (RTX outlook raise; Northrop Hawkeye award). Adjacent science clusters can appear on a prime symbol - tighten with &lt;strong&gt;q&lt;/strong&gt;. Full move-detection sits in the competitor moves / Stories guide.&lt;/p&gt;

&lt;h3&gt;
  
  
  Side-by-side: company vs political competitors
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Defense primes&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Trump vs Biden&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Entity&lt;/td&gt;
&lt;td&gt;companySymbol / companyId&lt;/td&gt;
&lt;td&gt;personWikidataId&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Typical 30-day scale&lt;/td&gt;
&lt;td&gt;Thousands–tens of thousands of articles&lt;/td&gt;
&lt;td&gt;Tens of thousands–hundreds of thousands&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stories role&lt;/td&gt;
&lt;td&gt;Earnings / contract moves&lt;/td&gt;
&lt;td&gt;Shared policy or campaign narratives&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Common noise&lt;/td&gt;
&lt;td&gt;Namesake firms, subsidiaries&lt;/td&gt;
&lt;td&gt;Family members, entertainment Joes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Desk fence&lt;/td&gt;
&lt;td&gt;Optional sourceGroup / q&lt;/td&gt;
&lt;td&gt;Politics + US sourceCountry&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  What company coverage often looks like
&lt;/h3&gt;

&lt;p&gt;Entity filters typically return contract and program wires. Historical pattern checks (domains only): marketwatch.com / theatlasnews.co style F-35 award framing for Lockheed; militaryleak.com style F135 engine funding for RTX.&lt;/p&gt;

&lt;p&gt;For themes, skim titles per rival feed - or pass each set into Search Summarizer. Summarizer theory stays on that guide.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to keep earned coverage vs press-release noise
&lt;/h2&gt;

&lt;p&gt;Rival IR and campaign communications publish releases that index like news. For third-party coverage, add &lt;strong&gt;excludeLabel&lt;/strong&gt; (Press Release, Paid Content, or Non-news) on the same entity query. Keep a second feed for official releases if you still need them.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Goal&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Mechanism&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Company allowlist&lt;/td&gt;
&lt;td&gt;companySymbol or companyId&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Person allowlist&lt;/td&gt;
&lt;td&gt;personWikidataId&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Event language&lt;/td&gt;
&lt;td&gt;Optional q&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Earned-only&lt;/td&gt;
&lt;td&gt;excludeLabel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Publisher fence&lt;/td&gt;
&lt;td&gt;Optional sourceGroup&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Incremental poll&lt;/td&gt;
&lt;td&gt;from / to or addDateFrom&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Mixed stack example:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;companySymbol=LMT + q=contract + excludeLabel Press Release - awards discussed by third parties, not only Lockheed’s wire.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Political stack example:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;personWikidataId=Q22686 + category=Politics + sourceCountry=us + excludeLabel Non-news - US politics desk, less caption junk.&lt;/p&gt;

&lt;h2&gt;
  
  
  End-to-end CI playbooks
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Playbook 1 - Five-prime defense morning brief
&lt;/h3&gt;

&lt;p&gt;Resolve LMT, RTX, NOC, BA, GD (table above).&lt;/p&gt;

&lt;p&gt;Poll Articles per symbol for the last 24 hours (addDateFrom or from/to).&lt;/p&gt;

&lt;p&gt;Rank rivals by numResults; open the top two feeds.&lt;/p&gt;

&lt;p&gt;For any spike, switch to Stories with that symbol and read articleCount.&lt;/p&gt;

&lt;p&gt;Optional: Summarizer on the spike set for a six-bullet IR note.&lt;/p&gt;

&lt;h3&gt;
  
  
  Playbook 2 - Trump vs Biden weekly share-of-voice
&lt;/h3&gt;

&lt;p&gt;Confirm Q22686 and Q6279.&lt;/p&gt;

&lt;p&gt;Run both person filters for the last 7 days with Politics + US sources.&lt;/p&gt;

&lt;p&gt;Record relative volume (do not treat as polls).&lt;/p&gt;

&lt;p&gt;Diff top topics or skim titles for theme gaps.&lt;/p&gt;

&lt;p&gt;If one shared narrative dominates, follow it on Stories with one ID at a time.&lt;/p&gt;

&lt;h3&gt;
  
  
  Playbook 3 - Award week for two primes
&lt;/h3&gt;

&lt;p&gt;Parallel: companySymbol=LMT and companySymbol=NOC.&lt;/p&gt;

&lt;p&gt;Add q=award OR contract OR Navy on both.&lt;/p&gt;

&lt;p&gt;Compare counts; open Stories on the louder symbol.&lt;/p&gt;

&lt;p&gt;excludeLabel Press Release if you want earned desks only.&lt;/p&gt;

&lt;h2&gt;
  
  
  When this workflow vs other Perigon surfaces
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Situation&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Prefer&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Rival-company and rival-person API compares&lt;/td&gt;
&lt;td&gt;This page&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deep person-only methodology&lt;/td&gt;
&lt;td&gt;Political rival mentions guide&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Earnings / contract as one narrative&lt;/td&gt;
&lt;td&gt;Competitor moves / Stories guide&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Full company / ticker / executive params&lt;/td&gt;
&lt;td&gt;Company News guide + Entities docs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Defense or US politics product UI&lt;/td&gt;
&lt;td&gt;Monitor Defense / Monitor US Politics&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Who wrote the politics coverage&lt;/td&gt;
&lt;td&gt;Election journalists guides&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Editorial calendar gaps&lt;/td&gt;
&lt;td&gt;Content strategy news API guide&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;News API &lt;strong&gt;vendor&lt;/strong&gt; prices&lt;/td&gt;
&lt;td&gt;Pricing comparison (separate SERP)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Beat scale at a glance
&lt;/h2&gt;

&lt;p&gt;Company rivals and political rivals both need entity IDs - keywords fail differently (namesakes vs family).&lt;/p&gt;

&lt;p&gt;In &lt;strong&gt;2026-06-23&lt;/strong&gt;–&lt;strong&gt;2026-07-23&lt;/strong&gt;, LMT / NOC / RTX article volumes differed by multiples; Stories stayed in the tens of clusters.&lt;/p&gt;

&lt;p&gt;In the same window, Trump vs Biden person volume differed by roughly an order of magnitude; Politics + US sources cut both feeds while preserving the gap.&lt;/p&gt;

&lt;p&gt;Contract wires and candidate mention firehoses are evergreen shapes; re-run stats when you ship.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key takeaways
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Competitor news monitoring&lt;/strong&gt; = resolve rivals + parallel Articles filters - companies or people.&lt;/p&gt;

&lt;p&gt;Defense example: LMT, RTX, NOC, BA, GD - skip namesakes and Danish RTX A/S.&lt;/p&gt;

&lt;p&gt;Political example: Trump Q22686 vs Biden Q6279 - skip Jr., Hunter, and other near matches.&lt;/p&gt;

&lt;p&gt;Compare with one query per rival; use Stories when reprints are the problem.&lt;/p&gt;

&lt;p&gt;Stack &lt;strong&gt;excludeLabel&lt;/strong&gt; for earned media; use Signals Monitor pages for product briefings.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Get started:&lt;/strong&gt; &lt;a href="https://perigon.io/sandbox?endpoint=articles" rel="noopener noreferrer"&gt;Articles sandbox&lt;/a&gt; · &lt;a href="https://perigon.io/docs/api/entities" rel="noopener noreferrer"&gt;Entities&lt;/a&gt; · &lt;a href="https://perigon.io/reference" rel="noopener noreferrer"&gt;API reference&lt;/a&gt; · &lt;a href="https://perigon.io/products/pricing/apis" rel="noopener noreferrer"&gt;API pricing&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>news</category>
      <category>api</category>
      <category>python</category>
    </item>
    <item>
      <title>News Sentiment API: Filter Positive, Negative, and Neutral Coverage</title>
      <dc:creator>Oleksyj Mokrousov</dc:creator>
      <pubDate>Fri, 21 Aug 2026 10:09:42 +0000</pubDate>
      <link>https://dev.to/alexperigon/news-sentiment-api-filter-positive-negative-and-neutral-coverage-5coj</link>
      <guid>https://dev.to/alexperigon/news-sentiment-api-filter-positive-negative-and-neutral-coverage-5coj</guid>
      <description>&lt;h2&gt;
  
  
  Why keyword search alone cannot measure tone
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;news search API&lt;/strong&gt; that only matches words tells you &lt;em&gt;what&lt;/em&gt; was covered. It does not tell you &lt;em&gt;how&lt;/em&gt; the coverage reads. The same company, ticker, or topic can produce a product-launch celebration, a calm earnings wire, and a crisis investigation in the same week.&lt;/p&gt;

&lt;p&gt;Keyword q, topics, and taxonomy keep the feed on-subject - they do not separate praise from criticism.&lt;/p&gt;

&lt;p&gt;Teams building &lt;strong&gt;media intelligence&lt;/strong&gt;, brand monitoring, or risk dashboards usually ask:&lt;/p&gt;

&lt;p&gt;What is a &lt;strong&gt;news sentiment API&lt;/strong&gt; on Perigon?&lt;/p&gt;

&lt;p&gt;How do positive, negative, and neutral score ranges work?&lt;/p&gt;

&lt;p&gt;How do you filter Articles and Stories by sentiment?&lt;/p&gt;

&lt;p&gt;When should you use article filters vs average sentiment stats?&lt;/p&gt;

&lt;p&gt;How do you compose sentiment with companies, sources, and dates?&lt;/p&gt;

&lt;p&gt;The sections below answer each in order.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Try it live:&lt;/strong&gt; &lt;a href="https://perigon.io/sandbox?endpoint=articles" rel="noopener noreferrer"&gt;Articles sandbox&lt;/a&gt; · &lt;strong&gt;Read the docs:&lt;/strong&gt; &lt;a href="https://perigon.io/docs/api/sentiment" rel="noopener noreferrer"&gt;Sentiment&lt;/a&gt; · &lt;strong&gt;Compare plans:&lt;/strong&gt; &lt;a href="https://perigon.io/products/pricing/apis" rel="noopener noreferrer"&gt;API pricing&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What is a news sentiment API?
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;news sentiment API&lt;/strong&gt; is not a separate product SKU. It is &lt;strong&gt;news data&lt;/strong&gt; enrichment plus filters on the same search surfaces you already use. On Perigon, every indexed article can carry a sentiment object with three floats - positive, negative, and neutral - each on a &lt;strong&gt;0 to 1&lt;/strong&gt; scale. Higher values mean a stronger signal for that tone.&lt;/p&gt;

&lt;p&gt;You filter with the same Articles endpoint (/v1/all) you use for keywords, sources, and entities. Stories (/v1/stories/all) accept the same style of range filters on the &lt;strong&gt;aggregate&lt;/strong&gt; tone of the cluster. For time-series dashboards, GET /v1/stats/avgSentiment returns average positive, negative, and neutral scores across a filtered set, optionally split by hour, day, week, or month.&lt;/p&gt;

&lt;p&gt;That is the difference between reading every headline and asking the API for &lt;strong&gt;negative coverage&lt;/strong&gt;, &lt;strong&gt;positive coverage&lt;/strong&gt;, or a &lt;strong&gt;neutral&lt;/strong&gt; wire-style slice of the same beat.&lt;/p&gt;

&lt;h2&gt;
  
  
  How positive, negative, and neutral scores work
&lt;/h2&gt;

&lt;p&gt;Perigon does not collapse tone into a single label. Each article (and story aggregate) exposes three independent ranks:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Score field&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Meaning&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Filter params&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;positive&lt;/td&gt;
&lt;td&gt;Strength of positive tone (0–1)&lt;/td&gt;
&lt;td&gt;positiveSentimentFrom, positiveSentimentTo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;negative&lt;/td&gt;
&lt;td&gt;Strength of negative tone (0–1)&lt;/td&gt;
&lt;td&gt;negativeSentimentFrom, negativeSentimentTo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;neutral&lt;/td&gt;
&lt;td&gt;Strength of neutral tone (0–1)&lt;/td&gt;
&lt;td&gt;neutralSentimentFrom, neutralSentimentTo&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fperigon.io%2F_next%2Fimage%3Furl%3D%252Fapi%252Fmedia%252Ffile%252Fsentiment_content.png%26w%3D1200%26q%3D100" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fperigon.io%2F_next%2Fimage%3Furl%3D%252Fapi%252Fmedia%252Ffile%252Fsentiment_content.png%26w%3D1200%26q%3D100" alt="sentiment_content.png" width="1200" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;From is inclusive minimum; To is inclusive maximum. You can set one bound or both. Because the three scores coexist, a practical pattern is to raise the tone you care about - for example a high negativeSentimentFrom for crisis monitoring - rather than treating sentiment as a single mutually exclusive enum.&lt;/p&gt;

&lt;p&gt;Use ranges when you need a threshold (“show me clearly negative pieces”), not when you only need the raw scores on each hit. Unfiltered search already returns sentiment on matching articles so you can chart or sort in your own app.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to filter Articles and Stories by sentiment
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Articles API (/v1/all)
&lt;/h3&gt;

&lt;p&gt;Pass any combination of the six range params. Common patterns:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Goal&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Typical filters&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Strongly negative coverage&lt;/td&gt;
&lt;td&gt;Raise negativeSentimentFrom (e.g. toward the high end of 0–1)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Strongly positive coverage&lt;/td&gt;
&lt;td&gt;Raise positiveSentimentFrom&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mostly neutral / wire tone&lt;/td&gt;
&lt;td&gt;Raise neutralSentimentFrom&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cap a tone&lt;/td&gt;
&lt;td&gt;Use the matching …SentimentTo upper bound&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Includes work like other numeric filters: set the bounds that describe the slice you want, then layer topic, company, or source filters so sentiment is measured &lt;em&gt;inside&lt;/em&gt; a known beat.&lt;/p&gt;

&lt;p&gt;Headlines (/v1/headlines) accept the same sentiment range params when you need a headline-oriented surface.&lt;/p&gt;

&lt;h3&gt;
  
  
  Stories API (/v1/stories/all)
&lt;/h3&gt;

&lt;p&gt;Story filters use the same param names against the &lt;strong&gt;cluster-level&lt;/strong&gt; aggregate sentiment. Prefer Stories when you care about the tone of a narrative (one event, many reprints) rather than the tone of every individual article. Clustering mechanics stay in the &lt;a href="https://perigon.io/blog/news-stories-api-how-news-clustering-groups-related-articles-into-trackable-narratives" rel="noopener noreferrer"&gt;News Stories API guide&lt;/a&gt; - here the only decision is article-level vs story-level tone.&lt;/p&gt;

&lt;h2&gt;
  
  
  Article filters vs average sentiment stats
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Need&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Use&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;What you get&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A list of negative (or positive) articles&lt;/td&gt;
&lt;td&gt;Articles with sentiment range filters&lt;/td&gt;
&lt;td&gt;Hits plus per-article sentiment&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tone of a clustered narrative&lt;/td&gt;
&lt;td&gt;Stories with sentiment range filters&lt;/td&gt;
&lt;td&gt;Clusters with aggregate sentiment&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;How average tone moved over time&lt;/td&gt;
&lt;td&gt;/v1/stats/avgSentiment&lt;/td&gt;
&lt;td&gt;Average positive / negative / neutral, optionally split&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;/v1/stats/avgSentiment reuses the same Articles-style filter set (AllEndpointParams) so you can pin a company, source group, or date window, then set splitBy to HOUR, DAY, WEEK, MONTH, or NONE. That is the dashboard path: one filtered corpus, a time series of average tone - not a second search product.&lt;/p&gt;

&lt;p&gt;Keep Search Summarizer for executive briefings of a filtered set. Sentiment filters and avgSentiment answer “what is the tone?”; summarization answers “what should we take from these articles?” Link the &lt;a href="https://perigon.io/blog/ai-news-summaries-api-turn-news-search-results-into-executive-briefings" rel="noopener noreferrer"&gt;AI News Summaries guide&lt;/a&gt; when the deliverable is a briefing, not a score.&lt;/p&gt;

&lt;h2&gt;
  
  
  Compose sentiment with companies, sources, and dates
&lt;/h2&gt;

&lt;p&gt;Sentiment is most useful as a second pass after you know &lt;em&gt;who&lt;/em&gt; and &lt;em&gt;where&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Brand or ticker reputation:&lt;/strong&gt; pin companyDomain or companySymbol, then raise negativeSentimentFrom for risk alerts (entity params are covered in the Company News API guide).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Trusted publishers only:&lt;/strong&gt; add source or sourceGroup so tone is measured on outlets you trust, not the entire open web.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fresh windows:&lt;/strong&gt; use from / to or addDateFrom so crisis monitors and reputation charts stay on the current incident, not years of archives.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Topic or taxonomy desks:&lt;/strong&gt; keep the beat with topic, category, or taxonomy filters, then apply sentiment ranges so finance or health coverage can separate praise from criticism inside the same vertical.&lt;/p&gt;

&lt;p&gt;A common &lt;strong&gt;media monitoring&lt;/strong&gt; pattern is company (or topic) + trusted sourceGroup + addDateFrom + a negative sentiment floor for incremental pulls.&lt;/p&gt;

&lt;h2&gt;
  
  
  What results look like
&lt;/h2&gt;

&lt;p&gt;Article hits include a sentiment object with positive, negative, and neutral floats. Your UI can show tone chips, sort by the dominant score, or feed scores into a chart without a second enrichment call.&lt;/p&gt;

&lt;p&gt;Story results expose aggregate sentiment across the cluster - useful when one narrative reprints widely and you want the story’s overall lean, not thirty near-identical article scores.&lt;/p&gt;

&lt;p&gt;avgSentiment returns timed buckets (when splitBy is not NONE) with average positive, negative, and neutral values for the filtered corpus - the input for reputation and crisis dashboards.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use cases
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Brand reputation and crisis alerts
&lt;/h3&gt;

&lt;p&gt;Scope to the brand with company filters, raise negativeSentimentFrom, and poll with addDateFrom. Route matches to an on-call channel; use avgSentiment with splitBy=DAY for a simple tone trend beside the alert list.&lt;/p&gt;

&lt;h3&gt;
  
  
  Competitive coverage tone
&lt;/h3&gt;

&lt;p&gt;OR rival companyDomain values, keep a shared sourceGroup, and compare either filtered negative/positive slices or parallel avgSentiment series per competitor.&lt;/p&gt;

&lt;h3&gt;
  
  
  Neutral wire feeds for research products
&lt;/h3&gt;

&lt;p&gt;Raise neutralSentimentFrom when the product should prefer straight reporting over opinionated framing - then still allow users to open the full unfiltered set when they want every angle.&lt;/p&gt;

&lt;h3&gt;
  
  
  Narrative-level risk on Stories
&lt;/h3&gt;

&lt;p&gt;During a fast-moving event, filter Stories with a negative floor so dashboards track hostile or alarming &lt;em&gt;storylines&lt;/em&gt;, not every reprint’s micro-variation in score.&lt;/p&gt;

&lt;h2&gt;
  
  
  When to use which sentiment path
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Job&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Prefer&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Inbox of negative (or positive) articles&lt;/td&gt;
&lt;td&gt;Articles + range filters&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tone of one event across outlets&lt;/td&gt;
&lt;td&gt;Stories + range filters&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reputation / crisis chart over time&lt;/td&gt;
&lt;td&gt;/v1/stats/avgSentiment + splitBy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Leadership-ready prose digest&lt;/td&gt;
&lt;td&gt;Search Summarizer on an already filtered set&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Key takeaways
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;news sentiment API&lt;/strong&gt; on Perigon is score enrichment plus filters on Articles, Stories, and /v1/stats/avgSentiment - not a separate SKU.&lt;/p&gt;

&lt;p&gt;Each piece carries positive, negative, and neutral scores from &lt;strong&gt;0 to 1&lt;/strong&gt;; filter with …SentimentFrom / …SentimentTo ranges.&lt;/p&gt;

&lt;p&gt;Use Articles for per-article tone slices, Stories for cluster aggregates, and avgSentiment for time-series averages.&lt;/p&gt;

&lt;p&gt;Compose sentiment after company, source, topic, and date filters so tone is measured inside a known beat.&lt;/p&gt;

&lt;p&gt;Keep summarization for briefings; keep sentiment for thresholds and charts.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Get started:&lt;/strong&gt; &lt;a href="https://perigon.io/docs/api/sentiment" rel="noopener noreferrer"&gt;Sentiment&lt;/a&gt; · &lt;a href="https://perigon.io/reference" rel="noopener noreferrer"&gt;API reference&lt;/a&gt; · &lt;a href="https://perigon.io/sandbox?endpoint=articles" rel="noopener noreferrer"&gt;Articles sandbox&lt;/a&gt; · &lt;a href="https://perigon.io/products/pricing/apis" rel="noopener noreferrer"&gt;API pricing&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>news</category>
      <category>api</category>
      <category>python</category>
    </item>
    <item>
      <title>Best News Sources: AI Top Lists vs Perigon's top100 Source Group</title>
      <dc:creator>Oleksyj Mokrousov</dc:creator>
      <pubDate>Tue, 28 Jul 2026 10:07:02 +0000</pubDate>
      <link>https://dev.to/alexperigon/best-news-sources-ai-top-lists-vs-perigons-top100-source-group-1ool</link>
      <guid>https://dev.to/alexperigon/best-news-sources-ai-top-lists-vs-perigons-top100-source-group-1ool</guid>
      <description>&lt;h2&gt;
  
  
  Why “best news sources” lists disagree
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftd49ryunjm8nlu29qg6q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftd49ryunjm8nlu29qg6q.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ask three assistants for the &lt;strong&gt;top news sources&lt;/strong&gt; - with domains - and you get three confident shortlists that optimize for different jobs. One model ranks &lt;strong&gt;wire and reputation&lt;/strong&gt; brands.&lt;/p&gt;

&lt;p&gt;Another ranks &lt;strong&gt;monthly traffic&lt;/strong&gt;. A third mixes both and folds in &lt;strong&gt;aggregators&lt;/strong&gt;. That is useful brainstorming. It is a weak foundation for a production &lt;strong&gt;news source allowlist&lt;/strong&gt;, where the publisher set must stay stable across Articles and Stories jobs.&lt;/p&gt;

&lt;p&gt;We compared ChatGPT, Claude, and Gemini top-8 answers, then lined them up against Perigon’s public &lt;strong&gt;top100&lt;/strong&gt; source group (ID &lt;strong&gt;15&lt;/strong&gt;, display name &lt;strong&gt;Most popular&lt;/strong&gt; - about &lt;strong&gt;94&lt;/strong&gt; domains). Across the three AI lists, only &lt;strong&gt;three&lt;/strong&gt; publishers appear on every roster: &lt;strong&gt;BBC&lt;/strong&gt;, &lt;strong&gt;The New York Times&lt;/strong&gt;, and &lt;strong&gt;CNN&lt;/strong&gt;. Everything else is a bias toward wires, portals, or partisan traffic leaders.&lt;/p&gt;

&lt;p&gt;This article covers:&lt;/p&gt;

&lt;p&gt;Why AI-generated &lt;strong&gt;best news sources&lt;/strong&gt; lists disagree&lt;/p&gt;

&lt;p&gt;What top100 covers that short lists drop&lt;/p&gt;

&lt;p&gt;How to monitor general news with that source group&lt;/p&gt;

&lt;p&gt;How to &lt;strong&gt;filter news by source&lt;/strong&gt;, topic, company, and date inside the pack&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Try it live:&lt;/strong&gt; &lt;a href="https://perigon.io/sandbox?endpoint=sources" rel="noopener noreferrer"&gt;Sources sandbox&lt;/a&gt; · &lt;strong&gt;Docs:&lt;/strong&gt; &lt;a href="https://perigon.io/docs/api/sources" rel="noopener noreferrer"&gt;Sources and source groups&lt;/a&gt; · &lt;strong&gt;Plans:&lt;/strong&gt; &lt;a href="https://perigon.io/products/pricing/apis" rel="noopener noreferrer"&gt;API pricing&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Vertical packs (different SERPs): &lt;a href="https://perigon.io/blog/best-financial-news-sources-top25finance" rel="noopener noreferrer"&gt;top25finance&lt;/a&gt; · &lt;a href="https://perigon.io/blog/healthcare-news-compare-top-trade-publications" rel="noopener noreferrer"&gt;healthcare trade pubs&lt;/a&gt;. This page owns the general &lt;strong&gt;most popular&lt;/strong&gt; pack only.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why AI top-8 news lists are not a production allowlist
&lt;/h2&gt;

&lt;p&gt;The disagreement is not noise - each model answers a different reading of “top”:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ChatGPT&lt;/strong&gt; leans &lt;strong&gt;influence and international desks&lt;/strong&gt;: Reuters, Associated Press, BBC, NYT, Washington Post, WSJ, Bloomberg, CNN. Strong for wires and prestige brands; light on pure traffic portals.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Claude&lt;/strong&gt; leans &lt;strong&gt;Similarweb-style traffic&lt;/strong&gt;: Yahoo (including Japan), BBC, NYT, CNN, Fox News, USA Today, Daily Mail. Strong for visit volume; includes aggregator/portal surfaces that are not traditional newsrooms.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gemini&lt;/strong&gt; mixes both and adds &lt;strong&gt;The Guardian&lt;/strong&gt;, Reuters, Yahoo, and &lt;strong&gt;MSN&lt;/strong&gt; - calling out that portals often rank high because they are homepages, while original reporting still comes from wires and newspapers.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;What AI does&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;What breaks in production&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Returns a neat “top 8”&lt;/td&gt;
&lt;td&gt;Misses local metros, lifestyle desks, and half the opinion spectrum your product may need&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sounds authoritative&lt;/td&gt;
&lt;td&gt;Different model → different publishers → different alert quality&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Optimizes for one ranking lens&lt;/td&gt;
&lt;td&gt;Traffic ≠ reputation ≠ “trusted” - and none of those lenses equals a maintained group name&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Treat LLM shortlists as &lt;strong&gt;research signals&lt;/strong&gt;. Do not paste them into source= forever and call the feed done.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fuller picture: top100 (most popular)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Field&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Value&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Name&lt;/td&gt;
&lt;td&gt;top100&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Display name&lt;/td&gt;
&lt;td&gt;Most popular&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Source group ID&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Size&lt;/td&gt;
&lt;td&gt;~94 domains&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scope&lt;/td&gt;
&lt;td&gt;Top most popular sources globally&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Pass sourceGroup=top100 on Articles (/v1/all), Headlines, or Stories. Inspect members via the Sources API with the same group name - without dumping every domain into this article twice.&lt;/p&gt;

&lt;p&gt;Rather than stopping at eight household names, the group spans the lanes that show up when teams actually ship a &lt;strong&gt;popular news&lt;/strong&gt; feed:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1) Wires and global brands&lt;/strong&gt; - Reuters, AP, BBC, NYT, Washington Post, WSJ, Bloomberg, CNN, and peers the reputation-style lists already name.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2) High-traffic digital and cable&lt;/strong&gt; - Fox News, USA Today, Daily Mail, HuffPost, NBC, CBS, ABC, and similar mass-reach desks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3) U.S. metro and regional papers&lt;/strong&gt; - Los Angeles Times, Boston Globe, Chicago Tribune, Seattle Times, Miami Herald, and other city desks short “global top 8” lists almost never assemble.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4) Business and markets adjacent&lt;/strong&gt; - CNBC, Forbes, Yahoo Finance, Quartz - without requiring the finance-only top25finance pack.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5) Opinion and partisan digital&lt;/strong&gt; - outlets across the spectrum (from Breitbart and Daily Wire to Daily Kos and Raw Story) so a “popular” feed is not accidentally center-only.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6) Lifestyle and culture&lt;/strong&gt; - People, BuzzFeed, Cosmopolitan, Variety, Vanity Fair - the consumer layer pure politics lists drop.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;7) International English desks&lt;/strong&gt; - Al Jazeera, South China Morning Post, The Guardian, Telegraph, and others beyond a U.S.-cable shortlist.&lt;/p&gt;

&lt;h3&gt;
  
  
  How the group compares with the AI picks
&lt;/h3&gt;

&lt;p&gt;Almost every domain the three models named is already inside top100. The practical gaps run the other way: short lists never assemble metro papers, lifestyle titles, or the broader opinion set that a “most popular globally” pack includes.&lt;/p&gt;

&lt;p&gt;Honest misses relative to the AI traffic answers:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;yahoo.co.jp&lt;/strong&gt; (Claude’s global traffic leader) is not in this snapshot - the pack includes yahoo.com / finance.yahoo.com instead.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;msn.com&lt;/strong&gt; (Gemini) is not listed as such; the group includes Microsoft’s ms.now surface. If you need a specific portal hostname, add it with source= or a private group.&lt;/p&gt;

&lt;p&gt;That is the point of a curated &lt;strong&gt;sourceGroup&lt;/strong&gt;: one reusable name for the popular-publisher fence, not a chat paste that changes when you switch models.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to monitor news with top100
&lt;/h2&gt;

&lt;p&gt;Scope &lt;strong&gt;popular publishers&lt;/strong&gt; first, then keywords or entities. Without a publisher gate, open-web search for politics, markets, or breaking topics pulls blogs, SEO farms, and press-release mills alongside serious desks. Lock the outer fence with sourceGroup=top100, then narrow.&lt;/p&gt;

&lt;p&gt;Pattern on Articles: pass sourceGroup set to top100, add q for the beat you care about, and poll with from / to or addDateFrom for digests. For a company or person watch inside popular outlets, stack companySymbol / companyId or personWikidataId the same way - the Company and People guides own the full entity cookbook; here the group is the allowlist.&lt;/p&gt;

&lt;p&gt;Use the same sourceGroup on the &lt;strong&gt;Stories API&lt;/strong&gt; when one event reprints across many major outlets - you track the narrative cluster once instead of every mirror URL. For a short briefing of that filtered set, pass results into Search Summarizer. Vertical desks that need trade pubs only should use the industry packs (finance, healthcare, automotive, industrial) rather than stretching top100 into a niche B2B feed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Filter popular news by source, topic, company, and date
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Goal&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Mechanism&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Notes for general feeds&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Popular-publisher allowlist&lt;/td&gt;
&lt;td&gt;sourceGroup=top100&lt;/td&gt;
&lt;td&gt;Most-popular global pack (15)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;One-off domain&lt;/td&gt;
&lt;td&gt;source / excludeSource&lt;/td&gt;
&lt;td&gt;Portals or titles missing from the snapshot&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Who is mentioned&lt;/td&gt;
&lt;td&gt;companyId / companySymbol / people filters&lt;/td&gt;
&lt;td&gt;Inside the group&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What it is about&lt;/td&gt;
&lt;td&gt;topic, category, taxonomy&lt;/td&gt;
&lt;td&gt;e.g. Politics slice inside top100&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;When&lt;/td&gt;
&lt;td&gt;from / to / addDateFrom&lt;/td&gt;
&lt;td&gt;Digests and incremental monitors&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Creating private forks of the pack (your own curated list on top of or instead of top100) lives in the Source Groups guide - this page only applies the public name.&lt;/p&gt;

&lt;h2&gt;
  
  
  When an AI list is a brainstorm vs when you need top100
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Situation&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Prefer&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Ideation slide (“brands we recognize”)&lt;/td&gt;
&lt;td&gt;AI shortlist - then verify&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Production &lt;strong&gt;best news sources&lt;/strong&gt; feeds and alerts&lt;/td&gt;
&lt;td&gt;top100 (15)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Finance-only or healthcare-only desk&lt;/td&gt;
&lt;td&gt;Vertical pack (top25finance, healthcare trade pubs, …)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Must-have portal hostname absent from the ~94&lt;/td&gt;
&lt;td&gt;Private group or source=&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Publisher metadata (geography, paywall, traffic)&lt;/td&gt;
&lt;td&gt;Sources API + group name&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Scale inside the pack (last 30 days)
&lt;/h2&gt;

&lt;p&gt;Live Articles counts for &lt;strong&gt;2026-06-19&lt;/strong&gt; through &lt;strong&gt;2026-07-19&lt;/strong&gt; (pubDate window):&lt;/p&gt;

&lt;p&gt;About &lt;strong&gt;604,000&lt;/strong&gt; articles matched sourceGroup=top100.&lt;/p&gt;

&lt;p&gt;About &lt;strong&gt;28 million&lt;/strong&gt; articles matched an open q=* baseline in the same window - so the popular pack is a small, high-signal slice of total index volume (on the order of &lt;strong&gt;2%&lt;/strong&gt;).&lt;/p&gt;

&lt;p&gt;About &lt;strong&gt;110,000&lt;/strong&gt; of the top100 hits also carried category &lt;strong&gt;Politics&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;About &lt;strong&gt;38,500&lt;/strong&gt; Stories clusters matched sourceGroup=top100 in the same window - useful when you care about narrative heat, not every URL.&lt;/p&gt;

&lt;p&gt;Round large numResults in product copy; very large baselines can sit near plan or index caps, so prefer the relative comparison (popular pack vs open web) over treating any single integer as exact forever.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key takeaways
&lt;/h2&gt;

&lt;p&gt;AI &lt;strong&gt;best news sources&lt;/strong&gt; top-8 lists disagree because they optimize for reputation, traffic, or a mix - only BBC, NYT, and CNN were unanimous across the three we compared.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;top100&lt;/strong&gt; (15) is the maintained &lt;strong&gt;most popular&lt;/strong&gt; allowlist (~94 domains): wires, national desks, metros, opinion, lifestyle, and international English - not eight chat suggestions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Filter news by source&lt;/strong&gt; with sourceGroup=top100, then stack q, entities, category, and dates for desk-specific feeds.&lt;/p&gt;

&lt;p&gt;Use LLM lists to brainstorm; use the curated group for production. For industry-only SERPs, switch to the matching vertical pack instead of overloading top100.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Get started:&lt;/strong&gt; &lt;a href="https://perigon.io/sandbox?endpoint=sources" rel="noopener noreferrer"&gt;Sources sandbox&lt;/a&gt; · &lt;a href="https://perigon.io/docs/api/sources" rel="noopener noreferrer"&gt;Sources and source groups&lt;/a&gt; · &lt;a href="https://perigon.io/reference" rel="noopener noreferrer"&gt;API reference&lt;/a&gt; · &lt;a href="https://perigon.io/products/pricing/apis" rel="noopener noreferrer"&gt;API pricing&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>news</category>
      <category>api</category>
      <category>newsmonitoring</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Left vs Right Political Journalists Compared</title>
      <dc:creator>Oleksyj Mokrousov</dc:creator>
      <pubDate>Tue, 28 Jul 2026 10:05:39 +0000</pubDate>
      <link>https://dev.to/alexperigon/left-vs-right-political-journalists-compared-1867</link>
      <guid>https://dev.to/alexperigon/left-vs-right-political-journalists-compared-1867</guid>
      <description>&lt;h2&gt;
  
  
  Building political media monitoring without ideology fields
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffm07vnl05y4m8crouz54.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffm07vnl05y4m8crouz54.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Teams searching for &lt;strong&gt;left vs right political journalists&lt;/strong&gt; usually need a &lt;strong&gt;political monitoring system&lt;/strong&gt;: two reusable byline datasets, transparent rules, and stable IDs they can apply on article search. They do not need an editorial ranking of reporters.&lt;/p&gt;

&lt;p&gt;Perigon does &lt;strong&gt;not&lt;/strong&gt; assign left/right ideology to journalists. There is no journalist-level lean parameter. Any “left vs right” framing in your product comes from &lt;strong&gt;publisher clusters you define&lt;/strong&gt;, then from journalists whose profiles match those publishers. This guide teaches that reproducible methodology - data quality, verification, and &lt;strong&gt;journalist identity resolution&lt;/strong&gt; - so the dataset stays accurate when people change employers.&lt;/p&gt;

&lt;p&gt;Why are keyword searches unreliable for &lt;strong&gt;partisan media reporters&lt;/strong&gt;?&lt;/p&gt;

&lt;p&gt;How do customer-defined publisher clusters create comparable datasets?&lt;/p&gt;

&lt;p&gt;What is the end-to-end workflow from cluster → resolved IDs → Articles?&lt;/p&gt;

&lt;p&gt;How do you keep datasets trustworthy as affiliations change?&lt;/p&gt;

&lt;p&gt;When should you use Journalists vs Sources vs People?&lt;/p&gt;

&lt;p&gt;The sections below answer each in order. Full Journalists parameter reference lives in the Journalists API guide and the Entities docs linked above; this page owns the monitoring methodology.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Try it:&lt;/strong&gt; &lt;a href="https://perigon.io/sandbox?endpoint=journalists" rel="noopener noreferrer"&gt;Journalists sandbox&lt;/a&gt; · &lt;strong&gt;Docs:&lt;/strong&gt; &lt;a href="https://perigon.io/docs/api/entities" rel="noopener noreferrer"&gt;Entities&lt;/a&gt; · &lt;strong&gt;Pricing:&lt;/strong&gt; &lt;a href="https://perigon.io/products/pricing/apis" rel="noopener noreferrer"&gt;API pricing&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Why keyword ideology search fails
&lt;/h2&gt;

&lt;p&gt;Searching q for “liberal,” “conservative,” “left,” or “right” does not produce a defensible &lt;strong&gt;partisan journalist list&lt;/strong&gt;. Those tokens appear in quotes, horse-race copy, sports “left tackle,” and photo captions. Different people share the same byline string. Keyword hits are not reproducible ideology membership.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Publisher clustering&lt;/strong&gt; outperforms keyword-based ideology search because membership is explicit: you decide which domains belong in Pack A and Pack B, document that choice, and resolve journalists against source (optionally with category=Politics, country=us, or label = Opinion). Two engineers re-running the same pack definitions get the same discovery inputs. That is the foundation of &lt;strong&gt;media lean journalist discovery&lt;/strong&gt; as engineering practice - not as a claim about individuals’ beliefs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Publisher clusters are defined by the customer
&lt;/h2&gt;

&lt;p&gt;In this workflow, “left” and “right” are &lt;strong&gt;labels on your publisher packs&lt;/strong&gt;, not attributes returned by the Journalists API.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Concept&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Owner&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Which domains sit in Pack A / Pack B&lt;/td&gt;
&lt;td&gt;Your product, research, or compliance rules&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Whether Opinion-heavy sites belong in a pack&lt;/td&gt;
&lt;td&gt;Your product&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Journalist profile fields (title, topSources, id)&lt;/td&gt;
&lt;td&gt;Perigon index&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ideology of a person&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Not&lt;/strong&gt; provided by the API&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Different organizations choose different outlet lists for good reasons: brand risk, geographic focus, inclusion of opinion vs newsroom domains, licensed publishers, or internal media-bias taxonomies. Two customers can both build &lt;strong&gt;left vs right journalists&lt;/strong&gt; monitors and disagree on whether a given domain belongs in a pack. That disagreement is expected. Document the pack version (domains + date + rationale) next to any saved ID list so audits can reproduce results.&lt;/p&gt;

&lt;p&gt;Example pack &lt;em&gt;shapes&lt;/em&gt; (illustrative only - replace with your approved domains):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Your label&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Role in the system&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Example domain pattern&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Pack R&lt;/td&gt;
&lt;td&gt;Customer-defined “right” publisher set&lt;/td&gt;
&lt;td&gt;Domains your policy treats as that cluster&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pack L&lt;/td&gt;
&lt;td&gt;Customer-defined “left” publisher set&lt;/td&gt;
&lt;td&gt;Domains your policy treats as that cluster&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Do not treat any sample domain list in a blog post as Perigon’s official ideology map. The API only answers: which journalists are associated with the publishers you queried.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reproducible workflow: cluster → resolve → verify → save → apply
&lt;/h2&gt;

&lt;p&gt;Use the same pipeline for both packs. Keep pack membership metadata on every saved row.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Define publisher clusters&lt;/strong&gt;&lt;br&gt;
Store Pack L and Pack R as versioned domain lists (and optional rules such as “Opinion allowed”).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Resolve journalists&lt;/strong&gt;&lt;br&gt;
On /v1/journalists/all, query with source set to the pack’s domains. Narrow with category, country, label, or minMonthlyPosts as your quality bar requires. For known bylines, use name / twitter and then verify.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verify before save&lt;/strong&gt;&lt;br&gt;
For each candidate, confirm title and topSources still match the pack you intend. Reject near-matches, empty activity, or profiles whose top publishers fall outside the pack.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Save reusable journalist IDs&lt;/strong&gt;&lt;br&gt;
Persist journalistId, pack label, pack version, verification timestamp, and optionally the topSources snapshot you accepted.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use journalistId on Articles&lt;/strong&gt;&lt;br&gt;
On /v1/all, pass journalistId (OR) or excludeJournalistId (AND) to build feeds. The ID identifies the byline match - it does &lt;strong&gt;not&lt;/strong&gt; encode ideology. Ideology, if any, remains the pack label you attached in step 4.&lt;/p&gt;

&lt;p&gt;That pipeline is the primary topic of this page: &lt;strong&gt;building publisher-based journalist datasets&lt;/strong&gt; for political media intelligence, while still matching search intent around &lt;strong&gt;left vs right political journalists&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Journalist identity resolution and byline disambiguation
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Journalist identity resolution&lt;/strong&gt; means mapping a human byline to a single stable id in the journalist index. Common failure modes:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Failure&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Mitigation&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Shared or similar names&lt;/td&gt;
&lt;td&gt;Compare title, Twitter handle, and topSources; do not pick the first row&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Syndication noise&lt;/td&gt;
&lt;td&gt;High post volume across many domains can pull in off-pack publishers - require pack overlap in topSources&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Empty or stale profiles&lt;/td&gt;
&lt;td&gt;Prefer profiles with recent updatedAt / non-zero avgMonthlyPosts when activity matters&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Domain filter returns zero&lt;/td&gt;
&lt;td&gt;Some brands publish under alternate hosts; fall back to name resolve, then verify sources&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Byline disambiguation&lt;/strong&gt; is a data-quality gate, not a political judgment. If title and topSources do not support membership in the customer pack, do not save the ID into that pack’s dataset.&lt;/p&gt;

&lt;h2&gt;
  
  
  Data quality: verify title and topSources every time
&lt;/h2&gt;

&lt;p&gt;Before a profile enters production:&lt;/p&gt;

&lt;p&gt;1) Read title - does the role match the desk you monitor (politics, opinion, correspondence), or is it sports/lifestyle collision?&lt;/p&gt;

&lt;p&gt;2) Read topSources - do the leading domains intersect your pack version?&lt;/p&gt;

&lt;p&gt;3) Optionally check topLabels / topTopics as secondary signals, not as ideology classifiers.&lt;/p&gt;

&lt;p&gt;4) Record who verified the row and when.&lt;/p&gt;

&lt;p&gt;Skipping verification is how &lt;strong&gt;partisan media reporters&lt;/strong&gt; datasets silently fill with wrong people. Reproducibility requires the verification step to be part of the written method, not an optional polish.&lt;/p&gt;

&lt;h2&gt;
  
  
  Affiliations change: refresh saved journalist IDs
&lt;/h2&gt;

&lt;p&gt;Journalists change employers, shows, and syndication patterns. A journalistId remains a useful primary key, but pack membership is time-bound:&lt;/p&gt;

&lt;p&gt;Schedule a periodic refresh (for example monthly or each pack-version bump).&lt;/p&gt;

&lt;p&gt;Re-fetch /v1/journalists/{id} or re-run name resolve.&lt;/p&gt;

&lt;p&gt;Re-check title and topSources against the current pack.&lt;/p&gt;

&lt;p&gt;Move IDs between Pack L and Pack R only when your policy says the publisher footprint changed - and log the change.&lt;/p&gt;

&lt;p&gt;Retire IDs that no longer meet the quality bar.&lt;/p&gt;

&lt;p&gt;Evergreen monitors depend on this maintenance loop. Static “lists of left vs right journalists” scraped once will drift.&lt;/p&gt;

&lt;h2&gt;
  
  
  Integrate Journalists API results with the Articles API
&lt;/h2&gt;

&lt;p&gt;After IDs are verified and labeled with a pack version:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Articles parameter&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Use in political monitoring&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;journalistId&lt;/td&gt;
&lt;td&gt;Include bylines from one pack (or a union you explicitly label)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;excludeJournalistId&lt;/td&gt;
&lt;td&gt;Drop bylines that flood or fail QA&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;author / excludeAuthor&lt;/td&gt;
&lt;td&gt;Name-only fallback when an ID is not yet resolved - weaker than IDs&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Combine with your usual article filters (q, dates, category) for event language. Keep pack ideology metadata in &lt;em&gt;your&lt;/em&gt; datastore; do not expect Articles responses to return left/right on the journalist object.&lt;/p&gt;

&lt;h2&gt;
  
  
  When to use Journalists vs Sources vs People
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Monitoring question&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;API family&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Which &lt;strong&gt;writers&lt;/strong&gt; match our publisher packs?&lt;/td&gt;
&lt;td&gt;Journalists → save journalistId&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Which &lt;strong&gt;publishers&lt;/strong&gt; define the packs / outlet skew?&lt;/td&gt;
&lt;td&gt;Sources / source groups&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Which &lt;strong&gt;people&lt;/strong&gt; are mentioned as subjects (candidates, officials)?&lt;/td&gt;
&lt;td&gt;People (personName, personWikidataId)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Mixing these layers is a common design bug: treating a mentioned politician as a byline, or treating a source-group lean pack as a journalist ideology field. Keep writer, publisher, and subject as separate allowlists.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resolve smoke tests (not rankings)
&lt;/h2&gt;

&lt;p&gt;The following IDs are &lt;strong&gt;resolution examples&lt;/strong&gt; from live lookups - used to illustrate verification, not to rank or endorse anyone. Each row is “this profile resolved; confirm topSources against &lt;em&gt;your&lt;/em&gt; pack before production use.” Ideology is only whatever pack label &lt;em&gt;you&lt;/em&gt; attach after verification.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;After querying a customer Pack R (illustrative domains such as foxnews.com / nationalreview.com / thefederalist.com / washingtonexaminer.com):&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Name&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Resolved id&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Verification cue&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Bret Baier&lt;/td&gt;
&lt;td&gt;377c544662ed4358921cba67a336ef4f&lt;/td&gt;
&lt;td&gt;Title + foxnews.com in topSources&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Byron York&lt;/td&gt;
&lt;td&gt;677cd5fe712f44b680f7ec815edbd365&lt;/td&gt;
&lt;td&gt;washingtonexaminer.com in topSources&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rich Lowry&lt;/td&gt;
&lt;td&gt;67a37bc03b434bd0a481d52fdda47b56&lt;/td&gt;
&lt;td&gt;nationalreview.com in topSources&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;After querying a customer Pack L (illustrative domains such as nytimes.com / washingtonpost.com / huffpost.com):&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Name&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Resolved id&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Verification cue&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Jamelle Bouie&lt;/td&gt;
&lt;td&gt;891fe2e6b12a4518b61d045f4172fad5&lt;/td&gt;
&lt;td&gt;Columnist title + nytimes.com in topSources&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Jennifer Rubin&lt;/td&gt;
&lt;td&gt;dff54a11b7954148b08a39e07403b035&lt;/td&gt;
&lt;td&gt;Opinion-writer title; re-check live topSources before save&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rachel Maddow&lt;/td&gt;
&lt;td&gt;e93c35d952cc4dd88d68c38b748f3ca4&lt;/td&gt;
&lt;td&gt;Host title; confirm current topSources (domain filters for some TV brands can return empty - name resolve + verify)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If verification fails, do not keep the ID in that pack’s dataset. Replace with another resolved profile that passes your gates.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key takeaways
&lt;/h2&gt;

&lt;p&gt;Search intent for &lt;strong&gt;left vs right political journalists&lt;/strong&gt; is best served by &lt;strong&gt;publisher-cluster datasets&lt;/strong&gt;, not keyword ideology queries.&lt;/p&gt;

&lt;p&gt;Perigon does not label journalists as left or right; pack definitions and ideology labels are yours.&lt;/p&gt;

&lt;p&gt;Workflow: define clusters → resolve → verify title / topSources → save versioned IDs → apply journalistId on Articles.&lt;/p&gt;

&lt;p&gt;Refresh saved IDs as affiliations and topSources change.&lt;/p&gt;

&lt;p&gt;Use Journalists for writers, Sources for publishers, People for mentioned subjects.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Get started:&lt;/strong&gt; &lt;a href="https://perigon.io/sandbox?endpoint=journalists" rel="noopener noreferrer"&gt;Journalists sandbox&lt;/a&gt; · &lt;a href="https://perigon.io/docs/api/entities" rel="noopener noreferrer"&gt;Entities&lt;/a&gt; · &lt;a href="https://perigon.io/products/pricing/apis" rel="noopener noreferrer"&gt;API pricing&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>news</category>
      <category>api</category>
      <category>newsmonitoring</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Perigon SDK Overview: Official Client Libraries for the News API</title>
      <dc:creator>Oleksyj Mokrousov</dc:creator>
      <pubDate>Tue, 28 Jul 2026 10:04:08 +0000</pubDate>
      <link>https://dev.to/alexperigon/perigon-sdk-overview-official-client-libraries-for-the-news-api-1gbo</link>
      <guid>https://dev.to/alexperigon/perigon-sdk-overview-official-client-libraries-for-the-news-api-1gbo</guid>
      <description>&lt;h2&gt;
  
  
  The real question is not “is there an SDK?”
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmpta0cwbrmjzgkbmw6gm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmpta0cwbrmjzgkbmw6gm.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Most teams already know Perigon publishes an &lt;strong&gt;official news SDK&lt;/strong&gt;. The harder &lt;strong&gt;API onboarding&lt;/strong&gt; question is whether your product should call the News API through that &lt;strong&gt;software development kit&lt;/strong&gt; or through raw &lt;strong&gt;HTTP&lt;/strong&gt; / REST forever.&lt;/p&gt;

&lt;p&gt;This page is only a &lt;strong&gt;SDK vs HTTP&lt;/strong&gt; / &lt;strong&gt;REST vs SDK&lt;/strong&gt; decision guide. Exact packages, install steps, and typed-client ergonomics live on &lt;a href="https://perigon.io/docs/api/perigon-sdks" rel="noopener noreferrer"&gt;Perigon SDKs&lt;/a&gt; plus the sibling install and typed-client posts. Articles search design stays on the practical news API guide.&lt;/p&gt;

&lt;p&gt;What problem does a &lt;strong&gt;Perigon SDK&lt;/strong&gt; actually solve on the &lt;strong&gt;API integration path&lt;/strong&gt;?&lt;/p&gt;

&lt;p&gt;When does a &lt;strong&gt;multi-language SDK&lt;/strong&gt; change the build-vs-buy transport decision?&lt;/p&gt;

&lt;p&gt;When should you &lt;strong&gt;choose news SDK&lt;/strong&gt; clients instead of raw REST?&lt;/p&gt;

&lt;p&gt;Which architecture tradeoffs still favor owning HTTP yourself?&lt;/p&gt;

&lt;p&gt;The sections below answer each in order.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Read the docs:&lt;/strong&gt; &lt;a href="https://perigon.io/docs/api/perigon-sdks" rel="noopener noreferrer"&gt;Perigon SDKs&lt;/a&gt; · &lt;strong&gt;Developer home:&lt;/strong&gt; &lt;a href="https://perigon.io/docs/api/getting-started" rel="noopener noreferrer"&gt;Getting started&lt;/a&gt; · &lt;strong&gt;Compare plans:&lt;/strong&gt; &lt;a href="https://perigon.io/products/pricing/apis" rel="noopener noreferrer"&gt;API pricing&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What is the Perigon SDK for, architecturally?
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;Perigon SDK&lt;/strong&gt; is Perigon's &lt;strong&gt;official news SDK&lt;/strong&gt;: maintained &lt;strong&gt;news API client libraries&lt;/strong&gt; that sit between your application and the REST News API. From an architecture view, the SDK is a &lt;strong&gt;transport abstraction&lt;/strong&gt; - your code talks to a client object; the client owns serialization, auth attachment, and response decoding.&lt;/p&gt;

&lt;p&gt;That matters for &lt;strong&gt;developer productivity&lt;/strong&gt; and long-term maintenance more than for “having a package.” Without an official client, every service invents its own thin wrapper. Six months later you have three incompatible helpers, none of which track docs changes. With the SDK, onboarding a new engineer means “use the supported client,” not “copy the curl from Slack.”&lt;/p&gt;

&lt;p&gt;The SDK is not a different API and not a substitute for learning which filters to pass. It changes &lt;em&gt;who maintains the HTTP edge&lt;/em&gt; - Perigon’s &lt;strong&gt;official client libraries&lt;/strong&gt; versus your team.&lt;/p&gt;

&lt;h2&gt;
  
  
  Multi-language SDK coverage as a staffing decision
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;multi-language SDK&lt;/strong&gt; is less about collecting languages and more about matching the runtimes you already staff. If your backend is already standardized on a supported stack, picking the &lt;strong&gt;news API SDK&lt;/strong&gt; for that stack is usually the default &lt;strong&gt;API integration path&lt;/strong&gt;. If your edge workers, ETL jobs, and mobile backends each speak a different language - and only one of them has an official client - you need an explicit policy: SDK where supported, thin REST where not, rather than forcing one language’s package into every process.&lt;/p&gt;

&lt;p&gt;Unsupported runtimes are not a failure of the SDK; they are a signal to stay on HTTP (or request another binding via the SDKs docs) instead of pretending a missing client exists.&lt;/p&gt;

&lt;h2&gt;
  
  
  REST vs SDK: decision scenarios
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Situation&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Prefer&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Why&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Spike in Postman / curl to learn filters&lt;/td&gt;
&lt;td&gt;Raw &lt;strong&gt;HTTP&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Fastest feedback loop; no package lifecycle&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Production service on a supported runtime&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Perigon SDK&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Lower maintenance; shared patterns across teams&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Many services, one platform team&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;SDK&lt;/strong&gt; (&lt;strong&gt;client library vs REST&lt;/strong&gt;)&lt;/td&gt;
&lt;td&gt;One supported onboarding path&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Exotic runtime or strict “no third-party clients” policy&lt;/td&gt;
&lt;td&gt;HTTP you own&lt;/td&gt;
&lt;td&gt;You accept wrapper maintenance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Query design still fluid&lt;/td&gt;
&lt;td&gt;Learn filters first, then lock transport&lt;/td&gt;
&lt;td&gt;Do not block product learning on packaging&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;SDK vs raw REST&lt;/strong&gt; is rarely about feature parity - both hit the same endpoints. The tradeoff is &lt;strong&gt;maintenance&lt;/strong&gt;, &lt;strong&gt;onboarding&lt;/strong&gt;, and &lt;strong&gt;long-term support&lt;/strong&gt;: who upgrades when parameters or models change, and how many home-grown clients you are willing to babysit.&lt;/p&gt;

&lt;p&gt;Prefer the SDK when transport should be boring and identical across services. Prefer HTTP when you need maximum control, minimal dependencies, or a runtime outside the official set.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture tradeoffs that still favor owning HTTP
&lt;/h2&gt;

&lt;p&gt;Some teams should keep raw REST even when an SDK exists:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1) Compliance / supply-chain rules&lt;/strong&gt; that freeze third-party client libraries&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2) Ultra-thin edge workers&lt;/strong&gt; where every dependency byte is budgeted&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3) Polyglot glue&lt;/strong&gt; that already centralizes HTTP in an internal gateway - the gateway speaks REST; apps never see Perigon directly&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4) Experimental research notebooks&lt;/strong&gt; that change weekly and should not pin SDK majors&lt;/p&gt;

&lt;p&gt;Those are conscious &lt;strong&gt;HTTP client vs SDK&lt;/strong&gt; choices. If none of them apply, choosing the &lt;strong&gt;official client libraries&lt;/strong&gt; is usually the lower-risk default.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to sequence the decision (without installing anything here)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Decision&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Where to go next&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SDK vs HTTP for this service&lt;/td&gt;
&lt;td&gt;This overview&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;How to install and authenticate safely&lt;/td&gt;
&lt;td&gt;SDK install best-practices guide&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Why typed clients help large codebases&lt;/td&gt;
&lt;td&gt;Typed SDK clients / DX guide&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Which filters and feeds to build&lt;/td&gt;
&lt;td&gt;&lt;a href="https://perigon.io/blog/google-has-no-news-api-perigon-does-search-articles-apply-filters-and-build-feeds" rel="noopener noreferrer"&gt;Practical news API guide&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Key takeaways
&lt;/h2&gt;

&lt;p&gt;Treat the &lt;strong&gt;Perigon SDK&lt;/strong&gt; as transport ownership and &lt;strong&gt;developer productivity&lt;/strong&gt;, not as a second News API.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Multi-language SDK&lt;/strong&gt; coverage answers “can my staffed runtime use an official client?” - not “which command do I run?”&lt;/p&gt;

&lt;p&gt;Prefer the SDK for production on supported stacks; prefer raw REST for spikes, exotic runtimes, or deliberate HTTP ownership.&lt;/p&gt;

&lt;p&gt;This page only answers &lt;strong&gt;when to use SDK&lt;/strong&gt; vs HTTP; packages, keys, and typed DX live elsewhere.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Get started:&lt;/strong&gt; &lt;a href="https://perigon.io/docs/api/perigon-sdks" rel="noopener noreferrer"&gt;Perigon SDKs&lt;/a&gt; · &lt;a href="https://perigon.io/products/pricing/apis" rel="noopener noreferrer"&gt;API pricing&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>news</category>
      <category>api</category>
      <category>newsmonitoring</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Monitor Middle East Conflict News</title>
      <dc:creator>Oleksyj Mokrousov</dc:creator>
      <pubDate>Tue, 28 Jul 2026 10:02:34 +0000</pubDate>
      <link>https://dev.to/alexperigon/monitor-middle-east-conflict-news-4698</link>
      <guid>https://dev.to/alexperigon/monitor-middle-east-conflict-news-4698</guid>
      <description>&lt;h2&gt;
  
  
  Why teams monitor Middle East conflict news
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9avcxswv46qeczn69uqt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9avcxswv46qeczn69uqt.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Middle East is rarely a single story. On any given week, coverage spans &lt;strong&gt;Israel-Gaza&lt;/strong&gt;, &lt;strong&gt;Iran&lt;/strong&gt; and its nuclear file, &lt;strong&gt;Lebanon and Hezbollah&lt;/strong&gt;, &lt;strong&gt;Red Sea shipping&lt;/strong&gt; attacks, and the diplomacy around all of them - each moving at a different speed. Analysts, risk teams, and newsrooms that watch the region need to catch escalations early without drowning in duplicate wire copy, and they need to tell a genuine turning point apart from routine daily volume.&lt;/p&gt;

&lt;p&gt;Keyword alerts alone break down here. A single broad term returns hundreds of thousands of articles a month, most of them reprints of the same handful of developments. The job is to watch &lt;strong&gt;several theaters in parallel&lt;/strong&gt;, get told when something changes, and keep a running narrative for each front.&lt;/p&gt;

&lt;p&gt;What makes &lt;strong&gt;Middle East conflict news&lt;/strong&gt; hard to monitor?&lt;/p&gt;

&lt;p&gt;How do you set up a Signal to watch the region on perigon.io/home?&lt;/p&gt;

&lt;p&gt;Which Articles and Stories filters scope a multi-theater beat?&lt;/p&gt;

&lt;p&gt;When should you rely on Signals vs Articles vs Stories?&lt;/p&gt;

&lt;p&gt;The sections below answer each in order.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Set up a Signal:&lt;/strong&gt; &lt;a href="https://perigon.io/home" rel="noopener noreferrer"&gt;perigon.io/home&lt;/a&gt; · &lt;strong&gt;Try the API:&lt;/strong&gt; &lt;a href="https://perigon.io/sandbox?endpoint=articles" rel="noopener noreferrer"&gt;Articles sandbox&lt;/a&gt; · &lt;strong&gt;Compare plans:&lt;/strong&gt; &lt;a href="https://perigon.io/products/pricing/signals" rel="noopener noreferrer"&gt;Signals pricing&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What monitoring the region means in practice
&lt;/h2&gt;

&lt;p&gt;There are two distinct jobs, and they map to two different tools.&lt;/p&gt;

&lt;p&gt;A &lt;strong&gt;Signal&lt;/strong&gt; is a continuous watch. You describe the region and the kinds of developments you care about in plain English, and it keeps working in the background - delivering &lt;strong&gt;Middle East war alerts&lt;/strong&gt; in real time or as a scheduled briefing. That is the difference from a one-off search: you set intent once, and coverage comes to you.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stories&lt;/strong&gt; are the momentum layer. Perigon clusters related articles into a single evolving narrative, so an escalation that generates thousands of articles shows up as one trackable cluster you can follow over time. That is what makes &lt;strong&gt;regional conflict monitoring&lt;/strong&gt; manageable across five theaters at once.&lt;/p&gt;

&lt;p&gt;Use Signals for the live watch, Articles for precise historical queries, and Stories to see which fronts are actually accelerating.&lt;/p&gt;

&lt;h2&gt;
  
  
  Set up a Signal
&lt;/h2&gt;

&lt;p&gt;Go to perigon.io/home and describe the beat in plain language - the assistant helps you refine scope, conditions, and how results are delivered (email, webhook, or a connector such as Slack). For a multi-theater region, name the fronts explicitly so nothing is dropped.&lt;/p&gt;

&lt;p&gt;Copy-paste starting points:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Real-time escalation alert&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Alert me to major escalations in the Middle East - airstrikes, ceasefire announcements, and cross-border attacks involving Israel, Gaza, Lebanon, Iran, or Red Sea shipping. Send each as it happens to my Slack channel.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Morning regional briefing&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every morning, summarize overnight developments across Israel-Gaza, Iran, Lebanon and Hezbollah, and Red Sea shipping. Group the summary by theater and include source links.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Diplomacy and de-escalation watch&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Track statements, resolutions, and inspections from the UN Security Council and the IAEA related to the Middle East, and flag any ceasefire talks or nuclear-inspection developments.&lt;/p&gt;

&lt;p&gt;Because escalations are event-like, Perigon delivers them in real time; a "summarize every morning" prompt is treated as a scheduled digest instead. You can run more than one Signal - a fast alert plus a calmer daily briefing is a common pairing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Theaters and institutions to scope
&lt;/h2&gt;

&lt;p&gt;A durable regional watch is organized by &lt;strong&gt;theater&lt;/strong&gt; and by the &lt;strong&gt;institutions&lt;/strong&gt; that shape de-escalation, not by whichever name is in today's headline. Evergreen fronts worth naming in a Signal or query:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Israel-Gaza&lt;/strong&gt; - the highest-volume front, covering military operations, humanitarian access, and ceasefire cycles.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Iran&lt;/strong&gt; - the nuclear file, proxy networks, and sanctions-linked tensions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lebanon and Hezbollah&lt;/strong&gt; - cross-border exchanges and their spillover risk.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Red Sea shipping&lt;/strong&gt; - attacks on vessels near one of the world's busiest maritime corridors (a security and freight-disruption angle - for crude-price and energy-market coverage, use a dedicated oil/energy watch instead).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Diplomacy&lt;/strong&gt; - the &lt;strong&gt;UN Security Council&lt;/strong&gt; and &lt;strong&gt;IAEA&lt;/strong&gt; as standing institutions whose statements and resolutions often mark turning points.&lt;/p&gt;

&lt;p&gt;Keeping these as roles and geographies - rather than one-off personalities - is what makes the Signal and the queries below reusable month after month.&lt;/p&gt;

&lt;h2&gt;
  
  
  Articles API recipes for the region
&lt;/h2&gt;

&lt;p&gt;On the Articles API (/v1/all), build one query per theater and keep them narrow with Boolean q. Pair Israel, Gaza, or Hamas with escalation terms like strike, ceasefire, or offensive; pair Iran with nuclear, sanctions, or proxy; pair Red Sea or Houthi with vessel, shipping, or attack. Add category set to Politics to bias toward hard-news coverage, and sortBy set to date for the newest first.&lt;/p&gt;

&lt;p&gt;To weight regional reporting, use sourceCountry for publisher geography or country for the story's associated country, and reach for language when you need Arabic-language or English-only slices. Stack from and to for a fixed window, or sortBy set to date with a rolling window for a live feed. Keep each theater as its own query so a spike in one front does not bury the others.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stories API recipes for tracking momentum
&lt;/h2&gt;

&lt;p&gt;The Stories API (/v1/stories/all) is where a multi-theater beat becomes readable. The same theater q you used on Articles returns &lt;strong&gt;clusters&lt;/strong&gt; instead of individual articles, so you follow a development as one narrative rather than re-reading a hundred reprints. Sort by article count or recency to surface the fastest-moving fronts, and use an updatedFrom window to see which clusters are still active rather than cooling off.&lt;/p&gt;

&lt;p&gt;The payoff is scale compression: broad theater keywords that return six-figure article counts collapse into a few hundred Stories clusters (see the numbers below). For how clustering groups related coverage into trackable narratives, see the &lt;a href="https://perigon.io/blog/news-stories-api-how-news-clustering-groups-related-articles-into-trackable-narratives" rel="noopener noreferrer"&gt;news clustering guide&lt;/a&gt;; this page keeps the focus on applying it to the region.&lt;/p&gt;

&lt;h2&gt;
  
  
  When to use Signals vs Articles vs Stories
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Goal&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Use&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Why&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Be told the moment a front escalates&lt;/td&gt;
&lt;td&gt;Signal (real-time)&lt;/td&gt;
&lt;td&gt;Continuous watch, delivered to inbox, Slack, or webhook&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A grouped daily read across theaters&lt;/td&gt;
&lt;td&gt;Signal (scheduled)&lt;/td&gt;
&lt;td&gt;One briefing, organized by front&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Precise historical or filtered query&lt;/td&gt;
&lt;td&gt;Articles API&lt;/td&gt;
&lt;td&gt;Full Boolean, category, geography, and date control&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Follow one development over time&lt;/td&gt;
&lt;td&gt;Stories API&lt;/td&gt;
&lt;td&gt;Clustered narrative and momentum, not raw article volume&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;See which theater is accelerating&lt;/td&gt;
&lt;td&gt;Stories API&lt;/td&gt;
&lt;td&gt;Compare cluster counts and recency across fronts&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Beat scale at a glance
&lt;/h2&gt;

&lt;p&gt;A few evergreen facts anchor why this beat needs structure: the region runs &lt;strong&gt;multiple simultaneous theaters&lt;/strong&gt;, the &lt;strong&gt;UN Security Council&lt;/strong&gt; carries standing authority over conflict resolution, the &lt;strong&gt;IAEA&lt;/strong&gt; monitors nuclear activity, and the &lt;strong&gt;Red Sea&lt;/strong&gt; remains one of the world's busiest shipping corridors - so a single week routinely produces parallel, fast-moving stories.&lt;/p&gt;

&lt;p&gt;The live index shows the volume problem directly. Over the 30 days ending July 17, 2026, broad theater keywords returned very large article counts - roughly &lt;strong&gt;345,000&lt;/strong&gt; for Iran-tensions terms, about &lt;strong&gt;222,000&lt;/strong&gt; for broad Middle East conflict terms, and around &lt;strong&gt;215,000&lt;/strong&gt; for Israel-Gaza terms - with Lebanon and Hezbollah near &lt;strong&gt;88,000&lt;/strong&gt;, Middle East coverage inside the Politics category about &lt;strong&gt;77,000&lt;/strong&gt;, regional institutions near &lt;strong&gt;59,000&lt;/strong&gt;, and Red Sea shipping around &lt;strong&gt;13,000&lt;/strong&gt;. (These are wide keyword slices, so treat them as relative signal, not precise tallies.)&lt;/p&gt;

&lt;p&gt;The Stories layer is what makes that tractable. Across the same window, those slices collapsed into a few hundred narrative clusters each - on the order of &lt;strong&gt;800&lt;/strong&gt; for Iran, &lt;strong&gt;600&lt;/strong&gt; for Israel-Gaza, &lt;strong&gt;570&lt;/strong&gt; for broad Middle East conflict, &lt;strong&gt;250&lt;/strong&gt; for Middle East politics, &lt;strong&gt;230&lt;/strong&gt; for Lebanon, &lt;strong&gt;140&lt;/strong&gt; for regional institutions, and about &lt;strong&gt;65&lt;/strong&gt; for Red Sea shipping. In other words, hundreds of thousands of articles became a few hundred stories to actually read.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key takeaways
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Middle East conflict news&lt;/strong&gt; is a multi-theater beat - scope Israel-Gaza, Iran, Lebanon, and Red Sea shipping as separate fronts, not one keyword.&lt;/p&gt;

&lt;p&gt;Set an AI Signal on perigon.io/home for real-time &lt;strong&gt;Middle East war alerts&lt;/strong&gt; or a theater-grouped morning briefing.&lt;/p&gt;

&lt;p&gt;Use the Articles API for precise Boolean, category, geography, and date queries per front.&lt;/p&gt;

&lt;p&gt;Use the Stories API to turn six-figure article volume into a few hundred trackable clusters and see which theater is accelerating.&lt;/p&gt;

&lt;p&gt;Organize the watch around evergreen theaters and institutions (UN, IAEA) so your Signals and queries stay reusable.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Get started:&lt;/strong&gt; &lt;a href="https://perigon.io/home" rel="noopener noreferrer"&gt;perigon.io/home&lt;/a&gt; · &lt;a href="https://perigon.io/products/pricing/signals" rel="noopener noreferrer"&gt;Signals pricing&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>news</category>
      <category>api</category>
      <category>newsmonitoring</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Request News Api to index Publisher</title>
      <dc:creator>Oleksyj Mokrousov</dc:creator>
      <pubDate>Mon, 27 Jul 2026 14:08:29 +0000</pubDate>
      <link>https://dev.to/alexperigon/request-news-api-to-index-publisher-1ihk</link>
      <guid>https://dev.to/alexperigon/request-news-api-to-index-publisher-1ihk</guid>
      <description>&lt;h2&gt;
  
  
  What to do when a publisher is missing from the news API
&lt;/h2&gt;

&lt;p&gt;Perigon indexes hundreds of thousands of publishers, but sometimes the one outlet your product depends on - a niche trade site, a regional paper, or your own brand site - is not in the results yet. The fastest fix is usually to ask Perigon to add it, then confirm whether that is a support request or a plan upgrade.&lt;/p&gt;

&lt;p&gt;This is a support and licensing guide, not an endpoint tutorial. It answers four questions:&lt;/p&gt;

&lt;p&gt;Why is the publisher I need missing from the news API?&lt;/p&gt;

&lt;p&gt;How do I ask Perigon to cover it - or add my own site?&lt;/p&gt;

&lt;p&gt;How do live chat and email support work?&lt;/p&gt;

&lt;p&gt;Which plans unlock request to index sources, an SLA, and a shared Slack channel?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Check what's indexed:&lt;/strong&gt; &lt;a href="https://perigon.io/tools/source-explorer" rel="noopener noreferrer"&gt;Source Explorer&lt;/a&gt; · &lt;strong&gt;Ask for coverage or a demo:&lt;/strong&gt; &lt;a href="https://perigon.io/products/pricing/apis" rel="noopener noreferrer"&gt;API pricing&lt;/a&gt; · &lt;strong&gt;Source docs:&lt;/strong&gt; &lt;a href="https://perigon.io/docs/api/sources" rel="noopener noreferrer"&gt;Sources and source groups&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why a publisher may be missing from the news API
&lt;/h2&gt;

&lt;p&gt;Before you file a request, confirm the outlet is genuinely absent rather than filtered out. A source can be:&lt;/p&gt;

&lt;p&gt;1) Indexed under a different domain or subdomain than the one you searched.&lt;/p&gt;

&lt;p&gt;2) Excluded by your current query filters.&lt;/p&gt;

&lt;p&gt;3) Present but low-volume, so it rarely surfaces.&lt;/p&gt;

&lt;p&gt;Search the domain in Source Explorer or the Sources API first. If it truly is not there, you are looking at one of two different needs - and they route differently.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;You want&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;This is&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;How to get it&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Bundle domains that already exist into a reusable, named filter&lt;/td&gt;
&lt;td&gt;Custom Source Groups (self-serve)&lt;/td&gt;
&lt;td&gt;Source Groups API guide&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Perigon to ingest a publisher that is not in the index yet&lt;/td&gt;
&lt;td&gt;Request index for Sources (Commercial)&lt;/td&gt;
&lt;td&gt;Request via support or sales&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Put simply: Custom Source Groups organize sources Perigon already has, while Index request ask Perigon to add one it does not. This guide covers the second path. If the outlet is already indexed, skip the request and group it yourself.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to request a publisher or add your own site
&lt;/h2&gt;

&lt;p&gt;Adding a publisher is a human review step, not a self-serve API call, so the request goes through Perigon's support channels. Contact support, describe the outlet, and explain why your feed needs it. Perigon then evaluates the source for ingestion. First-party requests - adding your own news site or brand blog - follow the same process as third-party outlets.&lt;/p&gt;

&lt;p&gt;Perigon can consider a range of publisher types, including:&lt;/p&gt;

&lt;p&gt;1) Mainstream and wire outlets&lt;/p&gt;

&lt;p&gt;2) Regional and local newspapers&lt;/p&gt;

&lt;p&gt;3) Niche and trade publications&lt;/p&gt;

&lt;p&gt;4) First-party sites you own and publish&lt;/p&gt;

&lt;p&gt;Eligibility for new sources depends on your plan (see below). If you are on a lower tier and need custom ingestion, the request naturally becomes a sales conversation about moving to Commercial.&lt;/p&gt;

&lt;h3&gt;
  
  
  What to include in your request
&lt;/h3&gt;

&lt;p&gt;A complete request is triaged faster. Include:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Domain&lt;/strong&gt; - the exact publisher domain (for example example-tradedesk.com), plus any subdomains that carry articles.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Publication name&lt;/strong&gt; - the readable outlet name so it can be matched or created.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reason&lt;/strong&gt; - the beat or use case, which helps prioritize the source.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sample article URLs&lt;/strong&gt; - two or three live links that show the crawl target and article structure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ownership&lt;/strong&gt; - for your own site, confirm you own the domain and can grant publishing access.&lt;/p&gt;

&lt;h2&gt;
  
  
  How live chat and email support work
&lt;/h2&gt;

&lt;p&gt;Perigon offers two ways to reach a human, and both work for a coverage request.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Live chat&lt;/strong&gt; opens from the contact widget on every page and routes by intent:&lt;/p&gt;

&lt;p&gt;Coverage requests - a missing publisher - go to support, where sources are evaluated.&lt;/p&gt;

&lt;p&gt;Plan-upgrade questions, such as unlocking New Sources on Commercial, go to sales.&lt;/p&gt;

&lt;p&gt;You can contact sales:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fperigon.io%2F_next%2Fimage%3Furl%3D%252Fapi%252Fmedia%252Ffile%252Fcontact%252Bform.jpg%26w%3D1200%26q%3D100" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fperigon.io%2F_next%2Fimage%3Furl%3D%252Fapi%252Fmedia%252Ffile%252Fcontact%252Bform.jpg%26w%3D1200%26q%3D100" alt="contact+form.jpg" width="1200" height="1388"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Or book a demo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fperigon.io%2F_next%2Fimage%3Furl%3D%252Fapi%252Fmedia%252Ffile%252Fbook_a_demo.jpg%26w%3D1200%26q%3D100" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fperigon.io%2F_next%2Fimage%3Furl%3D%252Fapi%252Fmedia%252Ffile%252Fbook_a_demo.jpg%26w%3D1200%26q%3D100" alt="book_a_demo.jpg" width="1200" height="1424"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Email support&lt;/strong&gt; is available on every plan for account and product questions, including coverage requests you would rather send as a written thread with your domain list attached.&lt;/p&gt;

&lt;p&gt;Use live chat for quick questions ("Can you cover this outlet?", "Which plan do I need?") and email when you want a documented request. Either way, state clearly that you are asking to add a source so it is triaged correctly. Contact and demo booking also live on the pricing page.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which plans unlock indexing of new sources that api do not have, SLA, and shared Slack
&lt;/h2&gt;

&lt;p&gt;Email support is included on every plan, so account and product questions are never gated behind an upgrade. The heavier enterprise support and data features are Commercial-only:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;New Sources&lt;/strong&gt; &lt;strong&gt;indexing&lt;/strong&gt; - Perigon adding publishers you request, including first-party sites.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Upgraded Support&lt;/strong&gt; - a higher support tier beyond standard email.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SLA&lt;/strong&gt; - a formal service-level agreement.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Shared Slack Channel&lt;/strong&gt; - a direct support line between your team and Perigon.&lt;/p&gt;

&lt;p&gt;Do not assume these ship on Free, Basic, or Plus. If your build needs custom ingestion, a guaranteed SLA, or a shared Slack line, that is the signal to talk to sales.&lt;/p&gt;

&lt;h3&gt;
  
  
  Plan and license matrix
&lt;/h3&gt;

&lt;p&gt;This table is scoped to the support and licensing question this article answers, not the full usage matrix. Limits and pricing change, so treat the pricing page as the source of truth.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Feature&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Free&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Basic&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Plus&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Commercial&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Data License / Who Qualifies&lt;/td&gt;
&lt;td&gt;Anyone&lt;/td&gt;
&lt;td&gt;Eligible Startups&lt;/td&gt;
&lt;td&gt;Eligible Startups&lt;/td&gt;
&lt;td&gt;All Businesses&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;License&lt;/td&gt;
&lt;td&gt;Personal&lt;/td&gt;
&lt;td&gt;Limited (Startup)&lt;/td&gt;
&lt;td&gt;Limited (Startup)&lt;/td&gt;
&lt;td&gt;Full Commercial&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Email Support&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;New Sources Indexing&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Upgraded Support&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SLA&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Shared Slack Channel&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Commercial pricing is custom; contact sales rather than expecting a fixed number on the page.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;How long does it take to add a publisher?&lt;/strong&gt; Perigon reviews each source case by case. In general it takes few days - from 12h to 48h.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I request a mainstream or niche trade outlet?&lt;/strong&gt; Yes, both. The format is the same: domain and sample URLs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I add my own news site or brand blog?&lt;/strong&gt; Yes. First-party domains are handled like any other request - just confirm you own the site and can grant publishing access.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Should I contact support or sales?&lt;/strong&gt; Start with support for the coverage question. If unlocking custom sources means upgrading, live chat routes the upgrade to sales, or you can start from the contact options on the pricing page.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key takeaways
&lt;/h2&gt;

&lt;p&gt;Confirm the outlet is truly missing, not just filtered out, before you file a request.&lt;/p&gt;

&lt;p&gt;Custom Source Groups organize existing sources; New Index for Sources ask Perigon to add new ones.&lt;/p&gt;

&lt;p&gt;Request coverage through live chat or email support - email is available on every plan.&lt;/p&gt;

&lt;p&gt;New Custom Sources, Upgraded Support, an SLA, and a Shared Slack Channel are Commercial-only.&lt;/p&gt;

&lt;p&gt;Include the domain, publication name, reason, and sample URLs, and check the pricing page for current plans.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Get started:&lt;/strong&gt; &lt;a href="https://perigon.io/tools/source-explorer" rel="noopener noreferrer"&gt;Source Explorer&lt;/a&gt; · &lt;a href="https://perigon.io/docs/api/sources" rel="noopener noreferrer"&gt;Sources and source groups&lt;/a&gt; · &lt;a href="https://perigon.io/products/pricing/apis" rel="noopener noreferrer"&gt;API pricing&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>news</category>
      <category>api</category>
      <category>python</category>
    </item>
    <item>
      <title>Top Election Journalists: Who Covers Campaigns and Ballots (and How to Find Them)</title>
      <dc:creator>Oleksyj Mokrousov</dc:creator>
      <pubDate>Mon, 27 Jul 2026 14:06:16 +0000</pubDate>
      <link>https://dev.to/alexperigon/top-election-journalists-who-covers-campaigns-and-ballots-and-how-to-find-them-13ej</link>
      <guid>https://dev.to/alexperigon/top-election-journalists-who-covers-campaigns-and-ballots-and-how-to-find-them-13ej</guid>
      <description>&lt;h2&gt;
  
  
  Why teams need an election journalist list
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Election journalists&lt;/strong&gt; sit at the center of campaign coverage, ballot fights, polling explainers, and voting-rights reporting. Keyword alerts for “election” or a last name pull sports “races,” foreign contests, and every photo-caption byline collision - while the &lt;strong&gt;political reporters&lt;/strong&gt; who actually own campaigns, polls, or election administration stay hard to inventory.&lt;/p&gt;

&lt;p&gt;Teams building outreach lists, citation trackers, or campaign-news products usually ask:&lt;/p&gt;

&lt;p&gt;What does “top election journalists” mean when you build the list from an API?&lt;/p&gt;

&lt;p&gt;How do you discover election and campaign reporters in the Journalists API?&lt;/p&gt;

&lt;p&gt;Which example &lt;strong&gt;election journalists&lt;/strong&gt; resolve cleanly for a shortlist?&lt;/p&gt;

&lt;p&gt;When should you use Journalists vs People vs Sources for election coverage?&lt;/p&gt;

&lt;p&gt;The sections below answer each in order. Full journalist-parameter depth belongs with the Journalists API guide when it ships; this page owns &lt;strong&gt;election-desk discovery&lt;/strong&gt; - not a Signals monitor playbook and not a left/right ideology roster.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Try it:&lt;/strong&gt; &lt;a href="https://perigon.io/sandbox?endpoint=journalists" rel="noopener noreferrer"&gt;Journalists sandbox&lt;/a&gt; · &lt;strong&gt;Docs:&lt;/strong&gt; &lt;a href="https://perigon.io/docs/api/entities" rel="noopener noreferrer"&gt;Entities&lt;/a&gt; · &lt;strong&gt;Pricing:&lt;/strong&gt; &lt;a href="https://perigon.io/products/pricing/apis" rel="noopener noreferrer"&gt;API pricing&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What “top journalists for elections” means here
&lt;/h2&gt;

&lt;p&gt;This is a &lt;strong&gt;methodology-backed discovery list&lt;/strong&gt;, not a permanent ranking or endorsement.&lt;/p&gt;

&lt;p&gt;For the election beat we:&lt;/p&gt;

&lt;p&gt;Search journalists with q values such as election or campaign, scoped with category=Politics (and often country=us).&lt;/p&gt;

&lt;p&gt;Prefer profiles whose titles or top topics point at campaigns, polls, voting, Congress, or US politics - and whose topSources match national or election desks.&lt;/p&gt;

&lt;p&gt;Resolve ambiguous names carefully: many common bylines return near-matches; keep the row whose title, Twitter handle, and sources fit the election desk you mean.&lt;/p&gt;

&lt;p&gt;Apply resolved journalistId values on Articles when you need sample bylines or a lasting campaign feed.&lt;/p&gt;

&lt;p&gt;Exact topic=Elections or topic=Campaigns filters can return empty sets depending on how journalist topTopics are populated. In practice, &lt;strong&gt;q + category&lt;/strong&gt; is the reliable discovery path for this beat; treat topic filters as optional polish after you confirm live hits in the sandbox.&lt;/p&gt;

&lt;p&gt;US elections recur on a fixed calendar (federal contests every two years, plus continuous primary, ballot, and voting-rules coverage). That scale is why a reusable reporter shortlist beats rebuilding name search every cycle.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to discover election journalists in the Journalists API
&lt;/h2&gt;

&lt;p&gt;On the Journalists API (/v1/journalists/all), start with a discovery query, then tighten.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Goal&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Filters to try&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Broad election desk&lt;/td&gt;
&lt;td&gt;q=election, category=Politics&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;US-focused + active posters&lt;/td&gt;
&lt;td&gt;Add country=us, minMonthlyPosts (e.g. 5)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Campaign trail language&lt;/td&gt;
&lt;td&gt;q=campaign, category=Politics, country=us&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Polling / analytics desks&lt;/td&gt;
&lt;td&gt;q with polling language, category=Politics&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Known byline&lt;/td&gt;
&lt;td&gt;name (exact-ish resolve), then confirm title and topSources&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stable product filter&lt;/td&gt;
&lt;td&gt;Copy id into Articles as journalistId&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Useful result fields for shortlists: id, name, title, topSources, topTopics, topCategories, avgMonthlyPosts, and Twitter handle when present.&lt;/p&gt;

&lt;p&gt;On Articles (/v1/all), pass one or more journalistId values to pull that byline’s coverage. Add q=election (or campaign / ballot language) when you want election-framed hits only.&lt;/p&gt;

&lt;p&gt;Use excludeJournalistId when a syndication-heavy byline floods the feed. Parameter reference: &lt;a href="https://perigon.io/docs/api/entities" rel="noopener noreferrer"&gt;Entities&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example election journalist shortlist
&lt;/h2&gt;

&lt;p&gt;Resolved from live Journalists lookups. Prefer the &lt;strong&gt;id&lt;/strong&gt; column in products; re-resolve when titles or desks change.&lt;/p&gt;

&lt;h3&gt;
  
  
  National campaign and politics desks
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Name&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Desk cue (from profile)&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Primary outlets (topSources)&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;journalistId&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Maggie Haberman&lt;/td&gt;
&lt;td&gt;Senior Political Correspondent&lt;/td&gt;
&lt;td&gt;nytimes.com&lt;/td&gt;
&lt;td&gt;b7cc246d2e7a470a90b81f3d4ccad2ca&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Jonathan Swan&lt;/td&gt;
&lt;td&gt;Politics reporter&lt;/td&gt;
&lt;td&gt;nytimes.com&lt;/td&gt;
&lt;td&gt;97ce96fa1e36456c8a5c88c02900224c&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Katie Glueck&lt;/td&gt;
&lt;td&gt;National political reporter&lt;/td&gt;
&lt;td&gt;nytimes.com&lt;/td&gt;
&lt;td&gt;fe243583d666442fb4ccd85e5aed6b06&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reid Epstein&lt;/td&gt;
&lt;td&gt;Politics Reporter&lt;/td&gt;
&lt;td&gt;nytimes.com&lt;/td&gt;
&lt;td&gt;25cb2840e4174b4a9c5bb2b72c424cf8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Annie Karni&lt;/td&gt;
&lt;td&gt;Congressional Correspondent&lt;/td&gt;
&lt;td&gt;nytimes.com&lt;/td&gt;
&lt;td&gt;713c41110d664d02b02f9468eaa165b7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nick Corasaniti&lt;/td&gt;
&lt;td&gt;Domestic politics / voting&lt;/td&gt;
&lt;td&gt;nytimes.com&lt;/td&gt;
&lt;td&gt;4e7f0207d5664ee184f0a9b516d61836&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nate Cohn&lt;/td&gt;
&lt;td&gt;Polls / US politics analytics&lt;/td&gt;
&lt;td&gt;nytimes.com&lt;/td&gt;
&lt;td&gt;fd2f250b31414dd8bf7ecd64bd3c880c&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Robert Costa&lt;/td&gt;
&lt;td&gt;Chief Election and Campaign Correspondent&lt;/td&gt;
&lt;td&gt;cbsnews.com&lt;/td&gt;
&lt;td&gt;a1ed83f0e9024614af5a8ac75606e8f5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kate Sullivan&lt;/td&gt;
&lt;td&gt;Campaign Embed&lt;/td&gt;
&lt;td&gt;bloomberg.com&lt;/td&gt;
&lt;td&gt;2d98292d26314fd1bcbd0cb6b86aba76&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Election-title and polling discovery hits
&lt;/h3&gt;

&lt;p&gt;These appeared when searching journalists with q=election and category=Politics - strong title signals for an election roster:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Name&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Desk cue (from profile)&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Primary outlets (topSources)&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;journalistId&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Helen Coster&lt;/td&gt;
&lt;td&gt;U.S. Presidential Election Correspondent&lt;/td&gt;
&lt;td&gt;reuters.com&lt;/td&gt;
&lt;td&gt;0f31d31dfd66430195eb005f7c04ee7c&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stephanie Kelly&lt;/td&gt;
&lt;td&gt;U.S. Presidential Election Correspondent&lt;/td&gt;
&lt;td&gt;regional / wire syndication&lt;/td&gt;
&lt;td&gt;14f953f977bb42f5bb83d78cd39aa3e7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ariel Edwards-Levy&lt;/td&gt;
&lt;td&gt;Editor, Polling and Election Analytics&lt;/td&gt;
&lt;td&gt;cnn.com&lt;/td&gt;
&lt;td&gt;cce8e73d74ca4d8faf7d795439f39961&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stephen Ohlemacher&lt;/td&gt;
&lt;td&gt;Election Decision Editor&lt;/td&gt;
&lt;td&gt;regional TV news sites&lt;/td&gt;
&lt;td&gt;38b074d3c62f463ab7401131425fee4c&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Katie Bernard&lt;/td&gt;
&lt;td&gt;Election administration / suburban politics&lt;/td&gt;
&lt;td&gt;inquirer.com&lt;/td&gt;
&lt;td&gt;18c20d8ddfce494d9f07731449d67dae&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Name search is noisy: common names return managers, local TV hosts, or near-spellings. Keep rows where &lt;strong&gt;title + topSources + Twitter&lt;/strong&gt; agree with the election desk you intend - drop zero-activity or off-beat collisions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sample coverage by these bylines
&lt;/h2&gt;

&lt;p&gt;After you resolve IDs, Articles filtered with journalistId plus q=election show how that byline’s election-framed copy looks in the index - useful as a pattern check, not as lasting newsjack content. Refresh samples when you ship the product; volumes and syndication domains change.&lt;/p&gt;

&lt;p&gt;Continuous Signals watches for Capitol Hill and leadership entities are a different job from a journalist roster - keep this page on byline discovery.&lt;/p&gt;

&lt;h2&gt;
  
  
  When to use Journalists vs People vs Sources
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Need&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Use&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Why&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Who &lt;strong&gt;wrote&lt;/strong&gt; the story&lt;/td&gt;
&lt;td&gt;Journalists API + Articles journalistId / author&lt;/td&gt;
&lt;td&gt;Bylines and reporter profiles&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Who the story is &lt;strong&gt;about&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;People filters (personName, personWikidataId)&lt;/td&gt;
&lt;td&gt;Candidates, officials, surrogates as entities&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Which &lt;strong&gt;outlets&lt;/strong&gt; to allow&lt;/td&gt;
&lt;td&gt;Sources / source groups&lt;/td&gt;
&lt;td&gt;Publisher inventory, not individual reporters&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Campaign narrative momentum&lt;/td&gt;
&lt;td&gt;Stories (optional)&lt;/td&gt;
&lt;td&gt;Clusters across many bylines - link Stories guides, do not re-teach here&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Journalists answer “whose byline”; People answer “who was mentioned”; Sources answer “which publisher.” Election products often need all three - but this page starts with the reporter list.&lt;/p&gt;

&lt;h2&gt;
  
  
  Election coverage scale at a glance
&lt;/h2&gt;

&lt;p&gt;A few facts that explain why a reusable &lt;strong&gt;election journalist&lt;/strong&gt; shortlist beats keyword-only alerts:&lt;/p&gt;

&lt;p&gt;US federal elections land &lt;strong&gt;every two years&lt;/strong&gt;, with primaries, ballot measures, and voting-rules fights filling the gaps - the campaign desk never fully goes quiet.&lt;/p&gt;

&lt;p&gt;Polling, election administration, and national politics each produce different bylines; one q=election alert mixes them without telling you &lt;strong&gt;who wrote&lt;/strong&gt; the piece.&lt;/p&gt;

&lt;p&gt;In the Articles index for pubDate &lt;strong&gt;2026-06-16&lt;/strong&gt; through &lt;strong&gt;2026-07-16&lt;/strong&gt; (US sources): about &lt;strong&gt;820,000&lt;/strong&gt; Politics-category articles, and about &lt;strong&gt;134,000&lt;/strong&gt; Politics hits that also match election - enough volume that byline allowlists matter for outreach, citation, and product feeds.&lt;/p&gt;

&lt;p&gt;In the same window, “White House” and Congress keyword lanes sit around &lt;strong&gt;150,000&lt;/strong&gt; and &lt;strong&gt;170,000&lt;/strong&gt; articles respectively - adjacent politics firehoses that election desks still collide with unless you filter on reporters, people, or sources.&lt;/p&gt;

&lt;p&gt;Round large counts in product copy; re-run stats when you ship so the window stays current.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key takeaways
&lt;/h2&gt;

&lt;p&gt;Build &lt;strong&gt;election journalist&lt;/strong&gt; lists with Journalists discovery (q + category=Politics), not keyword article search alone.&lt;/p&gt;

&lt;p&gt;Resolve names carefully; store journalistId for stable Articles filters.&lt;/p&gt;

&lt;p&gt;Mix national campaign desks with explicit election-title and polling profiles so the shortlist is not one outlet only.&lt;/p&gt;

&lt;p&gt;Use People for candidates and officials; use Sources when the unit of filtering is the publisher.&lt;/p&gt;

&lt;p&gt;Re-run discovery when desks change - titles and topSources drift between cycles.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Get started:&lt;/strong&gt; &lt;a href="https://perigon.io/sandbox?endpoint=journalists" rel="noopener noreferrer"&gt;Journalists sandbox&lt;/a&gt; · &lt;a href="https://perigon.io/docs/api/entities" rel="noopener noreferrer"&gt;Entities&lt;/a&gt; · &lt;a href="https://perigon.io/products/pricing/apis" rel="noopener noreferrer"&gt;API pricing&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>news</category>
      <category>api</category>
      <category>python</category>
    </item>
    <item>
      <title>How Monitor US Politics News</title>
      <dc:creator>Oleksyj Mokrousov</dc:creator>
      <pubDate>Mon, 27 Jul 2026 14:02:59 +0000</pubDate>
      <link>https://dev.to/alexperigon/how-monitor-us-politics-news-6n1</link>
      <guid>https://dev.to/alexperigon/how-monitor-us-politics-news-6n1</guid>
      <description>&lt;h2&gt;
  
  
  Why teams monitor US politics news
&lt;/h2&gt;

&lt;p&gt;Monitoring US politics news isn't difficult because there are too many articles - it's difficult because keywords fail. Search for "Congress" and you'll get foreign legislatures, sports teams, opinion columns, and photo captions. Meanwhile, the leadership announcements, committee votes, and White House decisions that actually matter disappear into the noise.&lt;/p&gt;

&lt;p&gt;Teams building a durable &lt;strong&gt;washington politics news&lt;/strong&gt; or &lt;strong&gt;capitol hill news&lt;/strong&gt; watch usually ask:&lt;/p&gt;

&lt;p&gt;How do you monitor US politics news?&lt;/p&gt;

&lt;p&gt;How do you resolve White House and Congress leadership before filtering articles?&lt;/p&gt;

&lt;p&gt;How do Articles API and Stories API recipes keep &lt;strong&gt;us government news&lt;/strong&gt; and election coverage precise?&lt;/p&gt;

&lt;p&gt;When should you use Signals vs Articles vs Stories for US politics?&lt;/p&gt;

&lt;p&gt;The sections below answer each in order. Entity parameter depth lives in &lt;a href="https://perigon.io/docs/api/entities" rel="noopener noreferrer"&gt;Entities&lt;/a&gt;; this page owns the &lt;strong&gt;US politics Signals + institution&lt;/strong&gt; playbook.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Try it:&lt;/strong&gt; &lt;a href="https://perigon.io/home" rel="noopener noreferrer"&gt;perigon.io/home&lt;/a&gt; · &lt;strong&gt;Articles sandbox:&lt;/strong&gt; &lt;a href="https://perigon.io/sandbox?endpoint=articles" rel="noopener noreferrer"&gt;sandbox&lt;/a&gt; · &lt;strong&gt;Entities docs:&lt;/strong&gt; &lt;a href="https://perigon.io/docs/api/entities" rel="noopener noreferrer"&gt;Entities&lt;/a&gt; · &lt;strong&gt;Pricing:&lt;/strong&gt; &lt;a href="https://perigon.io/products/pricing/signals" rel="noopener noreferrer"&gt;Signals pricing&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What “monitor US politics” means in practice
&lt;/h2&gt;

&lt;p&gt;A continuous watch for &lt;strong&gt;us policy news&lt;/strong&gt; is not the same as one search on election night. Signals keeps a briefing lane running while leadership, bills, and campaigns evolve. Articles pins specific people, topics, and US source/geography filters for product feeds. Stories groups reprints when a floor fight, White House announcement, or campaign spike floods outlets at once - use velocity when you care that a narrative is accelerating, not only that one URL appeared.&lt;/p&gt;

&lt;p&gt;Trade policy, sanctions, and agency enforcement each deserve their own Monitor draft when that desk is the product; keep this page on federal politics institutions and leadership.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to monitor US politics news with Signals with perigon.io
&lt;/h2&gt;

&lt;p&gt;Open &lt;a href="https://perigon.io/home" rel="noopener noreferrer"&gt;perigon.io/home&lt;/a&gt; and describe the watch in plain language. Signals turns that ask into a continuous briefing so you are not rebuilding the same &lt;strong&gt;political news monitoring&lt;/strong&gt; query every morning.&lt;/p&gt;

&lt;p&gt;Name the institutions (White House, House, Senate), the people who define the beat for your desk, and the output shape (bullets, risks first, nonpartisan summary). Refine after the first run: tighten to legislation vs campaign rhetoric, or to leadership-only mentions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Copy-paste Signal prompts
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;White House and executive agenda&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Monitor US White House and executive-branch coverage affecting domestic policy and Congress relations. Prefer major national publishers. Summarize in short bullets for a policy reader; flag contested claims and distinguish official statements from opinion columns.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Capitol Hill / Congress watch&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Track US House and Senate news: floor votes, leadership statements, committee markups, and Speaker or Majority Leader mentions. Focus on legislation and procedural fights. Exclude sports “House” and foreign parliament noise unless clearly about the US Congress.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Leadership and campaign spillover&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Watch news that meaningfully mentions US political leadership (President, Vice President, Speaker of the House). Ignore photo-caption name-checks and unrelated people with the same surname. Note interviews, conference cancellations, and intra-party schedule fights that change Capitol Hill narrative.&lt;/p&gt;

&lt;p&gt;These prompts are evergreen: they describe ongoing beats, not a single week’s headlines. Swap or add leaders when your desk’s org chart changes - keep Signal wording on roles plus confirmed people IDs from the table below.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resolve White House and Congress leadership before you filter
&lt;/h2&gt;

&lt;p&gt;US politics monitoring works best when people are resolved first. Name search alone surfaces athletes, musicians, and family members with the same string.&lt;/p&gt;

&lt;h3&gt;
  
  
  Canonical people (from People lookup)
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Role (evergreen)&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Name&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Use in filters&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Resolved value&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;President of the United States&lt;/td&gt;
&lt;td&gt;Donald Trump&lt;/td&gt;
&lt;td&gt;personWikidataId&lt;/td&gt;
&lt;td&gt;Q22686&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vice President of the United States&lt;/td&gt;
&lt;td&gt;JD Vance&lt;/td&gt;
&lt;td&gt;personWikidataId&lt;/td&gt;
&lt;td&gt;Q28935729&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Speaker of the House&lt;/td&gt;
&lt;td&gt;Mike Johnson&lt;/td&gt;
&lt;td&gt;personWikidataId&lt;/td&gt;
&lt;td&gt;Q19880665&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;When you re-run People search for “Donald Trump,” keep &lt;strong&gt;Q22686&lt;/strong&gt; - not Donald Trump Jr. (Q3713655) or family matches. For “JD Vance,” keep &lt;strong&gt;Q28935729&lt;/strong&gt; (Vice President) - not unrelated JD / Vance hits. For “Mike Johnson,” keep &lt;strong&gt;Q19880665&lt;/strong&gt; (Speaker) - not hockey, music, or football collisions.&lt;/p&gt;

&lt;p&gt;On the People API (/v1/people/all), refresh lookups when leadership changes; keep Signal prompts and article filters on these Wikidata IDs. Param reference: &lt;a href="https://perigon.io/docs/api/entities" rel="noopener noreferrer"&gt;Entities&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example coverage snapshot
&lt;/h2&gt;

&lt;p&gt;Coverage pinned to these entities often looks like leadership schedule fights or Congress reacting to a White House policy frame - for example:&lt;/p&gt;

&lt;p&gt;Article-style hits on Speaker-linked &lt;strong&gt;House&lt;/strong&gt; lanes (e.g. House leaders backing a White House framework) from national or regional DC-facing publishers such as insidenova.com.&lt;/p&gt;

&lt;p&gt;Story-style clusters where VP and House GOP calendars collide (e.g. a canceled House Republican Conference appearance tied to conference and election-integrity fights) with several outlets reprinting the same narrative.&lt;/p&gt;

&lt;p&gt;Use overviews like those as pattern checks only - refresh samples when you build the product; do not treat one week’s cluster as lasting newsjack content.&lt;/p&gt;

&lt;h2&gt;
  
  
  Articles API recipes for White House, Congress, and elections
&lt;/h2&gt;

&lt;p&gt;On the Articles API (/v1/all), pin people with personWikidataId rather than bare last-name q when you need &lt;strong&gt;white house news&lt;/strong&gt;, &lt;strong&gt;congress news&lt;/strong&gt;, or &lt;strong&gt;senate news&lt;/strong&gt; without surname collisions.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Goal&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Start with&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Optional add-ons&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Core &lt;strong&gt;us politics news&lt;/strong&gt; / &lt;strong&gt;dc politics news&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;category or topic Politics; sourceCountry us when you want US publishers&lt;/td&gt;
&lt;td&gt;excludeLabel for Opinion when you want harder news&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;White house news&lt;/strong&gt; / president lane&lt;/td&gt;
&lt;td&gt;personWikidataId Q22686&lt;/td&gt;
&lt;td&gt;Short q for bill, veto, executive order when event type matters&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VP / administration spillover&lt;/td&gt;
&lt;td&gt;personWikidataId Q28935729&lt;/td&gt;
&lt;td&gt;Combine with Politics category&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;House of representatives news&lt;/strong&gt; / Speaker lane&lt;/td&gt;
&lt;td&gt;personWikidataId Q19880665&lt;/td&gt;
&lt;td&gt;q for House, Speaker, or conference when narrowing floor fights&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Us election news&lt;/strong&gt; / &lt;strong&gt;us campaign news&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Politics topic + election / primary / ballot q&lt;/td&gt;
&lt;td&gt;People pins for candidates your desk tracks; Stories when reprints explode&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fresh poll&lt;/td&gt;
&lt;td&gt;addDateFrom from last checkpoint&lt;/td&gt;
&lt;td&gt;sortBy on add date for ingest-style feeds&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Prose example: pass personWikidataId set to Q22686 for the presidential lane, or Q19880665 when the Speaker defines the House story, add Politics category or topic, and poll with addDateFrom so each run only returns what is new since the last check. For &lt;strong&gt;partisan news filter&lt;/strong&gt; workflows, prefer entity pins plus label excludes over hoping a keyword encodes “left” or “right.”&lt;/p&gt;

&lt;p&gt;Public US left / right / center &lt;strong&gt;source groups&lt;/strong&gt; can narrow publisher skew when your product needs a media-balance slice - discover and apply groups via Sources docs; do not rebuild group CRUD here.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stories API recipes for politics story tracking
&lt;/h2&gt;

&lt;p&gt;When floor fights, White House announcements, or campaign spikes reprint across dozens of outlets, Stories (/v1/stories/all) keeps &lt;strong&gt;politics story tracking&lt;/strong&gt; on narratives instead of every mirror URL.&lt;/p&gt;

&lt;p&gt;Pass the same personWikidataId values (for example Q28935729 for VP-centered clusters). Sort or filter by recent updates when you care that a Capitol Hill storyline is still moving. Full clustering and velocity theory lives in the &lt;a href="https://perigon.io/blog/news-stories-api-how-news-clustering-groups-related-articles-into-trackable-narratives" rel="noopener noreferrer"&gt;Stories clustering guide&lt;/a&gt; - keep this page on US politics filters, not a second Stories textbook.&lt;/p&gt;

&lt;h2&gt;
  
  
  When to use Signals vs Articles vs Stories for US politics
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Need&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Prefer&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Daily &lt;strong&gt;us politics news&lt;/strong&gt; briefing without writing queries&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Signals&lt;/strong&gt; on &lt;a href="https://perigon.io/home" rel="noopener noreferrer"&gt;perigon.io/home&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Embed Capitol Hill feeds in a product&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Articles API&lt;/strong&gt; with personWikidataId + Politics filters&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Leadership-sensitive policy or IR lanes&lt;/td&gt;
&lt;td&gt;Confirmed Wikidata IDs above; optional Signal for narrative&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;“Is this Washington story accelerating?”&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Stories&lt;/strong&gt; with the same people / Politics scope&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;General entity param reference&lt;/td&gt;
&lt;td&gt;&lt;a href="https://perigon.io/docs/api/entities" rel="noopener noreferrer"&gt;Entities docs&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  US politics at a glance: why the beat stays noisy
&lt;/h2&gt;

&lt;p&gt;A few scale facts that keep &lt;strong&gt;political news monitoring&lt;/strong&gt; from sounding like a blank keyword alert:&lt;/p&gt;

&lt;p&gt;A single Congress typically sees &lt;strong&gt;thousands of bills introduced&lt;/strong&gt;; only a small fraction become law - the news firehose is the debate, not the final statutes.&lt;/p&gt;

&lt;p&gt;Capitol Hill runs through &lt;strong&gt;hundreds of committees and subcommittees&lt;/strong&gt;, each with its own markup, hearing, and leak cycle.&lt;/p&gt;

&lt;p&gt;The executive branch issues &lt;strong&gt;dozens of directives and executive actions&lt;/strong&gt; in busy stretches - White House messaging then collides with House and Senate reaction within hours.&lt;/p&gt;

&lt;p&gt;Federal elections hit &lt;strong&gt;every two years&lt;/strong&gt; (House all seats; Senate in classes), so &lt;strong&gt;us campaign news&lt;/strong&gt; never fully leaves the wire even in “off” years.&lt;/p&gt;

&lt;p&gt;The White House maintains a near-daily press briefing cadence - which is why &lt;strong&gt;white house news&lt;/strong&gt; and &lt;strong&gt;capitol hill news&lt;/strong&gt; need separate lanes in Signals and in API filters.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What that looks like in the index (30 days, pubDate 2026-06-15–2026-07-15, US sources):&lt;/strong&gt; about &lt;strong&gt;820,000&lt;/strong&gt; Politics-category articles; roughly &lt;strong&gt;150,000&lt;/strong&gt; with “White House” in the query and &lt;strong&gt;170,000&lt;/strong&gt; matching Congress; about &lt;strong&gt;130,000&lt;/strong&gt; Politics hits that also mention elections. Leadership lanes show why person filters matter: on the order of &lt;strong&gt;370,000&lt;/strong&gt; articles linked to the President (Q22686), about &lt;strong&gt;42,000&lt;/strong&gt; for the Vice President (Q28935729), and about &lt;strong&gt;11,000&lt;/strong&gt; for the House Speaker (Q19880665) in the same window - same beat, very different volumes, which is why Signals and API watches should separate White House, Congress, and leadership pins instead of one catch-all keyword.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key takeaways
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Monitor US politics news&lt;/strong&gt; with Signals prompts on /home for continuous briefings, then mirror the beat in Articles and Stories.&lt;/p&gt;

&lt;p&gt;Resolve leadership with Wikidata IDs: President Q22686, VP Q28935729, Speaker Q19880665 - skip surname collisions.&lt;/p&gt;

&lt;p&gt;Combine people pins with Politics topic/category, US source scope, and addDateFrom for product feeds.&lt;/p&gt;

&lt;p&gt;Use Stories for &lt;strong&gt;politics story tracking&lt;/strong&gt; when reprints explode; keep velocity theory in the Stories guide.&lt;/p&gt;

&lt;p&gt;Keep SEC, trade/tariffs, and single-company watches in their own Monitor drafts.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Get started:&lt;/strong&gt; &lt;a href="https://perigon.io/home" rel="noopener noreferrer"&gt;perigon.io/home&lt;/a&gt; · &lt;a href="https://perigon.io/docs/api/entities" rel="noopener noreferrer"&gt;Entities docs&lt;/a&gt; · &lt;a href="https://perigon.io/blog/news-stories-api-how-news-clustering-groups-related-articles-into-trackable-narratives" rel="noopener noreferrer"&gt;Stories clustering guide&lt;/a&gt; · &lt;a href="https://perigon.io/products/pricing/signals" rel="noopener noreferrer"&gt;Signals pricing&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>news</category>
      <category>api</category>
      <category>python</category>
    </item>
    <item>
      <title>Build Custom News API Publisher Lists and Source Collections</title>
      <dc:creator>Oleksyj Mokrousov</dc:creator>
      <pubDate>Mon, 27 Jul 2026 13:57:15 +0000</pubDate>
      <link>https://dev.to/alexperigon/build-custom-news-api-publisher-lists-and-source-collections-h6c</link>
      <guid>https://dev.to/alexperigon/build-custom-news-api-publisher-lists-and-source-collections-h6c</guid>
      <description>&lt;h2&gt;
  
  
  Custom publisher lists break when they live in every query
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Foq4y9vekcvuxbjqkyulg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Foq4y9vekcvuxbjqkyulg.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hard-coding twenty domains into sources param works once. It fails when an analyst swaps a publisher, a competitor desk adds three trade outlets, or two products disagree on which regional papers belong in the allowlist. Teams then paste different domain strings into Articles, Headlines, Stories, and cron jobs - and alert quality drifts because the filter is no longer one object.&lt;/p&gt;

&lt;p&gt;That is the job of a &lt;strong&gt;source groups API&lt;/strong&gt;: turn a chosen &lt;strong&gt;publisher collection&lt;/strong&gt; into a named, reusable filter. Perigon already ships public bundles (for example top100, top25finance, top50tech). This guide covers the &lt;strong&gt;source group CRUD&lt;/strong&gt; surface for your own &lt;strong&gt;custom source lists&lt;/strong&gt;, how &lt;strong&gt;private source groups&lt;/strong&gt; and &lt;strong&gt;public source groups&lt;/strong&gt; resolve, and how to apply them for cleaner monitoring.&lt;/p&gt;

&lt;p&gt;What is a source groups API?&lt;/p&gt;

&lt;p&gt;How do source groups improve repeatable filtering versus pasting sources param every time?&lt;/p&gt;

&lt;p&gt;How do private and public source groups work for publisher collections?&lt;/p&gt;

&lt;p&gt;How do custom publisher collections improve monitoring and alert quality?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Try it live:&lt;/strong&gt; &lt;a href="https://perigon.io/sandbox?endpoint=sources" rel="noopener noreferrer"&gt;Sources sandbox&lt;/a&gt; · &lt;strong&gt;Read the docs:&lt;/strong&gt; &lt;a href="https://perigon.io/docs/api/sources" rel="noopener noreferrer"&gt;Sources and source groups&lt;/a&gt; · &lt;strong&gt;Compare plans:&lt;/strong&gt; &lt;a href="https://perigon.io/products/pricing/apis" rel="noopener noreferrer"&gt;API pricing&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What is a source groups API?
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;source groups API&lt;/strong&gt; manages named collections of publisher domains. Each group has a stable name (what you pass as sourceGroup on search), optional displayName and description, and a domains list. Once the group exists, article and story searches reference the &lt;strong&gt;name&lt;/strong&gt;, not the raw domain string.&lt;/p&gt;

&lt;p&gt;Perigon exposes this under /v1/api/sourceGroups:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Operation&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Endpoint&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Job&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Create&lt;/td&gt;
&lt;td&gt;POST /v1/api/sourceGroups&lt;/td&gt;
&lt;td&gt;New org-owned group with name + domains (required); optional displayName, description&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;List&lt;/td&gt;
&lt;td&gt;GET /v1/api/sourceGroups&lt;/td&gt;
&lt;td&gt;Org-owned groups plus publicly visible bundles; filter by name or domain&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Get&lt;/td&gt;
&lt;td&gt;GET /v1/api/sourceGroups/{id}&lt;/td&gt;
&lt;td&gt;One org-owned group by integer id&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Resolve&lt;/td&gt;
&lt;td&gt;GET /v1/api/sourceGroups/resolve&lt;/td&gt;
&lt;td&gt;Map names → group records (private preferred)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Update&lt;/td&gt;
&lt;td&gt;PATCH /v1/api/sourceGroups/{id}&lt;/td&gt;
&lt;td&gt;Partial update of owned groups&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;td&gt;DELETE /v1/api/sourceGroups/{id}&lt;/td&gt;
&lt;td&gt;Remove an owned group&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This page owns that lifecycle. Publisher &lt;strong&gt;discovery&lt;/strong&gt; (find a domain, visits, paywall, geo) lives on the Sources API (/v1/sources/all) - see the News Source API post for the directory cookbook, and &lt;a href="https://perigon.io/docs/api/sources" rel="noopener noreferrer"&gt;Sources docs&lt;/a&gt;. Vertical inventories like healthcare trade pubs or top25finance live in those compare posts, not here.&lt;/p&gt;

&lt;h2&gt;
  
  
  How source groups improve news filtering
&lt;/h2&gt;

&lt;p&gt;Without groups, every feed embeds a domain allowlist. With groups, search params stay short and &lt;strong&gt;reusable publisher filters&lt;/strong&gt; stay in one place.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Approach&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;What you maintain&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Drift risk&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Repeated source=a.com,b.com,...&lt;/td&gt;
&lt;td&gt;Domain string in every client&lt;/td&gt;
&lt;td&gt;High - each caller copies a slightly different list&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Named sourceGroup=my-desk&lt;/td&gt;
&lt;td&gt;One group record + search param&lt;/td&gt;
&lt;td&gt;Low - patch the group; queries keep the same name&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Typical flow:&lt;/p&gt;

&lt;p&gt;1) Discover candidate domains with the Sources API (or Source Explorer) when you need metadata.&lt;/p&gt;

&lt;p&gt;2) Create a &lt;strong&gt;custom source list&lt;/strong&gt; with POST /v1/api/sourceGroups and your domains array (1–5000 domains).&lt;/p&gt;

&lt;p&gt;3) Resolve or list by name when another service only has the label.&lt;/p&gt;

&lt;p&gt;4) Apply sourceGroup on Articles (/v1/all), Headlines, Stories, or Sources to scope results to that collection.&lt;/p&gt;

&lt;p&gt;5) On Articles, use excludeSourceGroup when you want everything &lt;em&gt;except&lt;/em&gt; a noisy bundle.&lt;/p&gt;

&lt;p&gt;You can still use bare source / excludeSource for one-off domain tweaks. Groups are for collections you will reuse.&lt;/p&gt;

&lt;p&gt;Pass excludeSourceGroup when you need a &lt;strong&gt;publisher denylist&lt;/strong&gt; bundle on Articles only. Stories and Sources accept sourceGroup for include-side scoping; Stories do not support group excludes the same way Articles do. For industry packs already published as public names, start there and customize privately - see the &lt;a href="https://perigon.io/blog/healthcare-news-compare-top-trade-publications" rel="noopener noreferrer"&gt;healthcare trade publications&lt;/a&gt; and &lt;a href="https://perigon.io/blog/best-financial-news-sources-top25finance" rel="noopener noreferrer"&gt;top25finance&lt;/a&gt; posts for those inventories.&lt;/p&gt;

&lt;h2&gt;
  
  
  Private and public source groups for publisher collections
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Public source groups&lt;/strong&gt; are Perigon-maintained &lt;strong&gt;curated source bundles&lt;/strong&gt; (for example top10, top100, top500English, top25crypto, top25finance, top50tech, top100sports, and US left / right / center packs). Anyone with API access can pass those names as sourceGroup. List can return publicly visible groups alongside your own.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Private source groups&lt;/strong&gt; are created under the organization tied to your API key. Create, get-by-id, patch, and delete only apply to groups your org owns. That is where &lt;strong&gt;analyst approved sources&lt;/strong&gt;, &lt;strong&gt;competitor publisher list&lt;/strong&gt; subsets, and &lt;strong&gt;regional source collection&lt;/strong&gt; forks belong.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Resolve&lt;/strong&gt; is the important rule: GET /v1/api/sourceGroups/resolve with one or more name values returns, for each name, your organization's private group if one exists; otherwise the matching public group. That lets a product use a shared public label like top50tech until you create a private group with the same name - after which resolve (and your mental model for that workspace) prefers the private definition. Keep private names intentional so you do not shadow a public bundle by accident.&lt;/p&gt;

&lt;p&gt;Workspace UI under Settings → Source Groups can create the same objects for teams that prefer a console; the API is the programmable path for CI and multi-product orgs. Long lists you cannot maintain yourself can also be requested from Perigon support - the same collection model applies.&lt;/p&gt;

&lt;h2&gt;
  
  
  How custom publisher collections improve monitoring and alert quality
&lt;/h2&gt;

&lt;p&gt;Alerts and monitors fail noisily when the publisher set wanders. A stable group name is a contract between the research desk and the pipeline.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Pattern&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Collection idea&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Search habit&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Analyst approved&lt;/td&gt;
&lt;td&gt;Domains the desk signed off on&lt;/td&gt;
&lt;td&gt;sourceGroup = private name on every poll&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Competitor desk&lt;/td&gt;
&lt;td&gt;Tier-1 + relevant trade outlets only&lt;/td&gt;
&lt;td&gt;sourceGroup include, or Articles excludeSourceGroup for spam packs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Regional fork&lt;/td&gt;
&lt;td&gt;Public national pack minus irrelevant wires&lt;/td&gt;
&lt;td&gt;Private group copied from a public starting set, then patched&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Product vs research&lt;/td&gt;
&lt;td&gt;Two private names, same topic keywords&lt;/td&gt;
&lt;td&gt;Same q / company filters; different sourceGroup&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Updating domains is a PATCH on the group id, not a redeploy of every query string. List with domain when you need to find which &lt;strong&gt;workspace source groups&lt;/strong&gt; already contain a publisher. Delete when a product is retired so resolve does not keep pointing at stale private names.&lt;/p&gt;

&lt;p&gt;Inspection tip: to see membership of a named bundle without re-teaching Sources here, call Sources with sourceGroup set to that name - that is directory view of members. Lifecycle changes still go through /v1/api/sourceGroups.&lt;/p&gt;

&lt;h2&gt;
  
  
  Source group CRUD fields and list filters
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Create body&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Field&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Required&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Notes&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;name&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Stable slug used as sourceGroup on search&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;domains&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Array of publisher domains&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;displayName&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Human label in UI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;description&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Desk notes / ownership&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;List query&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Param&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Role&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;name&lt;/td&gt;
&lt;td&gt;Filter groups by name&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;domain&lt;/td&gt;
&lt;td&gt;Find groups that include a domain&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;sortBy / sortOrder&lt;/td&gt;
&lt;td&gt;Required sort controls on list&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;page / size&lt;/td&gt;
&lt;td&gt;Pagination&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Resolve query:&lt;/strong&gt; name (up to 100 names) → private-first records.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use cases
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Analyst-approved allowlist
&lt;/h3&gt;

&lt;p&gt;Create a private group with the domains research marked as trustworthy for a product. Poll Articles with that sourceGroup plus your topic or company filters. When analysts add a site, patch domains - alert jobs keep the same group name.&lt;/p&gt;

&lt;h3&gt;
  
  
  Competitor publisher list
&lt;/h3&gt;

&lt;p&gt;Build a tight &lt;strong&gt;publisher allowlist&lt;/strong&gt; for competitor coverage, or keep a wide search and attach excludeSourceGroup on Articles for bundles you never want in the feed. Persist the exclude name the same way you persist the include name.&lt;/p&gt;

&lt;h3&gt;
  
  
  Regional source collection
&lt;/h3&gt;

&lt;p&gt;Start from a public national or language pack name for smoke tests, then create a private regional collection with only the markets you serve. Resolve tells services which definition wins for a given name in your org.&lt;/p&gt;

&lt;h3&gt;
  
  
  Industry packs
&lt;/h3&gt;

&lt;p&gt;Pass public names such as top25finance or healthcareTradePublications when the maintained pack is enough. Domain-by-domain justification belongs in the vertical posts; this API topic stops at “create or resolve the collection, then apply the name.”&lt;/p&gt;

&lt;h2&gt;
  
  
  When to use groups vs Sources vs bare source
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Need&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Use&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Find or rank publishers by visits, geo, paywall&lt;/td&gt;
&lt;td&gt;Sources API (/v1/sources/all)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reuse a domain set across products and jobs&lt;/td&gt;
&lt;td&gt;Source Groups API + sourceGroup&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;One-off include or exclude of a few domains&lt;/td&gt;
&lt;td&gt;source / excludeSource&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Industry SERP + curated inventory write-up&lt;/td&gt;
&lt;td&gt;Vertical trade-pub / finance posts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Narrative / velocity monitoring&lt;/td&gt;
&lt;td&gt;Stories (and Breaking) guides - same sourceGroup name if helpful&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Compose with other filters
&lt;/h2&gt;

&lt;p&gt;sourceGroup is a publisher gate, not a topic engine. Stack it with q, company or people filters, dates (from / to / addDateFrom), taxonomy, category, and topic the same way you would with source. Keep this article’s examples group-centric; parameter cookbooks for entities and taxonomy stay in those pillar posts.&lt;/p&gt;

&lt;h2&gt;
  
  
  API plans
&lt;/h2&gt;

&lt;p&gt;Source filtering and curated public groups are available across API plans; private group capacity and volume limits follow your tier. Confirm current limits on &lt;a href="https://perigon.io/products/pricing/apis" rel="noopener noreferrer"&gt;API pricing&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key takeaways
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;source groups API&lt;/strong&gt; (/v1/api/sourceGroups) owns create, list, get, resolve, patch, and delete for &lt;strong&gt;custom source lists&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Resolve&lt;/strong&gt; prefers your org’s &lt;strong&gt;private source group&lt;/strong&gt; over a matching &lt;strong&gt;public source group&lt;/strong&gt; for the same name.&lt;/p&gt;

&lt;p&gt;Apply collections with sourceGroup (and Articles excludeSourceGroup) - do not paste long domain strings into every client.&lt;/p&gt;

&lt;p&gt;Use Sources for publisher metadata; use vertical posts for industry domain inventories; use this page for &lt;strong&gt;source group CRUD&lt;/strong&gt; and resolution rules.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Get started:&lt;/strong&gt; &lt;a href="https://perigon.io/docs/api/sources" rel="noopener noreferrer"&gt;Sources and source groups&lt;/a&gt; · &lt;a href="https://perigon.io/reference" rel="noopener noreferrer"&gt;API reference&lt;/a&gt; · &lt;a href="https://perigon.io/sandbox?endpoint=sources" rel="noopener noreferrer"&gt;Sources sandbox&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>news</category>
      <category>api</category>
    </item>
    <item>
      <title>Keyword vs Google Taxonomy: Fix Noisy Vertical News Alerts</title>
      <dc:creator>Oleksyj Mokrousov</dc:creator>
      <pubDate>Sat, 25 Jul 2026 10:23:06 +0000</pubDate>
      <link>https://dev.to/alexperigon/keyword-vs-google-taxonomy-fix-noisy-vertical-news-alerts-41f0</link>
      <guid>https://dev.to/alexperigon/keyword-vs-google-taxonomy-fix-noisy-vertical-news-alerts-41f0</guid>
      <description>&lt;h2&gt;
  
  
  Your industry alert is still a string match
&lt;/h2&gt;

&lt;p&gt;A “banking desk” built on &lt;strong&gt;q&lt;/strong&gt; = bank will happily ingest river banks, blood banks, data banks, and robbery blotter. A “rock feed” on &lt;strong&gt;q&lt;/strong&gt; = rock will mix geology, wrestling, and cocktail recipes with actual Rock Music coverage. The channel looks productive; the product is not on-vertical.&lt;/p&gt;

&lt;p&gt;This page is a &lt;strong&gt;bakeoff diagnostic&lt;/strong&gt; for noisy keyword desks. It is not the full Google taxonomy filter cookbook (exact path vs prefixTaxonomy, Stories, classify). That lives on Perigon’s &lt;a href="https://perigon.io/blog/news-api-filter-by-google-taxonomy" rel="noopener noreferrer"&gt;News API filter by Google taxonomy&lt;/a&gt; guide - link out when you are ready to wire the params.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Why do vertical keywords inflate alerts?&lt;/li&gt;
&lt;li&gt;How large are the gaps for bank, fund, and rock?&lt;/li&gt;
&lt;li&gt;When should you use taxonomy vs Perigon category vs topic?&lt;/li&gt;
&lt;li&gt;What bakeoff should you run before shipping a desk?&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Why vertical keywords inflate alerts
&lt;/h2&gt;

&lt;p&gt;Keywords match tokens. Vertical desks need &lt;strong&gt;aboutness&lt;/strong&gt;. Google Content Category paths (V2) on Perigon articles describe industry and content family - Banking under Finance, Rock Music under Arts &amp;amp; Entertainment - so a filter can mean “this kind of story,” not “this substring appeared.”&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Habit&lt;/th&gt;
&lt;th&gt;What you get&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;q&lt;/strong&gt; = bank / banking&lt;/td&gt;
&lt;td&gt;Central banks, rivers, features named “bank,” crime, metaphors&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;q&lt;/strong&gt; = fund&lt;/td&gt;
&lt;td&gt;Mutual funds plus “fund a project,” fundraisers, verb uses&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;q&lt;/strong&gt; = rock&lt;/td&gt;
&lt;td&gt;Music plus geology, sports nicknames, food, idioms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Taxonomy path for the vertical&lt;/td&gt;
&lt;td&gt;Articles classified into that Google hierarchy&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;You still stack dates, sources, and companies. The fix is choosing the right &lt;em&gt;aboutness&lt;/em&gt; filter first.&lt;/p&gt;

&lt;h2&gt;
  
  
  Live bakeoff: bank, fund, rock (30 days)
&lt;/h2&gt;

&lt;p&gt;Articles counts for pubDate &lt;strong&gt;2026-06-25&lt;/strong&gt; through &lt;strong&gt;2026-07-25&lt;/strong&gt; (round in product copy; huge open queries are order-of-magnitude):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Desk intent&lt;/th&gt;
&lt;th&gt;Keyword filter&lt;/th&gt;
&lt;th&gt;About how many&lt;/th&gt;
&lt;th&gt;Taxonomy / structured filter&lt;/th&gt;
&lt;th&gt;About how many&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Banking vertical&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;q&lt;/strong&gt; = bank&lt;/td&gt;
&lt;td&gt;~988,000&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;taxonomy&lt;/strong&gt; = /Finance/Banking/Other&lt;/td&gt;
&lt;td&gt;~363,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Banking (wordier keyword)&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;q&lt;/strong&gt; = banking&lt;/td&gt;
&lt;td&gt;~259,000&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;prefixTaxonomy&lt;/strong&gt; = /Finance/Banking&lt;/td&gt;
&lt;td&gt;~363,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Funds vertical&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;q&lt;/strong&gt; = fund&lt;/td&gt;
&lt;td&gt;~695,000&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;taxonomy&lt;/strong&gt; = /Finance/Investing/Funds&lt;/td&gt;
&lt;td&gt;~398,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rock music vertical&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;q&lt;/strong&gt; = rock&lt;/td&gt;
&lt;td&gt;~341,000&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;taxonomy&lt;/strong&gt; = /Arts &amp;amp; Entertainment/Music &amp;amp; Audio/Rock Music&lt;/td&gt;
&lt;td&gt;~210,000&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Read the table carefully.&lt;/strong&gt; Taxonomy is not always the smallest number - &lt;strong&gt;q&lt;/strong&gt; = banking (~259k) is below Banking taxonomy (~363k) because many banking stories never use the token “banking.” The failure mode is different: keywords &lt;strong&gt;miss&lt;/strong&gt; on-vertical pieces &lt;em&gt;and&lt;/em&gt; &lt;strong&gt;include&lt;/strong&gt; off-vertical tokens. Taxonomy stays on the Google Banking branch either way.&lt;/p&gt;

&lt;p&gt;Keyword &lt;strong&gt;bank&lt;/strong&gt; (~988k) is still ~2.7× the Banking taxonomy slice - that gap is mostly noise and adjacent senses. Keyword &lt;strong&gt;fund&lt;/strong&gt; (~695k) vs Funds path (~398k) shows the same pattern. Keyword &lt;strong&gt;rock&lt;/strong&gt; (~341k) vs Rock Music (~210k) cuts a large geology/idiom/sports tail while keeping tour and album coverage the music desk wants.&lt;/p&gt;

&lt;p&gt;For a wider finance firehose, &lt;strong&gt;prefixTaxonomy&lt;/strong&gt; = /Finance was about &lt;strong&gt;3.4M&lt;/strong&gt; in the same window - useful as a branch monitor, not a tight desk. Pair a narrower leaf path when alerts must stay readable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Taxonomy vs category vs topic (pick one job)
&lt;/h2&gt;

&lt;p&gt;Perigon exposes three related dimensions. Mixing them up recreates keyword chaos with nicer names.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Filter&lt;/th&gt;
&lt;th&gt;What it is&lt;/th&gt;
&lt;th&gt;Use when&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;taxonomy&lt;/strong&gt; / &lt;strong&gt;prefixTaxonomy&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Google Content Category paths&lt;/td&gt;
&lt;td&gt;Industry / content-family desks (Banking, Rock Music, Health Conditions)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;category&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Perigon broad themes (Finance, Tech, Health, …)&lt;/td&gt;
&lt;td&gt;Fast dashboard buckets; e.g. &lt;strong&gt;category&lt;/strong&gt; = Finance was ~3.5M in this window&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;topic&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Granular Perigon topics&lt;/td&gt;
&lt;td&gt;Storyline types - e.g. &lt;strong&gt;topic&lt;/strong&gt; = Cryptocurrency ~187k vs &lt;strong&gt;q&lt;/strong&gt; = cryptocurrency ~89k (topic can out-recall a thin keyword)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Rule of thumb:&lt;/strong&gt; Google path when the desk is an industry tree; Perigon &lt;strong&gt;category&lt;/strong&gt; for coarse theme chrome; &lt;strong&gt;topic&lt;/strong&gt; when you need a named storyline slice. Stack carefully - do not OR three overlapping definitions of “finance” and call it precision. Deep param behavior stays on the taxonomy filter guide linked above.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bakeoff checklist before you ship a vertical alert
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Write the desk intent in one sentence (“Rock Music coverage,” not “anything with rock”).&lt;/li&gt;
&lt;li&gt;Run &lt;strong&gt;q&lt;/strong&gt; = token and the matching Google &lt;strong&gt;taxonomy&lt;/strong&gt; (or &lt;strong&gt;prefixTaxonomy&lt;/strong&gt;) for the same from/to window.&lt;/li&gt;
&lt;li&gt;Spot-check twenty titles from each list - count off-vertical hits and obvious misses.&lt;/li&gt;
&lt;li&gt;If the keyword is quieter but incomplete (like &lt;strong&gt;q&lt;/strong&gt; = banking vs Banking path), prefer taxonomy and accept the larger on-vertical set.&lt;/li&gt;
&lt;li&gt;Only then add source packs, companies, or labels - aboutness first, polish second.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Key takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Vertical &lt;strong&gt;q&lt;/strong&gt; filters are string matches; &lt;strong&gt;taxonomy&lt;/strong&gt; paths are aboutness filters for industry desks.&lt;/li&gt;
&lt;li&gt;Live gaps matter: &lt;strong&gt;bank&lt;/strong&gt; ~988k vs Banking taxonomy ~363k; &lt;strong&gt;rock&lt;/strong&gt; ~341k vs Rock Music ~210k (30 days ending &lt;strong&gt;2026-07-25&lt;/strong&gt;).&lt;/li&gt;
&lt;li&gt;Quieter keywords are not always better - &lt;strong&gt;banking&lt;/strong&gt; can under-recall vs the Banking path.&lt;/li&gt;
&lt;li&gt;Use taxonomy for industry trees, &lt;strong&gt;category&lt;/strong&gt; for broad themes, &lt;strong&gt;topic&lt;/strong&gt; for granular storylines.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>news</category>
      <category>api</category>
      <category>python</category>
    </item>
  </channel>
</rss>
