curl --request POST \
--url https://app.leonar.app/api/v1/sourcing/linkedin/search \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"project_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"account_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"search_url": "<string>",
"job_titles": [
"<string>"
],
"companies": [
"<string>"
],
"keywords": [
"<string>"
],
"boolean_query": "<string>",
"schools": [
"<string>"
],
"location_ids": {},
"years_experience": {
"min": 123,
"max": 123
},
"first_name": "<string>",
"last_name": "<string>",
"connection_degree": [],
"is_open_to_work": true,
"cursor": "<string>",
"page": 1,
"page_size": 20
}
'import requests
url = "https://app.leonar.app/api/v1/sourcing/linkedin/search"
payload = {
"project_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"account_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"search_url": "<string>",
"job_titles": ["<string>"],
"companies": ["<string>"],
"keywords": ["<string>"],
"boolean_query": "<string>",
"schools": ["<string>"],
"location_ids": {},
"years_experience": {
"min": 123,
"max": 123
},
"first_name": "<string>",
"last_name": "<string>",
"connection_degree": [],
"is_open_to_work": True,
"cursor": "<string>",
"page": 1,
"page_size": 20
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
project_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
account_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
search_url: '<string>',
job_titles: ['<string>'],
companies: ['<string>'],
keywords: ['<string>'],
boolean_query: '<string>',
schools: ['<string>'],
location_ids: {},
years_experience: {min: 123, max: 123},
first_name: '<string>',
last_name: '<string>',
connection_degree: [],
is_open_to_work: true,
cursor: '<string>',
page: 1,
page_size: 20
})
};
fetch('https://app.leonar.app/api/v1/sourcing/linkedin/search', 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://app.leonar.app/api/v1/sourcing/linkedin/search",
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([
'project_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'account_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'search_url' => '<string>',
'job_titles' => [
'<string>'
],
'companies' => [
'<string>'
],
'keywords' => [
'<string>'
],
'boolean_query' => '<string>',
'schools' => [
'<string>'
],
'location_ids' => [
],
'years_experience' => [
'min' => 123,
'max' => 123
],
'first_name' => '<string>',
'last_name' => '<string>',
'connection_degree' => [
],
'is_open_to_work' => true,
'cursor' => '<string>',
'page' => 1,
'page_size' => 20
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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://app.leonar.app/api/v1/sourcing/linkedin/search"
payload := strings.NewReader("{\n \"project_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"account_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"search_url\": \"<string>\",\n \"job_titles\": [\n \"<string>\"\n ],\n \"companies\": [\n \"<string>\"\n ],\n \"keywords\": [\n \"<string>\"\n ],\n \"boolean_query\": \"<string>\",\n \"schools\": [\n \"<string>\"\n ],\n \"location_ids\": {},\n \"years_experience\": {\n \"min\": 123,\n \"max\": 123\n },\n \"first_name\": \"<string>\",\n \"last_name\": \"<string>\",\n \"connection_degree\": [],\n \"is_open_to_work\": true,\n \"cursor\": \"<string>\",\n \"page\": 1,\n \"page_size\": 20\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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://app.leonar.app/api/v1/sourcing/linkedin/search")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"project_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"account_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"search_url\": \"<string>\",\n \"job_titles\": [\n \"<string>\"\n ],\n \"companies\": [\n \"<string>\"\n ],\n \"keywords\": [\n \"<string>\"\n ],\n \"boolean_query\": \"<string>\",\n \"schools\": [\n \"<string>\"\n ],\n \"location_ids\": {},\n \"years_experience\": {\n \"min\": 123,\n \"max\": 123\n },\n \"first_name\": \"<string>\",\n \"last_name\": \"<string>\",\n \"connection_degree\": [],\n \"is_open_to_work\": true,\n \"cursor\": \"<string>\",\n \"page\": 1,\n \"page_size\": 20\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.leonar.app/api/v1/sourcing/linkedin/search")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"project_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"account_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"search_url\": \"<string>\",\n \"job_titles\": [\n \"<string>\"\n ],\n \"companies\": [\n \"<string>\"\n ],\n \"keywords\": [\n \"<string>\"\n ],\n \"boolean_query\": \"<string>\",\n \"schools\": [\n \"<string>\"\n ],\n \"location_ids\": {},\n \"years_experience\": {\n \"min\": 123,\n \"max\": 123\n },\n \"first_name\": \"<string>\",\n \"last_name\": \"<string>\",\n \"connection_degree\": [],\n \"is_open_to_work\": true,\n \"cursor\": \"<string>\",\n \"page\": 1,\n \"page_size\": 20\n}"
response = http.request(request)
puts response.read_body{
"data": {
"profiles": [
{
"profile_id": "ACwAABrjaVMBOLcCrV5aEw1zCAjE_zec6PbnU1A",
"first_name": "Sophie",
"last_name": "Martin",
"headline": "Senior Software Engineer at Doctolib",
"picture_url": "https://media.licdn.com/dms/image/example.jpg",
"location": "Paris, Île-de-France, France",
"linkedin_url": "https://www.linkedin.com/in/sophie-martin",
"summary": "Experienced engineer with 8 years in full-stack development...",
"current_job": {
"title": "Senior Software Engineer",
"company_name": "Doctolib"
},
"experiences": [
{
"title": "Senior Software Engineer",
"company_name": "Doctolib",
"start_date": "2021-03-01",
"end_date": null,
"description": "Leading backend team, Python/Django stack...",
"is_current": true
},
{
"title": "Software Engineer",
"company_name": "Criteo",
"start_date": "2018-01-01",
"end_date": "2021-02-28",
"description": "Built real-time bidding systems in Python...",
"is_current": false
}
],
"educations": [
{
"educational_establishment": "École Polytechnique",
"diploma": "Master of Engineering",
"specialization": "Computer Science",
"start_date": "2014-09-01",
"end_date": "2018-06-30"
}
],
"skills": [
"Python",
"Django",
"TypeScript",
"PostgreSQL"
],
"total_years_experience": 8.2,
"already_in_project": false,
"existing_contact_id": null
}
],
"total_count": 123,
"filtered_count": 123,
"next_page": 123,
"cursor": "<string>",
"filters_too_strict": true,
"has_more": true
}
}{
"error": {
"code": "validation_error",
"message": "Invalid input"
}
}{
"error": {
"code": "invalid_api_key",
"message": "Invalid API key"
}
}Search LinkedIn profiles
Search LinkedIn profiles via a connected account. Flat schema — no nested filters object.
LinkedIn pagination is cursor-based. Send the first request without cursor, then pass the returned cursor on the next request. Do not paginate LinkedIn by sending only page: 2; it can return the same profiles as page 1. page / next_page are compatibility fields only.
curl --request POST \
--url https://app.leonar.app/api/v1/sourcing/linkedin/search \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"project_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"account_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"search_url": "<string>",
"job_titles": [
"<string>"
],
"companies": [
"<string>"
],
"keywords": [
"<string>"
],
"boolean_query": "<string>",
"schools": [
"<string>"
],
"location_ids": {},
"years_experience": {
"min": 123,
"max": 123
},
"first_name": "<string>",
"last_name": "<string>",
"connection_degree": [],
"is_open_to_work": true,
"cursor": "<string>",
"page": 1,
"page_size": 20
}
'import requests
url = "https://app.leonar.app/api/v1/sourcing/linkedin/search"
payload = {
"project_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"account_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"search_url": "<string>",
"job_titles": ["<string>"],
"companies": ["<string>"],
"keywords": ["<string>"],
"boolean_query": "<string>",
"schools": ["<string>"],
"location_ids": {},
"years_experience": {
"min": 123,
"max": 123
},
"first_name": "<string>",
"last_name": "<string>",
"connection_degree": [],
"is_open_to_work": True,
"cursor": "<string>",
"page": 1,
"page_size": 20
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
project_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
account_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
search_url: '<string>',
job_titles: ['<string>'],
companies: ['<string>'],
keywords: ['<string>'],
boolean_query: '<string>',
schools: ['<string>'],
location_ids: {},
years_experience: {min: 123, max: 123},
first_name: '<string>',
last_name: '<string>',
connection_degree: [],
is_open_to_work: true,
cursor: '<string>',
page: 1,
page_size: 20
})
};
fetch('https://app.leonar.app/api/v1/sourcing/linkedin/search', 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://app.leonar.app/api/v1/sourcing/linkedin/search",
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([
'project_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'account_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'search_url' => '<string>',
'job_titles' => [
'<string>'
],
'companies' => [
'<string>'
],
'keywords' => [
'<string>'
],
'boolean_query' => '<string>',
'schools' => [
'<string>'
],
'location_ids' => [
],
'years_experience' => [
'min' => 123,
'max' => 123
],
'first_name' => '<string>',
'last_name' => '<string>',
'connection_degree' => [
],
'is_open_to_work' => true,
'cursor' => '<string>',
'page' => 1,
'page_size' => 20
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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://app.leonar.app/api/v1/sourcing/linkedin/search"
payload := strings.NewReader("{\n \"project_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"account_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"search_url\": \"<string>\",\n \"job_titles\": [\n \"<string>\"\n ],\n \"companies\": [\n \"<string>\"\n ],\n \"keywords\": [\n \"<string>\"\n ],\n \"boolean_query\": \"<string>\",\n \"schools\": [\n \"<string>\"\n ],\n \"location_ids\": {},\n \"years_experience\": {\n \"min\": 123,\n \"max\": 123\n },\n \"first_name\": \"<string>\",\n \"last_name\": \"<string>\",\n \"connection_degree\": [],\n \"is_open_to_work\": true,\n \"cursor\": \"<string>\",\n \"page\": 1,\n \"page_size\": 20\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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://app.leonar.app/api/v1/sourcing/linkedin/search")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"project_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"account_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"search_url\": \"<string>\",\n \"job_titles\": [\n \"<string>\"\n ],\n \"companies\": [\n \"<string>\"\n ],\n \"keywords\": [\n \"<string>\"\n ],\n \"boolean_query\": \"<string>\",\n \"schools\": [\n \"<string>\"\n ],\n \"location_ids\": {},\n \"years_experience\": {\n \"min\": 123,\n \"max\": 123\n },\n \"first_name\": \"<string>\",\n \"last_name\": \"<string>\",\n \"connection_degree\": [],\n \"is_open_to_work\": true,\n \"cursor\": \"<string>\",\n \"page\": 1,\n \"page_size\": 20\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.leonar.app/api/v1/sourcing/linkedin/search")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"project_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"account_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"search_url\": \"<string>\",\n \"job_titles\": [\n \"<string>\"\n ],\n \"companies\": [\n \"<string>\"\n ],\n \"keywords\": [\n \"<string>\"\n ],\n \"boolean_query\": \"<string>\",\n \"schools\": [\n \"<string>\"\n ],\n \"location_ids\": {},\n \"years_experience\": {\n \"min\": 123,\n \"max\": 123\n },\n \"first_name\": \"<string>\",\n \"last_name\": \"<string>\",\n \"connection_degree\": [],\n \"is_open_to_work\": true,\n \"cursor\": \"<string>\",\n \"page\": 1,\n \"page_size\": 20\n}"
response = http.request(request)
puts response.read_body{
"data": {
"profiles": [
{
"profile_id": "ACwAABrjaVMBOLcCrV5aEw1zCAjE_zec6PbnU1A",
"first_name": "Sophie",
"last_name": "Martin",
"headline": "Senior Software Engineer at Doctolib",
"picture_url": "https://media.licdn.com/dms/image/example.jpg",
"location": "Paris, Île-de-France, France",
"linkedin_url": "https://www.linkedin.com/in/sophie-martin",
"summary": "Experienced engineer with 8 years in full-stack development...",
"current_job": {
"title": "Senior Software Engineer",
"company_name": "Doctolib"
},
"experiences": [
{
"title": "Senior Software Engineer",
"company_name": "Doctolib",
"start_date": "2021-03-01",
"end_date": null,
"description": "Leading backend team, Python/Django stack...",
"is_current": true
},
{
"title": "Software Engineer",
"company_name": "Criteo",
"start_date": "2018-01-01",
"end_date": "2021-02-28",
"description": "Built real-time bidding systems in Python...",
"is_current": false
}
],
"educations": [
{
"educational_establishment": "École Polytechnique",
"diploma": "Master of Engineering",
"specialization": "Computer Science",
"start_date": "2014-09-01",
"end_date": "2018-06-30"
}
],
"skills": [
"Python",
"Django",
"TypeScript",
"PostgreSQL"
],
"total_years_experience": 8.2,
"already_in_project": false,
"existing_contact_id": null
}
],
"total_count": 123,
"filtered_count": 123,
"next_page": 123,
"cursor": "<string>",
"filters_too_strict": true,
"has_more": true
}
}{
"error": {
"code": "validation_error",
"message": "Invalid input"
}
}{
"error": {
"code": "invalid_api_key",
"message": "Invalid API key"
}
}Authorizations
API key starting with leo_
Body
Connected LinkedIn account ID
recruiter, sales_navigator Alternative to filters — pass a LinkedIn search URL directly
Boolean search query using AND, OR, NOT operators and quoted phrases. Example: (Python OR Java) AND "Software Engineer" AND NOT Intern. See the Boolean search guide for full syntax.
LinkedIn geo IDs mapped to display names. Do NOT use plain-text names — call GET /sourcing/linkedin/locations?q=<name>&account_id=<id> first to resolve. Example: {"103644278": "New York"}
Show child attributes
Show child attributes
Show child attributes
Show child attributes
1, 2, 3 Opaque cursor returned by the previous LinkedIn search response. Use this, not page alone, to load the next LinkedIn page.
Compatibility page number. For LinkedIn pagination, do not send page: 2 without the previous response cursor.
x >= 11 <= x <= 25Response
Search results
Show child attributes
Show child attributes