companies (free)
GET /v1/companies/events
Company changes after a cursor (the same ledger numbers as the job events)
Company changes after a cursor: a new company carries every field, a change only the fields that moved, with their new values. The seq is the same ledger as the job events, so you keep one number for both streams. A job's company and industry follow the company's events, never a job event.
Charged: nothing.
Parameters
| Name | Type | Default | Allowed | What |
|---|---|---|---|---|
country | list | none | country names | companies with an open job there |
system | list | none | ATS names | the company's ats |
cursor | integer | 0 | a seq | read after this number |
since | time | none | ISO 8601 | instead of cursor |
limit | integer | 10000 | 1 to 10000 | events 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": 685430,
"company_guid": "<guid>",
"at": "<time>",
"fields": {
"name": "...",
"industry": "..."
}
}
],
"next": 685430,
"more": true,
"top": 692550
}
Example
curl -s 'https://api.jobmonkey.ai/v1/companies/events?cursor=685000&limit=1' -H 'Authorization: Bearer cb_live_XXXXXXXX'
{
"events": [
{
"seq": 685430,
"company_guid": "694466b8-8292-40bc-9027-86ce3422df15",
"at": "2026-11-05T10:52:33Z",
"fields": {
"name": "Porsche Long Beach",
"slug": "porschelongbeach",
"url": "https://www.porschesocal.com",
"size": "11-50 employees",
"industry": "Manufacturing",
"locations": [],
"ats": "greenhouse",
"ats_site": null,
"board_name": "Porsche Long Beach",
"parent_company_guid": null,
"slug_verified": true
}
}
],
"next": 685430,
"more": true,
"top": 692550
}
In Python
import json, urllib.request
KEY = "cb_live_XXXXXXXX"
req = urllib.request.Request("https://api.jobmonkey.ai/v1/companies/events?cursor=685000&limit=1", 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
- 401 no_key / bad_key / account_off
- 429 rate_limited
- 429 plan_exhausted (free key, 10 a day)
Headers
X-Request-IdX-Units-ChargedRateLimit (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.