Methodology
Everything on this site is derived from one public dataset, aggregated. This page says exactly what is counted, what is excluded, and how every derived field is produced. Tokens in {{ }} are filled in by the data pipeline at deploy time.
What is counted
A notice of intent to initiate litigation (NOI, sometimes “notice of intent to sue”) is a pre-suit notice required by Florida law (§627.70152, created by SB 76 in 2021) before a policyholder may sue their property insurer over a claim. An NOI is a dispute record: a policyholder asserting that an insurer denied, underpaid, or delayed handling a claim. It is not a finding of wrongdoing, and nothing on this site should be read as one.
This site counts NOIs filed against Florida property insurers from 2021-07-01 through 2026-09-07 (data as of 2026-09-07). Headline total: 277,081 notices.
Source and refresh
Source: Florida Department of Financial Services, Property Insurance Intent to Litigate portal (piitil.myfloridacfo.gov). Retrieved 2026-09-08.
The portal is re-read daily and the site is regenerated automatically (last run 2026-09-08T23:54:29Z). Fresh filings can take roughly 1 days to appear in the portal itself, so the most recent days are always provisional. Numbers move only when the source moves; nothing on this site is estimated or projected.
What is excluded
- Withdrawn notices. Filings the portal marks withdrawn are excluded from every count on the site. 10,970 notices (3.8% of all filings) were withdrawn as of 2026-09-07.
- Anything before July 1, 2021. The statutory NOI requirement took effect that day; the dataset begins there.
- Personal information. No claimant names, street addresses, emails, policy numbers or claim numbers appear anywhere in the published data. Geography is published at county level only.
How insurers are ranked
Insurers are ranked by raw count of NOIs, and share is each insurer’s count as a percentage of all notices. Raw volume correlates with insurer size: a large carrier will accumulate more notices than a small one even with identical claims behavior. Counts are not adjusted for policies in force; we publish share-of-notices alongside every count so volume is always read in context. If we later add per-policy normalization, it will use Florida OIR policies-in-force data, verifiably sourced, and this page will say so.
Every insurer with at least 100 notices, or with policies currently in force (latest FLOIR quarter) and at least one notice, gets an individual series — currently 180 insurers, so new and small active carriers are visible rather than buried in an aggregate. The remaining, mostly inactive or negligible-volume entities are aggregated into a single “All other insurers” row (4,973 notices, all insurers outside the top 180). County, damage-type and category filters operate on the same basis.
Derived fields
The portal does not publish county, damage type, or dispute category as structured fields. We derive them, deterministically, as follows:
- County: from the filing’s claimant ZIP code, using a ZIP-to-county crosswalk for Florida’s 67 counties. 1,798 filings could not be mapped and are counted statewide but not in any county.
- Dispute category (claim denied / underpaid / delay or no response / other-unclassified) and damage type (hurricane-wind / water / roof / mold / fire / theft / other-unclassified), derived from the portal’s free-text “alleged acts or omissions” field by deterministic keyword rules, version 2026-09-08.1. A filing that matches no rule lands in unclassified. We never force a bucket: an unclassified filing stays unclassified.
Classification rules version 2026-09-08.1: the complete, current rule set:
### Dispute category Priority order, first match wins, case-insensitive, word-boundary regexes applied to `raw_row->>'Alleged Acts or Omissions of the Insurer'`: 1. **denial** — `denied|denial|deny(ing)?|refus(ed|al) to (pay|cover)|declin(ed|ing) (the )?claim|wrongful(ly)? deni` 2. **underpayment** — `underpaid|underpayment|under-?paid|failed to (properly|fully|adequately|correctly)? ?(pay|indemnify|issue proper payment)|partial(ly)? (payment|paid)|failed to compensate` 3. **delay** — `delay|failed to acknowledge|failed to act promptly|failed to (timely )?respond|failure to communicate` 4. **other** — no rule matched (never forced into a bucket) ### Damage type Priority order, first match wins, case-insensitive, same source text: 1. **mold** — `mold` 2. **fire** — `fire|smoke|lightning` 3. **theft** — `theft|vandal` 4. **hurricane-wind** — `hurricane|windstorm|wind |hail|named storm|ian|irma|michael|milton|idalia|nicole` 5. **roof** — `roof` 6. **water** — `water|pipe|plumbing|leak|supply line` 7. **other** — no rule matched ### Match-rate table Run against the live dataset after the 2026-09-08 catch-up ingest (`insurer.noi_filings`, 288,057 rows, filing_date 2021-07-01 -> 2026-09-07). Percentages are of **active** (non-withdrawn) rows. `classify.py`'s report counts all 288,057 rows (active=277,087); `aggregate.py` additionally requires a non-null `filing_date` to place a row in a month bucket, which drops exactly the 6 corrupted legacy rows below (all have `filing_date IS NULL`), giving the shipped `total_notices=277,081`. Re-run `python3 classify.py` to refresh these numbers after any data or rules change. ``` rules_version=2026-09-08.1 total_rows=288057 withdrawn=10970 active=277087 zip_county map entries loaded=993 county unknown (active rows)=1804 (0.65%) category match rates (active rows): denial 110099 39.73% underpayment 59422 21.45% delay 1986 0.72% other 105580 38.10% damage match rates (active rows): hurricane-wind 54945 19.83% water 15276 5.51% roof 5367 1.94% mold 3434 1.24% fire 1183 0.43% theft 245 0.09% other 196637 70.97% ```
Current totals by derived field
Dispute category:
| Bucket | Notices | Share |
|---|---|---|
| Claim denied | 110,099 | 39.7% |
| Underpaid claim | 59,422 | 21.4% |
| Delay / no response | 1,986 | 0.7% |
| Other / unclassified | 105,574 | 38.1% |
Damage type:
| Bucket | Notices | Share |
|---|---|---|
| Hurricane / Wind / Hail | 54,945 | 19.8% |
| Water | 15,276 | 5.5% |
| Roof | 5,367 | 1.9% |
| Mold | 3,434 | 1.2% |
| Fire | 1,183 | 0.4% |
| Theft | 245 | 0.1% |
| Other / unclassified | 196,631 | 71.0% |
Policies in force
Every insurer row on the site carries a current policy count, so notice volume can be read against carrier size instead of being mistaken for it. The policies_in_force, pif_period, pif_source and noi_per_1k_pif_12mo fields in summary.json are produced by the rules below.
Source
Florida Office of Insurance Regulation, Market Intelligence Report (MIR, formerly QUASR), workbook statewide summary by company and policy type, published on OIR's Residential Market Share Reports page (floir.gov). The workbooks are loaded into insurer.mir_statewide on florida-vm by insurer_intel/ingest/mir_ingest.py, which stores the originating OIR URL on every row. Nothing is fetched at site build time: aggregate.py reads the database, and the published figures are traceable back to a specific OIR workbook file.
Period
2026-06-01, the 2026 Q2 workbook. Its own column header reads "Total number of policies in force as of June 30, 2026", so the figure is a point-in-time count on that date, not an average or a total over the quarter. This is the most recent period OIR has published. An insurer with no policy count carries null for the period and the source as well as the count, so a missing figure can never be read as a zero attributed to OIR.
Dedup rule
A naive query of insurer.mir_statewide for period 2026-06-01 returns 880 rows and doubles every carrier's policy count. The reason is not a double ingest. OIR publishes two separate workbook series that share a period-end month: a quarterly workbook (2026 Q2) and a monthly one (2026 M6). Both report policies in force as of June 30, 2026, and mir_ingest.py stores the period-end month as the row's period, so both land on 2026-06-01: 446 quarterly rows plus 434 monthly rows.
The two series are not copies of each other. Compared across the 434 (naic, policy_type) keys they share:
- every stock column agrees exactly, with zero disagreements:
policies_in_force,pif_exclude_wind,pif_include_wind,exposure_total,premium_written,claims_pending; - every flow column disagrees widely:
policies_cancelleddiffers on 323 keys,new_policies_writtenon 309,claims_openedon 297,claims_closedon 293,policies_nonrenewedon 271. That is expected: the quarterly workbook measures three months of activity and the monthly one measures a single month.
So the rule is take exactly one series, never sum across both. The pipeline takes the quarterly workbook when the latest period has one, because it is a strict superset (446 rows against 434, and all 12 quarterly-only rows carry a null policy count), and falls back to the monthly workbook when the latest period is a month with no quarter end. Within the chosen series (naic, policy_type) is unique, so no further deduplication is possible or needed. Because the stock columns are identical between the series, a "deduplicate and sum distinct rows" rule would produce the same policy counts; picking one series is the rule stated here because it is also correct for the flow columns, and because it does not silently depend on the two workbooks agreeing.
Effect of the rule, at period 2026-06-01:
carrier raw rows raw sum deduped rows published CITIZENS PROPERTY INSURANCE CORPORATION 36 551,284 18 275,642 AMERICAN INTEGRITY INSURANCE COMPANY 18 837,952 9 418,976 SLIDE INSURANCE COMPANY 8 970,542 4 485,271
Statewide, the deduped 2026 Q2 series carries 7,635,278 policies in force across 166 companies.
Inclusion rule
An insurer's policy count is the sum of policies_in_force over all policy types the carrier reports in that workbook, personal and commercial residential, wind-only lines included. The pre-suit notice statute (§627.70152) applies to residential and commercial property insurance, so the denominator is not narrowed to owner-occupied homeowners policies while the numerator counts every property notice.
This inclusion rule does leave one asymmetry, stated here rather than hidden: the MIR is a residential market report. It covers commercial residential lines (condominium associations, homeowners associations, apartment buildings), but it does not cover non-residential commercial property. Where a carrier writes non-residential commercial property in Florida and receives notices on it, the denominator is understated by those policies and the notices-per-1,000 figure is correspondingly overstated. There is no OIR-published residential-plus-commercial policy count to use instead, and nothing here is estimated to fill that gap.
How a policy count is matched to an insurer
The join is on NAIC company code and nothing else. Names are never matched across the two datasets. An insurer gets null (never an estimate, never a neighbouring company's figure) when:
- its notices carry no NAIC code in the source portal (for example Underwriters at Lloyd's, London, which files as surplus lines rather than as a Florida admitted carrier and so is not in the OIR data call at all);
- its NAIC has no row in the latest MIR period, which is what happens to a carrier that has stopped writing in Florida. Five of the site's top 40 are in this position, and in each case the carrier is present in earlier MIR periods and then stops, which is what market exit looks like, not suppression: United Property & Casualty (last reported policies 2022 Q3), Family Security (last row 2022 Q2), Tower Hill Signature and Tower Hill Preferred (last reported policies 2023 Q1), and Frontline Insurance Unlimited, which does not appear in the MIR under its NOI NAIC in any period. Their notices are historical and their policies are gone, so there is no honest current denominator for them;
- the row is "All other insurers", which is a mixed bag of hundreds of carriers and has no meaningful single policy count.
A carrier that reports zero policies in force keeps the honest 0 as its policy count and gets null for the ratio, because a rate per zero policies is not a number.
Trade-secret caveat
OIR's interactive market-share report (qsrng.floir.gov) suppresses every company that filed its s.624.424(10) data-call submission as a trade secret. OIR publishes the dated suppression list on the same page as the workbooks; it currently names 84 companies, and most of the largest Florida writers are on it, State Farm Florida (suppressed since 2014 Q1), Universal Property & Casualty (2021 Q2), Slide and Tower Hill Insurance Exchange (2022 Q1), Homeowners Choice, TypTap and Olympus (2023 Q1) among them.
The XLSX series used here is not suppressed and carries every filer, which is precisely why it is the source for this field rather than the interactive report. The suppression is visible in the data: State Farm Florida has been suppressed from the interactive report for over a decade and still reports 665,341 policies in force in the 2026 Q2 workbook. No insurer on this site is missing a policy count because of trade-secret suppression; the nulls are the cases listed above.
What the ratio does and does not mean
noi_per_1k_pif_12mo is notices filed in the last 12 months divided by policies in force, per 1,000 policies. Read it with these limits:
- It is a dispute-rate indicator, not a claim-denial rate. An NOI is an allegation by a policyholder, not an adjudicated finding, and the dataset contains no claim outcomes. Nothing in it says what share of a carrier's claims were denied, or even what share of its claims were disputed.
- It divides a 12-month flow by a point-in-time snapshot. The notices span July 2025 to the present; the policy count is a single day, June 30, 2026. A carrier that grew or shrank sharply over that year is measured against a denominator that did not hold for most of it.
- It is unstable and can be grossly overstated for a carrier in runoff. Notices arrive on policies written years earlier, while the policy count falls to near zero as the book winds down. Safepoint went from 44,595 policies in 2023 Q2 to 51 in 2026 Q2 and Truck Insurance Exchange from 88,019 to 179, so their ratios run into the hundreds or thousands per 1,000 policies and mean nothing about how either company handles a claim today. The figure is published because it is what the two public sources say, not because it is comparable across carriers of unlike size or trajectory.
- Carriers differ in what they write (owner-occupied homes, condominium units, tenants, mobile homes, wind-only) and those books do not generate disputes at the same rate. The ratio does not adjust for line mix.
Verification
Both the deduplication and the published figures were re-derived independently before shipping: from the archived OIR workbooks themselves, parsed without the loader's code path, and cross-checked against OIR's separately published county-level report. See STATUS.md for the side-by-side derivations.
Insurer identity
The portal's insurer_name is free text and its NAIC code is not always present, so the site has one explicit rule for what counts as one insurer.
- Same NAIC, different spellings: merged. Rows sharing a NAIC code are one insurer, and the canonical display name is the longest (most specific) of the name variants. In the current data this folds 15 NAIC codes that carry two spellings each, for example
12841"American Integrity Insurance Company" into "American Integrity Insurance Company of Florida", and11185"Foremost Insurance Company" into "Foremost Insurance Company Grand Rapids, Michigan". - Different NAICs are never merged into a brand total. Each licensed company stands alone, even when carriers share a parent or a brand, because they are separately licensed, separately capitalised and separately reporting entities. The site's top 40 therefore lists Tower Hill as four companies (Insurance Exchange
17179, Signature12538, Preferred29050, Prime11027), Castle Key as two (Indemnity10835, Insurance Company30511), USAA as three (United Services Automobile Association25941, USAA Casualty25968, USAA General Indemnity18600), and Universal Property & Casualty10861separately from other Universal-branded entities, which fall below the top 40. No row on this site is a brand rollup, and none should be read as one. - Rows with no NAIC join their exact-name bucket. A notice with an empty NAIC field is grouped by its insurer name exactly as spelled, and is not attached to a NAIC. This is deliberate: it keeps the notice counted without inventing an identity for it. It is also why a name-based total can be one higher than a NAIC-only query. American Integrity publishes 17,835 notices where a NAIC-only count returns 17,834, and Tower Hill Insurance Exchange publishes 4,071 against 4,070; in both cases the difference is exactly one notice whose NAIC field is blank and whose name matches the canonical name character for character. Both figures are correct; they answer different questions.
- Non-numeric NAIC values are never merged into a real company. A small number of notices carry a NAIC field that is not a number, either a placeholder such as
UKor a fragment left behind when the source CSV export mis-parses a company name that contains a comma or a quote (for exampleTHE) (33588). These are treated as opaque strings, are never folded into a numeric-NAIC insurer, and cannot match an OIR policy count. All of them are small and fall into "All other insurers": the largest is 324 notices, and theUKvalue covers 5 notices across 2 differently named companies. - Policy counts follow the same identity. A policy count is attached to the insurer's single NAIC code, so an insurer that is not merged here is not merged in its denominator either, and an empty-NAIC bucket never receives one.
Limitations
- An NOI records an allegation, not an adjudicated fact. Settlements, judgments and dismissals after the notice are not in this dataset (beyond the withdrawn flag).
- Volume tracks insurer size; the site shows share-of-notices to keep that in view rather than hiding it.
- Category and damage type are keyword-derived from free text and are a best-effort classification, not a portal-published field.
- The newest 1 days are subject to portal ingest lag.
Version
Data pipeline run 2026-09-08T23:54:29Z · classification rules 2026-09-08.1 · data contract v1. Corrections or questions: see the site footer for source attribution; we publish only what the portal supports.