Original Source Finder - Syndicated Article & Canonical Checker avatar

Original Source Finder - Syndicated Article & Canonical Checker

Pricing

from $2.80 / 1,000 url checkeds

Go to Apify Store
Original Source Finder - Syndicated Article & Canonical Checker

Original Source Finder - Syndicated Article & Canonical Checker

For AI agents citing news: give article URLs (Yahoo, MSN, dev.to, AP/Reuters reprints) and get the original source, the original URL or news agency, with every clue, a confidence and a same-article check. On 37 pages with a known answer, 35 were right and none named a wrong source.

Pricing

from $2.80 / 1,000 url checkeds

Rating

0.0

(0)

Developer

NeverEmpty

NeverEmpty

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

22 days ago

Last modified

Share

For AI agents and researchers who must cite the original source: give article URLs and get, for each one, where the story was first published - the original article URL, or the news agency or publisher it came from - with every clue as evidence, a confidence, and a check that the original page really is the same article.

The same story often sits on many sites at once: a Yahoo News or MSN copy of a newspaper story, an AP or Reuters wire story on a local TV site, a dev.to or Medium cross-post of a blog, a Conversation article republished under Creative Commons. Citing the copy instead of the original is a common mistake. This Actor reads the page the way a careful editor would and tells you which one to cite - and says so plainly when it cannot tell.

Input and output in one example

Input (the default when you give nothing):

{ "urls": ["https://dev.to/bradtraversy/traditional-coding-vs-agentic-coding-the-flow-state-problem-57p5"] }

Output (one row per URL, shortened):

{
"status": "ok",
"url": "https://dev.to/bradtraversy/traditional-coding-vs-agentic-coding-the-flow-state-problem-57p5",
"originStatus": "original-found",
"originUrl": "https://www.traversymedia.com/blog/traditional-coding-vs-agentic-coding-the-flow-state-problem",
"originName": "traversymedia.com",
"confidence": "high",
"originVerified": true,
"summary": "This page is a republished copy: it names traversymedia.com (https://www.traversymedia.com/blog/...) as the original (the canonical link, an \"originally published\" note). Confirmed by reading that page: the opening text of this page is on the original page (exact). Cite the original.",
"citeUrl": "https://www.traversymedia.com/blog/traditional-coding-vs-agentic-coding-the-flow-state-problem",
"titleSimilarity": 1,
"openingTextMatch": "exact",
"firstPublished": "same-day",
"signals": [
{ "signal": "canonical-other-site", "strength": "strong", "pointsTo": "https://www.traversymedia.com/blog/...", "evidence": "<link rel=\"canonical\" href=\"...\"> names a page on another site as the main version of this page" },
{ "signal": "text-attribution", "strength": "strong", "pointsTo": "https://www.traversymedia.com/blog/...", "evidence": "the page says \"…Originally published at traversymedia.com…\" and links to ..." }
]
}

A wire story comes back like this (a WTOP copy of an AP story):

{ "originStatus": "original-named", "originName": "The Associated Press", "originType": "news-agency", "confidence": "high", "originUrl": null,
"citeAs": "The Associated Press, via WTOP News",
"signals": [{ "signal": "news-agency-dateline", "strength": "strong", "evidence": "the story opens with the agency dateline \"BANGKOK (AP) —\"" }] }

What it looks at

Clue (signal)Example
canonical-other-site<link rel="canonical"> pointing to another site (dev.to, Medium, Yahoo Finance and many publishers use this for syndicated copies)
meta-original-source<meta name="original-source">, <meta name="syndication-source">, <link rel="original-source">
jsonld-is-based-on, jsonld-url-other-siteJSON-LD isBasedOn, or the article's url / mainEntityOfPage on another site
text-attribution"Originally published at …", "This article first appeared in …", "republished from The Conversation", "The post … appeared first on …", 「転載」「初出」「元記事」 - with the link next to it
news-agency-dateline"(AP) —", "(Reuters) -", "(Bloomberg) --", "(AFP)", 「(共同)」「【共同】」「[東京 ロイター]」 at the start of the story
news-agency-byline"By The Associated Press", JSON-LD author / provider / sourceOrganization, meta author, a title ending in 「(共同通信)」
provider-namedJSON-LD provider or author organization other than the site, "Provided by …", 「提供:…」
msn-sourceMSN articles: MSN's own article data names the provider's article (MSN pages draw their text with JavaScript, so the page HTML has nothing)
url-wrapperAMP cache (*.cdn.ampproject.org/c/s/...), Google AMP (google.com/amp/s/...) and older Google News links that contain the article address
og-url-other-siteog:url on another site (weak: sometimes a copied setting)

