newsfilter

Stories and versions

How articles become stories, how stories change, and what each field promises.

Articles

newsfilter reads every article the news provider lists for your tickers and judges it once per ticker: an article about two companies is judged twice and appears once for each. Each judgement says whether the article reports something new about that company, and why.

Articles that pass are shortlisted. GET /v1/articles lists them by default; status=all lists every article with its pipeline_status, which says where it is in the pipeline:

pipeline_statusMeaning
shortlistedJudged and kept. It joins a story when its ticker is next grouped; until then story_id is null.
droppedJudged and not kept. judgement.reason says why.
duplicateA copy of an article already seen for this ticker.
skippedFrom a source newsfilter does not fetch.
pendingNot judged yet.
failedJudging failed.

Stories

Shortlisted articles about the same event are grouped into a story. A story has a headline, a summary, its articles and a strong flag.

  • Its id stays the same as articles join it. When a regrouping splits or merges stories, the id stays with the group that keeps most of the original articles.
  • version goes up by one on every change you can see: its articles, headline, summary or strong. Two snapshots of the same story can always be ordered by version; keep the highest.
  • The summary comes later. A new story's summary can be null; it arrives in a story.updated event with changed: ["summary"].
  • Strong is one-way. A story flagged strong stays strong, and story.became_strong is sent once per story. strong_reason gives the reason the story is strong, or why it is not.
  • Stories close. A story closes when its articles move into another story (merged) or when none of them is shortlisted any more (no_articles), for example after they are judged again. A closed story is gone: lists skip it and GET /v1/stories/{id} answers 404. Apps hear about it through story.closed, whose version is higher than any earlier snapshot of the story.

Currently a story stops changing once none of its articles is from the last 7 days.

Events

Every change is recorded as an event, sent as a webhook and kept for 30 days for catch-up.

EventWhen
article.shortlistedAn article passed the filter and was placed in a story. Once per article and ticker.
story.createdA new story.
story.updatedA story changed; changed lists what.
story.became_strongA story was flagged strong. Once per story.
story.closedA story merged into another or has no articles left. Once per story.

Every event carries a snapshot taken when it was created, so its data is the story or article as it was then, not as it is now.

On this page