Oilfield-services excess is a pollution, auto and workers-comp story over a big tower. The submission is GL by energy class, yards and sites, a large field workforce, and an auto/pollution-heavy loss run over a $50M lead. We ran a real services contractor, Permian Ridge Energy Services, through InsightXtract.

Insured: Permian Ridge Energy Services LLCRevenue $312M GL payroll $63.7MWC payroll $71.6M Yards / Sites 18Named insureds 26 5-yr claims 42 / $14.8M incurredLead umbrella $50M

Why energy is an excess casualty risk

Oilfield services carry severe auto, workers-comp and pollution exposure — highway and lease-road driving, struck-by/caught-in injuries at the well site, and spill events. The umbrella sits over primary auto/GL/WC and the contractual risk-transfer program with sub-tier operators. Auto and pollution drive the tower; the field WC book drives frequency.

The submission packet

A real energy placement is rarely one clean file. This one is five, in four different shapes — the everyday reality an underwriting team has to re-key by hand today:

  • broker_email.pdf — the renewal narrative: account description, requested limits, exposure snapshot, and the excess-layer options to quote.
  • rfq.pdf — the umbrella/excess application: general information, coverage requested, and the exposure bases.
  • exposure_workbook.xlsx — the heart of the file: GL exposure by oilfield-services class, a yard/site schedule, a large field WC payroll book, and a named-insured schedule of operating entities.
  • loss_run.pdf — five years of currently-valued losses, auto- and workers-comp-heavy with pollution/spill events (42 claims).
  • schedule_of_underlying.pdf — the primary casualty and lead umbrella the excess attaches over.

Step 1 — Classification

Every file is routed to a document type first — evidence-bearing, with a confidence, not a black-box label:

Document
Classified as
Conf.
broker_email.pdf
excess_casualty_submission_email
0.98
rfq.pdf
excess_casualty_application
0.97
exposure_workbook.xlsx
excess_casualty_exposure_workbook
0.99
loss_run.pdf
excess_casualty_loss_run
0.98
schedule_of_underlying.pdf
excess_casualty_schedule_of_underlying
0.96

Step 2 — Coverage structure, with citations

The requested tower is read from the email and application, every value grounded to its page:

CoverageRequestedSource
General Liability — each occurrence$1,000,000rfq p.2
General Aggregate$4,000,000rfq p.2
Products / Completed-Ops Aggregate$4,000,000rfq p.2
Commercial Auto — CSL$1,000,000rfq p.3
Employers Liability$1,000,000rfq p.3
Lead Umbrella$50Memail p.1

Step 3 — Exposure schedules, typed & normalized

The workbook is where template OCR falls over — many sheets, hundreds of rows, broker-specific wording. InsightXtract reads every sheet, maps each to a typed schedule, and normalizes the codes against governed glossaries. A slice of the GL exposure schedule:

StateWC CodeDescriptionRevenuePayroll
TX us_state_codes94276 ncciGrading of land$18,900,000$3,402,000
NM us_state_codes98868 ncciWater mains / connections$12,300,000$2,214,000
OK us_state_codes91580 ncciContractors - subcontracted work$9,700,000$1,746,000
… 42 GL rows · workers_compensation 62 · named_insured_mix 26 · location_list 18

Column bindings: state → us_state_codes, class → ncci_wc_class_codes / iso_gl_class_codes, occupancy → occupancy_types. Out-of-vocabulary values are flagged by validation, not silently kept — and fuzzy column resolution means a rule written for payroll still binds a broker’s “Total Payroll” column.

Step 4 — Derived exposures (deterministic, not guessed)

The account is rated on totals. Rather than ask a model to eyeball-sum hundreds of rows, the document type declares deterministic sum / count / group_by rules that reduce the extracted schedules exactly — the same numbers every run, each traceable to its source table:

$63.7M
GL payroll
∑ general_liability.payroll
$71.6M
WC payroll
∑ workers_compensation.payroll
18
Yards / Sites
count(location_list)
26
Named insureds
count(named_insured_mix)

Step 5 — The loss run

A services contractor's loss run is severity-heavy — highway collisions, lease-road rollovers, struck-by and caught-in injuries, and spill events across five valued years. Every claim is extracted — coverage line, status and cause normalized — and rolled up, with a by-line split for the loss pick:

Claim #CoverageCauseStatusIncurred
PER-2110AL coverage_linesHighway collisionOpen claim_statuses$620,000
PER-2088AL coverage_linesLease-road rolloverOpen claim_statuses$480,000
PER-2051WC coverage_linesStruck-byClosed claim_statuses$210,000
PER-2033GL coverage_linesPollution - spillOpen claim_statuses$340,000
… 42 claims across 5 policy years, currently valued
42
Claims (5 yr)
count(claims)
$14.8M
Total incurred
∑ claims.incurred
by line
Incurred split
group_by coverage_line

What the underwriter reads first

The coded record surfaces exactly the drivers that move this class of business:

  • Auto radius & fleet — highway and lease-road driving is the dominant severity driver.
  • Pollution / spill exposure and the CPL structure over the tower.
  • Contractual risk-transfer with sub-tier operators, captured from the narrative.
  • Field WC frequency — struck-by and caught-in injuries by site.
  • A 42-claim loss run extracted in full at a 64K output budget — no truncation.

Why it holds up in production

  • Every value is cited — page/region provenance on fields and schedules; a file review can click any number to its source.
  • Codes are normalized against governed glossaries; out-of-vocabulary values are validated, not hidden.
  • Totals are computed, not guessed — deterministic derived fields over the extracted rows, exact and reproducible.
  • Configuration is versioned — document types, glossaries and rules pinned to a published version, so an output made today reproduces tomorrow.
  • Nothing is dropped — the all-sheets extractor surfaces every schedule, even ones the base schema didn’t anticipate.