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.

  1. 01 Address on the form
  2. 02 Geography (usually a ZIP)
  3. 03 Home value · owners · income

Neighborhood card

address → geography → housing

GET /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.

02

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 CRMSpeck fieldHow a closer uses it
si_home_valuehousing.median_home_valueTicket-size band. High-value ZIP → premium system / full roof.
si_owner_pcthousing.owner_occupied_pctRenter-heavy ZIP → confirm occupancy before a site visit.
si_incomeincome.median_householdFinancing vs cash pitch.
si_renthousing.median_gross_rentIf 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.

03

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,
})
  1. 01 Trigger: new lead in JobNimbus, AccuLynx, ServiceTitan, or HubSpot
  2. 02 Build one address string — street, city, ST ZIP
  3. 03 GET /api/v1/demographics?address=
  4. 04 Map the four fields
  5. 05 If demographics is null, leave fields empty and read notes
  6. 06 4xx / 5xx do not count against quota
04

Who this is for

Three trades. One lookup. Rank before you drive.

  1. Solar

    Site survey after the ZIP

    Address is already in the design tool. Home value and owner share before you drop a site survey.

  2. Roofing

    Rank the storm list

    Storm week dumps 400 leads. Rank by owner ZIP and value so the first 40 visits are not renters.

  3. Insurance

    Quote desk, not underwriting

    ZIP is already on the application. Income and home value for the quote desk — not for eligibility or premium.

05

The spec

Median home value by address. Owner occupancy by ZIP. ACS in one GET.

InputU.S. street address, or ZIP, or lat/lng
OutputGeography plus ACS 2023 demographics
HousingUnits, owner occupancy, median value, median rent
IncomeMedian household, per capita, poverty
LaborLabor force, unemployment
Not thisParcel ownership, owner name, credit, or the house itself
Price$49 / month for 25,000 lookups · 7-day trial · 1,000 calls
06

Questions

Area ACS for routing and pitch. Not a credit file, not a consumer report.

  1. House

    Is 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.

  2. Own

    Can you tell me if they own?

    No. owner_occupied_pct is the share of occupied units in that area that are owner-occupied. Ask on the call.

  3. ZIP

    We 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.

  4. Quota

    Does a cache hit count?

    Yes. Successful 2xx counts, including cache. Errors do not. Over quota is 429, no surprise overage.

  5. Credit

    Can 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.

07

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.