Real-Time Filing Stream API

The Stream API provides a real-time feed of the latest filings submitted to the SEC EDGAR database via a WebSocket connection. This push-based technology ensures immediate delivery of metadata for each new filing as it becomes publicly available. The metadata includes over 20 filing properties, such as EDGAR form type, Central Index Key (CIK) of the filer, associated ticker symbols, publication date and time, URLs to the primary filing document as well as URLs to all exhibits and XBRL files, and information on all referenced entities, among other details.

Data is transmitted in a structured JSON format, and the API supports all programming languages and frameworks capable of managing WebSocket connections. These include Python, Node.js, Java, C, C#, C++, Go, Rust, and React, ensuring accessibility for developers and analysts across diverse technology stacks.

Example of a JSON message from the Stream API
1 [
2 {
3 // Microsoft's 10-Q filing for Q1 2024
4 accessionNo: "0000950170-24-048288",
5 formType: "10-Q",
6 periodOfReport: "2024-03-31",
7 filedAt: "2024-04-25T16:06:24-04:00",
8 ticker: "MSFT",
9 cik: "789019",
10 companyName: "MICROSOFT CORP (Filer)",
11 linkToFilingDetails: "sec.gov/Archive ... 4048288/msft-20240331.htm",
12 entities: [ ... ], // entities associated with filing: CIK, EIN, state of incorp., fiscal year, and more
13 documentFormatFiles: [ ... ], // files and exhibits attached to filing: URL, type, size
14 dataFiles: [ ... ], // XBRL data files
15 // ... more fields
16 },
17 // ... more filings
18 ]

The Stream API is desgined to be used in conjunction with our stack of SEC-data APIs, and is typically deployed in the first phase of a filing acquisition, transformation, and analysis workflow. For instance, if you're tracking the buy/sell activities of institutional investment managers as reported in 13F filings, the Stream API provides, among other details, the accession number of such filings. Upon receiving this information, you can utilize our 13F Holdings API to access the holdings data in a structured JSON format by entering the filing's accession number. This enables you to instantly identify the fund's most recently bought and sold positions shortly after the filing is published. Similarly, for monitoring insider trading activities as disclosed in Form 4 filings, you can use the filing's accession number to access standardized Form 4 data in JSON format via our Insider Trading API. This enables real-time tracking of the volume of shares insiders have bought or sold.

Use Cases

The Stream API opens up a wide array of use cases, especially in quantitative finance and trading, compliance monitoring, legal analysis, and data analytics. Use cases include:

Real-time Trading Strategies: Traders can leverage the API to develop algorithms that react instantly to new filings, extracting alpha signals to make informed trades before the broader market has time to respond. Examples include merger arbitrage, replicating institutional investment manager activities from 13F disclosures, real-time sentiment analysis, and event-driven trading strategies.

Risk Management: By monitoring filings in real-time, financial institutions can quickly assess changes in the risk profiles of their investments or potential investments, adjusting their strategies accordingly.

Exchange Compliance: Regulatory bodies and exchange operators can use the API to monitor listed companies for compliance with filing requirements, identifying discrepancies or delays in real-time.

News Reporting and Journalism: News agencies and journalists can use the Stream API to monitor filings for breaking news or investigative stories. For example, a news agency covering the financial sector can receive instant alerts on filings indicating significant corporate events such as mergers, new debt issuances, executive changes, or financial distress.

API Endpoint

WebSocket endpoint: wss://stream.sec-api.io?apiKey=YOUR_API_KEY

Keeping Client-Server Connections Alive: To ensure uninterrupted client-server connections, our servers issue a ping message every 25 seconds. If a pong response from the client is not received within 5 seconds, the server will terminate the connection. This mechanism, inherent to the WebSocket protocol, typically necessitates no additional client-side implementation. However, while most libraries manage ping/pong exchanges automatically, others might necessitate manual handling for those seeking customized keepalive behaviors beyond the default settings.

Authentication

To access the streaming server, you must have an API key and an active subscription to one of our plans. You can find your API key in your account profile. To connect, simply substitute YOUR_API_KEY in the endpoint URL with your actual API key.


Message Format

The Stream API communicates with clients by dispatching messages in string format. It is common for some filings, such as Form 4 filings which invariably reference at least two entities, and other types that mention multiple entities, to be released simultaneously. In such cases, despite a single accession number being assigned to the filing, separate metadata objects are generated for each referenced entity. Consequently, the message's filings array may encompass several filings published concurrently. Messages are composed of a stringified JSON array encapsulating filing metadata objects.

