LinkedIn Search APIPeople · Companies · Jobs · Posts
LinkedIn Search API for People, Companies, Jobs and Posts
Search public LinkedIn profiles, companies, jobs and posts through EnvoAPI GET endpoints. Use one API key to receive structured JSON, without supplying a LinkedIn login or cookie. Choose a route for your application or data pipeline, then send your first request with cURL or Python.
Read the API reference100 free credits · No credit card required
- 7 Search routes
- 4 Record types
- 1 credit Per search page
- 100 free credits No card
EnvoAPI is an independent, unofficial third-party API. It is not affiliated with or endorsed by LinkedIn.
Endpoints
Choose a LinkedIn search endpoint for your data
Choose a route by the records you need and the input you already have. Successful responses from these API endpoints contain data for results and meta for pagination and request cost.
- 1 routePeopleKeywords + profile filters
data.profiles - 2 routesCompaniesKeywords or a website domain
data.companies - 1 routeJobsKeywords + hiring filters
data.jobs - 2 routesPostsKeywords or a hashtag
data.posts
| Find | Input | GET path | Result array | Reference |
|---|---|---|---|---|
| People | Keywords, optional profile filters | /v1/profiles/search | data.profiles | People search |
| Companies by keyword | Keywords, optional company filters | /v1/companies/search | data.companies | Company keyword search |
| Companies by domain | Website domain | /v1/companies/by-domain | data.companies | Company domain search |
| Jobs | Keywords, optional job filters | /v1/jobs/search | data.jobs | Job search |
| Posts by keyword | Keywords, optional content filters | /v1/search/posts | data.posts | Post keyword search |
| Posts by hashtag | Hashtag without # | /v1/search/posts/by-hashtag | data.posts | Hashtag search |
| Mixed results | Keywords | /v1/search | data.results | Mixed keyword search |
Create your EnvoAPI account and get an API key.
Store the key as
ENVO_API_KEYin your backend environment. Keep it out of browser code and source control.Send GET requests to
https://api.envoapi.comwithAuthorization: BearerandAccept: application/json.
For a local Bash session, enter your key at the prompt below. The input stays hidden, and the exported variable works with every example on this page.
read -r -s -p "EnvoAPI key: " ENVO_API_KEYexport ENVO_API_KEYThe authentication guide covers key handling. For lookups and data beyond search, explore the LinkedIn data API.
People search
LinkedIn people search API: find public profiles
Use the LinkedIn people search API to find public profiles by keyword, then narrow the results with profile filters. This request searches a name and selects English profile language:
curl --fail-with-body --get 'https://api.envoapi.com/v1/profiles/search' \ --header "Authorization: Bearer $ENVO_API_KEY" \ --header 'Accept: application/json' \ --data-urlencode 'keywords=Satya Nadella' \ --data-urlencode 'offset=0' \ --data-urlencode 'profileLanguage=en'offset values from 0 to 50.{ "data": { "profiles": [ { "publicId": null, "name": "Satya Nadella", "firstName": "Satya", "lastName": "Nadella", "headline": "Illustrative search headline", "summary": null, "location": null, "countryISOCode": null, "industry": null, "linkedinUrl": "https://www.linkedin.com/in/example-profile/", "profilePictureUrl": null, "positions": [], "education": [], "skills": [], "premium": null, "creator": null, "influencer": null } ] }, "meta": { "paging": { "offset": 0, "limit": 10, "returned": 1, "hasMore": true, "nextOffset": 10 }, "creditCost": 1 }}Use profile data such as name, headline and location to choose a candidate. Keep its linkedinUrl; also retain publicId if it is not null. The schema also includes positions, education and skills; inspect their values before displaying them.
Supply IDs for profile filters
| Parameter | Value | Where to get it |
|---|---|---|
location | Comma-separated location IDs | Location search: data.locations[].id |
currentCompany | Comma-separated company IDs | Company details: data.publicId |
pastCompany | Comma-separated company IDs | Company details: data.publicId |
schoolFilter | Comma-separated school IDs | School search: data.schools[].id |
profileLanguage | Comma-separated language codes, such as en or en,fr | Supported codes in the people search reference |
serviceCategory | Comma-separated service category IDs | Service category search: data.serviceCategories[].id |
industry | Comma-separated industry IDs | Industry search: data.industries[].id |
Find locations with /v1/search/locations?keywords=United+States. Find industries with /v1/search/industries?query=software. Read the returned IDs rather than sending those names as filter values.
For a known company slug, call /v1/companies/details/by-slug?slug=microsoft and read data.publicId. Use these documented ID sources when constructing filters.
Read the next page or look up a selected profile
Pagination
While
meta.paging.hasMoreis true, copymeta.paging.nextOffsetinto the next request and keep the same filters. The example would continue atoffset=10. Stop whenhasMoreis false, or the next offset exceeds 50.Empty results
A page can contain fewer than 10 profiles. A successful empty
data.profilesarray is different from an HTTP error; check status first and inspect pagination before continuing.Next step
See the people search reference for the full contract. Enrichment adds details to a record you have selected. Once you have chosen a result, look up the selected profile to retrieve additional profile data.
Company search
LinkedIn company search API: search by keyword or domain
Use company keyword search when you know a name or topic. Use domain search when you already have a company website domain.
| Route | Input | Use it for | Optional filters |
|---|---|---|---|
| Keyword search | keywords=Microsoft | Finding company candidates by name or keyword | location, industry, companySize, hasJobs=true |
| Domain search | domain=microsoft.com | Finding company candidates for a website domain | No keyword-route filters; use offset for pagination |
curl --fail-with-body --get 'https://api.envoapi.com/v1/companies/search' \ --header "Authorization: Bearer $ENVO_API_KEY" \ --header 'Accept: application/json' \ --data-urlencode 'keywords=Microsoft' \ --data-urlencode 'offset=0'curl --fail-with-body --get 'https://api.envoapi.com/v1/companies/by-domain' \ --header "Authorization: Bearer $ENVO_API_KEY" \ --header 'Accept: application/json' \ --data-urlencode 'domain=microsoft.com' \ --data-urlencode 'offset=0'data.companies with the following structure.{ "data": { "companies": [ { "name": "Microsoft", "slug": "microsoft", "linkedinUrl": "https://www.linkedin.com/company/microsoft/", "description": null, "summary": null, "logoUrl": null } ] }, "meta": { "paging": { "offset": 0, "limit": 10, "returned": 1, "hasMore": false, "nextOffset": null }, "creditCost": 1 }}For keyword search, location and industry accept up to 10 comma-separated IDs each, from the sources above. Set hasJobs=true to apply that filter; otherwise omit it.
companySize code | B | C | D | E | F | G | H | I |
|---|---|---|---|---|---|---|---|---|
| Employee range | 1–10 | 11–50 | 51–200 | 201–500 | 501–1,000 | 1,001–5,000 | 5,001–10,000 | 10,001+ |
Combine size ranges with commas, such as companySize=D,E. Check the company keyword search and company domain search contracts before adding parameters.
Pagination
For either route, follow
meta.paging.nextOffsetwhilehasMoreis true, keeping offsets within 0–10,000. Search cards include nullabledescription,summaryandlogoUrl.Next step
A domain search returns candidates; a match alone does not verify company identity. For more company data, select a result using its name, slug and LinkedIn URL, then retrieve company details for headcount and headquarters.
Job search
LinkedIn job search API: find public job postings
Use the /v1/jobs/search endpoint to find public job cards by keyword and optional hiring filters. Jobs use start for pagination.
curl --fail-with-body --get 'https://api.envoapi.com/v1/jobs/search' \ --header "Authorization: Bearer $ENVO_API_KEY" \ --header 'Accept: application/json' \ --data-urlencode 'keywords=software engineer' \ --data-urlencode 'start=0' \ --data-urlencode 'location=geo_6yITcz' \ --data-urlencode 'sort=relevance' \ --data-urlencode 'timePosted=any'| Parameter | Accepted value |
|---|---|
location | One Envo location ID from data.locations[].id |
companyIds | Up to 10 comma-separated company IDs from company details data.publicId |
experience | One of internship, entry, associate, mid_senior, director, executive |
employmentType | Comma-separated values: full_time, part_time, contract, temporary, volunteer, internship, other |
workplaceType | Comma-separated values: on_site, remote, hybrid |
easyApply | true to filter; otherwise omit |
under10Applicants | true to filter; otherwise omit |
sort | relevance or recent |
timePosted | any, day, week, month |
{ "data": { "jobs": [ { "title": "Software Engineer", "url": "https://www.linkedin.com/jobs/view/1234567890/", "location": null, "postedAt": null, "companyName": "Example Systems", "companyUrl": "https://www.linkedin.com/company/example-systems/", "companyLogoUrl": null, "isPromoted": false, "isEasyApply": true } ] }, "meta": { "paging": { "start": 0, "count": 10, "hasMore": true }, "creditCost": 1 }}Read results
Read each job title from
title, then usecompanyNameandlocationto select a job. Retain itsurland check nullablepostedAtvalues before sorting or displaying them.Pagination
While
hasMoreis true, set the nextstarttometa.paging.start + meta.paging.countand keep the filters unchanged. This example continues atstart=10. Stop whenhasMoreis false, or the next start exceeds 10,000.Page size
countis the page size, whiledata.jobs.lengthis the number of returned cards. Use the paging value to advance, even after a short page. Jobs do not returnnextStartin this schema.
The job search reference defines filters. Check the job search pagination schema and our guide to job details and company hiring workflows for pagination and next steps.
Post search
LinkedIn post search API: find posts by keyword or hashtag
Search public posts with a keyword query or a hashtag. These routes read posts; they do not publish content or manage LinkedIn accounts.
| Search | Input | Filters |
|---|---|---|
| Keyword | keywords=Microsoft | sort=relevance or recent; postedWithin=day, week or month; contentType |
| Hashtag | hashtag=microsoft | Use hashtag and offset; keyword-route filters are not supported |
The keyword route accepts contentType values videos, photos, jobs, liveVideos, documents and collaborativeArticles. Omit the parameter to leave content type unfiltered.
Search posts by keyword
curl --fail-with-body --get 'https://api.envoapi.com/v1/search/posts' \ --header "Authorization: Bearer $ENVO_API_KEY" \ --header 'Accept: application/json' \ --data-urlencode 'keywords=Microsoft' \ --data-urlencode 'offset=0' \ --data-urlencode 'sort=relevance'{ "data": { "posts": [ { "url": "https://www.linkedin.com/posts/example-systems_example-post-1234567890/", "text": "An illustrative post mentioning Microsoft.", "author": { "kind": "company", "name": "Example Systems", "headline": null, "url": "https://www.linkedin.com/company/example-systems/" }, "contentType": "text", "isRepost": false, "reactionCount": 0, "commentCount": 0, "repostCount": 0 } ] }, "meta": { "paging": { "offset": 0, "limit": 10, "returned": 1, "hasMore": false, "nextOffset": null }, "creditCost": 1 }}Search posts by hashtag
curl --fail-with-body --get 'https://api.envoapi.com/v1/search/posts/by-hashtag' \ --header "Authorization: Bearer $ENVO_API_KEY" \ --header 'Accept: application/json' \ --data-urlencode 'hashtag=microsoft' \ --data-urlencode 'offset=0'{ "data": { "posts": [ { "url": "https://www.linkedin.com/posts/example-systems_example-hashtag-post-1234567890/", "text": "An illustrative post with #microsoft.", "author": { "kind": "company", "name": "Example Systems", "url": "https://www.linkedin.com/company/example-systems/" }, "contentType": "text", "isRepost": false, "reactionCount": 0, "commentCount": 0, "repostCount": 0 } ] }, "meta": { "paging": { "offset": 0, "limit": 10, "returned": 1, "total": 1, "hasMore": false, "nextOffset": null }, "creditCost": 1 }}Select a post
Use
text,authorandurlto select a post. The response reportscontentType,isRepostand engagement counts. Response content types use labels such astextorvideo, distinct from the keyword filter values.Schema
Keyword results include nullable
author.headline; hashtag results omit that field and includemeta.paging.total. Follow each route's schema when parsing the response.Pagination
Both routes accept offsets from 0 to 10,000. While
hasMoreis true, usemeta.paging.nextOffsetfor the next request within that range. See post keyword search and hashtag search for the complete contracts.
Python
Run LinkedIn people and job searches from Python
Call the same GET endpoints from Python with requests. Keep ENVO_API_KEY in the backend environment and install the dependency:
Install requestsbash python3 -m pip install requestsSave the following code as
search.pyand runpython3 search.pyfrom the environment containing your key. It sends one people request and one job request, with no automatic retries.search.pypython import osimport requestsAPI_BASE = "https://api.envoapi.com"API_KEY = os.environ.get("ENVO_API_KEY")if not API_KEY: raise SystemExit("Set ENVO_API_KEY in your backend environment.")HEADERS = { "Authorization": f"Bearer {API_KEY}", "Accept": "application/json",}def search(path, params): try: response = requests.get( API_BASE + path, headers=HEADERS, params=params, timeout=30, ) except requests.RequestException as exc: raise RuntimeError("Search failed before an HTTP response.") from exc if response.status_code == 401: raise RuntimeError("HTTP 401: check your EnvoAPI key.") if response.status_code == 400: raise RuntimeError("HTTP 400: check the route and filter values.") if response.status_code == 429: retry_after = response.headers.get("Retry-After", "unknown") raise RuntimeError( f"HTTP 429: Retry-After={retry_after} seconds. " "Wait before a bounded retry." ) try: response.raise_for_status() except requests.HTTPError as exc: raise RuntimeError(f"HTTP {response.status_code}: search failed.") from exc try: return response.json() except ValueError as exc: raise RuntimeError("Successful HTTP response contained invalid JSON.") from excdef main(): people_params = { "keywords": "Satya Nadella", "offset": 0, "profileLanguage": "en", } job_params = { "keywords": "software engineer", "start": 0, "location": "geo_6yITcz", "sort": "relevance", "timePosted": "any", } people = search("/v1/profiles/search", people_params) profiles = people["data"]["profiles"] if not profiles: print("People search succeeded with no profiles on this page.") for profile in profiles: print(profile["name"], profile["linkedinUrl"]) print("People paging:", people["meta"]["paging"]) print("People credits:", people["meta"]["creditCost"]) jobs = search("/v1/jobs/search", job_params) job_cards = jobs["data"]["jobs"] if not job_cards: print("Job search succeeded with no jobs on this page.") for job in job_cards: print(job["title"], job["companyName"], job["url"]) print("Job paging:", jobs["meta"]["paging"]) print("Job credits:", jobs["meta"]["creditCost"])if __name__ == "__main__": try: main() except RuntimeError as exc: raise SystemExit(str(exc)) from exc
Credits
As of October 2026, the two successful search calls in this example use 2 credits. Calls to obtain filter IDs or retrieve details are additional. Substitute your location ID or omit
locationfor an unfiltered job search.Next page
For another people page, update
people_params["offset"]fromnextOffset. For jobs, updatejob_params["start"]fromstart + count. CheckhasMoreand the route's bounds before sending another request.Rate limits
On HTTP 429, wait for the
Retry-Afterinterval before retrying with a fixed attempt limit. The example stops and reports that header so your application can schedule the retry. See rate limit handling and the pagination guide.
For filter pickers, typeahead and enrichment, see how to build search and filtering into your application.
Search UI
Build search with filters, typeahead and pagination
Turn an API response into a search experience for sales, recruiting or account research. Start with a keyword, resolve filter IDs, show compact result cards, then enrich the records a user chooses. These examples keep the EnvoAPI key on your backend and separate valid empty results from failed requests.
Build a people search experience
Show each person's name, headline and available location. Keep the returned LinkedIn URL for a subsequent lookup; hide missing optional fields. For company results, show the name, available logo and summary, then offer a clear action to view or enrich the selected account.
Node.js backend adapter for people and location search
Add Express and Zod to your Node.js application. Save this example as
server.mjsand runnode server.mjswithENVO_API_KEYset on the server. Route your frontend's/api/searchrequests to this backend. It validates inputs and the response fields used by the UI, forwards rate limit errors and makes no automatic retries.server.mjsjavascript import express from "express";import { z } from "zod";const app = express();const key = process.env.ENVO_API_KEY;if (!key) throw new Error("Set ENVO_API_KEY on the server.");const peopleInput = z.object({ q: z.string().trim().min(1).max(200), location: z.string().trim().min(1).max(200).optional(), offset: z.coerce.number().int().min(0).max(50).default(0),});const locationInput = z.object({ q: z.string().trim().min(2).max(200),});const peopleResponse = z.object({ data: z.object({ profiles: z.array(z.object({ name: z.string(), headline: z.string().nullable(), location: z.string().nullable(), linkedinUrl: z.string().nullable(), })), }), meta: z.object({ paging: z.object({ hasMore: z.boolean(), nextOffset: z.number().nullable(), }), }),});const locationResponse = z.object({ data: z.object({ locations: z.array(z.object({ id: z.string(), name: z.string() })), }),});async function callEnvo(path, params, schema, res) { const response = await fetch("https://api.envoapi.com" + path + "?" + params, { headers: { Authorization: "Bearer " + key, Accept: "application/json" }, signal: AbortSignal.timeout(15000), }); if (!response.ok) { const retryAfter = response.headers.get("Retry-After"); if (retryAfter) res.set("Retry-After", retryAfter); res.status(response.status).json({ error: "Search request failed." }); return null; } return schema.parse(await response.json());}// Mount these routes behind your application's authentication and rate limits.app.get("/api/search/people", async (req, res) => { const input = peopleInput.safeParse(req.query); if (!input.success) return res.status(400).json({ error: "Invalid search." }); const { q, location, offset } = input.data; const params = new URLSearchParams({ keywords: q, offset: String(offset) }); if (location) params.set("location", location); try { const payload = await callEnvo("/v1/profiles/search", params, peopleResponse, res); if (!payload) return; res.json({ people: payload.data.profiles, pagination: payload.meta.paging }); } catch { res.status(502).json({ error: "Search is temporarily unavailable." }); }});app.get("/api/search/locations", async (req, res) => { const input = locationInput.safeParse(req.query); if (!input.success) return res.status(400).json({ error: "Invalid location query." }); const params = new URLSearchParams({ keywords: input.data.q }); try { const payload = await callEnvo("/v1/search/locations", params, locationResponse, res); if (!payload) return; res.json({ suggestions: payload.data.locations }); } catch { res.status(502).json({ error: "Location suggestions are unavailable." }); }});app.listen(3001);Add typeahead and dynamic filters
Require at least two characters and debounce location suggestions by 300 ms. Cancel pending requests when the input changes, and ignore stale responses. When a user selects a suggestion, store its
idas the search filter. Render selected filters as removable chips with a Clear all action; typing a new location clears the previous selection. Submit the full search when the user applies the query and filters.Location discovery uses
/v1/search/locationswithkeywordsand returnsdata.locations. Industry discovery uses/v1/search/industrieswithqueryand returnsdata.industries. Pass their resolved IDs into supported search filters.Frontend typeahead with debounce and request cancellation
Connect the render, loading and error callbacks to your UI. Call
input(value)on input changes anddestroy()when unmounting. Render suggestions as accessible selectable options with keyboard support and use text nodes for API values.location-typeahead.tstypescript type LocationSuggestion = { id: string; name: string };type TypeaheadUI = { render: (suggestions: LocationSuggestion[]) => void; loading: (active: boolean) => void; error: (message: string) => void;};export function createLocationTypeahead(ui: TypeaheadUI) { let timer: ReturnType<typeof setTimeout> | undefined; let active: AbortController | undefined; function cancel() { clearTimeout(timer); active?.abort(); active = undefined; ui.loading(false); } function input(value: string) { cancel(); ui.render([]); ui.error(""); const query = value.trim(); if (query.length < 2) return; timer = setTimeout(async () => { const controller = new AbortController(); active = controller; ui.loading(true); try { const response = await fetch( "/api/search/locations?q=" + encodeURIComponent(query), { signal: controller.signal }, ); if (!response.ok) throw new Error("Location suggestions unavailable."); const result = await response.json(); if (active === controller) ui.render(result.suggestions); } catch { if (active === controller) ui.error("Unable to load suggestions. Try again."); } finally { if (active === controller) { ui.loading(false); active = undefined; } } }, 300); } return { input, destroy: cancel };}Handle pagination and UI states
- Initial loading: show progress or result-card skeletons.
- Loading more: retain existing results and disable duplicate requests.
- No results: suggest broader keywords or fewer applied filters.
- Request failed: show a retry action and retain the current results.
- End of results: remove Load more when there is no valid next offset.
For people search, use
meta.paging.nextOffsetwhilehasMoreis true, within the 0–50 offset range. Keep the submitted query and filters unchanged across pages. A new search resets the list and cancels the previous loader. On HTTP 429, respect the backend'sRetry-Afterheader before offering a retry.Load more pagination with loading and error callbacks
Create a loader for the submitted query and selected location ID. Call
loadMore()for the first page and subsequent pages. Append returned cards in your UI and hide Load more when pagination reports no further page or its next offset exceeds 50.people-pagination.tstypescript type PeoplePage = { people: Array<{ name: string; headline: string | null; location: string | null; linkedinUrl: string | null; }>; pagination: { hasMore: boolean; nextOffset: number | null };};// Create a new loader for each submitted query and selected location ID.// Call destroy() when replacing the search or unmounting the view.export function createPeopleLoader( query: string, locationId: string | undefined, ui: { append: (page: PeoplePage) => void; loading: (active: boolean) => void; error: (message: string) => void; },) { let offset: number | null = 0; let active: AbortController | undefined; let disposed = false; async function loadMore() { if (disposed || active || offset === null) return; const controller = new AbortController(); active = controller; ui.error(""); ui.loading(true); const params = new URLSearchParams({ q: query, offset: String(offset) }); if (locationId) params.set("location", locationId); try { const response = await fetch("/api/search/people?" + params, { signal: controller.signal, }); if (!response.ok) throw new Error("Search request failed."); const page: PeoplePage = await response.json(); if (disposed) return; ui.append(page); const next = page.pagination.nextOffset; offset = page.pagination.hasMore && next !== null && next > offset && next <= 50 ? next : null; } catch { if (!disposed) ui.error("Unable to load results. Try again."); } finally { active = undefined; if (!disposed) ui.loading(false); } } function destroy() { disposed = true; active?.abort(); ui.loading(false); } return { loadMore, destroy };}Search, refine and enrich selected records
A sales user searches for Head of Sales, selects Singapore from location suggestions and compares the returned people cards. Opening a selected card triggers a profile detail lookup. If the workflow starts with target accounts, use company search first, then retrieve company details. Enrich records when a user opens or saves them, and offer downstream actions such as adding a record to a CRM or assigning it to a recruiter.
Credits & limits
Check credit costs and API rate limits
As of October 2026, you can start with 100 one-time free credits without a payment card, or choose Launch at $49 per month. The plans below show credits and account request limits.
| Plan | Price | Credits | Requests per minute |
|---|---|---|---|
| Free | $0 | 100, one time | 10 |
| Launch | $49/month | 10,000/month | 60 |
Per request
Each search request costs 1 credit, including a request for another page. The charge is per request, regardless of how many records appear on that page. Read
meta.creditCostfor the returned request cost.On Launch
On Launch,
$49 / 10,000 = $0.0049per credit when you use the full monthly allocation. One search page plus one base detail lookup uses 2 credits:2 × $0.0049 = $0.0098in allocated subscription cost.Budget
For
psearch pages andnbase profile or company detail lookups, budgetp + ncredits. Add filter-ID and typeahead requests separately, along with optional enrichment costs. This calculation does not set a price for every returned record.
X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset response headers to manage capacity. Handle HTTP 429 before scheduling another request.Check plans and billing and the credit costs table for current terms.
Check what search returns
Public, read-only records: search does not provide private profiles, messaging, posting or job publishing.
Bounded results: EnvoAPI does not provide bulk dataset downloads or guarantee every matching record.
Nullable data: public sources do not expose every field. Handle null values and empty arrays; do not assume email or phone availability.
API-controlled page sizes: do not send
limit,count,maxPagesorfetchAll. Follow returned pagination and the offset or start bounds for each route.Route-specific metadata: search responses contain
meta.pagingandmeta.creditCost. They do not containmeta.sections.
meta.sections for section status. Use that metadata for the lookup response, rather than judging search completeness with it.Get your free API key and try the route that fits your input.
Access
Understand LinkedIn API access and data responsibilities
As of October 2026, LinkedIn's official APIs use OAuth and product-specific permissions; EnvoAPI uses its own key to read public data independently. Choose access according to the operation you need.
Official access
Official LinkedIn access depends on the product, scopes and approval requirements. Some permissions are open, while other products require program access. Review the LinkedIn API access requirements for your integration.
Job posting
LinkedIn provides a Job Posting API for authorized partner integrations that publish and manage job listings. It serves job posting, rather than public job search. For public job cards through EnvoAPI, use
/v1/jobs/search.Your responsibilities
The LinkedIn User Agreement restricts automated collection. You are responsible for your use of returned data, including applicable privacy notices, lawful processing and data rights under GDPR, CCPA and other relevant laws.
Review our data responsibility and trust policies when designing your downstream workflow.
Start with a search
Your next workflow starts with one request.
Choose your search route, get a key and send the sample request from your backend.
100 free credits · No credit card required