PCAOB Auditor Change & Engagement Partner Monitor avatar

PCAOB Auditor Change & Engagement Partner Monitor

Pricing

from $6.60 / 1,000 results

Go to Apify Store
PCAOB Auditor Change & Engagement Partner Monitor

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

Kyle Maloney

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

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_key so you can audit the join.
  • A negative is only asserted when it was actually checked. is_auditor_switch: false means there was a predecessor and the firm did not change. Where there is no predecessor the field is null, not false, and prior_source says why. The same contract governs is_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 Filing flag 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 Ticker column 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

ModeWhat 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-filingsOnly 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.
engagementsThe current audit roster: who audits whom, which partner, and how long they have served.
firm-rollupOne row per audit firm: mandate wins and losses, market share, distinct partners, entity-type mix.
fund-seriesOne 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

FieldDescription
issuer_nameAudited issuer, benefit plan or investment company, as filed.
issuer_cikSEC Central Index Key. The stable identifier โ€” PCAOB never populates the ticker column.
issuer_idPCAOB internal issuer ID. Not unique per company; see above.
issuer_entity_keyThe identity this row was actually grouped under. The audit trail for the join.
issuer_entity_typeissuer, employee_benefit_plan or investment_company.
issuer_plan_slugPlan type (401k, esop, pension, and so on) for benefit plans; null otherwise.
issuer_has_no_cikPCAOB's "CIK None" flag: the filer declared the entity has no SEC CIK.
is_bank_issuerBank, thrift or bank holding company, matched on the issuer name. Benefit plans are never flagged.

The engagement

FieldDescription
audit_firm, firm_idRegistered accounting firm. firm_id is stable across renames, so a rename is not reported as a switch.
firm_other_nameAlternate or former firm name, for example a pre-merger brand.
firm_country, firm_city, firm_stateThe office that issued the report.
engagement_partner, engagement_partner_idLead engagement partner.
engagement_partner_other_idsOther partner IDs the same person has filed under, typically after a firm move.
secondary_partner, secondary_partner_id, secondary_partner_other_idsSecondary engagement partner, where disclosed (1.1% of filings).
audit_report_typeIssuer / Employee Benefit Plan / Investment Company, verbatim.
fiscal_period_end, audit_report_date, filing_dateNormalized to YYYY-MM-DD.
is_latest_filingPCAOB's current-filing flag. false on superseded amendments.
form_filing_idPCAOB Form AP filing identifier.

Change detection

FieldDescription
change_typeauditor_switch, partner_rotation, first_year_audit, new_issuer, no_change, or baseline.
is_auditor_switchtrue / false when a predecessor existed; null when there was nothing to compare against.
is_partner_rotationThe same contract.
is_first_year_auditFirst 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_endThe engagement this row was compared against. null when there was none.
prior_sourcefiling_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_basissame_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_runtrue when the run had no prior entity snapshot.

Cross-run delta

FieldDescription
is_new_since_last_runtrue 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_statusno_baseline, baseline_loaded, baseline_unavailable, baseline_scope_mismatch, caller_supplied_baseline.
delta_scopeWhich scoped baseline this run used.

Partner and firm tenure

FieldDescription
partner_consecutive_periodsConsecutive fiscal periods this partner has signed for this entity at this firm.
partner_first_observed_periodFirst period of the current unbroken run.
partner_tenure_left_censoredtrue when the run reaches the earliest Form AP on file, so real tenure may be longer.
partner_rotation_statuswithin_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_censoredThe same, for the firm.

Audit scope and component audits

FieldDescription
is_audit_divided, is_audit_not_dividedWhether responsibility was formally divided with another firm.
other_participant_countNumber of other accounting firms that participated. null when not disclosed โ€” never 0.
participant_percentage, participant_range, uses_participant_rangeHow much of the audit those firms performed.
other_participating_firmsStructured list: firm_id, firm_name, country, city, state, percentage, range.
other_participating_firm_countriesDistinct countries the participating firms worked from. The fastest read on offshore component work.
divided_responsibility_firmsThe same shape, for formally divided responsibility.
is_multiple_audit_period, audit_period_informationWhen one Form AP covers several periods.
is_dual_dated, audit_dual_dateDual dating for a subsequent event.

Amendment lineage

FieldDescription
is_amendmentThis Form AP amends a previously filed one.
amended_sectionsWhich 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_idThe filing this one directly amends.
original_form_filing_idThe head of the amendment chain.

Fund series (Investment Company filings)

FieldDescription
fund_series_countNumber of SEC fund series covered. 0 on non-fund filings.
fund_seriesStructured list of { fund_series_id, fund_name }.
fund_series_id, fund_nameTop-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

FieldDescription
signed_name, signed_business_title, signed_capacity, signed_dateThe Form AP signature block, as published by PCAOB.
signed_phone, signed_emailFirm filing-desk contact, as published by PCAOB.
source_max_filing_dateNewest filing date anywhere in the file this row came from โ€” the data vintage, on every row.
source_row_countTotal rows in the file this run parsed.
source_url, retrieved_atWhere 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 read partner_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 }
. A caller baseline carries no Form Filing IDs, so 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.


  • 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: true here: 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.