Overview
GoHighLevel's Custom Webhook workflow action can POST to Propera's API and, with Save response from this Webhook enabled, make Propera's JSON response available to later steps, which you map into custom fields on the contact. Fully native, no extra automation tool.
What you'll build
One workflow: trigger (tag or pipeline stage) → Custom Webhook (Propera) → Update Contact with the returned values.
Before you start
- A Propera account on the Pro or Business plan, and a Propera API key (Step 1).
- A GoHighLevel sub-account with custom fields for the address, property details, and the results (ARV, summary, notes).
Step 1 — Generate your Propera API key
In Propera, go to Account Settings → API Keys, click Generate API Key, name it (for example GoHighLevel), and copy it. It's shown only once.
Step 2 — Create a workflow with a "ready" trigger
In Automation, create a workflow triggered by a deliberate signal, for example a tag like Run ARV being added, or a contact entering a pipeline stage. That keeps the analysis from running before the contact's fields are filled in.
Step 3 — Add a Custom Webhook action
- Method/URL: POST to
https://getpropera.com/api/v1/arv - Headers:
X-API-Key= your key,Content-Type=application/json - Body (JSON / custom data): map the contact's fields:
{
"address": "{{contact.address}}",
"property_type": "{{contact.property_type}}",
"bedrooms": "{{contact.bedrooms}}",
"bathrooms": "{{contact.bathrooms}}",
"sqft": "{{contact.square_footage}}",
"year_built": "{{contact.year_built}}",
"comp_radius": "5"
}
Enable Save response from this Webhook so the JSON comes back into the workflow. (See the GoHighLevel Custom Webhook docs.)
Step 4 — Write the result back to the contact
Add an Update Contact action after the webhook and map the saved response values into custom fields: arv into your ARV field, summary_text into a summary field, run_url into a link field. On a failure response, write error into a notes field. Use the response's success value with an If/Else condition to choose which path runs.
Request fields
| Field | Value | Required |
|---|---|---|
address | The contact's full address (street, city, state, ZIP). Any format works: Propera resolves it to a standard street, city, state and ZIP before running, and rejects it with ADDRESS_NOT_FOUND if it cannot. | Always |
property_type | sfh, condo, townhouse, manufactured, or land (case-insensitive) | Always |
bedrooms | Number of bedrooms | Residential |
bathrooms | Number of bathrooms | Residential |
year_built | Year the property was built | Residential |
sqft | Living area for residential, or lot size for land | Always |
comp_radius | Search radius in miles (residential up to 15, land up to 50) | Always |
lot_size_unit | sqft or acres | Land only |
soft_errors | true to receive every failure as HTTP 200 with success: false (the real status is returned in http_status). Use it when your automation tool stops the flow on a non-200 response | Optional |
Response fields
| Field | Description |
|---|---|
success | true on success, false on failure (branch on this) |
arv | The after-repair value estimate |
arv_confidence | Confidence in the ARV (high / medium / low) |
summary_text | One-line summary for a notes field |
comp_count | Number of comparables used |
price_per_sqft | Average price per square foot |
run_url | Link to the saved run in Propera |
normalized_address | The address as Propera resolved it (street, city, state, ZIP). Write it back to the lead if you want the corrected version. |
comps_text | Ready-to-paste plain-text list of every comp (one per paragraph, with Zillow links) for a multi-line custom field |
arv_source | verified when the comps were checked against public listing records, otherwise fast |
error | On failure, a human-readable reason |
error_code | On failure, a machine-readable code (see Troubleshooting) |
Troubleshooting
| error_code | What it means | Fix |
|---|---|---|
INSUFFICIENT_COMPS | Not enough comps at that radius | Widen comp_radius (residential up to 15 mi, land up to 50 mi) |
NO_USABLE_COMPS | Comps were found but none passed the filters | Widen comp_radius (residential up to 15 mi, land up to 50 mi) |
ADDRESS_NOT_FOUND | Propera could not resolve the address it received. The error message names that address | Fix the street number, city, state or ZIP on the contact and rerun; for rural roads try an alternate name |
PLAN_NOT_ELIGIBLE | Your plan doesn't include API access | Upgrade to Pro or Business |
UNAUTHORIZED | The API key is missing, wrong, or revoked | Check the X-API-Key header |
Questions people ask
Do I need anything beyond GoHighLevel itself?
No. GoHighLevel's native outbound webhook action sends the request directly, so no middleware like Zapier or Make is required. You add the webhook as a workflow action and map the response back to custom fields.
Which Propera plans include API access?
Pro and Business. The webhook authenticates with an API key generated in your Propera account, and a Starter key returns a 403 on every call.
Does each workflow run use one of my monthly ARVs?
Yes. Every analysis draws one AI ARV from your plan's monthly allowance, and a 402 is returned once it is exhausted until the next billing cycle. Trigger the workflow on a qualifying stage or tag rather than on every new contact.
Where do I put the result once it comes back?
Map the response fields to custom fields on the contact or opportunity. The ARV, comparable sales and property links can all be written back, which is what makes the record useful to whoever picks up the call next.
What happens if the contact has no usable address?
The API returns a 422 with a message rather than an estimate, so the workflow step fails and nothing is written. Requiring a non-empty address field before the webhook action avoids burning an ARV on an unusable record.
Ready to auto-underwrite your GoHighLevel pipeline?
Generate your API key and build the workflow in minutes.
Get Started