coverage.roofignite.com / publishers

Posting Spec: Roofing Leads

For companies selling roofing leads to Vetted Home Pros (operated by Roof Ignite Ltd). Version 2.0, October 8, 2026. Questions: info@roofignite.com.

Endpoints

Ping URLhttps://coverage.roofignite.com/api/ping
Ping/post accounts only. No personal data.
Post URLhttps://coverage.roofignite.com/api/lead
Method and formatPOST, JSON or form-encoded
Authenticationpublisher_key in the body, or the header X-Publisher-Key. We send your key separately.
ZIP check (optional)GET https://coverage.roofignite.com/api/coverage?action=check&zip=49503
covered means a contractor serves the ZIP; accepting means one can take a lead right now. priority marks ZIPs where contractors are short of leads (also a CSV on the coverage page, refreshed hourly). Up to 200 ZIPs per call with POST /api/coverage and {"action":"bulk","zips":[...]}. No key, 120 requests per minute. Never send homeowner data here.

Two ways to sell

Direct postCheck the ZIP, then post the lead to the Post URL. We pay the fixed price in your agreement. If you are not sure which one you are on, it is this one. If your account is Priority only, post only ZIPs where priority is true.
Ping/postPing first. We answer with a bid in about 300 ms. If you take it, post the full lead with the bid_id within 90 seconds and we pay that bid.

Test leads

Parameters

ParameterPingPostValid values
publisher_keyYesYesYour key
bid_idNoPing/post onlyThe bid_id from the ping response
testNoNo1 = test lead
zip (or zip_code)YesYes5 digits. Must match between ping and post.
home_owner (or own_home)RecommendedYesYes. Renters are not accepted.
project_type (or service_needed)RecommendedRecommendedReplace, Repair, Install, Unsure
property_type (or home_type)NoRecommendedSingle-family home, Townhouse, Mobile home, Commercial
roof_ageNoRecommendedUnder 10 years, 10 - 15 years, Over 15 years, Unsure
time_frame (or timeline)NoRecommendedASAP, Within 1 Week, Within 2 Weeks, Within A Month, Flexible
phone_sha256NoNoSHA-256 of the 10-digit phone, so we can flag a duplicate before you post
first_nameNeverYesHomeowner's first name
last_nameNeverRecommendedHomeowner's last name
phoneNeverYes10 digits. Example: 6165551234. +1 and punctuation are stripped.
emailNeverYesValid email
address, city, stateNeverRecommendedStreet address, city, 2-letter state
trustedform_cert_urlNoYeshttps://cert.trustedform.com/ followed by the 40-character certificate ID. Required on every lead. The homeowner's phone or email must be on the certificate.
consent_text (or tcpa_text)NoYesThe exact consent wording the homeowner agreed to. It must name Vetted Home Pros.
landing_page_urlNoYesThe page where the homeowner consented, with https://
ip_addressNoYesHomeowner's IP at submission
user_agentNoRecommendedHomeowner's browser at submission
contractor_factorNoOptionalAffordability, Reviews, Project Time, Warranty / Guarantees
roof_material, stories, home_size, roof_condition, roof_styleNoOptionalFree text if your form asks them; passed to the contractor
utm_source, utm_campaignNoOptionalYour tracking values, echoed back in reporting
lead_submitted_atNoRecommendedTime of submission, ISO 8601. Example: 2026-10-08T14:02:11Z

Values are not case-sensitive and common synonyms are mapped. Send every question your form asks, under the closest name above; extra fields under any lower-case name are kept. A key whose leads arrive with fewer fields than its form collects is paused until fixed, and those leads can be returned as not as specified.

Example requests

Ping body (send to the Ping URL):

{ "publisher_key": "pk_yourkey", "zip": "49503", "home_owner": "Yes", "project_type": "Replace",
  "property_type": "Single-family home", "roof_age": "Over 15 years", "time_frame": "Within A Month" }

Post body (send to the Post URL; leave out bid_id on Direct post):

{ "publisher_key": "pk_yourkey", "bid_id": "bid_3f9c...",
  "first_name": "Jane", "last_name": "Doe", "phone": "6165551234", "email": "jane@example.com",
  "address": "12 Oak St", "city": "Grand Rapids", "state": "MI", "zip": "49503",
  "home_owner": "Yes", "project_type": "Replace", "property_type": "Single-family home",
  "roof_age": "Over 15 years", "time_frame": "Within A Month",
  "trustedform_cert_url": "https://cert.trustedform.com/9f1c...e2a7",
  "consent_text": "By clicking Get My Quote, I agree that Vetted Home Pros and ...",
  "landing_page_url": "https://yoursite.com/roofing-quote", "ip_address": "73.12.44.9",
  "user_agent": "Mozilla/5.0 ...", "lead_submitted_at": "2026-10-08T14:02:11Z" }

Ping response

Bid:

{ "ok": true, "bid_id": "bid_3f9c...", "bid": 72, "currency": "USD", "expires_at": "2026-10-08T19:41:29Z", "reason": null }

In this example we pay $72 if you post the lead before expires_at. If the response says "mode": "shadow", the bid is for information only and you are paid your agreed fixed price.

Pass: "bid": 0 with a reason: zip_not_covered, no_capacity, zip_not_in_your_list, zip_not_priority, daily_cap_reached, duplicate, blocked_by_rule, below_min_bid, bidding_off.

Post response

Accepted:

{ "ok": true, "status": "accepted", "lead_id": "ing_5f3a...", "price": 72, "test": false, "zip": "49503",
  "received_at": "2026-10-08T14:02:12Z", "trustedform": "queued" }

price appears on ping/post leads. Direct post leads are paid at your agreed price.

Refused: "ok": false with an error. A refused lead is not paid and you may sell it elsewhere. Do not retry a refusal. Retry a 503 once after 60 seconds.

errorMeaning
invalid_leadA required field is missing or malformed. problems lists which.
zip_not_covered, zip_not_acceptingNo contractor can take a lead in that ZIP right now
zip_not_priority, zip_not_in_your_listYour account is limited to Priority ZIPs or to a ZIP list, and this ZIP is outside it
duplicateWe received this phone or email in the last 30 days
daily_cap_reachedYour daily cap is full
bid_expired, bid_used, bid_unknown, bid_was_pass, bid_lead_mismatch, bid_requiredPing/post: the bid is missing, too old, already used, or does not match the lead
consent_not_approvedThe consent text does not name Vetted Home Pros
bad_key, publisher_not_activeKey not recognised, or your account is not switched on

Lead Prosper and similar platforms

Ping accepted whenok is true and bid is above 0
Price fieldbid
Ping ID fieldbid_id, sent back in the post as bid_id
Post accepted whenstatus is accepted
Timeout5 seconds is plenty. We answer in about 300 ms; treat a 503 as a retry, not a pass.

Before your first live lead