Home services · Address lookup
The address is already on the lead.
One GET from a U.S. street address returns ACS median home value, owner occupancy, income, and rent for that rooftop’s geography. Solar, roofing, HVAC, and insurance quote flows already have the input.
- 01 Address on the form
- 02 Geography (usually a ZIP)
- 03 Home value · owners · income
Neighborhood card
address → geography → housingGET /api/v1/demographics?address=412%20Maple%20Avenue%2C%20Naperville%2C%20IL%2060540
20 demo lookups per hour. U.S. street addresses resolve to a ZIP, city, or county.
Four fields. The rest is optional.
Your CRM already has name, phone, and address. Write these four onto the lead before the first call.
| Write to CRM | Speck field | How a closer uses it |
|---|---|---|
si_home_value | housing.median_home_value | Ticket-size band. High-value ZIP → premium system / full roof. |
si_owner_pct | housing.owner_occupied_pct | Renter-heavy ZIP → confirm occupancy before a site visit. |
si_income | income.median_household | Financing vs cash pitch. |
si_rent | housing.median_gross_rent | If owners are scarce, rent context explains why. |
score = (home_value_band * 0.40) + (owner_pct_band * 0.35) + (income_band * 0.25) Skip the visit if owner_pct < 40 and home_value is in the bottom fifth of your service area — unless they already said they own.
Area stats, not the parcel. A renter can live in an owner ZIP. A paid-off house can sit in a low-value ZIP. Confirm occupancy on the call.
New lead → Speck → CRM field
No GIS. No ACS variable codes. The address string you already store.
curl "https://speckinsights.netlify.app/api/v1/demographics?address=412%20Maple%20Avenue%2C%20Naperville%2C%20IL%2060540" \ -H "Authorization: Bearer sk_live_YOUR_KEY"
const url = new URL('https://speckinsights.netlify.app/api/v1/demographics')
url.searchParams.set('address', lead.street + ', ' + lead.city + ', ' + lead.state + ' ' + lead.zip)
const res = await fetch(url, {
headers: { Authorization: 'Bearer ' + process.env.SPECK_KEY }
})
const body = await res.json()
const d = body.demographics
await crm.update(lead.id, {
si_home_value: d?.housing.median_home_value ?? null,
si_owner_pct: d?.housing.owner_occupied_pct ?? null,
si_income: d?.income.median_household ?? null,
si_rent: d?.housing.median_gross_rent ?? null,
si_geo: body.resolution?.geography_id ?? null,
})- 01 Trigger: new lead in JobNimbus, AccuLynx, ServiceTitan, or HubSpot
- 02 Build one address string —
street, city, ST ZIP - 03
GET /api/v1/demographics?address= - 04 Map the four fields
- 05 If
demographicsisnull, leave fields empty and readnotes - 06 4xx / 5xx do not count against quota
Who this is for
Three trades. One lookup. Rank before you drive.
SolarSite survey after the ZIP
Address is already in the design tool. Home value and owner share before you drop a site survey.
RoofingRank the storm list
Storm week dumps 400 leads. Rank by owner ZIP and value so the first 40 visits are not renters.
InsuranceQuote desk, not underwriting
ZIP is already on the application. Income and home value for the quote desk — not for eligibility or premium.
The spec
Median home value by address. Owner occupancy by ZIP. ACS in one GET.
| Input | U.S. street address, or ZIP, or lat/lng |
|---|---|
| Output | Geography plus ACS 2023 demographics |
| Housing | Units, owner occupancy, median value, median rent |
| Income | Median household, per capita, poverty |
| Labor | Labor force, unemployment |
| Not this | Parcel ownership, owner name, credit, or the house itself |
| Price | $49 / month for 25,000 lookups · 7-day trial · 1,000 calls |
Questions
Area ACS for routing and pitch. Not a credit file, not a consumer report.
HouseIs this the value of the house?
No. Median home value for the Census geography around the address, usually a ZCTA. Use it to rank, not to bid.
OwnCan you tell me if they own?
No.
owner_occupied_pctis the share of occupied units in that area that are owner-occupied. Ask on the call.ZIPWe already have the ZIP. Why address?
Address geocodes to the rooftop’s geography when city boundaries are messy, or when the form ZIP is wrong. If you already trust the ZIP,
GET /api/v1/zip?zip=is enough.QuotaDoes a cache hit count?
Yes. Successful
2xxcounts, including cache. Errors do not. Over quota is429, no surprise overage.CreditCan we use this to decline financing?
No. This is area ACS for routing and pitch. It is not a credit file and not a consumer report.
1,000 lookups. 7 days.
Create a key, point it at the address field you already have. If the neighborhood card is not on the lead by Friday, you are not the customer.