Test the Realtor leads webhook endpoint. This shows the default expected payload shape - the endpoint accepts any shape as long as a field mapping targets it.
{
"Content-Type": "application/json",
"m4-connect-key": "[your-api-key]"
}The nested shape above is the default expected shape (a realtor.com "Connections Plus" lead notification) and is what the built-in fallback field mapping targets. Every field is optional, and the endpoint isn't limited to this shape - the fields actually used to build the contact (name, email, phone, etc.) are whatever the resolved field mapping (configured in the configurator, or this default) points at. A location can be configured with a mapping that targets a completely different payload shape with no code changes.
lead_info.lead_id → realtor_lead_id (also the default external_id)lead_info.lead_type / lead_info.message → realtor_lead_type / realtor_lead_messagecontact.first_name / contact.last_name → contact.first_name / contact.last_namecontact.email → contact.email (fallback external_id if lead_info.lead_id doesn't resolve)contact.phone → contact.phoneproperty_details.address.* → contact.address1 / contact.city / contact.state / contact.postal_codeproperty_details.mls_id / property_details.realtor_listing_url → realtor_mls_id / realtor_listing_urlrepresentation.listing_agent.name → realtor_agent_assignedrepresentation.listing_office.broker_name → realtor_broker_assignedConfigurationClient.getMappings for the "realtor" sub-feature, falling back to the default mapping above.contact.email then email) - not fixed payload fields - so a differently-shaped payload works as long as a mapping targets it.external_id is built from the mapping response's uniqueIdentifier field list when configured (joining resolved values with _). When no mapping is configured, the default uniqueIdentifier is realtor_lead_id (i.e. lead_info.lead_id), falling back to the resolved email if that doesn't resolve.tags, they're added to sync_data.tags.ContactSyncRecord is upserted with sync_source: "Realtor" and sync_direction: "In"./api/v1/[locationId]/webhook/realtor/leads (synchronous, default) pushes the contact to GHL inline and reflects the result in the response. /api/v1/[locationId]/webhook/realtor/async/leads shares the same validation and field-mapping logic but only inserts a PENDING record and returns immediately - the existing GHL contact sync workflow (~2-minute cron) delivers it later. Use the toggle above to test either.
See docs/API_REALTOR_LEADS.md for the complete field mapping table, error codes, and cURL examples for both endpoints.