/api/v1/search/jobs
Job/opportunity search with the full filter set. Location filtering works: pass `locations` a LinkedIn geo id (e.g. 101570771 for Tel Aviv-Yafo) — see that parameter for how to find one, and note it is an EXACT match, so use a city id rather than a country id. Still id-typed and not yet usable: titles, industries, functions, benefits, commitments. Offset-paginated. data.jobs[].id is the opportunityEntityId consumed by /jobs/details-v2, /jobs/similar, /jobs/people-also-viewed, /jobs/hiring-team.
Try in PlaygroundParameters
| Name | Type | Required | Description |
|---|---|---|---|
| keyword | string | no | Free-text keyword. |
| sortBy | string | no | Result ordering. Accepted values: relevance, date_posted. |
| datePosted | string | no | Recency filter. Accepted values: 24h, 1week, 1month. |
| experience | string | no | Experience level. Accepted values: internship, entry_level, associate, mid_senior, director, executive. Comma-separate for multiple. |
| jobTypes | string | no | Job type. Accepted values: full_time, part_time, contract, temporary, internship, volunteer, other. Comma-separate for multiple. |
| workplaceTypes | string | no | Workplace type. Accepted values: onsite, remote, hybrid. Comma-separate for multiple. |
| salary | string | no | Minimum salary bucket. Accepted values: 20k, 30k, 40k, 50k, 60k, 70k, 80k, 90k, 100k. |
| companies | string | no | Numeric organization id(s), comma-separated (e.g. 1035). Get from job payloads — data.jobs[].organization.organizationId via /api/v1/companies/jobs. |
| industries | string | no | Industry id(s), comma-separated. Free text is not reliably accepted — see the note on `locations`. |
| locations | string | no | Geo entity id(s), comma-separated. This is LinkedIn's own public geo id.
To find the id for a location:
• Type your target city, state or country into the location search box on LinkedIn
• Select the correct match from the auto-complete dropdown list
• Press enter to load the search results page
• Check the browser address bar for geoId= followed by a long number sequence
NOTE: this ID is case sensitive. Jobs may appear on LinkedIn but not here, because LinkedIn shows results for proximate locations while this search is exact-match based. Prefer a CITY id over a country id for the same reason — postings are tagged with the exact city, so Tel Aviv-Yafo (101570771) returns results where Israel (101620260) returns none. (e.g. 101570771) |
| functions | string | no | Job-function id(s), comma-separated. Free text is not reliably accepted — see the note on `locations`. |
| titles | string | no | Title id(s), comma-separated. NOT free text: a title like 'Senior Full Stack Developer' is rejected upstream (surfaces as a 422 mentioning entityId; no credits charged). Use `keyword` for free-text role matching instead. |
| benefits | string | no | Benefits filter, comma-separated. |
| commitments | string | no | Company-commitment filter, comma-separated. |
| easyApply | string | no | Only Easy Apply jobs. Accepted values: true, false. |
| verifiedJob | string | no | Only verified job postings. Accepted values: true, false. |
| under10Applicants | string | no | Only jobs with under 10 applicants. Accepted values: true, false. |
| fairChance | string | no | Only fair-chance employer jobs. Accepted values: true, false. |
| count | integer | no | Results per page, 0-50 (default 25). |
| start | integer | no | Pagination offset, 0-999. |
Example request
curl -H "X-API-Key: zq_…" \ "https://zooq.dev/api/v1/search/jobs?locations=101570771"
Example response
// live-verified shape — data.jobs[].id is the opportunityEntityId for the /jobs/* endpoints
{
"success": true,
"statusCode": 200,
"message": "Data retrieved successfully",
"errors": null,
"data": {
"jobs": [
{ "id": "4445939318", "url": "https://www.linkedin.com/jobs/view/4445939318", "title": "Mechanical Design / Concept Engineer", "organizationName": "Lawrence Harvey", "organizationLogo": "https://media.licdn.com/dms/image/...", "location": "London, United Kingdom", "listedAt": "2026-07-18T00:00:00Z", "isPromoted": false, "isEasyApply": true }
],
"total": 1200
}
}Successful responses are wrapped in the standard envelope. The data field carries the actual payload; errors is null on success.
Available via MCP as search_jobs
Add Zooq as an MCP server to Claude Desktop or Cursor and call this tool directly from your agent. See the MCP guide.
Want to try this endpoint?
300 free credits on signup, no card required. That covers 30 calls.
Get an API key →