Upon the release of a new filing, our servers instantly transmit a message to the connected WebSocket client. This message is formatted as a stringified JSON array, containing one or more filing metadata objects. Each metadata object within the array is structured as a JSON object and includes the following keys detailing the filing's metadata:

  • id (string) - System-internal unique ID of the filing object. A filing might reference multiple entities, for example, in case of Form 4 filings which reference at least one reporting person and one issuer company. In such cases, multiple filing objects are created, each with a unique ID, but all with the same accessionNo.
  • accessionNo (string) - Accession number of filing, e.g. 0000028917-20-000033.
  • formType (string) - EDGAR filing form type, e.g 10-K or 10-K/A. All 150+ form types including SEC correspondences are covered. A complete list of all form types is available here.
  • filedAt (string) - Represents the Accepted attribute of a filing in ISO 8601 format, and shows the date and time the filing was accepted by the EDGAR system. A filing also contains a Filing Date attribute that only shows the date. The Accepted and Filing Date attribute do not have to represent the the same date. Format: YYYY-MM-DD HH:mm:SS TZ, e.g. 2019-12-06T14:41:26-05:00. The timezone is always in Eastern Time (ET) and the time is in 24-hour format. During daylight savings time (summer), the timezone offset is -04:00, and during standard time (winter), the offset is -05:00.
  • cik (string) - CIK of the filing issuer with leading 0 removed, e.g. 28917.
  • ticker (string) - Ticker symbol of the filing company, e.g. AMOT. A ticker is not available when non-publicly traded companies report filings, for example, in case of mutual funds or asset-backed securities.
  • companyName (string) - Name of primary filing company or person, e.g. Allied Motion Technologies Inc.
  • companyNameLong (string) - Long version of company name including the filer type (Issuer, Filer, Reporting), e.g. ALLIED MOTION TECHNOLOGIES INC (0000046129) (Issuer)
  • description (string) - Description of the form, e.g. Statement of changes in beneficial ownership of securities. Includes the item numbers reported in 8-K, 8-K/A, D, D/A, ABS-15G, ABS-15G/A, 1-U and 1-U/A filings, e.g. Form 8-K - Current report - Item 1.03 Item 3.03 Item 5.02 Item 9.01".
  • linkToFilingDetails (string) - URL of the actual filing content on sec.gov. Use this link in combination with our Filing Download API to download the filing content.
  • linkToTxt (string) - URL of the plain text .TXT version of the filing. The content of this file includes the entire filing and its exhibits and can exceed several 100MB in size.
  • linkToHtml (string) - URL of the index page (also known as filing detail page) of the filing, e.g. "sec.gov/Archives/.../0001803599-24-000156-index.htm".
  • periodOfReport (string, if reported) - Period of report in the format YYYY-MM-DD, e.g. 2021-06-08. The periodOfReport has different meanings depending on the form type. For example, in Form 10-K filings, it represents the fiscal year end date. In Form 4 filings, it represents the transaction date, and in Form 13F filings, it represents the quarter end date.
  • effectivenessDate (string, if reported) - Effectiveness date in the format YYYY-MM-DD, e.g. 2021-06-08. The effectivenessDate is only reported on certain form types, such as EFFECT, 18-K, TA-1, and more.
  • effectivenessTime (string, if reported) - Effectiveness time in the format HH:mm:ss, e.g. 16:00:00. The effectivenessTime is only reported for EFFECT forms.
  • registrationForm (string, if reported) - Registration form type as reported on EFFECT forms, e.g. S-1.
  • referenceAccessionNo (string, if reported) - Reference accession number as reported on EFFECT forms, e.g. 0001213900-22-001446.
  • items (array of strings, if reported) - Items represents an array of item strings as reported on form 8-K, 8-K/A, D, D/A, ABS-15G, ABS-15G/A, 1-U, 1-U/A. For example: ["Item 3.02: Unregistered Sales of Equity Securities", "Item 9.01: Financial Statements and Exhibits"]
  • groupMembers (array, if reported) - Group members represents an array of member strings as reported on SC 13G, SC 13G/A, SC 13D, SC 13D/A filings, e.g. [ "c N. LITOWITZMAGNETAR CAPITAL PARTNERS LPSUPERNOVA MANAGEMENT LLC" ]
  • entities (array) - A list of all entities referred to in the filing. The first item in the array always represents the filing issuer. Each array element is an object with the following keys:
    • companyName (string) - Company name of the entity, e.g. DILLARD'S, INC. (Issuer)
    • cik (string) - CIK of the entity. Leading 0 are not removed here, e.g. 0000028917
    • irsNo (string, optional) - IRS number of the entity, e.g. 710388071
    • stateOfIncorporation (string, optional) - State of incorporation of entity, e.g. AR
    • fiscalYearEnd (string, optional) - Fiscal year end of the entity, e.g. 0201
    • sic (string, optional) - SIC of the entity, e.g. 5311 Retail-Department Stores
    • type (string, optional) - Type of the filing being filed. Same as formType, e.g. 4
    • act (string, optional) - The SEC act pursuant to which the filing was filed, e.g. 34
    • fileNo (string, optional) - Filer number of the entity, e.g. 001-06140
    • filmNo (string, optional) - Film number of the entity, e.g. 20575664
  • documentFormatFiles (array) - An array listing all primary files of the filing, including its exhibits. The first item of the array always represents the filing itself. The last item of the array always represents the text .TXT version of the filing. All other items can represent exhibits, press releases, PDF documents, presentations, graphics, XML files, and more. An array item is represented as follows:
    • sequence (string, optional) - The sequence number of the file indicating the order of the files in the filing, e.g. 1.
    • description (string, optional) - Description of the file, e.g. EXHIBIT 31.1.
    • documentUrl (string) - URL to the file on SEC.gov. The URL includes the file extension, such as .HTML, .PDF, .TXT, .XML, etc.
    • type (string, optional) - Type of the file, e.g. EX-32.1, GRAPHIC or 10-Q.
    • size (string, optional) - Size of the file in bytes, e.g. 6627216.
  • dataFiles (array) - List of data files primarily used for XBRL filings. Each item has the following fields:
    • sequence (string) - Sequence number of the file indicating its order in the filing, e.g. 1.
    • description (string) - Description of the file, e.g. XBRL INSTANCE DOCUMENT
    • documentUrl (string) - URL to the file on SEC.gov. The URL includes the file extension, such as .XSD or .XML.
    • type (string, optional) - Type of the file, e.g. EX-101.INS, EX-101.DEF or EX-101.PRE
    • size (string, optional) - Size of the file in bytes, e.g. 6627216
  • seriesAndClassesContractsInformation (array) - List of series and classes/contracts information.
    • series (string) - Series ID, e.g. S000001297.
    • name (string) - Name of entity, e.g. PRUDENTIAL ANNUITIES LIFE ASSUR CORP VAR ACCT B CL 1 SUB ACCTS
    • classesContracts (array) - List of classes/contracts. Each list item has the following keys:
      • classContract (string) - Class/Contract ID, e.g. C000011787.
      • name (string) - Name of class/contract, e.g. Class L.
      • ticker (string) - Ticker of the class/contract, e.g. URTLX.

