curl --request POST \
--url https://public-api.lonescale.com/trigger/enrich/sync \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"enrichment_type": [
"email",
"phone"
],
"contacts": [
{
"firstname": "John",
"lastname": "Doe",
"email": "john@acme.com",
"job_title": "ceo",
"linkedin_url": "https://www.linkedin.com/in/john-doe/",
"domain": "acme.com",
"company_name": "Acme",
"custom": {
"contact_id": "44479301"
}
}
],
"custom": {
"provider": "lonescale",
"enrichment_type": "email and phone"
}
}
'import requests
url = "https://public-api.lonescale.com/trigger/enrich/sync"
payload = {
"enrichment_type": ["email", "phone"],
"contacts": [
{
"firstname": "John",
"lastname": "Doe",
"email": "john@acme.com",
"job_title": "ceo",
"linkedin_url": "https://www.linkedin.com/in/john-doe/",
"domain": "acme.com",
"company_name": "Acme",
"custom": { "contact_id": "44479301" }
}
],
"custom": {
"provider": "lonescale",
"enrichment_type": "email and phone"
}
}
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({
enrichment_type: ['email', 'phone'],
contacts: [
{
firstname: 'John',
lastname: 'Doe',
email: 'john@acme.com',
job_title: 'ceo',
linkedin_url: 'https://www.linkedin.com/in/john-doe/',
domain: 'acme.com',
company_name: 'Acme',
custom: {contact_id: '44479301'}
}
],
custom: {provider: 'lonescale', enrichment_type: 'email and phone'}
})
};
fetch('https://public-api.lonescale.com/trigger/enrich/sync', 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://public-api.lonescale.com/trigger/enrich/sync",
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([
'enrichment_type' => [
'email',
'phone'
],
'contacts' => [
[
'firstname' => 'John',
'lastname' => 'Doe',
'email' => 'john@acme.com',
'job_title' => 'ceo',
'linkedin_url' => 'https://www.linkedin.com/in/john-doe/',
'domain' => 'acme.com',
'company_name' => 'Acme',
'custom' => [
'contact_id' => '44479301'
]
]
],
'custom' => [
'provider' => 'lonescale',
'enrichment_type' => 'email and phone'
]
]),
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://public-api.lonescale.com/trigger/enrich/sync"
payload := strings.NewReader("{\n \"enrichment_type\": [\n \"email\",\n \"phone\"\n ],\n \"contacts\": [\n {\n \"firstname\": \"John\",\n \"lastname\": \"Doe\",\n \"email\": \"john@acme.com\",\n \"job_title\": \"ceo\",\n \"linkedin_url\": \"https://www.linkedin.com/in/john-doe/\",\n \"domain\": \"acme.com\",\n \"company_name\": \"Acme\",\n \"custom\": {\n \"contact_id\": \"44479301\"\n }\n }\n ],\n \"custom\": {\n \"provider\": \"lonescale\",\n \"enrichment_type\": \"email and phone\"\n }\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://public-api.lonescale.com/trigger/enrich/sync")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"enrichment_type\": [\n \"email\",\n \"phone\"\n ],\n \"contacts\": [\n {\n \"firstname\": \"John\",\n \"lastname\": \"Doe\",\n \"email\": \"john@acme.com\",\n \"job_title\": \"ceo\",\n \"linkedin_url\": \"https://www.linkedin.com/in/john-doe/\",\n \"domain\": \"acme.com\",\n \"company_name\": \"Acme\",\n \"custom\": {\n \"contact_id\": \"44479301\"\n }\n }\n ],\n \"custom\": {\n \"provider\": \"lonescale\",\n \"enrichment_type\": \"email and phone\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://public-api.lonescale.com/trigger/enrich/sync")
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 \"enrichment_type\": [\n \"email\",\n \"phone\"\n ],\n \"contacts\": [\n {\n \"firstname\": \"John\",\n \"lastname\": \"Doe\",\n \"email\": \"john@acme.com\",\n \"job_title\": \"ceo\",\n \"linkedin_url\": \"https://www.linkedin.com/in/john-doe/\",\n \"domain\": \"acme.com\",\n \"company_name\": \"Acme\",\n \"custom\": {\n \"contact_id\": \"44479301\"\n }\n }\n ],\n \"custom\": {\n \"provider\": \"lonescale\",\n \"enrichment_type\": \"email and phone\"\n }\n}"
response = http.request(request)
puts response.read_body{
"contacts": [
{
"firstName": "John",
"lastName": "Doe",
"fullName": "John Doe",
"linkedinUrl": "https://www.linkedin.com/in/john-doe/",
"jobTitle": "CEO",
"companyName": "Acme",
"companyDomain": "acme.com",
"email": "john@acme.com",
"emailStatus": "valid",
"phone": "+14155552671",
"phoneType": "mobile"
}
]
}{
"message": "Bad request",
"error": "Bad request",
"statusCode": 400
}{
"message": "Invalid API Key",
"error": "Unauthorized",
"statusCode": 401
}{
"message": "User has no enrichment credits",
"error": "Forbidden",
"statusCode": 403
}{
"message": "ThrottlerException: Too Many Requests",
"error": "Too Many Requests",
"statusCode": 429
}Enrich Contacts (Sync)
Enrich contacts synchronously and return results directly in the response — no webhook required.
The response contains all enriched contacts in a single call. Maximum 10 contacts per request. Rate limited to 5 requests per minute, counted per API key — contact us if your integration needs a higher limit, it can be raised per account.
curl --request POST \
--url https://public-api.lonescale.com/trigger/enrich/sync \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"enrichment_type": [
"email",
"phone"
],
"contacts": [
{
"firstname": "John",
"lastname": "Doe",
"email": "john@acme.com",
"job_title": "ceo",
"linkedin_url": "https://www.linkedin.com/in/john-doe/",
"domain": "acme.com",
"company_name": "Acme",
"custom": {
"contact_id": "44479301"
}
}
],
"custom": {
"provider": "lonescale",
"enrichment_type": "email and phone"
}
}
'import requests
url = "https://public-api.lonescale.com/trigger/enrich/sync"
payload = {
"enrichment_type": ["email", "phone"],
"contacts": [
{
"firstname": "John",
"lastname": "Doe",
"email": "john@acme.com",
"job_title": "ceo",
"linkedin_url": "https://www.linkedin.com/in/john-doe/",
"domain": "acme.com",
"company_name": "Acme",
"custom": { "contact_id": "44479301" }
}
],
"custom": {
"provider": "lonescale",
"enrichment_type": "email and phone"
}
}
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({
enrichment_type: ['email', 'phone'],
contacts: [
{
firstname: 'John',
lastname: 'Doe',
email: 'john@acme.com',
job_title: 'ceo',
linkedin_url: 'https://www.linkedin.com/in/john-doe/',
domain: 'acme.com',
company_name: 'Acme',
custom: {contact_id: '44479301'}
}
],
custom: {provider: 'lonescale', enrichment_type: 'email and phone'}
})
};
fetch('https://public-api.lonescale.com/trigger/enrich/sync', 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://public-api.lonescale.com/trigger/enrich/sync",
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([
'enrichment_type' => [
'email',
'phone'
],
'contacts' => [
[
'firstname' => 'John',
'lastname' => 'Doe',
'email' => 'john@acme.com',
'job_title' => 'ceo',
'linkedin_url' => 'https://www.linkedin.com/in/john-doe/',
'domain' => 'acme.com',
'company_name' => 'Acme',
'custom' => [
'contact_id' => '44479301'
]
]
],
'custom' => [
'provider' => 'lonescale',
'enrichment_type' => 'email and phone'
]
]),
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://public-api.lonescale.com/trigger/enrich/sync"
payload := strings.NewReader("{\n \"enrichment_type\": [\n \"email\",\n \"phone\"\n ],\n \"contacts\": [\n {\n \"firstname\": \"John\",\n \"lastname\": \"Doe\",\n \"email\": \"john@acme.com\",\n \"job_title\": \"ceo\",\n \"linkedin_url\": \"https://www.linkedin.com/in/john-doe/\",\n \"domain\": \"acme.com\",\n \"company_name\": \"Acme\",\n \"custom\": {\n \"contact_id\": \"44479301\"\n }\n }\n ],\n \"custom\": {\n \"provider\": \"lonescale\",\n \"enrichment_type\": \"email and phone\"\n }\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://public-api.lonescale.com/trigger/enrich/sync")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"enrichment_type\": [\n \"email\",\n \"phone\"\n ],\n \"contacts\": [\n {\n \"firstname\": \"John\",\n \"lastname\": \"Doe\",\n \"email\": \"john@acme.com\",\n \"job_title\": \"ceo\",\n \"linkedin_url\": \"https://www.linkedin.com/in/john-doe/\",\n \"domain\": \"acme.com\",\n \"company_name\": \"Acme\",\n \"custom\": {\n \"contact_id\": \"44479301\"\n }\n }\n ],\n \"custom\": {\n \"provider\": \"lonescale\",\n \"enrichment_type\": \"email and phone\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://public-api.lonescale.com/trigger/enrich/sync")
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 \"enrichment_type\": [\n \"email\",\n \"phone\"\n ],\n \"contacts\": [\n {\n \"firstname\": \"John\",\n \"lastname\": \"Doe\",\n \"email\": \"john@acme.com\",\n \"job_title\": \"ceo\",\n \"linkedin_url\": \"https://www.linkedin.com/in/john-doe/\",\n \"domain\": \"acme.com\",\n \"company_name\": \"Acme\",\n \"custom\": {\n \"contact_id\": \"44479301\"\n }\n }\n ],\n \"custom\": {\n \"provider\": \"lonescale\",\n \"enrichment_type\": \"email and phone\"\n }\n}"
response = http.request(request)
puts response.read_body{
"contacts": [
{
"firstName": "John",
"lastName": "Doe",
"fullName": "John Doe",
"linkedinUrl": "https://www.linkedin.com/in/john-doe/",
"jobTitle": "CEO",
"companyName": "Acme",
"companyDomain": "acme.com",
"email": "john@acme.com",
"emailStatus": "valid",
"phone": "+14155552671",
"phoneType": "mobile"
}
]
}{
"message": "Bad request",
"error": "Bad request",
"statusCode": 400
}{
"message": "Invalid API Key",
"error": "Unauthorized",
"statusCode": 401
}{
"message": "User has no enrichment credits",
"error": "Forbidden",
"statusCode": 403
}{
"message": "ThrottlerException: Too Many Requests",
"error": "Too Many Requests",
"statusCode": 429
}Authorizations
Provide your API key in the x-api-key header.
Body
Types of enrichment to perform.
1email, phone, profile Contacts to enrich. Maximum 10 contacts per request.
1 - 10 elementsShow child attributes
Show child attributes
Show child attributes
Show child attributes
When true, each contact in the response will include a jobChangeDetected field indicating whether the contact has changed company since the input data was provided.
Only effective when enrichment_type includes "profile".
Opt out of the 24h enrichment cache for this call. When a contact was already enriched for your account within the last 24 hours, the cached result is returned and no credits are consumed; pass true to force a fresh enrichment instead (credits are consumed and the cache entry is refreshed).
Push the enriched contact into your connected CRM. Disabled by default: without it, this endpoint only enriches and never writes to your CRM.
When true, the write-back uses the integration mapping configured for the Chrome extension (contact unicity criteria, create fields, company create fields). It can therefore create contacts and companies that did not exist, and the created records are owned by the CRM user linked to the API key holder.
To push records to your CRM with a dedicated mapping and a run status, use POST /trigger/crm-sync instead.
Reserved for LoneScale-hosted callers (the Slack bot). Meters the enrichment on the API key holder's per-user Chrome quota instead of the organization balance, and answers 403 when that quota is reached. Requires source_signature; leave both unset for integrations.
slack Signature proving source comes from LoneScale. Set by the LoneScale Slack agent; integrations never send it.
Response
Contacts enriched successfully
List of enriched contacts.
Show child attributes
Show child attributes

