Original Source Finder - Syndicated Article & Canonical Checker
Pricing
from $2.80 / 1,000 url checkeds
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
22 days ago
Last modified
Categories
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-site | JSON-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-named | JSON-LD provider or author organization other than the site, "Provided by …", 「提供:…」 |
msn-source | MSN 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-wrapper | AMP 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-site | og: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
originUrlstays null andciteAssays "Agency, via Site". - The named original is checked. With
verifyOriginalon (default), the original page is read (respecting its robots.txt) and compared:originVerifiedistrueonly when this page's opening text is on the original page or the headlines match,falsewhen the named page is clearly a different article (for example a canonical link to a section front page), andnullwhen it could not be read or the comparison is not conclusive. - Dates do not decide.
firstPublishedshows 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):
| Kind | URLs | Right |
|---|---|---|
| dev.to cross-posts (original found at the canonical URL) | 8 | 8 |
| dev.to original posts (no other source) | 3 | 3 |
| Yahoo Finance partner articles (source named or found) | 5 | 5 |
| Yahoo!ニュース (Kyodo, Nikkei, Sankei Sports, FNN) | 4 | 4 |
| AP stories on WTOP and ABC News | 4 | 4 |
| The Conversation republished (phys.org, Yahoo Australia, CounterPunch, PeaceRep) | 5 | 5 |
| MSN syndication | 3 | 3 |
| Publishers' own articles (Jiji Press, Salon) | 2 | 2 |
| AMP cache link | 1 | 1 |
| AP story with no AP mark on the page (The Independent) | 1 | 0 (says no-other-source-found) |
| Medium (Cloudflare check page) | 1 | free row (not read) |
Input
| Field | What it does |
|---|---|
urls | Article URLs, 1 to 1,000 per run. |
url | One URL without a list (added to urls). |
verifyOriginal | Default true: open the named original page and compare it (charged as source-verified). |
onlyChanges | Monitor: return only URLs whose answer changed since the last run of the same watch. |
watchName | Monitor: the name of the list being watched. |
resetMonitoringState | Monitor: forget what the watch remembered. |
maxConcurrency | URLs handled at the same time (1 to 8, default 4). |
requestTimeoutSecs | Time 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.