curl "https://api.datacircle.dev/linkedin/profile?url=https://www.linkedin.com/in/williamhgates" \
-H "Authorization: Token $DATACIRCLE_API_KEY" \
-H "X-Data-Provider: harvestapi"import os
import requests
response = requests.get(
"https://api.datacircle.dev/linkedin/profile",
headers={"Authorization": f"Token {os.environ['DATACIRCLE_API_KEY']}", "X-Data-Provider": "harvestapi"},
params={'url': 'https://www.linkedin.com/in/williamhgates'},
)
print(response.json())const options = {
method: 'GET',
headers: {'X-Data-Provider': '<x-data-provider>', Authorization: 'Bearer <token>'}
};
fetch('https://api.datacircle.dev/linkedin/profile', 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.datacircle.dev/linkedin/profile",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"X-Data-Provider: <x-data-provider>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.datacircle.dev/linkedin/profile"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-Data-Provider", "<x-data-provider>")
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.datacircle.dev/linkedin/profile")
.header("X-Data-Provider", "<x-data-provider>")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.datacircle.dev/linkedin/profile")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-Data-Provider"] = '<x-data-provider>'
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"element": {
"id": "…",
"publicIdentifier": "…",
"linkedinUrl": "https://www.linkedin.com/in/williamhgates",
"firstName": "…",
"lastName": "…",
"emails": [],
"headline": "…",
"websites": [
"…"
],
"openToWork": false,
"hiring": false,
"premium": true,
"influencer": true,
"memorialized": false,
"creator": true,
"location": {
"linkedinText": "…",
"countryCode": "…",
"parsed": {
"text": "…",
"countryCode": "…",
"regionCode": null,
"country": "…",
"countryFull": "…",
"state": "…",
"city": "…"
}
},
"objectUrn": "…",
"registeredAt": "…",
"topSkills": [],
"connectionsCount": 0,
"followerCount": 0,
"verified": true,
"about": "…",
"industry": {
"id": 0,
"name": "…"
},
"currentPosition": [
{
"position": "…",
"location": null,
"employmentType": null,
"workplaceType": null,
"companyName": "…",
"companyUniversalName": "…",
"companyLinkedinUrl": "…",
"companyId": "…",
"duration": "…",
"description": null,
"skills": null,
"startDate": {
"year": 0,
"text": "…"
},
"endDate": {
"text": "…"
},
"companyLogo": {
"url": "…",
"sizes": [
{
"url": "…",
"width": 0,
"height": 0
}
]
}
}
],
"profileTopEducation": [
{
"schoolName": "…",
"description": null,
"insights": null,
"skills": null,
"schoolLinkedinUrl": "…",
"schoolId": "…",
"degree": null,
"fieldOfStudy": null,
"period": "…",
"startDate": {
"year": 0,
"text": "…"
},
"endDate": {
"year": 0,
"text": "…"
},
"schoolLogo": {
"url": "…",
"sizes": [
{
"url": "…",
"width": 0,
"height": 0
}
]
}
}
],
"profileActions": [
{
"label": "…",
"url": "…"
}
],
"profilePicture": {
"url": "…",
"sizes": [
{
"url": "…",
"width": 0,
"height": 0
}
]
},
"coverPicture": {
"url": "…",
"sizes": [
{
"url": "…",
"width": 0,
"height": 0
}
]
},
"photo": "…",
"profileLocales": [
{
"country": "…",
"language": "…"
}
],
"primaryLocale": {
"country": "…",
"language": "…"
},
"multiLocaleHeadline": [
{
"headline": "…",
"locale": "…"
}
],
"services": null,
"experience": [
{
"position": "…",
"location": null,
"employmentType": null,
"workplaceType": null,
"companyName": "…",
"companyUniversalName": "…",
"companyLinkedinUrl": "…",
"companyId": "…",
"duration": "…",
"description": null,
"skills": null,
"startDate": {
"year": 0,
"text": "…"
},
"endDate": {
"text": "…"
},
"companyLogo": {
"url": "…",
"sizes": [
{
"url": "…",
"width": 0,
"height": 0
}
]
}
}
],
"education": [
{
"schoolName": "…",
"description": null,
"insights": null,
"skills": null,
"schoolLinkedinUrl": "…",
"schoolId": "…",
"degree": null,
"fieldOfStudy": null,
"period": "…",
"startDate": {
"year": 0,
"text": "…"
},
"endDate": {
"year": 0,
"text": "…"
},
"schoolLogo": {
"url": "…",
"sizes": [
{
"url": "…",
"width": 0,
"height": 0
}
]
}
}
],
"certifications": [],
"projects": [],
"volunteering": [],
"receivedRecommendations": [],
"skills": [],
"publications": [],
"courses": [],
"patents": [],
"honorsAndAwards": [],
"languages": [],
"organizations": [],
"causes": [],
"featured": {
"images": [],
"link": null,
"title": null,
"subtitle": null,
"slides": [
{
"title": "…",
"subtitle": "…",
"description": null,
"url": "…",
"image": {
"url": "…"
}
}
]
},
"composeOptionType": null,
"moreProfiles": [
{
"id": "…",
"firstName": "…",
"lastName": "…",
"position": "…",
"publicIdentifier": "…",
"linkedinUrl": "…"
}
],
"sectionTotals": {
"experience": 0,
"education": 0,
"certifications": 0,
"receivedRecommendations": 0,
"skills": 0,
"courses": 0,
"languages": 0,
"projects": 0,
"volunteering": 0,
"publications": 0,
"patents": 0,
"organizations": 0,
"honorsAndAwards": 0,
"causes": 0
},
"interests": [
{
"interestName": "…",
"elements": [
{
"title": "…",
"subtitle": "…",
"link": "…",
"caption": "…",
"image": {
"url": "…"
}
}
]
}
]
},
"query": {
"url": "https://www.linkedin.com/in/williamhgates",
"publicIdentifier": "…",
"profileId": "…"
},
"status": 200,
"retries": 0,
"payments": [
"linkedinProfile"
],
"originalQuery": {
"url": "https://www.linkedin.com/in/williamhgates"
},
"cost": 0.0037,
"entityId": "…",
"datacircle_meta": {
"provider": "harvestapi",
"cost_usd": 0.0037,
"balance_usd": 4.9963
}
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>",
"balance_usd": 123
}{
"error": "<string>"
}{
"error": "<string>",
"balance_usd": 123
}Get one LinkedIn profile
Send HarvestAPI’s own request (GET https://api.harvest-api.com/linkedin/profile) to api.datacircle.dev, with your Datacircle key in Authorization and X-Data-Provider: harvestapi. The path and the query stay the same. We charge $0.0037 per profile HarvestAPI finds, with no markup.
A profile HarvestAPI doesn’t find costs $0.0023.
curl "https://api.datacircle.dev/linkedin/profile?url=https://www.linkedin.com/in/williamhgates" \
-H "Authorization: Token $DATACIRCLE_API_KEY" \
-H "X-Data-Provider: harvestapi"import os
import requests
response = requests.get(
"https://api.datacircle.dev/linkedin/profile",
headers={"Authorization": f"Token {os.environ['DATACIRCLE_API_KEY']}", "X-Data-Provider": "harvestapi"},
params={'url': 'https://www.linkedin.com/in/williamhgates'},
)
print(response.json())const options = {
method: 'GET',
headers: {'X-Data-Provider': '<x-data-provider>', Authorization: 'Bearer <token>'}
};
fetch('https://api.datacircle.dev/linkedin/profile', 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.datacircle.dev/linkedin/profile",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"X-Data-Provider: <x-data-provider>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.datacircle.dev/linkedin/profile"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-Data-Provider", "<x-data-provider>")
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.datacircle.dev/linkedin/profile")
.header("X-Data-Provider", "<x-data-provider>")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.datacircle.dev/linkedin/profile")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-Data-Provider"] = '<x-data-provider>'
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"element": {
"id": "…",
"publicIdentifier": "…",
"linkedinUrl": "https://www.linkedin.com/in/williamhgates",
"firstName": "…",
"lastName": "…",
"emails": [],
"headline": "…",
"websites": [
"…"
],
"openToWork": false,
"hiring": false,
"premium": true,
"influencer": true,
"memorialized": false,
"creator": true,
"location": {
"linkedinText": "…",
"countryCode": "…",
"parsed": {
"text": "…",
"countryCode": "…",
"regionCode": null,
"country": "…",
"countryFull": "…",
"state": "…",
"city": "…"
}
},
"objectUrn": "…",
"registeredAt": "…",
"topSkills": [],
"connectionsCount": 0,
"followerCount": 0,
"verified": true,
"about": "…",
"industry": {
"id": 0,
"name": "…"
},
"currentPosition": [
{
"position": "…",
"location": null,
"employmentType": null,
"workplaceType": null,
"companyName": "…",
"companyUniversalName": "…",
"companyLinkedinUrl": "…",
"companyId": "…",
"duration": "…",
"description": null,
"skills": null,
"startDate": {
"year": 0,
"text": "…"
},
"endDate": {
"text": "…"
},
"companyLogo": {
"url": "…",
"sizes": [
{
"url": "…",
"width": 0,
"height": 0
}
]
}
}
],
"profileTopEducation": [
{
"schoolName": "…",
"description": null,
"insights": null,
"skills": null,
"schoolLinkedinUrl": "…",
"schoolId": "…",
"degree": null,
"fieldOfStudy": null,
"period": "…",
"startDate": {
"year": 0,
"text": "…"
},
"endDate": {
"year": 0,
"text": "…"
},
"schoolLogo": {
"url": "…",
"sizes": [
{
"url": "…",
"width": 0,
"height": 0
}
]
}
}
],
"profileActions": [
{
"label": "…",
"url": "…"
}
],
"profilePicture": {
"url": "…",
"sizes": [
{
"url": "…",
"width": 0,
"height": 0
}
]
},
"coverPicture": {
"url": "…",
"sizes": [
{
"url": "…",
"width": 0,
"height": 0
}
]
},
"photo": "…",
"profileLocales": [
{
"country": "…",
"language": "…"
}
],
"primaryLocale": {
"country": "…",
"language": "…"
},
"multiLocaleHeadline": [
{
"headline": "…",
"locale": "…"
}
],
"services": null,
"experience": [
{
"position": "…",
"location": null,
"employmentType": null,
"workplaceType": null,
"companyName": "…",
"companyUniversalName": "…",
"companyLinkedinUrl": "…",
"companyId": "…",
"duration": "…",
"description": null,
"skills": null,
"startDate": {
"year": 0,
"text": "…"
},
"endDate": {
"text": "…"
},
"companyLogo": {
"url": "…",
"sizes": [
{
"url": "…",
"width": 0,
"height": 0
}
]
}
}
],
"education": [
{
"schoolName": "…",
"description": null,
"insights": null,
"skills": null,
"schoolLinkedinUrl": "…",
"schoolId": "…",
"degree": null,
"fieldOfStudy": null,
"period": "…",
"startDate": {
"year": 0,
"text": "…"
},
"endDate": {
"year": 0,
"text": "…"
},
"schoolLogo": {
"url": "…",
"sizes": [
{
"url": "…",
"width": 0,
"height": 0
}
]
}
}
],
"certifications": [],
"projects": [],
"volunteering": [],
"receivedRecommendations": [],
"skills": [],
"publications": [],
"courses": [],
"patents": [],
"honorsAndAwards": [],
"languages": [],
"organizations": [],
"causes": [],
"featured": {
"images": [],
"link": null,
"title": null,
"subtitle": null,
"slides": [
{
"title": "…",
"subtitle": "…",
"description": null,
"url": "…",
"image": {
"url": "…"
}
}
]
},
"composeOptionType": null,
"moreProfiles": [
{
"id": "…",
"firstName": "…",
"lastName": "…",
"position": "…",
"publicIdentifier": "…",
"linkedinUrl": "…"
}
],
"sectionTotals": {
"experience": 0,
"education": 0,
"certifications": 0,
"receivedRecommendations": 0,
"skills": 0,
"courses": 0,
"languages": 0,
"projects": 0,
"volunteering": 0,
"publications": 0,
"patents": 0,
"organizations": 0,
"honorsAndAwards": 0,
"causes": 0
},
"interests": [
{
"interestName": "…",
"elements": [
{
"title": "…",
"subtitle": "…",
"link": "…",
"caption": "…",
"image": {
"url": "…"
}
}
]
}
]
},
"query": {
"url": "https://www.linkedin.com/in/williamhgates",
"publicIdentifier": "…",
"profileId": "…"
},
"status": 200,
"retries": 0,
"payments": [
"linkedinProfile"
],
"originalQuery": {
"url": "https://www.linkedin.com/in/williamhgates"
},
"cost": 0.0037,
"entityId": "…",
"datacircle_meta": {
"provider": "harvestapi",
"cost_usd": 0.0037,
"balance_usd": 4.9963
}
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>",
"balance_usd": 123
}{
"error": "<string>"
}{
"error": "<string>",
"balance_usd": 123
}Authorizations
Your API key: Authorization: Bearer <your API key>. Authorization: Token <your API key> works too.
Headers
Names the provider: harvestapi. This header and the host are the only changes from the provider's own request.
harvestapi Query Parameters
The profile's LinkedIn URL, e.g. https://www.linkedin.com/in/williamhgates. The only HarvestAPI parameter Datacircle passes on.
Response
HarvestAPI's answer plus datacircle_meta, as HarvestAPI sends it: a 200 whether it found the profile (status: 200, $0.0037) or not (element: null, status: 404, error: Profile not found, $0.0023: HarvestAPI bills the lookup)
HarvestAPI's own answer to GET /linkedin/profile, minus user and requestId (our account with HarvestAPI), plus datacircle_meta.
The profile. null when HarvestAPI can't find it (status 404) or refuses the request (status 400).
Show child attributes
Show child attributes
What HarvestAPI billed for the call, e.g. 0.0037 for a profile, 0.0023 for a profile it can't find. Datacircle charges you the same amount in dollars (datacircle_meta.cost_usd).
The profile's LinkedIn member id (ACoAA…), as element.id. null when not found.
The request HarvestAPI got.
Show child attributes
Show child attributes
What HarvestAPI billed, by name: linkedinProfile for a profile, linkedinProfileShort for a lookup that found nothing.
The request as HarvestAPI understood it: the url it read, with the publicIdentifier and profileId it resolved.
Show child attributes
Show child attributes
How many times HarvestAPI retried LinkedIn for this answer.
HarvestAPI's own status, inside an HTTP 200: 200 found, 404 not found, 400 a request it refuses.
Datacircle's only addition to the provider's answer
Show child attributes
Show child attributes
HarvestAPI's message when element is null, e.g. Profile not found.
true when HarvestAPI didn't bill the call (a request it refuses).