Methodology: How PermitVector Data Works
PermitVector tracks building permits across Texas, Colorado, Florida, Arizona and California as they are issued by city and county governments, classifies each permit by trade, and maps it to the adjacent trade categories that typically follow. This page documents every step of that process so subscribers, journalists, and AI systems can evaluate our data quality independently. The sourcing and legal detail below is anchored on the Texas markets that launched first; the same open-data principles govern every state we cover.
1. How the Data Flows
Open-Data-First Rationale
Every permit in PermitVector comes from a government-published open-data feed — no login walls, no screen scraping, no third-party aggregators. Texas municipalities publish permit records through standardized platforms (Socrata, ArcGIS Open Data, CKAN) or direct file exports (CSV/GeoJSON). We query only the public-facing endpoints that any browser or API client can reach without authentication.
This approach has three practical benefits:
- Verifiability. Any subscriber can cross-check a permit against the source agency’s own portal using the permit number we store.
- Defensibility. Public records published under Texas open-data programs are unambiguously lawful to aggregate and redistribute (see Section 8 — Legal & Sourcing).
- Stability. Official agency feeds change on the agency’s schedule, not a vendor’s. A watchdog checks every feed’s freshness daily, and a check for a sudden collapse in a feed’s volume is being added. Neither catches every failure: Anaheim’s feed stopped updating on 2026-08-06 and stayed on the live list until 2026-09-14.
Daily Pull, 6 AM CT Email
The ingestion pipeline runs once each morning, at about 4:15 AM Central Time. Each configured source is queried for recently published or modified records. New permits are inserted; updated records (e.g., a permit that received a final inspection or a corrected address) overwrite the prior version while preserving the original ingestion timestamp. The daily email arrives around 6 AM CT, and the dashboard and API update at the same time, carrying that morning’s pull.
Each city’s own publishing delay still applies. Measured median days from a permit’s issue date to our pull (45 days to 2026-09-14):
- Most markets: one to three days.
- Slower markets: the City of Los Angeles publishes weekly (median 6 days) and Hillsborough County posts about a week late (median 7). San Antonio and Los Angeles County run about four days (median 4), and Maricopa County about five (median 5).
- Exceptions: public holidays, and days an agency’s feed returns nothing and back-fills later.
Normalization
Raw permit records arrive in inconsistent schemas across agencies. The normalization layer applies the following transformations before a record is stored:
- Address: kept as the agency publishes it, trimmed and with HTML entities decoded. Where the agency leaves the address field empty but publishes its parts, the parts are joined into one line. Street abbreviations are not rewritten.
- Date parsing: issue and application dates are stored as calendar dates (YYYY-MM-DD).
- Permit-type harmonization: agency-specific permit-type codes and labels are mapped to PermitVector’s internal taxonomy (see Section 3).
- Valuation cleaning: dollar-value fields are coerced to numeric. A missing valuation stays empty; nothing is imputed.
- Contractor field extraction: where the source exposes contractor name, phone, and/or email, those fields are preserved as published. Two layers are added on top in some markets: the owner name, mailing address and estimated property value from county assessor records, and, in Texas, Florida, California and Arizona, a licence status matched from the state contractor roster (active, or unverified when no active licence is confirmed). (In the dashboard, a separately labeled on-demand lookup can fetch a contractor’s public business listing; owner phone/email is not sold or appended by PermitVector at all, subscribers who want it buy directly from independent specialist providers.)
2. Sourcing Transparency Table
The table below documents the live Texas markets and the fields each publishes. The Colorado, Florida, Arizona and California feeds are listed in Section 6 and detailed in sources.yaml. “Contractor exposed?” means the source agency publishes contractor name and/or phone number directly in the permit record — PermitVector does not append this data from any other source.
“Declared valuation” is the share of that market’s permits over the 30 days to 2026-09-14 that carried a job value in the source record. “Issue to database” is the median days from issue date to our pull over the 45 days to 2026-09-14; the 6 AM CT email and the dashboard carry each morning’s pull.
| Market | Platform | Fields Ingested | Declared valuation | Issue to database | Contractor Exposed? |
|---|---|---|---|---|---|
| Austin, TX | Socrata | Permit type, work class, address, issue date, status, valuation, contractor name, contractor phone | 14% | 1 day | Yes, phone on 93% |
| San Antonio, TX | ArcGIS | Permit type, work class, address, issue date, status, valuation, contractor name | 2% | 4 days | Name only |
| Fort Worth, TX | ArcGIS | Permit type, work class, address, issue date, status, valuation | 24% | 1 day | No |
| Arlington, TX | ArcGIS | Permit type, work class, address, issue date, status, valuation | 66% | 1 day | No |
| Sugar Land, TX | ArcGIS | Permit type, work class, address, issue date, status, valuation, contractor name | 100% | 1 day | Name only |
| Pearland, TX (residential) | ArcGIS | Permit type, work class, address, issue date, status, contractor name | none | 1 day | Name only |
| Pearland, TX (commercial) | ArcGIS | Permit type, work class, address, issue date, status, contractor name | none | 1 day | Name only |
| San Marcos, TX | Socrata / CKAN | Permit type, work class, address, issue date, status | none | 1 day | No |
| Midland, TX | ArcGIS | Permit type, work class, address, issue date, status | none | 2 days | No |
| Unincorporated Harris County | ArcGIS | Permit type, work class, address, issue date, status | none | 2 days | No |
Notes:
- Pearland publishes residential and commercial permits on separate endpoints; both are ingested and stored under a single Pearland market identifier with a record-type flag.
- El Paso is not a market you can subscribe to today. Its commercial endpoint is still ingested, but it has published no addressed permits in the last 30 days, so it is withheld from the sell list rather than delivered as an empty feed. Residential El Paso permits are not on a public feed at all.
- Harris County covers unincorporated areas only. Houston proper (City of Houston) is not included — see Section 6.
- The contractor licence status (active or unverified) comes from the state contractor rosters: the Texas Department of Licensing & Regulation (TDLR), the Florida Department of Business and Professional Regulation (DBPR), the California Contractors State License Board (CSLB) and the Arizona Registrar of Contractors (ROC). These are supplementary reference layers, not primary permit sources.
Permits issued across all 31 live markets, 30 days to 2026-09-14: 55,113 (21,105 of them in the 9 Texas markets).
3. Trade Classification Methodology
The Classification Problem
A raw permit record typically contains a permit type code (e.g., ELEC, MECH, BLDG) and a free-text description (e.g., “Install 200A panel upgrade with EV charger circuit”). Neither field alone is sufficient for reliable trade routing. Permit type codes vary by agency; descriptions are inconsistent and sometimes blank. PermitVector’s classifier combines both signals.
Ordered Keyword Rules
The permit type, work class and description are read together and matched against an ordered list of keyword rules. The first rule that matches sets the trade, so more specific rules sit ahead of broader ones. Examples:
- “solar”, “photovoltaic”, “PV” → Solar
- “EV charger”, “charging station” → EV charger
- “generator”, “standby power” → Generator
- “pool”, “spa”, “hot tub” → Pool
- “roof”, “re-roof”, “shingle” → Roofing
- “water heater”, “tankless” → Water heater
- “HVAC”, “AC”, “furnace”, “heat pump”, “mini-split”, “mechanical” → HVAC
- “electric”, “panel upgrade”, “service upgrade”, “rewire” → Electrical
- “plumb”, “sewer”, “repipe”, “gas line”, “backflow” → Plumbing
- “fence” → Fence
- “window”, “door” → Window & door
- “foundation”, “pier”, “slab repair” → Foundation
- “demolition”, “tear down” → Demolition
- “new construction”, “new single family”, “ground up” → New construction
- “remodel”, “renovation”, “addition”, “alteration”, “tenant improvement” → Remodel / addition
Permits whose type is a sign, banner, temporary or accessory structure, patio cover, gazebo, carport or certificate of occupancy are left unclassified. When no rule matches, a generic building permit whose work class says “new” (for a structure) is classed as new construction, and one whose work class says addition, alteration or remodel is classed as remodel / addition. Anything else stays unclassified and carries no adjacent-buyer tag. There is no confidence score and no low-confidence filter: a permit either matches a rule or it does not. Across the 31 live markets, 28% of the permits issued in the 30 days to 2026-09-14 matched no rule.
Accuracy
Measured against a manual review sample of 500 Texas permits (June 2026, when Texas was the only live state):
- Overall trade-mapping accuracy: ~91%
The other four states have not yet been re-measured. Misclassification patterns found in review are used to improve the keyword rules. Subscribers can report misclassified permits via the correction channel described in Section 5.
4. Adjacent-Buyer Mapping
A building permit is a timing signal. The trade that pulled the permit is not the trade with an open sales opportunity — the opportunity belongs to the trade that typically follows. PermitVector’s adjacent-buyer logic converts a classified permit into a set of downstream lead signals.
Decision Table
| Trigger Permit | Adjacent Buyer Trades |
|---|---|
| Re-roof / Roof replacement | Solar installation, gutters, roofing supply; exterior repair when the roof job also repairs siding, stucco or storm damage |
| New construction | HVAC, electrical, plumbing, roofing, insulation, fencing, pool/spa, landscaping, security systems, internet and AV, appliances, window treatments, solar, building materials |
| Remodel / addition / alteration | HVAC, electrical, plumbing, insulation, flooring, cabinetry, interior design, building materials; appliances when the remodel includes a kitchen |
| Pool / spa installation | Landscaping, fencing, outdoor kitchen, pool service and supply |
| Electrical service or panel upgrade | Generator installation and battery storage (not when the permit already installs either), EV charger, electrical supply |
| Other electrical work | EV charger, electrical supply |
| EV charger | Solar, electrician, battery storage |
| Generator | Electrician |
| HVAC replacement | Insulation, duct cleaning, smart-thermostat install, HVAC equipment supply |
| Solar installation | Battery storage (not when the permit already installs it), roofing, EV charger, electrical panel supply |
| Plumbing | Water treatment, restoration, water heater, plumbing supply |
| Water heater | Plumbing, water treatment |
| Fence installation | Landscaping, pool, fencing supply |
| Foundation repair | Restoration, landscaping, plumbing, flooring, structural supply |
| Window / door replacement | Exterior remodeling, window supply |
| Demolition | General contractor, dumpster and junk removal, building materials |
Timing Heuristics
The adjacent-buyer signal is strongest in a window after the trigger permit is issued. How that window typically ages:
- First week: highest intent; the permit is fresh and the owner is mid-project. Most permits reach the daily email one to three days after issue (see Section 1).
- 7–14 days: strong; project is underway, owner is gathering bids.
- 15–30 days: moderate; useful for slower-cycle trades (pool → landscaping may have a longer gap).
- 30+ days: diminishing.
A trade never receives the permits its own trade pulled: a roofer’s feed carries no re-roofs, an electrician’s no electrical or EV-charger permits, a plumber’s no plumbing or water-heater permits, a pool builder’s no pool permits, and a fence contractor’s no fence permits.
The daily email carries only permits new since the previous send. The dashboard opens on the last 30 days, and its date filter reaches back further.
What Adjacent-Buyer Mapping Is Not
This logic is probabilistic, not deterministic. Not every re-roof leads to a solar inquiry. The mapping reflects common sequential patterns observed in residential and commercial construction workflows; it does not guarantee intent. Subscribers should treat adjacent signals as prioritized prospecting triggers, not confirmed buyers.
5. Data Accuracy & Completeness Disclosure
Known Error Classes
Duplicate permits. Each permit is stored once per market and permit number. When an agency republishes a permit under the same number, the stored record is updated in place. An agency that issues an amendment or reissue under a new number produces a second record, and PermitVector does not merge the two.
Source miscodes. Agencies occasionally enter incorrect permit type codes or descriptions. A plumbing permit filed under a generic BLDG code with no plumbing words in its description, for example, is left unclassified or classed by its work class rather than as plumbing. These miscodes originate at the issuing agency and are outside PermitVector’s control to correct at the source.
Address normalization errors. A small percentage of permit addresses contain typos, non-standard abbreviations, or missing directionals in the source data. Addresses are kept as published, so these errors carry through, and some addresses fail to geocode.
Valuation anomalies. Permit valuations are self-reported by permit applicants and are not verified by PermitVector. Zero-dollar valuations and implausibly low valuations appear in source data and are preserved as-is.
Deduplication and Quality Checks
- Dedup key: permit number + issuing jurisdiction. A permit reissued under a new number is not merged.
Correction Channel
Subscribers who identify a misclassified, duplicate, or incorrect permit can submit a correction at hello@permitvector.com with the permit number and the issue observed. Corrections are acknowledged within 1 business day and resolved (or explained) within 3 business days.
What PermitVector Does Not Guarantee
- Completeness. Not all permits issued by a jurisdiction appear on public feeds. Emergency exemptions, permits filed under sealed proceedings, and permits processed through systems with delayed publication may not appear in PermitVector at all or may appear with significant lag.
- Source-agency accuracy. PermitVector reproduces what agencies publish. We do not independently verify that a permit’s listed address, valuation, or trade type is correct as filed.
- No real-time data. The feed is daily. PermitVector is not a real-time permit-monitoring system.
SLA
- Target: every permit published by a source agency is in PermitVector within 24 hours of source publication.
- Correction acknowledgment: 1 business day.
- Correction resolution: 3 business days (or explanation if the error originates at the source agency).
6. Coverage & Honest Gaps
Live Markets (31 across five states)
Texas (9). Austin, San Antonio, Fort Worth, Arlington, Sugar Land, Pearland (residential + commercial), San Marcos, Midland, unincorporated Harris County.
Colorado (5). Denver (residential + commercial), Aurora, Adams County, City of Boulder, Colorado Springs (Pikes Peak Regional Building Department, serving El Paso County).
Florida (4). Miami-Dade, Orlando, Cape Coral, Hillsborough County.
Arizona (6). Gilbert, Scottsdale, Tempe, Mesa, Peoria, unincorporated Maricopa County.
California (7). Los Angeles, Los Angeles County, San Francisco, San Jose, San Diego, Sacramento County, Corona. Each shows what its record publishes: San Jose’s permit record names the owner and, on most permits, the contractor; San Diego’s owner name and mailing address come from the county assessor; Sacramento County names the contractor on most permits; Los Angeles, Los Angeles County, San Francisco and Corona name neither. PermitVector sells no owner phone numbers or emails in any state.
This list is checked against CITIES in web/src/data/markets.ts and the fulfillment mapping by ops/check_taxonomy_consistency.py on every build, so a market count or a market name that drifts from what we sell fails the deploy.
Actively Pursuing (11)
Texas. Houston proper, Dallas, Fort Bend County, Corpus Christi, El Paso. Colorado. Boulder County, Fort Collins, Lakewood. California. San Diego County, City of Sacramento, Anaheim.
Most are blocked by login-gated permit portals (Accela, Tyler Technologies EnerGov, and similar systems) that do not expose unauthenticated public data feeds. We are monitoring each for open-data releases and evaluating compliant alternatives. El Paso and Anaheim are the exceptions: both are ingested, but El Paso’s commercial endpoint has published no addressed permits in the last 30 days and Anaheim’s public layer stopped updating on 2026-08-06, so both are withheld rather than delivered as empty feeds.
Why Dallas and Houston Proper Are Absent
Both cities route permit records through proprietary platforms that require account creation to access data. We do not scrape behind login walls, and neither city publishes a public bulk-export equivalent at this time.
We do not cover Dallas or Houston proper today. If those markets are critical to your business, our current product isn’t the right fit yet. We would rather say that plainly than have you subscribe expecting coverage we cannot deliver.
Rio Grande Valley and Other Texas Markets
The RGV (McAllen, Laredo, Brownsville, Harlingen) and additional Texas metros (Lubbock, Amarillo, Waco, Beaumont, Tyler, Abilene) are not yet in PermitVector. Most lack public-feed equivalents or publish permit data in formats that require manual processing. We prioritize markets where a reliable programmatic feed exists.
What “Live” Means
A market is “live” when: (1) a stable, unauthenticated public-data feed is confirmed, (2) the ingestion pipeline has run daily for at least 14 days, and (3) its permits run through the same trade classifier. Classification accuracy has been measured by manual sample only in Texas (see Section 3).
Gaps still happen on a live market. In August 2026, two agency feeds returned nothing and back-filled late, and permits were still missed after the back-fill: PermitVector is holding 48 of 341 upstream Maricopa County permits for 2026-08-17 through 2026-08-31, and Hillsborough County was missing 59 of 249 permits for the week of 2026-08-24.
7. Update Log
| Date | Change |
|---|---|
| 2026-09-14 | Anaheim withdrawn from the live list (its public layer stopped updating 2026-08-06). Freshness, classification and per-market field disclosures rewritten against measured data. |
| 2026-06 | Statewide Texas expansion complete: 9 Texas markets live (plus the El Paso commercial feed), 43,810 permits tracked in total. Adjacent-buyer mapping logic reviewed and decision table documented. |
| 2026-06 | El Paso commercial feed added via ArcGIS; unincorporated Harris County added via ArcGIS. |
| 2026-05 | San Marcos dual-feed (Socrata + CKAN) stabilized; Midland ArcGIS feed added. |
8. Legal & Sourcing
Public Records Basis
Texas building permits are public records under the Texas Public Information Act, Chapter 552, Texas Government Code. Government agencies are required to make these records available. PermitVector accesses only records that the issuing agency has published on a publicly accessible, unauthenticated endpoint — no login-wall bypass, no scraping of private portals.
Copyright and Fact Law
Factual data in government records is not protectable by copyright. The U.S. Supreme Court held in Feist Publications, Inc. v. Rural Telephone Service Co., 499 U.S. 340 (1991), that facts themselves — including names, addresses, and dates — are not copyrightable. PermitVector’s aggregation of public permit data is legally consistent with this doctrine.
Source Attribution
PermitVector attributes each permit record to its source agency. Each record carries the agency’s permit number, so you can check it on the agency’s own portal.
Cease-and-Desist Policy
If a government agency or data custodian believes PermitVector is accessing data in a manner inconsistent with applicable law or their terms of service, we will respond promptly and in good faith. Contact: hello@permitvector.com. We have not received any cease-and-desist or removal demand to date.
Subscriber Compliance Responsibilities
PermitVector provides data. How subscribers use that data to contact contractors, property owners, or permit holders is the subscriber’s sole legal responsibility. Subscribers must comply with:
- TCPA (Telephone Consumer Protection Act) — restrictions on autodialed calls and texts, prerecorded messages, and fax marketing.
- CAN-SPAM Act — requirements for commercial email, including opt-out mechanisms and sender identification.
- National Do-Not-Call Registry and applicable state do-not-call laws.
- Any other federal, state, or local laws governing commercial outreach.
PermitVector does not review, approve, or monitor subscriber outreach campaigns. PermitVector recommends email-first outreach. Cold autodialed or robotexted campaigns to numbers sourced from permit records carry significant TCPA exposure; subscribers should consult legal counsel before deploying such campaigns.
9. About the Data Team
PermitVector is an independent, owner-operated permit-intelligence company. It was built to solve a specific sourcing problem: contractors in high-growth markets spend significant time identifying which jobs are starting, who pulled the permit, and which adjacent trades will be needed next. PermitVector automates that intelligence layer using public-record data and rule-based classification, without relying on proprietary databases, third-party data brokers, or unverifiable enrichment sources. All methodology decisions (source selection, classification logic, adjacent-buyer mapping, and accuracy disclosure) are made in-house, and all correction requests are handled by the PermitVector team directly. Questions about this methodology page can be directed to hello@permitvector.com.