A timeline of company announcements lists, in date order, everything a company said about itself over a period, each entry with its source. This guide gives a research methodology to build one for a company or a list of companies: the records to draw on, dating an entry that has no publication date, merging a press release with its filing, and keeping the evidence. Two queries on Company News build the timeline and count events by type per month.
A research methodology for a timeline of company announcements over time
Build the timeline in five steps. Fix the companies and the period. Collect every statement the company made about itself from its newsroom, feeds and current reports. Give each entry a date and the basis of that date. Merge the records that describe one event. Keep the link and the company's own words with each entry.
- Scope. Name the companies by a stable key and set the period in UTC, the time zone of the data.
- Collection. Take every record of the period that carries an event type, from both channels.
- Dating. Give each entry a date and a basis: published, date of report, filed or first seen.
- Merging. Show each event once, with the press release and the filing about it listed under it.
- Evidence. Keep the link, the company's own words and, for a filing, its accession number.
One rule holds throughout: the timeline records what the company announced and lists no person. Where an event concerns an officer or a director, the entry names the role, and you collect nothing about people: no names, no biographies, no record that follows anyone between companies.
Build a company announcement timeline from press releases, SEC filings and the newsroom archive
Draw on two kinds of record. The company's newsroom archive and feeds carry its press releases, in its words and on its dates. A listed US company also reports specified events to the SEC on Form 8-K, the current report. A press release and a filing about one event are two records of it.
When the SEC adopted Regulation FD in 2000, its release said the public disclosure the regulation calls for may be made by filing or furnishing a Form 8-K, or by another method reasonably designed to give the information broad, non-exclusionary distribution, and it named press releases distributed through a widely circulated news or wire service among the acceptable methods. A timeline that reads one channel misses what was said only in the other.
For results, the two records are tied by rule. The SEC's 2003 release added a requirement that a company which publicly releases material non-public information about its results for a completed annual or quarterly period furnish a Form 8-K that identifies the release briefly and includes it as an exhibit. The 2004 release that reorganised the form kept those substantive requirements in Item 2.02, Results of Operations and Financial Condition. The release on the newsroom and the exhibit to the filing are the same announcement.
The 2004 release also shows what a current report holds. It organised the reportable items into topical categories, numbered by section. Among them, Section 1 covers the registrant's business and operations, Section 2 financial information, Section 5 corporate governance and management, Section 7 Regulation FD, Section 8 other events and Section 9 financial statements and exhibits. It refers to Item 7.01 for disclosures under Regulation FD and to Item 8.01 for voluntary disclosures. The cover of each report gives its date of report, which SEC staff described in a 2020 announcement as the date of the earliest event reported.
Company News, part of the announcements and scale product, holds both channels in one dataset: one row for each announcement a company made about itself, whether an item on its newsroom or press page, an entry in a feed its homepage declares or, for a listed company, a current report. A filing row adds its item numbers and accession number. The data dictionary defines every field, and event-driven research with Form 8-K filings and newsrooms shows how item numbers become event types.
The regulator's own dates for a filing
The SEC's page on EDGAR application programming interfaces says each filer's history sits at a data.sec.gov address built from its CIK, holds at least one year of filings or the 1,000 most recent, whichever is more, is updated in real time as filings are disseminated, with a typical processing delay of less than a second, and needs no authentication or API key. In a submissions file, each recent filing lists its accession number, filing date, report date, acceptance date and time, form and items.
Take the company's Central Index Key, which a listed company in the Fokals index carries where it has one, load its recent filings and join them to Company News on the accession number, with any dashes removed on both sides. Compare the file's report date with the cover of a few filings before you rely on it at scale.
Dating and ordering entries without a publication date
Store the basis of each date beside the date. Company News dates an item by publication where the source states a date, and by the time it was first seen where the source states none, so an item from a newsroom page without dates carries the day it was first seen. Open the link to tell which.
| Basis | Where the date comes from | How to place the entry |
|---|---|---|
| Published | A date the company states on the item or in its feed | On that day |
| Date of report | The cover of a current report | On that day, with the filing date beside it |
| Filed | The filing date of a report whose cover you have not read | On that day, marked as a filing date |
| First seen | The record's date where the source stated none | On or before that day, marked so |
To recover a missing publication date, work through four checks in order.
- The page. Open the original and read the date it shows, with its time zone.
- The structured data. Schema.org defines datePublished as the date of first publication or broadcast, and dateModified as the date on which a work was most recently modified. Take the first: the second moves with every edit.
- A filing about the same event. A current report within your merge window gives a date of report to place the event on.
- Nothing found. Keep the first-seen date, marked as on or before.
Then sort by date. An entry marked on or before keeps its mark, so nobody reads it as the day the company spoke, and no entry moves earlier than a date the company stated. Times in the data are UTC, so decide whether a month is a UTC month or the company's local one: an evening release in New York can fall on the next day in UTC.
Merging a press release and the filing about the same event
Show the event once, list both records under it and date it by the cover's date of report where a filing is merged. Two filings about two stages of one deal, such as the signing and the completion, stay two events.
- Candidates. Pair each current report with the newsroom and feed records of the same company within a window you set. Start at seven days and tune it on your own sample.
- Results. A newsroom record typed as financial results and a filing under Item 2.02 within the window are one release, since the filing includes the release as an exhibit.
- Shared type. A pair that shares an event type is a strong candidate. Confirm it on the title and the excerpt.
- Different types. Decide on the text: the same counterparty, product or role means the same event.
The merged entry keeps the event date, the date the company first made the event public, every link, the accession number, each record's excerpt, the union of the event types and each record's version.
Keeping the evidence: the link and the company's own words
Each entry keeps enough to be checked at the source by someone who never saw your notes. This is the data provenance of the timeline. Keep, for each entry:
- the link to each original record;
- the company's own words as delivered, up to 1,200 characters, with your one-line description kept apart and marked as yours;
- for a filing, the item numbers and the accession number;
- the event types with the version on the record;
- the date and its basis.
For a leadership change, keep the role concerned and its direction, as Company News records them, with the link to the company's statement. Leave the title and excerpt of such an entry out of the timeline and take nothing about the individual from the text or the filing. In other entries, show the part of the excerpt that describes the event and copy no names from it.
Two queries: the timeline and events by type per month
The queries use Postgres, with Company News loaded as company_news, its list columns as jsonb and the session time zone set to UTC. :companies holds your company IDs, :from_day and :to_day bound the period, and :window_days is the merge window.
The first query lists every typed record of the period in date order, with its evidence and the nearest record of the other channel within the window, for review. It withholds title and excerpt on rows typed leadership_change, which carry the role in roles and the link in url.
select
p.at::date as day,
p.company,
p.source,
p.event_types,
p.items,
p.roles,
case when p.event_types ? 'leadership_change' then null
else p.title end as title,
case when p.event_types ? 'leadership_change' then null
else p.excerpt end as excerpt,
p.url,
p.accession,
p.label_version,
m.url as candidate_url,
m.gap_days
from company_news p
left join lateral (
select o.url, abs(o.at::date - p.at::date) as gap_days
from company_news o
where o.company_id = p.company_id
and (o.source = 'sec_8k') <> (p.source = 'sec_8k')
and abs(o.at::date - p.at::date) <= :window_days
order by gap_days
limit 1
) m on true
where p.company_id in (:companies)
and p.at >= :from_day
and p.at < :to_day
and jsonb_array_length(p.event_types) > 0
order by p.at, p.company;The second query counts events. A newsroom or feed record that a filing of the same company repeats within the window, sharing a value of event_types, is counted once, in the month of the earlier at. A record with two event types counts once under each. Pairs you confirm on the text with different types are merged by hand.
with in_period as (
select company_id, at, source, url, event_types
from company_news
where company_id in (:companies)
and at >= :from_day
and at < :to_day
and jsonb_array_length(event_types) > 0
),
echo as (
select n.url as newsroom_url,
f.url as filing_url,
least(n.at, f.at) as first_at
from in_period n
join in_period f
on f.company_id = n.company_id
and f.source = 'sec_8k'
and abs(f.at::date - n.at::date) <= :window_days
and exists (
select 1
from jsonb_array_elements_text(n.event_types) as e(t)
where f.event_types ? e.t)
where n.source in ('rss', 'atom', 'page')
),
events as (
select coalesce(min(e.first_at), p.at) as first_at, p.event_types
from in_period p
left join echo e on e.filing_url = p.url
where p.url not in (select newsroom_url from echo)
group by p.url, p.at, p.event_types
)
select
date_trunc('month', first_at)::date as month,
t.event_type,
count(*) as events
from events
cross join lateral jsonb_array_elements_text(event_types) as t(event_type)
group by 1, 2
order by 1, 2;Example: an illustrative timeline for Acme Robotics
This example is illustrative. Acme Robotics is an invented company, and every record and date below is an assumption.
Assumptions:
- Acme Robotics is a listed US company with a newsroom page; the period is 1 July to 30 September 2026, in UTC months.
- The merge window is seven days.
- Company News returns the eight typed records below.
- The page of R4 shows no date and its structured data gives no datePublished, so its date is the day it was first seen.
- The covers of the three filings give dates of report of 20 July, 1 September and 25 September, and each filing's date in the data is its filing date.
- R5 and R6 carry the role chief financial officer and the direction succession.
| Record | Date in the data | Channel | Event type | What the text says |
|---|---|---|---|---|
| R1 | 8 Jul | Newsroom | Product launch | A new picking arm |
| R2 | 21 Jul | Newsroom | Partnership | A supply agreement with a warehouse operator |
| R3 | 23 Jul | Filing, Item 1.01 | Partnership | The same agreement |
| R4 | 12 Aug | Newsroom, no date shown | Expansion | A new office in Canada |
| R5 | 1 Sep | Newsroom | Leadership change | A succession in the chief financial officer role |
| R6 | 2 Sep | Filing, Item 5.02 | Leadership change | The same succession |
| R7 | 24 Sep | Newsroom | Product launch | A second model of the arm |
| R8 | 29 Sep | Filing, Item 2.05 | Layoffs or restructuring | The closure of a plant |
- Find the candidates. R3 and R2 are 2 days apart, R6 and R5 1 day and R8 and R7 5 days. R1 is 15 days from R3 and R4 is 21 days from R6, so neither is a candidate.
- Confirm. R2 and R3 describe one agreement and share a type: merge. R5 and R6 describe one succession and share a type: merge. R7 announces a product and R8 a plant closure, with different types and texts: keep them apart.
- Date. The agreement takes 20 July from the cover and was first made public on 21 July. The succession takes 1 September. The closure takes 25 September and was filed on 29 September. The office stays at on or before 12 August.
- Order. Six entries remain.
| Entry | Date and basis | Records | Event | Evidence kept |
|---|---|---|---|---|
| E1 | 8 Jul, published | R1 | Product launch | Link, excerpt |
| E2 | 20 Jul, date of report; public 21 Jul | R2, R3 | Partnership | Two links, accession number, two excerpts |
| E3 | On or before 12 Aug, first seen | R4 | Expansion | Link, excerpt |
| E4 | 1 Sep, date of report and published | R5, R6 | Chief financial officer, succession | Two links, accession number |
| E5 | 24 Sep, published | R7 | Product launch | Link, excerpt |
| E6 | 25 Sep, date of report; filed 29 Sep | R8 | Layoffs or restructuring | Link, accession number, excerpt |
- Count. Each event goes in the month the company first made it public.
| Month | Records | Events | Events by type |
|---|---|---|---|
| July | 3 | 2 | Product launch 1, partnership 1 |
| August | 1 | 1 | Expansion 1 |
| September | 4 | 3 | Leadership change 1, product launch 1, layoffs or restructuring 1 |
| Total | 8 | 6 |
Merging removed 2 of the 8 records, a quarter: counted by record, July would show two partnerships and September two leadership changes. The second query returns the same six events, because both merged pairs share a type. Had the page of R4 given a datePublished of 30 July, E3 would move to July, leaving July with 3 events, August with none and the total at 6.
Tools to track company news, press releases and announcements on a timeline
Three kinds of tool cover it. The company's own newsroom and feeds carry its press releases. The SEC's EDGAR offers company filing feeds, full-text search and a submissions API that needs no key. A dataset such as Company News holds both channels, each record dated and linked, each event typed, delivered by API or as bulk files.
| Tool | What it gives the timeline |
|---|---|
| EDGAR company feed | The SEC's page on RSS feeds says a company search can be subscribed to, to receive that company's most recent filings |
| EDGAR full-text search | The full text of all EDGAR filings submitted electronically since 2001, exhibits included, filtered by form type and date range: where to find the exhibit that carries a release |
| EDGAR submissions file | Each filer's history with filing date, report date and items; the bulk file of every filer's history is republished nightly at about 3:00 am Eastern Time |
Company News is refreshed daily to every three days. It arrives through the REST API, where the list of announcements runs newest first, or as bulk exports for any period in JSON, JSON Lines or CSV, page by page or as a package of files with a manifest naming the period, versions and licence. The API reference describes the endpoints. To follow competitors week by week, see tracking competitor launches and partnerships at the source.
Frequently asked questions
What sources should a timeline of company announcements use?
Two channels, both the company's own. Its newsroom archive and feeds carry its press releases in its own words and on its own dates. For a listed US company, its current reports on Form 8-K add the regulatory record, with item numbers and a date of report on the cover. Read both, since a company may disclose through either, and merge the records that describe one event.
How do you date a press release that shows no date?
Work through four checks. Read the page for a stated date, then its structured data for a date of first publication, ignoring the date of modification. Next look for a filing about the same event, whose cover gives a date of report. If none of these gives a date, keep the day the item was first seen and mark the entry as on or before that day.
Should a press release and an 8-K about the same event count as one event?
Yes. Count the event once and keep both records under it, with both links and the filing's accession number. Date it by the filing's date of report and note the day the company first made it public. Keep two filings about two stages of one deal, such as the signing and the completion, as two events, because each stage is an event of its own.
How do you record an executive change without collecting personal data?
Record what the company announced: the role concerned and the direction of the change, such as a succession in the chief financial officer role, with the date and the link to the company's statement. Company News records a leadership change as the role and its direction. Collect nothing about the person, leave the text of such entries out of the timeline and build no record that follows an individual.
How do you count company announcements by type per month?
Count events, not records. Merge each press release with the filing that repeats it, then count each event once, in the month the company first made it public, under each event type it carries. Fix the time zone of the month first, because a late release can fall on the next day in UTC. Report record counts beside event counts, so a reader can see the merges.
The queries and code on this page are examples to adapt. Test them in your own environment before you rely on them.
What this page says about the products it names was checked against their public documentation on 7 October 2026. Product and company names are trademarks of their owners. Fokals is not affiliated with them or endorsed by them.