Skip to main content
POST
https://connect.jobo.world
/
api
/
jobs
/
search
curl -X POST https://connect.jobo.world/api/jobs/search \
  -H "Content-Type: application/json" \
  -H "X-Api-Key: YOUR_API_KEY" \
  -d '{
    "queries": ["software engineer"],
    "locations": ["San Francisco", "New York"],
    "skills": {
      "include": ["python", "kubernetes"],
      "exclude": ["php"]
    },
    "companies": {
      "exclude": ["Acme Staffing"]
    },
    "work_models": ["remote", "hybrid"],
    "employment_types": ["full-time"],
    "experience_levels": ["senior level", "lead/staff"],
    "salary_usd": { "min": 150000, "max": 250000 },
    "posted_after": "2026-01-01T00:00:00Z",
    "page": 1,
    "page_size": 25
  }'
{
  "jobs": [
    {
      "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
      "title": "Senior Software Engineer",
      "company": {
        "name": "Acme Corp"
      },
      "work_model": "Remote",
      "experience_level": "Senior Level",
      "employment_type": "Full-time",
      "source": "greenhouse"
    }
  ],
  "total": 12847,
  "page": 1,
  "page_size": 25,
  "total_pages": 514,
  "facets": {
    "experience_level": [
      { "key": "Senior Level", "count": 4521 },
      { "key": "Mid Level", "count": 3892 },
      { "key": "Lead/Staff", "count": 1204 },
      { "key": "Entry Level", "count": 987 }
    ],
    "work_model": [
      { "key": "Remote", "count": 5230 },
      { "key": "Hybrid", "count": 2847 },
      { "key": "Onsite", "count": 1540 }
    ]
  }
}

Request Body

queries
string[]
Free-text search terms. Multiple terms use OR logic — a job matches if it is relevant to any of the provided queries.
"queries": ["software engineer", "backend developer"]
locations
string[]
Location strings, geocoded server-side. Multiple locations use OR logic. You can use city names, metro areas, states, or countries.
"locations": ["San Francisco, CA", "New York", "Remote"]
skills
object
Filter by skills using an InclusionExclusionFilter. Both sub-fields are optional. Skills are matched case-insensitively.
"skills": {
  "include": ["python", "kubernetes", "aws"],
  "exclude": ["php", "wordpress"]
}
companies
object
Filter by company name using an InclusionExclusionFilter. Both sub-fields are optional. Company names are matched case-insensitively.
"companies": {
  "include": ["Google", "Meta", "Apple"],
  "exclude": ["Acme Staffing"]
}
work_models
string[]
Filter by work model. Values are case-insensitive.Accepted values: remote, hybrid, onsite
"work_models": ["remote", "hybrid"]
employment_types
string[]
Filter by employment type. Values are case-insensitive.Accepted values: full-time, part-time, contract, internship, temporary
"employment_types": ["full-time", "contract"]
experience_levels
string[]
Filter by experience level. Values are case-insensitive.Accepted values: entry level, mid level, senior level, lead/staff, principal, director, vp, executive
"experience_levels": ["senior level", "lead/staff"]
salary_usd
object
Filter by annualized USD salary using a RangeFilter. Both min and max are optional — you can set just one for an open-ended range.
"salary_usd": { "min": 100000, "max": 200000 }
posted_after
string (ISO 8601)
Only return jobs posted on or after this date. Use ISO 8601 format.
"posted_after": "2026-02-01T00:00:00Z"
page
integer
default:"1"
Page number. Minimum 1.
page_size
integer
default:"25"
Results per page. Minimum 1, maximum 100.

Response Body

jobs
Job[]
Array of matching job objects.
total
integer
Total number of jobs matching the query and filters.
page
integer
Current page number.
page_size
integer
Number of results per page.
total_pages
integer
Total number of pages.
facets
object
Server-computed facet aggregations. Always returned — the client does not request specific facets. Each key maps to an array of { key, count } pairs sorted by count descending.Included facets: experience_level, work_model, and more as determined by the server.

Response Headers

HeaderDescription
X-Total-CountTotal number of matching jobs
X-Total-PagesTotal number of pages
X-PageCurrent page number
X-Page-SizeNumber of results returned per page

Examples

curl -X POST https://connect.jobo.world/api/jobs/search \
  -H "Content-Type: application/json" \
  -H "X-Api-Key: YOUR_API_KEY" \
  -d '{
    "queries": ["software engineer"],
    "locations": ["San Francisco", "New York"],
    "skills": {
      "include": ["python", "kubernetes"],
      "exclude": ["php"]
    },
    "companies": {
      "exclude": ["Acme Staffing"]
    },
    "work_models": ["remote", "hybrid"],
    "employment_types": ["full-time"],
    "experience_levels": ["senior level", "lead/staff"],
    "salary_usd": { "min": 150000, "max": 250000 },
    "posted_after": "2026-01-01T00:00:00Z",
    "page": 1,
    "page_size": 25
  }'
{
  "jobs": [
    {
      "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
      "title": "Senior Software Engineer",
      "company": {
        "name": "Acme Corp"
      },
      "work_model": "Remote",
      "experience_level": "Senior Level",
      "employment_type": "Full-time",
      "source": "greenhouse"
    }
  ],
  "total": 12847,
  "page": 1,
  "page_size": 25,
  "total_pages": 514,
  "facets": {
    "experience_level": [
      { "key": "Senior Level", "count": 4521 },
      { "key": "Mid Level", "count": 3892 },
      { "key": "Lead/Staff", "count": 1204 },
      { "key": "Entry Level", "count": 987 }
    ],
    "work_model": [
      { "key": "Remote", "count": 5230 },
      { "key": "Hybrid", "count": 2847 },
      { "key": "Onsite", "count": 1540 }
    ]
  }
}

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 level", "principal"],
  "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 level", "lead/staff", "principal"],
  "salary_usd": { "min": 150000, "max": 300000 },
  "posted_after": "2026-01-15T00:00:00Z",
  "page": 1,
  "page_size": 50
}

Facets

The response always includes a facets object with server-computed aggregations. The server determines which facets to return — there is no client-side facet request. Facet values reflect the canonical stored values (title-cased) and are sorted by count descending:
{
  "facets": {
    "experience_level": [
      { "key": "Senior Level", "count": 4521 },
      { "key": "Mid Level", "count": 3892 },
      { "key": "Lead/Staff", "count": 1204 },
      { "key": "Entry Level", "count": 987 },
      { "key": "Principal", "count": 412 },
      { "key": "Director", "count": 287 },
      { "key": "VP", "count": 95 },
      { "key": "Executive", "count": 43 }
    ],
    "work_model": [
      { "key": "Remote", "count": 5230 },
      { "key": "Hybrid", "count": 2847 },
      { "key": "Onsite", "count": 1540 }
    ]
  }
}
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

All string filter values are matched case-insensitively. The table below shows the accepted input values and their canonical stored forms.

work_models

Input valueStored as
remoteRemote
hybridHybrid
onsiteOnsite

employment_types

Input valueStored as
full-timeFull-time
part-timePart-time
contractContract
internshipInternship
temporaryTemporary

experience_levels

Input valueStored as
entry levelEntry Level
mid levelMid Level
senior levelSenior Level
lead/staffLead/Staff
principalPrincipal
directorDirector
vpVP
executiveExecutive

Common source values

greenhouse, lever, workday, ashby, bamboohr, icims, smartrecruiters, teamtailor, workable, rippling, personio, taleo