Jobs API

Search and retrieve jobs from the companies Recuity tracks for your workspace.

EndpointPurpose
GET /api/v1/jobsSearch tracked jobs with filters
GET /api/v1/jobs/{job_id}/detailsFull job details including HTML description
GET /api/v1/jobs/exportBulk export all tracked jobs as .jsonln.gz

Search jobs

GET/api/v1/jobs

Search and filter jobs across all companies you are tracking. q is required; every other parameter is optional and they can be combined. Results are paginated, 10 jobs per page. To pass several values for a list parameter, repeat it (e.g. job_types=FullTime&job_types=Permanent). An invalid request, such as a missing q, returns 400 Bad Request with a message.

https://recuity.ai/api/v1/jobs

Query: keyword and location

ParameterTypeRequiredDescription
qStringYesJob search query, 1 to 100 characters
locationStringNoLocation (e.g. Amsterdam), up to 50 characters
ccStringNoISO2 country code (e.g. GB, US)
distanceNumberNoKilometres from location, above 0 and capped at 100 (ignored if no location)
location_typeString listNoOnsite, Hybrid, Remote

Filters: role, company and package

ParameterTypeRequiredDescription
job_typesString listNoFullTime, PartTime, Contractor, Freelance, Apprenticeship, Temporary, Internship, Volunteer, Seasonal, Permanent, FixedTerm, TempToHire, ZeroHours
seniority_levelString listNoEntryLevel, MidLevel, SeniorLevel, Manager, Director, Executive
salaryNumberNoYearly salary (e.g. 50000). Returns jobs whose yearly salary range includes it, plus jobs that list no salary
experienceNumberNoYears of experience, 0 to 49. Returns jobs whose required experience range includes it, plus jobs that state none
company_typeStringNoStartup, SME, Enterprise, Government, Education, NonProfit
job_attributesString listNoInsideIR35, OutsideIR35, SponsorVisa

Filters: recency and paging

ParameterTypeRequiredDescription
discovery_periodNumberNoDays to look back (e.g. 1 = last day), above 0 and capped at 90
pageNumberNoPage number, default 1

Example request

curl -X GET \
  "https://recuity.ai/api/v1/jobs?q=software+developer&location=London&job_types=FullTime" \
  -H "X-API-Key: YOUR_API_KEY"
import requests

response = requests.get(
    "https://recuity.ai/api/v1/jobs",
    headers={"X-API-Key": "YOUR_API_KEY"},
    params={
        "q": "software developer",
        "location": "London",
        "job_types": "FullTime",
        "page": 1
    }
)
data = response.json()

Example response

200 OK
{
  "jobs": [
    {
      "id": "692b28c40d5a1bfeb891e362",
      "job_title": "Senior Software Engineer",
      "company_name": "TechCorp Solutions",
      "location": "London",
      "location_type": "Remote",
      "seniority_level": "SeniorLevel",
      "job_types": ["Permanent", "FullTime"],
      "min_salary": 80000,
      "max_salary": 120000,
      "salary_currency": "GBP",
      "posted_date": "2026-01-15T00:00:00Z"
    }
  ],
  "total_pages": 15,
  "current_page": 1,
  "total_results": 142,
  "location_highlight": "London, GB",
  "country_name": "United Kingdom"
}

Response object

FieldTypeDescription
jobsArrayArray of job objects
total_pagesNumberTotal number of pages
current_pageNumberCurrent page number
total_resultsNumberTotal number of results
location_highlightStringHuman-readable location description
country_nameStringCountry name (nullable)

Job object fields

FieldTypeDescription
idStringUnique job identifier
job_titleStringJob title
company_nameStringCompany name
company_urlStringCompany website URL
company_logoStringCompany logo image URL (nullable)
highlightStringJob description excerpt
job_urlStringJob posting URL
locationStringJob location
location_typeStringOnsite, Hybrid, Remote
company_typeStringCompany type
job_typesArrayEmployment types (e.g. FullTime, Permanent)
job_attributesArrayAdditional attributes (e.g. SponsorVisa, InsideIR35)
required_skillsArrayList of required skills
seniority_levelStringEntryLevel, MidLevel, SeniorLevel, Manager, Director, Executive
job_functionStringJob function / department
min_required_experienceNumberMinimum years of experience
max_required_experienceNumberMaximum years of experience
required_educationArrayRequired education qualifications
certificationsArrayRequired certifications
languagesArrayRequired languages
min_salaryNumberMinimum salary (nullable)
max_salaryNumberMaximum salary (nullable)
salary_currencyStringSalary currency code (e.g. GBP)
salary_periodStringSalary period (e.g. per-year)
posted_dateStringJob posting date (ISO 8601)
closing_dateStringApplication closing date (nullable, ISO 8601)
industry_sectorsArrayIndustry sectors