Message Example

The following example illustrates a message dispatched by the Stream API upon the release of a new filing. The message represents a JSON array containing the metadata object of a single EDGAR filing.

JSON: Example Message from the Stream API
1 [{
2 "id": "3f1416b68de0b25cfaa0bf21842d3691",
3 "accessionNo": "0001185348-20-000015",
4 "cik": "1185348",
5 "ticker": "PRAA",
6 "companyName": "PRA GROUP INC",
7 "companyNameLong": "PRA GROUP INC (Filer)",
8 "formType": "8-K",
9 "description": "Form 8-K - Current report",
10 "filedAt": "2020-06-09T08:05:40-04:00",
11 "linkToTxt": "https://www.sec.gov/Archives/edgar/data/1185348/000118534820000015/0001185348-20-000015.txt",
12 "linkToHtml": "https://www.sec.gov/Archives/edgar/data/1185348/000118534820000015/0001185348-20-000015-index.htm",
13 "linkToXbrl": "",
14 "linkToFilingDetails": "https://www.sec.gov/Archives/edgar/data/1185348/000118534820000015/praa20208k1011.htm",
15 "entities": [
16 {
17 "companyName": "PRA GROUP INC (Filer)",
18 "cik": "0001185348",
19 "irsNo": "753078675",
20 "stateOfIncorporation": "DE",
21 "fiscalYearEnd": "1231",
22 "type": "8-K",
23 "act": "34",
24 "fileNo": "000-50058",
25 "filmNo": "20950914",
26 "sic": "7320 Services-Consumer Credit Reporting, Collection Agencies"
27 }
28 ],
29 "documentFormatFiles": [
30 {
31 "sequence": "1",
32 "description": "8-K",
33 "documentUrl": "https://www.sec.gov/ix?doc=/Archives/edgar/data/1185348/000118534820000015/praa20208k1011.htm",
34 "type": "8-K",
35 "size": "45666"
36 },
37 {
38 "sequence": "2",
39 "description": "EXHIBIT 99.1",
40 "documentUrl": "https://www.sec.gov/Archives/edgar/data/1185348/000118534820000015/exhibit9911.htm",
41 "type": "EX-99.1",
42 "size": "18598"
43 },
44 {
45 "sequence": " ",
46 "description": "Complete submission text file",
47 "documentUrl": "https://www.sec.gov/Archives/edgar/data/1185348/000118534820000015/0001185348-20-000015.txt",
48 "type": " ",
49 "size": "210865"
50 }
51 ],
52 "dataFiles": [
53 {
54 "sequence": "3",
55 "description": "XBRL TAXONOMY EXTENSION SCHEMA DOCUMENT",
56 "documentUrl": "https://www.sec.gov/Archives/edgar/data/1185348/000118534820000015/praa-20200609.xsd",
57 "type": "EX-101.SCH",
58 "size": "4471"
59 },
60 {
61 "sequence": "4",
62 "description": "XBRL TAXONOMY EXTENSION CALCULATION LINKBASE DOCUMENT",
63 "documentUrl": "https://www.sec.gov/Archives/edgar/data/1185348/000118534820000015/praa-20200609_cal.xml",
64 "type": "EX-101.CAL",
65 "size": "638"
66 },
67 {
68 "sequence": "5",
69 "description": "XBRL TAXONOMY EXTENSION DEFINITION LINKBASE DOCUMENT",
70 "documentUrl": "https://www.sec.gov/Archives/edgar/data/1185348/000118534820000015/praa-20200609_def.xml",
71 "type": "EX-101.DEF",
72 "size": "1488"
73 },
74 {
75 "sequence": "6",
76 "description": "XBRL TAXONOMY EXTENSION LABEL LINKBASE DOCUMENT",
77 "documentUrl": "https://www.sec.gov/Archives/edgar/data/1185348/000118534820000015/praa-20200609_lab.xml",
78 "type": "EX-101.LAB",
79 "size": "26147"
80 },
81 {
82 "sequence": "7",
83 "description": "XBRL TAXONOMY EXTENSION PRESENTATION LINKBASE DOCUMENT",
84 "documentUrl": "https://www.sec.gov/Archives/edgar/data/1185348/000118534820000015/praa-20200609_pre.xml",
85 "type": "EX-101.PRE",
86 "size": "13594"
87 },
88 {
89 "sequence": "14",
90 "description": "EXTRACTED XBRL INSTANCE DOCUMENT",
91 "documentUrl": "https://www.sec.gov/Archives/edgar/data/1185348/000118534820000015/praa20208k1011_htm.xml",
92 "type": "XML",
93 "size": "4191"
94 }
95 ]
96 }]

