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

GET/api/v1/jobs

Search live jobs. Returns a page of listings without their descriptions — fetch a single job for the full text.

ParameterTypeNotes
qstringFree text over title, employer and category.
citystringCity slug, e.g. london, manchester, lagos.
countryGB | NGWhich market to return.
categorystringSpecialism name, e.g. Registered nurse.
remoteremote | hybrid | onsiteHow the role is worked.
employment_typestringfull_time, part_time, contract, temporary.
salary_minintegerMatches jobs whose upper salary reaches this figure, so a £45–60k role is returned for 50000.
posted_sincedateISO date. Only jobs advertised on or after it.
pageintegerDefaults to 1.
per_pageintegerDefaults 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", ... }
}
GET/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

  1. Credit us and link back. Wherever a listing appears, show “via BOQQS” linked to that job’s url field. This is the whole price of the API.
  2. 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.
  3. Keep it current. Respect expiresAt and stop showing a job once it passes. Advertisers rely on their vacancy coming down when they close it.
  4. Do not contact advertisers using details from the API for anything other than a genuine application to that vacancy.
  5. Be reasonable. Stay within the rate limit, cache responses, and identify your client with a descriptive User-Agent so 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.