DEVELOPER API

Build with our job data

JobsWorldwide exposes the same JSON endpoints our own frontend uses. Pull live listings into your own app, bot, or dashboard — free, no API key required.

No auth needed

Public GET endpoints, no API key or signup.

JSON responses

Plain array of job objects, ready to map over.

Cached & rate-friendly

Responses are cached server-side — keep polling reasonable.

Quickstart

Every endpoint returns a JSON array of job objects. No headers or auth required — just make a GET request to any URL below.

bash
curl https://kenyajobs.vercel.app/api/remote-jobs

Authentication

The public tier requires no API key, no signup, and no auth headers — every endpoint listed below is open for read access right now.

If your use case needs higher volume than fair use allows (see below), reach out via the contact section at the bottom of this page — we're open to issuing dedicated keys with higher limits for serious integrations.

Response shape

Every job object follows the same shape regardless of endpoint or source:

json
[
  {
    "id": "remotive-123456",
    "title": "Senior Backend Engineer",
    "company": "Acme Inc.",
    "location": "Remote — Worldwide",
    "type": "Full-time",
    "date": "2026-06-18T09:00:00.000Z",
    "url": "https://remotive.com/remote-jobs/...",
    "description": "We're looking for a backend engineer to join our small, distributed team...",
    "source": "Remotive"
  }
]
FieldTypeDescription
idstringStable unique identifier, namespaced by source.
titlestringJob title as posted.
companystringHiring company or organisation name.
locationstringFree-text location, e.g. "Nairobi, Kenya" or "Remote".
typestringEmployment type, e.g. "Full-time", "Remote", "Internship".
datestringISO 8601 publish date.
urlstringDirect link to the original listing — always send applicants here.
descriptionstringPlain-text job description, HTML stripped.
sourcestringOriginating board, e.g. "Remotive", "BrighterMonday".

Endpoints

Each endpoint below includes sample code in three languages, plus a live tester you can run right from this page.

GET/api/africa-jobs

Jobs aggregated from Kenyan, East African, and pan-African sources — BrighterMonday, MyJobMag, ReliefWeb, and more.

bash
curl "https://kenyajobs.vercel.app/api/africa-jobs"
Try it live
GET/api/remote-jobs

Remote jobs from Remotive, Jobicy, and Arbeitnow.

?category
bash
curl "https://kenyajobs.vercel.app/api/remote-jobs"
Try it live
GET/api/entry-level-jobs

Entry-level roles sourced from The Muse and Remotive.

?page
bash
curl "https://kenyajobs.vercel.app/api/entry-level-jobs"
Try it live
GET/api/graduate-jobs

Graduate-programme and junior listings aggregated across multiple boards.

bash
curl "https://kenyajobs.vercel.app/api/graduate-jobs"
Try it live
GET/api/internship-jobs

Internship listings aggregated across multiple boards.

bash
curl "https://kenyajobs.vercel.app/api/internship-jobs"
Try it live
GET/api/wfh-jobs

Work-from-home listings aggregated across multiple boards.

bash
curl "https://kenyajobs.vercel.app/api/wfh-jobs"
Try it live
GET/api/search-jobs

Free-text search across The Muse, Remotive, and Jobicy.

?query*
bash
curl "https://kenyajobs.vercel.app/api/search-jobs?query=developer"
Try it live

Rate limits & caching

Every endpoint sits behind a server-side stale-while-revalidate cache, plus a CDN-level Cache-Control header. Inside the fresh window you get an instant cached response with zero upstream calls; once stale, you still get an instant response while we refresh in the background — you should never see a slow request because an upstream board is slow.

Endpoint groupFresh windowStale windowNotes
africa-jobs20 min2 hrHeaviest fan-out (RSS + proxy calls), longest fresh window to protect rate limits.
remote-jobs / entry-level-jobs / graduate-jobs / wfh-jobs / internship-jobs10 min1 hrStandard aggregator cache.
search-jobs5 minShorter window since results depend on the query string.

Practical guidance: cache responses on your own side for at least 5–10 minutes. Polling more frequently than that just re-hits our cache and wastes your own requests.

Errors

Errors are returned as standard HTTP status codes. There's no custom error envelope — check the status code first.

StatusMeaningWhat to do
200OKRequest succeeded, JSON array returned (may be empty).
400Bad RequestA required parameter is missing, e.g. ?query= on /api/search-jobs.
429Too Many RequestsYou're polling faster than fair use allows. Back off and retry with backoff.
500Upstream ErrorAll upstream sources failed for this request. We still try to serve last-known-good cached data before returning this.

Drop-in client snippet

No official SDK package yet — but the whole API surface is small enough to wrap in one file. Copy this into your project:

javascript
// lib/jobsworldwide.js — tiny zero-dependency client
const BASE = "https://kenyajobs.vercel.app/api";

async function get(path) {
  const res = await fetch(`${BASE}${path}`);
  if (!res.ok) throw new Error(`JobsWorldwide API error: ${res.status}`);
  return res.json();
}

export const JobsWorldwide = {
  africaJobs:    ()        => get("/africa-jobs"),
  remoteJobs:    (category) => get(`/remote-jobs${category ? `?category=${category}` : ""}`),
  entryLevel:    (page)     => get(`/entry-level-jobs${page ? `?page=${page}` : ""}`),
  graduateJobs:  ()        => get("/graduate-jobs"),
  internships:   ()        => get("/internship-jobs"),
  wfhJobs:       ()        => get("/wfh-jobs"),
  search:        (query)    => get(`/search-jobs?query=${encodeURIComponent(query)}`),
};

// Usage:
// const jobs = await JobsWorldwide.search("react developer");

Changelog

2026-06-20Added live in-browser request tester and multi-language code samples to these docs.
2026-06-19Public API docs published. All aggregator endpoints opened for external read access.
2026-06-12Fixed truncated job descriptions on WordPress-based feeds by preferring content:encoded over description in RSS parsing.

Fair use

These endpoints power our own production site, so please cache results on your end and avoid polling more than once every few minutes. We reserve the right to rate-limit or block abusive traffic. For high-volume or commercial use, reach out — we're happy to talk.

Questions or feedback?

Building something interesting with the API? We'd love to hear about it.

Contact Us