curl --request POST \
--url https://api.example.com/api/public/tools/find_contact_data \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"prospectId": null,
"enrollmentId": null,
"linkedInUrl": null,
"email": null,
"phone": null,
"hubspotContactId": null,
"firstName": null,
"lastName": null,
"companyDomain": null
}
'import requests
url = "https://api.example.com/api/public/tools/find_contact_data"
payload = {
"prospectId": None,
"enrollmentId": None,
"linkedInUrl": None,
"email": None,
"phone": None,
"hubspotContactId": None,
"firstName": None,
"lastName": None,
"companyDomain": None
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
prospectId: null,
enrollmentId: null,
linkedInUrl: null,
email: null,
phone: null,
hubspotContactId: null,
firstName: null,
lastName: null,
companyDomain: null
})
};
fetch('https://api.example.com/api/public/tools/find_contact_data', 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.example.com/api/public/tools/find_contact_data",
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([
'prospectId' => null,
'enrollmentId' => null,
'linkedInUrl' => null,
'email' => null,
'phone' => null,
'hubspotContactId' => null,
'firstName' => null,
'lastName' => null,
'companyDomain' => null
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$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.example.com/api/public/tools/find_contact_data"
payload := strings.NewReader("{\n \"prospectId\": null,\n \"enrollmentId\": null,\n \"linkedInUrl\": null,\n \"email\": null,\n \"phone\": null,\n \"hubspotContactId\": null,\n \"firstName\": null,\n \"lastName\": null,\n \"companyDomain\": null\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
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.example.com/api/public/tools/find_contact_data")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"prospectId\": null,\n \"enrollmentId\": null,\n \"linkedInUrl\": null,\n \"email\": null,\n \"phone\": null,\n \"hubspotContactId\": null,\n \"firstName\": null,\n \"lastName\": null,\n \"companyDomain\": null\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/api/public/tools/find_contact_data")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"prospectId\": null,\n \"enrollmentId\": null,\n \"linkedInUrl\": null,\n \"email\": null,\n \"phone\": null,\n \"hubspotContactId\": null,\n \"firstName\": null,\n \"lastName\": null,\n \"companyDomain\": null\n}"
response = http.request(request)
puts response.read_body{
"error": "<string>",
"message": "<string>",
"traceId": "<string>"
}{
"error": "<string>",
"message": "<string>",
"traceId": "<string>"
}{
"error": "<string>",
"message": "<string>",
"traceId": "<string>"
}{
"error": "<string>",
"message": "<string>",
"traceId": "<string>"
}{
"error": "<string>",
"message": "<string>",
"traceId": "<string>"
}{
"error": "<string>",
"message": "<string>",
"traceId": "<string>"
}{
"error": "<string>",
"message": "<string>",
"traceId": "<string>"
}{
"error": "<string>",
"message": "<string>",
"traceId": "<string>"
}Find Contact Data
Call get_guide with topic=contact_identity for matching, identifier, conflict, trace, enrichment, and persistence guidance.
Detailed usage guidance
- Find free existing contact data for the current team from saved FirstTouch contacts, enrollments, awaiting Flow Plan candidates, and audience contacts.
- Saved-contact matches identify existing prospects but may not return stored email, LinkedIn, or phone fields; enrollment, awaiting-candidate, and audience matches can return stored channel data when available.
- Use when the user names a contact or provides partial identity.
- Send every identity detail already known (for example firstName and lastName alongside email or linkedInUrl): exact identifiers are preferred, while the other details provide fallback matching.
- This does not enrich, spend credits, or create enrollments.
- Duplicate contact data across sources is collapsed.
- For action workflows, a customer-supplied exact email, LinkedIn URL, or phone is a constraint; do not replace it with candidate data unless the customer confirms the final action target.
curl --request POST \
--url https://api.example.com/api/public/tools/find_contact_data \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"prospectId": null,
"enrollmentId": null,
"linkedInUrl": null,
"email": null,
"phone": null,
"hubspotContactId": null,
"firstName": null,
"lastName": null,
"companyDomain": null
}
'import requests
url = "https://api.example.com/api/public/tools/find_contact_data"
payload = {
"prospectId": None,
"enrollmentId": None,
"linkedInUrl": None,
"email": None,
"phone": None,
"hubspotContactId": None,
"firstName": None,
"lastName": None,
"companyDomain": None
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
prospectId: null,
enrollmentId: null,
linkedInUrl: null,
email: null,
phone: null,
hubspotContactId: null,
firstName: null,
lastName: null,
companyDomain: null
})
};
fetch('https://api.example.com/api/public/tools/find_contact_data', 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.example.com/api/public/tools/find_contact_data",
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([
'prospectId' => null,
'enrollmentId' => null,
'linkedInUrl' => null,
'email' => null,
'phone' => null,
'hubspotContactId' => null,
'firstName' => null,
'lastName' => null,
'companyDomain' => null
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$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.example.com/api/public/tools/find_contact_data"
payload := strings.NewReader("{\n \"prospectId\": null,\n \"enrollmentId\": null,\n \"linkedInUrl\": null,\n \"email\": null,\n \"phone\": null,\n \"hubspotContactId\": null,\n \"firstName\": null,\n \"lastName\": null,\n \"companyDomain\": null\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
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.example.com/api/public/tools/find_contact_data")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"prospectId\": null,\n \"enrollmentId\": null,\n \"linkedInUrl\": null,\n \"email\": null,\n \"phone\": null,\n \"hubspotContactId\": null,\n \"firstName\": null,\n \"lastName\": null,\n \"companyDomain\": null\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/api/public/tools/find_contact_data")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"prospectId\": null,\n \"enrollmentId\": null,\n \"linkedInUrl\": null,\n \"email\": null,\n \"phone\": null,\n \"hubspotContactId\": null,\n \"firstName\": null,\n \"lastName\": null,\n \"companyDomain\": null\n}"
response = http.request(request)
puts response.read_body{
"error": "<string>",
"message": "<string>",
"traceId": "<string>"
}{
"error": "<string>",
"message": "<string>",
"traceId": "<string>"
}{
"error": "<string>",
"message": "<string>",
"traceId": "<string>"
}{
"error": "<string>",
"message": "<string>",
"traceId": "<string>"
}{
"error": "<string>",
"message": "<string>",
"traceId": "<string>"
}{
"error": "<string>",
"message": "<string>",
"traceId": "<string>"
}{
"error": "<string>",
"message": "<string>",
"traceId": "<string>"
}{
"error": "<string>",
"message": "<string>",
"traceId": "<string>"
}Authorizations
Body
Existing FirstTouch prospect id, when known. Use the exact value returned as prospectId by another FirstTouch MCP tool, and send other known identity details too.
Existing FirstTouch enrollment/activity id, when known. Use the exact value returned as enrollmentId by another FirstTouch MCP tool; do not pass queueItemId here. Send other known identity details too.
Prospect LinkedIn profile URL. Send other known identity details too so they can provide fallback matching.
Prospect work email address. Send other known identity details too so they can provide fallback matching.
Prospect phone number. Send other known identity details too so they can provide fallback matching.
HubSpot contact id, when the client has HubSpot context. Use the exact HubSpot contact id; do not pass a FirstTouch prospectId here. Send other known identity details too.
Prospect first name. Send with lastName whenever known, including alongside exact identifiers as a fallback.
Prospect last name. Send with firstName whenever known, including alongside exact identifiers as a fallback.
Optional company domain to refine matches; not enough by itself.
Response
Tool result.

