Building permit leads in Clay for $8 per 1,000

A newly issued building permit is a dated, addressed buying signal: a roof is coming off, a kitchen is going in, a building is going up. This recipe puts new permits from 16 US cities into a Clay table with Clay's native Run Apify Actor action, then turns contractor names into decision makers with Clay's own enrichment providers.

$0.008 per permit$0.02 per runNo subscriptionBilled to your own Apify account16 cities

What you are building

One Clay table that fills itself with permits issued since the last run, one row per permit, with the address, work description, valuation and the contractor on the job. Each run returns only permits you have not received before, so re-running it every morning never charges you twice for the same permit. 1,000 permits cost $8.00 plus a $0.02 start fee per run.

The data comes from US Building Permits API (make_no_mistakes/us-building-permits-scraper on Apify), which reads each city's official open-data portal and normalizes all 16 onto one schema.

Step by step

1. Create an Apify account and copy your API token

  1. Sign up at apify.com. The free plan includes a small monthly platform credit, enough to test this recipe on a few hundred permits.
  2. In Apify Console, open Settings → API & Integrations and copy your Personal API token.
  3. Open the actor page once and run it from the browser with the default input (Austin, last 7 days, 100 permits, about $0.82). That confirms the account works before Clay is involved.
  4. Set a sensible Maximum cost per run on the actor. It must be at least $0.02 + $0.008 × the permits you expect, about $4.02 for 500. If it is lower, the run stops early and its status line says so.

2. Connect Apify in Clay

  1. In Clay, go to Settings → Connections → Add Connection, choose Apify, paste the token and give the connection a name. (You can also do this the first time you add an Apify column; Clay prompts you to Add account.)
  2. Runs started from Clay use your own Apify account, so the per-permit charge lands on your Apify bill. Clay may still count the action against your Clay plan, depending on how your plan meters integrations.

3. Make a small control table: one row per feed

Create a table called Permit feeds with three text columns and one row per city group you want to watch:

CityKeywordsDelta store
austinroof, solar, hvacclay-austin
raleighroof, solar, hvacclay-raleigh
nashvillenewclay-nashville

Each row is one independent daily feed. The Delta store name is what lets the actor remember what it already sent you for that row, so give every row its own.

4. Add the Run Apify Actor column

  1. In the control table, click + Add, search for Apify and choose Run Apify Actor.
  2. Pick your Apify connection and the actor make_no_mistakes/us-building-permits-scraper.
  3. Paste the input below. Keys stay in quotes. Where you see a column name, insert that column's token with / and do not put quotes around the token itself; Clay fills in the value per row.
{
  "cities": [ /City ],
  "daysBack": 3,
  "maxItems": 500,
  "permitTypes": /Keywords,
  "onlyNewSinceLastRun": true,
  "deltaStateName": /Delta store
}

If you would rather not use tokens, these are the complete inputs for the two most common feeds, ready to paste as-is. Both validate against the actor's published input schema.

Dialable contractor leads (Austin and Raleigh only). These are the only two of the 16 cities that publish contractor phone numbers (about 92% and 80% of rows). contractorPhoneOnly drops phone-less permits before they are written, so you are never charged for them.

{
  "cities": ["austin", "raleigh"],
  "daysBack": 3,
  "maxItems": 500,
  "permitTypes": "roof, solar, hvac",
  "contractorPhoneOnly": true,
  "onlyNewSinceLastRun": true,
  "deltaStateName": "clay-austin-raleigh-phones"
}

Everything new in a set of cities (no phone filter). Leave contractorPhoneOnly off for the other 14 cities: with it on they return nothing, because their feeds have no phone column.

{
  "cities": ["chicago", "nashville", "denver", "cincinnati"],
  "daysBack": 3,
  "maxItems": 500,
  "onlyNewSinceLastRun": true,
  "deltaStateName": "clay-midwest-south-feed"
}
Why daysBack: 3 with delta mode on: the window is only an upper bound on what gets fetched. Delta mode drops every permit already delivered under that store name before it is written and charged, and it re-checks a 3-day tail on every run to catch permits cities back-fill late. The first run returns the whole window; after that, a quiet day costs $0.02. maxItems caps one run, not the feed: anything over 500 is still new to you and comes on the next run.

5. Run it daily

6. Fan the permits out into a Permits table

The Apify column returns the run's dataset, a list of permits, into one cell. Click into that cell to see the items, then use Clay's Write to Table to send each list item to a second table, Permits, as its own row. Map the fields like this:

Actor fieldClay columnTypeNotes
permit_numberPermit #TextNot unique on its own. Dedupe on Permit # + Permit type + Address for one row per trade.
cityCityText"Austin, TX" style.
issued_dateIssuedDateAll date filters run on this field.
permit_type, permit_classPermit type, ClassTextCity vocabulary, not standardized across cities.
work_descriptionScopeLong textFree text. Thin in DC and Louisville.
address, zipAddress, ZIPTextDenver publishes no ZIP.
lat, lngLat, LngNumberAbout 56% in Austin, 95% or more elsewhere.
valuationJob valueCurrencyNull in DC and Philadelphia. Zero on some trade permits.
contractor_nameContractorTextStart of the enrichment waterfall below. Not published in LA, Seattle, San Francisco.
contractor_phoneContractor phonePhoneAustin and Raleigh only.
owner_nameOwnerTextMostly NYC, Chicago, DC, Baton Rouge, Raleigh. Often an LLC.
status, applied_dateStatus, AppliedText, DateApplied date is missing in a few cities.
source_urlCity recordURLLink to the official city record where one exists.
raw(optional) RawJSONThe untouched city record, for any field we do not normalize.

