Skip to content

Get Companies Open Jobs

POST
/companies/open-jobs

What are these CRM companies hiring for, right now?

A growth/buying signal: a company staffing up is a company with budget. Unrelated to /marketplace/job-posts, which publishes SDR roles you are recruiting for - both are called “jobs” but they share no data.

company_ids are mashup_companies.id values, NOT linkedin_company_id. Both are bare ints, so passing the wrong one addresses a different company rather than erroring.

Results split into items (resolved) and unresolved. An unresolved company is normal: it means the company could not be matched to a LinkedIn company page, not that it is not hiring. Read lcid_confidence before trusting a match - 1.0 is an exact LinkedIn-URL match, 0.7 is a domain fallback that can mismatch on shared or parked domains. open_jobs counts postings seen within window_days; the source carries no open/closed state, so a filled role lingers until it ages out.

Org isolation is by Postgres schema, so ids belonging to another org come back as unresolved with no existence disclosure. Owner-level RBAC (CompanyScopeFilter) is deliberately not applied: it reads user.permissions, which an API-key user does not carry, so wiring it in would resolve every API-key caller to scope “none” and return zero rows.

Authorizations

Parameters

Header Parameters

X-Target-Org-Id
Any of:
string

Request Body required

Request contract for the hiring-signal batch lookup.

Field-for-field identical to the main-app model of the same name in companies/interfaces/fastapi/router.py. It is redefined here rather than imported because that module imports developer_api.dependencies.hybrid_auth; importing it back would couple the two app halves at import time. test_companies_open_jobs_api.py locks the two models together so the duplication cannot silently drift.

object
company_ids
required

CRM company IDs (mashup_companies.id) - NOT linkedin_company_id

Array<integer>
>= 1 items <= 200 items
include_postings

False = counts only (one CH query)

boolean
default: true
include_subsidiaries

Roll subsidiary postings into the parent. Off by default: one row = one company. NOTE: when true, jobs expands to child companies but open_jobs stays parent-only, so len(jobs) can exceed open_jobs.

boolean
limit_per_company
integer
default: 25 >= 1 <= 50
window_days
integer
default: 60 >= 1 <= 365

Responses

200

Successful Response

object
data
required
object
key
additional properties
any
pagination
Any of:
object
has_next
required

Whether there are more pages

boolean
limit
required

Items per page

integer
next_cursor
Any of:
string
page
required

Current page number (1-indexed)

integer
total
required

Total number of items

integer

422

Validation Error

object
detail
Array<object>
object
loc
required
Array
msg
required
string
type
required
string