Get the data

Pre-filtered: API number is 42-389-42038. Adding this gets you that slice, not the whole dataset — change or clear it at the options step.

Free. You will be asked to confirm an email address before the files are built — that is the only gate, and it is there so we can tell you when a large export is ready.

Preview the first 100 rows

What this is

The permit file most people actually want. It is the OGA049M layout: the permit master and its trailers, plus the '14' surface-location and '15' bottomhole-location GPS records that carry latitude and longitude in decimal degrees.

A drilling permit — Form W-1 — is the first public trace of a well. It names the operator, the lease, the field, the intended total depth and the two ends of the hole. EZRRC parses the whole thing into one row per permit with both coordinate pairs on it, so a permit is a point (or a line) without any further work.

What you can do with it

Count permits by operator, county or field for any month since the file begins, and watch the leading indicator everyone in the industry watches — a permit today is a rig in weeks and a completion in months.

Map permitted surface and bottomhole locations, measure lateral length from the two coordinate pairs, and separate horizontal from vertical activity.

Join to the P-5 organization directory on the operator number to see whether the permitting company's own status is active, and to the wellbore database on the API number to find out whether the hole was ever actually drilled.

Gotchas

county_code holds the county NAME, not a numeric code. RRC's own layout calls the field a code and the file contains 'Midland'. This is the single most common way a permit query silently returns nothing.

application_type, application_well_code and horizontal_well_flag are decoded on the way into the warehouse, so they hold RRC's words rather than RRC's codes. 'OIL ' keeps a trailing space from the fixed-width original.

Roughly 3% of permits have no surface coordinate at all. A spatial export silently cannot carry those rows, so EZRRC reports how many were dropped — Midland County is 9,548 permits but only 9,187 points.

A permit is an application, not a well. Many are never drilled, and one wellbore accumulates several over its life.

Record layout

28 columns. Byte positions are 1-based and come from the RRC record layout, so you can check our decoding against the original file yourself.

permits 28 columns

Record layout for permits — 28 columns, with byte positions
# Column Type Bytes RRC name Meaning Lookup
2 received_date date 122-129 Date RRC received the application.
3 amended_date date 138-145 Date the permit was amended, if it ever was.
4 issue_date date 130-137 Date RRC issued the permit. This is the date the industry counts.
5 status_no key integer 3-9 RRC's status (permit application) number. With sequence_no it is the primary key of this table.
6 sequence_no key integer 10-11 Sequence within the status number, for amended and re-issued permits.
7 county_code join text 12-14 County name, despite the column name. The pipeline resolves the three-digit code against national.us_county on load and stores the resolved name, so filter on 'MIDLAND', not on '329'. e.g. Reeves
8 api_number join text 503-510 API number formatted 42-CCC-NNNNN. Blank on permits that never got one — an application withdrawn before drilling has no API. e.g. 42-389-36336
9 permit_no join integer 3-9 The permit number, with leading zeros stripped. e.g. 862449
10 operator_no join integer 60-65 The operator's six-digit RRC P-5 organization number. Join to the P-5 Organization dataset for the company's name, address and P-5 status. e.g. 166150
11 operator_name text 67-98 Operator name as carried in this file. Names drift between filings — join on the operator number, never on the name.
12 operator_add1 text 60-65 Operator address line 1, copied in from the P-5 file at load time.
13 operator_add2 text 60-65 Operator address line 2, copied in from the P-5 file at load time.
14 operator_city text 60-65 Operator city, copied in from the P-5 file at load time.
15 operator_state text 60-65 Operator state, copied in from the P-5 file at load time.
16 operator_zip text 60-65 Operator ZIP, copied in from the P-5 file at load time.
17 operator_phone text 60-65 Operator phone, copied in from the P-5 file at load time.
18 lease_name text 15-46 Lease name as filed.
19 well_no text 49-54 Well number within the lease, as the operator designates it.
20 horizontal_well_flag text 494 'Horizontal' or 'Vertical'. Derived from a one-byte Y/N flag on the permit master: only 'Y' means horizontal. e.g. Horizontal
21 application_type text 66-67 What the operator asked to do — drill, deepen, plug back, re-enter and so on. Stored decoded; the RRC codes behind it are in the drilling permit application type code set. e.g. DRILL
22 application_well_code text 11 What the well is for. Stored decoded; the RRC codes behind it are in the permit well code set. Note that oil wells carry a trailing space. e.g. OIL
23 surface_latitude numeric measured in deg Surface hole latitude, WGS84 decimal degrees, from the '14' GPS trailer record. Null on permits filed before the trailer existed. e.g. 31.4021874
24 surface_longitude numeric measured in deg Surface hole longitude, WGS84 decimal degrees, from the '14' trailer record. e.g. -103.5112090
25 bottom_latitude numeric measured in deg Bottomhole latitude, WGS84 decimal degrees, from the '15' GPS trailer record. Only populated for directional and horizontal permits.
26 bottom_longitude numeric measured in deg Bottomhole longitude, WGS84 decimal degrees, from the '15' trailer record.
27 total_depth bigint measured in ft 55-59 Total depth the permit authorises, in feet. e.g. 11000
28 field_no join integer 3-10 The eight-digit RRC field number. The field's name is not in most files; join to the field directory to get it. e.g. 41911500
29 field_name text 3-10 Field name.

