Puesto Docs
API ReferenceJobsCount jobs GET

Count jobs

GET
/api/v1/jobs/count

Count the jobs matching a filter set. Accepts the same filters as Search jobs (pagination, sorting, and description knobs are ignored) and returns only the total. The default 90-day freshness window applies identically to the count. A single-country count uses the job's primary country and can be slightly lower than the number of results Search jobs returns for the same filter (jobs listing that country as a secondary location are excluded); multi-country filters count by any-listed-country, matching search exactly. Supplying q counts full-text matches with the same syntax, scope tiers, symbol-token handling, and guardrails as Search jobs (a broad q may return 422; a malformed q, 400). A q count uses any-listed-country semantics, so with a single-country filter it counts by any-listed-country (matching search), not the primary-country fast path used without q.

Authorization

bearerAuth
AuthorizationBearer <token>

Provide your secret API key (prefixed sk_) as a bearer token: Authorization: Bearer sk_....

In: header

Query Parameters

title?string

Case-insensitive substring match on the job title (3-200 characters).

Length3 <= length <= 200
q?string

Full-text search across the job. Google-style syntax: quoted "exact phrase", OR, and -term exclusion (a query that is ONLY exclusions is rejected with 400). Operator precedence: implicit AND binds tighter than OR, and a -term attaches only to its adjacent group — so "machine learning" OR "data scientist" -senior parses as A OR (B AND NOT senior) and CAN still return Senior ML titles. To exclude a term everywhere, distribute it across each branch: "machine learning" -senior OR "data scientist" -senior. By default q matches the job TITLE only (precise — best for common role terms); pass q_scope=full to also search the description. Phrase queries under q_scope=full combined with very narrow filters (a small country, a rare language) can hit the search timeout; the default title scope is immune, so prefer it for phrase precision. q composes as a filter with the standard sort/cursor pagination (newest-first over the matches) and respects the default 90-day freshness window unless a date filter is given. Symbol-bearing tech tokens (c++, c#, .net) are matched as a title substring instead of full-text (they collapse under English tokenization). If a full-text search yields no rows a single title-substring fallback runs and its results are flagged fuzzy: true.

Length2 <= length <= 200
q_scope?string

Which fields q searches. title (default) matches the job title only — precise, best for common role terms (e.g. developer, engineer), which otherwise match description boilerplate. full also searches the description — broader reach, best for niche skills or tools that appear only in the requirements text (a language or framework not named in the title). Only affects results when q is set (ignored otherwise).

Default"title"

Value in

  • "title"
  • "full"
country?array<>

Filter by ISO 3166-1 alpha-2 country code(s). Repeat the parameter or comma-separate values (e.g. country=us,de). A job matches if it is tagged with any of the given countries. Up to 20 values; case-insensitive.

Itemsitems <= 20
state?array<string>

Filter by state / region reference code(s). Repeat the parameter or comma-separate values (e.g. state=CA,NY). A job matches if it is tagged with any of the given regions. Up to 20 values; case-insensitive.

Itemsitems <= 20
city?string

Case-insensitive substring match on the city name.

Length1 <= length <= 200
workplace?string

Filter by workplace arrangement.

Value in

  • "remote"
  • "hybrid"
  • "onsite"
employment_type?string

Filter by employment type.

Value in

  • "full_time"
  • "part_time"
  • "contract"
  • "temporary"
  • "internship"
level?string

Filter by seniority level.

Value in

  • "intern"
  • "entry"
  • "mid"
  • "senior"
  • "staff"
  • "lead"
  • "executive"
language?string

Filter by ISO 639-1 language code (2 letters, case-insensitive).

Length2 <= length <= 2
salary_min?number

Keep jobs whose stated salary range reaches at least this amount. Jobs that state only a minimum (no maximum) match when that minimum is at least this value.

Range0 <= value
salary_max?number

Keep jobs whose stated salary range starts at or below this amount.

Range0 <= value
salary_currency?string

Filter by ISO 4217 currency code (3 letters, case-insensitive).

Length3 <= length <= 3
has_salary?boolean

When true, return only jobs that specify a salary; when false, only jobs without a salary.

company_id?integer

Filter by the numeric company id.

status?string

Filter by listing status. open (default) returns active listings; closed returns delisted ones.

Default"open"

Value in

  • "open"
  • "closed"
posted_since?string

Only jobs posted at or after this ISO-8601 timestamp, including a UTC offset (e.g. 2024-01-01T00:00:00+00:00). When none of posted_since, posted_until, or first_seen_since are provided and status is open, results default to the last 90 days.

Formatdate-time
posted_until?string

Only jobs posted at or before this ISO-8601 timestamp, including a UTC offset (e.g. 2024-01-01T00:00:00+00:00).

Formatdate-time
first_seen_since?string

Only jobs first seen at or after this ISO-8601 timestamp, including a UTC offset (e.g. 2024-01-01T00:00:00+00:00).

Formatdate-time

Response Body

application/json

application/problem+json

application/problem+json

application/problem+json

application/problem+json

curl -X GET "https://example.com/api/v1/jobs/count"
{  "count": 0}
{  "type": "string",  "title": "string",  "status": 0,  "detail": "string",  "errors": [    {      "field": "string",      "message": "string"    }  ]}
{  "type": "string",  "title": "string",  "status": 0,  "detail": "string",  "errors": [    {      "field": "string",      "message": "string"    }  ]}
{  "type": "string",  "title": "string",  "status": 0,  "detail": "string",  "errors": [    {      "field": "string",      "message": "string"    }  ]}
{  "type": "string",  "title": "string",  "status": 0,  "detail": "string",  "errors": [    {      "field": "string",      "message": "string"    }  ]}