- Online
- API
- EDL (Enterprise Data License)
Introduction
This month marks a pivotal moment in our mission: we’ve begun bridging the gap between online and offline permit data. For the first time, we’re bringing dark data into the light, accessing jurisdictions that have never made their records digitally available. Combined with significant growth across our platform, October’s release represents our most comprehensive coverage to date.🚀 What’s New
Bridging the Digital Divide: Offline Jurisdictions Brought Online- 500K+ Records
- First-ever offline permit acquisition from Cook County, IL and Oak Ridge North, TX
📊 Data Growth
Total Records- 185M (+10M new permit records added - historical and newly filed)
- Permits filed in September: 80K
- Permits filed in 2025 year-to-date: 4.5M
👷 Contractor Intelligence
New contractors added to our database- 190K contractors - Expanding your universe of potential partners and competitors
- New license records: 70K
- New contractor phone numbers: 200K+
- New contractor email addresses: 100K+
- Online
- API
- EDL (Enterprise Data License)
✨ New
- Total Records: 174 million (+700K from last month)
- New Permits from August: 162,281 - Our biggest monthly addition to date!
- Permits Transitioned to Finalized Status: 560K
- New Address Points: 450K with precise geo-coordinate mapping
- New Jurisdictions in Coverage: 119
🚀 Upgrades
- Enhanced Data Collection Methods: Improved fill rates across all data points
- Job Value Entries: 2.3M+ new entries added across permits for better cost estimation
- New Construction Permits: 55,000
- New HVAC Permits: 124,000
👷 Contractor Data Enhancements
- New Contractors Added: 13,000
- New License Records: 70,000
- New Phone Numbers: 8,000
- New Email Addresses: 30,000
- Online
- API
- EDL (Enterprise Data License)
✨ New
- Total new permits added: Over 3 million across all U.S. states.
- California: 2 million of these permits were added, making it our largest single-state update.
- 2025 permit count-to-date: 2.9 million (through July 15, 2025).
- Permits filed since June 1: Over 250,000, with 22,000 filed in July so far.
- Construction: 130,000
- Solar: 125,000
- EV chargers: 10,000
- New contractor phone numbers: Over 35,000 new primary phone numbers have been added.
🚀 Upgrades
- Continued improving contractor classification standardization. As a result, more contractors now have a Shovels-standard classification assigned to the
license_class
field.
- Online
- API
- EDL (Enterprise Data License)
🚀 Upgrades:
- Faster pagination, especially for deeper pages.
- More jurisdiction coverage.
- Online
- API
- EDL (Enterprise Data License)
🚀 Upgrades:
- Improved the Permit Search logic to always order resulting permits by newest first.
- Online
- API
- EDL (Enterprise Data License)
- Online
- API
- EDL (Enterprise Data License)
✨ New:
- Added Website Search filter options to Contractor Filters
- Added tooltips to the UI to better explain functionality
🚀 Upgrades:
- Added Search filter auto-caching to improve UX between page reloads and sessions
- Added new New User onboarding experience
- Adjusted datepicker widget for date range selection to monthly, which will improve usability
FINAL WARNING: As previously announced, the V1 of the Shovels API is now deprecated.
- Online
- API
- EDL (Enterprise Data License)
Breaking Changes Policies
Breaking Changes Policies
In order to ensure smooth transitions between updates, we’ve settled on a few short term policies.
- We will do our best to give as much advance warning on breaking changes as possible.
- Some recent breaking changes are delayed updates to the schema that should have been part of the V2 launch. We do not plan on making breaking changes this often.
- Where sensible and possible, we will provide backward compatibility for new endpoints, parameters, and schemas.
Address Coordinate Errors
Address Coordinate Errors
As described under EDL changes above, we found that there were rare cases where the latitude and longitude coordinates were reversed. Affected records have been corrected.We’ve also beefed up our address-geospatial processing to find and fix these errors going forward.
Effective Dates
Effective Dates
- Online: Monday, February 03, 2025.
- API: Monday, February 10, 2025.
- EDL: Wednesday, February 6, 2025.
- Online
- API
- EDL (Enterprise Data License)
Coverage Expansion
Coverage Expansion
These new permits will be available across the entire platform.
✨ New:
- +6M permits nationwide.
- +9 permit jurisdictions.
- Online
- API
- EDL (Enterprise Data License)
Schema Updates
Schema Updates
We made a number of additions to our datasets, including new columns. For breaking changes to casing, see “API” above.
New columns in the 'residents' table:
New columns in the 'residents' table:
personal_emails_validation_status
(string): The validation status of the associated personal email. ‘Valid’ indicates a validated email; null means unknown.personal_emails_last_seen
(date): The date of the last validation or verification attempt for the personal email. Null if unknown.business_email
(string): The primary business email observed for this person.business_email_validation_status
(string): Validation status of the business email. ‘Valid’ means the email was validated; null means unknown. May contain values like ‘Valid-ESP’ (validated by email service provider) or ‘Valid-Digital’ (validated by cookie/digital tag).business_email_last_seen
(date): The date of the last known validation or verification attempt of the business email. Null if unknown.linkedin_url
(string): URL of the person’s LinkedIn profile.homeowner
(string): Reports if the person in this record is a homeowner. Y and N are observed values, P represents that they are likely a homeowner, based on probabilistic modeling, and null values represent ‘unknown’.gender
(string): The person’s gender.age_range
(string): The person’s age mapped to standard demographic ranges.is_married
(boolean): Indicates if the person is married.has_children
(boolean): Indicates if the person has children.income_range
(string): The person’s income range.net_worth
(string): The person’s net worth, mapped to standard demographic ranges. Null if unknown.job_title
(string): The person’s job title.seniority_level
(string): The seniority level of the person’s role.department
(string): The department in which the person works.job_title_last_updated
(date): The last date the person’s job title was updated.last_updated
(date): The last date any value in this record was updated.work_history
(string, JSON): A JSON-formatted history of the person’s work experiences (e.g., company name, * position, duration, start/end time, job description, location, social_url).education_history
(string): The person’s education background.social_connections
(string): The number of social media connections the person has, provided in ranges (e.g., 1-9, 10-49, etc.).company_name
(string): The name of the company where the person works.company_domain
(string): The company’s domain.company_phone
(string): The company’s contact phone number.company_sic
(string): The Standard Industrial Classification (SIC) code(s) of the company, separated by semicolons if multiple.company_street_no
(string): The street number of the company’s address.company_street
(string): The street name of the company’s address.company_city
(string): The city in which the company is located.company_zip
(string): The company’s 5-digit ZIP code.company_state
(string): The uppercase state abbreviation for the company’s address.company_linkedin_url
(string): The URL of the company’s LinkedIn profile.company_revenue
(string): The company’s revenue, expressed in standard ranges.company_employee_count
(string): The number of observed US enterprise employees at the company, provided in * standard firmographic ranges.company_primary_industry
(string): The primary industry in which the company operates.company_description
(string): A description of the company’s business activities.company_naics
(string): The company’s North American Industry Classification System (NAICS) code(s).
New 'employees' table (connected to 'contractors'):
New 'employees' table (connected to 'contractors'):
contractor_id
(string)person_id
(string)name
(string)street_no
(string)street
(string)city
(string)zipcode
(string)zipcode_ext
(string)state
(string)phone
(string)email
(string)email_validation_status
(string)email_last_seen
(date)business_email
(string)business_email_validation_status
(string)business_email_last_seen
(date)linkedin_url
(string)homeowner
(string)gender
(string)age_range
(string)is_married
(boolean)has_children
(boolean)income_range
(string)net_worth
(string)job_title
(string)seniority_level
(string)department
(string)job_title_last_updated
(date)work_history
(string, JSON formatted)education_history
(string)