PCAOB Auditor Change & Engagement Partner Monitor
Pricing
from $6.60 / 1,000 results
PCAOB Auditor Change & Engagement Partner Monitor
Track auditor switches, engagement-partner rotations, SOX five-year partner tenure, first-year audits and offshore component-audit disclosure across every SEC issuer, benefit plan and fund from PCAOB Form AP filings. Return only what is new since your last run, or roll up mandate wins per firm.
Pricing
from $6.60 / 1,000 results
Rating
0.0
(0)
Developer
Kyle Maloney
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
PCAOB Auditor & Engagement Change Monitor
An auditor resignation is one of the oldest distress tells there is. So is an unexplained engagement-partner change at a bank that just restated, or a lead partner quietly serving a seventh consecutive year on an issuer audit. This actor turns PCAOB's daily Form AP archive into a clean, machine-readable feed of auditor switches, engagement-partner rotations and tenure, first-year audits, component-audit disclosure, amendment lineage and per-firm mandate wins and losses โ for every SEC issuer, employee benefit plan and investment company that files.
Data source: assets.pcaobus.org/firm-filings/FirmFilings.zip
โ the official PCAOB Form AP extract, refreshed daily, ~13 MB compressed / ~93 MB uncompressed,
62 columns, 155,000+ filings covering the full history back to February 2017.
Who this is for
Audit committees and governance analysts. You need to know the moment an issuer's audit firm
changes, whether the outgoing firm was replaced by a smaller one, and whether your lead engagement
partner is approaching the SEC's five-year rotation limit. mode: "changes" gives you the switch
feed with prior_audit_firm, prior_partner and prior_fiscal_period_end on the same row;
partner_consecutive_periods and partner_rotation_status give you the rotation clock.
Short sellers and forensic accountants. A Big Four to micro-cap auditor downgrade, a partner
rotation immediately before a restatement, a Form AP that amends the audit report itself rather
than a typo, or an audit where a large share of the work was performed by a firm in another country
โ those are all first-class fields here, not something you reconstruct by hand. amended_sections,
other_participating_firm_countries and participant_range sit on the row.
Audit-firm competitive intelligence and business development. mode: "firm-rollup" gives you
mandate wins, mandate losses, net change, market share, distinct partners fielded, and the split
between operating issuers, benefit plans and investment companies โ per firm, filterable to your
target segment.
SOX and independence compliance teams. SEC Regulation S-X 2-01(c)(6) caps the lead engagement
partner on an issuer audit at five consecutive years. partner_rotation_status reports
within_five_periods, fifth_consecutive_period or over_five_consecutive_periods โ and
unknown_left_censored when PCAOB's own history is too short to tell, rather than guessing.
Investor relations and benchmarking. Compare your auditor, partner tenure and audit structure
against peers in the same segment. bankIssuersOnly narrows the file to depositories.
Bank credit and counterparty risk. bankIssuersOnly: true reduces the file to banks, thrifts
and bank holding companies. An auditor change at a mid-size bank is worth a phone call.
What makes this different from reading Form AP yourself
- Identity is not naive. PCAOB reuses one Issuer ID for a company and its benefit plans
(Issuer ID 32577 covers "PulteGroup, Inc.", "PulteGroup, Inc. 401(k) Plan" and two more name
variants โ 16.0% of Issuer IDs carry more than one entity name). One company can also hold several
Issuer IDs (Zillow Group is 596939 and 596940 under CIK 0001617640 โ 16.5% of CIKs do this).
Keying on Issuer ID alone fabricates a switch between a 10-K auditor and a 401(k) auditor, and
hides real EY-to-Deloitte switches. This actor keys CIK first, then entity type, then plan
slug, and publishes the key it used in
issuer_entity_keyso you can audit the join. - A negative is only asserted when it was actually checked.
is_auditor_switch: falsemeans there was a predecessor and the firm did not change. Where there is no predecessor the field isnull, notfalse, andprior_sourcesays why. The same contract governsis_new_since_last_run. - The source is asserted live on every run. Row-count floor, a freshness window on the newest
filing date, row-width uniformity, firm and issuer breadth, and the
Latest Form AP Filingflag vocabulary. A stale or truncated archive that still parses perfectly fails the run instead of quietly returning a plausible answer. Nothing is emitted and nothing is billed when it does. - The
Issuer Tickercolumn is a trap. Its header literally contains a newline (Issuer Ticker \n(Not Available)), so a naive split yields 21 columns instead of 62 and silently corrupts everything after it โ and the column is empty in 0 of 155,189 rows. It is parsed correctly and deliberately not emitted. Join issuers on CIK or name.
Modes
| Mode | What you get |
|---|---|
changes (default) | Auditor switches, partner rotations and first-year audits, derived from each entity's own Form AP history. Works on the very first run. |
new-filings | Only Form APs this actor had not seen on its previous run at the same filter scope. Needs one prior run to establish a baseline; the first run fails loudly and records the baseline rather than returning a misleading empty result. |
engagements | The current audit roster: who audits whom, which partner, and how long they have served. |
firm-rollup | One row per audit firm: mandate wins and losses, market share, distinct partners, entity-type mix. |
fund-series | One row per SEC fund series on Investment Company filings โ 145,000+ series across 48,825 filings. |
The delta baseline
Cross-run state lives in a named key-value store (pcaob-auditor-engagement-state); Apify's
default store is created fresh for every run and would never persist anything. The baseline is
keyed by the filter scope that decides which rows enter it (latestOnly, bankIssuersOnly,
issuerNameContains), so a bankIssuersOnly run and a national run keep separate baselines and
never overwrite each other. delta_scope on every row records which baseline was used.
If the baseline could not be loaded for any reason, is_new_since_last_run is null on every row
and baseline_status names the reason. It is never false.
Example input
{"mode": "changes","bankIssuersOnly": true,"latestOnly": true,"sinceFilingDate": "2026-01-01","maxResults": 200}
Every audit-firm change, partner rotation and first-year audit at a US bank, thrift or bank holding company, filed since the start of 2026, newest first.
A few more:
{ "mode": "new-filings", "maxResults": 500 }
{ "mode": "firm-rollup", "latestOnly": true, "maxResults": 100 }
{ "mode": "engagements", "issuerNameContains": "bancorp", "maxResults": 1000 }
{ "mode": "changes", "firmNameContains": "Deloitte", "sinceFilingDate": "2025-01-01" }
{ "mode": "fund-series", "firmNameContains": "Cohen", "maxResults": 2000 }
firmNameContains matches either side of a switch, so you see mandates won and lost.
Output fields
Identity
| Field | Description |
|---|---|
issuer_name | Audited issuer, benefit plan or investment company, as filed. |
issuer_cik | SEC Central Index Key. The stable identifier โ PCAOB never populates the ticker column. |
issuer_id | PCAOB internal issuer ID. Not unique per company; see above. |
issuer_entity_key | The identity this row was actually grouped under. The audit trail for the join. |
issuer_entity_type | issuer, employee_benefit_plan or investment_company. |
issuer_plan_slug | Plan type (401k, esop, pension, and so on) for benefit plans; null otherwise. |
issuer_has_no_cik | PCAOB's "CIK None" flag: the filer declared the entity has no SEC CIK. |
is_bank_issuer | Bank, thrift or bank holding company, matched on the issuer name. Benefit plans are never flagged. |
The engagement
| Field | Description |
|---|---|
audit_firm, firm_id | Registered accounting firm. firm_id is stable across renames, so a rename is not reported as a switch. |
firm_other_name | Alternate or former firm name, for example a pre-merger brand. |
firm_country, firm_city, firm_state | The office that issued the report. |
engagement_partner, engagement_partner_id | Lead engagement partner. |
engagement_partner_other_ids | Other partner IDs the same person has filed under, typically after a firm move. |
secondary_partner, secondary_partner_id, secondary_partner_other_ids | Secondary engagement partner, where disclosed (1.1% of filings). |
audit_report_type | Issuer / Employee Benefit Plan / Investment Company, verbatim. |
fiscal_period_end, audit_report_date, filing_date | Normalized to YYYY-MM-DD. |
is_latest_filing | PCAOB's current-filing flag. false on superseded amendments. |
form_filing_id | PCAOB Form AP filing identifier. |
Change detection
| Field | Description |
|---|---|
change_type | auditor_switch, partner_rotation, first_year_audit, new_issuer, no_change, or baseline. |
is_auditor_switch | true / false when a predecessor existed; null when there was nothing to compare against. |
is_partner_rotation | The same contract. |
is_first_year_audit | First time this entity and firm pairing appears in the filing history. |
prior_audit_firm, prior_firm_id, prior_partner, prior_partner_id, prior_fiscal_period_end | The engagement this row was compared against. null when there was none. |
prior_source | filing_history (an earlier Form AP in the same file) or stored_snapshot (state from this actor's previous run). null means no comparison happened. |
prior_match_basis | same_entity_key, cik, issuer_id or name. A name-only match is the weakest and is used only when neither side carries anything stronger. |
is_baseline_run | true when the run had no prior entity snapshot. |
Cross-run delta
| Field | Description |
|---|---|
is_new_since_last_run | true when this Form Filing ID was absent from the previous run at the same scope. null, never false, when no baseline could be loaded. |
baseline_status | no_baseline, baseline_loaded, baseline_unavailable, baseline_scope_mismatch, caller_supplied_baseline. |
delta_scope | Which scoped baseline this run used. |
Partner and firm tenure
| Field | Description |
|---|---|
partner_consecutive_periods | Consecutive fiscal periods this partner has signed for this entity at this firm. |
partner_first_observed_period | First period of the current unbroken run. |
partner_tenure_left_censored | true when the run reaches the earliest Form AP on file, so real tenure may be longer. |
partner_rotation_status | within_five_periods, fifth_consecutive_period, over_five_consecutive_periods, unknown_left_censored. null for benefit plans and investment companies, where the issuer rotation rule does not apply the same way. |
firm_consecutive_periods, firm_first_observed_period, firm_tenure_left_censored | The same, for the firm. |
Audit scope and component audits
| Field | Description |
|---|---|
is_audit_divided, is_audit_not_divided | Whether responsibility was formally divided with another firm. |
other_participant_count | Number of other accounting firms that participated. null when not disclosed โ never 0. |
participant_percentage, participant_range, uses_participant_range | How much of the audit those firms performed. |
other_participating_firms | Structured list: firm_id, firm_name, country, city, state, percentage, range. |
other_participating_firm_countries | Distinct countries the participating firms worked from. The fastest read on offshore component work. |
divided_responsibility_firms | The same shape, for formally divided responsibility. |
is_multiple_audit_period, audit_period_information | When one Form AP covers several periods. |
is_dual_dated, audit_dual_date | Dual dating for a subsequent event. |
Amendment lineage
| Field | Description |
|---|---|
is_amendment | This Form AP amends a previously filed one. |
amended_sections | Which parts changed: audit_report, firm_identification, other_firms, divided_responsibility, participants_over_5pct, participants_under_5pct, audit_divided, certified_firm, certified_firm_info. |
amends_form_filing_id | The filing this one directly amends. |
original_form_filing_id | The head of the amendment chain. |
Fund series (Investment Company filings)
| Field | Description |
|---|---|
fund_series_count | Number of SEC fund series covered. 0 on non-fund filings. |
fund_series | Structured list of { fund_series_id, fund_name }. |
fund_series_id, fund_name | Top-level columns in fund-series mode, one row per series. About 14% of series legitimately carry no SEC series ID (unit investment trusts) and report null. |
Who signed, and provenance
| Field | Description |
|---|---|
signed_name, signed_business_title, signed_capacity, signed_date | The Form AP signature block, as published by PCAOB. |
signed_phone, signed_email | Firm filing-desk contact, as published by PCAOB. |
source_max_filing_date | Newest filing date anywhere in the file this row came from โ the data vintage, on every row. |
source_row_count | Total rows in the file this run parsed. |
source_url, retrieved_at | Where and when. |
firm-rollup mode
audit_firm, firm_id, firm_country, engagements, distinct_issuers, distinct_partners,
mandate_wins, mandate_losses, net_mandate_change, partner_rotations, first_year_audits,
bank_issuer_engagements, issuer_engagements, benefit_plan_engagements,
investment_company_engagements, amended_filings, divided_responsibility_engagements,
engagements_with_other_participants, engagement_share_pct, latest_filing_date,
new_filings_since_last_run, plus the provenance fields.
Use as an MCP tool
This actor is available to AI agents through mcp.apify.com. Every input and output field carries a description, so an agent can select and chain it without extra prompting. Useful agent phrasings:
- "Has this company changed auditors, and to whom?" โ
mode: "changes",issuerNameContains - "What Form APs were filed since yesterday?" โ
mode: "new-filings" - "Is the lead partner past the five-year rotation limit?" โ
mode: "engagements", then readpartner_rotation_status - "Which audit firm is winning the most bank mandates?" โ
mode: "firm-rollup",bankIssuersOnly: true - "Was any of this audit performed outside the US?" โ read
other_participating_firm_countries
Pricing
$12 per 1,000 results (pay-per-event, Result event only โ one event per dataset row). Graduated discounts apply on paid Apify plans. There are no hidden charge events, and a failed run emits nothing and bills nothing.
Cost control: maxResults is a hard cap applied before rows are built, so a capped run is cheap
as well as small. It defaults to 200 โ the same as the prefill โ so a bare {} from an API or
MCP caller returns a small, cheap sample rather than a sweep nobody asked for. Raise it deliberately. A national changes run over the full history finds ~31,000 change events; a
scheduled new-filings run typically returns tens of rows a day.
FAQ
How fresh is the data?
PCAOB refreshes FirmFilings.zip daily. Measured 2026-07-28: 155,189 rows, newest filing dated
2026-07-27. The actor fails the run when the newest filing date falls more than 21 days behind,
so a stale cached archive can never be served to you as a quiet market.
How fast is it? The 93 MB CSV is decoded in 4 MiB slices straight into a streaming parser, filtered as it goes, and pushed in batches โ the full file is never held as one string. A bank-only run finishes in about 6 seconds; a full national run in about 20. Comfortably inside Apify's timeout.
Why did my first new-filings run fail?
By design. That mode answers "what is new since last time", and with no baseline the honest answer
is "not knowable yet" โ a different claim from "nothing is new". The run records the baseline, fails
without billing you, and the next run at the same scope returns the real delta. Use mode: "changes"
if you want results immediately.
Does an audit-firm rename show up as an auditor switch?
No. Comparison is on firm_id, which PCAOB keeps stable across renames. Crowe Horwath LLP becoming
Crowe LLP is not a switch; the old name surfaces in firm_other_name.
Why is a company's 401(k) plan a separate row from the company? Because it is a separate audit, often by a different firm. PCAOB gives both the same Issuer ID; this actor separates them by entity type and plan slug, so a 401(k) auditor is never mistaken for a change of the 10-K auditor.
Can I diff against my own prior data instead of the stored baseline?
Yes โ pass priorEngagements as an array of
{ issuer_cik, issuer_id, issuer_name, audit_report_type, firm_id, audit_firm, engagement_partner, fiscal_period_end }is_new_since_last_run stays null and baseline_status reads
caller_supplied_baseline.
What does latestOnly: false do?
Keeps superseded amendment history so you can see how a filing changed over time. Amendments of the
same engagement still dedupe to one row per issuer x firm x fiscal period, preferring the current
filing.
Why is there no ticker field?
PCAOB publishes the column but has never populated it โ empty in 0 of 155,189 rows. Rather than emit
a permanently blank column, this actor omits it. Join on issuer_cik.
Related actors
- RIA Registration Delta Monitor โ the same delta pattern over SEC investment-adviser registrations. A natural pair if you cover financial-services counterparties.
- FDIC Bank M&A, Charter & Structure-Change Monitor โ
bank mergers, charter changes and failures. Combine with
bankIssuersOnly: truehere: an auditor change plus a pending structure change at the same bank is a far stronger signal than either alone. - SBOM Vulnerability Rollup โ if you are assembling an issuer-level risk file, the software-supply-chain layer of the same picture.
Data is republished from the Public Company Accounting Oversight Board's public Form AP archive.
This actor does not add, correct or interpret PCAOB's data beyond the derived fields documented
above; partner_rotation_status and is_bank_issuer in particular are derived heuristics, not
determinations by PCAOB or the SEC.