LeadMagic — Job search (V3)
Canonical endpoint: POST /v3/jobs/search — 46M+ open postings across corporate job boards.
Aliases (same handler): /v3/jobs-search, /v3/job-search, /v2/jobs/search, /v1/jobs/search.
Docs: Job Search
Unlimited with the right plan
Professional and Ultimate plans search this endpoint free — no credits, no volume cap. The only limit is rate: 5 req/s sustained (Professional), 10 req/s (Ultimate). That covers all three modes below. Other plans pay ~1 credit per returned job. Never ration or narrow a query to save credits on an entitled plan — go broad. Export is credit-metered on every plan.
Three modes, one endpoint
The body picks the mode; all three ride the unmetered plan entitlement:
| Mode | Trigger | Use for |
|---|---|---|
| vector (default fast) | nothing, or titles.vector: true |
Ranked browsing; semantic title match ("Head of Growth" also finds "VP Growth Marketing") |
| facets | includeFacets: true |
Results + aggregation counts (by country, seniority, industry) — filter UIs, market breakdowns |
| deep | mode: "deep" or includeDescription: true |
Full posting text — tool-mention mining, AI screening |
preview / teaser / dryRun are reserved for the LeadMagic app UI — external keys are rejected.
curl -sS -X POST "https://api.leadmagic.io/v3/jobs/search" \
-H "X-API-Key: $LEADMAGIC_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"titles": { "include": ["Sales Development Representative"], "vector": true },
"location": { "countries": ["US"] },
"postedWithin": 30,
"limit": 25,
"totalMode": "capped"
}'
Filters (at least one required)
titles.include/exclude (10 each, vector flag) · companies.include/ids ·
location.countries/regions/states/cities/text · tags.include ·
occupationTaxonomy.level1/2/3 (names or IDs) · seniority · languages ·
jobTypeIds · industryIds · companyTypeIds · companySizeCodes ·
workModes (1–3) · salary.min_usd/max_usd · hasRemote ·
postedAfter/postedBefore (YYYY-MM-DD) or postedWithin (days, ≤365).
autoResolve: true (default) fuzzy-resolves friendly values — no exact IDs needed.
totalMode: none | capped (default) | exact.
Cursor pagination
- First page: send filters +
limit(1–50, default 25). Nocursor. - Response carries
next_cursor(opaque string) andhas_more. - Next page: same filters +
"cursor": "<next_cursor>". Changing filters mid-cursor invalidates it. - Never combine
cursorwith a nonzerooffset— the API rejects it. - Stop when
next_cursoris null /has_moreis false. - On an unlimited plan, paging an entire market is free — just respect the RPS.
Free helpers (0 credits, shape filters first)
| Helper | Endpoint |
|---|---|
| Resolve friendly values → IDs | POST /v3/jobs/search/resolve |
| Autocomplete | GET /v3/jobs/search/{companies,titles,roles,tags,locations,occupation-taxonomy} |
| Filter catalogs | GET /v3/jobs/search/catalogs |
| Dataset stats / freshness | GET /v3/jobs/search/stats |
Bulk export (metered on all plans)
POST /v3/jobs/search/export — same filters, limit 1–5000 (default 100),
descriptions on by default, no cursor (narrow filters instead), 1 credit per returned job.
Workflow
- Shape filters free:
resolveor the GET catalogs. - Scan broad in vector mode; add
includeFacetsto see the distribution. - Drop to
mode: "deep"only on the slice needing descriptions. - Page with
cursoruntilhas_moreis false. - Need >50/page in one pull? Use export (metered) — tell the user the credit cost first.
When not to use this skill
- People/contacts at a company →
people-search - Company firmographics →
company-search - Legacy V1 listing API (
/v1/jobs/jobs-finder) → docs only; prefer V3