Search and Enrich Contacts
Find contacts and reveal their full data in a single call. Combines Search and Enrich into one request.
Provide contact identifiers the same way you would for Search Contacts. Use the reveal field to control what gets unlocked (emails, phones, or both).
Up to 100 contacts per request.
Billing: Two charges apply - one for the search (
api_search) and one per revealed field. Thebilling.creditsChargedin the response reflects the total.
Data Waterfall: runs automatically for the requested
revealfields when enabled on your account. There is nowaterfallEnabledflag on this request. The response can include the samestatus,statusDescriptionandstatusReasonvalues as Enrich Contacts, plusdataSource,creditsandmissingDataPoints. It never returns ajob, so there is nothing to poll.
curl --request POST \
--url https://api.lusha.com/v3/contacts/search-and-enrich \
--header 'Content-Type: application/json' \
--header 'api_key: <api-key>' \
--data '
{
"contacts": [
{
"clientReferenceId": "my-ref-1",
"firstName": "Orit",
"lastName": "Shilvock",
"companyName": "Lusha",
"companyDomain": "lusha.com"
},
{
"clientReferenceId": "my-ref-2",
"linkedinUrl": "https://www.linkedin.com/in/shmulikwillinger"
}
],
"reveal": [
"emails",
"phones"
],
"options": {
"includePartialProfiles": true
}
}
'import requests
url = "https://api.lusha.com/v3/contacts/search-and-enrich"
payload = {
"contacts": [
{
"clientReferenceId": "my-ref-1",
"firstName": "Orit",
"lastName": "Shilvock",
"companyName": "Lusha",
"companyDomain": "lusha.com"
},
{
"clientReferenceId": "my-ref-2",
"linkedinUrl": "https://www.linkedin.com/in/shmulikwillinger"
}
],
"reveal": ["emails", "phones"],
"options": { "includePartialProfiles": True }
}
headers = {
"api_key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {api_key: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
contacts: [
{
clientReferenceId: 'my-ref-1',
firstName: 'Orit',
lastName: 'Shilvock',
companyName: 'Lusha',
companyDomain: 'lusha.com'
},
{
clientReferenceId: 'my-ref-2',
linkedinUrl: 'https://www.linkedin.com/in/shmulikwillinger'
}
],
reveal: ['emails', 'phones'],
options: {includePartialProfiles: true}
})
};
fetch('https://api.lusha.com/v3/contacts/search-and-enrich', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));HttpResponse<String> response = Unirest.post("https://api.lusha.com/v3/contacts/search-and-enrich")
.header("api_key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"contacts\": [\n {\n \"clientReferenceId\": \"my-ref-1\",\n \"firstName\": \"Orit\",\n \"lastName\": \"Shilvock\",\n \"companyName\": \"Lusha\",\n \"companyDomain\": \"lusha.com\"\n },\n {\n \"clientReferenceId\": \"my-ref-2\",\n \"linkedinUrl\": \"https://www.linkedin.com/in/shmulikwillinger\"\n }\n ],\n \"reveal\": [\n \"emails\",\n \"phones\"\n ],\n \"options\": {\n \"includePartialProfiles\": true\n }\n}")
.asString();package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.lusha.com/v3/contacts/search-and-enrich"
payload := strings.NewReader("{\n \"contacts\": [\n {\n \"clientReferenceId\": \"my-ref-1\",\n \"firstName\": \"Orit\",\n \"lastName\": \"Shilvock\",\n \"companyName\": \"Lusha\",\n \"companyDomain\": \"lusha.com\"\n },\n {\n \"clientReferenceId\": \"my-ref-2\",\n \"linkedinUrl\": \"https://www.linkedin.com/in/shmulikwillinger\"\n }\n ],\n \"reveal\": [\n \"emails\",\n \"phones\"\n ],\n \"options\": {\n \"includePartialProfiles\": true\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("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))
}Authorizations
Your Lusha API key. You can find this in your Lusha dashboard under API settings.
Include this key in the api_key header for all requests.
Body
Response
Successful response
Show child attributes
Show child attributes
Credit usage summary for a V3 API request
Show child attributes
Show child attributes
Waterfall outcome for the request. Omitted when the waterfall did not run.
completed- every requested data point was resolved.partial- at least one requested data point is still missing, or still in progress whenjobis present.halted- the run stopped before it finished the provider list.OUT_OF_CREDITS- the run stopped because the account could not pay.PARTIAL_OUT_OF_CREDITS- some data was returned, then credits ran out.
completed, partial, halted, OUT_OF_CREDITS, PARTIAL_OUT_OF_CREDITS "partial"
Human-readable text, present whenever status is set. Do not parse it - branch on status and statusReason.
"Some requested data points are still being retrieved."
Stable reason a requested field is empty because the waterfall did not run. When set, status is partial.
WATERFALL_NOT_CONFIGURED- Data Waterfall is on the plan, but no providers are connected.WATERFALL_NOT_IN_PLAN- Data Waterfall is not on the account's plan.WATERFALL_DISABLED- the request setwaterfallEnabledtofalse, and Lusha did not have the field.
WATERFALL_NOT_CONFIGURED, WATERFALL_NOT_IN_PLAN, WATERFALL_DISABLED Was this page helpful?
curl --request POST \
--url https://api.lusha.com/v3/contacts/search-and-enrich \
--header 'Content-Type: application/json' \
--header 'api_key: <api-key>' \
--data '
{
"contacts": [
{
"clientReferenceId": "my-ref-1",
"firstName": "Orit",
"lastName": "Shilvock",
"companyName": "Lusha",
"companyDomain": "lusha.com"
},
{
"clientReferenceId": "my-ref-2",
"linkedinUrl": "https://www.linkedin.com/in/shmulikwillinger"
}
],
"reveal": [
"emails",
"phones"
],
"options": {
"includePartialProfiles": true
}
}
'import requests
url = "https://api.lusha.com/v3/contacts/search-and-enrich"
payload = {
"contacts": [
{
"clientReferenceId": "my-ref-1",
"firstName": "Orit",
"lastName": "Shilvock",
"companyName": "Lusha",
"companyDomain": "lusha.com"
},
{
"clientReferenceId": "my-ref-2",
"linkedinUrl": "https://www.linkedin.com/in/shmulikwillinger"
}
],
"reveal": ["emails", "phones"],
"options": { "includePartialProfiles": True }
}
headers = {
"api_key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {api_key: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
contacts: [
{
clientReferenceId: 'my-ref-1',
firstName: 'Orit',
lastName: 'Shilvock',
companyName: 'Lusha',
companyDomain: 'lusha.com'
},
{
clientReferenceId: 'my-ref-2',
linkedinUrl: 'https://www.linkedin.com/in/shmulikwillinger'
}
],
reveal: ['emails', 'phones'],
options: {includePartialProfiles: true}
})
};
fetch('https://api.lusha.com/v3/contacts/search-and-enrich', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));HttpResponse<String> response = Unirest.post("https://api.lusha.com/v3/contacts/search-and-enrich")
.header("api_key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"contacts\": [\n {\n \"clientReferenceId\": \"my-ref-1\",\n \"firstName\": \"Orit\",\n \"lastName\": \"Shilvock\",\n \"companyName\": \"Lusha\",\n \"companyDomain\": \"lusha.com\"\n },\n {\n \"clientReferenceId\": \"my-ref-2\",\n \"linkedinUrl\": \"https://www.linkedin.com/in/shmulikwillinger\"\n }\n ],\n \"reveal\": [\n \"emails\",\n \"phones\"\n ],\n \"options\": {\n \"includePartialProfiles\": true\n }\n}")
.asString();package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.lusha.com/v3/contacts/search-and-enrich"
payload := strings.NewReader("{\n \"contacts\": [\n {\n \"clientReferenceId\": \"my-ref-1\",\n \"firstName\": \"Orit\",\n \"lastName\": \"Shilvock\",\n \"companyName\": \"Lusha\",\n \"companyDomain\": \"lusha.com\"\n },\n {\n \"clientReferenceId\": \"my-ref-2\",\n \"linkedinUrl\": \"https://www.linkedin.com/in/shmulikwillinger\"\n }\n ],\n \"reveal\": [\n \"emails\",\n \"phones\"\n ],\n \"options\": {\n \"includePartialProfiles\": true\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("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))
}