curl "https://api.datacircle.dev/api/v1/profile?profileUrlOrUrn=https://www.linkedin.com/in/williamhgates" \
-H "Authorization: Token $DATACIRCLE_API_KEY" \
-H "X-Data-Provider: fetchin"import os
import requests
response = requests.get(
"https://api.datacircle.dev/api/v1/profile",
headers={"Authorization": f"Token {os.environ['DATACIRCLE_API_KEY']}", "X-Data-Provider": "fetchin"},
params={'profileUrlOrUrn': '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/api/v1/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/api/v1/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/api/v1/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/api/v1/profile")
.header("X-Data-Provider", "<x-data-provider>")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.datacircle.dev/api/v1/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{
"id": "…",
"firstName": "…",
"lastName": "…",
"title": "…",
"titleLocalized": {
"en_US": "…"
},
"profilePictureUrl": "…",
"profilePictureUrls": [
{
"url": "…",
"width": 0,
"height": 0
}
],
"location": "…",
"coverImageUrl": "…",
"coverImageUrls": [
{
"url": "…",
"width": 0,
"height": 0
}
],
"publicIdentifier": "…",
"url": "…",
"profileId": "…",
"geoLocationName": "…",
"geoCountryName": "…",
"connectionType": "…",
"creator": true,
"influencer": true,
"premium": true,
"isVerified": true,
"geoUrn": "…",
"creatorInfo": {
"hashTags": [
"…"
],
"website": "…"
},
"memberId": "…",
"openToWork": false,
"hiring": false,
"inRemembrance": false,
"topVoice": true,
"followerCount": 0,
"connectionsCount": 0,
"countryCode": "…",
"jobTitle": "…",
"companyName": "…",
"companyPublicId": "…",
"companyLinkedinUrl": "…",
"currentPosition": {
"positionUrn": "…",
"name": "…",
"companyId": "…",
"companyUrn": "…",
"publicIdentifier": "…",
"url": "…",
"title": "…"
},
"currentSchool": null,
"openProfile": false,
"description": "…",
"languages": [],
"certifications": [],
"volunteerCauses": [],
"skills": [],
"experiences": [
{
"name": "…",
"jobTitle": "…",
"description": "…",
"dateRange": "…",
"current": true,
"ongoing": true,
"positionUrn": "…",
"positionGroupUrn": "…",
"positionGroupId": "…",
"timePeriod": {
"startDate": {
"year": 0
},
"endDate": null
},
"totalDuration": "…",
"company": {
"url": "…",
"name": "…",
"logo": "…",
"companyId": "…",
"urn": "…"
}
}
],
"educations": [
{
"name": "…",
"description": "…",
"dateRange": "…",
"current": false,
"ongoing": false,
"educationUrn": "…",
"schoolLogo": "…",
"schoolUrl": "…",
"timePeriod": {
"startDate": {
"year": 0
},
"endDate": {
"year": 0
}
}
}
],
"joinDate": {
"month": 0,
"year": 0
},
"websites": [
{
"url": "…",
"category": "…"
}
],
"recommendations": [],
"recommendationsGiven": [],
"testScores": [],
"publications": [],
"projects": [],
"patents": [],
"honors": [],
"organizations": [],
"courses": [],
"volunteerExperiences": [],
"industry": "…",
"industryUrn": "…",
"primaryLocale": "…",
"supportedLocales": [
"…"
],
"descriptionLocalized": {
"en_US": "…"
},
"entityType": "Person",
"datacircle_meta": {
"provider": "fetchin",
"cost_usd": 0.001485,
"balance_usd": 20.5
}
}{
"error": "<string>",
"code": "MISSING_PARAMETER",
"datacircle_meta": {
"provider": "up2data",
"cost_usd": 123,
"balance_usd": 123
}
}{
"error": "<string>"
}{
"error": "<string>",
"balance_usd": 123
}{
"error": "LinkedIn profile not found",
"code": "PROFILE_NOT_FOUND",
"datacircle_meta": {
"provider": "fetchin",
"cost_usd": 0.001485,
"balance_usd": 20.5
}
}{
"error": "<string>",
"code": "MISSING_PARAMETER",
"datacircle_meta": {
"provider": "up2data",
"cost_usd": 123,
"balance_usd": 123
}
}{
"error": "<string>",
"balance_usd": 123
}Get one LinkedIn profile
Send Fetchin’s own request (GET https://api.fetchin.io/api/v1/profile) to api.datacircle.dev, with your Datacircle key in Authorization and X-Data-Provider: fetchin. The path and the query stay the same. We charge $0.001485 per profile, found or not, with no markup.
curl "https://api.datacircle.dev/api/v1/profile?profileUrlOrUrn=https://www.linkedin.com/in/williamhgates" \
-H "Authorization: Token $DATACIRCLE_API_KEY" \
-H "X-Data-Provider: fetchin"import os
import requests
response = requests.get(
"https://api.datacircle.dev/api/v1/profile",
headers={"Authorization": f"Token {os.environ['DATACIRCLE_API_KEY']}", "X-Data-Provider": "fetchin"},
params={'profileUrlOrUrn': '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/api/v1/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/api/v1/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/api/v1/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/api/v1/profile")
.header("X-Data-Provider", "<x-data-provider>")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.datacircle.dev/api/v1/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{
"id": "…",
"firstName": "…",
"lastName": "…",
"title": "…",
"titleLocalized": {
"en_US": "…"
},
"profilePictureUrl": "…",
"profilePictureUrls": [
{
"url": "…",
"width": 0,
"height": 0
}
],
"location": "…",
"coverImageUrl": "…",
"coverImageUrls": [
{
"url": "…",
"width": 0,
"height": 0
}
],
"publicIdentifier": "…",
"url": "…",
"profileId": "…",
"geoLocationName": "…",
"geoCountryName": "…",
"connectionType": "…",
"creator": true,
"influencer": true,
"premium": true,
"isVerified": true,
"geoUrn": "…",
"creatorInfo": {
"hashTags": [
"…"
],
"website": "…"
},
"memberId": "…",
"openToWork": false,
"hiring": false,
"inRemembrance": false,
"topVoice": true,
"followerCount": 0,
"connectionsCount": 0,
"countryCode": "…",
"jobTitle": "…",
"companyName": "…",
"companyPublicId": "…",
"companyLinkedinUrl": "…",
"currentPosition": {
"positionUrn": "…",
"name": "…",
"companyId": "…",
"companyUrn": "…",
"publicIdentifier": "…",
"url": "…",
"title": "…"
},
"currentSchool": null,
"openProfile": false,
"description": "…",
"languages": [],
"certifications": [],
"volunteerCauses": [],
"skills": [],
"experiences": [
{
"name": "…",
"jobTitle": "…",
"description": "…",
"dateRange": "…",
"current": true,
"ongoing": true,
"positionUrn": "…",
"positionGroupUrn": "…",
"positionGroupId": "…",
"timePeriod": {
"startDate": {
"year": 0
},
"endDate": null
},
"totalDuration": "…",
"company": {
"url": "…",
"name": "…",
"logo": "…",
"companyId": "…",
"urn": "…"
}
}
],
"educations": [
{
"name": "…",
"description": "…",
"dateRange": "…",
"current": false,
"ongoing": false,
"educationUrn": "…",
"schoolLogo": "…",
"schoolUrl": "…",
"timePeriod": {
"startDate": {
"year": 0
},
"endDate": {
"year": 0
}
}
}
],
"joinDate": {
"month": 0,
"year": 0
},
"websites": [
{
"url": "…",
"category": "…"
}
],
"recommendations": [],
"recommendationsGiven": [],
"testScores": [],
"publications": [],
"projects": [],
"patents": [],
"honors": [],
"organizations": [],
"courses": [],
"volunteerExperiences": [],
"industry": "…",
"industryUrn": "…",
"primaryLocale": "…",
"supportedLocales": [
"…"
],
"descriptionLocalized": {
"en_US": "…"
},
"entityType": "Person",
"datacircle_meta": {
"provider": "fetchin",
"cost_usd": 0.001485,
"balance_usd": 20.5
}
}{
"error": "<string>",
"code": "MISSING_PARAMETER",
"datacircle_meta": {
"provider": "up2data",
"cost_usd": 123,
"balance_usd": 123
}
}{
"error": "<string>"
}{
"error": "<string>",
"balance_usd": 123
}{
"error": "LinkedIn profile not found",
"code": "PROFILE_NOT_FOUND",
"datacircle_meta": {
"provider": "fetchin",
"cost_usd": 0.001485,
"balance_usd": 20.5
}
}{
"error": "<string>",
"code": "MISSING_PARAMETER",
"datacircle_meta": {
"provider": "up2data",
"cost_usd": 123,
"balance_usd": 123
}
}{
"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: fetchin. This header and the host are the only changes from the provider's own request.
fetchin Query Parameters
The profile's LinkedIn URL, e.g. https://www.linkedin.com/in/williamhgates. The only Fetchin parameter Datacircle passes on, and only as a profile URL: Fetchin's public identifier and URN forms, and fullProfile, are refused with a 400, not charged.
Response
Fetchin's answer plus datacircle_meta: the profile ($0.001485)
Datacircle's only addition to the provider's answer
Show child attributes
Show child attributes
Profile URN (unique identifier)
Profile first name.
Profile last name. Some members restrict their full surname to their own contacts. For those profiles this is the publicly displayed initial (e.g. "D.") and lastNameInitialOnly is true. The full surname is not available through any request in that case.
Present and true only when lastName is an initial because the member restricts it. Absent otherwise, never false.
Professional headline. A member can publish their profile in several languages and the source does not translate between them. This is the English version when the member published one, otherwise the version in their primaryLocale. Deterministic: two calls return the same language. Every version they did publish is in titleLocalized / descriptionLocalized.
The title in each language the member published, keyed by locale ("fr_FR", "en_US").
Show child attributes
Show child attributes
About/summary section. A member can publish their profile in several languages and the source does not translate between them. This is the English version when the member published one, otherwise the version in their primaryLocale. Deterministic: two calls return the same language. Every version they did publish is in titleLocalized / descriptionLocalized. Line breaks are returned exactly as the source stores them: for some profiles the source holds this text with its line breaks already removed, and they are not reconstructed by guesswork.
The description in each language the member published, keyed by locale.
Show child attributes
Show child attributes
Where the member is, as the profile shows it.
Profile picture URL, largest size available. Always a string: when the member has no photo of their own it holds a generic placeholder image and profilePictureUrls is absent.
Every size of the profile picture, smallest first, one entry per distinct size (how many varies: a small original comes in fewer sizes). The last entry is the image profilePictureUrl points to (the framed picture when the member displays a photo frame). Absent, not empty and not null, when the member has no photo of their own, which is how to tell a real photo from the placeholder in profilePictureUrl. Not returned for organization records.
Show child attributes
Show child attributes
Complete work history, most recent first. Every position comes back in one call, with no pagination, even for members with dozens of past employers or many roles at one employer. When a section came back incomplete, the top-level partial object names it.
Show child attributes
Show child attributes
The schools, newest first.
Show child attributes
Show child attributes
Volunteer causes listed on the profile
Professional skills listed on the profile. Complete list, returned in the same single call as the rest of the profile.
Show child attributes
Show child attributes
The languages the member lists.
Show child attributes
Show child attributes
Licenses and certifications.
Show child attributes
Show child attributes
Profile banner/background image URL
Every size of the banner image, smallest first. Banners are not square, so use both width and height. Absent when the member has no banner, in which case coverImageUrl is absent too.
Show child attributes
Show child attributes
Public identifier (slug)
Member identifier
ISO country code
Full geographic location string
Country name
Geo URN
Always "OUT_OF_NETWORK" in the answers we have seen. It says nothing about you: no LinkedIn account of yours is in the call.
Creator mode information
Show child attributes
Show child attributes
Title of the member's primary role (the entry flagged current in experiences). The member sets it, and an end date does not clear it: if the member has not updated their profile since that role ended, jobTitle still shows it while the matching experience shows ongoing: false.
Employer for the role in jobTitle. currentPosition comes from the top of the member's profile instead, so it can be null while jobTitle/companyName have values.
Current company public identifier slug
Current company profile URL
Explicit "current company" block from the top of the profile page. Object when the member displays it, null when they don't (an ongoing primary position may still exist in experiences).
Show child attributes
Show child attributes
Explicit "education" block from the top of the profile page. Object when the member displays it, null when they don't.
Show child attributes
Show child attributes
Number of followers
Number of connections
Whether Creator mode is enabled
Whether the profile carries the platform's long-standing editorial recognition. Distinct from topVoice: a profile can have one without the other.
Present and true when the profile has a recognised-voice badge. Absent (not false) when it doesn't, as on most profiles: treat an absent key as false. The response has no display label for the badge, because the source translates the label for each viewer.
Whether the profile has Premium
Whether the profile has a verification badge
Numeric internal member id (e.g. "251749025"). Distinct from id/profileId, which carry the urn:li:fsd_profile:… form.
Whether the profile shows the public #OPEN_TO_WORK photo frame. Reflects the publicly visible badge only. Recruiter-only 'open to work' is not exposed.
Whether the profile shows the public #HIRING photo frame. A profile picture carries one frame at most, so hiring and openToWork are never both true.
Whether the account has been officially memorialized ('In Remembrance'). Only a memorialized account returns true: a regular profile whose headline mentions the member has passed away returns false.
True when the member has an open profile: anyone can message them without connecting or spending a paid message credit. Unrelated to openToWork, and separate from premium (some members without premium have an open profile). An absent openProfile means unknown: on some calls the key is missing and partial.sections lists openProfile. If you request the profile again, the key comes back in most cases. A memorialized account (inRemembrance true) has openProfile false, since nobody can message it. openProfile is the only status boolean whose absence means unknown.
Approximate account creation date (month + year).
Show child attributes
Show child attributes
The member's birthday, only when their privacy settings make it visible to us. Absent when they hide it or never entered it. Members choose who can see it, so one who limits it to a narrower audience may appear on some calls and not on others. Included in every call at no extra cost. Always a month and a day. The year only when the member shares it, which is rare.
Show child attributes
Show child attributes
The websites listed in the member's contact info, only when their privacy settings make them visible to us, in the order the member listed them. Absent (never an empty array) when there are none to show. Included in every call at no extra cost. Not the same as creatorInfo.website, the single link a creator pins to their profile.
Show child attributes
Show child attributes
Canonical public URL of the professional profile page
Publicly displayed pronouns (e.g. "she/her"). Omitted when the member doesn't display pronouns.
Recommendations received by the member. Best-effort: omitted when this section could not be fetched, empty array when the member has none.
Show child attributes
Show child attributes
Test scores listed on the profile
Show child attributes
Show child attributes
The member's self-declared industry, e.g. "Information Technology & Services". It comes from the list LinkedIn shows on profiles, which is not the list company pages use, so do not join the two. Omitted when the member lists none.
Stable identifier for industry, e.g. "urn:li:fsd_industry:96".
The language the member wrote their profile in, e.g. "es_ES". The free text can be in another language: see title and description for the language you get. For language-independent values, use geoUrn, industryUrn or companyId.
Every language the member published their profile in, e.g. ["fr_FR","en_US"]. A member who wrote their profile once gets a single-entry array, so more than one entry is the signal that titleLocalized / descriptionLocalized have something to choose from.
Always "Person". We take only a LinkedIn profile URL, so a company page never comes back.
Person Publications listed on the profile, in display order.
Show child attributes
Show child attributes
Projects listed on the profile, in display order.
Show child attributes
Show child attributes
Patents listed on the profile, in display order.
Show child attributes
Show child attributes
Honors and awards listed on the profile, in display order.
Show child attributes
Show child attributes
Organizations the member belongs to, in display order.
Show child attributes
Show child attributes
Courses listed on the profile, in display order.
Show child attributes
Show child attributes
Volunteering roles: what the member did and for whom, in display order. Not the same as volunteerCauses, which lists the causes they say they care about.
Show child attributes
Show child attributes
Present only when a read failed and part of the profile is missing. Fetchin builds a profile from several reads, and when one fails, the array that read fills holds fewer items than the profile shows. Use this field to tell whether a short list is complete.
Show child attributes
Show child attributes
Recommendations the member wrote for other people. Best-effort, exactly like recommendations: an empty array means they wrote none, while an absent key means the fetch failed and partial will say so. Note the named person here is the recipient, whereas in recommendations it is the author.
Show child attributes
Show child attributes