# The feed's rules live in the portal; the request carries only paging.
curl -X POST "https://connect.jobo.world/api/jobs/feed/3f2a8c1e-7b0d-4b6a-9a51-0c2f5d9e8b11" \
-H "X-Api-Key: $JOBO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"batch_size": 1000}'
# Continuation requests carry the previous response's cursor.
curl -X POST "https://connect.jobo.world/api/jobs/feed/3f2a8c1e-7b0d-4b6a-9a51-0c2f5d9e8b11" \
-H "X-Api-Key: $JOBO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"cursor": "eyJ2IjoxLCJ..."}'import requests
url = "https://connect.jobo.world/api/jobs/feed/{feed_id}"
payload = {
"cursor": "<string>",
"batch_size": 1000,
"updated_after": "2023-11-07T05:31:56Z",
"description_format": "markdown"
}
headers = {
"X-Api-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-Api-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
cursor: '<string>',
batch_size: 1000,
updated_after: '2023-11-07T05:31:56Z',
description_format: 'markdown'
})
};
fetch('https://connect.jobo.world/api/jobs/feed/{feed_id}', 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/{feed_id}",
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([
'cursor' => '<string>',
'batch_size' => 1000,
'updated_after' => '2023-11-07T05:31:56Z',
'description_format' => 'markdown'
]),
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/{feed_id}"
payload := strings.NewReader("{\n \"cursor\": \"<string>\",\n \"batch_size\": 1000,\n \"updated_after\": \"2023-11-07T05:31:56Z\",\n \"description_format\": \"markdown\"\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/{feed_id}")
.header("X-Api-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"cursor\": \"<string>\",\n \"batch_size\": 1000,\n \"updated_after\": \"2023-11-07T05:31:56Z\",\n \"description_format\": \"markdown\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://connect.jobo.world/api/jobs/feed/{feed_id}")
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 \"cursor\": \"<string>\",\n \"batch_size\": 1000,\n \"updated_after\": \"2023-11-07T05:31:56Z\",\n \"description_format\": \"markdown\"\n}"
response = http.request(request)
puts response.read_body{
"jobs": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"title": "<string>",
"normalized_title": "<string>",
"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,
"feed_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"feed_revision": 123,
"estimated_total": 123
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>",
"code": "<string>",
"api_version": "2026-08-31"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>",
"code": "<string>",
"api_version": "2026-08-31"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>",
"code": "<string>",
"api_version": "2026-08-31"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>",
"code": "<string>",
"api_version": "2026-08-31"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>",
"code": "<string>",
"api_version": "2026-08-31"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>",
"code": "<string>",
"api_version": "2026-08-31"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>",
"code": "<string>",
"api_version": "2026-08-31"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>",
"code": "<string>",
"api_version": "2026-08-31"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>",
"code": "<string>",
"api_version": "2026-08-31"
}Stream a saved feed
Jobs of a feed saved in the Jobo portal’s Feed Builder. The feed’s rules decide what is in it: its base (every company, your Managed Job Scraping companies, or a list), its company conditions (ATS, industry, category, size, revenue, staffing agency), its job conditions (work model, employment type, experience level, language, category, occupation, location, posted within) and its always-included and excluded companies. Edit them in the portal; the request carries only paging. Requires a customer API key of the account that owns the feed.
Same batch shape, order and cursor semantics as POST /api/jobs/feed
with stable_scan: oldest first by created_at, and the first page
carries estimated_total. The cursor fixes the scan’s updated_after,
batch size and “posted within” window; a continuation may reduce
batch_size but never raise it. Billed like POST /api/jobs/feed, per
job returned.
Feed edits. Every response carries feed_revision (and
X-Feed-Revision). Editing the feed mid-scan makes the next page return
409 with code feed_changed and restart_required: true: start again
without a cursor. An incremental client should run a full scan when
feed_revision differs from the one its last full scan used.
updated_after returns jobs created, updated or re-indexed on or
after the time, plus every job of a company that joined the feed on or
after it (as on the managed feed).
# The feed's rules live in the portal; the request carries only paging.
curl -X POST "https://connect.jobo.world/api/jobs/feed/3f2a8c1e-7b0d-4b6a-9a51-0c2f5d9e8b11" \
-H "X-Api-Key: $JOBO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"batch_size": 1000}'
# Continuation requests carry the previous response's cursor.
curl -X POST "https://connect.jobo.world/api/jobs/feed/3f2a8c1e-7b0d-4b6a-9a51-0c2f5d9e8b11" \
-H "X-Api-Key: $JOBO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"cursor": "eyJ2IjoxLCJ..."}'import requests
url = "https://connect.jobo.world/api/jobs/feed/{feed_id}"
payload = {
"cursor": "<string>",
"batch_size": 1000,
"updated_after": "2023-11-07T05:31:56Z",
"description_format": "markdown"
}
headers = {
"X-Api-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-Api-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
cursor: '<string>',
batch_size: 1000,
updated_after: '2023-11-07T05:31:56Z',
description_format: 'markdown'
})
};
fetch('https://connect.jobo.world/api/jobs/feed/{feed_id}', 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/{feed_id}",
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([
'cursor' => '<string>',
'batch_size' => 1000,
'updated_after' => '2023-11-07T05:31:56Z',
'description_format' => 'markdown'
]),
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/{feed_id}"
payload := strings.NewReader("{\n \"cursor\": \"<string>\",\n \"batch_size\": 1000,\n \"updated_after\": \"2023-11-07T05:31:56Z\",\n \"description_format\": \"markdown\"\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/{feed_id}")
.header("X-Api-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"cursor\": \"<string>\",\n \"batch_size\": 1000,\n \"updated_after\": \"2023-11-07T05:31:56Z\",\n \"description_format\": \"markdown\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://connect.jobo.world/api/jobs/feed/{feed_id}")
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 \"cursor\": \"<string>\",\n \"batch_size\": 1000,\n \"updated_after\": \"2023-11-07T05:31:56Z\",\n \"description_format\": \"markdown\"\n}"
response = http.request(request)
puts response.read_body{
"jobs": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"title": "<string>",
"normalized_title": "<string>",
"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,
"feed_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"feed_revision": 123,
"estimated_total": 123
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>",
"code": "<string>",
"api_version": "2026-08-31"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>",
"code": "<string>",
"api_version": "2026-08-31"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>",
"code": "<string>",
"api_version": "2026-08-31"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>",
"code": "<string>",
"api_version": "2026-08-31"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>",
"code": "<string>",
"api_version": "2026-08-31"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>",
"code": "<string>",
"api_version": "2026-08-31"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>",
"code": "<string>",
"api_version": "2026-08-31"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>",
"code": "<string>",
"api_version": "2026-08-31"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>",
"code": "<string>",
"api_version": "2026-08-31"
}Authorizations
API key provided by Jobo
Path Parameters
The feed's id, shown in the portal's Feed Builder.
Body
Cursor-paginated export request for a saved feed. The feed's rules, edited in the Jobo portal, decide what is in it; only pagination, the incremental watermark and the description format are set per request.
Opaque cursor from next_cursor. Omit on the first request. The
cursor embeds the feed's revision, the batch size and
updated_after, so those values sent alongside it are ignored —
except batch_size, which a continuation may reduce but never raise.
1 <= x <= 1000Only return jobs created, updated or re-indexed on or after this UTC timestamp — incremental watermark for syncs — plus every job of a company that joined the feed on or after it. Ignored on continuations.
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 Response
Batch of jobs from the saved feed with cursor for next page
Show child attributes
Show child attributes
The feed's revision this page was read at. When it differs from the one your last full scan used, the feed was edited: run a full scan.
Estimated number of jobs the scan will deliver. Present on the first page of a scan only; null on continuation pages.

