// freehire API

API reference

A read-first, open HTTP API over the freehire job catalogue — query jobs by rich filters, read companies, and (with a key) track applications.

Base URL https://freehire.dev/api/v1

Base URL

All endpoints are served under https://freehire.dev/api/v1. The API is read-first and open: the job, search, facet, and company endpoints need no authentication and may be called cross-origin.

Authenticated endpoints accept either the browser session cookie (set by sign-in, same-origin) or a personal API key sent as a Bearer token — see Authentication and API keys below.

Response envelope

Single items are wrapped as { "data": ... }. Collections add pagination metadata: { "data": [...], "meta": { "total", "limit", "offset" } }. Errors are { "error": "message" } with a matching HTTP status.

json
{ "data": { "...": "single item" } }

{ "data": [ ... ], "meta": { "total": 4213, "limit": 20, "offset": 0 } }

{ "error": "job not found" }

Pagination

List and search endpoints page with limit (default 20, max 100) and offset (default 0). meta.total reports the total matching the current filters, so you can compute the number of pages.

Search pagination is bounded: offset + limit may not exceed 10000 (pagination too deep → 400). This is deep-paging protection, not a cap on the reported total — use filters to narrow rather than paging that far.

Errors

Errors use standard HTTP status codes: 400 (bad request / invalid value), 401 (missing or invalid credentials), 403 (authenticated but not allowed, e.g. a non-moderator), 404 (no such job, company, or owned resource), and 503 (search temporarily unavailable). The body is always { "error": ... }.

Authentication model

Browser clients authenticate with an HttpOnly session cookie set on sign-in (same-origin; the SPA cannot read it). Non-browser clients use a personal API key as Authorization: Bearer <token>.

Endpoints marked “Session or API key” accept either; endpoints marked “Session only” (API-key management, saved searches, subscriptions) accept only the cookie, so a leaked key cannot manage credentials. “Moderator” endpoints additionally require the moderator role.

Filtering jobs

These parameters apply to GET /jobs/search and GET /jobs/facets. Combine any of them with full-text q.

Modifiers — apply to every facet

  • Repeat any facet param to OR its values: skills=go&skills=rust matches either.
  • Add <param>_mode=and to require all selected values: skills=go&skills=rust&skills_mode=and matches both.
  • Add <param>_exclude=<value> to exclude matches: company_type_exclude=outstaff drops outstaff jobs.
  • Different facets are ANDed together; numeric and boolean filters are ANDed too.
  • Use regions=none to match jobs with no resolved geography (an empty region set); it ORs with real region values and supports _exclude like any region.

Facets

Every facet below supports repeat-OR, _mode=and, and _exclude as described above.

ParamFilterValues
collectionsCollectionyc, techstars, european, ai, mag7, bigtech, unicorn, fortune500, eastern-roots, ai-native
regionsRegionglobal, north_america, latam, eu, uk, mena, africa, apac, cis, none
work_modeWork formatremote, hybrid, onsite
is_techTech / Non-techtech, non_tech
roleRoleOpen vocabulary — call /jobs/facets for live values
categorySpecializationbackend, frontend, fullstack, mobile, devops, sre, network_engineering, data_engineering, data_science, data_analytics, ml_ai, ai_engineering, qa, security, hardware, embedded, blockchain, architecture, design, product, project_management, management, marketing, sales, support, business_analysis, solutions_engineering, developer_relations, technical_writing, recruiting, hr, finance, legal, operations, customer_success, other
senioritySeniorityintern, junior, middle, senior, lead, staff, principal, c_level
skillsSkillsOpen vocabulary — call /jobs/facets for live values
domainsIndustryfintech, crypto, ecommerce, gambling, gamedev, media, travel, healthcare, edtech, govtech, devtools, cybersecurity, ai, hrtech, adtech, proptech, logistics, mobility, climatetech, other
company_typeCompany typeproduct, startup, outsource, outstaff, agency, inhouse, government
countriesCountriesOpen vocabulary — call /jobs/facets for live values
citiesCityOpen vocabulary — call /jobs/facets for live values
relocationRelocationnot_supported, supported, required
employment_typeEmploymentfull_time, part_time, contract, internship
english_levelEnglishnone, a1, a2, b1, b2, c1, c2, native
posting_languageJob languageOpen vocabulary — call /jobs/facets for live values
realityPosting realityfresh, stale, likely-evergreen
salary_currencyCurrencyUSD, EUR, GBP, RUB
company_slugCompanyOpen vocabulary — call /jobs/facets for live values
sourceSourceOpen vocabulary — call /jobs/facets for live values
company_sizeCompany size1-10, 11-50, 51-200, 201-500, 501-1000, 1000+
education_levelEducation levelnone, bachelor, master, phd
salary_periodSalary periodyear, month, day, hour

Numeric & boolean filters

ParamFilterValues
visa_sponsorshipVisa sponsorshiptrue, false
salary_minMinimum salaryinteger — jobs whose minimum salary is at least this (pair with salary_currency)
salary_maxMaximum salaryinteger — jobs whose maximum salary is at most this (pair with salary_currency)
experience_years_minMinimum experienceinteger — jobs requiring at least this many years
posted_within_daysPosted withininteger — jobs whose effective posting date falls in the last N days

Recipes

Senior Go, remote, in the CIS region

?q=go&seniority=senior&work_mode=remote&regions=cis

Backend roles, freshest first, in Germany

?category=backend&countries=DE&sort=posted_at&order=desc

Must use both Go and Rust

?skills=go&skills=rust&skills_mode=and

Exclude outstaff companies

?company_type_exclude=outstaff

At least $100k, with visa sponsorship

?salary_currency=USD&salary_min=100000&visa_sponsorship=true

Endpoints

Every endpoint has its own page. Pick one below or from the sidebar.

Job interactions