search.jobs

Search jobs with structured filters.

Prerequisites

  • A Curviate API key, passed as apiKey when you construct the client. Quickstart shows how to create one.
  • A connected LinkedIn account. This resource is account-scoped: the account_id is injected automatically by the account-scoped accessor, so you pass it once to curviate.account(...) and every call below inherits it. Quickstart covers connecting one, and accounts.list returns the account_id of each account already connected.

Signature

jobs(body: SearchJobsBody & SearchJobsQuery): Promise<SearchJobsResult>

Example

import { Curviate } from "@curviate/sdk";
 
const curviate = new Curviate({
  apiKey: "cvt_live_...",
  baseUrl: "https://api.curviate.com",
});
 
const page = await curviate.account("acc_YOUR_ACCOUNT_ID").search.jobs({ keywords: "YOUR_KEYWORDS" });
for (const item of page.items ?? []) {
  console.log(item.id);
}
// `page.cursor` is the opaque cursor for the next page (null when exhausted).

Parameters

NameTypeRequiredDescription
offsetnumberNoZero-based pagination offset (default 0).
limitnumberNoMaximum results per page (1-100, default 25).
cursorstringNoOpaque pagination cursor returned from a previous response.
keywordsstringNoFull-text keyword search in job postings.
sort_bystringNoSort order: relevance (default) or date (newest first).
date_postednumberNoFilter to jobs posted within N days (positive integer). Snapped UP to the nearest supported window: 1 = past day, 2-7 = past week, 8+ = past month (clamped, no window beyond 30 days is available).
regionstringNoOpaque region ID.
locationarrayNoOpaque location IDs from GET.../search/parameters?type=LOCATION.
location_within_areanumberNoSearch radius around the location, in kilometers. Snapped to the nearest supported bucket: 0, 8, 16, 40, 80, or 160 km (ties round up).
industryarrayNoOpaque industry IDs from GET.../search/parameters?type=INDUSTRY.
seniorityarrayNoFilter by seniority levels.
functionarrayNoJob function slugs (lowercase letters only, e.g. 'engineering').
rolearrayNoOpaque role IDs.
job_typearrayNoFilter by employment type.
companyarrayNoOpaque company IDs from GET.../search/parameters?type=COMPANY.
presencearrayNoFilter by work arrangement.
easy_applybooleanNoFilter to jobs with LinkedIn Easy Apply enabled.
under_10_applicantsbooleanNoFilter to jobs with fewer than 10 applicants.
in_your_networkbooleanNoFilter to jobs at companies in your network.
minimum_salaryobjectNoMinimum salary filter: specify currency and value.
benefitsarrayNoFilter by offered benefits. Valid values: medical_insurance, vision_insurance, dental_insurance, 401(k), pension_plan, commuter_benefits.
commitmentsarrayNoFilter by company commitments. Valid values: career_growth_and_learning, diversity_equity_and_inclusion, environmental_sustainability, social_impact, work_life_balance.
has_verificationsbooleanNoFilter to jobs with LinkedIn verification badges.
fair_chance_employerbooleanNoFilter to fair-chance employers.

Returns

Resolves to SearchJobsResult. Top-level fields: object, items, paging, cursor, notices, safety_warning.

Error codes

CodeWhat it means, and what to do
UNAUTHORIZEDThe API key is missing, malformed, or revoked. Check the key you passed to the client.
INVALID_REQUESTA parameter failed validation. The message names the offending field; fix the request rather than retrying it.
RATE_LIMIT_ACCOUNTThis account's own quota is exhausted. Wait for the window in the Retry-After header, then retry.
RATE_LIMIT_TENANTThe tenant-wide quota is exhausted across all accounts. Slow the whole workload, not just this call.
PLATFORM_RATE_LIMITLinkedIn is throttling this account. Back off well beyond the hinted delay; sustained pressure risks the account.
PLATFORM_ERRORAn upstream failure, usually transient: retry once with backoff before treating it as a real error. Check the response first, though. When it carries retry_likely_to_succeed: false and retry_hint: {kind: "never"}, retrying cannot help and backing off only delays the real answer.
ACCOUNT_NOT_FOUNDNo connected account with that id belongs to this tenant. List your accounts to get a current id.
ACCOUNT_RESTRICTEDLinkedIn has restricted the account, so it cannot act until that is cleared. Retrying will not help.
FILTER_CANDIDATES_REQUIREDA filter value matched several LinkedIn taxonomy options, so it cannot resolve without a choice. Re-send with a candidate id from the body's unresolved[]; this is not retryable as sent.
INTERNALAn unexpected server error. Retry once; if it persists, it is ours, not yours.
PAYLOAD_TOO_LARGEThree limits can trigger this. The platform's own ceiling on total request size is the lowest and the one you are most likely to hit: it starts rejecting at roughly 1 MB, so a handful of photo-sized images is refused even though it clears everything below. Above that, this API caps one attachment at 5 MiB of file content and the whole request body at 9 MiB. Attachments travel base64-encoded, which inflates them by about a third, so a 5 MiB file costs roughly 6.7 MiB of the body budget. Send fewer or smaller attachments; retrying unchanged will not help.
RESOURCE_NOT_FOUNDThe id in the path does not exist, or is not visible to this account. Re-read it from the list endpoint that produced it.

Every code above is a stable CurviateError.code you can branch on. The full list, the response envelope, and retry semantics are in the Error codes reference.

Next steps