curl -X POST "https://api.datacircle.dev/v1/profiles/enrich" \
-H "Authorization: Token $DATACIRCLE_API_KEY" \
-H "X-Data-Provider: up2data" \
-H "Content-Type: application/json" \
-d '{"url": "https://www.linkedin.com/in/williamhgates"}'import os
import requests
response = requests.post(
"https://api.datacircle.dev/v1/profiles/enrich",
headers={"Authorization": f"Token {os.environ['DATACIRCLE_API_KEY']}", "X-Data-Provider": "up2data"},
json={'url': 'https://www.linkedin.com/in/williamhgates'},
)
print(response.json())const options = {
method: 'POST',
headers: {
'X-Data-Provider': '<x-data-provider>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({url: 'https://www.linkedin.com/in/williamhgates'})
};
fetch('https://api.datacircle.dev/v1/profiles/enrich', 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/v1/profiles/enrich",
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([
'url' => 'https://www.linkedin.com/in/williamhgates'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"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"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.datacircle.dev/v1/profiles/enrich"
payload := strings.NewReader("{\n \"url\": \"https://www.linkedin.com/in/williamhgates\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-Data-Provider", "<x-data-provider>")
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://api.datacircle.dev/v1/profiles/enrich")
.header("X-Data-Provider", "<x-data-provider>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"url\": \"https://www.linkedin.com/in/williamhgates\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.datacircle.dev/v1/profiles/enrich")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-Data-Provider"] = '<x-data-provider>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"url\": \"https://www.linkedin.com/in/williamhgates\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"url": "https://www.linkedin.com/in/williamhgates",
"full_name": "…",
"first_name": "…",
"last_name": "…",
"public_identifier": "…",
"headline": "…",
"location": {
"city": "…",
"region": "…",
"country": "…",
"raw": "…"
},
"about": "…",
"urn": "…",
"linkedin_id": "…",
"profile_urn": "…",
"positions": [
{
"title": "…",
"company": "…",
"company_url": "…",
"linkedin_id": "…",
"position_id": "…",
"started_at": "…",
"ended_at": null,
"company_industry": "…",
"company_headcount": "…",
"company_logo_url": "…"
}
],
"current_company": {
"name": "…",
"url": "…",
"linkedin_id": "…",
"title": "…",
"started_at": "…",
"logo_url": "…",
"industry": "…",
"headcount": "…"
},
"education": [
{
"school": "…",
"education_id": "…",
"school_logo_url": "…",
"started_at": "…",
"ended_at": "…"
}
],
"primary_locale": "…",
"is_premium": true,
"is_open_to_work": false,
"profile_picture_url": "…",
"scraped_at": "…"
},
"meta": {
"creditsUsed": 1,
"billed": true,
"reason": "profile_found"
},
"datacircle_meta": {
"provider": "up2data",
"cost_usd": 0.002375,
"balance_usd": 4.997625
}
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>",
"balance_usd": 123
}{
"error": "<string>"
}{
"error": {
"type": "invalid_request",
"message": "<string>"
},
"meta": {
"creditsUsed": 123,
"billed": true,
"reason": "<string>"
},
"datacircle_meta": {
"provider": "up2data",
"cost_usd": 123,
"balance_usd": 123
}
}{
"error": "<string>"
}{
"error": "<string>",
"balance_usd": 123
}Enrich one LinkedIn profile
Send Up2Data’s own request (POST https://api.up2data.ai/v1/profiles/enrich) to api.datacircle.dev, with your Datacircle key in Authorization and X-Data-Provider: up2data. The path and the body stay the same. We charge $0.002375 per profile Up2Data finds, with no markup.
curl -X POST "https://api.datacircle.dev/v1/profiles/enrich" \
-H "Authorization: Token $DATACIRCLE_API_KEY" \
-H "X-Data-Provider: up2data" \
-H "Content-Type: application/json" \
-d '{"url": "https://www.linkedin.com/in/williamhgates"}'import os
import requests
response = requests.post(
"https://api.datacircle.dev/v1/profiles/enrich",
headers={"Authorization": f"Token {os.environ['DATACIRCLE_API_KEY']}", "X-Data-Provider": "up2data"},
json={'url': 'https://www.linkedin.com/in/williamhgates'},
)
print(response.json())const options = {
method: 'POST',
headers: {
'X-Data-Provider': '<x-data-provider>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({url: 'https://www.linkedin.com/in/williamhgates'})
};
fetch('https://api.datacircle.dev/v1/profiles/enrich', 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/v1/profiles/enrich",
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([
'url' => 'https://www.linkedin.com/in/williamhgates'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"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"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.datacircle.dev/v1/profiles/enrich"
payload := strings.NewReader("{\n \"url\": \"https://www.linkedin.com/in/williamhgates\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-Data-Provider", "<x-data-provider>")
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://api.datacircle.dev/v1/profiles/enrich")
.header("X-Data-Provider", "<x-data-provider>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"url\": \"https://www.linkedin.com/in/williamhgates\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.datacircle.dev/v1/profiles/enrich")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-Data-Provider"] = '<x-data-provider>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"url\": \"https://www.linkedin.com/in/williamhgates\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"url": "https://www.linkedin.com/in/williamhgates",
"full_name": "…",
"first_name": "…",
"last_name": "…",
"public_identifier": "…",
"headline": "…",
"location": {
"city": "…",
"region": "…",
"country": "…",
"raw": "…"
},
"about": "…",
"urn": "…",
"linkedin_id": "…",
"profile_urn": "…",
"positions": [
{
"title": "…",
"company": "…",
"company_url": "…",
"linkedin_id": "…",
"position_id": "…",
"started_at": "…",
"ended_at": null,
"company_industry": "…",
"company_headcount": "…",
"company_logo_url": "…"
}
],
"current_company": {
"name": "…",
"url": "…",
"linkedin_id": "…",
"title": "…",
"started_at": "…",
"logo_url": "…",
"industry": "…",
"headcount": "…"
},
"education": [
{
"school": "…",
"education_id": "…",
"school_logo_url": "…",
"started_at": "…",
"ended_at": "…"
}
],
"primary_locale": "…",
"is_premium": true,
"is_open_to_work": false,
"profile_picture_url": "…",
"scraped_at": "…"
},
"meta": {
"creditsUsed": 1,
"billed": true,
"reason": "profile_found"
},
"datacircle_meta": {
"provider": "up2data",
"cost_usd": 0.002375,
"balance_usd": 4.997625
}
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>",
"balance_usd": 123
}{
"error": "<string>"
}{
"error": {
"type": "invalid_request",
"message": "<string>"
},
"meta": {
"creditsUsed": 123,
"billed": true,
"reason": "<string>"
},
"datacircle_meta": {
"provider": "up2data",
"cost_usd": 123,
"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: up2data. This header and the host are the only changes from the provider's own request.
up2data Body
The profile's LinkedIn URL (https://www.linkedin.com/in/williamhgates). Up2Data refuses a bare public identifier with its own 400
Restrict response to these top-level fields. Same cost. Listing followers_count or connections_count also opts into the extra scrape. Listing skill_endorsements also opts into the full-skills scrape.
Include followers_count and connections_count. Off by default: those numbers are a second LinkedIn request, not part of the main profile scrape. Same price. Extra latency.
Return every skill LinkedIn shows (up to LinkedIn's 50-skill cap) plus skill_endorsements. Off by default: without it you get the first 20 skills, and turning it on adds a second LinkedIn request. It costs nothing extra but takes longer.
Response
Up2Data's answer plus datacircle_meta
Up2Data's profile record, every field as Up2Data documents it (docs.up2data.ai). fields in the request restricts it to the fields listed.
Show child attributes
Show child attributes
Up2Data's billing metadata, minus creditsRemaining, requestId and latencyMs (our account with Up2Data, not yours)
Show child attributes
Show child attributes
Datacircle's only addition to the provider's answer
Show child attributes
Show child attributes