Get the data

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

DAF318. 173,511 rows of 354-byte fixed-width records covering every application to drill a horizontal well since 1985, and the only file RRC publishes that carries the VALIDATED block: the field, operator, lease number, lease name and well number the permit was finally matched to once completion papers were reviewed.

That is what this dataset is for. The permit files say what an operator asked to drill; the production files say what a lease produced; nothing else says which permit became which lease. Here the two ends are on one row — permit number, API number and permitted field on the left, oil/gas code, RRC lease or gas well number and validated well number on the right.

It is also the deepest horizontal history on the site. The records run from 1985-07-25 to 2026-06-30 and 40,622 of them predate 2010, where the parsed daily and end-of-month permit tables hold 70 rows before 2010 in total.

What you can do with it

Track horizontal drilling across four decades by operator, county, district or field, over a span the rolling permit tables do not cover.

Bridge a permit to production. The validated lease number joins the PDQ regulatory lease directory: 87,816 of 88,280 oil rows and 52,553 of 52,801 gas rows resolve, which is the join that lets you ask what a given permit actually produced.

Join out on the identifiers this file already carries: every one of the 173,511 rows matches a permit in the master file, a wellbore on the API number, and an operator in the P-5 directory.

Gotchas

One row is NOT one permit. A permit appears once per permitted field crossed with each validated completion, and 2,528 records are byte-identical repeats of the line before: 173,511 records hold 144,600 distinct permit+sequence pairs. The key is (permit_no, sequence_no, row_ordinal), and row_ordinal is ours — the file has no such column, the rows of a group are simply contiguous. Count distinct permits, not rows.

The validated block is not cleared between records. On 32,429 rows RRC's own program left the previous permit's operator, lease and well in the block while naming no validated field and reporting a validated-field count of zero. Those six columns are nulled here and validated_carryover is true, so the table can still be audited against the file line by line. Filter validated_carryover to false for real validations only. The 5,492 rows that name a validated field but carry no date keep their block: it is the date that is missing there, not the validation.

The file's DISTRICT is the mainframe subscript, 01-14, never 6E/7B/7C/8A. It is decoded into `district` (the printed code every other table here uses) with the raw value kept in district_subscript. Under subscript 13 the counties are Wichita, Young, Archer and Jack — District 09.

validated_lease_no is six characters for both schedules, and PDQ is not. PDQ pads an oil lease number to five and a gas well ID to six, so the oil join needs the leading zero stripped before padding to five; matched as printed, all 88,280 oil rows miss.

permit_no is stored as an integer, so the leading zeros the fixed-width file writes are gone — 0281128 is 281128 here.

The copybook says RECORD LENGTH 360 and the published file is 354 data bytes plus CRLF: RRC drops the trailing 6-byte FILLER. If you read the original, pad to 360 before slicing.

No coordinates. The API number and the survey call (section, block, abstract, survey) are as close as this file gets to a location; join to the wellbore database or the daily permit file for a point.

Record layout

33 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_horizontal 33 columns

