To drill a well in Texas you file a Form W-1, Application for Permit to Drill, Recomplete or Re-enter. The RRC reviews it and, if it is in order, issues a permit. The permit files are the public record of that process, and because they are published nightly they are the closest thing to real-time data the Commission offers.
They are also the most over-interpreted dataset in the collection. A permit is a statement of intent by an operator. It is not a well, not a rig, and not a production forecast.
Three files, one dataset
The RRC publishes permit data in overlapping extracts:
- Drilling Permit Master — monthly, the base file.
- Master and Trailer, end-of-month — the same records plus trailer records carrying latitudes and longitudes.
- Master and Trailer, daily — the nightly file. This is what you want for current activity.
- Permits pending approval — applications that have been filed but not yet
approved, refreshed twice daily. Different format:
}-delimited with a header row. - Horizontal drilling permits — a fixed-width extract of horizontal permits with field assignment detail.
The daily and monthly files share a layout, documented in the RRC's OGA049 and OGA049M manuals. The daily file is a rolling extract, not a delta: reload it rather than trying to compute changes from it, and key on the status number plus sequence number, which together are unique.
The lifecycle, in dates
A permit record is mostly a row of dates, and reading them in order tells the story:
| Field | Meaning |
|---|---|
received_date |
The application arrived. |
issue_date |
The permit was granted. |
amended_date |
An amendment was filed. |
extended_date |
The permit's life was extended. |
spud_date |
Drilling began. |
surface_casing_date |
Surface casing was set. |
expired_date |
The permit lapsed unused. |
cancelled_date |
The permit was cancelled. |
Alongside them sit a well status code with its own date, a cancellation reason, and a set of flags: cancelled, spudded, directional, sidetrack, horizontal or vertical, duplicate permit, Rule 37 granted.
The important reads:
- A permit with an issue date and no spud date has not been drilled. Permits are valid for a limited period and a substantial fraction expire unused. If you count permits as wells, you overcount.
expired_dateandcancelled_dateare the two ways a permit dies. Expiry is passive; cancellation is an action, and the cancellation reason field sometimes explains it.- Amendments generate additional rows. A well whose target depth changed can produce several permit records. Counting rows counts filings, not wells.
Application types
The application type is a two-digit code and it matters, because "permit" covers several different physical acts. The full set:
| Code | Meaning |
|---|---|
01 |
Drill |
02 |
Deepen below casing |
03 |
Deepen within casing |
04 |
Plug back |
05 |
Other |
06 |
Amended drill |
07 |
Re-enter |
08 |
Sidetrack |
09 |
Field transfer |
10 |
Amended prior to 1977 |
11 |
Drill, directional sidetrack |
12 |
Drill horizontal |
13 |
Sidetrack horizontal |
14 |
Recompletion |
15 |
Reclass |
Only some of these represent a new hole. A field transfer moves an existing well between fields on paper and involves no drilling at all. A recompletion opens a new interval in an existing bore. A plug-back shortens one. If your question is "how many new wells are planned", you want the drilling types and not the administrative ones.
The permit also carries a well code — a single character describing the intended purpose of the well. Beyond the obvious oil, gas and oil-and-gas values, it distinguishes injection wells (salt water, water, gas, air, steam, fluid), storage wells, observation and monitoring wells, core and stratigraphic tests, water supply wells, relief wells, and several non-hydrocarbon categories including sulphur, uranium and coal. Texas well permits are not all oil and gas wells, and a count that ignores the well code includes a lot of things that will never produce.
EZRRC publishes both code sets as lookup tables, so an export can carry
application_type and application_type_label side by side.
The coordinate trailer records
The master-and-trailer files append coordinate records to the permit record.
Record type 14 carries the surface location and record type 15 carries the
bottomhole location. For a horizontal well these are hundreds or thousands of
metres apart, and which one you plot changes the map materially.
These records are also a good lesson in why you should never hard-code a byte offset when a pattern will do. The RRC changed the trailer layout in 2026: it had been fixed-width and right-justified, and it became separator-delimited with shifted columns.
old: 14-102.2862254 32.2604028
new: 14: -102.3118109 32.3389766
A fixed-slice parser did not fail on the new layout. It silently produced unparseable fragments, and every coordinate loaded after the change came back null. The fix is to extract the numbers rather than the positions:
_GPS_NUM_RE = re.compile(r'-?\d+\.\d+')
def processGpsRecord(line, lon_field, lat_field):
"""Parse a '14'/'15' GPS trailer record, tolerant of either RRC layout."""
record = {lon_field: None, lat_field: None}
nums = _GPS_NUM_RE.findall(line[2:])
if len(nums) >= 2:
record[lon_field] = float(nums[0])
record[lat_field] = float(nums[1])
return record
Note the ordering: longitude comes first in both layouts. That is the opposite of the convention most mapping libraries assume for a "lat, lon" pair, and it is an easy way to end up with every Texas well plotted in the Indian Ocean.
What else is on the record
The permit is a rich record beyond dates and types. It carries the operator's P-5 number, the lease name, the well number, district and county, proposed total depth, the target field number, and a full surface location description in the Texas survey system: section, block, survey name, abstract number, acreage, distance and direction from the nearest town, and distances from two lease lines and two survey lines.
That survey description is how Texas locates things without coordinates, and for older permits it is the only location you get. It is also free text with inconsistent abbreviations, so it is useful for reading and poor for joining.
There are regulatory flags too: Rule 37 (spacing exception) case number, Rule 38 (density) docket number, substandard acreage, and the P-12 pooling authority filing flag. A Rule 37 case number on a permit means the operator needed an exception to the spacing rules — which is itself a signal about how crowded the acreage is.
What a permit does not tell you
- That a well was drilled. Only a spud date, a completion report or a wellbore record tells you that.
- That a well will produce. Permits carry no production forecast, and the proposed total depth is a plan.
- The final well design. Everything on the permit is an application. The completion report records what was actually built, and it frequently differs.
- The current operator. The permit records who applied. Wells change hands.
- A one-to-one mapping to wells. Amendments, re-entries and recompletions all create permits against existing bores.
The permit's API number field is the bridge to reality, and it is not always populated — a permit can exist before an API number is assigned. The upstream parser returns nothing rather than guessing when the field is not exactly eight characters, which is the right call.
Using permits well
Permits are genuinely excellent for a few things. They are the earliest public signal of activity, they carry intended target field and depth, and they are nightly. Good questions to ask of them:
-- New horizontal drilling permits issued in a district, this quarter
SELECT p.issue_date, p.lease_name, p.total_depth, o.name AS operator
FROM texas.permits p
JOIN texas.operators o ON o.id = p.operator_no::int
WHERE p.district = '08'
AND p.application_type = 'DRILL-HORIZONTAL'
AND p.issue_date >= DATE '2026-04-01'
ORDER BY p.issue_date DESC;
Then verify against the wellbore and completion data before drawing conclusions about what got built. That is the subject of the next article.