What this joins to

The Railroad Commission never states these keys anywhere in the files. They are the reason the data is hard to use, so here they are with the exact columns on both sides.

Drilling Permit Master and Trailer — Daily File (with latitudes and longitudes) joins to Full Wellbore Database (ASCII) on API number — many rows here share a single row there.

permitted this wellbore

The join everyone needs and nobody is told about. Both files write the API number dashed as 42-XXX-XXXXX, so they match directly — 5,000 of 5,000 sampled permits found their wellbore. A wellbore can have many permits over its life, so the same API appears on more than one permit.

drilling-permits-daily.api_number = full-wellbore-ascii.api_number

Drilling Permit Master and Trailer — Daily File (with latitudes and longitudes) joins to Drilling Permit Master and Trailer on Status number = Status number and Sequence number = Status sequence — many rows here share a single row there.

is the same application as

The rolling daily permit extract and the complete monthly history are the same W-1 applications written twice, and this is the key they meet on: the status number and its amendment sequence, which the daily file calls sequence_no. Both sides are integers, so the comparison needs nothing done to it. Measured over the WHOLE of texas.permits rather than a sample: 114,493 of its 115,579 rows are in daf802. The 1,086 that are not are permits issued since the monthly tape was cut. Follow it this way for the restrictions, the bottom-hole tracts, the remarks and the pre-2010 history; follow it back for coordinates, which daf802 does not carry at all.

drilling-permits-daily.status_no = drilling-permit-master-and-trailer.status_no AND drilling-permits-daily.sequence_no = drilling-permit-master-and-trailer.status_seq

Drilling Permit Master and Trailer — Daily File (with latitudes and longitudes) joins to P-5 Organization (ASCII) on Operator number = ID — many rows here share a single row there.

permitted by

The six-digit P-5 number on the permit is the operator directory's primary key. Exact on all 5,000 sampled permits. This is what turns an anonymous permit into a company with a status and an address.

drilling-permits-daily.operator_no = p5-organization-ascii.id

Drilling Permit Master and Trailer — Daily File (with latitudes and longitudes) joins to Wellbore Drilling Permit Numbers on Permit number — one row here matches many rows there.

appears on the wellbore as

The wellbore database keeps every permit number issued against a hole. Joining here finds the wellbore even when the API number on the permit is blank or wrong — 4,180 of 5,000 sampled permits are recorded against a wellbore this way. These two columns are different types — one is text, the other an integer — so a direct equality is rejected by Postgres. Cast the text side to integer, which also disposes of any leading zeros; casting the integer to text would not, because '000123' and 123 are not equal as text.

drilling-permits-daily.permit_no = wellbore-drilling-permit-numbers.permit_number

Drilling Permit Master and Trailer — Daily File (with latitudes and longitudes) joins to Completion Information in Data Format on Permit number = Dp number — one row here matches many rows there.

was filed under drilling permit

The permit the completion reports as its authority. The permit file only goes back as far as upstream has loaded it, so older completions will not find their permit here. These two columns are different types — one is text, the other an integer — so a direct equality is rejected by Postgres. Cast the text side to integer, which also disposes of any leading zeros; casting the integer to text would not, because '000123' and 123 are not equal as text.

completion-information-data-format.dp_no = drilling-permits-daily.permit_no

Drilling Permit Master and Trailer — Daily File (with latitudes and longitudes) joins to Full Wellbore Database (ASCII) on Permit number = Newest drl pmt number — one row here matches many rows there.

was last permitted by

The wellbore root record carries only its most recent permit number. 4,822 of 5,000 sampled permits are somebody's newest permit. For the full permit history use the wellbore's drilling permit numbers instead. These two columns are different types — one is text, the other an integer — so a direct equality is rejected by Postgres. Cast the text side to integer, which also disposes of any leading zeros; casting the integer to text would not, because '000123' and 123 are not equal as text.

full-wellbore-ascii.newest_drl_pmt_nbr = drilling-permits-daily.permit_no

Where this comes from

Published by
Texas Railroad Commission — the original page
Original format
Fixed-width Columns are byte ranges with no separators, described only in a scanned record layout.
RRC publishes
Updated every night (Nightly.)
RRC download link
GoAnywhere MFT
Record layout manuals
Our table
texas.permits

EZRRC is an independent mirror of public-domain data published by the Texas Railroad Commission. It is not affiliated with or endorsed by the RRC. For any legal or regulatory purpose, verify against the official RRC release.