// HireAll API

API reference

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

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

Base URL

All endpoints are served under https://freehire.me/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.

What is not here

This reference covers every endpoint you can call. A handful are deliberately left out because calling them directly is meaningless: the Gmail and calendar consent redirects (/me/gmail/connect, /me/calendar/connect, and their callbacks), which only a browser can complete; the Telegram bot webhook and the Discord interaction webhook; the browser-tool websocket relay; the sitemap-cursor helpers behind /sitemap.xml; and the /og/*.png social-preview cards, which render an image rather than answer with JSON.

The /jobs/{slug}/fit endpoints are pre-rename aliases of /jobs/{slug}/match-analysis and hit the same handlers. They still work, so existing clients do not break — use the match-analysis paths in new code.

Most of this API is also a CLI. If you are writing an agent rather than an integration, HireAll covers the same surface with less ceremony — search, tracking, the inbox and CV tailoring — over one API key.

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

  • Pass multiple values as a comma-separated list to OR them: skills=go,rust matches either. Repeating the param (skills=go&skills=rust) also works.
  • Add <param>_mode=and to require all selected values: skills=go,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. The geography facets are the one exception — see below.
  • Geography is a single OR group: regions, countries and cities widen each other instead of narrowing. regions=eu&countries=IT means "in Europe **or** in Italy", so it returns everything regions=eu alone would. To search one country, drop the region: countries=IT. The three name a single concept — *where* — so picking two places reads as "either", which is what makes regions=eu&countries=BR ("Europe or Brazil") useful. There is no AND to switch on: _mode=and does not apply to geography.
  • 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.
  • A param no filter reads is ignored rather than refused — so old links and saved searches keep working — and comes back in meta.ignored_params, with did_you_mean when it is only the singular of a real facet. Check it: a dropped filter otherwise looks like a genuinely broad result. At most 10 are listed per response. The same report rides on /jobs/facets, /market/coverage and /companies, which answer {"data": ...} and grow a meta block only when there is something to warn about. /companies filters on its own vocabulary, so a jobs facet sent there is reported as ignored.

Facets

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

ParamFilterValues
collectionsCollectionyc, techstars, a16z-portfolio, a16z-speedrun, european, ai, mag7, bigtech, unicorn, fortune500, eastern-roots, indian-roots, ai-native, uk-skilled-worker-sponsor, nl-recognised-sponsor, us-h1b-sponsor
regionsRegionglobal, north_america, latam, eu, uk, mena, africa, apac, cis, none
work_modeWork formatremote, hybrid, onsite
roleRoleOpen vocabulary — call /jobs/facets for live values
categorySpecializationsoftware_engineering, backend, frontend, fullstack, mobile, devops, sre, network_engineering, data_engineering, data_science, data_analytics, ml_ai, ai_engineering, qa, security, hardware, embedded, blockchain, architecture, design, engineering_design, product, project_management, management, marketing, sales, support, business_analysis, solutions_engineering, developer_relations, technical_writing, recruiting, hr, finance, legal, operations, customer_success, other
ai_archetypeAI Specializationrag_app_builder, agent_builder, cloud_ml_platform_engineer, ml_trainer_researcher, fullstack_ai_engineer, devops_infra_engineer
senioritySeniorityintern, junior, middle, senior, lead, staff, principal, c_level
role_typeRole typepeople_manager — the title names a people-management role. One value only: carrying nothing means no management marker was found, NOT that the posting is individual-contributor work, so role_type_exclude means "no marker", not "IC"
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, fellowship
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
requires_clearanceSecurity clearance requiredtrue, 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
experience_years_maxMaximum experienceinteger — jobs requiring at most this many years, the same figure experience_years_min bounds from below. Use 0 for jobs stating no prior experience is required. Either bound excludes jobs that state no requirement at all
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

One country only — no region param, or it widens back out

?countries=IT&employment_type=contract

Must use both Go and Rust

?skills=go,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

Excluding jobs that need a security clearance

?requires_clearance=false

Only jobs that need a security clearance

?requires_clearance=true

Endpoints

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

Authentication

Job interactions

In-app assistant

Profile & résumé

Saved searches & subscriptions

Employee referrals

CV builder & tailoring

Application mail

Tailor your CV for this role?

We couldn't check your fit for this role — add a CV to your profile to see it next time.

A new version of HireAll is available