FAQ

Common questions about querying the Real-Time Filing Stream API, the response shape, and the bulk archives.

How can I get notified the instant a company files something new with the SEC, instead of polling for updates?

The Stream API delivers a push-based feed of newly published SEC EDGAR filings over a WebSocket connection at wss://stream.sec-api.io. Rather than repeatedly requesting an endpoint to check for updates, you keep one connection open and the server transmits a message the moment a new filing becomes publicly available. Each message is a JSON array of filing metadata objects, where every object carries the form type (formType), the filer's CIK (cik), the acceptance timestamp (filedAt), and links to the filing documents.

Because delivery is immediate as filings are released, this is the appropriate mechanism for low-latency monitoring. The feed covers all 150+ EDGAR form types, so any new submission from any filer arrives without you needing to specify which company or form type you are waiting for.

Which SEC filings has a specific company submitted most recently, looked up by its stock ticker symbol?

The Stream API includes the company's stock ticker on every filing message (ticker), for example MSFT for Microsoft or JPM for JPMorgan Chase. As filings stream in, you compare the ticker field of each message against the symbol you are tracking and keep the ones that match; the most recent matches are the company's latest submissions, ordered by the acceptance timestamp (filedAt).

The Stream API is a forward-looking feed of newly published filings, so it surfaces submissions from the moment you connect onward rather than returning a historical archive. If you need filings a company submitted before you started listening, that is a query against a historical filings endpoint rather than the real-time stream.

