Job Monkey

Docs

Clean, open jobs with GUIDs, kept current. One key, JSON, cursors that never skip. The one thing charged is a full job returned by the full feed; events, updates, companies and counts are free.

curl -s 'https://api.jobmonkey.ai/v1/jobs?country=Canada&limit=2' \
  -H 'Authorization: Bearer cb_live_XXXXXXXX'

Try a call from your terminal: get a free key, paste it in place of cb_live_XXXXXXXX, and the page of jobs is yours. 250 jobs a month are free, with no end date.

Start

Routes

RouteWhatCharged
GET /v1/jobsFull jobs by cursor: a first load cut to countries and systemsevery full job in the answer, every time
POST /v1/jobsFull jobs by GUID (up to 1,000); closed or unknown GUIDs come back free in `missing`every full job in the answer, every time; a GUID in `missing` is free
GET /v1/jobs/countOpen jobs, held closures and companies for a cutnothing
GET /v1/eventsJob events after a cursor: new, changed (with the new values), closed, reopenednothing
GET /v1/updatesChanged fields with their new values: the events stream filtered to `changed`nothing
GET /v1/events/countEvents after a cursor, by kind: how far behind a buyer isnothing
GET /v1/companiesCompanies in GUID order for a cut, or by GUID (`guid=a,b,c`)nothing
GET /v1/companies/eventsCompany changes after a cursor (the same ledger numbers as the job events)nothing
GET /v1/searchTitle search over open jobs: shape=page (the card) or shape=match (GUIDs for a campaign)nothing
GET /v1/snapshotsThe newest weekly snapshot: its files, their jobs, bytes and sha256nothing for the list
POST /v1/snapshots/{stamp}/{file}A 24-hour link to one snapshot file (`everything` or a country); the file's jobs are charged oncethe file's jobs, once, at link time; a second link for the same file inside 24 hours is free; the companies file comes free
GET /v1/health200 when every database answersnothing; no key

Plans and billing

Every answer

  • X-Request-Id
  • X-Units-Charged
  • RateLimit (limit=10, remaining=n, reset=s)
  • RateLimit-Policy (10;w=1, plus 10;w=86400 on a free key calling a free route)
  • X-Plan-Jobs-Remaining (the full feed and snapshots, when the plan has a cap)
  • X-Account: past_due (while an invoice is unpaid)

Errors are JSON, {"error": {"code": "...", "message": "..."}}, with the status:

StatusCodeWhen
400bad_requestan unknown parameter, a bad cursor, a bad GUID, a number out of range
401no_keyno Authorization header
401bad_keyunknown, revoked or expired key, or a malformed header
401account_offthe account is off (an unpaid invoice past its 7 days); see your invoices
403no_scopethe key lacks the route's scope (search is a house scope)
429rate_limitedover 10 calls a second on this key; Retry-After: 1
429plan_exhaustedno jobs or calls left on the plan this month, or the day's free-API calls on a free key; Retry-After says when

Authorization: Bearer cb_live_XXXXXXXX on every route but /v1/health. Times are UTC, ISO 8601. country and system take one value, a comma list (country=Canada,Mexico) or a repeat (country=Canada&country=Mexico); the country is its English name as the data holds it; the system is the ATS name (greenhouse, lever.co, workday, ...): /v1/jobs/count lists the sizes, /docs/sizes shows them.