Skip to main content

Surplus Lines Tax Compliance

Surplus lines insurance covers risks that the admitted (standard) market declines to write. Because these policies are placed with non-admitted carriers, they carry additional regulatory obligations: premium taxes, stamping office fees, diligent search requirements, and periodic tax return filings. OpenInsure automates this end-to-end through @openinsure/billing and the tax filing API.

Admitted vs Surplus Lines

DimensionAdmitted MarketSurplus Lines (Non-Admitted)
Rate approvalState DOI files and approves ratesRates are not filed with the DOI
Guaranty fundPolicyholders protected by state guaranty fundNo guaranty fund protection
Tax collectionCarrier remits premium tax directlySurplus lines broker remits premium tax
Stamping officeNot applicableRequired in stamping-office states
Diligent searchNot requiredMost states require 3 admitted declinations
Carrier eligibilityMust be admitted in the stateMust appear on the state's eligible surplus lines insurer list

In the OpenInsure model, the MGA acts as the surplus lines broker of record. The platform tracks declinations, calculates taxes, and generates filing-ready tax returns.

Diligent Search Requirement

Most states require the producing broker to demonstrate that admitted markets have declined the risk before placing it with a non-admitted carrier. The system tracks this through the isSurplusLinesEligible() function in @openinsure/billing.

  • Declination threshold -- Typically 3 declinations. Configurable per state in SL_TAX_RATES.
  • Exempt states -- New York and Vermont do not require a diligent search for certain lines of business.
  • Documentation -- Each declination is recorded with carrier name, date, and reason. The system blocks binding until the threshold is met.
import { isSurplusLinesEligible } from '@openinsure/billing';

// Returns true if 3+ declinations recorded (or state doesn't require search)
const eligible = isSurplusLinesEligible('FL', 'commercial_auto', 3);

State Premium Tax Rates

Premium tax rates vary by state and are maintained in the SL_TAX_RATES lookup table in packages/billing/src/surplus-lines-tax.ts. Rates are sourced from the NAPSLO/WSIA surplus lines law compendium.

Selected state rates (representative sample):

StatePremium TaxStamping FeeFiling FeeDeclinations
FL5.0%0.10%0.15%3
TX4.8%0.06%--3
CA3.0%0.18%--3
NY3.6%0.06%--Not required
IL3.5%0.10%--3
GA4.0%----3
AL6.0%----3
OR0.22%0.30%--3
PR9.0%----3

The full table covers all 50 states plus DC, Puerto Rico, the U.S. Virgin Islands, and Guam.

Stamping Offices

Several states operate a Surplus Lines Stamping Office (SLSO) that reviews and stamps each surplus lines policy for compliance. States with stamping fees in the OpenInsure rate table include:

  • California (SLSF) -- 0.18%
  • Florida (FSLSO) -- 0.10%
  • Texas (SLTX) -- 0.06%
  • New York (ELANY) -- 0.06%
  • Illinois (ILSLS) -- 0.10%
  • Minnesota -- 0.05%
  • Oregon -- 0.30%

Where a stamping fee applies, the system automatically includes it in the tax calculation and the filing output.

Tax Calculation

All surplus lines tax arithmetic uses the Money type from @openinsure/rating to guarantee cent-precise, deterministic results. The calculateSurplusLinesTax() function returns a breakdown per policy:

import { calculateSurplusLinesTax } from '@openinsure/billing';

const breakdown = calculateSurplusLinesTax('FL', 125000);
// {
// state: 'FL',
// grossPremium: 125000,
// premiumTax: 6250, // 5.0%
// stampingFee: 125, // 0.10%
// filingFee: 187.5, // 0.15%
// totalTax: 6562.5
// }

Municipal and Local Taxes

Some jurisdictions impose additional local taxes on surplus lines placements, typically on fire and property lines. The system maintains a MUNICIPAL_TAX_RATES table with rates for major metropolitan areas:

JurisdictionStateTax RateApplies To
New York CityNY3.4%Fire
Los AngelesCA5.0%All
San FranciscoCA5.0%Fire
ChicagoIL3.5%Fire
HoustonTX2.5%Fire
Miami-DadeFL1.0%Fire
SeattleWA5.0%Fire
DenverCO3.0%All
BostonMA4.0%Fire

Fire-applicable LOBs include: fire, homeowners, commercial property, dwelling, and BOP. The calculateMunicipalTax() function checks the LOB against the jurisdiction's appliesTo filter before applying the rate.

Tax Return Generation

The tax filing API generates state-level tax returns that aggregate all surplus lines policies for a given period. The workflow is:

  1. Generate -- POST /v1/tax/surplus-lines/generate with a { period: "2025" } body. The system loads all bound/active/expired policies, calculates per-policy taxes, and aggregates by state.
  2. Review -- Each generated return starts in draft status. Returns include line-item detail (policy number, gross premium, premium tax, stamping fee, filing fee) and aggregate totals.
  3. File -- Update status to filed via PATCH /v1/tax/surplus-lines/:id/status.
  4. Track -- Returns progress through: draft -> ready -> filed -> accepted or rejected.

Tax Return Summary

The generate endpoint returns a TaxReturnSummary with cross-state totals:

FieldDescription
stateCountNumber of states with taxable premium
totalGrossPremiumSum of gross premium across all states
totalPremiumTaxSum of state premium taxes
totalStampingFeeSum of stamping office fees
totalFilingFeeSum of state filing fees
totalMunicipalTaxSum of municipal/local taxes
totalTaxLiabilityGrand total tax due

Filing Due Dates

Filing deadlines are state-specific and stored in the SL_TAX_DUE_DATES table:

StateDue Date
FLMarch 1
TXMarch 1
CAMarch 1
NYJanuary 31
ILMarch 15
DefaultMarch 1

Due dates are calculated for the year following the tax period (e.g., 2025 policies are due for filing by March 1, 2026).

Tax Filing API

List Returns

GET /v1/tax/surplus-lines?state=FL&period=2025&status=draft
Authorization: Bearer <token>

Returns are filterable by state, period, and status. Requires org_admin or billing_admin role.

Get Return Detail

GET /v1/tax/surplus-lines/:id
Authorization: Bearer <token>

Returns the full tax return with parsed line items (per-policy breakdown).

Update Filing Status

PATCH /v1/tax/surplus-lines/:id/status
Authorization: Bearer <token>
Content-Type: application/json

{
"status": "filed",
"filedDate": "2026-02-15"
}

Export CSV

GET /v1/tax/surplus-lines/:id/csv
Authorization: Bearer <token>

Returns a CSV file with columns: Policy Number, Effective Date, LOB, Gross Premium, Premium Tax, Stamping Fee, Filing Fee. Includes a TOTAL summary row. The CSV is formatted for direct submission to state tax authorities or stamping offices.

Late Filing Penalties

If a tax return is filed after the due date, the calculateLatePenalty() function computes the penalty and interest:

  • Penalty -- 10% of tax due (flat).
  • Interest -- 1% per month of tax due (simple interest), counted from the due date.
  • Months late -- Calculated using 30.44-day month approximation, rounded up.
POST /v1/tax/surplus-lines/:id/late-penalty
Authorization: Bearer <token>
Content-Type: application/json

{
"filedDate": "2026-06-15"
}

The penalty and interest amounts are persisted to the tax return record for audit trail purposes.

Authorization

All tax filing endpoints require the org_admin or billing_admin JWT role. The endpoints are org-scoped -- each request operates only on policies and returns belonging to the authenticated organization.