Skip to main content
POST
cURL

Authorizations

X-Api-Key
string
header
required

Your Jobo API key. Create one in the dashboard under Developers → API Keys. Live keys start with jbe_live_ and sandbox keys with jbe_test_.

Body

application/json

Cursor-paginated request for the managed feed: jobs from the companies you chose under Managed Services → Job Scraping, oldest first as with stable_scan: true. There is no sources, stable_scan, exclude_ list, or occupation and company filter (companies, job_categories, industries, company_sizes, …). For those, stream a saved feed built from your managed feed.

locations
object[] | null

Structured location filters. A job matches if it matches ANY entry. Each entry routes to its most-specific populated level (city, then region, then country) and every level needs country. Use {"country": "Remote"} to match remote jobs.

work_models
enum<string>[] | null

Filter by work model: remote, hybrid, onsite. null = all jobs

Available options:
remote,
hybrid,
onsite
employment_types
enum<string>[] | null

Filter by employment type. null = all jobs

Available options:
full-time,
part-time,
contract,
internship,
freelance,
temporary
experience_levels
enum<string>[] | null

Filter by experience level. null = all jobs

Available options:
intern,
entry,
mid,
senior,
lead,
executive
languages
string[] | null

Filter by description language, as ISO 639-1 codes (en, de, fr). Language names and locales (English, en-US) are mapped to their code. null = all jobs.

posted_after
string<date-time> | null

Return jobs whose employer posting time or first-indexed time is on or after this UTC timestamp. Use updated_after when edits matter.

include_reactivated
boolean
default:false

Also return jobs that expired and were reactivated (rediscovered and re-indexed) on or after posted_after. A reactivated job keeps its original posting and creation dates, so posted_after alone never re-delivers it.

No effect without posted_after. An updated_after sync doesn't need it: updated_after already returns reactivated jobs. With both timestamps set, a job must match both.

description_format
enum<string>
default:markdown

Format of each job's description. markdown (default) returns it as stored. html renders it to HTML on the fly: raw HTML in the source is escaped and only http(s), mailto and relative URLs are kept. Read from every request, including cursor continuations.

Available options:
markdown,
html
updated_after
string<date-time> | null

Return jobs created, updated or re-indexed on or after this UTC timestamp, including jobs reactivated in that window, plus every job of a company added to your managed job sources since then. The watermark for incremental syncs.

cursor
string | null

Opaque cursor from next_cursor. Omit on the first request. It keeps the first request's filters and batch_size: filters sent with it are ignored, and batch_size can be lowered but never raised.

batch_size
integer
default:1000
Required range: 1 <= x <= 1000

Response

Batch of jobs from managed job sources with cursor for next page

jobs
object[]
required
next_cursor
string | null
required
has_more
boolean
required
estimated_total
integer<int64> | null

Estimated number of jobs the scan will deliver. Present on the first page of a scan only; null on continuation pages. Exact when 1,000 or fewer jobs match; above that an estimate that can run a few percent high.

warnings
object[] | null

POST /api/jobs/feed only: non-fatal problems with the first page's request, e.g. a companies entry that matched no company (companies_unmatched, companies_exclude_unmatched, companies_outside_sources). Present on the first page only, and only when there is something to report. The same codes are on the X-Jobo-Warnings response header, comma-separated.