Sends an in-app notification to the agent(s) assigned to the given lead, representing a buyer/seller activity signal (e.g. viewed a listing, saved a search, requested CMA). Certain notificationType values also trigger SMS and Email delivery.
Use case: a partner system observes a user action on its own site and wants that action to surface as an opportunity in the assigned agent’s Lofty inbox.
If the lead belongs to a lead pond, the notification is broadcast to all pond members instead of the single assignee.
Important notes
The leadId must belong to the caller’s own team.
Agents whose team has the OPPORTUNITY resource disabled are silently skipped.
This endpoint is not idempotent. Repeated calls produce repeated deliveries.
The data field in the response is a best-effort success hint, not a strict delivery confirmation. See the 200 response description for details.
POST
/
v1.0
/
agent
/
send-notification
Send Opportunity Alert
curl --request POST \ --url https://api.lofty.com/v1.0/agent/send-notification \ --header 'Authorization: <authorization>' \ --header 'Content-Type: <content-type>' \ --data @- <<EOF{ "leadId": 100001, "notificationType": 11, "description": "123 Main St, San Francisco, CA 94102", "link": "https://example.com/listing/123", "message": "I'd like to schedule a tour this weekend."}EOF
import requests
url = "https://api.lofty.com/v1.0/agent/send-notification"
payload = {
"leadId": 100001,
"notificationType": 11,
"description": "123 Main St, San Francisco, CA 94102",
"link": "https://example.com/listing/123",
"message": "I'd like to schedule a tour this weekend."
}
headers = {
"Authorization": "<authorization>",
"Content-Type": "<content-type>"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)
const options = {
method: 'POST',
headers: {Authorization: '<authorization>', 'Content-Type': '<content-type>'},
body: JSON.stringify({
leadId: 100001,
notificationType: 11,
description: '123 Main St, San Francisco, CA 94102',
link: 'https://example.com/listing/123',
message: 'I\'d like to schedule a tour this weekend.'
})
};
fetch('https://api.lofty.com/v1.0/agent/send-notification', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));
<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.lofty.com/v1.0/agent/send-notification",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'leadId' => 100001,
'notificationType' => 11,
'description' => '123 Main St, San Francisco, CA 94102',
'link' => 'https://example.com/listing/123',
'message' => 'I\'d like to schedule a tour this weekend.'
]),
CURLOPT_HTTPHEADER => [
"Authorization: <authorization>",
"Content-Type: <content-type>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}
package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.lofty.com/v1.0/agent/send-notification"
payload := strings.NewReader("{\n \"leadId\": 100001,\n \"notificationType\": 11,\n \"description\": \"123 Main St, San Francisco, CA 94102\",\n \"link\": \"https://example.com/listing/123\",\n \"message\": \"I'd like to schedule a tour this weekend.\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "<authorization>")
req.Header.Add("Content-Type", "<content-type>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}
HttpResponse<String> response = Unirest.post("https://api.lofty.com/v1.0/agent/send-notification")
.header("Authorization", "<authorization>")
.header("Content-Type", "<content-type>")
.body("{\n \"leadId\": 100001,\n \"notificationType\": 11,\n \"description\": \"123 Main St, San Francisco, CA 94102\",\n \"link\": \"https://example.com/listing/123\",\n \"message\": \"I'd like to schedule a tour this weekend.\"\n}")
.asString();
require 'uri'
require 'net/http'
url = URI("https://api.lofty.com/v1.0/agent/send-notification")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = '<authorization>'
request["Content-Type"] = '<content-type>'
request.body = "{\n \"leadId\": 100001,\n \"notificationType\": 11,\n \"description\": \"123 Main St, San Francisco, CA 94102\",\n \"link\": \"https://example.com/listing/123\",\n \"message\": \"I'd like to schedule a tour this weekend.\"\n}"
response = http.request(request)
puts response.read_body
Optional free-text message. Rendered only for notificationType values that carry a leave-message context (e.g. 65); ignored by all other types.
Example:
"I'd like to schedule a tour this weekend."
Response
Request accepted. Response body = {status:{code:0,msg:"success"}, data:<bool>}. data=true => notification(s) dispatched to at least one assignee (non-pond path). data=false => one of the silent-failure conditions: leadId=0, notificationType=null, lead not found, no agent-role assignee, or the lead is a lead-pond lead (where broadcast is still triggered but the API returns false due to a known quirk). Callers SHOULD NOT rely on data=true/false as a strict delivery confirmation.
Wrapped response for POST /v1.0/agent/send-notification.
Rough success flag. true = notification dispatched. false = silent-failure condition (missing lead, no assignee) or pond-broadcast quirk (see endpoint description). Callers should not treat this as a strict delivery confirmation.
Example:
true
⌘I
Send Opportunity Alert
curl --request POST \ --url https://api.lofty.com/v1.0/agent/send-notification \ --header 'Authorization: <authorization>' \ --header 'Content-Type: <content-type>' \ --data @- <<EOF{ "leadId": 100001, "notificationType": 11, "description": "123 Main St, San Francisco, CA 94102", "link": "https://example.com/listing/123", "message": "I'd like to schedule a tour this weekend."}EOF
import requests
url = "https://api.lofty.com/v1.0/agent/send-notification"
payload = {
"leadId": 100001,
"notificationType": 11,
"description": "123 Main St, San Francisco, CA 94102",
"link": "https://example.com/listing/123",
"message": "I'd like to schedule a tour this weekend."
}
headers = {
"Authorization": "<authorization>",
"Content-Type": "<content-type>"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)
const options = {
method: 'POST',
headers: {Authorization: '<authorization>', 'Content-Type': '<content-type>'},
body: JSON.stringify({
leadId: 100001,
notificationType: 11,
description: '123 Main St, San Francisco, CA 94102',
link: 'https://example.com/listing/123',
message: 'I\'d like to schedule a tour this weekend.'
})
};
fetch('https://api.lofty.com/v1.0/agent/send-notification', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));
<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.lofty.com/v1.0/agent/send-notification",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'leadId' => 100001,
'notificationType' => 11,
'description' => '123 Main St, San Francisco, CA 94102',
'link' => 'https://example.com/listing/123',
'message' => 'I\'d like to schedule a tour this weekend.'
]),
CURLOPT_HTTPHEADER => [
"Authorization: <authorization>",
"Content-Type: <content-type>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}
package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.lofty.com/v1.0/agent/send-notification"
payload := strings.NewReader("{\n \"leadId\": 100001,\n \"notificationType\": 11,\n \"description\": \"123 Main St, San Francisco, CA 94102\",\n \"link\": \"https://example.com/listing/123\",\n \"message\": \"I'd like to schedule a tour this weekend.\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "<authorization>")
req.Header.Add("Content-Type", "<content-type>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}
HttpResponse<String> response = Unirest.post("https://api.lofty.com/v1.0/agent/send-notification")
.header("Authorization", "<authorization>")
.header("Content-Type", "<content-type>")
.body("{\n \"leadId\": 100001,\n \"notificationType\": 11,\n \"description\": \"123 Main St, San Francisco, CA 94102\",\n \"link\": \"https://example.com/listing/123\",\n \"message\": \"I'd like to schedule a tour this weekend.\"\n}")
.asString();
require 'uri'
require 'net/http'
url = URI("https://api.lofty.com/v1.0/agent/send-notification")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = '<authorization>'
request["Content-Type"] = '<content-type>'
request.body = "{\n \"leadId\": 100001,\n \"notificationType\": 11,\n \"description\": \"123 Main St, San Francisco, CA 94102\",\n \"link\": \"https://example.com/listing/123\",\n \"message\": \"I'd like to schedule a tour this weekend.\"\n}"
response = http.request(request)
puts response.read_body
{"docsConfig":{"theme":"luma","$schema":"https://mintlify.com/docs.json","name":"Lofty Developer API","colors":{"primary":"#3c5cdc","light":"#ffffff"},"logo":{"light":"https://mintcdn.com/lofty-23bfa97a/472dpA6Ra28Z7egx/logo-dark.svg?fit=max\u0026auto=format\u0026n=472dpA6Ra28Z7egx\u0026q=85\u0026s=12c76c72f76b3c04e325c3922c833c12","dark":"https://mintcdn.com/lofty-23bfa97a/472dpA6Ra28Z7egx/logo-light.svg?fit=max\u0026auto=format\u0026n=472dpA6Ra28Z7egx\u0026q=85\u0026s=b12d6cdd0e6fae7d831727e7248232d2"},"favicon":"https://media.brand.dev/0aeb1ee4-c521-4fbe-b536-f1df81215cbc.png","navbar":{"primary":{"type":"github","href":"https://github.com/lofty"}},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"lofty-23bfa97a","hasAudioNarration":false,"actualSubdomain":"lofty-23bfa97a","customDomains":["developer.lofty.com"],"gitSource":{"type":"gitlab","owner":"homethy-crm","repo":"openapi-docs","hostUrl":"https://gitpub.d.chime.me","projectId":1443,"deployBranch":"main","contentDirectory":"","isPrivate":false,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6adb206fbc8f385cbd3092b4","collectionId":"c1279157-8ee2-4d40-b2f9-2aeae69a70b1","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6adb206fbc8f385cbd3092b4"},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6adb206fbc8f385cbd3092b4","clientVersion":"0.0.3964","searchFilterCounts":[{"language":"default","tag":"API Reference","count":132},{"language":"default","tag":"Documentation","count":48},{"language":"default","tag":"MCP","count":34},{"language":"default","tag":"Lofty CLI","count":31},{"language":"default","tag":"Team","count":29},{"language":"default","tag":"Leads","count":29},{"language":"default","tag":"Command Reference","count":25},{"language":"default","tag":"Task \u0026 Calendar","count":22},{"language":"default","tag":"Communication","count":19},{"language":"default","tag":"AI Copilot","count":17}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-v7-file-tree","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-nav-generations","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-agent-model-picker","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"isAtlas":false,"googleFontsInlined":false},"customCss":[{"filePath":"style.css","content":"@media (min-width:1024px){#sidebar-content{width:18rem}#body-content{padding-left:18rem}#content-area{margin-left:max(0px,calc(50vw - 348px - 18rem))}}"}],"page":{"pagePath":"api-reference/opportunity/send-an-opportunity-notification-to-the-leads-assi","slug":"/api-reference/opportunity/send-an-opportunity-notification-to-the-leads-assi","pageMetadata":{"title":"Send Opportunity Alert","openapi":"openapi/openapi.json POST /v1.0/agent/send-notification","description":"Sends an in-app notification to the agent(s) assigned to the given lead, representing a buyer/seller activity signal (e.g. viewed a listing, saved a search, requested CMA). Certain notificationType values also trigger SMS and Email delivery.\n\n**Use case:** a partner system observes a user action on its own site and wants that action to surface as an opportunity in the assigned agent's Lofty inbox.\n\n## Delivery channels\n\n| Channel | Trigger |\n|---|---|\n| In-app push | All notificationType values |\n| SMS + Email | Browse (11/48/138), Saved listing (9/52/136), Saved search (27/140), Mortgage calculator (89), Return-to-site (166) |\n\nIf the lead belongs to a lead pond, the notification is broadcast to all pond members instead of the single assignee.\n\n## Important notes\n\n- The leadId **must** belong to the caller's own team.\n- Agents whose team has the OPPORTUNITY resource disabled are silently skipped.\n- This endpoint is **not idempotent**. Repeated calls produce repeated deliveries.\n- The `data` field in the response is a best-effort success hint, not a strict delivery confirmation. See the 200 response description for details.","href":"/api-reference/opportunity/send-an-opportunity-notification-to-the-leads-assi"},"description":{"compiledSource":"\"use strict\";\nconst {Fragment: _Fragment, jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n code: \"code\",\n h2: \"h2\",\n li: \"li\",\n p: \"p\",\n strong: \"strong\",\n table: \"table\",\n tbody: \"tbody\",\n td: \"td\",\n th: \"th\",\n thead: \"thead\",\n tr: \"tr\",\n ul: \"ul\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_Fragment, {\n children: [_jsx(_components.p, {\n children: \"Sends an in-app notification to the agent(s) assigned to the given lead, representing a buyer/seller activity signal (e.g. viewed a listing, saved a search, requested CMA). Certain notificationType values also trigger SMS and Email delivery.\"\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Use case:\"\n }), \" a partner system observes a user action on its own site and wants that action to surface as an opportunity in the assigned agent’s Lofty inbox.\"]\n }), \"\\n\", _jsx(_components.h2, {\n children: \"Delivery channels\"\n }), \"\\n\", _jsxs(_components.table, {\n children: [_jsx(_components.thead, {\n children: _jsxs(_components.tr, {\n children: [_jsx(_components.th, {\n children: \"Channel\"\n }), _jsx(_components.th, {\n children: \"Trigger\"\n })]\n })\n }), _jsxs(_components.tbody, {\n children: [_jsxs(_components.tr, {\n children: [_jsx(_components.td, {\n children: \"In-app push\"\n }), _jsx(_components.td, {\n children: \"All notificationType values\"\n })]\n }), _jsxs(_components.tr, {\n children: [_jsx(_components.td, {\n children: \"SMS + Email\"\n }), _jsx(_components.td, {\n children: \"Browse (11/48/138), Saved listing (9/52/136), Saved search (27/140), Mortgage calculator (89), Return-to-site (166)\"\n })]\n })]\n })]\n }), \"\\n\", _jsx(_components.p, {\n children: \"If the lead belongs to a lead pond, the notification is broadcast to all pond members instead of the single assignee.\"\n }), \"\\n\", _jsx(_components.h2, {\n children: \"Important notes\"\n }), \"\\n\", _jsxs(_components.ul, {\n children: [\"\\n\", _jsxs(_components.li, {\n children: [\"The leadId \", _jsx(_components.strong, {\n children: \"must\"\n }), \" belong to the caller’s own team.\"]\n }), \"\\n\", _jsx(_components.li, {\n children: \"Agents whose team has the OPPORTUNITY resource disabled are silently skipped.\"\n }), \"\\n\", _jsxs(_components.li, {\n children: [\"This endpoint is \", _jsx(_components.strong, {\n children: \"not idempotent\"\n }), \". Repeated calls produce repeated deliveries.\"]\n }), \"\\n\", _jsxs(_components.li, {\n children: [\"The \", _jsx(_components.code, {\n children: \"data\"\n }), \" field in the response is a best-effort success hint, not a strict delivery confirmation. See the 200 response description for details.\"]\n }), \"\\n\"]\n })]\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Send Opportunity Alert","openapi":"openapi/openapi.json POST /v1.0/agent/send-notification","description":"Sends an in-app notification to the agent(s) assigned to the given lead, representing a buyer/seller activity signal (e.g. viewed a listing, saved a search, requested CMA). Certain notificationType values also trigger SMS and Email delivery.\n\n**Use case:** a partner system observes a user action on its own site and wants that action to surface as an opportunity in the assigned agent's Lofty inbox.\n\n## Delivery channels\n\n| Channel | Trigger |\n|---|---|\n| In-app push | All notificationType values |\n| SMS + Email | Browse (11/48/138), Saved listing (9/52/136), Saved search (27/140), Mortgage calculator (89), Return-to-site (166) |\n\nIf the lead belongs to a lead pond, the notification is broadcast to all pond members instead of the single assignee.\n\n## Important notes\n\n- The leadId **must** belong to the caller's own team.\n- Agents whose team has the OPPORTUNITY resource disabled are silently skipped.\n- This endpoint is **not idempotent**. Repeated calls produce repeated deliveries.\n- The `data` field in the response is a best-effort success hint, not a strict delivery confirmation. See the 200 response description for details.","href":"/api-reference/opportunity/send-an-opportunity-notification-to-the-leads-assi"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"tags":["Opportunity"],"summary":"Send Opportunity Alert","description":"Sends an in-app notification to the agent(s) assigned to the given lead, representing a buyer/seller activity signal (e.g. viewed a listing, saved a search, requested CMA). Certain notificationType values also trigger SMS and Email delivery.\n\n**Use case:** a partner system observes a user action on its own site and wants that action to surface as an opportunity in the assigned agent's Lofty inbox.\n\n## Delivery channels\n\n| Channel | Trigger |\n|---|---|\n| In-app push | All notificationType values |\n| SMS + Email | Browse (11/48/138), Saved listing (9/52/136), Saved search (27/140), Mortgage calculator (89), Return-to-site (166) |\n\nIf the lead belongs to a lead pond, the notification is broadcast to all pond members instead of the single assignee.\n\n## Important notes\n\n- The leadId **must** belong to the caller's own team.\n- Agents whose team has the OPPORTUNITY resource disabled are silently skipped.\n- This endpoint is **not idempotent**. Repeated calls produce repeated deliveries.\n- The `data` field in the response is a best-effort success hint, not a strict delivery confirmation. See the 200 response description for details.","operationId":"sendOpportunityNotification","parameters":["00ed2852-01b2-4962-bd23-b6bfda89c991","01953f81-162b-4e32-8e8a-598342af452b"],"requestBody":"cfb7f6f1-a6e6-4754-a085-05d04bfa297b","responses":{"200":"0203085e-4b75-452f-8e30-6b33dd79e69f","400":"2da71700-6be4-4a94-bf49-90983c8485f3","500":"4cb0e7b7-c224-4c6b-a42a-da5fedfc0ac1"},"method":"post","type":"path","servers":["5fee05a5-5cbb-475b-9058-26ced27eca18"],"security":[],"path":"/v1.0/agent/send-notification","baseUrlOptions":["https://api.lofty.com"],"title":"Send Opportunity Alert","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"00ed2852-01b2-4962-bd23-b6bfda89c991":{"name":"Authorization","in":"header","description":"Bearer [access_token]","required":true,"schema":{"type":"string","isRequired":true,"description":"Bearer [access_token]","uniqueKey":"","typeLabel":"string"}},"01953f81-162b-4e32-8e8a-598342af452b":{"name":"Content-Type","in":"header","description":"application/json","required":true,"schema":{"type":"string","isRequired":true,"description":"application/json","uniqueKey":"","typeLabel":"string"},"example":"application/json"}},"requestBody":{"content":{"application/json":{"schema":{"required":["leadId","notificationType"],"type":"object","properties":{"leadId":{"type":"integer","description":"Lead ID. Must belong to the caller's team.","format":"int64","example":100001,"isRequired":true,"uniqueKey":"leadId","typeLabel":"integer\u003cint64>"},"notificationType":{"type":"integer","description":"Opportunity trigger type. Must match one of the supported activity codes.\n\nSite-origin values:\n 9 = Saved a listing\n 10 = Searched\n 11 = Viewed a listing\n 27 = Saved a search\n 46 = Requested to sell a house\n 47 = Requested home evaluation\n 65 = Left a message\n 66 = Requested a showing\n 89 = Used mortgage calculator\n162 = Requested CMA\n164 = Requested financing options\n\nNewHome-origin equivalents:\n 48 = Browsed a home\n 50 = Searched a home\n 52 = Favorited a home\n\nCApp-origin equivalents:\n136 = Favorited\n137 = Searched\n138 = Browsed\n139 = Showing request\n140 = Saved search\n141 = House evaluation\n\nOther:\n165 = Re-inquired on text code\n166 = Back to site (view a listing)\n167 = Submitted a form\n168 = Viewed CMA","format":"int32","example":11,"enum":[9,10,11,27,46,47,48,50,52,65,66,89,136,137,138,139,140,141,162,164,165,166,167,168],"isRequired":true,"uniqueKey":"notificationType","typeLabel":"enum\u003cinteger>"},"description":{"type":"string","description":"Free-text description shown in the notification body. description and link form a combo; both must be non-empty for the details block to render.","example":"123 Main St, San Francisco, CA 94102","uniqueKey":"description","typeLabel":"string"},"link":{"type":"string","description":"Companion URL to description (see description field). Typically a listing / search / CMA URL.","example":"https://example.com/listing/123","uniqueKey":"link","typeLabel":"string"},"message":{"type":"string","description":"Optional free-text message. Rendered only for notificationType values that carry a leave-message context (e.g. 65); ignored by all other types.","example":"I'd like to schedule a tour this weekend.","uniqueKey":"message","typeLabel":"string"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"leadId":100001,"notificationType":11,"description":"123 Main St, San Francisco, CA 94102","link":"https://example.com/listing/123","message":"I'd like to schedule a tour this weekend."}}},"exampleType":"generated"}},"required":true,"exampleType":"generated"},"responses":{"0203085e-4b75-452f-8e30-6b33dd79e69f":{"description":"Request accepted. Response body = {status:{code:0,msg:\"success\"}, data:`\u003cbool>`}. data=true => notification(s) dispatched to at least one assignee (non-pond path). data=false => one of the silent-failure conditions: leadId=0, notificationType=null, lead not found, no agent-role assignee, or the lead is a lead-pond lead (where broadcast is still triggered but the API returns false due to a known quirk). Callers SHOULD NOT rely on data=true/false as a strict delivery confirmation.","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"object","properties":{"code":{"type":"integer","description":"Response code; 0 indicates success.","format":"int32","example":0,"uniqueKey":"status.code","typeLabel":"integer\u003cint32>"},"msg":{"type":"string","description":"Response message.","example":"success","uniqueKey":"status.msg","typeLabel":"string"}},"description":"Status envelope; code=0 indicates the request was processed.","uniqueKey":"status","typeLabel":"object"},"data":{"type":"boolean","description":"Rough success flag. true = notification dispatched. false = silent-failure condition (missing lead, no assignee) or pond-broadcast quirk (see endpoint description). Callers should not treat this as a strict delivery confirmation.","example":true,"uniqueKey":"data","typeLabel":"boolean"}},"description":"Wrapped response for POST /v1.0/agent/send-notification.","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"status":{"code":0,"msg":"success"},"data":true}}},"exampleType":"generated"}},"exampleType":"generated"},"2da71700-6be4-4a94-bf49-90983c8485f3":{"description":"Invalid token / rate-limited / package quota exceeded (handled by the common filter chain before reaching this endpoint; see RateLimitFilter / PackageLimitFilter).","content":{"application/json":{"schema":{"type":"string","uniqueKey":"","typeLabel":"string"},"examples":{"Example":{"title":"Example","value":"\u003cstring>"}},"exampleType":"generated"}},"exampleType":"generated"},"4cb0e7b7-c224-4c6b-a42a-da5fedfc0ac1":{"description":"Internal error (error code 20005).","content":{"application/json":{"schema":{"type":"string","uniqueKey":"","typeLabel":"string"},"examples":{"Example":{"title":"Example","value":"\u003cstring>"}},"exampleType":"generated"}},"exampleType":"generated"}},"security":{},"servers":{"5fee05a5-5cbb-475b-9058-26ced27eca18":{"url":"https://api.lofty.com"}}},"originalFileLocation":"openapi/openapi.json"},"subdomain":"lofty-23bfa97a","siteName":"Lofty Developer API","title":"Send Opportunity Alert - Lofty Developer API","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-05-12T03:08:23.296Z","originalFileLocation":"api-reference/opportunity/send-an-opportunity-notification-to-the-leads-assi.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Sends an in-app notification to the agent(s) assigned to the given lead, representing a buyer/seller activity signal (e.g. viewed a listing, saved a search, requested CMA). Certain notificationType values also trigger SMS and Email delivery. Use case: a partner system observes a user action on its own site and wants that action to surface as an opportunity in the assigned agent\u0026#x27;s Lofty inbox. ## Delivery channels | Channel | Trigger | |---|---| | In-app push | All notificationType values | | SMS + Email | Browse (11/48/138), Saved listing (9/52/136), Saved search (27/140), Mortgage calculator (89), Return-to-site (166) | If the lead belongs to a lead pond, the notification is broadcast to all pond members instead of the single assignee. ## Important notes - The leadId must belong to the caller\u0026#x27;s own team. - Agents whose team has the OPPORTUNITY resource disabled are silently skipped. - This endpoint is not idempotent. Repeated calls produce repeated deliveries. - The data field in the response is a best-effort success hint, not a strict delivery confirmation. See the 200 response description for details.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Lofty Developer API\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"https://media.brand.dev/0aeb1ee4-c521-4fbe-b536-f1df81215cbc.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"https://media.brand.dev/0aeb1ee4-c521-4fbe-b536-f1df81215cbc.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"https://media.brand.dev/0aeb1ee4-c521-4fbe-b536-f1df81215cbc.png\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/png\" href=\"https://media.brand.dev/0aeb1ee4-c521-4fbe-b536-f1df81215cbc.png\">\u003cmeta data-mint-head property=\"og:title\" content=\"Send Opportunity Alert - Lofty Developer API\">\u003cmeta data-mint-head property=\"og:description\" content=\"Sends an in-app notification to the agent(s) assigned to the given lead, representing a buyer/seller activity signal (e.g. viewed a listing, saved a search, requested CMA). Certain notificationType values also trigger SMS and Email delivery. Use case: a partner system observes a user action on its own site and wants that action to surface as an opportunity in the assigned agent\u0026#x27;s Lofty inbox. ## Delivery channels | Channel | Trigger | |---|---| | In-app push | All notificationType values | | SMS + Email | Browse (11/48/138), Saved listing (9/52/136), Saved search (27/140), Mortgage calculator (89), Return-to-site (166) | If the lead belongs to a lead pond, the notification is broadcast to all pond members instead of the single assignee. ## Important notes - The leadId must belong to the caller\u0026#x27;s own team. - Agents whose team has the OPPORTUNITY resource disabled are silently skipped. - This endpoint is not idempotent. Repeated calls produce repeated deliveries. - The data field in the response is a best-effort success hint, not a strict delivery confirmation. See the 200 response description for details.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Lofty Developer API\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://developer.lofty.com/api-reference/opportunity/send-an-opportunity-notification-to-the-leads-assi\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://lofty-23bfa97a.mintlify.app/_mintlify/api/og/v2?division=Notifications\u0026amp;title=Send+Opportunity+Alert\u0026amp;description=Sends+an+in-app+notification+to+the+agent%28s%29+assigned+to+the+given+lead%2C+representing+a+buyer%2Fseller+activity+signal+%28e.g.+viewed+a+listing%2C+saved+a+search%2C+req\u0026amp;theme=cf5308eab30ae100a5b55002\u0026amp;signature=ec62321ece34404f0c8af201a6e0e2b90d67c36dafa9d41969919b30d534a160\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Send Opportunity Alert - Lofty Developer API\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Sends an in-app notification to the agent(s) assigned to the given lead, representing a buyer/seller activity signal (e.g. viewed a listing, saved a search, requested CMA). Certain notificationType values also trigger SMS and Email delivery. Use case: a partner system observes a user action on its own site and wants that action to surface as an opportunity in the assigned agent\u0026#x27;s Lofty inbox. ## Delivery channels | Channel | Trigger | |---|---| | In-app push | All notificationType values | | SMS + Email | Browse (11/48/138), Saved listing (9/52/136), Saved search (27/140), Mortgage calculator (89), Return-to-site (166) | If the lead belongs to a lead pond, the notification is broadcast to all pond members instead of the single assignee. ## Important notes - The leadId must belong to the caller\u0026#x27;s own team. - Agents whose team has the OPPORTUNITY resource disabled are silently skipped. - This endpoint is not idempotent. Repeated calls produce repeated deliveries. - The data field in the response is a best-effort success hint, not a strict delivery confirmation. See the 200 response description for details.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://lofty-23bfa97a.mintlify.app/_mintlify/api/og/v2?division=Notifications\u0026amp;title=Send+Opportunity+Alert\u0026amp;description=Sends+an+in-app+notification+to+the+agent%28s%29+assigned+to+the+given+lead%2C+representing+a+buyer%2Fseller+activity+signal+%28e.g.+viewed+a+listing%2C+saved+a+search%2C+req\u0026amp;theme=cf5308eab30ae100a5b55002\u0026amp;signature=ec62321ece34404f0c8af201a6e0e2b90d67c36dafa9d41969919b30d534a160\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"https://mintlify.s3.us-west-1.amazonaws.com/lofty-23bfa97a/_generated/favicon/browserconfig.xml?v=3\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Lofty Developer API\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#3c5cdc\">\u003clink data-mint-head rel=\"canonical\" href=\"https://developer.lofty.com/api-reference/opportunity/send-an-opportunity-notification-to-the-leads-assi\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/opportunity/send-an-opportunity-notification-to-the-leads-assi.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://developer.lofty.com/#organization\",\"name\":\"Lofty Developer API\",\"url\":\"https://developer.lofty.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/lofty-23bfa97a/472dpA6Ra28Z7egx/logo-dark.svg?fit=max\u0026auto=format\u0026n=472dpA6Ra28Z7egx\u0026q=85\u0026s=12c76c72f76b3c04e325c3922c833c12\"}},{\"@type\":\"WebSite\",\"@id\":\"https://developer.lofty.com#website\",\"name\":\"Lofty Developer API\",\"url\":\"https://developer.lofty.com\",\"publisher\":{\"@id\":\"https://developer.lofty.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://developer.lofty.com/api-reference/opportunity/send-an-opportunity-notification-to-the-leads-assi#webpage\",\"url\":\"https://developer.lofty.com/api-reference/opportunity/send-an-opportunity-notification-to-the-leads-assi\",\"name\":\"Send Opportunity Alert\",\"description\":\"Sends an in-app notification to the agent(s) assigned to the given lead, representing a buyer/seller activity signal (e.g. viewed a listing, saved a search, requested CMA). Certain notificationType values also trigger SMS and Email delivery. Use case: a partner system observes a user action on its own site and wants that action to surface as an opportunity in the assigned agent's Lofty inbox. ## Delivery channels | Channel | Trigger | |---|---| | In-app push | All notificationType values | | SMS + Email | Browse (11/48/138), Saved listing (9/52/136), Saved search (27/140), Mortgage calculator (89), Return-to-site (166) | If the lead belongs to a lead pond, the notification is broadcast to all pond members instead of the single assignee. ## Important notes - The leadId must belong to the caller's own team. - Agents whose team has the OPPORTUNITY resource disabled are silently skipped. - This endpoint is not idempotent. Repeated calls produce repeated deliveries. - The data field in the response is a best-effort success hint, not a strict delivery confirmation. See the 200 response description for details.\",\"dateModified\":\"2026-05-12T03:08:23.296Z\",\"isPartOf\":{\"@id\":\"https://developer.lofty.com#website\"},\"breadcrumb\":{\"@id\":\"https://developer.lofty.com/api-reference/opportunity/send-an-opportunity-notification-to-the-leads-assi#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://developer.lofty.com/api-reference/opportunity/send-an-opportunity-notification-to-the-leads-assi#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Communication\",\"item\":\"https://developer.lofty.com/api-reference/communication/search-communications-by-agent\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Send Opportunity Alert\",\"item\":\"https://developer.lofty.com/api-reference/opportunity/send-an-opportunity-notification-to-the-leads-assi\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://developer.lofty.com/api-reference/opportunity/send-an-opportunity-notification-to-the-leads-assi#apireference\",\"headline\":\"Send Opportunity Alert\",\"name\":\"Send Opportunity Alert\",\"description\":\"Sends an in-app notification to the agent(s) assigned to the given lead, representing a buyer/seller activity signal (e.g. viewed a listing, saved a search, requested CMA). Certain notificationType values also trigger SMS and Email delivery. Use case: a partner system observes a user action on its own site and wants that action to surface as an opportunity in the assigned agent's Lofty inbox. ## Delivery channels | Channel | Trigger | |---|---| | In-app push | All notificationType values | | SMS + Email | Browse (11/48/138), Saved listing (9/52/136), Saved search (27/140), Mortgage calculator (89), Return-to-site (166) | If the lead belongs to a lead pond, the notification is broadcast to all pond members instead of the single assignee. ## Important notes - The leadId must belong to the caller's own team. - Agents whose team has the OPPORTUNITY resource disabled are silently skipped. - This endpoint is not idempotent. Repeated calls produce repeated deliveries. - The data field in the response is a best-effort success hint, not a strict delivery confirmation. See the 200 response description for details.\",\"url\":\"https://developer.lofty.com/api-reference/opportunity/send-an-opportunity-notification-to-the-leads-assi\",\"mainEntityOfPage\":{\"@id\":\"https://developer.lofty.com/api-reference/opportunity/send-an-opportunity-notification-to-the-leads-assi#webpage\"},\"dateModified\":\"2026-05-12T03:08:23.296Z\",\"publisher\":{\"@id\":\"https://developer.lofty.com/#organization\"},\"isPartOf\":{\"@id\":\"https://developer.lofty.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Lofty Developer API\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Lofty Developer API","nav":{"global":null,"tabs":[{"tab":"Documentation","pages":[{"title":"Documentation","href":"/introduction"}]},{"tab":"API Reference","groups":[{"group":"Leads","pages":[{"title":"Overview","href":"/api-reference/leads/overview"},{"group":"Core","pages":[{"title":"List Leads","openapi":"openapi/openapi.json GET /v1.0/leads","href":"/api-reference/leads/list-leads"},{"title":"Create Lead","openapi":"openapi/openapi.json POST /v1.0/leads","href":"/api-reference/leads/create-lead"},{"title":"Get Lead","openapi":"openapi/openapi.json GET /v1.0/leads/{leadId}","href":"/api-reference/leads/get-lead"},{"title":"Update Lead","openapi":"openapi/openapi.json PUT /v1.0/leads/{leadId}","href":"/api-reference/leads/update-lead"},{"title":"Delete Lead","openapi":"openapi/openapi.json DELETE /v1.0/leads/{leadId}","href":"/api-reference/leads/delete-lead"}]},{"group":"Activities","pages":[{"title":"Lead Activities","openapi":"openapi/openapi.json GET /v1.0/leads/{leadId}/activities","href":"/api-reference/leads/activities"},{"title":"List lead activities","openapi":"openapi/openapi.json GET /v2.0/leads/{leadId}/activities","href":"/api-reference/leads/list-lead-activities"},{"title":"Add activity","openapi":"openapi/openapi.json POST /v1.0/leads/{leadId}/activity","href":"/api-reference/leads/add-activity"}]},{"group":"Saved Searches","pages":[{"title":"List saved searches","openapi":"openapi/openapi.json GET /v1.0/leads/{leadId}/savedSearches","href":"/api-reference/leads/list-saved-searches"},{"title":"Create saved search","openapi":"openapi/openapi.json POST /v1.0/leads/{leadId}/savedSearches","href":"/api-reference/leads/create-saved-search"},{"title":"Update saved search","openapi":"openapi/openapi.json PUT /v1.0/leads/{leadId}/savedSearches/{savedSearchId}","href":"/api-reference/leads/update-saved-search"},{"title":"Delete saved search","openapi":"openapi/openapi.json DELETE /v1.0/leads/{leadId}/savedSearches/{savedSearchId}","href":"/api-reference/leads/delete-saved-search"},{"title":"Pause saved search alerts","openapi":"openapi/openapi.json POST /v1.0/leads/{leadId}/savedSearches/pause","href":"/api-reference/leads/pause-saved-searches"},{"title":"Resume saved search alerts","openapi":"openapi/openapi.json POST /v1.0/leads/{leadId}/savedSearches/resume","href":"/api-reference/leads/resume-saved-searches"}]},{"group":"Notes","pages":[{"title":"List Notes","openapi":"openapi/openapi.json GET /v1.0/notes","href":"/api-reference/communication/list-notes"},{"title":"Get a note by ID","openapi":"openapi/openapi.json GET /v1.0/notes/{noteId}","href":"/api-reference/communication/get-a-note-by-id"},{"title":"Create Note","openapi":"openapi/openapi.json POST /v1.0/notes","href":"/api-reference/communication/create-note"},{"title":"Update Note","openapi":"openapi/openapi.json PUT /v1.0/notes/{noteId}","href":"/api-reference/communication/update-note"},{"title":"Delete Note","openapi":"openapi/openapi.json DELETE /v1.0/notes/{noteId}","href":"/api-reference/communication/delete-note"}]},{"group":"Manual Logs","pages":[{"title":"List manual logs of a lead","openapi":"openapi/openapi.json GET /v1.0/logType","href":"/api-reference/manual-logs/list-manual-logs-of-a-lead"},{"title":"Add a manual log entry","openapi":"openapi/openapi.json POST /v1.0/logType","href":"/api-reference/manual-logs/add-a-manual-log-entry"},{"title":"Get a manual log entry by ID","openapi":"openapi/openapi.json GET /v1.0/logType/{logTypeId}","href":"/api-reference/manual-logs/get-a-manual-log-entry-by-id"},{"title":"Delete a manual log entry","openapi":"openapi/openapi.json DELETE /v1.0/logType/{logTypeId}","href":"/api-reference/manual-logs/delete-a-manual-log-entry"}]},{"group":"Other Operations","pages":[{"title":"Assign Lead","openapi":"openapi/openapi.json POST /v1.0/leads/{leadId}/assignment","href":"/api-reference/leads/assign-lead"},{"title":"Preview Routing","openapi":"openapi/openapi.json POST /v1.0/leads/assignee","href":"/api-reference/leads/resolve-assignees-by-lead-info"},{"title":"Update Property Info","openapi":"openapi/openapi.json POST /v1.0/leads/{leadId}/property","href":"/api-reference/leads/place-a-property"},{"title":"Add Inquiry","openapi":"openapi/openapi.json POST /v1.0/leads/{leadId}/inquiry","href":"/api-reference/leads/place-an-inquiry"},{"title":"System Logs","openapi":"openapi/openapi.json GET /v1.0/systemLogs","href":"/api-reference/leads/system-logs"}]}]},{"group":"Task \u0026 Calendar","pages":[{"title":"Overview","href":"/api-reference/tasks/overview"},{"group":"Tasks","pages":[{"title":"List Tasks","openapi":"openapi/openapi.json GET /v2.0/tasks","href":"/api-reference/tasks/v2/list-tasks"},{"title":"Create Task","openapi":"openapi/openapi.json POST /v2.0/tasks","href":"/api-reference/tasks/v2/create-task"},{"title":"Get Task","openapi":"openapi/openapi.json GET /v2.0/tasks/{taskId}","href":"/api-reference/tasks/v2/get-task"},{"title":"Update Task","openapi":"openapi/openapi.json PUT /v2.0/tasks/{taskId}","href":"/api-reference/tasks/v2/update-task"},{"title":"Delete Task","openapi":"openapi/openapi.json DELETE /v2.0/tasks/{taskId}","href":"/api-reference/tasks/v2/delete-task"},{"title":"Finish Task","openapi":"openapi/openapi.json POST /v2.0/tasks/{taskId}/finish","href":"/api-reference/tasks/v2/finish-task"},{"title":"Unfinish Task","openapi":"openapi/openapi.json POST /v2.0/tasks/{taskId}/unfinish","href":"/api-reference/tasks/v2/unfinish-task"},{"title":"My Tasks","openapi":"openapi/openapi.json GET /v2.0/tasks/my-tasks","href":"/api-reference/tasks/v2/my-tasks"}]},{"group":"Calendar","pages":[{"title":"List Calendar Events","openapi":"openapi/openapi.json GET /v2.0/calendar","href":"/api-reference/calendar/v2/list-events"},{"title":"Create Calendar Event","openapi":"openapi/openapi.json POST /v2.0/calendar","href":"/api-reference/calendar/v2/create-event"},{"title":"Update Calendar Event","openapi":"openapi/openapi.json PUT /v2.0/calendar/{calendarId}","href":"/api-reference/calendar/v2/update-event"},{"title":"Delete Calendar Event","openapi":"openapi/openapi.json DELETE /v2.0/calendar/{calendarId}","href":"/api-reference/calendar/v2/delete-event"},{"title":"Finish Calendar Event","openapi":"openapi/openapi.json POST /v2.0/calendar/{calendarId}/finish","href":"/api-reference/calendar/v2/finish-event"},{"title":"Unfinish Calendar Event","openapi":"openapi/openapi.json POST /v2.0/calendar/{calendarId}/unfinish","href":"/api-reference/calendar/v2/unfinish-event"},{"title":"Available Meetings","openapi":"openapi/openapi.json GET /v2.0/calendar/meetings/available","href":"/api-reference/calendar/v2/available-meetings"}]},{"group":"Legacy","pages":[{"title":"List Tasks (V1)","openapi":"openapi/openapi.json GET /v1.0/tasks","href":"/api-reference/tasks/v1/list-tasks"},{"title":"Create Task (V1)","openapi":"openapi/openapi.json POST /v1.0/tasks","href":"/api-reference/tasks/v1/create-task"},{"title":"Get Task (V1)","openapi":"openapi/openapi.json GET /v1.0/tasks/{taskId}","href":"/api-reference/tasks/v1/get-task"},{"title":"Update Task (V1)","openapi":"openapi/openapi.json PUT /v1.0/tasks/{taskId}","href":"/api-reference/tasks/v1/update-task"},{"title":"Delete Task (V1)","openapi":"openapi/openapi.json DELETE /v1.0/tasks/{taskId}","href":"/api-reference/tasks/v1/delete-task"},{"title":"List Appointments","openapi":"openapi/openapi.json GET /v1.0/appts","href":"/api-reference/tasks/v1/list-appointments"}]}]},{"group":"Transactions","pages":[{"group":"Core","pages":[{"title":"List Transactions","openapi":"openapi/openapi.json GET /v2.0/transactions","href":"/api-reference/transactions/list-transactions"},{"title":"Create Transaction","openapi":"openapi/openapi.json POST /v1.0/leads/{leadId}/transaction","href":"/api-reference/transactions/create-transaction"},{"title":"Get Transaction","openapi":"openapi/openapi.json GET /v1.0/leads/{leadId}/transaction/{transactionId}","href":"/api-reference/transactions/get-transaction"},{"title":"Update Transaction","openapi":"openapi/openapi.json PUT /v1.0/leads/{leadId}/transaction/{transactionId}","href":"/api-reference/transactions/partially-update-a-transaction"},{"title":"List by Lead","openapi":"openapi/openapi.json GET /v1.0/leads/{leadId}/transactions","href":"/api-reference/transactions/list-transactions-for-a-lead"},{"title":"List Transaction Pipelines","openapi":"openapi/openapi.json GET /v2.0/transactions/pipelines","href":"/api-reference/transactions/list-transaction-pipelines"}]},{"group":"Property Address","pages":[{"title":"Update Property Address","openapi":"openapi/openapi.json POST /v1.0/leads/{leadId}/transaction/property/address","href":"/api-reference/transactions/update-transaction-property-address"},{"title":"Get Property Address","openapi":"openapi/openapi.json GET /v1.0/leads/{leadId}/transaction/{transactionId}/property/address","href":"/api-reference/transactions/get-transaction-property-address"}]}]},{"group":"Listings","pages":[{"title":"Overview","href":"/api-reference/listings/overview"},{"title":"Search by Agent / Office","openapi":"openapi/openapi.json GET /v1.0/listing","href":"/api-reference/listings/search-listings-by-agent-office-or-mls-id"},{"title":"Get Published Listings","openapi":"openapi/openapi.json GET /v1.0/getPublishedListings","href":"/api-reference/listings/get-published"}]},{"group":"Communication","pages":[{"title":"Search by Agent","openapi":"openapi/openapi.json POST /v1.0/agent/communication","href":"/api-reference/communication/search-communications-by-agent"},{"title":"Search by Agent (cursor paged)","openapi":"openapi/openapi.json GET /v2.0/communication/agent","href":"/api-reference/communication/search-communications-by-agent-v2"},{"group":"Calls","pages":[{"title":"Calls Overview","href":"/api-reference/communication/calls-overview"},{"title":"Call History","openapi":"openapi/openapi.json GET /v1.0/communication/call","href":"/api-reference/communication/call-history"},{"title":"List call history of a lead (v2)","openapi":"openapi/openapi.json GET /v1.0/communication/call/v2","href":"/api-reference/communication/list-call-history-of-a-lead-v2"},{"title":"List calls of a lead","openapi":"openapi/openapi.json GET /v1.0/calls","href":"/api-reference/calls/list-calls-of-a-lead"},{"title":"Get a call by ID","openapi":"openapi/openapi.json GET /v1.0/calls/{callId}","href":"/api-reference/calls/get-a-call-by-id"},{"title":"Get Call","openapi":"openapi/openapi.json GET /v2.0/communication/call/{communicationId}","href":"/api-reference/communication/get-call"},{"title":"Get a call recording URL","openapi":"openapi/openapi.json GET /v1.0/call/url/{callId}","href":"/api-reference/calls/get-a-call-recording-url"}]},{"group":"Email \u0026 SMS","pages":[{"title":"Email History","openapi":"openapi/openapi.json GET /v1.0/communication/email","href":"/api-reference/communication/list-emails"},{"title":"Send Email","openapi":"openapi/openapi.json POST /v1.0/message/email/send","href":"/api-reference/communication/send-email"},{"title":"Get Email","openapi":"openapi/openapi.json GET /v2.0/communication/email/{communicationId}","href":"/api-reference/communication/get-email"},{"title":"SMS History","openapi":"openapi/openapi.json GET /v1.0/communication/text","href":"/api-reference/communication/list-sms"},{"title":"Send SMS","openapi":"openapi/openapi.json POST /v1.0/message/sms/send","href":"/api-reference/communication/send-sms"},{"title":"Get Text","openapi":"openapi/openapi.json GET /v2.0/communication/text/{communicationId}","description":"Returns the text message identified by the given communication ID. The communication must be a text record, and the caller must have manage permission on the owning lead; otherwise 400 PERMISSION_DENIED is returned (no existence leak).\n\nWebhook follow-up: when a Text webhook is delivered, pass each `createdText[].timelineId` from the payload as the `communicationId` path parameter to fetch the full record. The legacy `createdText[].textId` field is kept for backward compatibility but is not interchangeable across communicationType — prefer `timelineId`.","href":"/api-reference/communication/get-text"}]},{"group":"Notifications","pages":[{"title":"Send Opportunity Alert","openapi":"openapi/openapi.json POST /v1.0/agent/send-notification","href":"/api-reference/opportunity/send-an-opportunity-notification-to-the-leads-assi"},{"title":"Send Task Reminder Push","openapi":"openapi/openapi.json POST /v2.0/sales-agent/notification/app-push/send-task-reminder","description":"Sends an in-app push notification to the agent assigned to the given task or appointment.","href":"/api-reference/notifications/send-app-push-for-taskappointment-reminder"},{"title":"Send SMS to Agent","openapi":"openapi/openapi.json POST /v2.0/sales-agent/message/sms/send-to-agent","href":"/api-reference/notifications/send-system-sms-to-agent"},{"title":"Send Email to Agent","openapi":"openapi/openapi.json POST /v2.0/sales-agent/message/email/send-to-agent","href":"/api-reference/notifications/send-system-email-to-agent"}]}]},{"group":"Team","pages":[{"group":"Members","pages":[{"title":"Team Members","openapi":"openapi/openapi.json GET /v1.0/members","href":"/api-reference/team/members"},{"title":"Get a team member by account (email)","openapi":"openapi/openapi.json GET /v1.0/members/{account}","href":"/api-reference/team/get-a-team-member-by-account-email"},{"title":"Get a team member by user ID (deprecated)","openapi":"openapi/openapi.json GET /v1.0/users/{userId}","href":"/api-reference/team/get-a-team-member-by-user-id-deprecated"},{"title":"Get the current user's profile","openapi":"openapi/openapi.json GET /v1.0/me","href":"/api-reference/team/get-the-current-users-profile"},{"title":"List Vendors","openapi":"openapi/openapi.json GET /v1.0/vendor/list","href":"/api-reference/vendor/list-vendors-of-the-callers-team"}]},{"group":"Settings","pages":[{"title":"List Tags","openapi":"openapi/openapi.json GET /v1.0/teamFeatures/listTag","href":"/api-reference/team-features/list-lead-tags-visible-to-the-caller"},{"title":"List Custom Fields","openapi":"openapi/openapi.json GET /v1.0/teamFeatures/listCustomField","href":"/api-reference/team-features/list-lead-custom-field-definitions"},{"title":"List Transaction Custom Fields","openapi":"openapi/openapi.json GET /v1.0/transaction/customfields","href":"/api-reference/transactions/list-transaction-custom-field-definitions"},{"title":"List Transaction Field Groups","openapi":"openapi/openapi.json GET /v1.0/transaction/forms","href":"/api-reference/transactions/list-transaction-field-groups"},{"title":"Add Custom Field","openapi":"openapi/openapi.json POST /v1.0/teamFeatures/custom-field","href":"/api-reference/team-features/add-a-lead-custom-field"},{"title":"Create Transaction Custom Field","openapi":"openapi/openapi.json POST /v1.0/transaction/customfields","href":"/api-reference/transactions/create-transaction-custom-field"},{"title":"List Lead Ponds","openapi":"openapi/openapi.json GET /v1.0/team-features/lead-ponds","href":"/api-reference/team-features/list-lead-ponds-visible-to-the-caller"},{"title":"Get Lead Pond","openapi":"openapi/openapi.json GET /v1.0/team-features/lead-pond/{id}","href":"/api-reference/team-features/get-a-lead-pond-by-id"},{"title":"List Lead Pipelines","openapi":"openapi/openapi.json GET /v1.0/teamFeatures/lead-pipelines","href":"/api-reference/team-features/list-lead-pipelines"}]},{"group":"Agents","pages":[{"title":"Create a new agent","openapi":"openapi/openapi.json POST /v1.0/agent/profile/add","href":"/api-reference/agents/create-a-new-agent"},{"title":"Add tags to an agent","openapi":"openapi/openapi.json POST /v1.0/agent/{agentId}/tag/add","href":"/api-reference/agents/add-tags-to-an-agent"},{"title":"Deactivate an agent","openapi":"openapi/openapi.json POST /v2.0/agents/{agentId}/deactivate","href":"/api-reference/agents/deactivate-an-agent"},{"title":"Reactivate an agent","openapi":"openapi/openapi.json POST /v2.0/agents/{agentId}/reactivate","href":"/api-reference/agents/reactivate-an-agent"}]},{"group":"Organization","pages":[{"title":"Get Organization","openapi":"openapi/openapi.json GET /v1.0/org","href":"/api-reference/org/get-the-callers-organization-info"},{"title":"Add Office","openapi":"openapi/openapi.json PUT /v1.0/org/office","href":"/api-reference/org/add-an-office-to-the-team"},{"title":"Update Office","openapi":"openapi/openapi.json POST /v1.0/org/office","href":"/api-reference/org/update-an-office"},{"title":"Update Company","openapi":"openapi/openapi.json POST /v1.0/org/company","href":"/api-reference/org/update-the-teams-company-info"},{"title":"List Permission Profiles","openapi":"openapi/openapi.json GET /v1.0/org/permission/profiles","href":"/api-reference/org/list-permission-profiles-available-to-the-team"}]},{"group":"Lead Routing","pages":[{"title":"Lead Routing Rules","openapi":"openapi/openapi.json GET /v1.0/routing/rule/list/{type}","href":"/api-reference/team/routing"},{"title":"Update a routing rule","openapi":"openapi/openapi.json PUT /v1.0/routing/rule/{type}","href":"/api-reference/routing/update-a-routing-rule"},{"title":"Get default (supplement) routing rule","openapi":"openapi/openapi.json GET /v1.0/routing/rule/supplement/{type}","href":"/api-reference/routing/get-default-supplement-routing-rule"},{"title":"Update default (supplement) routing rule","openapi":"openapi/openapi.json PUT /v1.0/routing/rule/supplement/{type}","href":"/api-reference/routing/update-default-supplement-routing-rule"},{"title":"List assign roles","openapi":"openapi/openapi.json GET /v1.0/routing/role/list","href":"/api-reference/routing/list-assign-roles"},{"title":"List members available for assignment","openapi":"openapi/openapi.json GET /v1.0/routing/member/list/{type}","href":"/api-reference/routing/list-members-available-for-assignment"}]}]},{"group":"AI Copilot","pages":[{"group":"Agent \u0026 Settings","pages":[{"title":"Get current user's Sales Agent","openapi":"openapi/openapi.json GET /v2.0/sales-agents/current","href":"/api-reference/sales-agents/get-current-users-sales-agent"},{"title":"Get current user's Sales Agent quota","openapi":"openapi/openapi.json GET /v2.0/sales-agents/quota","href":"/api-reference/sales-agents/get-current-users-sales-agent-quota"},{"title":"Get Sales Agent by lead ID","openapi":"openapi/openapi.json GET /v2.0/sales-agents/by-lead","href":"/api-reference/sales-agents/get-sales-agent-by-lead-id"},{"title":"Query Sales Agent settings","openapi":"openapi/openapi.json GET /v2.0/sales-agent/settings","href":"/api-reference/sales-agents/query-sales-agent-settings"}]},{"group":"Working Leads","pages":[{"title":"Query working leads (paginated)","openapi":"openapi/openapi.json GET /v2.0/working-leads","href":"/api-reference/sales-agents/query-working-leads-paginated"},{"title":"Check if lead is a working lead","openapi":"openapi/openapi.json GET /v2.0/sales-agents/working-lead/{leadId}","href":"/api-reference/sales-agents/check-if-lead-is-a-working-lead"},{"title":"Batch add leads to Sales Agent working pool","openapi":"openapi/openapi.json POST /v2.0/working-leads/add","href":"/api-reference/sales-agents/batch-add-leads-to-sales-agent-working-pool"},{"title":"Mute a working lead","openapi":"openapi/openapi.json PUT /v2.0/sales-agents/working-lead/{leadId}/mute","href":"/api-reference/sales-agents/mute-a-working-lead"},{"title":"Get Sales Agent lead mute status","openapi":"openapi/openapi.json GET /v2.0/sales-agent/lead/mute-status","href":"/api-reference/sales-agents/get-sales-agent-lead-mute-status"}]},{"group":"Plan Tasks \u0026 Messaging","pages":[{"title":"Get plan tasks by lead ID","openapi":"openapi/openapi.json GET /v2.0/plan-tasks/lead/{leadId}","href":"/api-reference/sales-agents/get-plan-tasks-by-lead-id"},{"title":"Send SMS to agent via AI number","openapi":"openapi/openapi.json POST /v2.0/sales-agent/ai-number/send-sms-to-agent","href":"/api-reference/sales-agents/send-sms-to-agent-via-ai-number"}]},{"group":"Intelligent Features","pages":[{"title":"Generate Call Script","openapi":"openapi/openapi.json POST /v2.0/ai/call-script","href":"/api-reference/ai/generate-call-script"},{"title":"Get Call Summary","openapi":"openapi/openapi.json GET /v2.0/ai/call-summary","href":"/api-reference/ai/get-call-summary"},{"title":"Generate Call Summary","openapi":"openapi/openapi.json POST /v2.0/ai/call-summary/generate","href":"/api-reference/ai/trigger-call-summary-generation"},{"title":"Prepare Insight","openapi":"openapi/openapi.json POST /v2.0/ai/prepare-insight","href":"/api-reference/ai/generate-prepare-insight"},{"title":"List Lead Analysis Tasks","openapi":"openapi/openapi.json GET /v2.0/ai/lead-analysis","href":"/api-reference/ai/query-leadanalysis-task-list"},{"title":"Create Lead Analysis Task","openapi":"openapi/openapi.json POST /v2.0/ai/lead-analysis","href":"/api-reference/ai/create-leadanalysis-task"}]}]},{"group":"Webhooks","pages":[{"title":"List Webhooks","openapi":"openapi/openapi.json GET /v1.0/webhooks","href":"/api-reference/webhooks/list-webhooks"},{"title":"Create Webhook","openapi":"openapi/openapi.json POST /v1.0/webhook","href":"/api-reference/webhooks/create-webhook"},{"title":"Delete Webhook","openapi":"openapi/openapi.json DELETE /v1.0/webhook/{subscribeId}","href":"/api-reference/webhooks/delete-webhook"}]},{"group":"Integrations","pages":[{"title":"Brokermint — Sync Lead","openapi":"openapi/openapi.json PUT /v1.0/brokermint/lead","href":"/api-reference/leads/brokermint-webhook-update-a-synced-lead"},{"title":"Brokermint — Sync Transaction","openapi":"openapi/openapi.json PUT /v1.0/brokermint/transaction","href":"/api-reference/transactions/brokermint-webhook-update-a-synced-transaction"}]}]},{"tab":"MCP","pages":[{"title":"MCP","href":"/mcp/overview"}]},{"tab":"Changelog","pages":[{"title":"Changelog","href":"/changelog/2026"}]}]},"title":"Send Opportunity Alert - Lofty Developer API","buildId":"dpl_HcHmUS6i3UwswnTHJUEdcTtwfdTQ","deploymentId":"dpl_HcHmUS6i3UwswnTHJUEdcTtwfdTQ","dynamics":["c2aa737661","b0f84f53ff","a9bb46feb3","2b790eda92"],"chunks":["OpenApiReferenceProvider-BRm_l__d.js","utils-f1l1Oc-G.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-BlhqDhJO.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-DHCB7rsC.js","snippetPresets-CYXLx6Hv.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","Page-kQh739Uz.js","ApiExamples-B78P2dEq.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-C4YLPVAh.js","shallow-vlLnTDkQ.js","getApiPlaygroundDisplay-D_98hhvf.js","CodeSnippet-DtnZHGqq.js","CodeSnippets-CLFb8KJt.js","getPastedJson-Cq-zlbnU.js","icon-sN3t983t.js","MethodPill-P_YQ2s09.js","DuplicateIcon-BVzyNsGJ.js","createIcon-B3jqgqC6.js","DynamicMarkdown-Crwq6WG_.js","SectionHeading-C7pGS2Bb.js","axios-vUo_bRtp.js","Markdown-BuPH8yuW.js","clsx-CCOYKgaU.js","lib--scc4DXi.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-BnkC_6oA.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-BM4S31-f.js"]}