Which cities to target

Counts are real permits per week for the week ending 2026-08-31, after administrative records (garage sales, tent permits and similar) are dropped. Use the slug in cities.

CitySlugPermits/weekLagContractor nameContractor phone
New York, NYnew-york~3,600same day100%no
Los Angeles, CAlos-angeles~2,7501-2 daysnot publishedno
Austin, TXaustin~1,150same day94%yes, ~92%
San Antonio, TXsan-antonio~1,0702-4 days98%no
Washington, DCwashington-dc~9203-5 days55% (applicant)no
Chicago, ILchicago~730same day98%no
Boston, MAboston~650same day, pauses95%no
Philadelphia, PAphiladelphia~470same day87%no
San Francisco, CAsan-francisco~380same daynot publishedno
Louisville, KYlouisville~2850-1 day11%no
Nashville, TNnashville~2051-2 days100% (applicant)no
Cincinnati, OHcincinnati~2001-3 days99%no
Baton Rouge, LAbaton-rouge~1601-3 days, pauses100%no
Denver, COdenver~1202-3 days97%no
Raleigh, NCraleigh~1003-5 days89%yes, ~80%
Seattle, WAseattle~801-3 daysnot publishedno

For contractor outreach, start with the cities that name the contractor on nearly every permit: Austin, San Antonio, New York, Chicago, Cincinnati, Baton Rouge, Denver, Nashville and Raleigh. For homeowner-side signals (where work is happening, at what value), Los Angeles, San Francisco and Seattle still work, but there is no contractor to enrich.

Enrichment waterfall ideas

All of these run on Clay's own providers in the Permits table. We do not supply contact data; the permit is the trigger, Clay does the rest.

Contractor to decision maker

  1. Clean the name. A formula column that strips suffixes like "INC", "LLC" and "(RAMCO)" from contractor_name gives better matches.
  2. Company domain. Run Clay's company-name-to-domain enrichment on the cleaned name, with the city as a hint. A Google search column on "name + city" is a cheap fallback for small contractors.
  3. Decision maker. Find People at the company, filtered to titles like Owner, President, Founder, General Manager, Operations Manager.
  4. Contact. Clay's work-email waterfall on the person. For Austin and Raleigh you already have the company phone from the permit.
  5. Roll up before you send. Group by contractor so a roofer with 14 permits this week gets one message about all 14, not 14 messages.

Other plays that work with these fields

If you call or text from these lists, the usual rules still apply: check numbers against the Do Not Call registry, and keep to business contacts. We deliberately do not publish homeowner phone numbers or emails.

Honest comparison with Shovels

Shovels is the permit data provider most GTM teams use inside Clay, connected through Clay's HTTP API column. It is a stronger product in several ways, and you should know which before you pick.

This recipeShovels
Coverage16 city portals, about 13,000 permits a weekNational. Thousands of jurisdictions; they cite 170 million permits and 3 million contractors
Price$0.008 per permit + $0.02 per run, no subscription. 25,000 permits is about $200Free tier: 500 credits a month. Basic: $599 a month for 25,000 credits. Pro: $999 a month for 50,000
HistoryYears back in most cities; Raleigh only the last 180 daysFull history on paid plans
FreshnessRe-read from the city on every run; cities post same day to 5 days after issue (table above)Varies by jurisdiction; see their coverage dashboard
Permit categoriesCity wording plus a keyword filterStandardized tags (roofing, solar, HVAC and more) across every jurisdiction
Contractor dataName on the permit; phone in Austin and Raleigh onlyResolved contractor profiles with permit counts, inspection pass rates and project durations
Homeowner / resident dataNo. Owner name only where the city publishes itResident lookups on paid plans
Paying only for new recordsBuilt-in delta mode: already-delivered permits are skipped and not chargedYou filter by date in each request
Clay connectionNative Run Apify Actor action, your own Apify accountHTTP API column with your Shovels key

Pick Shovels if your clients are outside these 16 cities, if you need standardized permit categories across markets, contractor-level history and quality metrics, or resident data. Pick this recipe if your clients are in these cities, you mostly need fresh permits and the contractor's name, and you would rather pay about $8 per 1,000 permits than a monthly subscription. Shovels pricing is from shovels.ai/pricing, checked October 3, 2026.

Want to try it on a real client first?

If you run outbound for a home-services, construction, solar or real-estate client in one of these 16 cities, email hello@makenomistakesllc.com with the city and the trade. We will send four weekly permit files for that city free, in the same columns as above, so you can test the list before wiring up Clay.