One search across thousands of company career boards, newest jobs first.
Job Search is a jobs API that searches the open positions at thousands of companies at once. Search by job title keywords, location, country, remote work, employment type, posting date or company, and get the newest matching jobs first, each with its title, company, location, country, workplace type, posting date and apply link. Paid plans add salary ranges, a minimum salary filter, larger pages and each job's full description.
Try it — live request, no key required
No key required to try it. Get a key to use it in your app.
{
"status": "ok",
"error": null,
"data": {
"page": 1,
"count": 2,
"hasMore": true,
"jobs": [
{
"id": "b4f50cb0115efeef41cb",
"title": "Senior Network and Cloud Engineer",
"company": "Acturis",
"location": "London, England, United Kingdom",
"locations": [
"London, England, United Kingdom"
],
"country": "GB",
"remote": false,
"workplaceType": "hybrid",
"employmentType": "full-time",
"postedAt": "2026-10-14T15:37:26.000Z",
"url": "https://careers.acturis.com/o/senior-network-and-cloud-engineer",
"applyUrl": "https://careers.acturis.com/o/senior-network-and-cloud-engineer/c/new",
"salary": {
"min": null,
"max": null,
"currency": null,
"interval": null
}
},
{
"id": "43175a4af41a8c5a9a3b",
"title": "Senior AI Engineer in Computer Vision",
"company": "Faktion BV",
"location": "Antwerp, Vlaams Gewest, Belgium",
"locations": [
"Antwerp, Vlaams Gewest, Belgium"
],
"country": "BE",
"remote": false,
"workplaceType": "hybrid",
"employmentType": "full-time",
"postedAt": "2026-08-24T13:17:35.000Z",
"url": "https://talent.faktion.com/o/senior-ai-engineer-in-computer-vision",
"applyUrl": "https://talent.faktion.com/o/senior-ai-engineer-in-computer-vision/c/new",
"salary": {
"min": null,
"max": null,
"currency": null,
"interval": null
}
}
]
}
}
About the Job Search API
Job Search keeps its own index of the open jobs on public company career boards, refreshed through the day, so a search never waits on a company's website. Every job has the same shape whichever company posted it. Keyword search matches every word you give against the job title, with plurals and accents folded, so data engineers finds Senior Data Engineer. Results are newest first; pass a job's id to get its full description on a paid plan.
What people use it for
- Job Boards
- Niche job sites and aggregators fill their listings by keyword, location and remote filters without integrating each company's careers system.
- Job Alerts
- Alert services run saved searches with postedSince to send only jobs published since the last run.
- Hiring Signals
- Sales and investment tools watch which companies are hiring for which roles and where.
- Career Tools
- Resume and career apps suggest open roles that match a candidate's title and location.
Ways to call it
One endpoint, many ways in — REST with JSON, XML, YAML and CSV, plus GraphQL and an MCP interface for AI agents.
- JSON
- Default REST response
- XML
- Markup format
- YAML
- Human-readable
- CSV
- Tabular export
- GraphQL
- Query language
- MCP
- For AI agents
Other ways to use Job Search
Same data, same APIVerve account, same credit balance — one key works on all of them.
Which jobs does it cover?
How current are the jobs?
How does keyword matching work?
Why is country null for some jobs?
What do I get on the free plan?
Request parameters — GET /v1/jobsearch
Sent in the query string. Premium parameters are accepted on every plan but only take effect on plans that include them. Anything not listed here is dropped rather than passed through.
Required
| Parameter | Type | Example | Description |
|---|---|---|---|
keywordRequired | string | software engineer | Words that must all appear in the job title, for example data engineer or product designer. length 0-100 |
Optional
| Parameter | Type | Example | Description |
|---|---|---|---|
locationOptional | string | New York | Return only jobs with a location containing this text, for example London, New York or Bavaria. length 0-100 |
countryOptional | string | US | Return only jobs in this country: an ISO 3166 code or a name, for example US, GB or Germany. length 0-60 |
remoteOptional | boolean | true | true returns only jobs open to remote work; false only jobs that are not. |
employmentTypeOptional | string | full-time | Return only jobs of this employment type. Jobs that give no employment type are kept, since many companies leave it blank; only jobs of another type are left out.full-timepart-timecontractinternshiptemporary |
postedSinceOptional | string | 7d | Return only jobs first published at or after this date or date-time (ISO 8601, for example 2026-10-01), or within this age: a number followed by h, d or w, for example 12h, 7d or 2w. length 0-30 |
companyOptional | string | airbnb | Return only jobs at this company, by its career board name, usually the company name in lowercase, for example airbnb. length 0-100 |
minSalaryOptionalPremium | number | 100000 | Return only jobs whose salary range reaches at least this amount, in the job's own currency and pay period. Jobs that publish no salary are left out when this is set. range 0-inf |
pageOptional | integer | 1 | Page of results: 10 jobs per page up to page 5 on the free plan, 50 per page up to page 10 on paid plans. default 1 · range 1-10 |
curl "https://api.apiverve.com/v1/jobsearch?keyword=engineer&location=New%20York&country=US&remote=true&employmentType=full-time&postedSince=7d&company=airbnb&minSalary=100000&page=1" \
-H "x-api-key: YOUR_API_KEY"Authentication
Send your key in the x-api-key header. That is the only auth step — no token exchange, and no per-endpoint scope to configure.
| Header | When | Value |
|---|---|---|
x-api-keyRequired | Every request | Your API key. Header names are case-insensitive, so X-API-Key is the same header. |
AuthorizationAlternate | Instead of the above | Bearer <key> — for clients that only expose bearer auth. Resolves to the same account and the same billing. |
A 401 means the key is missing, invalid or expired. A 403 means the key is valid but not permitted here — blocked by a key restriction or an IP allow-list. Running out of credits is a 429.
Response — GET /v1/jobsearch
Every APIVerve endpoint returns the same three top-level keys, so one response handler covers your whole integration: status, error and data. Only data changes shape.
{
"status": "ok",
"error": null,
"data": {
"page": 1,
"count": 2,
"hasMore": true,
"jobs": [
{
"id": "b4f50cb0115efeef41cb",
"title": "Senior Network and Cloud Engineer",
"company": "Acturis",
"location": "London, England, United Kingdom",
"locations": [
"London, England, United Kingdom"
],
"country": "GB",
"remote": false,
"workplaceType": "hybrid",
"employmentType": "full-time",
"postedAt": "2026-10-14T15:37:26.000Z",
"url": "https://careers.acturis.com/o/senior-network-and-cloud-engineer",
"applyUrl": "https://careers.acturis.com/o/senior-network-and-cloud-engineer/c/new",
"salary": {
"min": null,
"max": null,
"currency": null,
"interval": null
}
},
{
"id": "43175a4af41a8c5a9a3b",
"title": "Senior AI Engineer in Computer Vision",
"company": "Faktion BV",
"location": "Antwerp, Vlaams Gewest, Belgium",
"locations": [
"Antwerp, Vlaams Gewest, Belgium"
],
"country": "BE",
"remote": false,
"workplaceType": "hybrid",
"employmentType": "full-time",
"postedAt": "2026-08-24T13:17:35.000Z",
"url": "https://talent.faktion.com/o/senior-ai-engineer-in-computer-vision",
"applyUrl": "https://talent.faktion.com/o/senior-ai-engineer-in-computer-vision/c/new",
"salary": {
"min": null,
"max": null,
"currency": null,
"interval": null
}
}
]
}
}
Response fields
Paths are relative to data. Premium fields are absent rather than zeroed on plans that do not include them, so check for presence instead of comparing to 0.
| Field | Type | Example | Description |
|---|---|---|---|
page | number | 1 | Page of results returned |
count | number | 2 | Number of jobs on this page |
hasMore | boolean | true | true when another page may hold more matching jobs |
jobs | array[2] | Matching jobs on this page, newest first | |
id | string | "b4f50cb0115efeef41cb" | Job id; pass it as id for the job's full description |
title | string | "Senior Network and Cloud Engineer" | Job title |
company | string | "Acturis" | Company hiring for the job |
location | string | "London, England, United Kingdom" | Primary location of the job |
locations | array | [London, England, United Kingdom] | Locations the job is offered in, primary first (up to 5) |
country | string | "GB" | ISO 3166-1 alpha-2 country of the primary location; null when the location names none, such as Remote |
remote | boolean | false | true when the job is open to remote work |
workplaceType | string | "hybrid" | remote, hybrid or onsite; null when the company does not say |
employmentType | string | "full-time" | full-time, part-time, contract, internship, temporary or volunteer; null when the company does not say |
postedAt | string | "2026-10-14T15:37:26.000Z" | When the job was first published (ISO 8601) |
url | string | "https://careers.acturis.com/o/senior-network-and-cloud-engineer" | URL of the job's posting page |
applyUrl | string | "https://careers.acturis.com/o/senior-network-and-cloud-engineer/c/new" | URL to apply for the job |
salary | object | {...} | Salary range as the company publishes it; every value is null when it publishes none |
minPremium | object | null | Lower end of the salary range |
maxPremium | object | null | Upper end of the salary range |
currencyPremium | object | null | ISO 4217 currency of the salary range |
intervalPremium | object | null | Period the salary is paid per: year, month, week, day or hour |
Response headers
Every response carries your balance, so your own code always knows where it stands without polling anything. All four are exposed to browsers through CORS.
| Header | What it carries |
|---|---|
x-api-remaining-credits | Credits left in the current cycle |
x-api-credits-used | Credits spent in the current cycle |
x-api-max-credits | The allowance for the cycle |
x-api-version | Version of the endpoint that answered |
Errors
Read the HTTP status first, then error for the specific reason. The body names the parameter that has to change.
| Status | Meaning | What to do |
|---|---|---|
400 | Input was rejected | Read error; it names the parameter that has to change. |
401 | Key missing or invalid | Check the header name and the key value. |
403 | Key valid, but not permitted here | A key restriction or an IP allow-list — never a bad key. |
429 | Rate limited, or out of credits | Read error to tell them apart, then back off or top up. |
What a call costs — 20 credits per call
Credits are shared across every APIVerve API — one balance, one key, one bill. Failed requests never count against it, so a rejected input costs nothing.
| Plan | Per month | Credits | Job Search calls | Per 1,000 calls |
|---|---|---|---|---|
| Free | Free | 200 | 10 | Free |
| Starter | $29.99 | 200,000 | 10,000 | $3.00 |
| Pro | $99.99 | 1,000,000 | 50,000 | $2.00 |
| Mega | $299.99 | 4,000,000 | 200,000 | $1.50 |
Calls are what the credits buy at this API's rate — spend them here, on any of the other APIs, or across both. Nothing is reserved per endpoint.
Call it from cURL — GET /v1/jobsearch
No SDK to install — this is a plain HTTPS call to /v1/jobsearch with your key in the x-api-key header. Swap in a real key and it runs as-is.
curl "https://api.apiverve.com/v1/jobsearch" \
-H "x-api-key: YOUR_API_KEY"Resources
Call it from Node.js — GET /v1/jobsearch
No SDK to install — this is a plain HTTPS call to /v1/jobsearch with your key in the x-api-key header. Swap in a real key and it runs as-is.
const res = await fetch("https://api.apiverve.com/v1/jobsearch", {
headers: { "x-api-key": "YOUR_API_KEY" },
});
const { data } = await res.json();
console.log(data);Resources
Call it from Python — GET /v1/jobsearch
No SDK to install — this is a plain HTTPS call to /v1/jobsearch with your key in the x-api-key header. Swap in a real key and it runs as-is.
import requests
res = requests.get(
"https://api.apiverve.com/v1/jobsearch",
headers={"x-api-key": "YOUR_API_KEY"},
)
print(res.json()["data"])Resources
Call it from C# / .NET — GET /v1/jobsearch
No SDK to install — this is a plain HTTPS call to /v1/jobsearch with your key in the x-api-key header. Swap in a real key and it runs as-is.
using var client = new HttpClient();
client.DefaultRequestHeaders.Add("x-api-key", "YOUR_API_KEY");
var json = await client.GetStringAsync("https://api.apiverve.com/v1/jobsearch");
Console.WriteLine(json);Resources
Call it from Go — GET /v1/jobsearch
No SDK to install — this is a plain HTTPS call to /v1/jobsearch with your key in the x-api-key header. Swap in a real key and it runs as-is.
req, _ := http.NewRequest("GET", "https://api.apiverve.com/v1/jobsearch", nil)
req.Header.Set("x-api-key", "YOUR_API_KEY")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))Resources
Call it from PHP — GET /v1/jobsearch
No SDK to install — this is a plain HTTPS call to /v1/jobsearch with your key in the x-api-key header. Swap in a real key and it runs as-is.
$ch = curl_init("https://api.apiverve.com/v1/jobsearch");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ["x-api-key: YOUR_API_KEY"]);
$response = curl_exec($ch);
echo $response;Resources
Call it from Ruby — GET /v1/jobsearch
No SDK to install — this is a plain HTTPS call to /v1/jobsearch with your key in the x-api-key header. Swap in a real key and it runs as-is.
require "net/http"
uri = URI("https://api.apiverve.com/v1/jobsearch")
req = Net::HTTP::Get.new(uri)
req["x-api-key"] = "YOUR_API_KEY"
res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |h| h.request(req) }
puts res.bodyResources
Zero-code embed — one snippet, no backend
Drop an interactive Job Search form onto any page. The widget calls the API for you, so no key ever appears in your markup and there is nothing to deploy.
Changelog — Job Search API
Every change to this endpoint, newest first. Breaking changes ship as a new version and the previous one keeps serving — response fields are added, never removed or retyped in place, so an integration written against v1 keeps working.
Entries are picked up from dated catalog snapshots, so the first one appears after the next snapshot that moves something. A period where nothing changed produces no entry — silence is a valid changelog for the Job Search API.
data
- Job Postings
- Job Search