Jobs API
A free JSON API for live UK and Nigeria vacancies. No key, no signup, no charge — call it and you get JSON back. The only condition is that you credit BOQQS and link to the listing.
curl "https://boqqs.com/api/v1/jobs?q=quantity+surveyor&city=london"What you get, and what you do not
The API returns only vacancies advertised directly with us — posted by the employer or their recruiter through this site.
BOQQS also carries listings syndicated from partner job boards. Those appear on the website, clearly marked with their source, but they are not ours to relicense and the API never returns them. It means the API is smaller than the site — and it means everything in it is genuinely ours to give you.
Endpoints
Base URL https://boqqs.com/api/v1 · version 1.0.0 · OpenAPI spec
/api/v1/jobsSearch live jobs. Returns a page of listings without their descriptions — fetch a single job for the full text.
| Parameter | Type | Notes |
|---|---|---|
q | string | Free text over title, employer and category. |
city | string | City slug, e.g. london, manchester, lagos. |
country | GB | NG | Which market to return. |
category | string | Specialism name, e.g. Registered nurse. |
remote | remote | hybrid | onsite | How the role is worked. |
employment_type | string | full_time, part_time, contract, temporary. |
salary_min | integer | Matches jobs whose upper salary reaches this figure, so a £45–60k role is returned for 50000. |
posted_since | date | ISO date. Only jobs advertised on or after it. |
page | integer | Defaults to 1. |
per_page | integer | Defaults to 20, maximum 100. |
{
"jobs": [
{
"id": "BQ-2026-1004",
"title": "Site Manager",
"employer": "Fitzgerald Construction",
"location": { "city": "Leeds", "region": "Yorkshire", "country": "GB" },
"remote": "onsite",
"salary": { "min": 55000, "max": 65000, "currency": "GBP", "period": "year" },
"employmentType": "full_time",
"postedAt": "2026-08-24T09:00:00.000Z",
"expiresAt": "2026-09-21T09:00:00.000Z",
"url": "https://boqqs.com/jobs/site-manager-fitzgerald-construction-leeds-146964040",
"applyUrl": "https://fitzgeraldconstruction.co.uk/careers/site-manager"
}
],
"pagination": { "page": 1, "perPage": 20, "total": 1, "totalPages": 1 },
"attribution": { "source": "BOQQS", "url": "https://boqqs.com", ... }
}/api/v1/jobs/{id}One listing, including its full description as sanitised HTML. The id is the job's BOQQS reference — assigned once and stable for the life of the advert, so it survives the employer editing their title.
curl "https://boqqs.com/api/v1/jobs/BQ-2026-1004"Examples
JavaScript
const res = await fetch("https://boqqs.com/api/v1/jobs?country=GB&per_page=50");
const { jobs, pagination } = await res.json();
for (const job of jobs) {
console.log(job.title, "—", job.employer, "—", job.url);
}Python
import requests
r = requests.get("https://boqqs.com/api/v1/jobs", params={"q": "nurse", "city": "manchester"})
r.raise_for_status()
for job in r.json()["jobs"]:
print(job["title"], job["salary"]["display"], job["url"])PHP
$json = file_get_contents("https://boqqs.com/api/v1/jobs?country=GB");
$data = json_decode($json, true);
foreach ($data["jobs"] as $job) {
echo $job["title"] . " — " . $job["url"] . PHP_EOL;
}Rate limits and caching
60 requests a minute per address. Responses are cached for five minutes at our CDN, so polling faster than that returns the same body and does not get you fresher data. Listings change a few times a day; once every fifteen minutes is plenty.
Exceed the limit and you get 429 with a Retry-After header. Wait that many seconds rather than retrying immediately.
Terms of use
- Credit us and link back. Wherever a listing appears, show “via BOQQS” linked to that job’s
urlfield. This is the whole price of the API. - Do not present listings as your own. You may display, index and search them. You may not claim to be the source, or resell the feed as a data product.
- Keep it current. Respect
expiresAtand stop showing a job once it passes. Advertisers rely on their vacancy coming down when they close it. - Do not contact advertisers using details from the API for anything other than a genuine application to that vacancy.
- Be reasonable. Stay within the rate limit, cache responses, and identify your client with a descriptive
User-Agentso we can reach you if something breaks.
We may withdraw access from a client that ignores these. Nothing here grants rights over listings syndicated from partner boards, which the API does not serve.
Changes
The version sits in the path, so /api/v1 keeps its shape. New fields may be added — read defensively and ignore what you do not recognise. Anything that would break an existing client ships as /api/v2 instead.
Questions
Building something with this, or need a field we do not return? Get in touch — we would rather hear about it than guess.