curl --request POST \
--url https://app.loice.ai/api/v1/linkedin-search \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"firstName": "Satya",
"lastName": "Nadella"
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({firstName: 'Satya', lastName: 'Nadella'})
};
fetch('https://app.loice.ai/api/v1/linkedin-search', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));const url = 'https://app.loice.ai/api/v1/linkedin-search';
const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({firstName: 'Satya', lastName: 'Nadella'})
};
fetch(url, options)
.then(res => res.json())
.then(json => console.log(json))
.catch(err => console.error(err));import requests
url = "https://app.loice.ai/api/v1/linkedin-search"
payload = {
"firstName": "Satya",
"lastName": "Nadella"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"data": {
"matches": [
{
"name": "Satya Nadella",
"headline": "Chairman and CEO at Microsoft",
"companyName": "Microsoft",
"title": "Chairman and CEO",
"location": "Redmond, Washington, United States",
"linkedinUrl": "https://www.linkedin.com/in/satyanadella/"
}
],
"charged": true,
"pointsCharged": 1,
"balance": {
"available": 99,
"reserved": 0,
"granted": 100
},
"reason": null,
"cached": false,
"replay": false,
"creditsCharged": 1
}
}{
"error": {
"code": "validation_error",
"message": "<string>",
"retryAfterSeconds": 123
}
}{
"error": {
"code": "validation_error",
"message": "<string>",
"retryAfterSeconds": 123
}
}{
"error": {
"code": "validation_error",
"message": "<string>",
"retryAfterSeconds": 123
}
}{
"error": {
"code": "validation_error",
"message": "<string>",
"retryAfterSeconds": 123
}
}{
"error": {
"code": "validation_error",
"message": "<string>",
"retryAfterSeconds": 123
}
}{
"error": {
"code": "validation_error",
"message": "<string>",
"retryAfterSeconds": 123
}
}{
"error": {
"code": "validation_error",
"message": "<string>",
"retryAfterSeconds": 123
}
}Search LinkedIn profiles by name
Searches public LinkedIn profiles for a person by first and last name, optionally narrowed by employer. Returns candidate profiles with their headline, parsed employer and title, location, and profile URL — feed a chosen linkedinUrl into POST /api/v1/find (linkedin mode) to get a verified email for it. At most one candidate comes back; a completed not-found carries no reason. Send an Idempotency-Key to make a retry safe: the same key replays the first answer, uncharged. Rate limited per workspace.
Billing
- charged per completed search — matches or none — never on provider errors.
The current cost is shown in the app under Settings → Billing and in the live GET /api/v1/openapi.json. Calls that end in a system or provider error (HTTP 500) or are rate limited (HTTP 429) are not billed. The charged and pointsCharged fields of the response state what this call actually consumed.
curl --request POST \
--url https://app.loice.ai/api/v1/linkedin-search \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"firstName": "Satya",
"lastName": "Nadella"
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({firstName: 'Satya', lastName: 'Nadella'})
};
fetch('https://app.loice.ai/api/v1/linkedin-search', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));const url = 'https://app.loice.ai/api/v1/linkedin-search';
const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({firstName: 'Satya', lastName: 'Nadella'})
};
fetch(url, options)
.then(res => res.json())
.then(json => console.log(json))
.catch(err => console.error(err));import requests
url = "https://app.loice.ai/api/v1/linkedin-search"
payload = {
"firstName": "Satya",
"lastName": "Nadella"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"data": {
"matches": [
{
"name": "Satya Nadella",
"headline": "Chairman and CEO at Microsoft",
"companyName": "Microsoft",
"title": "Chairman and CEO",
"location": "Redmond, Washington, United States",
"linkedinUrl": "https://www.linkedin.com/in/satyanadella/"
}
],
"charged": true,
"pointsCharged": 1,
"balance": {
"available": 99,
"reserved": 0,
"granted": 100
},
"reason": null,
"cached": false,
"replay": false,
"creditsCharged": 1
}
}{
"error": {
"code": "validation_error",
"message": "<string>",
"retryAfterSeconds": 123
}
}{
"error": {
"code": "validation_error",
"message": "<string>",
"retryAfterSeconds": 123
}
}{
"error": {
"code": "validation_error",
"message": "<string>",
"retryAfterSeconds": 123
}
}{
"error": {
"code": "validation_error",
"message": "<string>",
"retryAfterSeconds": 123
}
}{
"error": {
"code": "validation_error",
"message": "<string>",
"retryAfterSeconds": 123
}
}{
"error": {
"code": "validation_error",
"message": "<string>",
"retryAfterSeconds": 123
}
}{
"error": {
"code": "validation_error",
"message": "<string>",
"retryAfterSeconds": 123
}
}Authorizations
Workspace API key (loice_sk_ + 48 hex characters), created under Settings → API Keys. Sent as Authorization: Bearer loice_sk_…. Invalid, missing, or expired keys are rejected with 401 before any billable work happens.
Body
Response
Search completed (including zero-match outcomes — inspect matches, reason, and charged).
Show child attributes
Show child attributes

