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 URL | https://coverage.roofignite.com/api/pingPing/post accounts only. No personal data. |
|---|---|
| Post URL | https://coverage.roofignite.com/api/lead |
| Method and format | POST, JSON or form-encoded |
| Authentication | publisher_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=49503covered 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 post | Check 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/post | Ping 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
- Add
test=1(orlp_action=test) to the ping and the post. New keys also start in test mode until we switch them on. Test leads get every check and a real response, but are never delivered or paid. - Sandbox, no key and nothing stored:
https://coverage.roofignite.com/api/sandbox/pingandhttps://coverage.roofignite.com/api/sandbox/post. ZIPs starting with 9 come back not covered, ZIPs ending in 0 come back with no capacity, and a post in a ZIP ending in 7 comes back as a duplicate. - Use a real TrustedForm certificate from your own test form, since we retain it and flag any that fail.
- Before we switch you on, send three test posts: a covered ZIP (accepted), an uncovered ZIP (refused), and the covered one again (duplicate).
Parameters
| Parameter | Ping | Post | Valid values |
|---|---|---|---|
publisher_key | Yes | Yes | Your key |
bid_id | No | Ping/post only | The bid_id from the ping response |
test | No | No | 1 = test lead |
zip (or zip_code) | Yes | Yes | 5 digits. Must match between ping and post. |
home_owner (or own_home) | Recommended | Yes | Yes. Renters are not accepted. |
project_type (or service_needed) | Recommended | Recommended | Replace, Repair, Install, Unsure |
property_type (or home_type) | No | Recommended | Single-family home, Townhouse, Mobile home, Commercial |
roof_age | No | Recommended | Under 10 years, 10 - 15 years, Over 15 years, Unsure |
time_frame (or timeline) | No | Recommended | ASAP, Within 1 Week, Within 2 Weeks, Within A Month, Flexible |
phone_sha256 | No | No | SHA-256 of the 10-digit phone, so we can flag a duplicate before you post |
first_name | Never | Yes | Homeowner's first name |
last_name | Never | Recommended | Homeowner's last name |
phone | Never | Yes | 10 digits. Example: 6165551234. +1 and punctuation are stripped. |
email | Never | Yes | Valid email |
address, city, state | Never | Recommended | Street address, city, 2-letter state |
trustedform_cert_url | No | Yes | https://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) | No | Yes | The exact consent wording the homeowner agreed to. It must name Vetted Home Pros. |
landing_page_url | No | Yes | The page where the homeowner consented, with https:// |
ip_address | No | Yes | Homeowner's IP at submission |
user_agent | No | Recommended | Homeowner's browser at submission |
contractor_factor | No | Optional | Affordability, Reviews, Project Time, Warranty / Guarantees |
roof_material, stories, home_size, roof_condition, roof_style | No | Optional | Free text if your form asks them; passed to the contractor |
utm_source, utm_campaign | No | Optional | Your tracking values, echoed back in reporting |
lead_submitted_at | No | Recommended | Time 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.
| error | Meaning |
|---|---|
| invalid_lead | A required field is missing or malformed. problems lists which. |
| zip_not_covered, zip_not_accepting | No contractor can take a lead in that ZIP right now |
| zip_not_priority, zip_not_in_your_list | Your account is limited to Priority ZIPs or to a ZIP list, and this ZIP is outside it |
| duplicate | We received this phone or email in the last 30 days |
| daily_cap_reached | Your daily cap is full |
| bid_expired, bid_used, bid_unknown, bid_was_pass, bid_lead_mismatch, bid_required | Ping/post: the bid is missing, too old, already used, or does not match the lead |
| consent_not_approved | The consent text does not name Vetted Home Pros |
| bad_key, publisher_not_active | Key not recognised, or your account is not switched on |
Lead Prosper and similar platforms
| Ping accepted when | ok is true and bid is above 0 |
|---|---|
| Price field | bid |
| Ping ID field | bid_id, sent back in the post as bid_id |
| Post accepted when | status is accepted |
| Timeout | 5 seconds is plenty. We answer in about 300 ms; treat a 503 as a retry, not a pass. |
Before your first live lead
- A signed agreement with Roof Ignite Ltd that sets your price, daily cap and any ZIP list.
- Our attorney's approval of the consent wording and page you will send from. The consent must name Vetted Home Pros, cover the roofing contractors our partners match the homeowner with, and cover calls and texts including automated ones.
- A TrustedForm certificate on every lead. Your own traffic only: no brokered, co-registration, incentivized or aged leads.
- The consent states that it is not a condition of purchase. Your counsel signs off on your page; ours signs off on ours.
- Post each lead within seconds of the form submit, not in batches. We accept posts 24/7, and your daily cap and ZIP list are enforced automatically.
- Homeowners are contacted only about their roofing request. Neither side calls a delivered homeowner to ask which company came out.
- Returns within 3 business days for a disconnected or wrong number, wrong person, duplicate, renter, outside your ZIP list, or not a roofing inquiry. Could not reach, changed mind, already hired and price shopping are not returnable.
- Three passing test leads, and your invoicing contact and our reporting contact exchanged.