Retrieve a job

GET/api/v1/jobs/{job_id}/details

Retrieve full details for a specific job, including the complete job description in HTML format. Returns 404 Not Found if no job with that ID is found for your workspace.

https://recuity.ai/api/v1/jobs/{job_id}/details

Path parameters

ParameterTypeRequiredDescription
job_idStringYesUnique job identifier from the job search response

Example request

curl -X GET \
  "https://recuity.ai/api/v1/jobs/692b28c40d5a1bfeb891e362/details" \
  -H "X-API-Key: YOUR_API_KEY"
import requests

job_id = "692b28c40d5a1bfeb891e362"
response = requests.get(
    "https://recuity.ai/api/v1/jobs/" + job_id + "/details",
    headers={"X-API-Key": "YOUR_API_KEY"}
)
data = response.json()

Example response

200 OK
{
  "id": "692b28c40d5a1bfeb891e362",
  "job_title": "Senior Software Engineer",
  "company_name": "TechCorp Solutions",
  "company_url": "https://techcorp-solutions.com",
  "description": "<p>We are looking for…</p>",
  "job_url": "https://techcorp-solutions.com/careers/1042",
  "location_names": ["London", "Reading"],
  "location_type": "Hybrid",
  "job_types": ["Permanent", "FullTime"],
  "posted_date": "2026-01-15T00:00:00Z",
  "closing_date": null
}

Response fields

FieldTypeDescription
idStringUnique job identifier
job_titleStringJob title
company_nameStringCompany name
company_urlStringCompany website URL
descriptionStringFull job description in encoded HTML, ready for display in a web UI
job_urlStringJob posting URL
location_namesArrayArray of location names associated with the job
posted_dateStringJob posting date (ISO 8601)
closing_dateStringApplication closing date (nullable, ISO 8601)
job_typesArrayEmployment types
location_typeStringOnsite, Hybrid, Remote
company_typeStringCompany type
job_attributesArrayAdditional job attributes
company_summaryStringBrief summary about the company
industry_sectorsArrayIndustry sectors
required_skillsArrayList of required skills
seniority_levelStringRequired seniority level
job_functionStringJob function / department
min_required_experienceNumberMinimum years of experience
max_required_experienceNumberMaximum years of experience
required_educationArrayRequired education qualifications
certificationsArrayRequired certifications
languagesArrayRequired languages
min_salaryNumberMinimum salary (nullable)
max_salaryNumberMaximum salary (nullable)
salary_currencyStringSalary currency code
salary_periodStringSalary period (e.g. per-year)

JSONL export

GET/api/v1/jobs/export

Bulk export all tracked jobs as a compressed JSON Lines file. The endpoint returns a pre-signed download URL rather than the data itself.

Search or export? Use job search when you need a filtered slice of jobs on demand: a query, a location, a page of results. Use the export when you want the whole tracked dataset to load into your own database or pipeline, and re-run it periodically with If-Modified-Since so you only download when something changed.
https://recuity.ai/api/v1/jobs/export

Optional header

HeaderTypeRequiredDescription
If-Modified-SinceDateTimeNoReturns 304 if no jobs updated since this time. Format: Fri, 20 Jan 2026 10:00:00 GMT

Example request

curl -X GET \
  "https://recuity.ai/api/v1/jobs/export" \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "If-Modified-Since: Fri, 20 Jan 2026 10:00:00 GMT"
import requests

response = requests.get(
    "https://recuity.ai/api/v1/jobs/export",
    headers={
        "X-API-Key": "YOUR_API_KEY",
        "If-Modified-Since": "Fri, 20 Jan 2026 10:00:00 GMT"
    }
)

if response.status_code == 304:
    # Nothing has changed since If-Modified-Since; there is no body to read.
    print("No new jobs")
else:
    result = response.json()
    download_url = result["url"]

Example response

200 OK
{
  "url": "https://s3-storage.example.com/jobs-export/live_jobs.jsonln.gz?…",
  "expiry": "2026-01-23T21:23:26Z",
  "jobs_updated_at": "2026-01-23T18:27:47Z"
}

Response fields

FieldTypeDescription
urlStringPre-signed URL to download the .jsonln.gz file
expiryStringURL expiration timestamp (ISO 8601). Download must complete before this time.
jobs_updated_atStringTimestamp when the job data was last updated (ISO 8601)

File format

JSON Lines (.jsonln.gz), gzip-compressed. Each line is a complete JSON job object, so process line-by-line rather than loading the file as a JSON array.

HTTP response codes

CodeDescription
200 OKSuccess. Returns export URL with job data.
304 Not ModifiedNo jobs modified since the If-Modified-Since timestamp.
404 Not FoundNo job data available for export.