Search jobs

Returns active jobs, newest first, filtered by the parameters you pass. All filters combine with AND.

GET/v1/jobs

Parameters

ParameterTypeDescription
qstringFull-text search over title, employer and description. Words must all match; use "exact phrase", OR, -exclude and prefix*. Accents and case are ignored.
titlestringSame syntax as q, matched against the job title only.
provincelistProvince or territory codes, comma-separated: ON,BC.
citystringA Canadian city, ideally with its province: Toronto, ON. Unknown or ambiguous cities return 400.
sourcelistSource systems, comma-separated, e.g. workday,greenhouse. See /v1/stats for the list.
employment_typelistFULL_TIME, PART_TIME, CONTRACTOR, TEMPORARY, INTERN, VOLUNTEER, PER_DIEM.
remotebooleantrue for remote jobs only, false to exclude them.
has_salarybooleantrue for jobs with an employer-stated salary, false for jobs without.
windowstringOnly jobs first seen within 1h, 24h, 7d, 30d or 6m.
descriptionstringnone (default), text, html or both. Adds description_text and/or description_html.
source_fieldsbooleantrue adds employer-provided extra fields (department, compensation details, qualifications…) with their original source path.
limitintegerJobs per page, 1–1000. Default 100.
cursorstringThe next_cursor from the previous page.

Example

bash
curl "https://api.thejobsapi.com/v1/jobs?q=%22software%20engineer%22&province=ON,QC&remote=true&has_salary=true&limit=20" \
  -H "Authorization: Bearer $THEJOBSAPI_KEY"

Response

json
{
  "jobs": [ /* job objects */ ],
  "next_cursor": "1834"
}

next_cursor is null when there are no more results. Cursors are stable while you page, so new jobs arriving meanwhile don't shift your results.

The job object

json
{
  "id": 1,
  "title": "Enterprise Account Executive, West",
  "organization": "Dialogue",
  "url": "https://ats.rippling.com/dialogue-en/jobs/40528552-…",
  "apply_url": null,
  "source": "rippling",
  "source_type": "ats",
  "board": "dialogue-en",
  "status": "active",
  "posted_at": "2026-09-28T17:18:27.000Z",
  "first_seen_at": "2026-10-09T04:34:47.000Z",
  "updated_at": "2026-10-09T04:34:47.000Z",
  "expired_at": null,
  "valid_through": null,
  "locations": [{
    "label": "Vancouver, BC", "city": "Vancouver", "province": "BC", "country": "CA",
    "postal_code": null, "latitude": 49.24966, "longitude": -123.11934, "precision": "city"
  }],
  "remote": true,
  "work_arrangement": "remote",
  "employment_types": ["FULL_TIME"],
  "salary": { "min": 102960, "max": 120120, "currency": "CAD", "period": "YEAR", "source": "employer" }
}
  • url is the original posting; apply_url is set when the employer publishes a separate application link.
  • locations lists every Canadian location. precision says how exact the coordinates are.
  • salary is present only when the employer stated it. period is HOUR, DAY, WEEK, MONTH or YEAR.
  • first_seen_at is when we first collected the job; posted_at is the employer's date when published.