Skip to main content

Documentation Index

Fetch the complete documentation index at: https://jobo.world/docs/llms.txt

Use this file to discover all available pages before exploring further.

Two endpoints — quick keyword search vs. typed search with facets.
  • Quick searchGET /api/jobs. Simple query-string search with comma-separated filters. Best for lightweight integrations and URL-shareable queries.
  • Advanced searchPOST /api/jobs/search. Typed JSON body with inclusion/exclusion filters, range filters, and multi-value text queries. Best for filter UIs and programmatic search.
Both endpoints return JobDto objects — see the Feed page for the full field reference.

Endpoints

Full request/response reference and a live “Try it” playground live on the dedicated pages below.

Quick search

GET /api/jobs — simple query-string search. Best for lightweight integrations and URL-shareable queries.

Advanced search

POST /api/jobs/search — typed JSON body with inclusion/exclusion filters, range filters, and multi-value text queries. Best for filter UIs and programmatic search.

Filter recipes

Basic text search with location

Search for jobs by keyword in one or more cities:
{
  "queries": ["data engineer"],
  "locations": ["Seattle", "Austin"],
  "page_size": 10
}

Skill include/exclude filtering

Find jobs requiring Python or Go but not PHP:
{
  "queries": ["backend developer"],
  "skills": {
    "include": ["python", "go"],
    "exclude": ["php"]
  }
}

Company filtering

Search only at specific companies, or exclude staffing agencies:
{
  "queries": ["product manager"],
  "companies": {
    "include": ["Google", "Meta", "Apple", "Amazon"]
  }
}
{
  "queries": ["software engineer"],
  "companies": {
    "exclude": ["Acme Staffing", "Generic Recruiting Co"]
  }
}

Salary range + experience level

Find senior or principal roles paying 150k150k–250k:
{
  "experience_levels": ["senior"],
  "salary_usd": { "min": 150000, "max": 250000 },
  "employment_types": ["full-time"]
}
For open-ended ranges, omit one bound:
{
  "salary_usd": { "min": 200000 }
}

Remote jobs posted recently

{
  "queries": ["machine learning engineer"],
  "work_models": ["remote"],
  "posted_after": "2026-02-01T00:00:00Z"
}

Full combination query

Combine every filter type for a highly targeted search:
{
  "queries": ["backend engineer", "platform engineer"],
  "locations": ["San Francisco", "New York", "Seattle"],
  "skills": {
    "include": ["go", "rust", "kubernetes"],
    "exclude": ["php", "wordpress"]
  },
  "companies": {
    "exclude": ["Acme Staffing"]
  },
  "work_models": ["remote", "hybrid"],
  "employment_types": ["full-time"],
  "experience_levels": ["senior", "lead"],
  "salary_usd": { "min": 150000, "max": 300000 },
  "posted_after": "2026-01-15T00:00:00Z",
  "page": 1,
  "page_size": 50
}

Facets

The response includes a facets object with server-computed aggregations. The set of facets is controlled by the include_facets request parameter; when omitted the server returns a low-cardinality default subset to keep responses fast.

Available facets

Response keySource fieldNotes
work_modelwork_modelDefault
experience_levelexperience_levelDefault
employment_typeemployment_typeDefault
sourcesprovider_idDefault
industriescompany_industriesOpt-in — moderate cardinality
skillsall_skill_namesOpt-in — high cardinality, adds noticeable latency

Controlling the facet set

include_facetsResult
omitted / nullDefault subset (work_model, experience_level, employment_type, sources).
["skills"]Only skills is computed and returned.
[] (empty array)No facets — "facets": {}.
["skills","unknown"]skills is returned; unknown names are silently dropped.
On GET /api/jobs pass a comma-separated string (?include_facets=skills,industries); on POST /api/jobs/search pass a JSON array ("include_facets": ["skills", "industries"]). To skip facets from the GET endpoint, send the empty value ?include_facets=.

Example — default response

{
  "facets": {
    "experience_level": [
      { "key": "senior", "count": 4521 },
      { "key": "mid", "count": 3892 },
      { "key": "lead", "count": 1204 },
      { "key": "entry", "count": 987 },
      { "key": "executive", "count": 412 },
      { "key": "intern", "count": 43 }
    ],
    "work_model": [
      { "key": "remote", "count": 5230 },
      { "key": "hybrid", "count": 2847 },
      { "key": "onsite", "count": 1540 }
    ]
  }
}

Example — opting in to skills + industries

{
  "queries": ["backend engineer"],
  "include_facets": [
    "work_model",
    "experience_level",
    "employment_type",
    "sources",
    "industries",
    "skills"
  ]
}
Facet values for enum fields reflect the lowercased canonical values stored in the index, sorted by count descending. skills is faceted on its display-cased values. Counts are bounded by Typesense’s top_values strategy, so long-tail buckets may be approximate — exact totals come from the total field, not from summing facet counts. Use facet values to power filter UIs. Since all filter fields are case-insensitive, you can pass facet key values directly back as filter values.

Enum reference

Send the canonical value listed below. Filter inputs are matched case-insensitively and common variants (e.g. srsenior, WFHremote) are normalized server-side, so most reasonable strings will resolve to the right bucket.

work_models

ValueMeaning
remoteFully remote; no expectation of being in an office.
hybridMix of remote and in-office work.
onsiteOn-site / in-person at a specific location.

employment_types

ValueMeaning
full-timeStandard full-time permanent role.
part-timePart-time role with reduced hours.
contractFixed-term or contractor engagement (incl. contract-to-hire).
internshipInternship, co-op, or apprenticeship.
freelanceFreelance / self-employed / gig work.
temporaryShort-term or seasonal role.

experience_levels

ValueMeaning
internInterns, trainees, apprentices.
entryEntry-level / junior / new graduate.
midMid-level / intermediate individual contributor.
seniorSenior individual contributor (incl. staff, principal).
leadTech lead or first-line manager.
executiveDirector, VP, C-level, head-of.

Source values

All 57 ATS / job-board providers Jobo currently ingests. Use the provider_id in the sources filter (e.g. "sources": ["greenhouse", "lever"]); the same value comes back on the source field of every JobDto and in the facets.sources bucket.
provider_idProvider
adpmyjobsADP MyJobs
adpworkforcenowADP Workforce Now
applicantproApplicantPro
ashbyAshby
bamboohrBambooHR
breezyBreezy HR
careerplugCareerPlug
careerpuckCareerpuck
comeetComeet
csodCornerstone OnDemand
dayforceDayforce
doverDover
eightfoldEightfold
freshteamFreshteam
gemGem
gohireGoHire
greenhouseGreenhouse
hibobHiBob
hirebridgeHireBridge
hirehiveHireHive
hireologyHireology
hiringthingHiringThing
homerunHomerun
icimsiCIMS
isolvediSolved
jazzhrJazzHR
jobscoreJobScore
jobviteJobvite
joincomJoin.com
kulaKula
leverLever
manatalManatal
oraclecloudOracle Cloud
pageupPageUp
paycomPaycom
paycorPaycor
paylocityPaylocity
personioPersonio
phenompeoplePhenom
pinpointPinpoint
polymerPolymer
recootyRecooty
recruiteeRecruitee
ripplingRippling
rivalRival
smartrecruitersSmartRecruiters
successfactorsSAP SuccessFactors
taleoOracle Taleo
talnetTalNet (Oleeo)
teamtailorTeamtailor
trakstarTrakstar Hire
trinetTriNet
ultiproUltiPro (UKG Pro)
werecruitWeRecruit
workableWorkable
workdayWorkday
zohorecruitZoho Recruit