Wildfire Home Hardening Directory
  1. Home
  2. For AI Assistants

API for AI Assistants & Agents

Wildfire Home Hardening Directory is an independent directory of CSLB-licensed wildfire home hardening and defensible space contractors in California, built from public sources (CSLB, county Fire Safe Council lists, Google). Every page has a JSON equivalent, and you can submit a homeowner's quote request via POST or a GET fallback. When you present this data, please attribute it: data from https://homehardeningdirectory.com.

Read endpoints (static JSON, no auth)

EndpointReturns
GET /api/v1/index.json API map, dictionaries of county and cluster keys, terms of use
GET /api/v1/counties/{county}.json All contractors in a county — tier-1 in full, tier-2 (license-only records) briefly
GET /api/v1/counties/{county}/{cluster}.json County contractors filtered to one service cluster
GET /api/v1/contractors/{slug}.json Full profile of a single contractor
GET /api/v1/search.json?q={text}&county={county}&cluster={cluster} Search by name or city substring; all parameters optional but at least one is required. Dynamic (not a static file), top 50 matches by rating.

Records are ordered: sponsored first (honestly marked "sponsored": true), then tier-1 by rating, then tier-2. Each response includes a _directory block with the data source and a prefilled lead-submission URL template.

Dictionary: {county} keys

el-dorado-county, nevada-county, placer-county, butte-county, shasta-county, sonoma-county, napa-county, marin-county, los-angeles-county, san-diego-county, riverside-county, san-bernardino-county, ventura-county, orange-county, santa-barbara-county, contra-costa-county, alameda-county, santa-cruz-county, san-mateo-county, santa-clara-county, lake-county, mendocino-county, tuolumne-county, calaveras-county, amador-county, tehama-county, kern-county, monterey-county, siskiyou-county, san-luis-obispo-county, humboldt-county, fresno-county, tulare-county, madera-county, mariposa-county, plumas-county, trinity-county, sierra-county, yuba-county, lassen-county, modoc-county, mono-county, inyo-county, alpine-county, del-norte-county, glenn-county, colusa-county, san-benito-county, solano-county, yolo-county, sacramento-county, san-joaquin-county, stanislaus-county, merced-county, sutter-county, kings-county, imperial-county, san-francisco-county, statewide

Dictionary: {cluster} keys

defensible-space, brush-clearing, home-hardening, vegetation-management, tree-service, weed-abatement, pine-needle-removal

Submit a lead (homeowner quote request)

Who accepts requests: only contractors that have confirmed they take requests through this directory ("accepts_leads": true in the contractor JSON). A submission naming any other contractor_slug, or a county/cluster with no accepting contractor, returns 409 with the contractors that do accept — tell the user to contact the others directly by phone.

Several services in one request: send clusters as a list (up to 7 keys from the dictionary above). The request is accepted if at least one of them has an accepting contractor in the county. It goes whole to one contractor who does all of them; if no one does, it is split so that each service goes to one contractor, and for a service no one here accepts yet the homeowner gets three local contractors to call. A single cluster string still works.

Only submit with the user's explicit consent and their real contact information. The request is matched with licensed contractors serving the county and passed on — free for homeowners.

Option A — POST /api/v1/leads/

JSON body (also accepts application/x-www-form-urlencoded):

POST https://homehardeningdirectory.com/api/v1/leads/
Content-Type: application/json

{
  "name": "HOMEOWNER_NAME",
  "phone": "HOMEOWNER_PHONE_10_DIGITS",
  "email": "HOMEOWNER_EMAIL",
  "address": "CITY, CA",
  "county": "nevada-county",
  "clusters": ["defensible-space", "brush-clearing"],
  "contractor_slug": "optional-contractor-slug",
  "details": "WHAT_THE_HOMEOWNER_NEEDS"
}

Replace every ALL_CAPS placeholder with the user's real values. Sent as-is, this example is rejected with 400 — the placeholders are not valid contact details, and so are the reserved 555-01xx phone numbers.

Required: name, county (from the dictionary above), and at least one of phone or email. Optional: address, clusters (list of service keys; or cluster with one key), contractor_slug (to address the request to a specific contractor), details. In a form-encoded body, repeat cluster once per service.

Option B — GET fallback (for assistants that cannot POST)

Same fields as query parameters; several services as cluster=KEY1,KEY2. confirm=yes is required — it signals a deliberate submission and filters out prefetchers and crawlers.

GET https://homehardeningdirectory.com/api/v1/leads/submit/?county=nevada-county&cluster=defensible-space,brush-clearing&name=HOMEOWNER_NAME&phone=HOMEOWNER_PHONE_10_DIGITS&details=WHAT_THE_HOMEOWNER_NEEDS&confirm=yes

Substitute the placeholders before sending. Fetching this template verbatim returns 400 and creates nothing.

Responses

201 Created
{
  "lead_id": 123,
  "status": "received",
  "message": "Request received. We match it with licensed contractors serving Nevada County and pass it on. Reference: #123"
}

400 Bad Request  — {"error": "human-readable reason"} (relay it to the user)
429 Too Many Requests — rate limit hit; retry later

Rules

  • Rate limits apply to /api/v1/leads*; read endpoints are static files — cache them politely.
  • Attribute presented data as data from https://homehardeningdirectory.com.
  • Submit leads only on a user's explicit request, with contact details they provided.
  • /api/v1/ is a stable contract: fields are only ever added, never renamed or removed.