Job Monkey

What the feed does not carry

Know these before you build, and the feed will not surprise you.

  1. No row images on new and reopened. The event tells you a job was born or came back; the record comes from POST /v1/jobs by GUID. That is the one charged call, and it is why events can be free.
  2. A hold and an unhold write no event. A job that goes missing from its board and comes back inside 48 hours was never closed for you (Held closures). One that does not come back arrives as a single closed.
  3. An employer's edit without a served-field change does not reach the feed. We compare the served fields only; an edit that leaves every one of them the same is not a changed event.
  4. source never changes. A job is one row on one system. A company that moves to a new ATS has new jobs with new GUIDs on the new system, and the old ones close.
  5. A job's company and industry follow the company, not the job. When a company is renamed or its industry is fixed, you get one event on /v1/companies/events, not one per job. Join on company_guid and you are right at once.

Two more things that are not filters

  • No filter beyond the cut. country and system are the only parameters that narrow a stream. "Only remote" or "only full-time" is your side: the fields are all there (ai_workplace_type, ai_employment_type) and the cut keeps the stream cheap to serve and cheap to buy.
  • No webhooks. You call us; nothing calls you. Events are free and have no daily cap on a paid key, so a loop every few minutes is the design.

A changed job that moved country

A changed event is given as you see it: a job that left your countries arrives as closed, one that entered as new. ledger_event keeps the ledger's own word so you can tell the two apart.

curl -s 'https://api.jobmonkey.ai/v1/events?country=Canada&cursor=9600000&limit=3' \
  -H 'Authorization: Bearer cb_live_XXXXXXXX' | python3 -c 'import json,sys; [print(e["seq"], e["event"], e["ledger_event"]) for e in json.load(sys.stdin)["events"]]'