ScrapeField
People want three things from LinkedIn: profiles, companies and jobs. There are three ways to get them, and they differ less in what they return than in whose account carries the risk.
1. LinkedIn’s own API
Open to every developer for signing a member in and posting for them; everything about other members, companies and jobs is in partner programs that LinkedIn approves one by one, on terms it does not publish. If what you build is a sales, recruiting or marketing integration LinkedIn supports, apply. What the LinkedIn API costs goes through each program.
2. A scraper that signs in as you
Browser extensions, and the tools that ask for your LinkedIn cookie, read LinkedIn as you, inside your session. They are quick to start. The trade is that it is your account doing it, at the pace LinkedIn allows one person, and LinkedIn restricts accounts it sees automating. That is why we never take a customer’s login, cookie or session, at any price. PhantomBuster is the best known of these tools, and our comparison says where it is the better choice.
3. An API with no account of yours
One call, a profile’s URL or the name in it, or a search, and the answer is JSON, with nothing of yours signed in. A profile is 7 credits, $5.46 per 1,000 on the smallest pack and $3.08 on the largest; with detail=with_email, it adds a work email where one can be found, for 33. A page of job search results is 3 credits.
curl -H "Authorization: Bearer $SCRAPEFIELD_KEY" \
"https://api.scrapefield.com/v1/linkedin/profile?vanity_name=example-person"A profile has full_name, headline, about, location, current_company, experience, education and skills, named the way LinkedIn prints them. Every job posting for a search, in TypeScript:
const base = 'https://api.scrapefield.com/v1/linkedin/jobs';
const headers = { Authorization: `Bearer ${process.env.SCRAPEFIELD_KEY}` };
const jobs = [];
let cursor: string | null = null;
do {
const q = new URLSearchParams({ query: 'backend engineer', location: 'Berlin', posted_within: 'week' });
if (cursor) q.set('cursor', cursor);
const res = await fetch(`${base}?${q}`, { headers });
const body = await res.json();
if (!res.ok) throw new Error(body.error.message);
jobs.push(...body.data);
cursor = body.meta.next_cursor;
} while (cursor);And in Python:
import os, requests
base = "https://api.scrapefield.com/v1/linkedin/jobs"
headers = {"Authorization": f"Bearer {os.environ['SCRAPEFIELD_KEY']}"}
jobs, cursor = [], None
while True:
params = {"query": "backend engineer", "location": "Berlin", "posted_within": "week"}
if cursor:
params["cursor"] = cursor
body = requests.get(base, params=params, headers=headers).json()
if "error" in body:
raise RuntimeError(body["error"]["message"])
jobs += body["data"]
cursor = body["meta"]["next_cursor"]
if cursor is None:
breakEach job has title, company, location, workplace_type, salary where the posting gives one, listed_at and its url; the posting in full adds the description. Every endpoint, with a playground that runs with no key, is on the LinkedIn API page.
Which one
An integration LinkedIn supports: its own API. A few profiles by hand: an extension may do, on your own account. Lists, enrichment and anything that runs every day: an API, so that no one’s account is the one doing it. From here: enrich a list of companies, spot a job change, and find the companies hiring for a role.