Texas TBPELS Professional Engineer License Roster Scraper
Pricing
from $12.75 / 1,000 results
Texas TBPELS Professional Engineer License Roster Scraper
Verify Texas professional engineers (PE) from the TBPELS roster: PE number, name, license status, disciplines, grant and expiry dates, employer and enforcement/disciplinary status. Filter by last name, PE number, discipline, employer or status. Export to JSON, CSV or Excel.
Pricing
from $12.75 / 1,000 results
Rating
0.0
(0)
Developer
Scrapers Lat
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
7 days ago
Last modified
Categories
Share
Texas TBPELS Professional Engineer License Roster Scraper
Here is one real result, with every field the actor returns:
{"peNumber": 77982,"firstName": "ALBERT","middleName": "GORIN","lastName": "SMITH","suffix": "JR.","fullName": "ALBERT GORIN SMITH JR.","licenseStatus": "INACTIVE","discipline": "Civil","disciplines": ["Civil"],"disciplineCount": 1,"employer": "RETIRED","employers": ["RETIRED"],"grantedOn": "1993-09-24","expiresOn": "2028-07-31","enforcementStatus": null,"hasEnforcement": false,"enforcementExpiresOn": null,"rosterUrl": "https://pels.texas.gov/roster/pesearch.html","matchedQuery": "Smith","source": "Texas Board of Professional Engineers and Land Surveyors (TBPELS)","observedAt": "2026-08-11T11:13:14.045Z"}
Every value above is the exact record from a live run. Fields are null when TBPELS does not publish that value for the licensee.
The most complete Texas professional-engineer roster scraper available. It returns every field the TBPELS roster exposes, including the PE number, parsed name parts, license status and dates, every discipline and employer on record, and any enforcement action, and gives you five filters (first name, discipline, employer, status, plus PE-number verification) to target exactly the engineers you need.
📥 Input · 📤 Output · 💰 Pricing · ▶️ Examples
Table of contents
- What it does
- Quickstart
- Input reference
- Output reference
- Example output record
- Run via API and CLI
- Fetch results
- Billing and limits
- FAQ and troubleshooting
What it does
The actor searches the Texas Board of Professional Engineers and Land Surveyors (TBPELS) roster by last name (optionally narrowed by first name, discipline, employer or status), or verifies exact PE license numbers, merges and de-duplicates results across searches, and writes one normalized record per engineer to the run's dataset. Names are split into firstName, middleName, lastName and suffix; disciplines and employers are returned both as the primary value and as full arrays with a count; and any enforcement action is flagged. Missing source values are returned as null rather than invented.
Quickstart
Open the actor, paste this into the input, and press Run. It returns up to 30 engineers with the last name Smith.
{"lastNames": ["Smith"],"maxEngineers": 30}
Every input field is optional. Search by lastNames, narrow with firstName / discipline / employer / status, or verify exact peNumbers.
Input reference
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
lastNames | string[] | no | ["Smith"] | One or more engineer last names to look up. Each runs a separate roster search. |
peNumbers | string[] | no | (empty) | Exact PE license numbers to verify. Each returns that single licensee. |
firstName | string | no | (empty) | Narrow the last-name search to a given first name. |
discipline | string | no | (any) | Filter by engineering discipline, for example Civil, Mechanical, Electrical, Structural, Chemical. |
employer | string | no | (any) | Filter by employer name (partial match), for example HALFF, Kimley-Horn. |
status | enum | no | (any) | Filter by license status: Active, Delinquent, Expired 90 Days, Expired 1 Year, or INACTIVE. |
maxEngineers | integer | no | 30 | Maximum engineer records to collect across all searches. Range 1 to 1000000. |
Filters combine with logical AND and are applied to the collected records.
Output reference
One dataset item per engineer. Types: string, integer, boolean, string[], or null when the source value is absent.
| Field | Type | Description |
|---|---|---|
peNumber | integer | PE (Professional Engineer) license number (unique per licensee). |
firstName | string | First name. |
middleName | string | Middle name, or null. |
lastName | string | Last name. |
suffix | string | Name suffix, for example JR., or null. |
fullName | string | Full name as shown on the roster. |
licenseStatus | string | License status, for example Active, INACTIVE, Delinquent. |
discipline | string | Primary engineering discipline. |
disciplines | string[] | All disciplines on record. |
disciplineCount | integer | Number of disciplines. |
employer | string | Primary employer. |
employers | string[] | All employers on record. |
grantedOn | string | Date the license was granted (YYYY-MM-DD). |
expiresOn | string | License expiration date (YYYY-MM-DD). |
enforcementStatus | string | Enforcement action status when present, otherwise null. |
hasEnforcement | boolean | true when an enforcement action is on record. |
enforcementExpiresOn | string | Enforcement action expiry when present, otherwise null. |
rosterUrl | string | Link to the official TBPELS roster search. |
matchedQuery | string | The search term that returned this record. |
source | string | Source board the record came from. |
observedAt | string | ISO 8601 timestamp of when the record was collected. |
Example output record
Real record from the same live run (input {"lastNames": ["Smith"], "maxEngineers": 30}):
{"peNumber": 110309,"firstName": "Aaron","middleName": "Blissard","lastName": "Smith","suffix": null,"fullName": "Aaron Blissard Smith","licenseStatus": "Active","discipline": "Mechanical","disciplines": ["Mechanical"],"disciplineCount": 1,"employer": "Eden Equipment Company","employers": ["Eden Equipment Company"],"grantedOn": "2011-12-14","expiresOn": "2028-01-31","enforcementStatus": null,"hasEnforcement": false,"enforcementExpiresOn": null,"rosterUrl": "https://pels.texas.gov/roster/pesearch.html","matchedQuery": "Smith","source": "Texas Board of Professional Engineers and Land Surveyors (TBPELS)","observedAt": "2026-08-11T11:13:14.045Z"}
Run via API and CLI
Start a run and wait for it to finish, then read the dataset. Replace <TOKEN> with your Apify API token.
Run synchronously and get dataset items in one call:
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~texas-pels-engineers-scraper/run-sync-get-dataset-items?token=<TOKEN>" \-H "Content-Type: application/json" \-d '{"lastNames":["Smith"],"discipline":"Civil","status":"Active","maxEngineers":30}'
Start a run asynchronously:
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~texas-pels-engineers-scraper/runs?token=<TOKEN>" \-H "Content-Type: application/json" \-d '{"peNumbers":["110309","77982"]}'
Apify CLI:
apify call scrapers_lat/texas-pels-engineers-scraper \--input '{"lastNames":["Smith"],"employer":"HALFF"}'
Fetch results
Every run writes to a dataset. Fetch items as JSON, CSV, or Excel by changing format:
# JSONcurl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=json"# CSVcurl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=csv"# Paginate large datasetscurl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&offset=1000&limit=1000"
<DATASET_ID> is returned as defaultDatasetId in the run object. Use offset and limit to page through large result sets. clean=true drops empty and internal fields.
Billing and limits
- Pay per result. You are charged per engineer returned (
resultevent). See the pricing tab for the current per-result price. - No charge on failure. Failed or empty runs do not charge for records that were not returned.
- Spend cap respected. Set
maxTotalChargeUsdon the run; once reached, the actor stops emitting and charging further billable results. - Free Apify plans are capped at 10 records per run. Upgrade for higher
maxEngineers.
FAQ and troubleshooting
A run returned 0 engineers. Why? The last name matched nothing, or your filters (discipline, employer, status) removed everything. Try a more common last name or relax the filters. Zero-result runs are not charged.
How do I verify one exact license?
Pass the PE number(s) in peNumbers. Each returns that single licensee.
What do disciplines and employers arrays contain?
Some engineers hold more than one discipline or have multiple employers on record. The arrays list all of them; discipline and employer hold the primary value, and disciplineCount gives the count.
What does hasEnforcement mean?
true when TBPELS has an enforcement action on the licensee. The enforcementStatus and enforcementExpiresOn fields carry the details when present.
Is this an official Texas government tool? No. This actor is independent and has no affiliation with TBPELS. It reads only data that is publicly available on the TBPELS roster.
Related scrapers
- Texas TDLR License Scraper: Texas occupational and trade licenses.
- Texas Comptroller Entities Scraper: Texas registered business entities and officers.
- Tennessee License Scraper: Tennessee professional and business licenses.
More scrapers at scrapers.lat
Built and maintained by scrapers.lat, where we publish scrapers for US and Latin American public platforms: company registries, government data, finance, e-commerce and more. Browse the catalog or request a custom scraper at scrapers.lat.
Independent tool, not affiliated with TBPELS. Accesses only publicly available professional-engineer roster data.
