API access
Your AI client reaches CalGEM California Oil & Gas Wells through one ParcelOps MCP endpoint, so there is no separate key to hold for it and no per-source client to write. Reaching it takes no credentials of your own.
Where it came from
Freshness and coverage
What this source cannot tell you
- ⚠ Anything outside California. A request past that edge comes back empty rather than approximated.
- ⚠ Which years it spans, because the covered period is not declared.
- ⚠ Anything CalGEM WellSTAR (Well Statewide Tracking and Reporting System) does not publish. ParcelOps returns this source as it stands and never fills a blank field from a different one.
- ⚠ CalGEM well locations are permit-time surface locations (GISSource is frequently "Notice of Intent to Drill"), not as-drilled surveys, and a directionally drilled well's bottomhole is elsewhere. This connector answers "how many wells are within N meters of this point", never "is there a well on this parcel".
- ⚠ CalGEM states its well data varies in accuracy, scale, origin, and completeness, may be updated, amended, or deleted at any time without notice, and carries no warranty of fitness. This is not a title, survey, environmental clearance, or regulatory determination.
- ⚠ HPZ (SB 1137 health protection zone) is reported only as the per-well inHPZ attribute of NEARBY WELLS, never as a property of the parcel. The Health_Protection_Zones polygon layer is deliberately never queried: its dissolved multipart polygons return confident wrong answers, including "Verified HPZ" over Death Valley and a single feature covering San Francisco that spans a third of the state.
- ⚠ No production or injection volumes, no permit pipeline, no well-record documents. CalGEM serves those only as file-request downloads (SQL .BAK backups and PDFs), and the WellSTAR public search is a session UI with no JSON surface. A "how much did this well produce" question cannot be answered here.
- ⚠ Orphan-well answers carry a vintage because CalGEM republishes that screening list as a NEW service on a separate ArcGIS Online host every quarter, with counts that move sharply between vintages (5,295 in 2024, 946 in 2025, 932 in 2026 Q1, 1,048 in 2026 Q2). A stale URL is not obviously stale, so the count is never reported without its vintage.
- ⚠ Geothermal wells are excluded from v1. They live on a separate layer of the same service with an incompatible schema (APINumber, Lat83/Long83), and mapping them as if they were oil-and-gas wells would silently mis-field every record.
- ⚠ Absence of a mapped well is not evidence of clear ground: pre-regulation, undocumented, and non-CalGEM-jurisdiction wells are not in this layer.
Methods (5)
A method is one call your agent can make against this source.
searchWellsNearPoint
readList CalGEM wells within a radius of a point, nearest first, with status and operator filters.
What you must providelatitudelongitudeRecords returnedwellHow to get more resultsnone (limitField: limit)UnitsradiusMeters: m · distanceMeters: mCoordinate systemEPSG:4326FreshnessScheduled · every day (source-level)Input schema
{ "type": "object", "properties": { "latitude": { "type": "number", "minimum": -90, "maximum": 90, "description": "WGS84 latitude of the parcel or site." }, "longitude": { "type": "number", "minimum": -180, "maximum": 180, "description": "WGS84 longitude of the parcel or site." }, "radiusMeters": { "type": "integer", "minimum": 1, "maximum": 8000, "default": 1000, "description": "Search radius in METERS, passed to CalGEM verbatim. Defaults to 1000." }, "wellStatus": { "type": "string", "enum": [ "Plugged", "Active", "Idle", "Canceled", "New", "PluggedOnly", "Unknown", "NotCalGEMJurisdiction" ] }, "wellType": { "type": "string", "maxLength": 32, "description": "Well-type code or label, e.g. OG or \"Oil & Gas\". 24 pairs; see getServiceInfo." }, "operatorName": { "type": "string", "maxLength": 120, "description": "Operator-name substring. A filter within a spatial scope, not a search axis." }, "limit": { "type": "integer", "minimum": 1, "maximum": 200, "default": 50 }, "format": { "type": "string", "enum": [ "records", "geojson" ], "description": "geojson returns GeoJSON Features in records for map rendering." } }, "required": [ "latitude", "longitude" ], "additionalProperties": false }- ⚠ summary.matchedRecords is the exact match count from a server-side count query; records are capped at limit and sorted nearest first.
- ⚠ Above 2000 matches the nearest set is ranked over the first 2000 by OBJECTID and says so in caveats.
Radius is meters. Use getParcelWellRisk when counts matter more than records.
getParcelWellRisk
readRoll up wells near a point: counts by status and type, nearest well, orphan and field flags.
What you must providelatitudelongitudeRecords returnedwell, oil-field-boundary, gas-storage-projectHow to get more resultsnoneUnitsradiusMeters: m · distanceMeters: mCoordinate systemEPSG:4326FreshnessScheduled · every day (source-level)Input schema
{ "type": "object", "properties": { "latitude": { "type": "number", "minimum": -90, "maximum": 90, "description": "WGS84 latitude of the parcel or site." }, "longitude": { "type": "number", "minimum": -180, "maximum": 180, "description": "WGS84 longitude of the parcel or site." }, "radiusMeters": { "type": "integer", "minimum": 1, "maximum": 8000, "default": 1000, "description": "Search radius in METERS, passed to CalGEM verbatim. Defaults to 1000." } }, "required": [ "latitude", "longitude" ], "additionalProperties": false }- ⚠ The rollup is one record, returned as records[0], not a bag of top-level fields.
- ⚠ constructionSiteReviewLikely is an issue-spotting flag based on Public Resources Code section 3208.1, never a determination.
- ⚠ orphanWellCount is null, not zero, when the quarterly orphan service is unreachable.
- ⚠ hpzWellCounts describes the nearby WELLS, not the parcel.
Small payload; prefer for dossier. Match radiusMeters to searchWellsNearPoint.
searchOrphanWells
readList CalGEM orphan-well screening records near a point, in a county, or by API. Vintage-stamped.
Records returnedorphan-wellHow to get more resultsnone (limitField: limit)UnitsradiusMeters: m · distanceMeters: mCoordinate systemEPSG:4326FreshnessScheduled · every day (source-level)Input schema
{ "type": "object", "properties": { "latitude": { "type": "number", "minimum": -90, "maximum": 90, "description": "WGS84 latitude of the parcel or site." }, "longitude": { "type": "number", "minimum": -180, "maximum": 180, "description": "WGS84 longitude of the parcel or site." }, "radiusMeters": { "type": "integer", "minimum": 1, "maximum": 16000, "default": 5000, "description": "Search radius in METERS. Only valid with latitude and longitude." }, "county": { "type": "string", "maxLength": 60, "description": "California county name." }, "operatorName": { "type": "string", "maxLength": 120, "description": "Operator-name substring. A filter within a spatial scope, not a search axis." }, "api": { "type": "string", "pattern": "^\\d{8,14}$", "description": "CalGEM API number, digits only — e.g. 0403730295." }, "limit": { "type": "integer", "minimum": 1, "maximum": 200, "default": 50 } }, "required": [], "additionalProperties": false }- ⚠ The upstream service is republished under a new name every quarter on a separate host; every answer carries vintage and sourceUrl beside the envelope.
- ⚠ This is a prioritized screening list, not the full population of idle or deserted wells.
Needs a scope: latitude+longitude, county, or api. Vintage is always echoed.
getWellByApi
readLook up one CalGEM well by its API number and return the full WellSTAR record.
What you must provideapiRecords returnedwellHow to get more resultsnoneCoordinate systemEPSG:4326FreshnessScheduled · every day (source-level)Input schema
{ "type": "object", "properties": { "api": { "type": "string", "pattern": "^\\d{8,14}$", "description": "CalGEM API number, digits only — e.g. 0403730295." } }, "required": [ "api" ], "additionalProperties": false }- ⚠ Oil-and-gas wells only. Geothermal wells use a different layer and identifier (APINumber).
getServiceInfo
readLayer inventory, record counts, well status and type enums, license, and what CalGEM does not serve.
FreshnessScheduled · every day (source-level)Input schema
{ "type": "object", "properties": { "service": { "type": "string", "enum": [ "wells", "fieldBoundaries", "ugsProjectBoundaries", "orphanWells" ] } }, "required": [], "additionalProperties": false }Read this before guessing a wellStatus or wellType code.
Where this source is used
- Land research
Parcel records, ground conditions, and what reaches the property line, for raw and rural land.
- Data center siting
Power, water, transport, airspace, and hazard screening for a site before anyone signs anything.
- Commercial real estate
Parcel and assessment records, building programs, and the entity on the other side of the deal.
- Residential real estate
The parcel record, the housing programs that touch an address, and the conditions a buyer asks about.
- Real estate law
Federal rule text, rulemaking dockets, party records, and the property facts a filing has to state.
- Realtors and brokerages
The facts behind a listing, the programs a buyer may qualify for, and your own files in the same place.
- Who do I call before digging?
- Is there a pipeline near this property?
- Are there oil and gas wells near this property?
