If you searched for "texas drilling permits download csv", the short answer is: open the daily permit file, pick CSV or Excel, narrow it to a county or a date range if you want, and add it to your download. The file the Commission actually publishes is a fixed-width extract in a 1970s COBOL layout with the coordinates hanging off the end as separate trailer records; EZRRC parses that nightly into one row per permit, with both coordinate pairs on the row, and hands it back in whatever format you ask for.
The rest of this article is the longer answer: which of the seven permit files you want, how the filters work, what the district and county pages give you that the raw file does not, and the two things that silently make a permit query return nothing.
Which permit file to take
The RRC publishes drilling permit data seven ways, and they overlap. The differences that matter:
| Dataset | What it is | Take it when |
|---|---|---|
| Daily file | Every permit, refreshed nightly, with surface and bottomhole coordinates | You want current activity — this is the one |
| End-of-month file | The same permits, cut once on the last day of the month | A number has to still be the same number next quarter |
| Pending approval | Applications filed but not yet approved, twice a day | You want to see intent before the permit issues |
| Horizontal permits | Every horizontal permit since 1985, 173,511 of them | You need horizontal history before 2010 |
| Permit master | The monthly master record without coordinates | You are reproducing an old extract byte for byte |
| Permit master and trailer | The same monthly master with its per-field trailer records, still without coordinates | A permit names more than one field and you need every one of them |
| W-1 imaged files | Scanned W-1 forms and plats, as PDFs | You need the plat or the operator's remarks |
The daily and end-of-month files share one layout (OGA049M) and are the two that EZRRC parses into a queryable table. The daily file is a rolling extract, not a delta: it is the whole permit history as of last night, so you reload it rather than diffing it. The end-of-month file is the same records frozen on the last day of the month — 105 month-end snapshots reaching back to June 2017 — and because a permit issued on the 30th and amended on the 2nd appears in its pre-amendment state there, the monthly file is what you cite and the daily file is what you watch. When you download the monthly file you name the month you want.
The other five are served as the Commission's original files only: upstream has no parser for them yet, and offering a CSV that answers nothing is worse than saying so. What a permit is and is not — an application, not a well — is covered in the W-1 article; this one is about getting the file.
Downloading the whole state, or a slice of it
Every download on EZRRC goes through the same four steps, and none of them costs anything:
- On the dataset page, choose a format under Get the data and press Add to download. CSV and Excel are the usual choices; TSV, JSON, NDJSON and Parquet are there for pipelines, and because the permit file carries coordinates it can also be built as GeoPackage, GeoJSON, KML, KMZ, Shapefile or FlatGeobuf.
- On the Formats and filters step, narrow the file. Every filter the table supports is listed there, with its allowed operators; a filter you leave blank is not applied. You can also ask for readable labels to be joined in beside every coded column, and for a spatial format to be reprojected.
- Review and build. You will be asked to confirm an email address before the files are built — that is the only gate, and it exists so that a large export can tell you when it is ready.
- Your files are ready. The links are on the order page and in the email.
The filters are the same ones the API accepts, so anything you can build in the browser you can script later. For permits they are:
county— a county name, in the Commission's own capitalisation:Midland, not329. See below for why that matters.issue_dateandreceived_date— withgteandlte, so a date range is two filters on the same column.operator_no(the six-digit P-5 number),operator_name,lease_name,field_no,field_name,permit_noandapi_number(dashed,42-329-XXXXX).application_type— the decoded words rather than the RRC's two-digit code:DRILL,DRILL-HORIZONTAL,RECOMPLETION,FIELD-TRANSFERand the rest of the fifteen application types.horizontal_well_flag(HorizontalorVertical),application_well_code(oil, gas, injection, disposal and the other well codes) andtotal_depth.
A dataset page can also be linked to with a filter already chosen. Open
/data/drilling-permits-daily/?county=Midland
and the county is pre-filled on the add-to-download form, so a page elsewhere
that is about Midland County can hand you the county rather than the state and
an instruction to filter it yourself. That is exactly what the permit pages do.
The permit pages: today, by district, by county, by operator
If you want to look before you download, the permits hub is the place to start. It shows the most recent day of issued permits, a thirty-day table, and the districts, counties and operators with the most activity. From there:
/permits/2026-08-13/— every permit the Commission issued that day, statewide, with previous and next day links./permits/district/08/— District 08, which is the Midland office's Permian Basin counties, over the last thirty days, with ninety days of daily counts. The district codes in the URL are the ones the RRC prints:01to06,6E,7B,7C,08,8A,09,10. Which counties each covers is in the district list./permits/county/midland/— one county over the last ninety days, with two years of monthly counts./permits/operator/<P-5 number>/— an operator's last twenty-four months.
Every one of those pages ends in Download this slice buttons, which take you to the dataset page with the same filters pre-filled. One note on the district pages: the parsed permit table has no district column, so a district slice is really the counties in that district, taken from the Commission's own county directory — which is why a district download arrives as a county filter with several values rather than a district code.
Two ways a permit query silently returns nothing
The county column holds a name, not a code. RRC's own record layout calls
the field a county code and the file contains Midland. Filter on 329 and you
get an empty file with no error, because nothing is wrong except your
expectation. Match on the name, and match on it in the Commission's spelling:
this file writes DeWitt closed up where the county table writes DE WITT, so
asking for De Witt returns nothing rather than the 1,874 permits that exist.
The like operator is there for exactly this.
Roughly three percent of permits have no surface coordinate. A CSV carries those rows fine; a GeoPackage or KML cannot, because a point with no coordinates is not a point. EZRRC drops them from spatial exports and tells you how many — Midland County is 9,548 permits but only 9,187 points. If a map and a spreadsheet of the same slice disagree by a few percent, that is why.
One smaller one: application_well_code keeps a trailing space from the
fixed-width original (OIL has one, GAS does not). The filter is
whitespace-tolerant; your own code may not be.
Doing it from a script
Everything the pages do is available over HTTP. Rows come from the dataset's
rows/ endpoint, filtered by the same names as the browser; anything that is
not a curated filter can be reached as filter.<column>.<op>:
curl -G -H "Authorization: Bearer $EZRRC_API_KEY" \
"https://ezrrc.com/api/v1/datasets/drilling-permits-daily/rows/" \
--data-urlencode "county=Midland" \
--data-urlencode "filter.issue_date.gte=2026-07-01" \
--data-urlencode "select=permit_no,issue_date,operator_name,lease_name,application_type,total_depth" \
--data-urlencode "order=-issue_date" \
--data-urlencode "limit=500"
For a whole file rather than a page of rows, request an export instead and poll it; the format list and the filter names are the same. Using the EZRRC API covers keys, pagination and exports.
After you have the file
The permit joins to everything else on the operator number and the API number.
The daily file gains a few dozen permits on a typical business day, so a
scheduled pull of issue_date since your last run is cheap. Join the operator
number to the P-5 organization file to see
whether the permitting company is in good standing, and the API number to the
wellbore database to find out whether the hole was ever drilled — both recipes
are in joining RRC datasets.
And the standing caveat: a permit is a statement of intent. It is not a rig, not a well, and not production. Counting permits tells you what people are asking to do, which is genuinely useful — as long as you say that is what it is.