{
  "openapi": "3.0.1",
  "info": {
    "title": "Hacker News Who Is Hiring Scraper - Structured Jobs",
    "description": "Parse HN 'Who is hiring?' and the HN jobs board (YC ads with salary & equity) into structured jobs: tech stack, remote, seniority, company leads, trends, plus a live still-hiring check. $2 / 1,000 results.",
    "version": "1.0",
    "x-build-id": "fPht7L8RJPH2srMr3"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/signalscope-data~hn-hiring-parser/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-signalscope-data-hn-hiring-parser",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/signalscope-data~hn-hiring-parser/runs": {
      "post": {
        "operationId": "runs-sync-signalscope-data-hn-hiring-parser",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/signalscope-data~hn-hiring-parser/run-sync": {
      "post": {
        "operationId": "run-sync-signalscope-data-hn-hiring-parser",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "properties": {
          "months": {
            "title": "Number of most recent months",
            "minimum": 1,
            "maximum": 120,
            "type": "integer",
            "description": "How many of the latest monthly threads to parse (1 = current month only). Ignored when 'Specific thread URLs' is filled.",
            "default": 1
          },
          "threadUrls": {
            "title": "Specific thread URLs (optional)",
            "type": "array",
            "description": "Parse these threads instead, e.g. \"https://news.ycombinator.com/item?id=49922569\" or just \"49922569\". Use for older months or any HN thread whose top-level comments are job posts.",
            "items": {
              "type": "string"
            }
          },
          "includeWhoIsHiring": {
            "title": "Who is hiring? threads (job posts)",
            "type": "boolean",
            "description": "Parse the monthly \"Ask HN: Who is hiring?\" threads (companies posting jobs).",
            "default": true
          },
          "includeWhoWantsToBeHired": {
            "title": "Who wants to be hired? threads (candidates)",
            "type": "boolean",
            "description": "Also parse \"Ask HN: Who wants to be hired?\" threads: location, remote, relocation and technologies of candidates. Emails, phone numbers, résumé and profile links are removed (no personal contact data is output).",
            "default": false
          },
          "includeFreelancer": {
            "title": "Freelancer? Seeking freelancer? threads",
            "type": "boolean",
            "description": "Also parse the \"Freelancer? Seeking freelancer?\" threads (posted irregularly). Personal contact data is removed.",
            "default": false
          },
          "includeJobBoard": {
            "title": "HN jobs board (YC startup job ads)",
            "type": "boolean",
            "description": "Also collect the job ads YC startups post on the Hacker News jobs board (news.ycombinator.com/jobs, e.g. \"Acme (YC W24) Is Hiring a Founding Engineer\"): company, YC batch, role, location, remote, apply link — plus salary, equity range, visa, minimum experience, skills, team size and founding year from the linked YC job page. Same filters and price as thread posts.",
            "default": false
          },
          "jobBoardOnly": {
            "title": "Jobs board only",
            "type": "boolean",
            "description": "Collect only HN jobs board ads and skip the monthly threads.",
            "default": false
          },
          "jobBoardDays": {
            "title": "Jobs board: posted within (days)",
            "minimum": 1,
            "maximum": 3650,
            "type": "integer",
            "description": "How far back to collect jobs board ads (1-3650 days). About 40-60 ads are posted per month.",
            "default": 30
          },
          "jobBoardDetails": {
            "title": "Jobs board: read the linked job page",
            "type": "boolean",
            "description": "Open each ad's link to add structured details: YC job pages (salary, equity, visa, experience, skills, company facts) or any page with schema.org JobPosting data (e.g. Greenhouse, Lever, company career pages). Also reports whether the listing is still open. Turn off for a faster run with title-only data.",
            "default": true
          },
          "outputFormat": {
            "title": "Output format",
            "enum": [
              "posts",
              "companies"
            ],
            "type": "string",
            "description": "'One row per company' merges all matching 'Who is hiring?' posts of the same company (matched by name and website) into a single lead row: post count, months posted, all roles, locations, tech stack, yearly salary range, apply links and — with hiring history — hiring status (new / returning / consistent). Each company row is billed as one result.",
            "default": "posts"
          },
          "keywords": {
            "title": "Keywords",
            "type": "array",
            "description": "Output only posts containing ANY of these words or phrases (case-insensitive), e.g. \"rust\", \"founding engineer\", \"fintech\". Empty = all posts.",
            "items": {
              "type": "string"
            }
          },
          "remoteOnly": {
            "title": "Remote only",
            "type": "boolean",
            "description": "Output only posts that offer remote work (including remote-or-onsite posts).",
            "default": false
          },
          "locations": {
            "title": "Locations",
            "type": "array",
            "description": "Output only posts mentioning ANY of these locations in the location fields or headline, e.g. \"NYC\", \"Berlin\", \"Europe\", \"Canada\".",
            "items": {
              "type": "string"
            }
          },
          "techs": {
            "title": "Technologies",
            "type": "array",
            "description": "Output only posts using ANY of these technologies, e.g. \"Rust\", \"TypeScript\", \"Kubernetes\", \"PyTorch\".",
            "items": {
              "type": "string"
            }
          },
          "minSalary": {
            "title": "Minimum yearly salary",
            "minimum": 0,
            "type": "integer",
            "description": "Output only posts with a parsed yearly salary whose upper bound is at least this amount (in the post's currency). Posts without a salary are excluded when set. 0 = no filter."
          },
          "seniority": {
            "title": "Seniority",
            "type": "array",
            "description": "Output only job posts whose roles mention ANY of these seniority levels (detected from the role titles). Posts that don't state a level are excluded when set. Empty = all.",
            "items": {
              "type": "string",
              "enum": [
                "intern",
                "junior",
                "mid",
                "senior",
                "staff",
                "principal",
                "lead",
                "founding",
                "manager",
                "director",
                "executive"
              ],
              "enumTitles": [
                "Intern / co-op",
                "Junior / new grad",
                "Mid-level",
                "Senior",
                "Staff",
                "Principal",
                "Lead / tech lead",
                "Founding engineer / first hire",
                "Manager",
                "Director / Head of / VP",
                "Executive (CTO, Chief…)"
              ]
            }
          },
          "roleCategories": {
            "title": "Role categories",
            "type": "array",
            "description": "Output only job posts hiring for ANY of these role categories (classified from the role titles; one post can have several). Empty = all.",
            "items": {
              "type": "string",
              "enum": [
                "software-engineering",
                "backend",
                "frontend",
                "fullstack",
                "mobile",
                "ml-ai",
                "data",
                "devops-infra",
                "security",
                "embedded-hardware",
                "qa-testing",
                "engineering-management",
                "research",
                "design",
                "product",
                "sales",
                "marketing",
                "customer-success",
                "operations"
              ],
              "enumTitles": [
                "Software engineering (general)",
                "Backend",
                "Frontend",
                "Full-stack",
                "Mobile (iOS/Android)",
                "ML / AI",
                "Data (engineering, science, analytics)",
                "DevOps / SRE / Infrastructure",
                "Security",
                "Embedded / Hardware / Robotics",
                "QA / Testing",
                "Engineering management",
                "Research",
                "Design / UX",
                "Product management",
                "Sales / Solutions engineering",
                "Marketing / Growth / DevRel",
                "Customer success / Support",
                "Operations / Finance / Recruiting / Legal"
              ]
            }
          },
          "companyStages": {
            "title": "Company stage",
            "type": "array",
            "description": "Output only job posts whose text states ANY of these funding stages (e.g. \"we just raised our Series A\"). Posts that don't mention their stage are excluded when set. Empty = all.",
            "items": {
              "type": "string",
              "enum": [
                "pre-seed",
                "seed",
                "series",
                "series-a",
                "series-b",
                "series-c",
                "series-d",
                "series-e",
                "public",
                "bootstrapped",
                "profitable"
              ],
              "enumTitles": [
                "Pre-seed",
                "Seed",
                "Any Series (A–F)",
                "Series A",
                "Series B",
                "Series C",
                "Series D",
                "Series E",
                "Public company",
                "Bootstrapped",
                "Says it is profitable"
              ]
            }
          },
          "equityOnly": {
            "title": "Only posts offering equity",
            "type": "boolean",
            "description": "Output only posts that mention equity, stock options, ESOP or RSUs.",
            "default": false
          },
          "includeTrends": {
            "title": "Add market trends report",
            "type": "boolean",
            "description": "Also output one 'market-trends' row per monthly 'Who is hiring?' thread: matching posts vs all posts, remote/onsite/hybrid, visa and equity share, salary p25/median/p75 per currency (yearly), top 30 technologies with rank and share change vs the previous month, role categories, seniority, top locations and funding stages — plus one 'market-trends-summary' row (rising and falling technologies) when 2+ months are covered. Your filters define the segment, e.g. Technologies = Rust gives the Rust job market. The previous month is fetched for comparison at no extra charge. Billed as one trend report per row.",
            "default": false
          },
          "trendsOnly": {
            "title": "Market trends only (no job rows)",
            "type": "boolean",
            "description": "Output only the market trends rows (no job post / company rows are output or charged). Use with 'Number of most recent months' = 6–12 for a hiring-market report.",
            "default": false
          },
          "hiringHistoryMonths": {
            "title": "Company hiring history (months)",
            "minimum": 0,
            "maximum": 36,
            "type": "integer",
            "description": "Enrich each job post with how often the company has posted in the last N monthly 'Who is hiring?' threads: companyMonthsHiring, companyHiringStreak (consecutive months), companyFirstSeenMonth, companyHiringMonths and isNewToHnHiring. Great for lead generation (who is hiring repeatedly vs. for the first time). 0 = off. Adds ~2–4 s per month of history; no extra charge.",
            "default": 0
          },
          "onlyNewCompanies": {
            "title": "Only companies new to HN hiring",
            "type": "boolean",
            "description": "Output only posts from companies that did not post in any earlier thread within the history window (uses 12 months if 'Company hiring history' is 0). First-time HN posters are often freshly funded startups.",
            "default": false
          },
          "verifyOpenRoles": {
            "title": "Check live open roles on the company's job board",
            "type": "boolean",
            "description": "For posts that link a public job board (Greenhouse, Lever, Ashby, Workable, SmartRecruiters, Recruitee or Workday), read that board now and add: stillHiring, liveOpenRoles, liveMatchingRoles (open roles in the same categories as the post), liveRemoteRoles, liveRolesSincePost, liveRolesLast30Days and up to 15 liveRoleTitles. One request per company, no extra charge. Every post always gets atsProvider / atsBoard / atsBoardUrl.",
            "default": false
          },
          "onlyStillHiring": {
            "title": "Only companies still hiring (live check)",
            "type": "boolean",
            "description": "Output only posts whose company has at least one open role on its job board right now (turns on the live check). Posts without a checkable job board link are excluded. Useful for older threads: skip companies that have stopped hiring.",
            "default": false
          },
          "includeNonJobComments": {
            "title": "Include non-job comments",
            "type": "boolean",
            "description": "By default, meta comments (complaints, questions, 'thanks everyone') in hiring threads are skipped and not charged. Enable to output every top-level comment.",
            "default": false
          },
          "onlyNewPosts": {
            "title": "Only new posts since last run",
            "type": "boolean",
            "description": "Remember which posts were already seen and output only new ones. Ideal for a daily schedule: posts keep arriving all month and you never pay twice for the same post.",
            "default": false
          },
          "stateKey": {
            "title": "Monitor name",
            "type": "string",
            "description": "Used with 'Only new posts'. Use a different name for each separate monitor/schedule (e.g. one per filter set).",
            "default": "default"
          },
          "maxItems": {
            "title": "Max results",
            "minimum": 0,
            "type": "integer",
            "description": "Stop after this many results (0 = no limit). Useful to cap cost.",
            "default": 0
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}