What the feed does not carry
Know these before you build, and the feed will not surprise you.
- No row images on
newandreopened. The event tells you a job was born or came back; the record comes fromPOST /v1/jobsby GUID. That is the one charged call, and it is why events can be free. - 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. - 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
changedevent. sourcenever 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.- A job's
companyandindustryfollow 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 oncompany_guidand you are right at once.
Two more things that are not filters
- No filter beyond the cut.
countryandsystemare 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"]]'