How do I track new filings for a company when I only have its CIK identifier rather than a ticker?

Every filing message from the Stream API carries the filer's Central Index Key with the leading zeros removed (cik), for example 789019 for Microsoft. To track a company by its CIK, compare the cik field of each incoming message against the identifier you hold and keep the matches. The CIK also appears, with leading zeros preserved, on each referenced entity inside the filing (entities.cik), so a company named anywhere in a multi-entity filing can be matched there as well.

Using the CIK rather than the ticker is the reliable approach for filers that have no publicly traded symbol, such as mutual funds, asset-backed securities issuers, or private entities, because the ticker field is empty for those filers while the CIK is always present.

How do I receive real-time alerts whenever any company announces a material corporate event?

Material corporate events are disclosed on Form 8-K, the current report. On the Stream API, watch the form type field of each incoming message (formType) and keep the messages where it equals 8-K (or 8-K/A for an amended current report). Each such message identifies the filer by name and CIK (companyName, cik) and includes a description of the report (description).

The specific events being reported are listed on the 8-K itself: the item strings appear in the items array (items), for example Item 2.02: Results of Operations and Financial Condition or Item 5.02: Departure of Directors or Certain Officers, and the same item numbers are also summarized in the description field. Filtering for 8-K gives you every material event announcement as it is accepted by EDGAR.

How can I monitor insider buying and selling activity across the market as it happens?

Insider buying and selling is reported on Form 4, the statement of changes in beneficial ownership. On the Stream API, watch the form type field of each message (formType) and keep the messages where it equals 4 (or 4/A for an amended Form 4). Each Form 4 message names both the company whose shares were traded and the insider who traded them.

The Stream API delivers only the filing metadata, not the parsed transaction figures. To see how many shares were bought or sold and at what price, take the accession number from the message (accessionNo) and pass it to the Insider Trading API at /insider-trading, which returns the standardized Form 4 transaction data in JSON. Combining the two lets you monitor insider trades market-wide and pull the trade details shortly after each filing is published.

Each filing message from the Stream API includes a direct URL to the primary filing document on SEC.gov in the filing-details link field (linkToFilingDetails). This points at the actual content document, for example the 8-K body or the prospectus, with its file extension such as .htm or .pdf.

This URL can be opened directly to read the filing, and it is also the link to use with the Filing Download API at /filing-reader (the SEC Filings Render API) when you want to download or render the document programmatically. Two related links are also provided: the index page that lists every document in the submission (linkToHtml) and the complete plain-text submission file (linkToTxt).

How do I tell exactly when a filing was accepted by the SEC, down to the time of day?

The acceptance time is the filedAt field on each Stream API filing message. It corresponds to the Accepted attribute that EDGAR records for a filing, given in ISO 8601 format with both date and time, for example 2020-06-09T08:05:40-04:00. The time is in 24-hour format and the timezone is always Eastern Time: the offset is -04:00 during daylight saving time in summer and -05:00 during standard time in winter.

Note that EDGAR also records a separate Filing Date attribute that carries only a date and need not match the date portion of filedAt. The Stream API exposes the Accepted timestamp through filedAt, which is the precise moment the submission was accepted.

How can I pull the list of every exhibit, press release, and attachment included with a newly published filing?

Every Stream API filing message carries a document-format files array (documentFormatFiles) that lists all primary files of the submission. The first item is always the filing itself and the last item is the complete text submission; the items in between can be exhibits, press releases, PDF documents, presentations, graphics, and XML files. Each entry gives the file's location (documentFormatFiles.documentUrl), its description (documentFormatFiles.description, for example EXHIBIT 99.1), its type (documentFormatFiles.type, for example EX-99.1 or GRAPHIC), and its sequence number (documentFormatFiles.sequence).

Iterating over this array gives you the full set of attachments for a newly published filing, with a downloadable URL for each. XBRL financial data files are listed separately in the data files array (dataFiles) rather than here.

How do I grab the XBRL financial data files attached to a filing as soon as it is published?

XBRL financial data files are listed in the data files array on each Stream API filing message (dataFiles). Each entry provides a downloadable URL (dataFiles.documentUrl), a description (dataFiles.description, for example XBRL INSTANCE DOCUMENT or XBRL TAXONOMY EXTENSION SCHEMA DOCUMENT), the file type (dataFiles.type, for example EX-101.INS, EX-101.SCH, or EX-101.PRE), and its size in bytes (dataFiles.size).