News agencies recognised: The Associated Press, Reuters, AFP, Bloomberg, dpa, EFE, ANSA, UPI, Xinhua, Yonhap, Kyodo News (共同通信), Jiji Press (時事通信).

It does not over-claim

  • No clue is not proof. A page with no sign of being a copy gets no-other-source-found: "It may be the original, or a copy that does not say so". It never says "this page is the original".
  • Wire stories get the agency, not a made-up URL. Agency copies are often not published at a public URL, so originUrl stays null and citeAs says "Agency, via Site".
  • The named original is checked. With verifyOriginal on (default), the original page is read (respecting its robots.txt) and compared: originVerified is true only when this page's opening text is on the original page or the headlines match, false when the named page is clearly a different article (for example a canonical link to a section front page), and null when it could not be read or the comparison is not conclusive.
  • Dates do not decide. firstPublished shows which page carries the earlier date (read the way the Page Publish Date Finder reads dates: JSON-LD, meta tags, <time>, visible text, URL), but the original is chosen from the clues, not from dates.
  • Pages it cannot fully read are free rows. A page that draws its article with JavaScript, a check page (CAPTCHA, Cloudflare), a sign-in page or a page whose robots.txt disallows reading comes back as a free row that says why. It does not solve or bypass check pages and does not sign in.

Measured

Checked on 2026-09-25 against 37 real republished and original pages whose answer is known from a separate source (dev.to's API canonical_url, the <source> of the Yahoo Finance RSS feed, the per-publisher Yahoo!ニュース RSS feed, AP wire pages, pages carrying The Conversation's republishing notice, MSN syndication):

KindURLsRight
dev.to cross-posts (original found at the canonical URL)88
dev.to original posts (no other source)33
Yahoo Finance partner articles (source named or found)55
Yahoo!ニュース (Kyodo, Nikkei, Sankei Sports, FNN)44
AP stories on WTOP and ABC News44
The Conversation republished (phys.org, Yahoo Australia, CounterPunch, PeaceRep)55
MSN syndication33
Publishers' own articles (Jiji Press, Salon)22
AMP cache link11
AP story with no AP mark on the page (The Independent)10 (says no-other-source-found)
Medium (Cloudflare check page)1free row (not read)

Input

FieldWhat it does
urlsArticle URLs, 1 to 1,000 per run.
urlOne URL without a list (added to urls).
verifyOriginalDefault true: open the named original page and compare it (charged as source-verified).
onlyChangesMonitor: return only URLs whose answer changed since the last run of the same watch.
watchNameMonitor: the name of the list being watched.
resetMonitoringStateMonitor: forget what the watch remembered.
maxConcurrencyURLs handled at the same time (1 to 8, default 4).
requestTimeoutSecsTime limit per request (5 to 60 seconds, default 20).

Pricing

Pay per event: a small start fee once per run that returns at least one checked URL, plus one charge per checked URL - source-checked when the page was read and answered, or source-verified (a little more) when the original page was also opened and compared. Free rows (blocked, sign-in, robots.txt, JavaScript-only, not found, bad input) cost nothing. A run whose maximum total charge has no room for the start fee plus one URL requests nothing and costs nothing.

Good to know

  • robots.txt is followed for every page, including the original page it opens (a robots.txt that disallows reading means the page is not requested). Crawl-delay is respected.
  • The reader identifies itself as NeverEmptyOriginalSource/1.0; it does not run JavaScript.
  • Google News links: news.google.com does not allow automated reading in its robots.txt, so only links that contain the article address in themselves can be answered.
  • This Actor is not affiliated with any of the sites or agencies named here. It reads only public pages.

Support

Questions and requests: open an issue in the Issues tab.