Record layout for permits_horizontal — 33 columns, with byte positions
# Column Type Bytes RRC name Meaning Lookup
1 permit_no key join integer 1-7 DAF318-PERMIT-NUMBER The seven-digit permit number, stored as an integer — so the leading zeros the fixed-width file writes are gone. Every one of the 173,511 rows matches a permit number in the master file. e.g. 281128
2 sequence_no key smallint 8-9 DAF318-PERMIT-SEQUENCE The amendment sequence, counting down from 99: 99 is the original filing, 98 the first amendment. e.g. 99
3 district_subscript text 10-11 DAF318-PERMIT-DISTRICT The district exactly as the file writes it: the mainframe subscript, 01-14, never 6E/7B/7C/8A. Kept so the table can be audited against the original; `district` is the same value decoded. e.g. 03 RRC district (internal number)
4 county_name text 12-24 DAF318-COUNTY-NAME County name as the file spells it, up to thirteen characters. e.g. FAYETTE
5 county_code join text 25-27 DAF318-API-COUNTY Three-digit API county code — the county half of the API number. Every value resolves to RRC's county table. e.g. 149 Texas county code
6 api_unique join text 28-32 DAF318-API-UNIQUE-NUMBER Five-digit unique well number — the second half of the API number. e.g. 31009
7 operator_no join text 33-38 DAF318-PERMIT-OPERATOR-NUMBER The operator's six-digit P-5 number, zero-padded and stored as text. All 173,511 rows resolve to texas.operators, which keys on the same number as an integer. e.g. 427594
8 operator_name text 39-70 DAF318-OPERATOR-NAME Operator name as it appears on the P-5, 32 characters. e.g. J & G OPERATING, INC.
9 lease_name text 71-102 DAF318-PERMIT-LEASE-NAME Lease name as approved by RRC, 32 characters. e.g. ALLISON
10 issued_date date 103-110 DAF318-PMT-ISSUED-DATE Date the permit was issued, CCYYMMDD on the tape. 1985-07-25 to 2026-06-30, with 40,622 rows before 2010. e.g. 1985-07-25
11 total_depth integer measured in ft 111-115 DAF318-PERMIT-TOTAL-DEPTH Permitted total depth of the well, in feet. e.g. 8406
12 section text 116-123 DAF318-PERMIT-SECTION Survey section of the surface location, new location format.
13 block text 124-133 DAF318-PERMIT-BLOCK Survey block of the surface location.
14 abstract text 134-139 DAF318-PERMIT-ABSTRACT Abstract number of the survey the surface location is in.
15 survey text 140-194 DAF318-PERMIT-SURVEY Name of the original land survey, up to 55 characters.
16 well_no text 195-200 DAF318-PERMIT-WELL-NUMBER Well number identifying the well within the lease, six characters. e.g. A1
17 field_name text 201-232 DAF318-FIELD-NAME Name of the field the permit was granted for. e.g. GIDDINGS (AUSTIN CHALK-3)
18 validated_field_name text 233-264 DAF318-VALIDATED-FIELD-NAME Name of the field the well was actually completed in. NULL where validated_carryover is true.
19 validated_well_date date 265-272 DAF318-VALIDATED-WELL-DATE Date the completion was validated. NULL on 5,492 rows that name a validated field but carry no date — those are real validations with the date missing.
20 validated_operator_name text 273-304 DAF318-VALIDATED-OPERATOR-NAME Operator name on the validated completion.
21 oil_gas text 305 DAF318-OIL-OR-GAS 'O' when the validated completion is on the oil schedule and 'G' when it is on the gas schedule. It decides how validated_lease_no should be read, and which half of PDQ it joins to. e.g. O Oil or gas schedule
22 validated_lease_no join text 306-311 DAF318-VALIDATED-LEASE-NUMBER The lease the permit ended up producing under, six characters zero-padded. For an oil completion this is the five-digit oil lease number with an extra zero in front; for a gas completion it is the six-digit statewide gas well ID. The file writes 000000 when there is none, which loads as NULL. e.g. 006309
23 validated_lease_name text 312-343 DAF318-VALIDATED-LEASE-NAME Lease name on the validated completion.
24 validated_well_no text 344-349 DAF318-VALIDATED-WELL-NUMBER Well number on the validated completion.
25 off_schedule_flag text 350 DAF318-VAL-OFF-SCHEDULE-FLAG 'Y' when the well is off the proration schedule. 22,065 rows; null on the rest.
26 total_permitted_fields smallint 351-352 DAF318-TOTAL-PERMITTED-FIELDS How many fields the permit granted.
27 total_validated_fields smallint 353-354 DAF318-TOTAL-VALIDATED-FIELDS How many of those fields were completed and validated by RRC.
28 district join text RRC district as the industry prints it — 01-06, 6E, 7B, 7C, 08, 8A, 09, 10 — decoded by the loader from district_subscript. This is the column to join on. e.g. 03 RRC district (printed designation)
29 api_no join text County code and unique number fused into the eight-digit API number, with no state prefix and no dashes: 14931009, not 42-149-31009. Composed by the loader; the file carries the two halves separately. e.g. 14931009
30 validated_carryover boolean True on the 32,429 records where RRC's program left the previous permit's validation data in an uncleared block — no validated field, no date, a validated-field count of zero, and someone else's operator, lease and well. The six columns are NULL on those rows. Filter it false for real validations only.
31 row_ordinal key smallint Position of this row within its permit+sequence group, 1-based. EZRRC's, not RRC's: a permit appears once per permitted field crossed with each validated completion, and 2,528 records are byte-identical repeats, so (permit_no, sequence_no) alone is not a key — 173,511 records hold 144,600 distinct pairs. e.g. 1
32 line_no integer 1-based record number in the original file, so a row can be traced to its line.
33 ingested_at timestamptz When the upstream pipeline last wrote this row. Not an RRC field — it is EZRRC's provenance stamp, and it is what the freshness badge is measured against.