As soon as a message arrives, iterate over dataFiles and download the URLs you need. The array is empty for filings that carry no XBRL data, such as many Form 4 and letter filings, so check whether it has entries before processing it.

For a Form 4 insider filing, how do I identify both the company and the insider person involved?

On a Form 4 message from the Stream API, the entities array (entities) lists every party referenced in the filing. The first element is always the issuer company whose shares were traded, identified by name and CIK (entities[0].companyName, entities[0].cik) and usually marked with (Issuer) in the name. The reporting person, the insider who made the trade, follows as a later element, identified the same way and marked with (Reporting) in the name.

For example, a Form 4 for Wingstop lists Wingstop Inc. (Issuer) first and the reporting individual Kruguer Lawrence (Reporting) after it. To retrieve the parsed transaction details for that insider, take the accession number (accessionNo) and pass it to the Insider Trading API at /insider-trading.

Why do I sometimes receive several separate messages that all share the same accession number, and how should I handle them?

A single SEC submission can reference more than one entity. When it does, the Stream API generates a separate filing metadata object for each referenced entity. Every one of those objects carries the same accession number (accessionNo) because they describe the same submission, but each has its own distinct system-internal identifier (id). Form 4 filings always do this, since they reference at least one issuer and one reporting person, and other multi-entity filings behave the same way.

To handle this correctly, treat the accession number as the identifier of the underlying filing and the id field as the identifier of the individual message. Deduplicate on accessionNo when you only need the filing once; keep the per-entity objects separate when you need the metadata of each referenced entity.

How can I find out which industry a filing company belongs to from the real-time feed?

Industry classification is carried on each referenced entity inside a Stream API filing message, in the entity's SIC field (entities.sic). The Standard Industrial Classification code identifies the company's industry and is reported with its description, for example 5812 Retail-Eating Places for a restaurant company or 2834 Pharmaceutical Preparations for a drug maker.

The first element of the entities array is the filing issuer, so reading entities[0].sic gives the industry of the company that filed. This field is optional and may be absent on some entity entries, such as reporting persons on a Form 4, so check that it is present before using it.

How do I determine the state a filing company is incorporated in?

The state of incorporation is carried on each referenced entity inside a Stream API filing message, in the entity's state-of-incorporation field (entities.stateOfIncorporation). It holds a two-letter code, for example DE for Delaware or NJ for New Jersey.

The first element of the entities array represents the filing issuer, so entities[0].stateOfIncorporation gives the incorporation state of the company that filed. This field is optional and may be absent on some entity entries, so check that it is present before relying on it.

For an 8-K, how can I see which specific events were reported, like an earnings release or a change of executives?

On an 8-K message from the Stream API, the specific events are listed in the items array (items). Each entry is an item string such as Item 2.02: Results of Operations and Financial Condition for an earnings release or Item 5.02: Departure of Directors or Certain Officers for an executive change. The same item numbers are also folded into the form description (description), for example Form 8-K - Current report - Item 7.01.

Reading the items array tells you exactly which 8-K events a filing covers. The same field is populated for related form types that report item numbers, including 8-K/A, D, D/A, ABS-15G, 1-U, and their amendments.

How do I catch the moment a company announces its quarterly earnings?

Quarterly earnings are announced on Form 8-K under Item 2.02, Results of Operations and Financial Condition. On the Stream API, keep the messages where the form type (formType) is 8-K and the items array (items) contains an entry for Item 2.02: Results of Operations and Financial Condition. Each such message identifies the company by name and CIK (companyName, cik) and records the acceptance time (filedAt).

The earnings release itself is usually attached as an exhibit. Look in the document-format files array (documentFormatFiles) for an entry of type EX-99.1 and use its URL (documentFormatFiles.documentUrl) to retrieve the press release. Filtering this way surfaces each earnings announcement at the instant the 8-K is accepted by EDGAR.

How can I detect merger or acquisition activity in real time, such as tender offer communications?

Merger and acquisition activity is disclosed on a set of dedicated EDGAR form types. On the Stream API, watch the form type field (formType) for these forms, for example SC14D9C for a written communication relating to a third-party tender offer, the SC TO-T and SC 14D9 families for tender offer statements and solicitation/recommendation statements, and 8-K filings carrying item Item 1.01: Entry into a Material Definitive Agreement or item Item 2.01: Completion of Acquisition or Disposition of Assets in the items array (items).

