For Developers & Partners
Job listing data,
on demand.
A metered JSON API over the same job listing corpus that powers Job Robin's Hiring Radar — full listing fields plus the location and remote-eligibility data we normalize on top of them.
Beta — under construction
This is an early-access preview. Endpoints, response fields, and access terms may change without notice, and it isn't yet recommended for production use. Access is by invitation only while we work with early partners — this applies to the analytics endpoints below too, which additionally require a key explicitly enabled for analytics access (separate from listings access) and can be disabled globally at any time.
How it works
Every request is authenticated with a key we issue you directly — there's no self-serve signup yet (see below).
Request
curl "https://job-robin.com/circumnavigation/v1/listings/?domain=it-jobs&location_country=US&location_state=CA&limit=1" \ -H "Authorization: Bearer sk_live_..."
Response
{
"results": [
{
"listing": {
"source": "greenhouse",
"source_id": "6041823003",
"title": "Senior Backend Engineer",
"company": "Northwind Health",
"description": "We're looking for a Senior Backend Engineer...",
"redirect_url": "https://boards.greenhouse.io/northwindhealth/jobs/...",
"posted_at": "2026-08-03T14:22:00Z",
"salary_min": 145000,
"salary_max": 185000,
"location_display": "Remote (US)"
},
"metadata": {
"category": "it-jobs",
"location_country_code": "US",
"location_state_code": "",
"location_city": null,
"location_remote_eligible": true
}
}
],
"limit": 1,
"offset": 0
}
listing holds the raw fields we captured from the source. metadata holds only what Job Robin derives or normalizes on top — kept as two separate objects so it's always clear which is which. Filter by industry with ?domain=, by location with ?location_country=/?location_state= (ISO country code / state or province code), paginate with ?limit=/?offset=.
Valid ?domain= values
it-jobs
engineering-jobs
healthcare-nursing-jobs
teaching-jobs
sales-jobs
marketing-jobs
accounting-finance-jobs
hr-jobs
management-jobs
legal-jobs
creative-design-jobs
logistics-warehouse-jobs
manufacturing-jobs
social-work-jobs
science-qa-jobs
consulting-corporate-strategy-jobs
pr-communications-jobs
customer-services-jobs
trade-construction-jobs
hospitality-catering-jobs
Analytics API beta
Three read-only endpoints over the same corpus, aggregated into hiring-market signals — weekly trend, a point-in-time snapshot, and the fastest-moving companies. These require a key explicitly enabled for analytics access, separate from listings access, and count against the same daily quota as /v1/listings/.
Weekly hiring trend
Request
curl "https://job-robin.com/circumnavigation/v1/analytics/weekly/?weeks=3" \ -H "Authorization: Bearer sk_live_..."
Response
{
"generated_at": "2026-08-24T14:32:10.44Z",
"latest_week": "2026-08-17",
"coverage": { "weeks_requested": 3, "weeks_returned": 3 },
"results": [
{ "week_start": "2026-08-03", "new_listings_count": 842, "closed_listings_count": 301, "net_change": 541 },
{ "week_start": "2026-08-10", "new_listings_count": 915, "closed_listings_count": 388, "net_change": 527 },
{ "week_start": "2026-08-17", "new_listings_count": 1024, "closed_listings_count": 412, "net_change": 612 }
]
}
?weeks= defaults to 12, capped at 52. ?domain= is not supported here and returns a 400 — new/closed counts aren't tracked per category in the underlying data, so we reject that filter rather than approximate it. Empty history returns an empty results array with latest_week: null, not an error.
Latest snapshot
Request
curl "https://job-robin.com/circumnavigation/v1/analytics/latest/?limit=5" \ -H "Authorization: Bearer sk_live_..."
Response
{
"generated_at": "2026-08-24T14:32:11.10Z",
"latest_week": "2026-08-17",
"weekly_snapshot": {
"as_of": "2026-08-17",
"source": "CompanyHiringWeeklyStat weekly snapshot -- only as fresh as the last sync",
"remote_mix": { "remote": 2103, "hybrid": 1488, "onsite": 954 },
"top_categories": [
{ "category": "it-jobs", "label": "IT Jobs", "count": 1820 }
],
"top_categories_note": "Reflects active listings in this snapshot, not new listings added during the week.",
"top_skills": [ { "skill": "python", "count": 412 } ],
"top_locations": [ { "location_key": "US:CA", "count": 980 } ]
},
"live_query": {
"source": "HiringRadarListing, computed at request time -- always current",
"salary_by_category": [
{ "category": "it-jobs", "label": "IT Jobs", "count": 640, "avg_salary_min": 108000, "avg_salary_max": 152000 }
],
"salary_overall": { "count": 2201, "coverage_pct": 41.3, "avg_salary_min": 96000, "avg_salary_max": 138000 },
"employment_type_breakdown": [ { "employment_type": "Full-Time", "count": 3980 } ],
"employment_coverage_pct": 62.4
}
}
Two halves with different freshness, kept deliberately separate: weekly_snapshot is only as fresh as the last weekly sync (as_of tells you which week), while live_query is computed fresh on every request and isn't tied to a specific week. top_categories reflects what's currently active in the snapshot, not new listings added that week — see top_categories_note. ?limit= defaults to 10, capped at 25, applied independently to each ranked list. ?domain= is not yet supported and returns a 400.
Company movers
Request
curl "https://job-robin.com/circumnavigation/v1/analytics/company-movers/?domain=it-jobs&limit=1" \ -H "Authorization: Bearer sk_live_..."
Response
{
"generated_at": "2026-08-24T14:32:12.88Z",
"week_start": "2026-08-17",
"results": [
{
"company_name": "Acme Corp",
"week_start": "2026-08-17",
"synced_at": "2026-08-17T09:14:02Z",
"new_listings_count": 42,
"closed_listings_count": 11,
"active_listings_count": 118,
"net_change": 31,
"avg_salary_min": 104000,
"avg_salary_max": 149000,
"salary_data_coverage_pct": 55.2,
"remote_count": 60,
"hybrid_count": 38,
"onsite_count": 20,
"top_categories": [ { "category": "it-jobs", "count": 118 } ],
"top_locations": [ { "location_key": "US:CA", "count": 70 } ],
"top_skills": [ { "skill": "python", "count": 22 } ]
}
]
}
Ranked by new listings this week, ties broken by company name for stable ordering across repeated requests. ?domain= filters to companies in that category (a real, accurate company-level filter, unlike the weekly endpoint) — see the valid values above. ?week_start= (ISO date) restricts to a specific recorded week and defaults to the latest; an unrecorded date returns a 400 rather than a silently-empty list. ?limit= defaults to 25, capped at 100. No internal database identifiers are ever included — companies are identified by name only.
Request access
Tell us a bit about what you're building. Access is reviewed and granted manually while this is in beta.