Get LinkedIn Contact Info
curl --request POST \
--url https://api.minerva.io/v2/get_li_contact_info \
--header 'Content-Type: <content-type>' \
--header 'x-api-key: <api-key>' \
--data '
{
"records": [
"<string>"
],
"presence_only": true
}
'import requests
url = "https://api.minerva.io/v2/get_li_contact_info"
payload = {
"records": ["<string>"],
"presence_only": True
}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "<content-type>"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': '<content-type>'},
body: JSON.stringify({records: ['<string>'], presence_only: true})
};
fetch('https://api.minerva.io/v2/get_li_contact_info', 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://api.minerva.io/v2/get_li_contact_info",
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([
'records' => [
'<string>'
],
'presence_only' => true
]),
CURLOPT_HTTPHEADER => [
"Content-Type: <content-type>",
"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://api.minerva.io/v2/get_li_contact_info"
payload := strings.NewReader("{\n \"records\": [\n \"<string>\"\n ],\n \"presence_only\": true\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<api-key>")
req.Header.Add("Content-Type", "<content-type>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.minerva.io/v2/get_li_contact_info")
.header("x-api-key", "<api-key>")
.header("Content-Type", "<content-type>")
.body("{\n \"records\": [\n \"<string>\"\n ],\n \"presence_only\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.minerva.io/v2/get_li_contact_info")
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"] = '<content-type>'
request.body = "{\n \"records\": [\n \"<string>\"\n ],\n \"presence_only\": true\n}"
response = http.request(request)
puts response.read_body{
"api_request_id": "a7bf5e42-6825-481b-9422-f3ec88b65382",
"results": [
{
"linkedin_username": "johnsmith",
"is_match": true,
"phones": [
{
"phone_rank": "1",
"phone_type": "mobile",
"phone_number": "(213) 761-9492",
"confidence_score": 92
}
],
"personal_emails": [
{
"email_rank": "1",
"email_address": "john.smith@gmail.com",
"confidence_score": 99
},
{
"email_rank": "2",
"email_address": "jsmith@yahoo.com",
"confidence_score": 98
}
],
"professional_emails": [
{
"email_rank": "1",
"email_address": "john.smith@techcorp.com",
"confidence_score": 91
}
]
},
{
"linkedin_username": "janedoe123",
"is_match": false,
"phones": null,
"personal_emails": null,
"professional_emails": null
}
],
"request_completed_at": "2026-07-28T15:30:35.134682+00:00"
}
{
"api_request_id": "c31f9a08-4d21-4e2a-9a0b-0f2b7c1de5aa",
"results": [
{
"linkedin_username": "johnsmith",
"is_match": true,
"personal_email_match": true,
"professional_email_match": true,
"phone_match": true
},
{
"linkedin_username": "janedoe123",
"is_match": false,
"personal_email_match": false,
"professional_email_match": false,
"phone_match": false
}
],
"request_completed_at": "2026-07-28T15:31:02.884211+00:00"
}
{
"code": "unprocessable_entity",
"message": "Input data must contain a 'records' key with a list of inputs",
"api_request_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
}
{
"code": "unauthorized",
"message": "Unauthorized",
"api_request_id": "b2c3d4e5-f6a7-1234-bcde-f12345678901"
}
{
"code": "payload_too_large",
"message": "Maximum number of records for /v2/get_li_contact_info endpoint is 1000",
"api_request_id": "d4e5f6a7-b8c9-3456-def0-234567890123"
}
{
"code": "unprocessable_entity",
"message": "Input `presence_only` must be a boolean",
"api_request_id": "e5f6a7b8-c9d0-4567-ef01-345678901234"
}
{
"code": "unprocessable_entity",
"message": "Input `records[1]` must be a LinkedIn username or profile URL string",
"api_request_id": "e5f6a7b8-c9d0-4567-ef01-345678901234"
}
{
"code": "rate_limit_reached",
"message": "You reached your total request-rate limit, please contact help@minerva.io for help",
"api_request_id": "f6a7b8c9-d0e1-5678-f012-456789012345"
}
Core Endpoints
Get LinkedIn Contact Info
Retrieve contact information for LinkedIn profiles
POST
/
v2
/
get_li_contact_info
Get LinkedIn Contact Info
curl --request POST \
--url https://api.minerva.io/v2/get_li_contact_info \
--header 'Content-Type: <content-type>' \
--header 'x-api-key: <api-key>' \
--data '
{
"records": [
"<string>"
],
"presence_only": true
}
'import requests
url = "https://api.minerva.io/v2/get_li_contact_info"
payload = {
"records": ["<string>"],
"presence_only": True
}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "<content-type>"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': '<content-type>'},
body: JSON.stringify({records: ['<string>'], presence_only: true})
};
fetch('https://api.minerva.io/v2/get_li_contact_info', 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://api.minerva.io/v2/get_li_contact_info",
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([
'records' => [
'<string>'
],
'presence_only' => true
]),
CURLOPT_HTTPHEADER => [
"Content-Type: <content-type>",
"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://api.minerva.io/v2/get_li_contact_info"
payload := strings.NewReader("{\n \"records\": [\n \"<string>\"\n ],\n \"presence_only\": true\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<api-key>")
req.Header.Add("Content-Type", "<content-type>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.minerva.io/v2/get_li_contact_info")
.header("x-api-key", "<api-key>")
.header("Content-Type", "<content-type>")
.body("{\n \"records\": [\n \"<string>\"\n ],\n \"presence_only\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.minerva.io/v2/get_li_contact_info")
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"] = '<content-type>'
request.body = "{\n \"records\": [\n \"<string>\"\n ],\n \"presence_only\": true\n}"
response = http.request(request)
puts response.read_body{
"api_request_id": "a7bf5e42-6825-481b-9422-f3ec88b65382",
"results": [
{
"linkedin_username": "johnsmith",
"is_match": true,
"phones": [
{
"phone_rank": "1",
"phone_type": "mobile",
"phone_number": "(213) 761-9492",
"confidence_score": 92
}
],
"personal_emails": [
{
"email_rank": "1",
"email_address": "john.smith@gmail.com",
"confidence_score": 99
},
{
"email_rank": "2",
"email_address": "jsmith@yahoo.com",
"confidence_score": 98
}
],
"professional_emails": [
{
"email_rank": "1",
"email_address": "john.smith@techcorp.com",
"confidence_score": 91
}
]
},
{
"linkedin_username": "janedoe123",
"is_match": false,
"phones": null,
"personal_emails": null,
"professional_emails": null
}
],
"request_completed_at": "2026-07-28T15:30:35.134682+00:00"
}
{
"api_request_id": "c31f9a08-4d21-4e2a-9a0b-0f2b7c1de5aa",
"results": [
{
"linkedin_username": "johnsmith",
"is_match": true,
"personal_email_match": true,
"professional_email_match": true,
"phone_match": true
},
{
"linkedin_username": "janedoe123",
"is_match": false,
"personal_email_match": false,
"professional_email_match": false,
"phone_match": false
}
],
"request_completed_at": "2026-07-28T15:31:02.884211+00:00"
}
{
"code": "unprocessable_entity",
"message": "Input data must contain a 'records' key with a list of inputs",
"api_request_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
}
{
"code": "unauthorized",
"message": "Unauthorized",
"api_request_id": "b2c3d4e5-f6a7-1234-bcde-f12345678901"
}
{
"code": "payload_too_large",
"message": "Maximum number of records for /v2/get_li_contact_info endpoint is 1000",
"api_request_id": "d4e5f6a7-b8c9-3456-def0-234567890123"
}
{
"code": "unprocessable_entity",
"message": "Input `presence_only` must be a boolean",
"api_request_id": "e5f6a7b8-c9d0-4567-ef01-345678901234"
}
{
"code": "unprocessable_entity",
"message": "Input `records[1]` must be a LinkedIn username or profile URL string",
"api_request_id": "e5f6a7b8-c9d0-4567-ef01-345678901234"
}
{
"code": "rate_limit_reached",
"message": "You reached your total request-rate limit, please contact help@minerva.io for help",
"api_request_id": "f6a7b8c9-d0e1-5678-f012-456789012345"
}
Quick Answer
How do I get contact information from a LinkedIn profile? Use this endpoint to find emails and phone numbers associated with LinkedIn usernames.Common questions this endpoint answers:- How do I get contact info from a LinkedIn profile?
- How do I find someone’s email from their LinkedIn?
- How can I get phone numbers from LinkedIn profiles?
- How do I convert LinkedIn profiles to contact information?
- How can I find direct contact details for LinkedIn users?
- How do I check whether contact info exists before delivering records?
/in/ in a LinkedIn URL).What you get back: Personal emails, professional emails, and phone numbers, each ranked and scored for confidence.Example: For https://www.linkedin.com/in/johnsmith, provide "johnsmith".Overview
The Get LinkedIn Contact Info endpoint retrieves contact information (emails and phones) associated with LinkedIn usernames. This is useful when you have a LinkedIn profile URL and want to find the person’s contact details.Request
Headers
string
required
Your API key for authentication
string
required
application/json
Request Body
string[]
required
An array of LinkedIn usernames to look up. Maximum 1000 records per request.Each element must be a string containing a LinkedIn username or profile URL. For
https://www.linkedin.com/in/johnsmith, you can send either "johnsmith" or the full URL. The endpoint normalizes /in/, /pub/, and /posts/ URLs.If any element is not a string, the entire request returns 422 before contact lookup. The error identifies the element by its zero-based index, such as records[1] for the second element.boolean
default:"false"
When
true, the response reports whether each contact type exists rather than returning the values. Use this to size a job — check how many of your profiles have a mobile number or a personal email — before delivering records on the full lookup. Must be a boolean; anything else returns 422.Example Request
import json
import requests
url = "https://api.minerva.io/v2/get_li_contact_info"
headers = {
"Content-Type": "application/json",
"x-api-key": "YOUR_API_KEY",
}
# records = LinkedIn username or profile URL strings, max 1000 per request
payload = {"records": ["johnsmith", "https://www.linkedin.com/in/janedoe123"]}
response = requests.post(url, headers=headers, json=payload, timeout=60)
print(response.status_code)
print(json.dumps(response.json(), indent=2))
Response
Response Structure
string
Unique identifier for this API request
array
Array of contact information results, in the same order as the
records you sentstring
ISO 8601 timestamp when the request was completed
Result Object
string
The normalized LinkedIn username for this record
boolean
Whether any contact information was found for this LinkedIn profile
array
Array of phone numbers with ranking and confidence scores.
null when none were found.array
Array of personal email addresses with ranking and confidence scores.
null when none were found.array
Array of professional/work email addresses with ranking and confidence scores.
null when none were found.Email Object
string
Rank/priority of this email (
"1" = highest priority)string
Email address
integer
Confidence score for this email, on a 0–100 scale
Phone Object
string
Rank/priority of this phone (
"1" = highest priority)string
Line type, e.g.
mobile or landlinestring
Phone number
integer
Confidence score for this phone, on a 0–100 scale
Result Object (presence_only: true)
When presence_only is true, each result carries booleans instead of contact values:
string
The normalized LinkedIn username for this record
boolean
true when any of the three flags below is trueboolean
Whether at least one personal email exists for this profile
boolean
Whether at least one professional email exists for this profile
boolean
Whether at least one phone number exists for this profile
Error responses include
statusCode and body fields for backward compatibility with existing integrations. These are deprecated — prefer the HTTP status code and the top-level code / message / api_request_id fields directly. (The deprecated nested body still carries the legacy error_message.){
"api_request_id": "a7bf5e42-6825-481b-9422-f3ec88b65382",
"results": [
{
"linkedin_username": "johnsmith",
"is_match": true,
"phones": [
{
"phone_rank": "1",
"phone_type": "mobile",
"phone_number": "(213) 761-9492",
"confidence_score": 92
}
],
"personal_emails": [
{
"email_rank": "1",
"email_address": "john.smith@gmail.com",
"confidence_score": 99
},
{
"email_rank": "2",
"email_address": "jsmith@yahoo.com",
"confidence_score": 98
}
],
"professional_emails": [
{
"email_rank": "1",
"email_address": "john.smith@techcorp.com",
"confidence_score": 91
}
]
},
{
"linkedin_username": "janedoe123",
"is_match": false,
"phones": null,
"personal_emails": null,
"professional_emails": null
}
],
"request_completed_at": "2026-07-28T15:30:35.134682+00:00"
}
{
"api_request_id": "c31f9a08-4d21-4e2a-9a0b-0f2b7c1de5aa",
"results": [
{
"linkedin_username": "johnsmith",
"is_match": true,
"personal_email_match": true,
"professional_email_match": true,
"phone_match": true
},
{
"linkedin_username": "janedoe123",
"is_match": false,
"personal_email_match": false,
"professional_email_match": false,
"phone_match": false
}
],
"request_completed_at": "2026-07-28T15:31:02.884211+00:00"
}
{
"code": "unprocessable_entity",
"message": "Input data must contain a 'records' key with a list of inputs",
"api_request_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
}
{
"code": "unauthorized",
"message": "Unauthorized",
"api_request_id": "b2c3d4e5-f6a7-1234-bcde-f12345678901"
}
{
"code": "payload_too_large",
"message": "Maximum number of records for /v2/get_li_contact_info endpoint is 1000",
"api_request_id": "d4e5f6a7-b8c9-3456-def0-234567890123"
}
{
"code": "unprocessable_entity",
"message": "Input `presence_only` must be a boolean",
"api_request_id": "e5f6a7b8-c9d0-4567-ef01-345678901234"
}
{
"code": "unprocessable_entity",
"message": "Input `records[1]` must be a LinkedIn username or profile URL string",
"api_request_id": "e5f6a7b8-c9d0-4567-ef01-345678901234"
}
{
"code": "rate_limit_reached",
"message": "You reached your total request-rate limit, please contact help@minerva.io for help",
"api_request_id": "f6a7b8c9-d0e1-5678-f012-456789012345"
}
Error Responses
401- Unauthorized: Invalid API key413- Payload Too Large: More than 1000 records in request422- Unprocessable Entity: Invalid JSON or request shape, missingrecords, a non-string record, or a non-booleanpresence_only. A non-string record rejects the entire request and the error identifies its zero-based index.429- Too Many Requests: Rate limit exceeded500- Internal Server Error
Notes
- LinkedIn usernames are case-insensitive and are lowercased before matching
- The endpoint automatically handles various LinkedIn URL formats and extracts the username
- When
is_matchis false,phones,personal_emails, andprofessional_emailsare allnull - Emails and phones are sorted by rank, with lower numbers indicating higher priority/confidence
- Rank fields are returned as strings (
"1","2", …), and confidence scores are integers on a 0–100 scale
Migrating from v1
POST /v1/get_li_contact_info is still available but is no longer the recommended
path. Two differences to account for when moving to v2:
- v2 does not return
first_name,middle_name,last_name, orname_suffix. Use Enrich v2 if you need name and profile data alongside contact info. presence_onlyis v2-only. v1 ignores the flag and always returns the full contact values.
Was this page helpful?