Skip to main content
POST
Scrape Linkedin Jobs
Triggers a LinkedIn job search for one or more job titles and locations. The scraper builds the LinkedIn search, collects matching listings, optionally enriches each with full job and company detail, applies your exclusions, and returns structured job data. Pass a company_url (e.g. https://www.linkedin.com/company/google/) to scope the search to a single company: with titles_query it returns that company’s jobs matching your titles; on its own it returns the company’s whole job list (per-job detail fetches default off for these larger runs). Already have the postings? Pass linkedin_job_urls (up to 100 LinkedIn job links) or linkedin_job_ids (the numeric ids, when that is what you hold) and the scraper fetches exactly those, skipping the search entirely. The two can be combined; an id given both ways is fetched once. Required fields depend on company_url:
  • With linkedin_job_urls / linkedin_job_ids — that is the whole request. No other search input is accepted alongside them (titles_query, company_url, locations, and the filters are all rejected, not ignored), and include_job_details cannot be false: the detail page is the only source of those postings’ title, company and location.
  • With company_url — both titles_query and locations are optional. Omit locations and the company is scraped worldwide.
  • Without either — both titles_query and locations are required (a keyword search needs a where).
How rows behaves:
  • rows set — capped at that number (1–100), for any search (company or title).
  • rows omitted, company_url-only — the whole company list (up to ~1000).
  • rows omitted, title search — defaults to 50.
  • linkedin_job_urls / linkedin_job_ids — every posting given is scraped; rows still caps the count if you set it.
The pipeline runs asynchronously. Use the returned request_id to poll for results.
Timing guidance: Most searches complete within 1–4 minutes. Higher rows with include_job_details / include_company_details enabled take longer (one detail fetch per job). Poll every 15–30 seconds.

How it works

  1. Builds LinkedIn guest search URLs from your titles_query, locations, country, and filters. When company_url is set, it is resolved to LinkedIn’s numeric company id and applied as a company filter
  2. Collects job cards across the result pages up to rows (a company_url-only scrape collects the whole company list instead)
  3. Removes excluded_companies / excluded_titles / excluded_industries and de-duplicates
  4. Optionally fetches each job’s detail page (include_job_details) and company page (include_company_details)
  5. Returns structured listings plus the search URLs used
With linkedin_job_urls / linkedin_job_ids, steps 1-3 are skipped entirely: the job id comes straight off the link (or is the value you gave) and that posting is fetched (step 4), so the response carries no search_url. Both link shapes work — /jobs/view/<id> and a search page deep-linked with ?currentJobId=<id>; when a link carries both, the /jobs/view/ id wins. A posting whose page can’t be fetched is reported in errors and left out of jobs rather than returned as an empty row.

Response

The request is accepted immediately and returns a request_id — no jobs are returned here. Poll Get LinkedIn job scrape status with that id to retrieve the results.

Authorizations

Authorization
string
header
required

Bearer authentication header of the form Bearer <token>, where <token> is your auth token.

Body

application/json
titles_query

Job title(s) to search. A single string, or an array that is joined into one A OR B keyword search (single request, OR'd titles). Optional when company_url is given; at least one of the two is required.

company_url
string | null

LinkedIn company URL (e.g. https://www.linkedin.com/company/google/). Resolved to a numeric company id to return that company's jobs. With titles_query it narrows to matching titles; alone it returns the whole company list. At least one of titles_query or company_url is required.

linkedin_job_urls
string[] | null

Scrape these LinkedIn job postings directly (1-100), e.g. https://www.linkedin.com/jobs/view/4123456789. Self-contained: no search runs, so no other search input is needed — and none may be combined with it. Can be paired with linkedin_job_ids.

Maximum array length: 100
linkedin_job_ids
string[] | null

Scrape these LinkedIn job postings by their numeric id (1-100), e.g. "4123456789" — the same thing linkedin_job_urls carries, when you already hold the id. Behaves identically, and the two can be given together (an id supplied both ways is fetched once).

Maximum array length: 100
locations
string[] | null

Cities, regions, or countries to search; one search is run per location. Required unless company_url is given (a company scrape defaults to worldwide when omitted).

country
enum<string>
default:United States

Selects the LinkedIn regional domain to search (e.g. United Kingdom -> uk.linkedin.com). Countries without a dedicated subdomain use the global www.linkedin.com domain.

Available options:
Afghanistan,
Albania,
Algeria,
American Samoa,
Andorra,
Angola,
Anguilla,
Antarctica,
Antigua and Barbuda,
Argentina,
Armenia,
Aruba,
Australia,
Austria,
Azerbaijan,
Bahamas,
Bahrain,
Bangladesh,
Barbados,
Belarus,
Belgium,
Belize,
Benin,
Bermuda,
Bhutan,
Bolivia,
Bonaire, Sint Eustatius and Saba,
Bosnia and Herzegovina,
Botswana,
Bouvet Island,
Brazil,
British Indian Ocean Territory,
Brunei Darussalam,
Bulgaria,
Burkina Faso,
Burundi,
Cabo Verde,
Cambodia,
Cameroon,
Canada,
Cayman Islands,
Central African Republic,
Chad,
Chile,
China,
Christmas Island,
Cocos (Keeling) Islands,
Colombia,
Comoros,
Congo,
Congo, The Democratic Republic of the,
Cook Islands,
Costa Rica,
Croatia,
Cuba,
Curaçao,
Cyprus,
Czechia,
Côte d'Ivoire,
Denmark,
Djibouti,
Dominica,
Dominican Republic,
Ecuador,
Egypt,
El Salvador,
Equatorial Guinea,
Eritrea,
Estonia,
Eswatini,
Ethiopia,
Falkland Islands (Malvinas),
Faroe Islands,
Fiji,
Finland,
France,
French Guiana,
French Polynesia,
French Southern Territories,
Gabon,
Gambia,
Georgia,
Germany,
Ghana,
Gibraltar,
Greece,
Greenland,
Grenada,
Guadeloupe,
Guam,
Guatemala,
Guernsey,
Guinea,
Guinea-Bissau,
Guyana,
Haiti,
Heard Island and McDonald Islands,
Holy See (Vatican City State),
Honduras,
Hong Kong,
Hungary,
Iceland,
India,
Indonesia,
Iran,
Iraq,
Ireland,
Isle of Man,
Israel,
Italy,
Jamaica,
Japan,
Jersey,
Jordan,
Kazakhstan,
Kenya,
Kiribati,
Kuwait,
Kyrgyzstan,
Laos,
Latvia,
Lebanon,
Lesotho,
Liberia,
Libya,
Liechtenstein,
Lithuania,
Luxembourg,
Macao,
Madagascar,
Malawi,
Malaysia,
Maldives,
Mali,
Malta,
Marshall Islands,
Martinique,
Mauritania,
Mauritius,
Mayotte,
Mexico,
Micronesia, Federated States of,
Moldova,
Monaco,
Mongolia,
Montenegro,
Montserrat,
Morocco,
Mozambique,
Myanmar,
Namibia,
Nauru,
Nepal,
Netherlands,
New Caledonia,
New Zealand,
Nicaragua,
Niger,
Nigeria,
Niue,
Norfolk Island,
North Korea,
North Macedonia,
Northern Mariana Islands,
Norway,
Oman,
Pakistan,
Palau,
Palestine, State of,
Panama,
Papua New Guinea,
Paraguay,
Peru,
Philippines,
Pitcairn,
Poland,
Portugal,
Puerto Rico,
Qatar,
Romania,
Russian Federation,
Rwanda,
Réunion,
Saint Barthélemy,
Saint Helena, Ascension and Tristan da Cunha,
Saint Kitts and Nevis,
Saint Lucia,
Saint Martin (French part),
Saint Pierre and Miquelon,
Saint Vincent and the Grenadines,
Samoa,
San Marino,
Sao Tome and Principe,
Saudi Arabia,
Senegal,
Serbia,
Seychelles,
Sierra Leone,
Singapore,
Sint Maarten (Dutch part),
Slovakia,
Slovenia,
Solomon Islands,
Somalia,
South Africa,
South Georgia and the South Sandwich Islands,
South Korea,
South Sudan,
Spain,
Sri Lanka,
Sudan,
Suriname,
Svalbard and Jan Mayen,
Sweden,
Switzerland,
Syria,
Taiwan,
Tajikistan,
Tanzania,
Thailand,
Timor-Leste,
Togo,
Tokelau,
Tonga,
Trinidad and Tobago,
Tunisia,
Turkmenistan,
Turks and Caicos Islands,
Tuvalu,
Türkiye,
Uganda,
Ukraine,
United Arab Emirates,
United Kingdom,
United States,
United States Minor Outlying Islands,
Uruguay,
Uzbekistan,
Vanuatu,
Venezuela,
Vietnam,
Virgin Islands, British,
Virgin Islands, U.S.,
Wallis and Futuna,
Western Sahara,
Yemen,
Zambia,
Zimbabwe,
Åland Islands
rows
integer | null

Max jobs to return (1-100). Omit on a company_url-only scrape to pull the whole company list; set it to cap the count. Title searches default to 50 when omitted. Page results via limit/offset on the status endpoint.

Required range: 1 <= x <= 100
distance
string | null

Search radius in miles around each location, e.g. "25".

hours
integer | null

Only return jobs posted within the last N hours.

Required range: x >= 1
job_types
enum<string>[] | null

Filter by employment type. Unknown values are ignored.

Available options:
full-time,
part-time,
contract,
temporary,
internship,
volunteer,
other
work_types
enum<string>[] | null

Filter by on-site / remote / hybrid. Unknown values are ignored.

Available options:
on-site,
remote,
hybrid
experience_levels
enum<string>[] | null

Filter by seniority. Unknown values are ignored.

Available options:
internship,
entry level,
associate,
mid-senior level,
director
excluded_companies
string[] | null

Drop jobs whose company name matches any of these.

excluded_titles
string[] | null

Drop jobs whose title matches any of these.

excluded_industries
string[] | null

Drop jobs whose industry matches any of these.

include_company_details
boolean | null

Fetch each job's company page for extra fields (slower; one fetch per job). Default: on for a title search, off for a full company scrape.

include_job_details
boolean | null

Fetch each job's detail page for description, salary, apply URL, etc. (slower; one fetch per job). Default: on for a title search, off for a full company scrape. Cannot be false with linkedin_job_urls / linkedin_job_ids — the detail page is the only source of those postings' fields.

Response

Successful Response

request_id
string
required
status
string
default:QUEUED