Contact Signals
Retrieve job-change and promotion signal events for up to 100 contacts by Lusha ID in a single call.
curl --request POST \
--url https://api.lusha.com/v3/contacts/signals \
--header 'Content-Type: application/json' \
--header 'api_key: <api-key>' \
--data '
{
"ids": [
"4389064624",
"4389064654"
],
"signalTypes": [
"allSignals"
],
"startDate": "2025-01-01"
}
'import requests
url = "https://api.lusha.com/v3/contacts/signals"
payload = {
"ids": ["4389064624", "4389064654"],
"signalTypes": ["allSignals"],
"startDate": "2025-01-01"
}
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({
ids: ['4389064624', '4389064654'],
signalTypes: ['allSignals'],
startDate: '2025-01-01'
})
};
fetch('https://api.lusha.com/v3/contacts/signals', 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/signals")
.header("api_key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"ids\": [\n \"4389064624\",\n \"4389064654\"\n ],\n \"signalTypes\": [\n \"allSignals\"\n ],\n \"startDate\": \"2025-01-01\"\n}")
.asString();package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.lusha.com/v3/contacts/signals"
payload := strings.NewReader("{\n \"ids\": [\n \"4389064624\",\n \"4389064654\"\n ],\n \"signalTypes\": [\n \"allSignals\"\n ],\n \"startDate\": \"2025-01-01\"\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))
}{
"results": [
{
"id": "4389064624",
"companyChange": [],
"promotion": []
}
],
"startDate": "2025-01-01",
"endDate": "2025-07-31",
"billing": {
"creditsCharged": 2,
"resultsReturned": 1
}
}
ids and the signalTypes you want back; there is no separate “search” step in V3 - one call returns all matched signal data for the IDs you send.
id values here.Endpoint
POST https://api.lusha.com/v3/contacts/signals
ApiKeyAuth)
Request body
["4389064624", "4389064654"]allSignals, promotion, companyChangeUse allSignals to retrieve every available contact signal type in one call.YYYY-MM-DD format.Example: "2025-01-01"1–100.Example: 10Example request
curl --request POST \
--url https://api.lusha.com/v3/contacts/signals \
--header 'api_key: YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"ids": ["4389064624", "4389064654"],
"signalTypes": ["allSignals"],
"startDate": "2025-01-01"
}'
{
"ids": ["4389064624", "4389064654"],
"signalTypes": ["allSignals"],
"startDate": "2025-01-01"
}
Response
200 - Success
Show properties
Show properties
"4389064624"companyChange signal events for this contact, newest first. Only present when companyChange (or allSignals) was requested and at least one event matched.promotion signal events for this contact, newest first. Only present when promotion (or allSignals) was requested and at least one event matched.tableId on the request. Summarizes what was written to the table. The rest of the response is unaffected even if the table write fails.Show properties
Show properties
482910showSignalsContact action.{
"results": [
{
"id": "4389064624",
"companyChange": [],
"promotion": []
}
],
"startDate": "2025-01-01",
"endDate": "2025-07-31",
"billing": {
"creditsCharged": 2,
"resultsReturned": 1
}
}
Error codes
| Status | Meaning |
|---|---|
400 | Bad request - invalid input data. |
401 | Unauthorized - your API key is missing or invalid. |
402 | Payment required - insufficient credits. |
403 | Forbidden - account inactive or V3 access not enabled. |
429 | Too many requests - you have exceeded the rate limit. |
Related pages
- Signals overview - the consolidated signals model, credits, and delivery options
- Get Contact Signal Types - the current list of valid
signalTypesvalues - Company Signals - the equivalent endpoint for companies
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
1 - 100 elements["4389064624", "4389064654"]
allSignals, promotion, companyChange ["allSignals"]
"2025-01-01"
1 <= x <= 10010
Optional. If provided, these contacts are also added to this table (if not already present) and the Signals column is populated. See the Tables API.
"482910"
Response
Successful response
Show child attributes
Show child attributes
Added to a Prospecting, Enrich, Signals, or Lookalike response when tableId is passed on the request. The primary response is unaffected even if the table write fails.
Show child attributes
Show child attributes
Credit usage summary for a V3 API request
Show child attributes
Show child attributes
Was this page helpful?
curl --request POST \
--url https://api.lusha.com/v3/contacts/signals \
--header 'Content-Type: application/json' \
--header 'api_key: <api-key>' \
--data '
{
"ids": [
"4389064624",
"4389064654"
],
"signalTypes": [
"allSignals"
],
"startDate": "2025-01-01"
}
'import requests
url = "https://api.lusha.com/v3/contacts/signals"
payload = {
"ids": ["4389064624", "4389064654"],
"signalTypes": ["allSignals"],
"startDate": "2025-01-01"
}
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({
ids: ['4389064624', '4389064654'],
signalTypes: ['allSignals'],
startDate: '2025-01-01'
})
};
fetch('https://api.lusha.com/v3/contacts/signals', 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/signals")
.header("api_key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"ids\": [\n \"4389064624\",\n \"4389064654\"\n ],\n \"signalTypes\": [\n \"allSignals\"\n ],\n \"startDate\": \"2025-01-01\"\n}")
.asString();package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.lusha.com/v3/contacts/signals"
payload := strings.NewReader("{\n \"ids\": [\n \"4389064624\",\n \"4389064654\"\n ],\n \"signalTypes\": [\n \"allSignals\"\n ],\n \"startDate\": \"2025-01-01\"\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))
}{
"results": [
{
"id": "4389064624",
"companyChange": [],
"promotion": []
}
],
"startDate": "2025-01-01",
"endDate": "2025-07-31",
"billing": {
"creditsCharged": 2,
"resultsReturned": 1
}
}