Code lookups used here

Every coded column in this dataset resolves to a real lookup table, so a well code of G can be read as what it actually means.

Texas county code 277 values

Read by county_code

The three-digit county code RRC uses, which is also the county's FIPS code. `canonical_value` carries the full five-digit state plus county FIPS, so a county joins straight to Census geography. There are 254 Texas counties and 277 codes; the extras are offshore areas and administrative entries.

See all 277 codes

Source: Generated from texas.pdq_gp_county

RRC district (printed designation) 14 values

Read by district

The district as the Railroad Commission prints it: 01-06, 6E, 7B, 7C, 08, 8A, 09 and 10, plus 20 for statewide. This is what appears on permits, completions, ST-1 filings and inspection reports. It is not interchangeable with the internal district number. A column holding '11' means District 8A under the internal numbering and nothing at all under this one.

RRC district (printed designation) — 14 codes and their meanings
CodeMeans
01 District 01 — San Antonio RRC District 01, administered from the San Antonio district office.
02 District 02 — San Antonio RRC District 02, administered from the San Antonio district office.
03 District 03 — Houston RRC District 03, administered from the Houston district office.
04 District 04 — Corpus Christi RRC District 04, administered from the Corpus Christi district office.
05 District 05 — Kilgore RRC District 05, administered from the Kilgore district office.
06 District 06 — Kilgore RRC District 06, administered from the Kilgore district office.
6E District 6E — Kilgore RRC District 6E, administered from the Kilgore district office.
7B District 7B — Abilene RRC District 7B, administered from the Abilene district office.
7C District 7C — San Angelo RRC District 7C, administered from the San Angelo district office.
08 District 08 — Midland RRC District 08, administered from the Midland district office.
8A District 8A — Midland RRC District 8A, administered from the Midland district office.
09 District 09 — Wichita Falls RRC District 09, administered from the Wichita Falls district office.
10 District 10 — Pampa RRC District 10, administered from the Pampa district office.
20 District 20 — State Wide RRC District 20, administered from the State Wide district office.

Source: Generated from texas.pdq_gp_district.district_name

RRC district (internal number) 14 values

Read by district_subscript

RRC's internal sequential district numbering, 01 to 14 plus 20 for statewide. The production data, the UIC database and the high-cost gas certifications all use this. Internal 07 is District 6E, 08 is 7B, 09 is 7C, 10 is District 08, 11 is 8A, 13 is 09 and 14 is District 10. There is no internal 12.

RRC district (internal number) — 14 codes and their meanings
CodeMeans
01 District 01 — San Antonio (internal 01) Internal district number 01, which RRC prints as District 01 and administers from San Antonio.
02 District 02 — San Antonio (internal 02) Internal district number 02, which RRC prints as District 02 and administers from San Antonio.
03 District 03 — Houston (internal 03) Internal district number 03, which RRC prints as District 03 and administers from Houston.
04 District 04 — Corpus Christi (internal 04) Internal district number 04, which RRC prints as District 04 and administers from Corpus Christi.
05 District 05 — Kilgore (internal 05) Internal district number 05, which RRC prints as District 05 and administers from Kilgore.
06 District 06 — Kilgore (internal 06) Internal district number 06, which RRC prints as District 06 and administers from Kilgore.
07 District 6E — Kilgore (internal 07) Internal district number 07, which RRC prints as District 6E and administers from Kilgore.
08 District 7B — Abilene (internal 08) Internal district number 08, which RRC prints as District 7B and administers from Abilene.
09 District 7C — San Angelo (internal 09) Internal district number 09, which RRC prints as District 7C and administers from San Angelo.
10 District 08 — Midland (internal 10) Internal district number 10, which RRC prints as District 08 and administers from Midland.
11 District 8A — Midland (internal 11) Internal district number 11, which RRC prints as District 8A and administers from Midland.
13 District 09 — Wichita Falls (internal 13) Internal district number 13, which RRC prints as District 09 and administers from Wichita Falls.
14 District 10 — Pampa (internal 14) Internal district number 14, which RRC prints as District 10 and administers from Pampa.
20 District 20 — State Wide (internal 20) Internal district number 20, which RRC prints as District 20 and administers from State Wide.

