BETA / FILING EVENTS

Follow filings. Keep your place.

Observe the SEC latest-filings Atom feed through authenticated SSE, WebSocket or JSON replay. The server polls a bounded source window at most once per minute. This is not a direct SEC push feed and has no guaranteed delivery latency or complete market coverage.

Start with JSON replay

curl 'https://sec-api.dev/api/v1/stream/events?after=0&limit=25' \
  -H "Authorization: Bearer $SEC_API_KEY"

Rows include id, accessionNumber, cik, form, name, entityRole, filingDate, sourceUpdatedAt, observedAt, filingUrl and source. An accession may have multiple filer/entity records; it is not a unique-trade feed.

SSE connection

curl -N 'https://sec-api.dev/api/v1/stream/filings?after=0&duration=30' \
  -H "Authorization: Bearer $SEC_API_KEY" \
  -H 'Accept: text/event-stream'

Events are status, filing, checkpoint, end or error. Persist checkpoint IDs as well as filing IDs: filtered observations can advance the cursor without emitting a matching filing. Reconnect with after or Last-Event-ID; if both are present they must match. A connection ends after at most 55 seconds; reconnect using resumeAfter from end.

WebSocket transport

Use wss://sec-api.dev/api/v1/stream/ws with an Authorization bearer header. Node/Python clients can send this header. The browser WebSocket API cannot; browser consumers should use authenticated fetch streaming. Credentials in query strings are rejected. WebSocket upgrade availability must be checked in the deployed runtime; an ordinary HTTP request returns 426.

import WebSocket from 'ws';
const socket = new WebSocket(
  'wss://sec-api.dev/api/v1/stream/ws?after=0&duration=30',
  {headers: {Authorization: 'Bearer ' + process.env.SEC_API_KEY}}
);
socket.on('message', raw => {
  const frame = JSON.parse(raw.toString());
  // Persist frame.id for filing AND checkpoint frames.
  // On end, reconnect using frame.data.resumeAfter.
  console.log(frame);
});

Frames use event, optional id, and data. Application messages are unsupported; transport ping/pong is supported. This is a read-only server stream. Handle normal completion, disconnects and bounded exponential backoff in your client.

Filters and limits

after is a nonnegative decimal event ID (default 0). limit is 1–500 (default 100). cik and form are exact filters. duration is 1–55 seconds. Unknown or duplicate parameters are rejected. Keep filters stable when resuming. At most two active connections are allowed per account across both transports. Each connection/replay request consumes one request from the same account quota.

Coverage is part of the response

Inspect meta.possibleGap, stale, lastPollAt and lastError. A bounded poll without overlap marks a possible gap; a false flag still does not prove completeness. Initial seeding is not historical backfill. Reconcile important workflows against filing history or a daily index. SEC downtime or storage pressure may pause ingestion while retained observations remain available.

Retention is at most seven days or 10,000 event-ID positions, whichever is shorter. Zero begins the retained window. An expired nonzero cursor returns 410; a future cursor returns 400. A slow consumer must reconcile from another source after retention loss.

Filing history · API reference · Account quotas