Webhooks & API
Live · updated 0s ago
POST
Contact & opportunity upsert
One endpoint for every GoHighLevel update. Send the contact and opportunity together — the contact's email is the identifier, so records are matched and updated in place instead of duplicated.
/api/public/ghl/opportunityContent-Type: application/json
{
"contact": {
"name": "Robert Chen",
"email": "robert@example.com",
"phone": "+1 403 555 1111",
"company": "Skyline Roofing"
},
"source": {
"platform": "Facebook",
"line_of_business": "Life",
"utm_source": "Facebook"
},
"opportunity": {
"pipeline_name": "Recruiting V0.2",
"stage_name": "Business Builder"
}
}{
"contact": {
"name": "{{contact.name}}",
"email": "{{contact.email}}",
"phone": "{{contact.phone}}",
"company": "{{contact.company_name}}"
},
"source": {
"platform": "{{contact.source}}",
"line_of_business": "{{contact.what_line_of_business_do_you_specialize_in}}",
"utm_source": "{{contact.source}}"
},
"opportunity": {
"pipeline_name": "{{opportunity.pipeline_name}}",
"stage_name": "{{opportunity.stage_name}}"
}
}Fires a real POST at the endpoint above.
Field reference
| Field | Required | Notes |
|---|---|---|
| contact.email | required | Primary identifier. Matched case-insensitively; contact is created if new. |
| contact.name / phone / company | optional | Updated on the matched contact when present. |
| source.line_of_business | optional | Matched by name, auto-created if it doesn't exist yet. |
| source.platform | optional | Stored as the lead source. |
| source.utm_source / utm_medium / campaign | optional | Attribution fields stored on the lead. |
| opportunity.pipeline_name | optional | Sets the lead pipeline. Defaults to Recruiting V0.2. |
| opportunity.stage_name | optional | Sets the pipeline stage. |
| opportunity.id / value / status | optional | Optional extras. Value is in dollars. |
| lead.assigned_to | optional | Team member name, auto-created if it doesn't exist yet. |
Recent deliveries
| Event | Status | Received |
|---|---|---|
| opportunity.upsert | 200 | 2h ago |
| opportunity.upsert | 200 | 2h ago |
| opportunity.upsert | 400 | 8/19/2026 |
| opportunity.upsert | 200 | 8/19/2026 |
| opportunity.upsert | 200 | 8/19/2026 |