PDQ Well Completion Directory
Queryable CSV
The wells that make up each lease, with API numbers and shut-in status.
Get the data
Heads up on Original: the Commission does not publish this table on its own. It publishes Production Data Query Dump, which this was parsed out of — so Original gets you that whole file, not just this table. Every other format is this table alone.
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.
What this is
One of the sixteen delimited tables inside the monthly Production Data Query dump. RRC publishes the dump as a single archive; EZRRC publishes each table inside it separately so you can take the one you need instead of a 3.6 GB zip.
282,000 rows tying a lease and well number to an API county and unique number, with the wellbore and well shut-in dates, the 14(b)(2) status and the wellbore location code.
It is the bridge from the lease-based production world to the API-numbered wellbore world.
What you can do with it
Turn lease production into well-level context: which wells are on the lease, which are shut in, and which are subject to 14(b)(2).
Join straight to the wellbore database on the API county and unique number — the two columns are already split the same way.
Gotchas
Lease production cannot be allocated to individual wells from this table. It tells you which wells are on the lease, not what each one made.
A lease number is only unique with the oil/gas code and the district in it. Oil lease 027587 in District 08 and gas lease 027587 in District 08 are different leases; so is oil lease 027587 in District 09.
Record layout
17 columns.
pdq_og_well_completion
17 columns
| # | Column | Type | RRC name | Meaning | Lookup |
|---|---|---|---|---|---|
| 1 |
oil_gas_code
join
|
text | — | Whether the lease is carried on the oil schedule or the gas schedule. | Oil or gas schedule |
| 2 |
district_no
join
|
text | — | RRC's INTERNAL district number, 01 to 14 plus 20 for statewide. This is not the district name the industry uses: 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. Join to the district directory rather than reading it as a label. | RRC district (internal number) |
| 3 |
lease_no
join
|
text | — | RRC lease number. Unique only within a district and a schedule, so a lease key is district + oil/gas code + lease number. | — |
| 4 |
well_no
|
text | — | Well number within the lease, as the operator designates it. | — |
| 5 |
api_county_code
key
join
|
text | — | The three-digit county part of the API number. | Texas county code |
| 6 |
api_unique_no
key
join
|
text | — | The five-digit unique part of the API number. | — |
| 7 |
onshore_assc_cnty
|
text | — | Onshore assc county | — |
| 8 |
district_name
|
text | — | RRC district as the industry writes it, e.g. 7B, 8A, 6E. | — |
| 9 |
county_name
|
text | — | County name. | — |
| 10 |
oil_well_unit_no
|
text | — | Oil well unit number | — |
| 11 |
well_root_no
|
text | — | Well root number | — |
| 12 |
wellbore_shutin_dt
|
text | — | Wellbore shutin date | — |
| 13 |
well_shutin_dt
|
text | — | Well shutin date | — |
| 14 |
well_14b2_status_code
|
text | — | Well 14b2 status code | — |
| 15 |
well_subject_14b2_flag
|
text | — | Well subject 14b2 flag | — |
| 16 |
wellbore_location_code
|
text | — | Wellbore location code | — |
| 17 |
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 api_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.
Source: Generated from texas.pdq_gp_county
RRC district (internal number) 14 values
Read by district_no
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.
| Code | Means |
|---|---|
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_code
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.
| Code | Means |
|---|---|
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.
PDQ Well Completion Directory joins to Full Wellbore Database (ASCII) on API county code = API county and API unique number = API unique — many rows here share a single row there.
is the wellbore
Both files split the API number the same way, so this is an exact two-column join — 5,000 of 5,000 sampled rows. It is the bridge from lease-based production to the API-numbered wellbore world.
pdq-well-completion.api_county_code = full-wellbore-ascii.api_county AND pdq-well-completion.api_unique_no = full-wellbore-ascii.api_unique
PDQ Well Completion Directory joins to Oil Well Status (26 Month W-10) on District name = District and Lease number = Lease number and Well number = Well number — one row here matches many rows there.
was tested on the W-10 as
PDQ's oil-schedule well completion, matched to its W-10 tests on the printed district, lease number and well number. Restrict the PDQ side to oil_gas_code = 'O': gas completions carry gas well IDs in the same lease_no column, and 6 of 20,000 sampled gas rows collide with a real oil lease. 1,667 of 5,000 sampled oil completions have a test in the current window — the W-10 file only holds wells that filed one recently, so a miss means no recent test, not a bad key. 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.
pdq-well-completion.district_name = oil-well-status-w10.district AND pdq-well-completion.lease_no = oil-well-status-w10.lease_no AND pdq-well-completion.well_no = oil-well-status-w10.well_no
PDQ Well Completion Directory joins to Gas Well Status (26 Month G-10) on District name = District and Lease number = RRC ID — one row here matches many rows there.
was tested on the G-10 as
PDQ's gas-schedule well completion, matched to its G-10 tests: the gas well ID PDQ carries as lease_no is the G-10's rrc_id. Restrict the PDQ side to oil_gas_code = 'G' — 25 of 20,000 sampled oil completions share digits and district with a gas well. 944 of 5,000 sampled gas completions have a test on the current tape, which was cut in late 2021. 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.
pdq-well-completion.district_name = gas-well-status-g10.district AND pdq-well-completion.lease_no = gas-well-status-g10.rrc_id
PDQ Well Completion Directory joins to Statewide Oil Well Database on Well root number = Wlroot key — one row here matches one row there.
is PDQ's well completion
The one join that gets an API number out of this tape. PDQ's well_root_no is the same RRC internal well id as WL-ROOT-KEY, zero-padded to eight characters, and it resolves for 293,022 of the 293,069 oil wells -- one PDQ completion each, never more. The row it lands on carries api_county_code and api_unique_no, the county name, and PDQ's own district/lease/well key. 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.
statewide-oil-well-database.wlroot_key = pdq-well-completion.well_root_no
PDQ Well Completion Directory joins to Statewide Gas Well Database on Well root number = Wlroot key — one row here matches one row there.
is PDQ's well completion
The same bridge for the gas tape: 138,869 of the 138,901 gas wells resolve to exactly one PDQ well completion, which is where the API number and the county are. The two tapes share no root keys, so a key that matches here does not match the oil tape. 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.
statewide-gas-well-database.wlroot_key = pdq-well-completion.well_root_no
PDQ Well Completion Directory joins to PDQ Regulatory Lease Directory on Oil gas code and District number and Lease number — many rows here share a single row there.
is produced by the wells
The wells that make up a lease. Texas reports oil production by lease, so this is as close as the production data gets to a well — it tells you which wells are on the lease, not what each one made.
pdq-regulatory-lease-directory.oil_gas_code = pdq-well-completion.oil_gas_code AND pdq-regulatory-lease-directory.district_no = pdq-well-completion.district_no AND pdq-regulatory-lease-directory.lease_no = pdq-well-completion.lease_no
PDQ Well Completion Directory joins to Statewide API Data (dBase) on API county code = API county and API unique number = API unique — rows can match many rows in both directions.
is carried on the schedule as
The way to get from an API number to a lease WITH its district and schedule, which the map alone cannot give you: PDQ's well completion table carries the API halves alongside oil_gas_code, district_no and lease_no. 819,086 of PDQ's 820,005 completions have an entry in the map, and 998,442 of the map's 1,556,119 entries reach a completion — the rest are bores that were never carried on a proration schedule.
statewide-api-data-dbase.api_county = pdq-well-completion.api_county_code AND statewide-api-data-dbase.api_unique = pdq-well-completion.api_unique_no
PDQ Well Completion Directory joins to Historical Ledger — Statewide Gas on District number = District and Lease number = Gas RRC ID — one row here matches one row there.
is the well whose completion is
From the gas id to PDQ's completion record and its API number. 219,205 of the 219,384 wells match, and exactly one row comes back for each, because a gas 'lease' in PDQ IS one well. The oil edge is the same join and one-to-many. Restrict to oil_gas_code = 'G'. 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.
historical-ledger-gas.district = pdq-well-completion.district_no AND historical-ledger-gas.gas_rrc_id = pdq-well-completion.lease_no
PDQ Well Completion Directory joins to Statewide Production Data — Gas on District number = District and Lease number = Gas RRC ID — one row here matches one row there.
is the well whose completion is
From the gas id to PDQ's completion record and its API number. 4,988 of 5,000 sampled wells match, and exactly one row comes back for each: all 231,690 gas keys in PDQ's completion directory carry a single row, because a gas 'lease' there IS one well. The oil edge above is the same join and one-to-many, because an oil lease has several. Restrict to oil_gas_code = 'G'. 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.
statewide-production-data-gas.district = pdq-well-completion.district_no AND statewide-production-data-gas.gas_rrc_id = pdq-well-completion.lease_no
PDQ Well Completion Directory joins to Historical Ledger — Statewide Oil on District number = District and Lease number = Lease number — many rows here share a single row there.
is the lease whose completions are
The hop that gets a historical lease an API number, which no part of LAD001 carries: PDQ's completions for the lease. 157,875 of the 158,566 leases match. It stops at the lease -- the oil tape has no well number to take it further, and unlike the gas tape it has no well-database key either. Restrict to oil_gas_code = 'O'. 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.
historical-ledger-oil.district = pdq-well-completion.district_no AND historical-ledger-oil.lease_no = pdq-well-completion.lease_no
PDQ Well Completion Directory joins to Statewide Production Data — Oil on District number = District and Lease number = Lease number — many rows here share a single row there.
is the lease whose completions are
The hop that gets a production lease an API number, which no part of PDA001 carries: PDQ's completions for the lease. 4,827 of 5,000 sampled leases match. It stops at the lease -- the tape has no well number to take it further. Restrict to oil_gas_code = 'O'. 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.
statewide-production-data-oil.district = pdq-well-completion.district_no AND statewide-production-data-oil.lease_no = pdq-well-completion.lease_no
PDQ Well Completion Directory joins to Oil Ledger — Wells on District name = District and Lease number = Lease number — rows can match many rows in both directions.
is on the lease whose completions are
From a scheduled well to the API-numbered completions PDQ carries for its lease -- the hop that gets an oil ledger well an API number, which no ledger tape holds. 3,752 of 5,000 sampled wells match at lease level as the columns stand, and all 5,000 once the district's leading zero is stripped. It stops at the lease deliberately. Adding the well number matches every one of 5,000 sampled wells, but only after trimming: the ledger right-justifies the well number in six bytes and PDQ does not. Restrict PDQ to oil_gas_code = 'O'. 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.
oil-ledger-wells.district = pdq-well-completion.district_name AND oil-ledger-wells.lease_no = pdq-well-completion.lease_no
PDQ Well Completion Directory joins to Oil Detail Well on District name = District and Lease number = Lease number — rows can match many rows in both directions.
is on the lease whose completions are
The same hop for the wells inside multi-well units: from the detail tape to PDQ's completions for the lease, which carry the API number. 3,015 of 5,000 sampled detail wells match as the columns stand and all 5,000 once the district's leading zero is stripped -- the detail tape is two thirds District 08 and 8A, so the spelling costs it more than it costs the ledger. Restrict PDQ to oil_gas_code = 'O'. 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.
oil-detail-well.district = pdq-well-completion.district_name AND oil-detail-well.lease_no = pdq-well-completion.lease_no
Where this comes from
- Published by
- Texas Railroad Commission — the original page
- Original format
- CSV Comma-separated text.
- RRC publishes
- Updated once a month (Last Saturday each month, with the PDQ dump.)
- RRC download link
- GoAnywhere MFT
- Record layout manual
- Our table
texas.pdq_og_well_completion
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.