Integrations · GoHighLevel
Storm leads in your GoHighLevel pipeline
Minutes after NOAA radar confirms hail in your territory, a new record appears in your GoHighLevel pipeline — hail size, county, and a link to every affected property. Automatically. Set it up once, no code, about 15 minutes.
Get a free Swath key
Sign up at swathapi.com/signup — one email field, no credit card. Your key (it starts with sk_) comes back instantly and is shown once, so paste it somewhere safe. The free plan includes 100 credits a month; storm webhooks themselves cost nothing.
In GoHighLevel: create a workflow and copy its webhook URL
- Open your sub-account, then click Automation in the left menu (some accounts label it Workflows)
- Click Create Workflow → Start from Scratch
- Click Add New Trigger and pick Inbound Webhook — search the trigger list if you don't spot it
- GHL generates a unique webhook URL for this workflow — click Copy and keep this tab open
That URL is your workflow's mailbox: anything POSTed to it starts the workflow. In the next step you'll hand it to Swath.
Inbound Webhook is one of GHL's "premium" workflow triggers. Most current plans include premium triggers, but agency white-label setups vary — if the trigger isn't in your list, ask whoever manages your GHL account to enable premium triggers & actions.
Tell Swath to watch your territory
Path A · Ask your AI — no code, recommended
Connect Swath to Claude or ChatGPT first (a 2-minute paste-one-URL setup — steps here), then say:
Create a Swath storm monitor covering [YOUR COUNTY OR CITY] for hail 1 inch and up. Use this webhook URL: [PASTE THE GHL WEBHOOK URL]. Name it "[TERRITORY NAME]".
The AI draws the box around your territory, creates the monitor, and confirms. Ask it to save the webhook_secret it gets back.
Path B · Or paste this in any terminal
curl -X POST https://swathapi.com/v1/monitors \ -H "Authorization: Bearer sk_YOUR_KEY" \ -H "content-type: application/json" \ -d '{ "name": "My territory", "bbox": [-97.5, 32.5, -96.4, 33.3], "hail_min_in": 1.0, "webhook_url": "PASTE_THE_GHL_WEBHOOK_URL" }'
Swap in your sk_ key and the GHL webhook URL. The bbox is the [west, south, east, north] corners of a box around your territory — the example roughly covers Dallas–Fort Worth. The response includes a webhook_secret, shown once — save it.
Send a test storm so GHL learns the fields
GHL maps fields from a request it has actually seen — and you can't make it hail on demand. So send a realistic sample to your webhook URL. Either ask your AI ("Send a test POST to [the GHL webhook URL] with this exact JSON: …") or paste this in any terminal:
curl -X POST "PASTE_THE_GHL_WEBHOOK_URL" \
-H "content-type: application/json" \
-d '{
"event": "storm.verified",
"storm_id": "sw_db69f3ae",
"monitor_id": "mon_1a2b3c4d",
"type": "hail",
"mesh_in": 1.75,
"wind_mph": null,
"verified_at": "2026-07-24T19:42:00Z",
"county": "Dallas, TX",
"swath_geometry_url": "/v1/swaths/sw_db69f3ae/geometry",
"report_url": "/v1/swaths/sw_db69f3ae/properties",
"parcels_in_swath_est": null
}'
Back in the trigger settings, GHL now lists the incoming fields — check them and click Save Trigger. Every field Swath sends, and what it means:
| Field | What it is |
|---|---|
| event | Always storm.verified — the only event Swath sends today |
| storm_id | The storm's permanent ID, e.g. sw_db69f3ae |
| monitor_id | Which of your territories it hit, e.g. mon_1a2b3c4d |
| type | hail or wind |
| mesh_in | Largest radar-measured hail in the swath, in inches (null on wind events) |
| wind_mph | Peak measured wind, mph (null on hail events) |
| verified_at | When radar confirmed it, UTC — e.g. 2026-07-24T19:42:00Z |
| county | County the swath centers on — e.g. Dallas, TX (null only offshore / outside the US) |
| swath_geometry_url | Path to the storm's shape on a map: /v1/swaths/{storm_id}/geometry |
| report_url | Path to the affected-property list: /v1/swaths/{storm_id}/properties |
| parcels_in_swath_est | Reserved for a future estimate — currently always null |
Build the rest of the workflow — this is the fun part
Everything after the trigger is standard GHL. The mapped webhook fields are available to later steps, so a typical storm-response workflow adds:
- Create Contact — name it from county + verified_at (e.g. "Storm — Dallas, TX — Jul 24")
- Create Opportunity — drop it in your storm pipeline with mesh_in in the title so reps see "1.75″ hail" at a glance
- Notify the team — internal SMS/email/Slack the moment the record lands
HONEST NOTE: the webhook is the storm, not a homeowner list — you get one new record per verified storm, with hail size and county. The leads live behind report_url: the Swath Report lists every affected property with the hail size measured at that address (billed per property — ask for a quote first). Easiest pull: ask your AI "Pull the Swath Report for storm sw_… and give me a CSV."
The fine print (plain English)
One storm, one POST. Each verified storm that crosses a monitor produces exactly one webhook to that monitor — no duplicates. If your endpoint is down, Swath retries with increasing delays.
Every POST is signed. Swath adds an X-Swath-Signature header (t=<unix>,v1=<HMAC-SHA256>, keyed by the webhook_secret you got when the monitor was created) plus X-Swath-Event: storm.verified. GoHighLevel doesn't check signatures on inbound webhooks — that's normal for this kind of setup; the long, unguessable webhook URL is the gate.
Turning it off. Delete the monitor any time — ask your AI ("delete my Swath monitor") or call DELETE /v1/monitors/{id}.
GoHighLevel steps verified against HighLevel's help center — Workflow Trigger — Inbound Webhook and How to use the Inbound Webhook Workflow Premium Trigger — as of July 24, 2026. GHL renames menus now and then; if a label here doesn't match your screen, look for the Inbound Webhook trigger — naming varies by plan and white-label. Webhook payload fields on this page are copied verbatim from the Swath dispatcher and stay current with the docs.