Job Monkey

Snapshots

A snapshot is the newest weekly copy of every open job, one file for everything and one per country, as zstd-compressed JSON lines in the API's exact shape. For a first load of a whole country it is the same jobs as paging GET /v1/jobs, in one download, from Cloudflare's edge, not from our line.

The price

The same as the pages: every job in the file is charged once, at your plan's rate, when the link is made. The companies file of the same folder comes free. A second link for the same file inside 24 hours is free. A plan too small for the file gets 429 plan_exhausted and nothing is charged.

A buyer who pays for a snapshot and then pages the same jobs through GET /v1/jobs pays twice: load the snapshot, then read events.

Three calls

curl -s https://api.jobmonkey.ai/v1/snapshots -H 'Authorization: Bearer cb_live_XXXXXXXX'

Lists the newest snapshot: its stamp, taken_at, the ledger seq to read events from, and per file the jobs, bytes and sha256.

curl -s -X POST https://api.jobmonkey.ai/v1/snapshots/20261107-191824Z/canada -H 'Authorization: Bearer cb_live_XXXXXXXX'

Answers url and companies_url, each good for 24 hours, and charged.

curl -sL "$URL" -o canada.jsonl.zst && zstd -d canada.jsonl.zst

A country file is concatenated frames in one stream; plain zstd -d reads it. Check the sha256.

Then read events

The snapshot's seq is your first cursor: GET /v1/events?country=Canada&cursor=<seq> gives everything that moved since the file was written. Held closures are in the file, marked by closing_since, for the same reason they are in the pages.

import json, subprocess, urllib.request

KEY, API = "cb_live_XXXXXXXX", "https://api.jobmonkey.ai"
def call(path, method="GET"):
    req = urllib.request.Request(API + path, method=method, headers={"Authorization": f"Bearer {KEY}"})
    with urllib.request.urlopen(req) as r:
        return json.load(r)

snap = call("/v1/snapshots")
link = call(f"/v1/snapshots/{snap['snapshot']['stamp']}/canada", "POST")
urllib.request.urlretrieve(link["url"], "canada.jsonl.zst")
subprocess.run(["zstd", "-d", "-f", "canada.jsonl.zst"], check=True)
with open("canada.jsonl") as f:
    for line in f:
        store(json.loads(line))
cursor = snap["snapshot"]["seq"]

The free sample file is 1,000 jobs in the same shape, gzipped, no key: test your parser on it first.