# SEC 8-K Auditor & Officer Changes Scraper (`usta/sec-8k-auditor-officer-changes`) Actor

Pick a date window and get every SEC 8-K that reports an auditor change (Item 4.01) or an officer or director departure or appointment (Item 5.02). One row per filing, with the EDGAR link.

- **URL**: https://apify.com/usta/sec-8k-auditor-officer-changes.md
- **Developed by:** [US Tech Automations](https://apify.com/usta) (community)
- **Categories:** Business, News, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$2.00 / 1,000 result rows

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## SEC 8-K Auditor & Officer Change Alerts

Short-seller and activist research analysts get every SEC 8-K in the window already filtered to auditor changes and officer/director changes, without reading item numbers by hand.

Pick a date window and get every SEC Form 8-K filed in it that reports a change
of auditor or a change of officer or director. One row per filing, with the link
to the filing on EDGAR.

### Introduction

When a US public company does something its shareholders are meant to hear about
quickly, it files a Form 8-K and tags the filing with an item number that says
what the news is. Two of those numbers are the ones people watch hardest.

**Item 4.01** means the company changed the accounting firm that signs off its
books. An auditor walking out, or being swapped mid-year, is one of the oldest
warning signs there is.

**Item 5.02** means a director or a senior officer left, was elected, or was
appointed, or that their pay arrangement changed.

Finding these on EDGAR by hand means opening the filing list day by day and
reading item numbers off each filing. This actor does that reading and hands back
a table. Ask for the last 7 days and you get every 8-K in those 7 days that
carries either item number, newest first, each with the company name, the stock
symbol, the filing date, the item numbers, and the address of the filing itself.

Everything comes from EDGAR at the moment the run happens. Nothing is served from
a stored copy, and no row is ever produced that did not come back from the SEC.

### Tutorial

1. Set **Days back** to how far you want to look, from 1 to 30. 1 is today only.
   7 is today and the six days before it. Dates follow the US Eastern clock,
   which is the clock EDGAR files by.
2. Leave both **8-K item numbers** ticked to get auditor changes and officer
   changes together, or untick one to get only the other.
3. Put your own email address in **Contact email**. The SEC asks every automated
   reader to name a contact in the request, and the run sends whatever is in this
   box.
4. Optionally put a **Stock symbol** such as `AAPL` in to restrict the run to one
   company. The symbol is looked up in the SEC's own published company list.
5. Set **Maximum rows** to the most rows you are willing to pay for. The run
   stops there.
6. Start the run. Results land in the dataset and can be downloaded as JSON, CSV
   or Excel.

A run takes a few seconds for a small window and under a minute for the full 30
days. Requests to the SEC are spaced out to stay under the 10 requests a second
the SEC allows.

### Pricing

**$0.002 per row. No start fee.**

Every row is charged, starting with the very first one. There is no allowance of
rows at no cost, so a 100-row run costs $0.20 and a 1,000-row run costs $2.00.

A run that finds nothing pushes no rows and therefore costs nothing. A run that
stops because of bad input, or because EDGAR could not be read, also pushes no
rows and costs nothing.

**Maximum rows** is the spend cap. Set it and the run cannot cost more than that
number multiplied by $0.002, whatever the date window holds.

### Input and output examples

Input:

```json
{
  "daysBack": 7,
  "items": ["4.01", "5.02"],
  "maxItems": 100,
  "contactEmail": "you@example.com"
}
```

One output row, exactly as it comes back:

```json
{
  "accession_number": "0001636422-26-000111",
  "cik": "0001636422",
  "company_name": "Health Catalyst, Inc.",
  "tickers": [
    "HCAT"
  ],
  "form": "8-K",
  "filed_date": "2026-09-14",
  "period_of_report": "2026-09-11",
  "items": [
    "5.02",
    "7.01",
    "9.01"
  ],
  "matched_items": [
    "5.02"
  ],
  "matched_item_labels": [
    "Departure or election of directors; appointment of certain officers; compensatory arrangements of certain officers"
  ],
  "event_types": [
    "officer_or_director_change"
  ],
  "auditor_change": false,
  "officer_or_director_change": true,
  "file_number": "001-38993",
  "film_number": "261377641",
  "state_of_incorporation": "DE",
  "business_location": "South Jordan, UT",
  "sic_code": "7370",
  "primary_document": "hcat-20260911.htm",
  "document_url": "https://www.sec.gov/Archives/edgar/data/1636422/000163642226000111/hcat-20260911.htm",
  "source_url": "https://www.sec.gov/Archives/edgar/data/1636422/000163642226000111/0001636422-26-000111-index.htm",
  "fetched_at": "2026-09-15T03:01:40Z"
}
```

Every field in a row:

| Field | What it holds |
|---|---|
| `accession_number` | The SEC's own unique number for this filing |
| `cik` | The company's permanent SEC identifier, ten digits |
| `company_name` | The company as EDGAR names it |
| `tickers` | Stock symbols EDGAR lists for the company; empty if it has none |
| `form` | Always `8-K` |
| `filed_date` | The date EDGAR accepted the filing |
| `period_of_report` | The date of the event the filing reports |
| `items` | Every item number on the filing, including ones not asked for |
| `matched_items` | Only the item numbers that were asked for |
| `matched_item_labels` | Those item numbers written out in words |
| `event_types` | `auditor_change`, `officer_or_director_change`, or both |
| `auditor_change` | True when the filing carries Item 4.01 |
| `officer_or_director_change` | True when the filing carries Item 5.02 |
| `file_number` | The company's SEC file number |
| `film_number` | The SEC's film number for this filing |
| `state_of_incorporation` | Where the company is incorporated |
| `business_location` | The city and state on file |
| `sic_code` | The SEC's industry code for the company |
| `primary_document` | Filename of the 8-K document itself |
| `document_url` | Direct link to the 8-K document |
| `source_url` | Link to the filing's index page on EDGAR |
| `fetched_at` | When the run read EDGAR, in UTC |

### Recommendations

Run it daily with **Days back** set to 2. EDGAR adds the current day's filings
through the evening, so a two-day window picks up anything that landed late
without paying twice for a week of history.

Item 5.02 is common and Item 4.01 is rare. On a 200-row sample taken over the
fourteen days to 14 September 2026, 195 rows were Item 5.02 only, 4 were Item
4.01 only, and 1 carried both. If auditor changes are what matters, untick 5.02
and keep the row count, and the cost, small.

EDGAR holds nothing on Saturdays, Sundays or federal holidays, so a window made
only of weekend days returns zero rows and costs nothing.

### Limitations

**The item number is what this returns, not the story behind it.** EDGAR records
which item a company filed under. It does not record, in the place this actor
reads, which accounting firm was hired or dropped, or which person left or
arrived, or why. Those sentences are inside the filing document. Every row
carries `document_url` and `source_url` so the filing can be opened and read, but
no name of an accountant or an officer is extracted, and none is promised.

Two smaller points. Filings made late in the day appear in EDGAR's search index
after a short delay, so a run covering only today can miss the last few hours;
covering two days avoids it. And on a 200-row live sample, company name, filing
date, item numbers and both links were present on every row, while stock symbol
was present on 96% and state of incorporation on 92%, because EDGAR does not hold
those for every filer.

### FAQ

**Where does the data come from?**
EDGAR full-text search on `efts.sec.gov`, read live during the run. EDGAR is
published by the US Securities and Exchange Commission and is free to access.

**Does it need an API key or a login?**
No. EDGAR is open. The only thing the SEC asks for is a contact address in the
request, which is the **Contact email** input.

**How far back can it go?**
30 days. For a longer history, run it more than once with different windows.

**What happens if EDGAR is down?**
The run pushes no rows, costs nothing, and writes a status of `UNKNOWN` with the
error to the run's `OUTPUT` record. It never fills the gap with made-up rows.

**Can the same filing be charged twice in one run?**
No. Rows are de-duplicated on the SEC's own accession number before anything is
pushed.

**Why did a run return fewer rows than expected?**
Either the window contains weekend or holiday days, or **Maximum rows** was
reached. When the cap is what stopped it, the run's `OUTPUT` record says so.

**Is there support?**
Yes. Raise it through the Apify Store issues tab for this actor, or email
operations@ustechautomations.com. Replies within 2 business days.

### Refunds and support

Refunds: if a run returns zero rows for a valid input, email operations@ustechautomations.com within 7 days and we refund that run. Support: same address, replies within 2 business days.

# Actor input Schema

## `daysBack` (type: `integer`):

How many calendar days to look back, counting today. 1 means today only, 7 means today and the six days before it. Dates are US Eastern, the clock EDGAR files by. Weekends and federal holidays hold no filings.

## `items` (type: `array`):

Which kind of event to return. 4.01 is a change of the company's certifying accountant. 5.02 is a director or officer leaving, being elected or being appointed. Leave both ticked to get both.

## `ticker` (type: `string`):

Limit the run to one company, for example AAPL. The symbol is looked up in the SEC's own company list. Leave empty to get every company that filed in the window.

## `maxItems` (type: `integer`):

Hard stop on how many rows this run may return, and therefore on what it can cost. The run stops as soon as this many filings are collected, newest filing date first.

## `contactEmail` (type: `string`):

The SEC asks every automated reader to name a contact address in the request. Put your own address here so the requests are attributed to you.

## Actor input object example

```json
{
  "daysBack": 7,
  "items": [
    "4.01",
    "5.02"
  ],
  "maxItems": 100,
  "contactEmail": "operations@ustechautomations.com"
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

## `csv` (type: `string`):

No description

## `report` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "daysBack": 7,
    "items": [
        "4.01",
        "5.02"
    ],
    "maxItems": 100,
    "contactEmail": "operations@ustechautomations.com"
};

// Run the Actor and wait for it to finish
const run = await client.actor("usta/sec-8k-auditor-officer-changes").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "daysBack": 7,
    "items": [
        "4.01",
        "5.02",
    ],
    "maxItems": 100,
    "contactEmail": "operations@ustechautomations.com",
}

# Run the Actor and wait for it to finish
run = client.actor("usta/sec-8k-auditor-officer-changes").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "daysBack": 7,
  "items": [
    "4.01",
    "5.02"
  ],
  "maxItems": 100,
  "contactEmail": "operations@ustechautomations.com"
}' |
apify call usta/sec-8k-auditor-officer-changes --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,usta/sec-8k-auditor-officer-changes"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/nf2F3bmznAfwuuPJN/builds/qeErwCNpGpBJKuDGE/openapi.json