Source: Generated from texas.pdq_gp_district.district_no

Oil or gas schedule 2 values

Read by oil_gas

Which schedule a lease is carried on. This is not decoration: an oil lease number and a gas lease number can be the same digits and mean different leases, so a lease key is only unique with this code and the district in it.

Oil or gas schedule — 2 codes and their meanings
CodeMeans
O Oil Carried on the oil proration schedule; lease numbers are oil lease numbers.
G Gas Carried on the gas proration schedule; lease numbers are gas well IDs.

Source: PDQ Dump user manual; values confirmed as the complete distinct set in texas.pdq_og_lease_cycle.oil_gas_code

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.

Horizontal Drilling Permits joins to Drilling Permit Master on Permit number = Permit number and Sequence number = Permit sequence — many rows here share a single row there.

is the permit

Every horizontal permit record back to its full permit master row, for the depth, the dates, the application type and the surface tract daf318 does not carry. Measured over the WHOLE of texas.permits_horizontal: 173,511 of 173,511 match on the permit number alone, and 173,501 still match when the amendment sequence is included — ten rows name a permit+sequence pair the master file does not have. Many to one on purpose: a permit appears in daf318 once per permitted field crossed with each validated completion, so 173,511 records hold 144,600 distinct permit+sequence pairs.

horizontal-drilling-permits.permit_no = drilling-permit-master.permit_no AND horizontal-drilling-permits.sequence_no = drilling-permit-master.permit_seq

Horizontal Drilling Permits joins to Full Wellbore Database (ASCII) on County code = API county and API unique = API unique — many rows here share a single row there.

permitted the wellbore

The two halves of the API number that daf318 carries separately, against the two halves the wellbore file carries separately — so this join needs no reassembly on either side. Measured over the whole table: all 173,511 rows resolve to a wellbore. The composed eight-digit api_no column joins equally well; the halves are used here because they compare column to column.

horizontal-drilling-permits.county_code = full-wellbore-ascii.api_county AND horizontal-drilling-permits.api_unique = full-wellbore-ascii.api_unique

Horizontal Drilling Permits joins to P-5 Organization (ASCII) on Operator number = ID — many rows here share a single row there.

was permitted to

The permit's operator, resolved to the P-5 directory. Measured over the whole table: all 173,511 rows resolve. 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.

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

Horizontal Drilling Permits joins to PDQ Regulatory Lease Directory on District = District name and Oil gas = Oil gas code and Validated lease number = Lease number — many rows here share a single row there.

was completed on the lease

The bridge this dataset exists for: from a horizontal permit to the lease or gas well it was finally validated against, and so to everything PDQ knows about that lease's production. Nothing else RRC publishes says which permit became which lease. PDQ carries the printed district in district_name, so the join goes through that and never through district_no. The lease number needs a cast on the oil side and none on the gas side, because daf318 writes six characters for both schedules and PDQ does not: a gas well ID is six digits there, an oil lease number FIVE. As printed, 52,553 of 52,801 gas rows match and 0 of 88,280 oil rows do. Strip the leading zero and pad back to five — lpad(ltrim(validated_lease_no, '0'), 5, '0') — and the oil side goes to 87,816 of 88,280. Both measured over the whole table. Restrict to validated_carryover = false: on 32,429 records RRC's own program left another permit's data in the validated block, and those columns are null here for that reason.

horizontal-drilling-permits.district = pdq-regulatory-lease-directory.district_name AND horizontal-drilling-permits.oil_gas = pdq-regulatory-lease-directory.oil_gas_code AND horizontal-drilling-permits.validated_lease_no = pdq-regulatory-lease-directory.lease_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 once a month (Monthly. Available by the 3rd Monday.)
RRC download link
GoAnywhere MFT
Record layout manual
Our table
texas.permits_horizontal

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.