well_production
Monthly production volumes for every well, one row per well per month. The series is complete and continuous from first production to the well's reporting frontier: alongside volumes exactly as reported, it includes reliably-inferred rows (interior gap fills, lease-to-well allocations, period-to-month splits), each labeled in record_origin so you can always filter to the raw reported subset. Volumes are monthly totals; per-day rates, cumulatives, and month counts are intentionally not stored. They derive from this table in one SQL expression (see the derived-fields section). Operator columns carry who filed each record, exactly as the source reported it, plus the operator we attribute where the source filed none; the owner at any date is computed from our merger history at read time, so an ownership correction reaches every month without a rewrite.
Access tier: portal
Portal. These rows are well-level or producing-unit-level data, or our modelled output at cohort or grid grain. They open with a Portal, Pro or Enterprise plan. The website shows aggregates built from them, never the rows.
Primary key: well_id, date
Region codes: ab, ak, al, ar, argentina, bc, brazil, ca, co, gom, ks, la, mb, mexico, mi, ms, mt, nd, nm, oh, ok, pa, pacific, sk, tx, ut, wv, wy
Columns
| Column | Type | Nullable | Description |
|---|---|---|---|
well_id |
string | no | Globally unique well identifier (opaque string), the join key to the well register and every other well-grain table. Stable across time; never parse substrings out of it. |
date |
date | no | Production month, always the first day of the month (a 2026-03 row is dated 2026-03-01). Together with well_id this is the primary key. |
year |
int16 | no | Calendar year of the production month (equals the year of date). Provided for fast year-level filtering and partition pruning. |
oil_per_month |
int32 | no | Oil produced during the month, in barrels (BBL). Includes condensate. Never NULL: a reported zero, a reliably-inferred zero, and a placeholder zero all appear as 0, with record_origin telling you which (see source_corrupt for placeholder zeros where the source's stored figures were discarded as corrupt, and source_redacted for placeholder zeros where the source withheld this stream's figure). NGLs are excluded. |
gas_per_month |
int32 | no | Natural gas produced during the month, in thousand cubic feet (MCF). Hydrocarbon gas only: non-hydrocarbon volumes a source books in its gas column (carbon dioxide, helium, nitrogen) are excluded. Gross wellhead gas; see the disposition table for how gas was used or sold. Never NULL. |
water_per_month |
int32 | yes | Water produced during the month, in barrels (BBL). NULL where the source does not report well-level water (e.g. TX, OK): NULL means "not reported", never zero. |
producing_days |
int16 | yes | Number of days the well actually produced during the month, as reported. NULL where the source does not report it, and where a reported count was refused as outside the 0-31 range a month can hold; in Pennsylvania and Ohio a spread filing's zero-day months that still carry volume are NULL as well. Note: per-day rates in our serving layers divide by calendar days, not producing days, so rates stay comparable across sources. |
reported_operator |
string | yes | The operator exactly as the official source records it for this month, normalized to a canonical display name but with NO merger succession applied: the faithful source record. The owner at any later date, mergers and acquisitions applied, is computed from this identity at read time rather than stored per row. NULL wherever the source gives us no operator we can present as a company for that month: it may publish nothing at all, only a placeholder for an unknown or orphaned operator (a state plugging fund, an "unknown operator" literal), a name our own mapping resolves to such a bucket record, or only a contract or licence identifier we have not yet mapped to its operator. |
reported_operator_id |
string | yes | Stable company identifier for reported_operator (no merger succession). Join key to the organizations register; our merger history applied to this id gives the owner at any date. Populated wherever the published record maps to a registered organization, including the bucket records that stand in for operators the source leaves unidentified; on those rows reported_operator is NULL, because a bucket is not a company name. NULL where the source publishes no operator at all, or where a usable published name is not yet mapped to a registered organization, so a NULL id beside a populated reported_operator_entity means an unmapped name, not a missing operator. |
reported_operator_entity |
string | yes | Raw reporting entity name from the source (e.g. "EOG New Mexico"), before any normalization or company resolution. No merger succession is applied: this is the source's own string, not our corrected view of who owns the well today. NULL where the source names no real company: regulator placeholder strings ("historic owner", "not assigned") are treated as no operator rather than published as one. Also empty on months we filled in ourselves (record_origin = gap_filled): the source reported nothing for that month. Useful for audit and M&A analysis. |
reported_operator_registration_id |
string | yes | The official source's operator ID at the time of production (TX P-5 number, ND operator number, etc.). Where the source filing carries one, it is passed through raw as an opaque string. Where the source issues licence IDs but never prints them on production records (currently Kansas), it is our match of the reported operator name to the state's own licensee register: the same ID namespace, derived by us rather than filed. NULL otherwise. |
attributed_operator_id |
string | yes | Stable company identifier for the operator we attribute to this month where the source filed none: on filled-in months (record_origin = gap_filled) it is carried from the well's adjacent filings, and in regions whose source names no operator it comes from our own curation. No merger succession is applied; the owner at any date is computed from this id at read time, exactly as for reported_operator_id. Never populated where the filing itself names an operator (see the reported columns); NULL when we have nothing reliable to attribute. |
record_origin |
string | no | How this row was derived: the provenance flag. Values: reported (as filed with the source), gap_filled (a reliably-inferred zero inside a well's reporting history), lease_allocated (lease-level volume allocated to wells), period_allocated (multi-month filing split to months), reconciled (adjusted to match an official published total), wellstar_estimated (California's own preliminary-estimate flag), source_corrupt (placeholder zeros for filed figures we discarded as corrupt), source_redacted (the source filed the month and withheld one stream's production figure; that stream carries a placeholder zero), identity_inferred (the source filed the volume without naming the well; the well shown is our attribution on a measured one-well ground). Filter record_origin = 'reported' for the raw source view, noting that inside a declared discard window (see source_corrupt) the discarded stream's figures are placeholder zeros on every origin, reported rows included.
Values: reported · gap_filled · lease_allocated · period_allocated · reconciled · wellstar_estimated · source_corrupt · source_redacted · identity_inferred. |
Region-specific columns
Extra columns a single region's source adds.
ab (1 column)
| Column | Type | Description |
|---|---|---|
operator_method |
string | How this month's operator was determined: petrinex_per_row = the regulator reported the operator for this month; petrinex_chain = carried between dated regulator reports; static_earliest_petrinex = the earliest reported operator stamped backward over older months; static_current_operator = the well's current operator applied to the whole history. The two static values mean the operator shown for an old month can be a later company. |
nd (1 column)
| Column | Type | Description |
|---|---|---|
operator_method |
string | How this month's operator was determined: ndic_monthly_report = NDIC's monthly production report names this month's operator; static_current_operator = the well's current operator, filled into a month that report does not cover (every month before 2003, and the report's gaps). |
Derived fields you can compute
| Field | Formula | Description |
|---|---|---|
oil_per_day |
oil_per_month / date_part('day', last_day(date)) |
Average oil rate for the month in BBL/d, using calendar days (not producing days) so rates are comparable across sources and wells. |
gas_per_day |
gas_per_month / date_part('day', last_day(date)) |
Average gas rate for the month in MCF/d, calendar-day basis. |
water_per_day |
water_per_month / date_part('day', last_day(date)) |
Average water rate for the month in BBL/d, calendar-day basis. NULL where water_per_month is NULL. |
oil_cum |
SUM(oil_per_month) OVER (PARTITION BY well_id ORDER BY date) |
Cumulative oil (BBL) from first production through this month. |
gas_cum |
SUM(gas_per_month) OVER (PARTITION BY well_id ORDER BY date) |
Cumulative gas (MCF) from first production through this month. |
water_cum |
SUM(water_per_month) OVER (PARTITION BY well_id ORDER BY date) |
Cumulative water (BBL) from first production through this month. |
months_on_production |
CASE WHEN date >= MIN(CASE WHEN oil_per_month > 0 OR gas_per_month > 0 THEN date END) OVER (PARTITION BY well_id) THEN 1 + datediff('month', MIN(CASE WHEN oil_per_month > 0 OR gas_per_month > 0 THEN date END) OVER (PARTITION BY well_id), date) END |
Calendar months elapsed since the well's first month with any oil or gas (that month = 1), counting idle months. NULL before first production. The x-axis for type-curve and decline analysis. |
producing_months |
SUM(CASE WHEN oil_per_month > 0 OR gas_per_month > 0 THEN 1 ELSE 0 END) OVER (PARTITION BY well_id ORDER BY date) |
Running count of months with actual production (oil or gas above zero): unlike months_on_production, idle months don't advance it. |
How these numbers are built is on methodology; the machine twin of this page is data-dictionary.json.