Skip to Content
CompanySpec
API referenceJob postings

Search job postings

POST
/job-postings/search

Search job postings across companies. Results are grouped by company, newest postings first, and include only the postings that match (up to 10 per company).

Costs 1 discovery per company returned that isn't already paid for this billing month. That covers all of that company's postings: listing them with GET /companies/{company}/job-postings is then free.

Authorization

bearerAuth
headerAuthorizationBearer <token>

Your API key, sent as Authorization: Bearer <key>. Create keys in the dashboard.

Request Body

application/json
  1. body
title?string

Text to match in job titles.

Lengthlength <= 200
normalized_titles?array<string>
job_functions?array<string>

Values from /values/job_functions.

seniorities?array<string>

Values from /values/job_seniorities.

workplace_types?array<>
employment_types?array<string>
job_countries?array<string>

Countries where the job is located (ISO alpha-2).

job_locations?array<string>

Job locations from /values/cities.

salary?

Salary range, in salary_currency.

salary_currency?string

ISO currency code for salary, for example USD. Only postings with a salary in this currency match; amounts are not converted.

Length3 <= length <= 3
technologies?array<string>

Technologies mentioned in the posting.

visa_sponsorship?boolean
posted_within_days?integer
Range1 <= value <= 365
status?string

open (default), closed or all. Closed postings stay available, with closed_on set.

Default"open"
Value in"open""closed""all"
company?

Filters shared by search, count, similar, page search and job search. Different filters are combined with AND. Inside one list, values match if the company has any of them, unless the filter has an *_operator (then the default is and: the company must have all of them).

limit?integer

Companies per page.

Range1 <= value <= 100
Default25
cursor?string

Response Body

Job postings grouped by company.

application/json
  1. response
results*array<>
next_cursor*|

Pass as cursor to get the next page. null when there are no more results.

usage*

What this request cost and what is left this billing month.

Example Request
curl -X POST 'https://api.companyspec.com/v1/job-postings/search' \  -H 'Content-Type: application/json' \  -d '{  "title": "data engineer",  "technologies": [    "snowflake"  ],  "posted_within_days": 30,  "job_countries": [    "GB"  ],  "limit": 20}'
Example Response
{  "results": [    {      "company": {        "id": "cmp_7tw3e",        "domain": "ledgerly.co.uk",        "name": "Ledgerly",        "logo_url": null      },      "job_postings": [        {          "id": "job_k21m9",          "title": "Data Engineer",          "job_function": "engineering",          "seniority": "mid",          "workplace_type": "hybrid",          "locations": [            "London, United Kingdom"          ],          "posted_on": "2026-10-28",          "status": "open"        }      ]    }  ],  "next_cursor": null,  "usage": {    "charged": {      "lookups": 0,      "discoveries": 1    },    "already_paid": 0,    "remaining": {      "lookups": 9750,      "discoveries": 1976    }  }}