Each matching message names the parties through the entities array (entities), where a target company is often marked (Subject) in its name (entities.companyName) and the filer is marked (Filed by). The attached communication documents are reachable through the document-format files array (documentFormatFiles.documentUrl).

How do I distinguish an original filing from an amendment as filings stream in?

The form type field on each Stream API message (formType) tells you whether a filing is an original or an amendment. An amended form has a form type ending in /A, for example 10-K/A for an amended annual report, 8-K/A for an amended current report, or 4/A for an amended Form 4. A form type without the /A suffix is an original filing.

To separate the two as messages arrive, check whether the value of formType ends with /A. The base form type before the suffix tells you what kind of filing was amended, so 10-K/A is an amendment to the same disclosure category as a plain 10-K.

How can I capture new institutional investment manager holdings disclosures as they are filed, then pull the detailed positions?

Institutional investment manager holdings are disclosed on Form 13F. On the Stream API, keep the messages where the form type (formType) is in the 13F family, such as 13F-HR for a holdings report or 13F-HR/A for an amendment. Each message identifies the filing manager by name and CIK (companyName, cik) and records the quarter the report covers in the period field (periodOfReport).

The Stream API delivers only the filing metadata, not the position-level holdings. To get the detailed positions, take the accession number from the message (accessionNo) and pass it to the 13F Holdings API at /form-13f/holdings, which returns the manager's reported holdings in structured JSON. Chaining the two lets you identify a fund's most recently disclosed positions shortly after the 13F is published.

How do I use an accession number from the stream to retrieve fully parsed insider trading details?

Each Stream API filing message carries the SEC accession number of the submission in the accession-number field (accessionNo), for example 0001140361-05-004060. For a Form 4 message, this is the identifier of the insider filing, but the stream itself provides only the metadata, not the parsed transaction figures.

To get the fully parsed insider trading details, pass that accession number to the Insider Trading API at /insider-trading. That endpoint returns the standardized Form 4 data in JSON, including the reporting person, the issuer, and the non-derivative and derivative transactions with share counts and prices. Using the stream to receive the accession number and the Insider Trading API to expand it is the intended real-time insider-tracking workflow.

What does the period a filing covers actually mean, given it differs between an annual report, an insider trade, and a fund holdings report?

The period-of-report field on a Stream API message (periodOfReport) is a date in YYYY-MM-DD format, but what that date represents depends on the form type (formType). For a Form 10-K annual report it is the fiscal year end date. For a Form 4 insider filing it is the transaction date. For a Form 13F fund holdings report it is the quarter end date.

Because the meaning is form-specific, always interpret periodOfReport together with formType rather than treating it as a single fixed concept. The field is only present when a period is reported for that form type, so it can be absent on some messages.

How can I monitor for new securities offerings and prospectus filings as companies issue debt or notes?

Securities offerings are disclosed through prospectus filings under Rule 424. On the Stream API, watch the form type field (formType) for the 424 family, for example 424B2 for a prospectus filed under Rule 424(b)(2), commonly used for pricing supplements on debt and note issuances, and 424B3 for a prospectus filed under Rule 424(b)(3). Each message names the issuer by company name and CIK (companyName, cik) and includes a form description (description, for example Form 424B2 - Prospectus [Rule 424(b)(2)]).

The prospectus document itself is reachable through the filing-details link (linkToFilingDetails), and any pricing supplement or related exhibits are listed in the document-format files array (documentFormatFiles). Filtering for the 424 forms surfaces each new offering as the prospectus is accepted by EDGAR.

How do I track when a registration statement actually becomes effective?

When a registration statement becomes effective, EDGAR records an EFFECT form, and the Stream API delivers it as a message with the form type (formType) set to EFFECT. These messages carry dedicated fields describing the effectiveness: the date the registration became effective (effectivenessDate), the time of day (effectivenessTime, for example 16:00:00), the registration form type that became effective (registrationForm, for example S-1), and the accession number of the original registration statement being made effective (referenceAccessionNo).

To track effectiveness in real time, keep messages where formType is EFFECT and read those fields. The referenceAccessionNo lets you tie the effectiveness notice back to the registration statement it applies to.

Why do some filings in the feed have no ticker symbol, and what kinds of filers are those?

