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
| Dimension | Admitted Market | Surplus Lines (Non-Admitted) |
|---|---|---|
| Rate approval | State DOI files and approves rates | Rates are not filed with the DOI |
| Guaranty fund | Policyholders protected by state guaranty fund | No guaranty fund protection |
| Tax collection | Carrier remits premium tax directly | Surplus lines broker remits premium tax |
| Stamping office | Not applicable | Required in stamping-office states |
| Diligent search | Not required | Most states require 3 admitted declinations |
| Carrier eligibility | Must be admitted in the state | Must 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):
| State | Premium Tax | Stamping Fee | Filing Fee | Declinations |
|---|---|---|---|---|
| FL | 5.0% | 0.10% | 0.15% | 3 |
| TX | 4.8% | 0.06% | -- | 3 |
| CA | 3.0% | 0.18% | -- | 3 |
| NY | 3.6% | 0.06% | -- | Not required |
| IL | 3.5% | 0.10% | -- | 3 |
| GA | 4.0% | -- | -- | 3 |
| AL | 6.0% | -- | -- | 3 |
| OR | 0.22% | 0.30% | -- | 3 |
| PR | 9.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:
| Jurisdiction | State | Tax Rate | Applies To |
|---|---|---|---|
| New York City | NY | 3.4% | Fire |
| Los Angeles | CA | 5.0% | All |
| San Francisco | CA | 5.0% | Fire |
| Chicago | IL | 3.5% | Fire |
| Houston | TX | 2.5% | Fire |
| Miami-Dade | FL | 1.0% | Fire |
| Seattle | WA | 5.0% | Fire |
| Denver | CO | 3.0% | All |
| Boston | MA | 4.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:
- Generate --
POST /v1/tax/surplus-lines/generatewith a{ period: "2025" }body. The system loads all bound/active/expired policies, calculates per-policy taxes, and aggregates by state. - Review -- Each generated return starts in
draftstatus. Returns include line-item detail (policy number, gross premium, premium tax, stamping fee, filing fee) and aggregate totals. - File -- Update status to
filedviaPATCH /v1/tax/surplus-lines/:id/status. - Track -- Returns progress through:
draft->ready->filed->acceptedorrejected.
Tax Return Summary
The generate endpoint returns a TaxReturnSummary with cross-state totals:
| Field | Description |
|---|---|
stateCount | Number of states with taxable premium |
totalGrossPremium | Sum of gross premium across all states |
totalPremiumTax | Sum of state premium taxes |
totalStampingFee | Sum of stamping office fees |
totalFilingFee | Sum of state filing fees |
totalMunicipalTax | Sum of municipal/local taxes |
totalTaxLiability | Grand total tax due |
Filing Due Dates
Filing deadlines are state-specific and stored in the SL_TAX_DUE_DATES table:
| State | Due Date |
|---|---|
| FL | March 1 |
| TX | March 1 |
| CA | March 1 |
| NY | January 31 |
| IL | March 15 |
| Default | March 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.