Job Monkey

events (free)

GET /v1/events

Job events after a cursor: new, changed (with the new values), closed, reopened

The ledger after a cursor: new, changed (with the new values in fields), closed, reopened, as you see them for your cut (a changed job that left your countries arrives as closed, one that entered as new; ledger_event keeps the ledger's word). In seq order, a GUID once per event. A call scans at most 200,000 sequence numbers, so a rare cut may answer few rows, even none, with more: true: call again with next. closed_at is when the job last left its board; at is when the event was written (a held closure is published up to 48 hours later).

Charged: nothing.

Parameters

NameTypeDefaultAllowedWhat
eventlistall fournew, changed, closed, reopenedthe kinds you want
countrylistnonecountry namesthe cut by country
systemlistnoneATS namesthe cut by system
cursorinteger0a seq from a previous answer (next, top or ledger_seq)read the events after this number
sincetimenoneISO 8601, like 2026-11-04T00:00:00Zinstead of cursor: start at the first event at or after this time
limitinteger100001 to 10000events a page

An unknown parameter is a 400 bad_request. 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.

Answer

{
 "events": [
  {
   "seq": 691405,
   "event": "changed",
   "ledger_event": "changed",
   "job_guid": "<guid>",
   "at": "<time>",
   "closed_at": null,
   "reopened_at": null,
   "fields": {
    "title": "..."
   },
   "source": "dayforce"
  }
 ],
 "next": 692301,
 "more": true,
 "top": 692550
}

Example

curl -s 'https://api.jobmonkey.ai/v1/events?country=United%20Kingdom&event=changed,closed&cursor=691400&limit=2' -H 'Authorization: Bearer cb_live_XXXXXXXX'
{
 "events": [
  {
   "seq": 691405,
   "event": "changed",
   "ledger_event": "changed",
   "job_guid": "d5888dc3-eb39-41c8-b958-175e0e18bc89",
   "at": "2026-11-05T11:15:21Z",
   "closed_at": null,
   "reopened_at": null,
   "fields": {
    "title": "Heavy Goods Vehicle Class 1 Driver"
   },
   "source": "dayforce"
  },
  {
   "seq": 692301,
   "event": "closed",
   "ledger_event": "closed",
   "job_guid": "4c1e8a0b-5d2f-4e6a-9b7c-1d2e3f4a5b6c",
   "at": "2026-11-05T11:20:53Z",
   "closed_at": "2026-11-03T11:17:31Z",
   "reopened_at": null,
   "fields": null,
   "source": "workday"
  }
 ],
 "next": 692301,
 "more": true,
 "top": 692550
}

In Python

import json, urllib.request

KEY = "cb_live_XXXXXXXX"
req = urllib.request.Request("https://api.jobmonkey.ai/v1/events?country=United%20Kingdom&event=changed,closed&cursor=691400&limit=2", headers={"Authorization": f"Bearer {KEY}"})
with urllib.request.urlopen(req) as r:
    answer = json.load(r)
    print(r.headers.get("X-Request-Id"), r.headers.get("X-Units-Charged"))
print(json.dumps(answer, indent=1)[:800])

Errors

  • 400 bad_request (a bad kind, cursor or time)
  • 401 no_key / bad_key / account_off
  • 429 rate_limited
  • 429 plan_exhausted (free key, 10 a day)

Headers

  • 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)

Every answer carries X-Request-Id; quote it to [email protected]. Times are UTC, ISO 8601.