Greenhouse API: List company jobs
Lists open jobs on a company's Greenhouse job board, with optional department and location filters.
Unofficial. Not affiliated with or endorsed by Greenhouse.
Inputs
Values from the run on Oct 23, 2026, shown under Output.
- Company, required
company Company name, for example Airbnb.
Airbnb
- Location optional
location Optional place words to match loosely, for example San Francisco.
Not set
- Department optional
department Optional department words to match loosely, for example Engineering.
Not set
- Max Results optional
max_results Maximum matching jobs to return, for example 100.
100 (default)
Whole number from 1 to 500.
Input as JSON
{ "company": "Airbnb"}Output
{ "jobs": [ { "title": "Office Manager, Mexico City", "job_link": "https://careers.airbnb.com/positions/8038161?gh_jid=8038161" , "location": "Mexico City, Mexico", "department": "Administrative", "last_updated_date": "2026-10-21" }, { "title": "Lead Advanced Analyst, Integrated Marketing", "job_link": "https://careers.airbnb.com/positions/8207084?gh_jid=8207084" , "location": "United States", "department": "Analytics", "last_updated_date": "2026-09-29" }, { "title": "Lead Advanced Analytics, Community Support", "job_link": "https://careers.airbnb.com/positions/8023118?gh_jid=8023118" , "location": "Bengaluru, India", "department": "Analytics", "last_updated_date": "2026-10-09" } ], "company": "Airbnb", "total_open_jobs": 193}Code
curl https://api.fous.com/v1/runs \ -H "Authorization: Bearer $FOUS_API_KEY" \ -H "Content-Type: application/json" \ -d '{"method":"boards.greenhouse.io/list_company_jobs","input":{"company":"Airbnb"}}' # Save as fous.py, then run: python3 fous.pyimport json, os, timefrom urllib.error import HTTPErrorfrom urllib.request import Request, urlopenAPI = "https://api.fous.com/v1/runs" KEY = os.environ["FOUS_API_KEY"]HEADERS = { "Authorization": f"Bearer {KEY}", "Content-Type": "application/json" ,}def call(url, body=None): data = json.dumps(body).encode() if body else None request = Request(url, data, HEADERS) try: with urlopen(request, timeout=120) as r: return r.status, json.load(r) except HTTPError as error: message = json.load(error)["error"]["message"] raise RuntimeError(message) from errorstatus, run = call(API, { "method": "boards.greenhouse.io/list_company_jobs" , "input": { "company": "Airbnb" }})# 202: still going after 30 s. Ask again until it ends.while status == 202: time.sleep(2) status, run = call(f"{API}/{run['id']}")print(json.dumps(run["data"], indent=2))// Save as fous.mjs, then run: node fous.mjsconst api = "https://api.fous.com/v1/runs" ;const headers = { Authorization: `Bearer ${process.env.FOUS_API_KEY}`, "Content-Type": "application/json" ,};let response = await fetch(api, { method: "POST", headers, body: JSON.stringify({ "method": "boards.greenhouse.io/list_company_jobs" , "input": { "company": "Airbnb" } }), signal: AbortSignal.timeout(120_000),});let run = await response.json();// 202: still going after 30 s. Ask again until it ends.while (response.status === 202) { await new Promise((done) => setTimeout(done, 2_000)); response = await fetch(`${api}/${run.id}`, { headers }); run = await response.json();}if (!response.ok) throw new Error(run.error.message);console.log(run.data);# Connect your agent to Fous once, over MCP (Streamable HTTP):# https://api.fous.com/mcp# Set FOUS_API_KEY first: create a key at https://app.fous.com/keys.# Claude Codeclaude mcp add \ --scope user \ --transport http fous https://api.fous.com/mcp \ --header "Authorization: Bearer ${FOUS_API_KEY:?Set FOUS_API_KEY to your Fous API key}"# Codexcodex mcp add fous \ --url https://api.fous.com/mcp \ --bearer-token-env-var FOUS_API_KEY# Cursor, VS Code, Windsurf, Cline and morenpx -y add-mcp https://api.fous.com/mcp -g -n fous \ --header "Authorization: Bearer ${FOUS_API_KEY:?Set FOUS_API_KEY to your Fous API key}"# Then ask your agent:# "Use Fous to run boards.greenhouse.io/list_company_jobs# with {"company":"Airbnb"}"Over HTTP, the answer’s data holds the output. A run still going after 30 seconds answers 202 with its id: ask GET /v1/runs/{id} until it ends.
Schema
Input schema
{ "type": "object", "required": [ "company" ], "properties": { "company": { "type": "string", "minLength": 1, "description": "Company name, for example Airbnb." }, "location": { "type": "string", "description": "Optional place words to match loosely, for example San Francisco." }, "department": { "type": "string", "description": "Optional department words to match loosely, for example Engineering." }, "max_results": { "type": "integer", "default": 100, "maximum": 500, "minimum": 1, "description": "Maximum matching jobs to return, for example 100." } }, "additionalProperties": false}Output schema
{ "type": "object", "required": [ "company", "total_open_jobs", "jobs" ], "properties": { "jobs": { "type": "array", "items": { "type": "object", "required": [ "title", "department", "location", "last_updated_date", "job_link" ], "properties": { "title": { "type": "string" }, "job_link": { "type": "string" }, "location": { "type": [ "string", "null" ] }, "department": { "type": [ "string", "null" ] }, "last_updated_date": { "type": [ "string", "null" ], "description": "Last update in YYYY-MM-DD format." } }, "additionalProperties": false }, "description": "Matching open jobs, sorted by department then title." }, "company": { "type": "string", "description": "Company name shown on the job board." }, "total_open_jobs": { "type": "integer", "description": "Number of open jobs on the board before filtering." } }, "additionalProperties": false}- Price
- 1 credit per completed run (1¢ with pay as you go); failed runs are free.
- Method
boards.greenhouse.io/list_company_jobs- Returns
- open jobs with title, department, location, last update date and link
Use it from your agent
Give your agent this line. It reads SKILL.md, gets a Fous API key and connects the Fous MCP server. Its run then takes the method boards.greenhouse.io/list_company_jobs with the inputs above.
Ask your agent
- Show me open engineering jobs at Airbnb in San Francisco
- What open roles does Stripe have in the sales department?
- List current job openings at Figma with their locations and last updated dates
- Find remote marketing positions at Notion on their careers board
- Give me up to 20 open job postings at Databricks in New York with links
See more
All Greenhouse methodsGets the full text of one public Greenhouse job from its link, or from a company and job title. The pay range is included when the posting states one.
greenhouse.io/get_jobLists open LinkedIn jobs posted by a named company, with optional location and result limit. Workplace type is returned only when LinkedIn displays it.
linkedin.com/list_company_jobsLists open jobs on a company's Lever job board, with optional team, location and workplace filters.
jobs.lever.co/list_company_jobsLists a company's public Workday jobs, optionally narrowed by keywords and location, newest first with exact posting dates among up to 500 checked postings. Workday may cap the reported total at 2,000; location totals reflect checked postings.
myworkdayjobs.com/list_company_jobsSearches Remote OK jobs by role or skill. Results can be filtered by listed region and by minimum annual USD salary.
remoteok.com/search_jobsSearches public LinkedIn job listings by keywords and location, with optional date, seniority, employment type and company filters.
linkedin.com/search_jobsSearches open Indeed jobs by keywords, location, country, posting age and job type, returning public first-page results in displayed order.
indeed.com/search_jobsLists top-level job posts from a monthly Ask HN: Who is hiring? thread in thread order, with post text and the company, roles, location, work arrangement, salary and application contact inferred from each post.
news.ycombinator.com/list_hiring_posts