Enrich a profile (sync)
Enrich a single LinkedIn profile right now and return the result directly.
https://api.up2data.ai/api/open-refresh/profileEnrich a single LinkedIn profile right now and get the result back in the same request. There is no queue, no status to poll and no webhook involved - the result is delivered in the response only.
For volume, send many profiles to profiles-bulk instead.
Both sync endpoints share a limit of 10 requests per 10 seconds per team. Every response carries RateLimit-Limit, RateLimit-Remaining and RateLimit-Reset (seconds until the window clears) headers, and a 429 also carries Retry-After.
Enabling withFollowersAndConnections or withFullSkillsAndEndorsements raises the rate (see the credit pill above) and may take longer to complete. Enabling both does not stack. Every rate is charged whether the profile is found (200) or not (404).
Set withFullSkillsAndEndorsements to true to receive skillsWithEndorsements, every skill on the profile paired with the number of endorsements it has. It also lifts the cap on skills: without the flag that array holds at most the first 20 skills a profile lists. Skills with no endorsements are returned with endorsementCount of 0, not omitted.
The response is a Profile document, with no wrapper and no _id. See Profile for the full shape.
Enriching many profiles in one request is cheaper per profile than calling this endpoint one at a time - see the credit pill on Profiles bulk. See the batch endpoint.
#Request
| Field | Type | Notes |
|---|---|---|
profilerequired | string | LinkedIn profile URL, linkedin.com/in/<slug>, or bare slug. |
withFollowersAndConnections | boolean | Optional, defaults to false. Also collects connectionsCount and followersCount. |
withFullSkillsAndEndorsements | boolean | Optional, defaults to false. Returns skillsWithEndorsements and lifts the 20-skill cap. |
#Call it
curl -X POST "https://api.up2data.ai/api/open-refresh/profile" \
-H "Authorization: YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"profile": "https://www.linkedin.com/in/johndoe",
"withFollowersAndConnections": false,
"withFullSkillsAndEndorsements": true
}'import requests
url = "https://api.up2data.ai/api/open-refresh/profile"
headers = {
"Authorization": "YOUR_ACCESS_TOKEN",
"Content-Type": "application/json",
}
payload = {
"profile": "https://www.linkedin.com/in/johndoe",
"withFollowersAndConnections": False,
"withFullSkillsAndEndorsements": True
}
response = requests.post(url, headers=headers, json=payload)
print(response.json())const url = "https://api.up2data.ai/api/open-refresh/profile";
const headers = {
"Authorization": "YOUR_ACCESS_TOKEN",
"Content-Type": "application/json",
};
const body = {
"profile": "https://www.linkedin.com/in/johndoe",
"withFollowersAndConnections": false,
"withFullSkillsAndEndorsements": true
};
const response = await fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
});
const data = await response.json();
console.log(data);package main
import (
"bytes"
"fmt"
"io"
"net/http"
)
func main() {
url := "https://api.up2data.ai/api/open-refresh/profile"
body := bytes.NewBufferString(`{
"profile": "https://www.linkedin.com/in/johndoe",
"withFollowersAndConnections": false,
"withFullSkillsAndEndorsements": true
}`)
req, err := http.NewRequest("POST", url, body)
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "YOUR_ACCESS_TOKEN")
req.Header.Set("Content-Type", "application/json")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
respBody, _ := io.ReadAll(resp.Body)
fmt.Println(string(respBody))
}#Response
{
"url": "johndoe",
"firstName": "John",
"lastName": "Doe",
"headline": "VP of Engineering at Acme Corp",
"location": "San Francisco, California, United States",
"experience": [
{
"companyName": "Acme Corp",
"title": "VP of Engineering",
"companyUrl": "acme-corp",
"start": { "year": 2021, "month": 3 },
"end": null
}
]
}{
"message": "Profile not found on LinkedIn"
}#Errors
| Status | Type | When |
|---|---|---|
| 404 | Profile not found on LinkedIn | No profile was found on LinkedIn for the given URL or slug. |
| 400 | Invalid input | The input is not a LinkedIn profile URL (linkedin.com/in/) or a bare slug, or the team's daily or monthly spending cap has been reached. |
| 403 | Insufficient credits | Not enough credits on the team. |
| 429 | Rate limited | More than 10 requests in 10 seconds for the team. The response carries Retry-After. |
| 503 | Worker unavailable | No worker became available within 10 seconds, or the crawl could not be completed. Retry later. |
See the Errors guide for every error type this version can return.