Get job, company and education details from LinkedIn profile URLs, from your AI assistant, no-code workflow or own code.
Pick your tool, copy the line and paste it in. The AI does the setup. You only paste your API key when it asks.
Set up the Datablist LinkedIn Profile Scraper API for me.
Here's the documentation: github.com/b1b1h-m1k3r/datablist-api-setup
Set up the Datablist LinkedIn Profile Scraper API for me.
Here's the documentation: github.com/b1b1h-m1k3r/datablist-api-setup
Set up the Datablist LinkedIn Profile Scraper API for me.
Here's the documentation: github.com/b1b1h-m1k3r/datablist-api-setup
Set up the Datablist LinkedIn Profile Scraper API in Make for me.
Here's the documentation: github.com/b1b1h-m1k3r/datablist-api-setup
Set up the Datablist LinkedIn Profile Scraper API in n8n for me.
Here's the documentation: github.com/b1b1h-m1k3r/datablist-api-setup
Set up the Datablist LinkedIn Profile Scraper API in Zapier for me.
Here's the documentation: github.com/b1b1h-m1k3r/datablist-api-setup
Let an AI assistant or your automation tool do the setup, or call the REST API from your own code.
Copy the prompt for Claude, ChatGPT or Cursor, or for Make, n8n or Zapier, and paste it in. The AI creates a Datablist folder on your computer and sets everything up.
When the AI asks, copy your API key from the Datablist app and paste it into the .env file it opened. Never paste it into the chat.
Send your list of LinkedIn profile URLs and get one row back per profile: name, headline, location, current job and company, ready for your sheet or CRM.
See a sample resultUse the HTTP request module or node your tool offers. You need three steps: send the list, wait, then read the results.
POSThttps://api.datablist.com/v1/enrichments/tasksX-API-Key = your API keyContent-Type = application/json{
"enrichmentId": "linkedin-profile-scraper",
"uniqueId": "linkedin-profile-scraper-import-1",
"settings": {
"experiencesNb": "3",
"educationsNb": "1"
},
"inputs": [
{"inputId": "row-1", "data": {"profileUrl": "https://www.linkedin.com/in/maya-lindqvist/"}},
{"inputId": "row-2", "data": {"profileUrl": "https://www.linkedin.com/in/tom-okafor/"}},
{"inputId": "row-3", "data": {"profileUrl": "https://www.linkedin.com/in/lea-moreau/"}}
]
}@id from the response. That is your task ID.Add a short wait or delay, then a GET request to https://api.datablist.com/v1/enrichments/tasks/TASK_ID with the same X-API-Key header. Repeat until status is completed.
GET https://api.datablist.com/v1/enrichments/tasks/TASK_ID/results?limit=50. Map outputs to your columns. If nextCursor is not empty, call again with &cursor= plus that value.
Create a task with one request. The full script with polling and results is in the developer section.
curl --request POST 'https://api.datablist.com/v1/enrichments/tasks' \ --header 'X-API-Key: YOUR_PERSONAL_API_KEY' \ --header 'Content-Type: application/json' \ --data '{ "enrichmentId": "linkedin-profile-scraper", "uniqueId": "linkedin-profile-scraper-import-1", "settings": { "experiencesNb": "3", "educationsNb": "1" }, "inputs": [ {"inputId": "row-1", "data": {"profileUrl": "https://www.linkedin.com/in/maya-lindqvist/"}}, {"inputId": "row-2", "data": {"profileUrl": "https://www.linkedin.com/in/tom-okafor/"}}, {"inputId": "row-3", "data": {"profileUrl": "https://www.linkedin.com/in/lea-moreau/"}} ] }'
import requests
response = requests.post(
"https://api.datablist.com/v1/enrichments/tasks",
headers={"X-API-Key": "YOUR_PERSONAL_API_KEY"},
json={
"enrichmentId": "linkedin-profile-scraper",
"uniqueId": "linkedin-profile-scraper-import-1",
"settings": {
"experiencesNb": "3",
"educationsNb": "1"
},
"inputs": [
{"inputId": "row-1", "data": {"profileUrl": "https://www.linkedin.com/in/maya-lindqvist/"}},
{"inputId": "row-2", "data": {"profileUrl": "https://www.linkedin.com/in/tom-okafor/"}},
{"inputId": "row-3", "data": {"profileUrl": "https://www.linkedin.com/in/lea-moreau/"}}
]
},
)
task = response.json()
print(task["@id"], task["status"])const response = await fetch("https://api.datablist.com/v1/enrichments/tasks", { method: "POST", headers: { "X-API-Key": "YOUR_PERSONAL_API_KEY", "Content-Type": "application/json", }, body: JSON.stringify({ "enrichmentId": "linkedin-profile-scraper", "uniqueId": "linkedin-profile-scraper-import-1", "settings": { "experiencesNb": "3", "educationsNb": "1" }, "inputs": [ {"inputId": "row-1", "data": {"profileUrl": "https://www.linkedin.com/in/maya-lindqvist/"}}, {"inputId": "row-2", "data": {"profileUrl": "https://www.linkedin.com/in/tom-okafor/"}}, {"inputId": "row-3", "data": {"profileUrl": "https://www.linkedin.com/in/lea-moreau/"}} ] }), }); const task = await response.json(); console.log(task["@id"], task.status);
Fresh public profile data from a LinkedIn URL: who the person is, where they work and what they studied. No Datablist workspace, collection or import needed.
Put LinkedIn Profile Scraper wherever your data already flows.
Pay per lookup with credits. API access starts on the Growth plan.
Tell us how many LinkedIn profiles you need and we'll show you the cheapest way to get them.
Everything you need to call the REST API directly: code, responses, endpoints, fields, authentication and limits.
DATABLIST_API_KEY and run.A complete script that creates a task, waits for it and prints every result. Replace YOUR_PERSONAL_API_KEY with your key.
# 1. Create the task (returns 202 Accepted and the task "@id") curl --request POST 'https://api.datablist.com/v1/enrichments/tasks' \ --header 'X-API-Key: YOUR_PERSONAL_API_KEY' \ --header 'Content-Type: application/json' \ --data '{ "enrichmentId": "linkedin-profile-scraper", "uniqueId": "linkedin-profile-scraper-import-1", "settings": { "experiencesNb": "3", "educationsNb": "1" }, "inputs": [ {"inputId": "row-1", "data": {"profileUrl": "https://www.linkedin.com/in/maya-lindqvist/"}}, {"inputId": "row-2", "data": {"profileUrl": "https://www.linkedin.com/in/tom-okafor/"}}, {"inputId": "row-3", "data": {"profileUrl": "https://www.linkedin.com/in/lea-moreau/"}} ] }' # 2. Poll every few seconds until status is completed, failed or stopped curl 'https://api.datablist.com/v1/enrichments/tasks/TASK_ID' \ --header 'X-API-Key: YOUR_PERSONAL_API_KEY' # 3. Read the results, then follow nextCursor until it is null curl 'https://api.datablist.com/v1/enrichments/tasks/TASK_ID/results?limit=50' \ --header 'X-API-Key: YOUR_PERSONAL_API_KEY'
import time import requests BASE = "https://api.datablist.com/v1/enrichments" HEADERS = {"X-API-Key": "YOUR_PERSONAL_API_KEY"} # 1. Create the task response = requests.post(f"{BASE}/tasks", headers=HEADERS, json={ "enrichmentId": "linkedin-profile-scraper", "uniqueId": "linkedin-profile-scraper-import-1", "settings": { "experiencesNb": "3", "educationsNb": "1" }, "inputs": [ {"inputId": "row-1", "data": {"profileUrl": "https://www.linkedin.com/in/maya-lindqvist/"}}, {"inputId": "row-2", "data": {"profileUrl": "https://www.linkedin.com/in/tom-okafor/"}}, {"inputId": "row-3", "data": {"profileUrl": "https://www.linkedin.com/in/lea-moreau/"}} ] }) response.raise_for_status() task_id = response.json()["@id"] # 2. Poll until the task finishes while True: task = requests.get(f"{BASE}/tasks/{task_id}", headers=HEADERS).json() if task["status"] in ("completed", "failed", "stopped"): break time.sleep(5) # 3. Read every result page params = {"limit": 50} while True: page = requests.get(f"{BASE}/tasks/{task_id}/results", headers=HEADERS, params=params).json() for result in page["results"]: print(result["inputId"], result["status"], result["outputs"]) if not page["nextCursor"]: break params["cursor"] = page["nextCursor"]
// Node.js 18+ or any runtime with fetch. Keep your key on the server. const BASE = "https://api.datablist.com/v1/enrichments"; const HEADERS = { "X-API-Key": "YOUR_PERSONAL_API_KEY" }; const sleep = (ms) => new Promise((r) => setTimeout(r, ms)); // 1. Create the task const created = await fetch(`${BASE}/tasks`, { method: "POST", headers: { ...HEADERS, "Content-Type": "application/json" }, body: JSON.stringify({ "enrichmentId": "linkedin-profile-scraper", "uniqueId": "linkedin-profile-scraper-import-1", "settings": { "experiencesNb": "3", "educationsNb": "1" }, "inputs": [ {"inputId": "row-1", "data": {"profileUrl": "https://www.linkedin.com/in/maya-lindqvist/"}}, {"inputId": "row-2", "data": {"profileUrl": "https://www.linkedin.com/in/tom-okafor/"}}, {"inputId": "row-3", "data": {"profileUrl": "https://www.linkedin.com/in/lea-moreau/"}} ] }), }); if (!created.ok) throw new Error(`Create failed: ${created.status}`); const taskId = (await created.json())["@id"]; // 2. Poll until the task finishes let task; do { await sleep(5000); task = await (await fetch(`${BASE}/tasks/${taskId}`, { headers: HEADERS })).json(); } while (!["completed", "failed", "stopped"].includes(task.status)); // 3. Read every result page let cursor = null; do { const url = new URL(`${BASE}/tasks/${taskId}/results`); url.searchParams.set("limit", "50"); if (cursor) url.searchParams.set("cursor", cursor); const page = await (await fetch(url, { headers: HEADERS })).json(); for (const result of page.results) { console.log(result.inputId, result.status, result.outputs); } cursor = page.nextCursor; } while (cursor);
One result per input, with your inputId, a status, the outputs and the credits used. Sample data.
{
"taskId": "00000000000040008000000000000001",
"results": [
{
"inputId": "row-1",
"status": "success",
"outputs": {
"profileUrl": "https://www.linkedin.com/in/maya-lindqvist/",
"firstName": "Maya",
"lastName": "Lindqvist",
"fullName": "Maya Lindqvist",
"linkedInHeadline": "Head of Sales at Brightwave Analytics",
"linkedInCity": "Stockholm",
"linkedInCountryCode": "SE",
"linkedInLocation": "Stockholm, Sweden",
"linkedInlastExpTitle": "Head of Sales",
"linkedInlastExpStartsAt": "2023-02-01",
"linkedInlastExpCompany": "Brightwave Analytics",
"linkedInlastExpCompanyWebsite": "https://www.brightwaveanalytics.com",
"linkedInlastExpCompanyIndustry": "Software Development",
"linkedInlastExpCompanyRange": "51-200",
"linkedInlastEduSchool": "Example University",
"linkedInLanguages": "English, Swedish",
"linkedInConnections": "500"
},
"creditsUsed": "25",
"error": null
}
],
"nextCursor": null
}All paths are relative to https://api.datablist.com. Field definitions come from GET /v1/enrichments/linkedin-profile-scraper (docs updated Oct 21, 2026).
/v1/enrichments/linkedin-profile-scraperRead the schema, no key needed/v1/enrichments/tasksCreate a task/v1/enrichments/tasks/{taskId}Poll status and progress/v1/enrichments/tasks/{taskId}/resultsRead results, 1 to 100 per page/v1/enrichments/tasks/{taskId}/stopCancel a running task/v1/enrichments/tasksTask history, newest firstsettings once per task and one data object per input. Results can include extra fields as the enrichment evolves, so keep unknown keys when you parse outputs.experiencesNbExperiences |
Text | Number of work experiences to return, sent as a string. One of: "3" (default), "5", "10". |
educationsNbEducations |
Text | Number of education entries to return, sent as a string. One of: "1" (default), "3", "5". |
acceptCachedProfilesAccept cached profiles |
Boolean | Use a cached profile when available, at 20 credits instead of 25. Applies when includeUrn and includePictures are false. |
includeUrnInclude URN |
Boolean | Include the LinkedIn internal identifier (URN), which you can use to build Sales Navigator URLs. Applies when acceptCachedProfiles is false. |
includePicturesInclude pictures |
Boolean | Include the profile picture and company logo URLs. These URLs expire fast, so download the images. Applies when acceptCachedProfiles is false. |
profileUrlrequiredLinkedIn Profile |
Text | Standard profile URL (https://linkedin.com/in/xxx) or Sales Navigator URL (https://www.linkedin.com/sales/lead/xxx). |
profileUrlProfile URL |
URL | The clean public profile URL, in the format https://www.linkedin.com/in/xxx. |
firstNameFirst Name |
Text | First name of the profile. |
lastNameLast Name |
Text | Last name of the profile. |
fullNameFull Name |
Text | Full name of the profile. |
linkedInHeadlineHeadline |
Text | The tagline on the profile. |
linkedInSummarySummary |
Text | The longer blurb written by the person. |
linkedInCityCity |
Text | City of the profile. |
linkedInStateState |
Text | State of the profile. |
linkedInCountryCodeCountry Code |
Text | ISO 3166-1 alpha-2 country code. |
linkedInCountryNameCountry |
Text | Country of residence, in English. |
linkedInLocationLocation |
Text | Full location text. |
linkedInlastExpTitleCurrent Job Title |
Text | Title of the current (or last) experience. Also linkedInlastExpEmploymentType, linkedInlastExpDescription, linkedInlastExpStartsAt, linkedInlastExpEndsAt and linkedInlastExpLocation. |
linkedInlastExpCompanyCurrent Company |
Text | Company of the current (or last) experience. Also linkedInlastExpCompanyPage, linkedInlastExpCompanyWebsite, linkedInlastExpCompanyDescription, linkedInlastExpCompanyIndustry and linkedInlastExpCompanyRange (size, like 11-50). |
linkedIn2ExpTitlePrevious Jobs |
Text | Second most recent experience, with EmploymentType, Description, StartsAt, EndsAt and CompanyName. linkedIn3Exp... and beyond follow when you ask for more experiences. |
linkedInlastEduSchoolSchool |
Text | School of the current (or last) education. Also linkedInlastEduDegree, linkedInlastEduField, linkedInlastEduStartsAt and linkedInlastEduEndsAt. |
linkedInLanguagesLanguages |
Text | Comma-separated list of spoken languages. |
linkedInConnectionsConnections |
Text | Number of connections. |
linkedInInternalIdentifierURN |
Text | LinkedIn internal identifier. Applies when includeUrn is true. |
linkedInProfilePictureProfile Picture |
Text | Picture URL, plus linkedInlastExpCompanyLogo, linkedIn2ExpLogo and linkedInlastEduLogo. These URLs expire fast. Applies when includePictures is true. |
Create a Personal API Key in your Datablist account and send it on every authenticated request.
Send your key in the X-API-Key header. Datablist exchanges and renews access tokens for you.
Learn the newest workflows with detailed step-by-step guides.
Everything you or your AI coding agent need to integrate the LinkedIn Profile Scraper API: auth, request, polling, results, limits and retries.
Chain LinkedIn Profile Scraper with other enrichments, in your code, in the Datablist app or for free.