HireBridge Jobs API.
Pull full descriptions, departments, and geocoded locations from any HireBridge career center through a single JSON listings endpoint and Jobo's unified jobs API.
Try the API.
Test Jobs and Feed endpoints against https://connect.jobo.world with live request/response examples, then copy ready-to-use curl commands.
What's in every response.
Data fields, real-world applications, and the companies already running on HireBridge.
- Full Job Descriptions
- Structured Locations (City, State & Geo)
- Department, Division & Business Unit
- Employment & Pay Type
- Remote Work Classification
- Posted & Created Dates
- 01Job board aggregation
- 02Mid-market hiring signals
- 03Location-based job search
- 04Careers page monitoring
How to scrape HireBridge.
Step-by-step guide to extracting jobs from HireBridge-powered career pages—endpoints, authentication, and working code.
from urllib.parse import urlparse, parse_qs
# Public career center: https://recruit.hirebridge.com/v3/careercenter/v2/?cid=8116
url = "https://recruit.hirebridge.com/v3/careercenter/v2/?cid=8116"
cid = parse_qs(urlparse(url).query)["cid"][0]
print(cid) # "8116"import json
import requests
def fetch_page(cid: str, start_row: int, end_row: int) -> list[dict]:
url = "https://hbapi.hirebridge.com/careercenter/v2/GetJobListings"
params = {
"cid": cid,
"language": "en",
"startrow": start_row,
"endrow": end_row,
}
resp = requests.get(
url,
params=params,
headers={"Accept": "application/json"},
timeout=15,
)
resp.raise_for_status()
# WebMethod wraps the array in a JSON string: "\"[{...}]\"".
payload = json.loads(resp.text)
if isinstance(payload, str):
payload = json.loads(payload)
return payload or []
jobs = fetch_page("8116", 1, 100)
print(f"Fetched {len(jobs)} jobs")def fetch_all(cid: str, batch_size: int = 100) -> list[dict]:
all_jobs: list[dict] = []
start = 1
while True:
page = fetch_page(cid, start, start + batch_size - 1)
all_jobs.extend(page)
if len(page) < batch_size:
break
start += len(page)
return all_jobs
print(len(fetch_all("8116")))def map_job(job: dict, cid: str) -> dict:
jid = (job.get("joblistid") or "").strip()
loc = job.get("location") or {}
return {
"external_id": jid,
"title": (job.get("jobtitle") or "").strip(),
"description": job.get("description") or "",
"company": job.get("companyname"),
"department": job.get("jobdeptname"),
"division": job.get("jobdivisionname"),
"employment_type": job.get("jobtypename"),
"pay_type": job.get("payselname"),
"city": loc.get("city"),
"state": loc.get("statename") or loc.get("state"),
"country": loc.get("countryname") or loc.get("country"),
"is_remote": loc.get("isremote"),
"posted_at": job.get("publicdate") or job.get("createdate"), # M/d/yyyy
"listing_url": f"https://recruit.hirebridge.com/v3/careercenter/v2/details.aspx?jid={jid}&cid={cid}",
"apply_url": f"https://recruit.hirebridge.com/v3/application/AppLink.aspx?cid={cid}&jid={jid}",
}
records = [map_job(j, "8116") for j in jobs]The GetJobListings WebMethod does content negotiation on the Accept header. Send Accept: application/json explicitly on every request; a browser-default */* yields XML.
The payload is often "[{...}]" — a JSON string containing the array. Parse once, and if the result is a str, parse it again before iterating.
The API keys everything off a numeric cid. Confirm you pulled the cid query param from the career-center URL; a non-numeric or absent cid returns nothing.
Serialize requests per company and space them ~200ms apart. Treat 403 and 429 as rate limiting and back off before retrying.
publicdate and createdate use US M/d/yyyy with no timezone. Parse with an explicit format and assume UTC so 5/12/2026 is not read as 12 May.
- 1Always send Accept: application/json to avoid the XML string envelope
- 2Unwrap the double-encoded JSON string before parsing the array
- 3Paginate with startrow/endrow and stop when a page is shorter than the batch size
- 4Keep concurrency at one per company and space requests ~200ms apart to avoid 403/429
- 5Parse publicdate/createdate as US M/d/yyyy and normalize to UTC
- 6Cache results between runs to avoid re-fetching unchanged listings
One endpoint. All HireBridge jobs. No scraping, no sessions, no maintenance.
Get API accesscurl "https://connect.jobo.world/api/jobs?sources=hirebridge" \
-H "X-Api-Key: YOUR_KEY" Access HireBridge
job data today.
One API call. Structured data. No scraping infrastructure to build or maintain — start with the free tier and scale as you grow.