The ticker field on a Stream API message (ticker) holds the stock symbol of the filing company, but it is only populated for publicly traded companies. When the field is empty, the filer is an entity that has no publicly traded stock, such as a mutual fund, an asset-backed securities issuer, a private company, or a special-purpose entity.

For those filers you should match and identify the entity by its Central Index Key instead, using the message-level CIK (cik) or the CIK on each referenced entity (entities.cik). The CIK is always present, so it is the reliable identifier when ticker is blank.

The entities array on each Stream API message (entities) lists every entity referenced in the filing. For a submission that covers many related entities, such as a shelf prospectus filed jointly by a parent company and dozens of its subsidiaries, every one of those entities appears as an element of entities, each with its company name (entities.companyName), CIK (entities.cik), state of incorporation (entities.stateOfIncorporation), SEC file number (entities.fileNo), and other identifiers.

The first element is always the filing issuer; the remaining elements are the other referenced entities. Iterating over the full entities array gives you every company named in that single submission.

How do I find the size of each document in a filing so I can prioritize which attachments to download first?

Each entry in the document-format files array of a Stream API message carries a size field (documentFormatFiles.size) giving the file size in bytes, for example 100484. Reading this value for every entry lets you rank the attachments and decide which to download first, for instance fetching the small primary document before a large graphic or the full text submission.

XBRL data files report their size the same way in the data files array (dataFiles.size). Note that the size field is optional and can be blank for some entries, such as the rendered XML version of a Form 4, so handle a missing value before sorting.

How do I get the plain-text version of a complete filing that includes all its exhibits?

Each Stream API filing message includes a link to the plain-text version of the complete submission in the text-link field (linkToTxt). This .txt file contains the entire filing together with all of its exhibits in a single document.

Be aware that this file can be very large, exceeding several hundred megabytes for filings with many or large exhibits, because it bundles everything in one place. The same complete submission text file is also listed as the last entry of the document-format files array (documentFormatFiles), described as Complete submission text file.

How can I retrieve the filing index page that lists all documents for a given submission?

Each Stream API filing message includes a link to the filing's index page in the HTML-link field (linkToHtml). This index page, also called the filing detail page, lists every document that belongs to the submission and ends in -index.htm, for example a URL of the form .../0001185348-20-000015-index.htm.

Opening this URL shows the directory of all files in the filing. If you instead want machine-readable entries for each document, the document-format files array (documentFormatFiles) and the data files array (dataFiles) on the same message already provide a downloadable URL for every file.

How do I connect to the real-time filing feed and authenticate my application?

The Stream API is reached over a WebSocket connection at the endpoint wss://stream.sec-api.io. Authentication is done by including your API key as the apiKey query parameter on that endpoint URL, substituting your actual key into wss://stream.sec-api.io?apiKey=YOUR_API_KEY. Accessing the streaming server requires an API key and an active subscription; the key is available in your sec-api.io account profile.

Any programming language or framework able to manage WebSocket connections can connect, including Python, Node.js, Java, C, C#, C++, Go, Rust, and React. Once connected, the server pushes a stringified JSON array of filing metadata objects each time a new filing is released.

How do I keep my real-time connection from dropping during quiet periods with no new filings?

The Stream API server keeps connections alive with the WebSocket ping/pong mechanism. It issues a ping message every 25 seconds, and if it does not receive a pong response from the client within 5 seconds it terminates the connection. This keeps the connection open even during quiet periods when no new filings are being published.

In most cases no extra client-side work is needed, because the majority of WebSocket libraries answer pings with pongs automatically. If your library does not handle ping/pong on its own, or you want customized keepalive behavior, you must respond to each ping with a pong within the 5-second window yourself to avoid being disconnected.

How can I identify mutual fund series and share classes referenced in a filing, including their tickers?

Mutual fund structure is carried on the series-and-classes information array of a Stream API message (seriesAndClassesContractsInformation). Each element represents a fund series, with its series identifier (seriesAndClassesContractsInformation.series, for example S000001297) and series name (seriesAndClassesContractsInformation.name).

Within each series, the classes/contracts array (seriesAndClassesContractsInformation.classesContracts) lists the individual share classes. Each class entry gives its class/contract identifier (seriesAndClassesContractsInformation.classesContracts.classContract, for example C000011787), its class name (seriesAndClassesContractsInformation.classesContracts.name, for example Class L), and its ticker symbol (seriesAndClassesContractsInformation.classesContracts.ticker, for example URTLX). This array is empty for filers that are not organized into fund series and classes.