curl --request POST \
--url https://client-api.salesfinity.co/v1/api/enrichment/email \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"linkedin_url": "https://www.linkedin.com/in/username",
"callback_url": "https://example.com/webhooks/enrichment",
"external_id": "lead-42"
}
'import requests
url = "https://client-api.salesfinity.co/v1/api/enrichment/email"
payload = {
"linkedin_url": "https://www.linkedin.com/in/username",
"callback_url": "https://example.com/webhooks/enrichment",
"external_id": "lead-42"
}
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({
linkedin_url: 'https://www.linkedin.com/in/username',
callback_url: 'https://example.com/webhooks/enrichment',
external_id: 'lead-42'
})
};
fetch('https://client-api.salesfinity.co/v1/api/enrichment/email', 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://client-api.salesfinity.co/v1/api/enrichment/email",
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([
'linkedin_url' => 'https://www.linkedin.com/in/username',
'callback_url' => 'https://example.com/webhooks/enrichment',
'external_id' => 'lead-42'
]),
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://client-api.salesfinity.co/v1/api/enrichment/email"
payload := strings.NewReader("{\n \"linkedin_url\": \"https://www.linkedin.com/in/username\",\n \"callback_url\": \"https://example.com/webhooks/enrichment\",\n \"external_id\": \"lead-42\"\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://client-api.salesfinity.co/v1/api/enrichment/email")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"linkedin_url\": \"https://www.linkedin.com/in/username\",\n \"callback_url\": \"https://example.com/webhooks/enrichment\",\n \"external_id\": \"lead-42\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://client-api.salesfinity.co/v1/api/enrichment/email")
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 \"linkedin_url\": \"https://www.linkedin.com/in/username\",\n \"callback_url\": \"https://example.com/webhooks/enrichment\",\n \"external_id\": \"lead-42\"\n}"
response = http.request(request)
puts response.read_body{
"_id": "507f1f77bcf86cd799439011",
"status": "pending",
"linkedin_url": "https://www.linkedin.com/in/username",
"enrichment_type": "work_email",
"email": {
"email": "[email protected]",
"type": "work"
},
"external_id": "lead-42"
}{
"message": [
"limit must not be greater than 100"
],
"error": "Bad Request",
"statusCode": 400
}{
"message": "Insufficient enrichment credits",
"error": "Payment Required",
"statusCode": 402
}{
"message": "Forbidden resource",
"error": "Forbidden",
"statusCode": 403
}{
"message": "Too many requests",
"error": "Too Many Requests",
"statusCode": 429
}{
"message": "Internal server error",
"error": "Internal Server Error",
"statusCode": 500
}Request an Email Enrichment
Starts an asynchronous lookup of a work or personal email address for a LinkedIn profile. Returns immediately with a request _id and a status of pending; the result is delivered later either by polling GET /v1/api/enrichment/email/{id} or via the optional callback_url webhook. Each completed lookup costs 1 enrichment credit (charged only when an email is found). Requires a positive credit balance.
curl --request POST \
--url https://client-api.salesfinity.co/v1/api/enrichment/email \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"linkedin_url": "https://www.linkedin.com/in/username",
"callback_url": "https://example.com/webhooks/enrichment",
"external_id": "lead-42"
}
'import requests
url = "https://client-api.salesfinity.co/v1/api/enrichment/email"
payload = {
"linkedin_url": "https://www.linkedin.com/in/username",
"callback_url": "https://example.com/webhooks/enrichment",
"external_id": "lead-42"
}
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({
linkedin_url: 'https://www.linkedin.com/in/username',
callback_url: 'https://example.com/webhooks/enrichment',
external_id: 'lead-42'
})
};
fetch('https://client-api.salesfinity.co/v1/api/enrichment/email', 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://client-api.salesfinity.co/v1/api/enrichment/email",
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([
'linkedin_url' => 'https://www.linkedin.com/in/username',
'callback_url' => 'https://example.com/webhooks/enrichment',
'external_id' => 'lead-42'
]),
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://client-api.salesfinity.co/v1/api/enrichment/email"
payload := strings.NewReader("{\n \"linkedin_url\": \"https://www.linkedin.com/in/username\",\n \"callback_url\": \"https://example.com/webhooks/enrichment\",\n \"external_id\": \"lead-42\"\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://client-api.salesfinity.co/v1/api/enrichment/email")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"linkedin_url\": \"https://www.linkedin.com/in/username\",\n \"callback_url\": \"https://example.com/webhooks/enrichment\",\n \"external_id\": \"lead-42\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://client-api.salesfinity.co/v1/api/enrichment/email")
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 \"linkedin_url\": \"https://www.linkedin.com/in/username\",\n \"callback_url\": \"https://example.com/webhooks/enrichment\",\n \"external_id\": \"lead-42\"\n}"
response = http.request(request)
puts response.read_body{
"_id": "507f1f77bcf86cd799439011",
"status": "pending",
"linkedin_url": "https://www.linkedin.com/in/username",
"enrichment_type": "work_email",
"email": {
"email": "[email protected]",
"type": "work"
},
"external_id": "lead-42"
}{
"message": [
"limit must not be greater than 100"
],
"error": "Bad Request",
"statusCode": 400
}{
"message": "Insufficient enrichment credits",
"error": "Payment Required",
"statusCode": 402
}{
"message": "Forbidden resource",
"error": "Forbidden",
"statusCode": 403
}{
"message": "Too many requests",
"error": "Too Many Requests",
"statusCode": 429
}{
"message": "Internal server error",
"error": "Internal Server Error",
"statusCode": 500
}_id and a status of pending. The actual lookup runs in the background — collect the result either by polling the returned _id, or by providing a callback_url that we POST to when the lookup finishes.
status: "completed"), never for not-found. The request is rejected with 402 if the team has no remaining credits — check your balance with Get Enrichment Credits.Request Body
| Field | Type | Required | Description |
|---|---|---|---|
linkedin_url | string | Yes | LinkedIn profile URL. Must be a linkedin.com/in/<username> URL. |
type | string | Yes | Email type to find — work or personal. |
callback_url | string (URL) | No | Webhook POSTed when the enrichment finishes. Retried up to 3 times with backoff. |
external_id | string (≤256) | No | Opaque value echoed back in the callback for client-side correlation. |
Example Request
{
"linkedin_url": "https://www.linkedin.com/in/janedoe",
"type": "work",
"callback_url": "https://example.com/webhooks/enrichment",
"external_id": "lead-42"
}
Response (201)
{
"_id": "507f1f77bcf86cd799439011",
"status": "pending",
"linkedin_url": "https://www.linkedin.com/in/janedoe"
}
_id — it is the handle for polling and the identifier referenced in the callback.
Callback payload
If you supplied acallback_url, we POST a JSON body to it once the lookup resolves:
{
"request_id": "507f1f77bcf86cd799439011",
"status": "completed",
"enrichment_type": "work_email",
"email": { "email": "[email protected]", "type": "work" },
"linkedin_url": "https://www.linkedin.com/in/janedoe",
"external_id": "lead-42"
}
status is completed (with email) or not-found (email is null). Delivery is attempted up to 3 times; if every attempt fails, fall back to polling.
Errors
| Status | Description |
|---|---|
| 400 | Validation failed — linkedin_url is not a linkedin.com/in/<username> URL, or type is not work/personal |
| 402 | Insufficient enrichment credits |
Authorizations
Team-scoped API key generated in the Salesfinity dashboard under Settings -> Connections & API. A missing or invalid key returns HTTP 403.
Body
LinkedIn profile URL. Must be a linkedin.com/in/ URL.
"https://www.linkedin.com/in/username"
Which email type to find.
work, personal Optional. Webhook URL POSTed when the enrichment finishes. Retried up to 3 times.
"https://example.com/webhooks/enrichment"
Optional. Echoed back in the callback payload for client-side correlation.
256"lead-42"
Response
Enrichment request accepted. Poll the returned _id, or wait for the callback.
Enrichment request ID. Use this to poll GET /v1/api/enrichment/email/{id}.
"507f1f77bcf86cd799439011"
Current state of the request. completed means an email was found; not-found means none was available.
pending, processing, completed, not-found, failed "https://www.linkedin.com/in/username"
Present once the lookup resolves. Reflects the requested email type.
work_email, personal_email Populated when status is completed. Null when status is not-found.
Show child attributes
Show child attributes
The external_id supplied on the original request, if any.
"lead-42"