# First request carries the filters and batch size.
curl -X POST "https://connect.jobo.world/api/jobs/feed" \
-H "X-Api-Key: $JOBO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"sources": ["greenhouse"], "batch_size": 1000}'
# Continuation requests carry ONLY the cursor.
curl -X POST "https://connect.jobo.world/api/jobs/feed" \
-H "X-Api-Key: $JOBO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"cursor": "eyJ2IjoxLCJ..."}'import os
from jobo_enterprise import JoboClient
with JoboClient(api_key=os.environ["JOBO_API_KEY"]) as client:
# iter_jobs walks the cursor for you.
for job in client.feed.iter_jobs(sources=["greenhouse"], batch_size=1000):
save_to_database(job)
const options = {
method: 'POST',
headers: {'X-Api-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
locations: [{country: 'United States'}],
job_subcategories: {include: ['Nursing']},
company_sizes: {include: ['201-500', '501-1000', '1001-5000', '5001-10000', '10001+']},
company_is_agency: false,
updated_after: '2026-11-01T00:00:00Z',
batch_size: 1000
})
};
fetch('https://connect.jobo.world/api/jobs/feed', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://connect.jobo.world/api/jobs/feed",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'locations' => [
[
'country' => 'United States'
]
],
'job_subcategories' => [
'include' => [
'Nursing'
]
],
'company_sizes' => [
'include' => [
'201-500',
'501-1000',
'1001-5000',
'5001-10000',
'10001+'
]
],
'company_is_agency' => false,
'updated_after' => '2026-11-01T00:00:00Z',
'batch_size' => 1000
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-Api-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://connect.jobo.world/api/jobs/feed"
payload := strings.NewReader("{\n \"locations\": [\n {\n \"country\": \"United States\"\n }\n ],\n \"job_subcategories\": {\n \"include\": [\n \"Nursing\"\n ]\n },\n \"company_sizes\": {\n \"include\": [\n \"201-500\",\n \"501-1000\",\n \"1001-5000\",\n \"5001-10000\",\n \"10001+\"\n ]\n },\n \"company_is_agency\": false,\n \"updated_after\": \"2026-11-01T00:00:00Z\",\n \"batch_size\": 1000\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-Api-Key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://connect.jobo.world/api/jobs/feed")
.header("X-Api-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"locations\": [\n {\n \"country\": \"United States\"\n }\n ],\n \"job_subcategories\": {\n \"include\": [\n \"Nursing\"\n ]\n },\n \"company_sizes\": {\n \"include\": [\n \"201-500\",\n \"501-1000\",\n \"1001-5000\",\n \"5001-10000\",\n \"10001+\"\n ]\n },\n \"company_is_agency\": false,\n \"updated_after\": \"2026-11-01T00:00:00Z\",\n \"batch_size\": 1000\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://connect.jobo.world/api/jobs/feed")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-Api-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"locations\": [\n {\n \"country\": \"United States\"\n }\n ],\n \"job_subcategories\": {\n \"include\": [\n \"Nursing\"\n ]\n },\n \"company_sizes\": {\n \"include\": [\n \"201-500\",\n \"501-1000\",\n \"1001-5000\",\n \"5001-10000\",\n \"10001+\"\n ]\n },\n \"company_is_agency\": false,\n \"updated_after\": \"2026-11-01T00:00:00Z\",\n \"batch_size\": 1000\n}"
response = http.request(request)
puts response.read_body{
"jobs": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"title": "<string>",
"normalized_title": "<string>",
"occupation": {
"id": "esco:8d3e8aaa-791b-4c75-a465-f3f827028f50",
"name": "Registered Nurse",
"category": "Healthcare",
"subcategory": "Nursing",
"isco_code": "2221",
"onet_soc_codes": [
"29-1141.00"
]
},
"company": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"website": "<string>",
"logo_url": "<string>",
"summary": "<string>",
"industries": [
"<string>"
],
"categories": [
"<string>"
],
"linkedin_url": "<string>",
"crunchbase_url": "<string>",
"details_url": "<string>"
},
"description": "<string>",
"language": "en",
"summary": "<string>",
"listing_url": "<string>",
"apply_url": "<string>",
"locations": [
{
"location": "<string>",
"city": "<string>",
"region": "<string>",
"country": "<string>",
"latitude": 123,
"longitude": 123
}
],
"compensation": {
"min": 123,
"max": 123,
"currency": "<string>",
"period": "hourly"
},
"employment_type": "Full-time",
"workplace_type": "Remote",
"experience_level": "Intern",
"source": "greenhouse",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"date_posted": "2023-11-07T05:31:56Z",
"valid_through": "2023-11-07T05:31:56Z",
"qualifications": {
"must_have": {
"education": [
"<string>"
],
"certifications": [
"<string>"
],
"skills": [
{
"name": "<string>",
"type": "hard"
}
]
},
"preferred": {
"education": [
"<string>"
],
"certifications": [
"<string>"
],
"skills": [
{
"name": "<string>",
"type": "hard"
}
]
}
},
"responsibilities": [
"<string>"
],
"benefits": [
"<string>"
],
"is_work_auth_required": true,
"is_h1b_sponsor": true,
"is_clearance_required": true,
"external_id": "000123"
}
],
"next_cursor": "<string>",
"has_more": true,
"estimated_total": 123,
"warnings": [
{
"code": "companies_unmatched",
"field": "companies.include",
"message": "<string>"
}
]
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>",
"code": "<string>",
"docs_url": "https://jobo.world/docs/guides/sync-a-database",
"api_version": "2026-08-31"
}{
"error": "Invalid or expired API key",
"api_version": "2026-08-31"
}{
"error": "Insufficient credits",
"detail": "This request needs 75 credits ($0.075). Your wallet balance is 12 credits ($0.012). Top up your wallet to continue.",
"group": "JobSearch",
"credits_required": 123,
"credits_balance": 123,
"cost_per_request_usd": 0.075,
"quota_remaining": 123
}{
"type": "https://tools.ietf.org/html/rfc9110#section-15.5.5",
"title": "Not available in the sandbox",
"status": 404,
"code": "not_available_in_sandbox",
"detail": "Sandbox keys (jbe_test_…) serve job search, job and company lookups, Auto Apply applications, and reading mailboxes. Use a live key for every other endpoint.",
"instance": "/api/jobs/feed/managed"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>",
"code": "<string>",
"docs_url": "https://jobo.world/docs/guides/sync-a-database",
"api_version": "2026-08-31"
}{
"error": "Rate limit exceeded",
"detail": "Per-minute JobSearch request limit of 180 exceeded. Try again shortly.",
"retry_after_seconds": 1,
"code": "rate_limit_exceeded",
"group": "JobSearch",
"api_version": "2026-08-31"
}{
"message": "An error occurred",
"detail": "<string>"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>",
"code": "<string>",
"docs_url": "https://jobo.world/docs/guides/sync-a-database",
"api_version": "2026-08-31"
}Stream the job feed
Stream active jobs in batches of up to 1,000, oldest first by created_at (the default stable_scan: true), so jobs updated or expired mid-scan are never skipped or repeated.
Send filters and batch_size on the first request only. After that, send only the previous next_cursor (and description_format if you use it: every request reads it), one request at a time, until has_more is false. Filters sent with a cursor are ignored, and batch_size can be lowered but not raised. Persist the cursor after each batch so a crash can resume; see Pagination.
Filters combine with AND. The occupation and company filters take {"include": [...], "exclude": [...]}; sources, work_models, employment_types, experience_levels and languages each have an exclude_ list. A job or company with no value never matches an include and is kept by an exclude. Saved feeds maps every Feed Builder condition to these fields. The public Feed Builder page writes this request body for you and shows how many jobs it matches.
After the backfill, sync changes with updated_after and removals with GET /api/jobs/expired; see Sync a database. For a saved feed or your managed job sources, use POST /api/jobs/feed/{feed_id} or POST /api/jobs/feed/managed.
Set a response timeout of at least 120 seconds. Retry only 429, 500 and 503, after Retry-After; on 400 invalid_cursor or 409 feed_cursor_restart_required, discard the cursor and start a new scan with stable_scan: true (Retry strategy).
Billed per delivered job: included jobs first, then the wallet. The Unlimited plan has no per-job charge on Feed, including the managed and saved feeds. See Billing.
# First request carries the filters and batch size.
curl -X POST "https://connect.jobo.world/api/jobs/feed" \
-H "X-Api-Key: $JOBO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"sources": ["greenhouse"], "batch_size": 1000}'
# Continuation requests carry ONLY the cursor.
curl -X POST "https://connect.jobo.world/api/jobs/feed" \
-H "X-Api-Key: $JOBO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"cursor": "eyJ2IjoxLCJ..."}'import os
from jobo_enterprise import JoboClient
with JoboClient(api_key=os.environ["JOBO_API_KEY"]) as client:
# iter_jobs walks the cursor for you.
for job in client.feed.iter_jobs(sources=["greenhouse"], batch_size=1000):
save_to_database(job)
const options = {
method: 'POST',
headers: {'X-Api-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
locations: [{country: 'United States'}],
job_subcategories: {include: ['Nursing']},
company_sizes: {include: ['201-500', '501-1000', '1001-5000', '5001-10000', '10001+']},
company_is_agency: false,
updated_after: '2026-11-01T00:00:00Z',
batch_size: 1000
})
};
fetch('https://connect.jobo.world/api/jobs/feed', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://connect.jobo.world/api/jobs/feed",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'locations' => [
[
'country' => 'United States'
]
],
'job_subcategories' => [
'include' => [
'Nursing'
]
],
'company_sizes' => [
'include' => [
'201-500',
'501-1000',
'1001-5000',
'5001-10000',
'10001+'
]
],
'company_is_agency' => false,
'updated_after' => '2026-11-01T00:00:00Z',
'batch_size' => 1000
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-Api-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://connect.jobo.world/api/jobs/feed"
payload := strings.NewReader("{\n \"locations\": [\n {\n \"country\": \"United States\"\n }\n ],\n \"job_subcategories\": {\n \"include\": [\n \"Nursing\"\n ]\n },\n \"company_sizes\": {\n \"include\": [\n \"201-500\",\n \"501-1000\",\n \"1001-5000\",\n \"5001-10000\",\n \"10001+\"\n ]\n },\n \"company_is_agency\": false,\n \"updated_after\": \"2026-11-01T00:00:00Z\",\n \"batch_size\": 1000\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-Api-Key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://connect.jobo.world/api/jobs/feed")
.header("X-Api-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"locations\": [\n {\n \"country\": \"United States\"\n }\n ],\n \"job_subcategories\": {\n \"include\": [\n \"Nursing\"\n ]\n },\n \"company_sizes\": {\n \"include\": [\n \"201-500\",\n \"501-1000\",\n \"1001-5000\",\n \"5001-10000\",\n \"10001+\"\n ]\n },\n \"company_is_agency\": false,\n \"updated_after\": \"2026-11-01T00:00:00Z\",\n \"batch_size\": 1000\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://connect.jobo.world/api/jobs/feed")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-Api-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"locations\": [\n {\n \"country\": \"United States\"\n }\n ],\n \"job_subcategories\": {\n \"include\": [\n \"Nursing\"\n ]\n },\n \"company_sizes\": {\n \"include\": [\n \"201-500\",\n \"501-1000\",\n \"1001-5000\",\n \"5001-10000\",\n \"10001+\"\n ]\n },\n \"company_is_agency\": false,\n \"updated_after\": \"2026-11-01T00:00:00Z\",\n \"batch_size\": 1000\n}"
response = http.request(request)
puts response.read_body{
"jobs": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"title": "<string>",
"normalized_title": "<string>",
"occupation": {
"id": "esco:8d3e8aaa-791b-4c75-a465-f3f827028f50",
"name": "Registered Nurse",
"category": "Healthcare",
"subcategory": "Nursing",
"isco_code": "2221",
"onet_soc_codes": [
"29-1141.00"
]
},
"company": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"website": "<string>",
"logo_url": "<string>",
"summary": "<string>",
"industries": [
"<string>"
],
"categories": [
"<string>"
],
"linkedin_url": "<string>",
"crunchbase_url": "<string>",
"details_url": "<string>"
},
"description": "<string>",
"language": "en",
"summary": "<string>",
"listing_url": "<string>",
"apply_url": "<string>",
"locations": [
{
"location": "<string>",
"city": "<string>",
"region": "<string>",
"country": "<string>",
"latitude": 123,
"longitude": 123
}
],
"compensation": {
"min": 123,
"max": 123,
"currency": "<string>",
"period": "hourly"
},
"employment_type": "Full-time",
"workplace_type": "Remote",
"experience_level": "Intern",
"source": "greenhouse",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"date_posted": "2023-11-07T05:31:56Z",
"valid_through": "2023-11-07T05:31:56Z",
"qualifications": {
"must_have": {
"education": [
"<string>"
],
"certifications": [
"<string>"
],
"skills": [
{
"name": "<string>",
"type": "hard"
}
]
},
"preferred": {
"education": [
"<string>"
],
"certifications": [
"<string>"
],
"skills": [
{
"name": "<string>",
"type": "hard"
}
]
}
},
"responsibilities": [
"<string>"
],
"benefits": [
"<string>"
],
"is_work_auth_required": true,
"is_h1b_sponsor": true,
"is_clearance_required": true,
"external_id": "000123"
}
],
"next_cursor": "<string>",
"has_more": true,
"estimated_total": 123,
"warnings": [
{
"code": "companies_unmatched",
"field": "companies.include",
"message": "<string>"
}
]
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>",
"code": "<string>",
"docs_url": "https://jobo.world/docs/guides/sync-a-database",
"api_version": "2026-08-31"
}{
"error": "Invalid or expired API key",
"api_version": "2026-08-31"
}{
"error": "Insufficient credits",
"detail": "This request needs 75 credits ($0.075). Your wallet balance is 12 credits ($0.012). Top up your wallet to continue.",
"group": "JobSearch",
"credits_required": 123,
"credits_balance": 123,
"cost_per_request_usd": 0.075,
"quota_remaining": 123
}{
"type": "https://tools.ietf.org/html/rfc9110#section-15.5.5",
"title": "Not available in the sandbox",
"status": 404,
"code": "not_available_in_sandbox",
"detail": "Sandbox keys (jbe_test_…) serve job search, job and company lookups, Auto Apply applications, and reading mailboxes. Use a live key for every other endpoint.",
"instance": "/api/jobs/feed/managed"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>",
"code": "<string>",
"docs_url": "https://jobo.world/docs/guides/sync-a-database",
"api_version": "2026-08-31"
}{
"error": "Rate limit exceeded",
"detail": "Per-minute JobSearch request limit of 180 exceeded. Try again shortly.",
"retry_after_seconds": 1,
"code": "rate_limit_exceeded",
"group": "JobSearch",
"api_version": "2026-08-31"
}{
"message": "An error occurred",
"detail": "<string>"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>",
"code": "<string>",
"docs_url": "https://jobo.world/docs/guides/sync-a-database",
"api_version": "2026-08-31"
}Authorizations
Body
Cursor-paginated feed request. The cursor keeps the first request's filters, stable_scan ordering and batch_size: filters sent with a cursor are ignored, and batch_size can be lowered but never raised. description_format is read from every request. Start a new scan to change the filters.
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.
Show child attributes
Show child attributes
Filter by work model: remote, hybrid, onsite. null = all jobs
remote, hybrid, onsite Filter by employment type. null = all jobs
full-time, part-time, contract, internship, freelance, temporary Filter by experience level. null = all jobs
intern, entry, mid, senior, lead, executive 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.
Leave out jobs from these ATS provider IDs (e.g. lever, workday), normalized like sources. May be combined with sources: sources: [greenhouse, lever] with exclude_sources: [lever] returns Greenhouse jobs.
Leave out jobs with these work models. Jobs whose work model is unknown are kept.
remote, hybrid, onsite Leave out jobs with these employment types. Jobs whose employment type is unknown are kept.
full-time, part-time, contract, internship, freelance, temporary Leave out jobs at these experience levels. Jobs whose experience level is unknown are kept.
intern, entry, mid, senior, lead, executive Leave out jobs whose description is in these languages, as ISO 639-1 codes; names and locales are mapped as for languages. Jobs whose language is unknown are kept.
Include/exclude companies, matched as on POST /api/jobs/search. Each entry is a Jobo company ID, a website domain or URL (fedex.com), or a whole company name (FedEx), case-insensitive and never a partial match.
Entries are matched once, on the first page; the cursor keeps the matched company IDs. An entry that matches nothing is not a 400: the first page's warnings lists companies_unmatched (include), companies_exclude_unmatched (exclude) or companies_outside_sources (matches on none of the requested sources). If the include list matches no company, or none on the requested sources, the first page has jobs: [], has_more: false, next_cursor: null and estimated_total: 0, and is not billed.
Show child attributes
Show child attributes
Include/exclude filter on the job's occupation category (occupation.category, e.g. Healthcare). Exact, case-insensitive match. GET /api/occupations lists every value. Jobs without an occupation never match an include list.
Show child attributes
Show child attributes
Include/exclude filter on the job's occupation subcategory (occupation.subcategory, e.g. Nursing). Exact, case-insensitive match. GET /api/occupations lists every value.
Show child attributes
Show child attributes
Include/exclude filter on occupation id (occupation.id, e.g. esco:8d3e8aaa-791b-4c75-a465-f3f827028f50). Use ids, not names: names can improve between taxonomy releases, ids don't. GET /api/occupations lists every id.
Show child attributes
Show child attributes
Include/exclude filter on the hiring company's industries (company.industries, e.g. Software Development), matched on the whole name, case-insensitively. Include keeps jobs whose company has ANY of the values; exclude drops jobs whose company has any of them.
Show child attributes
Show child attributes
Include/exclude filter on the company's single primary industry (primary_industry on the company profile, GET /api/companies/{id}, e.g. Finance). Exact, case-insensitive match.
Show child attributes
Show child attributes
Include/exclude filter on the hiring company's business model (categories on the company profile, GET /api/companies/{id}), case-insensitive: b2b, b2c, b2b2c, saas, marketplace, service-provider. Include keeps jobs whose company has ANY of them; exclude drops jobs whose company has any of them.
Show child attributes
Show child attributes
Include/exclude filter on the company's headcount band (company_size on the company profile, GET /api/companies/{id}). Companies of unknown size never match an include list and are kept by an exclude list. An unknown band is a 400.
Show child attributes
Show child attributes
Include/exclude filter on the company's annual revenue band (revenue on the company profile, GET /api/companies/{id}). Companies of unknown revenue never match an include list and are kept by an exclude list. An unknown band is a 400.
Show child attributes
Show child attributes
false leaves out jobs that recruitment and staffing agencies post on behalf of other employers (is_agency on the company profile, GET /api/companies/{id}); true returns only theirs. Omit or null = all jobs.
Return jobs whose employer posting time or first-indexed time is on or after this UTC timestamp. Use updated_after when edits matter.
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.
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.
markdown, html Return jobs created, updated or re-indexed on or after this UTC timestamp, including jobs reactivated in that window. The watermark for incremental syncs: see Sync a database.
true (default) pages by creation time, so jobs updated or deleted mid-scan are never skipped or duplicated. false is the legacy update-recency order: its scans stop at 1,000,000 results with 409 feed_cursor_restart_required.
Opaque cursor from next_cursor. Omit on the first request.
1 <= x <= 1000Response
Batch of jobs with cursor for next page
Show child attributes
Show child attributes
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.
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.
Show child attributes
Show child attributes

