curl --request POST \
--url https://public-api.lonescale.com/trigger/contact-sourcing/sync \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"company_name": "Acme Corp",
"company_domain": "acme.com",
"company_linkedin_url": "https://www.linkedin.com/company/acme",
"personas": [
{
"name": "Tech Leaders",
"job_titles": [
"CTO",
"VP Engineering"
]
}
],
"limit": 5,
"custom": {
"id": "12356",
"provider": "lonescale"
}
}
'import requests
url = "https://public-api.lonescale.com/trigger/contact-sourcing/sync"
payload = {
"company_name": "Acme Corp",
"company_domain": "acme.com",
"company_linkedin_url": "https://www.linkedin.com/company/acme",
"personas": [
{
"name": "Tech Leaders",
"job_titles": ["CTO", "VP Engineering"]
}
],
"limit": 5,
"custom": {
"id": "12356",
"provider": "lonescale"
}
}
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({
company_name: 'Acme Corp',
company_domain: 'acme.com',
company_linkedin_url: 'https://www.linkedin.com/company/acme',
personas: [{name: 'Tech Leaders', job_titles: ['CTO', 'VP Engineering']}],
limit: 5,
custom: {id: '12356', provider: 'lonescale'}
})
};
fetch('https://public-api.lonescale.com/trigger/contact-sourcing/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/contact-sourcing/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([
'company_name' => 'Acme Corp',
'company_domain' => 'acme.com',
'company_linkedin_url' => 'https://www.linkedin.com/company/acme',
'personas' => [
[
'name' => 'Tech Leaders',
'job_titles' => [
'CTO',
'VP Engineering'
]
]
],
'limit' => 5,
'custom' => [
'id' => '12356',
'provider' => 'lonescale'
]
]),
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/contact-sourcing/sync"
payload := strings.NewReader("{\n \"company_name\": \"Acme Corp\",\n \"company_domain\": \"acme.com\",\n \"company_linkedin_url\": \"https://www.linkedin.com/company/acme\",\n \"personas\": [\n {\n \"name\": \"Tech Leaders\",\n \"job_titles\": [\n \"CTO\",\n \"VP Engineering\"\n ]\n }\n ],\n \"limit\": 5,\n \"custom\": {\n \"id\": \"12356\",\n \"provider\": \"lonescale\"\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/contact-sourcing/sync")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"company_name\": \"Acme Corp\",\n \"company_domain\": \"acme.com\",\n \"company_linkedin_url\": \"https://www.linkedin.com/company/acme\",\n \"personas\": [\n {\n \"name\": \"Tech Leaders\",\n \"job_titles\": [\n \"CTO\",\n \"VP Engineering\"\n ]\n }\n ],\n \"limit\": 5,\n \"custom\": {\n \"id\": \"12356\",\n \"provider\": \"lonescale\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://public-api.lonescale.com/trigger/contact-sourcing/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 \"company_name\": \"Acme Corp\",\n \"company_domain\": \"acme.com\",\n \"company_linkedin_url\": \"https://www.linkedin.com/company/acme\",\n \"personas\": [\n {\n \"name\": \"Tech Leaders\",\n \"job_titles\": [\n \"CTO\",\n \"VP Engineering\"\n ]\n }\n ],\n \"limit\": 5,\n \"custom\": {\n \"id\": \"12356\",\n \"provider\": \"lonescale\"\n }\n}"
response = http.request(request)
puts response.read_body{
"contacts": [
{
"lonescale_full_name": "Jane Doe",
"lonescale_first_name": "Jane",
"lonescale_last_name": "Doe",
"lonescale_linkedin_url": "https://www.linkedin.com/in/janedoe",
"lonescale_job_title": "CTO",
"lonescale_job_seniority": "C_SUITE",
"lonescale_country_code": "US",
"lonescale_geo_country_name": "United States",
"lonescale_company_name": "Acme Corp",
"lonescale_company_domain": "acme.com",
"lonescale_company_industry": "Software",
"lonescale_company_staff_count": 250,
"client_company_name": "Acme Corp",
"client_company_domain": "acme.com"
}
],
"profiles_found": 1,
"partial": false,
"elapsed_ms": 18342
}{
"message": "Bad request",
"error": "Bad request",
"statusCode": 400
}{
"message": "Invalid API Key",
"error": "Unauthorized",
"statusCode": 401
}{
"message": "User has no contact credits",
"error": "Forbidden",
"statusCode": 403
}{
"message": "ThrottlerException: Too Many Requests",
"error": "Too Many Requests",
"statusCode": 429
}Search Contacts (Sync)
Search contacts synchronously and return results directly in the response — no webhook required.
The response contains all sourced contacts in a single call. Maximum 10 contacts per request. Rate limited to 5 requests per minute.
Time budget. A sync call answers within about 45 seconds. Personas are searched in the order you send them and share the limit, so put the most important ones first. When the budget runs out before the limit is reached, the response has partial: true: retry with fewer personas, or use the asynchronous endpoint /trigger/contact-sourcing with a webhook_url, which has no time budget. Only the contacts returned are charged.
curl --request POST \
--url https://public-api.lonescale.com/trigger/contact-sourcing/sync \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"company_name": "Acme Corp",
"company_domain": "acme.com",
"company_linkedin_url": "https://www.linkedin.com/company/acme",
"personas": [
{
"name": "Tech Leaders",
"job_titles": [
"CTO",
"VP Engineering"
]
}
],
"limit": 5,
"custom": {
"id": "12356",
"provider": "lonescale"
}
}
'import requests
url = "https://public-api.lonescale.com/trigger/contact-sourcing/sync"
payload = {
"company_name": "Acme Corp",
"company_domain": "acme.com",
"company_linkedin_url": "https://www.linkedin.com/company/acme",
"personas": [
{
"name": "Tech Leaders",
"job_titles": ["CTO", "VP Engineering"]
}
],
"limit": 5,
"custom": {
"id": "12356",
"provider": "lonescale"
}
}
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({
company_name: 'Acme Corp',
company_domain: 'acme.com',
company_linkedin_url: 'https://www.linkedin.com/company/acme',
personas: [{name: 'Tech Leaders', job_titles: ['CTO', 'VP Engineering']}],
limit: 5,
custom: {id: '12356', provider: 'lonescale'}
})
};
fetch('https://public-api.lonescale.com/trigger/contact-sourcing/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/contact-sourcing/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([
'company_name' => 'Acme Corp',
'company_domain' => 'acme.com',
'company_linkedin_url' => 'https://www.linkedin.com/company/acme',
'personas' => [
[
'name' => 'Tech Leaders',
'job_titles' => [
'CTO',
'VP Engineering'
]
]
],
'limit' => 5,
'custom' => [
'id' => '12356',
'provider' => 'lonescale'
]
]),
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/contact-sourcing/sync"
payload := strings.NewReader("{\n \"company_name\": \"Acme Corp\",\n \"company_domain\": \"acme.com\",\n \"company_linkedin_url\": \"https://www.linkedin.com/company/acme\",\n \"personas\": [\n {\n \"name\": \"Tech Leaders\",\n \"job_titles\": [\n \"CTO\",\n \"VP Engineering\"\n ]\n }\n ],\n \"limit\": 5,\n \"custom\": {\n \"id\": \"12356\",\n \"provider\": \"lonescale\"\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/contact-sourcing/sync")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"company_name\": \"Acme Corp\",\n \"company_domain\": \"acme.com\",\n \"company_linkedin_url\": \"https://www.linkedin.com/company/acme\",\n \"personas\": [\n {\n \"name\": \"Tech Leaders\",\n \"job_titles\": [\n \"CTO\",\n \"VP Engineering\"\n ]\n }\n ],\n \"limit\": 5,\n \"custom\": {\n \"id\": \"12356\",\n \"provider\": \"lonescale\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://public-api.lonescale.com/trigger/contact-sourcing/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 \"company_name\": \"Acme Corp\",\n \"company_domain\": \"acme.com\",\n \"company_linkedin_url\": \"https://www.linkedin.com/company/acme\",\n \"personas\": [\n {\n \"name\": \"Tech Leaders\",\n \"job_titles\": [\n \"CTO\",\n \"VP Engineering\"\n ]\n }\n ],\n \"limit\": 5,\n \"custom\": {\n \"id\": \"12356\",\n \"provider\": \"lonescale\"\n }\n}"
response = http.request(request)
puts response.read_body{
"contacts": [
{
"lonescale_full_name": "Jane Doe",
"lonescale_first_name": "Jane",
"lonescale_last_name": "Doe",
"lonescale_linkedin_url": "https://www.linkedin.com/in/janedoe",
"lonescale_job_title": "CTO",
"lonescale_job_seniority": "C_SUITE",
"lonescale_country_code": "US",
"lonescale_geo_country_name": "United States",
"lonescale_company_name": "Acme Corp",
"lonescale_company_domain": "acme.com",
"lonescale_company_industry": "Software",
"lonescale_company_staff_count": 250,
"client_company_name": "Acme Corp",
"client_company_domain": "acme.com"
}
],
"profiles_found": 1,
"partial": false,
"elapsed_ms": 18342
}{
"message": "Bad request",
"error": "Bad request",
"statusCode": 400
}{
"message": "Invalid API Key",
"error": "Unauthorized",
"statusCode": 401
}{
"message": "User has no contact 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
Personas to use to search and filter contacts within the company.
1Show child attributes
Show child attributes
Company domain or website to search contacts from.
Company name to search contacts from.
Company LinkedIn URL used to search contacts, increasing result coverage and accuracy by 25%.
List of country codes (ISO 3166-1 alpha-2) to include in the search.
ISO 3166-1 alpha-2 country code
AF, AL, DZ, AS, AD, AO, AI, AQ, AG, AR, AM, AW, AU, AT, AZ, BS, BH, BD, BB, BY, BE, BZ, BJ, BM, BT, BO, BQ, BA, BW, BV, BR, IO, BN, BG, BF, BI, CV, KH, CM, CA, KY, CF, TD, CL, CN, CX, CC, CO, KM, CD, CG, CK, CR, HR, CU, CW, CY, CZ, CI, DK, DJ, DM, DO, EC, EG, SV, GQ, ER, EE, SZ, ET, FK, FO, FJ, FI, FR, GF, PF, TF, GA, GM, GE, DE, GH, GI, GR, GL, GD, GP, GU, GT, GG, GN, GW, GY, HT, HM, HN, HK, HU, IS, IN, ID, IR, IQ, IE, IM, IL, IT, JM, JP, JE, JO, KZ, KE, KI, KR, KW, KG, LA, LV, LB, LS, LR, LY, LI, LT, LU, MO, MG, MW, MY, MV, ML, MT, MH, MQ, MR, MU, YT, MX, FM, MD, MC, MN, ME, MS, MA, MZ, MM, NA, NR, NP, NL, NC, NZ, NI, NE, NG, NU, NF, MP, NO, OM, PK, PW, PS, PA, PG, PY, PE, PH, PN, PL, PT, PR, QA, MK, RO, RU, RW, RE, BL, SH, KN, LC, MF, PM, VC, WS, SM, ST, SA, SN, RS, SC, SL, SG, SX, SK, SI, SB, SO, ZA, GS, SS, ES, LK, SD, SR, SJ, SE, CH, SY, TW, TJ, TZ, TH, TL, TG, TK, TO, TT, TN, TR, TM, TC, TV, UG, UA, AE, GB, UM, US, UY, UZ, VU, VE, VN, VG, VI, WF, EH, YE, ZM, ZW, AX List of city names to filter contacts by. Unlike included_locations, cities are not used as a search filter: contacts are sourced first, then only those whose location contains one of these cities are returned. City spelling is revalidated against included_locations, so both local and English spellings work (Bruxelles / Brussels, Zürich / Zurich), and combining included_cities: ["Paris"] with included_locations: ["FR"] excludes Paris, Texas. A contact whose city cannot be determined is not returned.
["Paris", "Lyon"]
Maximum number of contacts to retrieve. Capped at 10.
x <= 10List of seniority levels to filter contacts by.
Seniority level of a contact.
owner, founder, c-suite, partner, vp, head, director, manager, senior, entry, intern Disable enrichment of company information for each contact, such as industry, size, etc.
Show child attributes
Show child attributes
Response
Contacts sourced successfully
List of sourced contacts.
Show child attributes
Show child attributes
Total number of contacts found.
true when the time budget ran out before limit contacts were found. The contacts returned are valid; the last personas were not fully searched.
Time spent searching, in milliseconds.

