Hacker News API: List Who is hiring posts
Lists 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.
Unofficial. Not affiliated with or endorsed by Hacker News.
Inputs
Values from the run on Oct 31, 2026, shown under Output.
- Month optional
month Thread month, such as 2026-09 or September 2026. Leave blank for the latest available thread.
September 2026
Default
.- Keywords optional
keywords Words that must all appear in the full post, ignoring case; for example, remote Python.
remote Python
Default
.- Max Results optional
max_results Maximum number of matching posts to return, from 1 to 500; for example, 50.
50
Whole number from 1 to 500. Default
50.- Remote Only optional
remote_only Only include posts offering remote work; for example, true.
true
True or false. Default
false.
Input as JSON
{ "month": "September 2026", "keywords": "remote Python", "max_results": 50, "remote_only": true}Output
{ "job_posts": [ { "roles": "Multiple Engineering + Product Roles", "salary": null, "company": "Snout", "location": "Remote US or Ontario, Canada", "post_text": "Snout https://snout.com/ | Multiple Engineering + Product Roles | Remote US or Ontario, Canada | Full Time\nJoin us at Snout on our mission to ensure no one ever has to make a health decision for their pet based on the cash in their bank account. Snout plans pay for 100% of routine veterinary care, u…" , "posted_date": "2026-09-01", "comment_link": "https://news.ycombinator.com/item?id=49522989" , "work_arrangement": "remote", "application_contact": "https://jobs.gem.com/snoutd" }, { "roles": "AI, Full Stack, Frontend, SRE & Cloud Automation", "salary": null, "company": "GovStar", "location": "Remote (U.S. — Eastern/Central Time)" , "post_text": "GovStar | https://www.govstar.us | Remote (U.S. — Eastern/Central Time) | AI, Full Stack, Frontend, SRE & Cloud Automation | U.S. Citizens\nGovStar is hiring 5 engineers to help build secure, production-grade AI and advanced analytics capabilities supporting U.S. national security missions.\n• AI Engi…" , "posted_date": "2026-09-01", "comment_link": "https://news.ycombinator.com/item?id=49524943" , "work_arrangement": "remote", "application_contact": "nicholas.hanson@govstar.us" }, { "roles": "Senior/Staff Backend Engineer, Backend Platform" , "salary": null, "company": "Close", "location": "Remote (US)", "post_text": "Remote (US) Close ( https://close.com ) | Senior/Staff Backend Engineer, Backend Platform | Full-time\nWe're bootstrapped, profitable, and 130 people, all remote, building an AI-powered CRM. We're spinning up a new Backend Platforms team and you'd be one of the first hires — unusual influence over wh…" , "posted_date": "2026-09-08", "comment_link": "https://news.ycombinator.com/item?id=49615973" , "work_arrangement": "remote", "application_contact": "https://jobs.ashbyhq.com/close/5bf4629b-d2ee-4129-980f-e31b96185c9c" } ], "thread_link": "https://news.ycombinator.com/item?id=49522897" , "thread_title": "Ask HN: Who is hiring? (September 2026)"}Code
curl https://api.fous.com/v1/runs \ -H "Authorization: Bearer $FOUS_API_KEY" \ -H "Content-Type: application/json" \ -d '{"method":"news.ycombinator.com/list_hiring_posts","input":{"month":"September 2026","keywords":"remote Python","max_results":50,"remote_only":true}}' # 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": "news.ycombinator.com/list_hiring_posts" , "input": { "month": "September 2026", "keywords": "remote Python", "max_results": 50, "remote_only": True }})# 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": "news.ycombinator.com/list_hiring_posts" , "input": { "month": "September 2026", "keywords": "remote Python", "max_results": 50, "remote_only": true } }), 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 news.ycombinator.com/list_hiring_posts# with {"month":"September 2026","keywords":"remote Python","max_results":50,"remote_only":true}"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", "properties": { "month": { "type": "string", "default": "", "description": "Thread month, such as 2026-09 or September 2026. Leave blank for the latest available thread." }, "keywords": { "type": "string", "default": "", "description": "Words that must all appear in the full post, ignoring case; for example, remote Python." }, "max_results": { "type": "integer", "default": 50, "maximum": 500, "minimum": 1, "description": "Maximum number of matching posts to return, from 1 to 500; for example, 50." }, "remote_only": { "type": "boolean", "default": false, "description": "Only include posts offering remote work; for example, true." } }}Output schema
{ "type": "object", "required": [ "thread_title", "thread_link", "job_posts" ], "properties": { "job_posts": { "type": "array", "items": { "type": "object", "required": [ "company", "roles", "location", "work_arrangement", "salary", "post_text", "application_contact", "posted_date", "comment_link" ], "properties": { "roles": { "type": [ "string", "null" ], "description": "Job roles named in the post, if clear." }, "salary": { "type": [ "string", "null" ], "description": "Salary as written, if stated." }, "company": { "type": [ "string", "null" ], "description": "Company named in the post, if clear." }, "location": { "type": [ "string", "null" ], "description": "Location or geographic eligibility stated in the post, if clear." }, "post_text": { "type": "string", "description": "Full post in plain text." }, "posted_date": { "type": "string", "description": "Date the comment was posted." }, "comment_link": { "type": "string", "description": "Link to the comment." }, "work_arrangement": { "enum": [ "remote", "onsite", "hybrid", null ], "type": [ "string", "null" ], "description": "Remote, onsite, hybrid, or null when unclear." }, "application_contact": { "type": [ "string", "null" ], "description": "Application link or email address, if given." } } }, "description": "Matching top-level posts, in thread order." }, "thread_link": { "type": "string", "description": "Link to the monthly hiring thread." }, "thread_title": { "type": "string", "description": "Title of the monthly hiring thread." } }}- Price
- 1 credit per completed run (1¢ with pay as you go); failed runs are free.
- Method
news.ycombinator.com/list_hiring_posts- Returns
- thread title and link; per post: company, roles, location, work arrangement, salary, post text, application contact, posted date, comment 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 news.ycombinator.com/list_hiring_posts with the inputs above.
Ask your agent
- Pull the job listings from this month's Ask HN: Who is hiring? thread and give me company, role, location, salary and how to apply for each
- Find remote-only Rust positions posted in the March 2025 Hacker News hiring thread, up to 30 results
- Which companies in the latest monthly hiring thread are looking for a senior backend engineer with Go? Include pay ranges if listed
- I need up to 200 job posts from the November 2024 Who is hiring thread on news.ycombinator.com that mention machine learning and San Francisco
- Show me fully remote roles mentioning TypeScript and React from the 2025-06 hiring thread, with the contact email or application link for each
See more
All Hacker News methodsSearches Hacker News stories or comments by words, date range and sort order. Comments include their parent story's website link when one exists; text-only stories have no website link.
news.ycombinator.com/search_storiesLists current Hacker News stories in rank order from the top, newest, best, Ask HN, Show HN or jobs list.
news.ycombinator.com/list_front_pageSearches the Y Combinator company directory by keyword, industry, batch, location, hiring and status, returning companies in directory order.
ycombinator.com/search_companiesGets a Hacker News story and its comments in the order shown on the site. The story can be given as a discussion link or as words from its title. Deleted and flagged comments are left out.
news.ycombinator.com/get_discussionLooks up a Y Combinator company by name or YC company page link and returns its profile, founders, social links and open job count.
ycombinator.com/get_companySearches Remote OK jobs by role or skill. Results can be filtered by listed region and by minimum annual USD salary.
remoteok.com/search_jobsLists open jobs on a company's Greenhouse job board, with optional department and location filters.
boards.greenhouse.io/list_company_jobsSearches public LinkedIn job listings by keywords and location, with optional date, seniority, employment type and company filters.
linkedin.com/search_jobs