If you searched for "texas oil production data by county download", here is what you are actually looking for. The Railroad Commission's production release is the Production Data Query dump — PDQ — a single 3.6 GB archive of sixteen delimited tables, cut on the last Saturday of every month, covering every lease in Texas since 1993. EZRRC publishes each of those sixteen tables on its own, filterable, so you can take one county for one year as a small CSV instead of thirty gigabytes of everything.
The trick is choosing the right table. Production is reported at several grains and each has its own table; pick the one that matches your question and the download is small and the numbers agree with the Commission's own. Pick the wrong one and you will either wait for 76 million rows or double count.
Which table answers which question
| You want | Take | Size |
|---|---|---|
| Statewide, or one district, month by month | District production by cycle | Small |
| One county's gas, month by month | County production by cycle | Small |
| One county's oil, month by month | County lease production by cycle, filtered to the county and summed — or the county pages, which do that for you | 64 million rows before filtering |
| One operator's output | Operator production by cycle | 3.4 million rows |
| One field's output | Field production by cycle | Small |
| One lease, or the raw material for anything else | Lease production by cycle | 76 million rows, about 31 GB |
| Where the product went — sold, flared, injected | Lease disposition by cycle | 17 million rows |
| Field totals by year, not month | Oil annual report field table | Tiny |
Every cycle table carries the same four volume families — oil and condensate in
barrels, gas and casinghead gas in MCF — but not the same columns around them.
The lease, county-lease and county tables carry the regulatory ceiling beside
each volume (an allowable for oil and gas, a limit for condensate and casinghead
gas), the ending balance for oil and condensate, and a total-disposition column
per product. The district, operator and field roll-ups carry the four volumes
and nothing else, and the disposition table carries volumes by disposition code
only. If your question is about an allowable, start at the lease grain or the
county grain, not the district. A "cycle" is a production month, and the
cycle_year_month column carries it as a YYYYMM string, which is the cheapest
thing to filter on: cycle_year_month from 202401 to 202512 is a two-year
window in one filter.
The whole archive is there too, as the Production Data Query dump, served exactly as the Commission released it. Take it if you are loading a warehouse of your own. Extracting it needs about 30 GB of free disk, which is the reason the tables are published separately.
Production by county
Two tables have "county" in the name, and they are not interchangeable. County production by cycle is the Commission's own roll-up, one row per county per month per schedule, and its gas schedule is complete: it sums, month for month, to the same statewide MCF as the district table. Its oil schedule is not. As loaded, oil rows exist for only about 116 counties and add up to roughly four percent of the oil the district table reports for the same months, and Midland, Martin, Reeves, Loving, Karnes and Upton — the counties that produce most of the state's oil — carry zero since 2021. Take it for county gas. Do not take it for county oil.
For county oil the complete source is county lease production by cycle: 64 million rows of lease-month production allocated to counties, which exists because a Texas lease can straddle a county line and the Commission apportions its production. Filter it to a county and sum it, and you get totals that are right for multi-county leases, which a naive lease-to-county join is not.
Filter it on county, which takes the three-digit Texas county code — the same
number as the county's FIPS code, so Midland is 329 and Harris is 201. The
county code set lists all 277 codes, including the 23
offshore and bay areas that are not counties. Add an oil_gas_code of O for
the oil schedule or G for the gas schedule, a cycle range, and press add. Or
skip the form: /data/pdq-county-lease-cycle/?county=329
arrives with the county already filled in.
If you want to look before you download, /production/county/midland/
charts sixty months of oil, gas, condensate and casinghead gas for the county,
links to the county's permits, and ends in a download button for the slice it
is showing. There is one for every county, and the numbers on them are computed
from the county-lease table — the same sum described above, done for you — so
the oil there is the county's oil, not the county-cycle table's slice of it.
Production by district and statewide
District totals are the grain the Commission's own published statistics use, and
the district cycle table is small enough to take
whole. One trap: district_no in every PDQ table is RRC's internal district
number, not the designation printed on a permit. Internal 10 is District 08,
11 is 8A, 07 is 6E; there is no 12. The filter takes the internal number
and its code set maps each one to the printed
name, so a wrong reading is at least a visible one. The complete district
list has both numberings side by side.
For a look first: the production hub shows the latest cycle
statewide by district and a two-year trend; /production/2026-06/
is one cycle by district with the top twenty-five counties; and
/production/district/08/ — the URL uses the printed
code — is sixty months for the Midland district. In a typical recent month
District 08 alone reports more oil than the other twelve districts combined,
which is why so many of these questions turn out to be questions about it.
Production by lease and by operator
Oil is reported per lease and gas per gas well, and the lease table is where both live: one row per lease per month with the volumes, the allowable, the ending balance and the operator, field and lease names denormalised onto the row. It is also 76 million rows, so filter before you export — an operator number, a field, a district or a cycle range all cut it to something workable, and the cart shows an estimated row count and size before anything is built.
The lease key is three columns, not one: oil_gas_code, district and
lease_no together. Oil lease 027587 in District 08 and gas lease 027587 in
District 08 are different leases, and so is oil lease 027587 in District 09. A
download filtered on lease_no alone will hand you every one of them. To turn a
lease number into a name, an operator and a field, the regulatory lease
directory is the lookup — 547,000 leases,
with the severance flag that says whether the Commission has cut off a lease's
right to sell.
Operator totals have their own table, one row per P-5 operator per month, and it is the one to rank companies with. Its filters are the operator number and name and the cycle. The operator is whoever reported the production that month, so an acquisition shows up as one operator's volume stopping and another's starting with nothing linking the two; the operator number, never the name, is what you match on (operators and P-5 numbers explains why).
Four traps, in the order they will bite
The last two months always lie. Operators file monthly, the Commission accepts amended reports for a long time afterwards, and each release is a snapshot of that moving system. The newest cycle is missing reports that have not arrived; the one before is missing amendments; volumes for a recent cycle only ever go up. A chart that runs to the edge of the data always shows a cliff and the cliff is an artefact. The cycle date range table tells you the newest cycle in the release and the dates the oil and gas data were extracted; read it, then drop or flag the newest two or three months.
Total oil is oil plus condensate; total gas is gas plus casinghead gas. A sum of the oil column alone is crude only, and in the Permian and Eagle Ford the condensate you left out is a large number.
Allowables and ending balances are not production. The allowable is the regulatory ceiling for the month; the ending balance is oil in tanks. Both sit next to the production column and both get summed by accident.
Missing is not zero. A lease with no filed report for a cycle is a lease you
know nothing about that month, and the lease table's prod_report_filed_flag
tells you which is which.
The longer treatment of all of this — cycles, lag, the four products, the disposition codes — is production data explained. This article is the how; that one is the why.
From a script
The same tables, the same filter names, over HTTP. A county-year of lease production, newest first:
curl -G -H "Authorization: Bearer $EZRRC_API_KEY" \
"https://ezrrc.com/api/v1/datasets/pdq-county-lease-cycle/rows/" \
--data-urlencode "county=329" \
--data-urlencode "oil_gas_code=O" \
--data-urlencode "cycle_year_month=202501" \
--data-urlencode "select=lease_no,lease_name,operator_name,cnty_lse_oil_prod_vol,cnty_lse_csgd_prod_vol" \
--data-urlencode "order=-cnty_lse_oil_prod_vol" \
--data-urlencode "limit=500"
Anything larger than a page of rows should be an export rather than a loop over cursors, and the export takes the same filters. Using the EZRRC API covers the rest.
When you do not need monthly data at all
If the question is "how much did this field produce last year", the annual oil and gas field tables answer it directly: one row per field per year with well counts, discovery date, gravity and annual volumes. They are tiny, already aggregated the way most field-level questions want, and they agree with the monthly data. Reach for them first and drop to the cycle tables only when you need the monthly shape.
Next: joining RRC datasets — putting production back together with the wells, operators and fields it belongs to.