When a visitor verifies their email or phone, we send a POST with a JSON body to any
HTTPS URL you configure. That's what powers the
Zapier integration, and it works just as well
pointed at Make, n8n, Pipedream, or an endpoint you wrote yourself.
When we send it
One request per lead, per integration, after the visitor verifies their email address or phone number.
Example payload
This is generated live from the same code that builds real deliveries, so it's always current.
A test event looks identical except that test is true.
{
"id": "314a99e6-a5c0-4a33-bb6a-964dffb0cd63",
"event": "lead.verified",
"version": "2026-08-11",
"occurred_at": "2026-08-12T14:23:38Z",
"test": true,
"account": {
"id": 42,
"name": "Green Valley Landscaping"
},
"lead": {
"id": "c9ee12aa-f8c8-4eda-84c2-21d8f4058d4a",
"email": "homeowner@example.com",
"phone": "+19135551234",
"verified_channel": "email",
"verified_at": "2026-08-12T14:23:38Z",
"address": "123 Sample Street, Lawrence, KS 66044",
"latitude": 38.9717,
"longitude": -95.2353,
"in_service_area": true,
"service_area": "Front Yard",
"source": "widget",
"source_page_url": "https://example.com/services/landscape-design",
"style": "Modern Prairie",
"budget": "$10,000 - $25,000",
"goals": "Curb appeal, Low maintenance",
"goals_list": [
"Curb appeal",
"Low maintenance"
],
"features": "Paver walkway, Landscape lighting",
"features_list": [
"Paver walkway",
"Landscape lighting"
],
"recommended_features": "Native bed conversion",
"recommended_features_list": [
"Native bed conversion"
],
"feedback": "Would love more color in spring.",
"highlights": "Strong entry framing; Layered plantings",
"considerations": "Irrigation for the new bed"
},
"media": {
"before_photo_url": "https://curbsight.ai/assets/sample_design_concept.jpg",
"concept_image_url": "https://curbsight.ai/assets/sample_design_concept.jpg",
"design_vision_pdf_url": "https://curbsight.ai/assets/sample_design_concept.jpg",
"design_vision_pdf_status": "ready",
"design_vision_download_url": "https://curbsight.ai/d/sample1234"
}
}
Fields
A key is never omitted — if we don't have a value it arrives as null.
That's deliberate: tools like Zapier build their field list from the first payload they see, so a
disappearing key would become permanently unmappable.
Top level
| Field | Notes |
|---|---|
id | Unique per delivery. Use this to guard against duplicates. |
event | Always lead.verified today. |
version | Payload version. We add fields freely; we don't rename or remove without bumping this. |
occurred_at | When the lead verified, ISO 8601 UTC. Order on this, not on arrival time. |
test | true for a Send test event delivery, false for a real lead. |
account | Your CurbSight account id and business name. |
lead
| Field | Notes |
|---|---|
id | Stable id for this lead. The same lead always has the same one. |
email, phone | Whichever they gave. The one they confirmed is named by verified_channel. |
verified_channel | email or sms. |
verified_at | ISO 8601 UTC. |
address | The property address they typed, as typed. |
latitude, longitude | Numbers, not strings. null if we couldn't geocode. |
in_service_area | Boolean — whether the address falls inside the work radius on your Fern. |
service_area | The Fern location they chose, e.g. Front Yard. |
source | widget if they started from the launcher on your site, hosted from a direct link. |
source_page_url | The page of yours they were on. null for hosted chats. |
style, budget | What they picked, as text. |
goals, features, recommended_features | Comma-separated strings. Use these in Zapier. |
goals_list, features_list, recommended_features_list | The same values as arrays, for tools that handle them properly. |
feedback | Anything they typed in their own words. Truncated at 2,000 characters. |
highlights, considerations | Notes from the design critique, joined with semicolons. |
media
| Field | Notes |
|---|---|
before_photo_url | The photo the visitor uploaded, if any. |
concept_image_url | The generated design concept. |
design_vision_pdf_url | The full Design Vision booklet. null when it isn't available for this lead. |
design_vision_pdf_status | ready or unavailable — check this before relying on the URL. |
design_vision_download_url | A short link to the booklet, good for 30 days. |
Image and PDF links are unguessable but not password-protected, so treat them as sensitive — anyone with the link can open them. They don't expire.
Headers
| Header | Value |
|---|---|
Content-Type | application/json; charset=utf-8 |
User-Agent | CurbSight-Webhooks/1.0 (+https://curbsight.ai/docs/webhooks) |
X-Curbsight-Event | The event name, e.g. lead.verified. |
X-Curbsight-Request-Id | Matches the body's id. Stable across retries of the same delivery. |
X-Curbsight-Attempt | Which attempt this is, 1 through 6. |
Zapier's Catch Hook can't map headers, which is why id, event,
version, test, and occurred_at also appear in the body.
How to respond
Return any 2xx and we consider it delivered. We don't read the response body beyond
logging a short excerpt for you to inspect.
2xx— success.408,425,429,5xx, timeouts, connection errors — we retry, up to six attempts over roughly seven hours.429honours yourRetry-Afterheader if it's an hour or less.- Everything else, including
3xxand other4xx— permanent failure, no retry.
We follow no redirects. If your URL redirects, configure the final destination directly. Five consecutive failed leads will pause the integration and tell you why.
Endpoint requirements
- Must be
https://on the standard port. - Must resolve to a public address — we reject anything pointing at private or internal networks.
- No credentials embedded in the URL.
- Answer within 10 seconds. If you need to do slow work, acknowledge first and process afterwards.
We check these when you save the integration and again on every delivery, so a URL that changes where it points later will be caught rather than trusted.