CT Underground Storage Tanks - Facility & Enforcement Register avatar

CT Underground Storage Tanks - Facility & Enforcement Register

Pricing

from $0.03 / 1,000 ct ust facility records

Go to Apify Store
CT Underground Storage Tanks - Facility & Enforcement Register

CT Underground Storage Tanks - Facility & Enforcement Register

Connecticut's underground storage tank register (public open data): 49.4K tank records across 12,752 facilities, with the named responsible parties, inspection findings and violation text, and DEEP enforcement actions (field NOV, warning letter, red tag, consent order) linked on one facility id.

Pricing

from $0.03 / 1,000 ct ust facility records

Rating

0.0

(0)

Developer

Wenhao Yang

Wenhao Yang

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

6 hours ago

Last modified

Categories

Share

Low cost

From $0.00005 per record, down to $0.00003 at Gold - pay per record delivered, and nothing for the query. Cost scales with what you pull, not with the size of the register.

Connecticut's underground storage tank register, from DEEP. Every tank in the state, who is responsible for it, what inspectors found, and what the state did about it - assembled from four linked tables and resolved on one facility id.

What you get

~49,900 tank records across 12,752 facilities, each with tank status, substance, capacity, construction and leak-detection fittings. Four linked tables ride on the same facility id:

TableRowsWhat it holds
tanks~49,900a tank or compartment: status, substance, capacity (gal), construction, piping, spill/overfill fittings, install date, GPS
contacts~51,700the named parties by role - Owner, Registrant, Operator, Class A/B Operator, Property Owner - each with their own address and phone
compliance~29,000inspection findings: the violation, its description, how it was resolved, and the red-tag / NOV flags
enforcement~8,900DEEP enforcement actions: field NOV, warning letter, red tag order, consent order, referral to the AG, with status and resolution

Modes

  • tanks (default) - tank rows
  • contacts - the responsible parties
  • compliance - findings and violation text
  • enforcement - state enforcement actions
  • facility - everything above for one facility id, in one response
  • aggregate - counts by status, substance, method, enforcement type, city

A facility query is the whole point: hand it a facility id and you get that site's tanks, its contacts, its inspection history and its enforcement record together.

Example inputs

One facility's whole record - mode=facility returns the site's tanks, its contacts, its inspection findings and its enforcement actions together.

{ "mode": "facility", "facilityId": "64-51055", "maxResults": 200 }

Gasoline tanks in Hartford

{ "mode": "tanks", "city": "HARTFORD", "substance": "Gasoline", "maxResults": 50 }

DEEP actions still open

{ "mode": "enforcement", "enforcementStatus": "Active", "maxResults": 50 }

Tank counts by status - one row per tankStatus.

{ "mode": "aggregate", "corpus": "tanks", "groupBy": "tankStatus" }

Why this is hard

The four tables do not agree on anything. The enforcement table names the facility key relatedfacilityid while the other three call it agencyfacilityid, and ~690 enforcement rows carry no facility id at all. tanklastuseddt mixes real dates with one impossible value in 2086 - and ~12,900 tanks have no last-used date at all, because a tank still in use has never been emptied. Treating "no date" the same as "bad date" silently deletes a quarter of the register. Every one of those is handled here, and the row semantics (a facility is a parent - one site holds many tanks) are preserved rather than flattened away.

Example output

One tank - mode=tanks, facilityId=64-51055 returns the site's tanks, including this one:

{
"platform": "ct-ust",
"source": "ct-deep-tanks",
"corpus": "tanks",
"recordKind": "tank",
"mode": "tanks",
"groupKey": "",
"groupCount": "",
"groupBy": "",
"facilityId": "64-51055",
"facilityName": "ValCo Fuels",
"facilityAddress": "84 AIRPORT RD",
"facilityCity": "HARTFORD",
"facilityZip": "06114",
"tankId": "B",
"tankStatus": "Currently In Use",
"compartment": "b",
"capacityGallons": "4000",
"substance": "Gasoline",
"tankLastUsed": "",
"closureType": "",
"tankConstruction": "Fiberglass Reinforced Plastic",
"tankMods": "Double Walled (brine or pressure/vac monitor)",
"pipeConstruction": "Rigid Fiberglass Reinforced Plastic",
"pipeMods": "Containment Sumps @ Dispensers,Containment Sumps @ Tanks,Double Walled",
"installationDate": "2026-08-01",
"spillInstalled": "Spill Bucket",
"overfillInstalled": "Audible Alarm",
"latitude": "41.738312",
"longitude": "-72.667543",
"affiliationType": "",
"contactLastName": "",
"contactFirstName": "",
"contactAddress1": "",
"contactAddress2": "",
"contactCity": "",
"contactState": "",
"contactZip": "",
"contactPhone": "",
"contactExt": "",
"contactName": "",
"inspectionDate": "",
"complianceDate": "",
"complianceMethod": "",
"complianceNotes": "",
"violationName": "",
"violationDescription": "",
"inFnovOrWarning": "",
"inRedTag": "",
"fieldNovId": "",
"warningLetterId": "",
"facilityState": "",
"enforcementId": "",
"enforcementType": "",
"enforcementStatus": "",
"actionStart": "",
"actionEnd": "",
"resolution": "",
"violationCount": "",
"clientType": "",
"clientLastName": "",
"clientFirstName": "",
"clientAddress": "",
"clientCity": "",
"clientState": "",
"clientZip": "",
"sourceUpdatedAt": "2026-09-22"
}

Output

Every record carries the same key set regardless of which table it came from, so a cross-table read is one schema. Dates arrive as YYYY-MM-DD.

Notes

  • Public open data from data.ct.gov. No login, no scraping, no rate-limit games.
  • Connecticut DEEP publishes this data for exactly this purpose - the register is how the state tells the public which tanks are where.
  • Charges are metered per record delivered, so a targeted query costs a fraction of a cent.