# Remote Tech Jobs Aggregator (HN + V2EX) (`fei.yang/remote-tech-jobs-aggregator`) Actor

Aggregate public tech-job postings from Hacker News 'Who is hiring?' and V2EX 酷工作 into one clean, filterable dataset. Only public data, no login.

- **URL**: https://apify.com/fei.yang/remote-tech-jobs-aggregator.md
- **Developed by:** [FEI Yang](https://apify.com/fei.yang) (community)
- **Categories:** Jobs, Lead generation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 job postings

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Remote Tech Jobs Aggregator — HN + V2EX

One clean dataset of **public** tech-job postings, pulled from two sources that nobody else aggregates together:

| Source | What it is | Why it matters |
|---|---|---|
| **Hacker News — "Who is hiring?"** | The monthly HN hiring thread (250+ top-level postings a month) | The highest-signal remote/startup job feed in the West |
| **V2EX 酷工作** | The "Jobs" node of V2EX, China's largest developer forum | The highest-signal job feed for the Chinese-speaking tech market |

Each posting is normalized and **classified** so you can filter without writing regex:

- `isRemote` — mentions remote / remote-first / anywhere
- `usOnly` — requires US work authorization (so you can exclude it)
- `roleType` — `engineering` / `design/content` / `other`
- `contactEmail` — public contact email, if the posting contains one
- `title`, `headline`, `location`, `postedAt`, `sourceUrl`, `text`

> Only public data. No login, no API keys, no scraping behind an auth wall.

### Use cases

- **Job boards & aggregators** — feed a niche remote-jobs board.
- **Recruiters / sourcing** — build a candidate or market map for a region or stack.
- **AI training data** — a clean, labelled, multi-source job corpus.
- **Market research** — track which roles and locations are heating up month over month.

### Input

| Field | Type | Default | Notes |
|---|---|---|---|
| `sources` | array | `["hn-who-is-hiring","v2ex-jobs"]` | Which sources to pull. |
| `month` | string | — | e.g. `October 2026` (HN only). Empty = latest. |
| `onlyRemote` | bool | `false` | Keep only remote postings. |
| `excludeUsOnly` | bool | `false` | Drop postings requiring US work authorization. |
| `requireEmail` | bool | `false` | Keep only postings with a public contact email. |
| `roleType` | array | `[]` | `engineering` / `design/content` / `other`. |
| `maxItems` | int | `1000` | Output cap. |

### Output (dataset item)

```json
{
  "source": "hn-who-is-hiring",
  "sourceUrl": "https://news.ycombinator.com/item?id=49922616",
  "postedAt": "2026-10-01T15:02:11.000Z",
  "title": "PAGNOS | Cloud Engineer, AWS Serverless (TypeScript/Node.js) | REMOTE (Germany)",
  "headline": "PAGNOS | Cloud Engineer, AWS Serverless (TypeScript/Node.js) | REMOTE (Germany)",
  "location": "REMOTE (Germany)",
  "isRemote": true,
  "usOnly": false,
  "roleType": "engineering",
  "contactEmail": "recruiting@pagnos.com",
  "textLength": 812
}
```

### Pricing

Pay-per-event, per result:

- `job-listing` — **$0.002 per returned posting** (≈ $2 per 1,000 postings), plus a nominal per-run start fee of $0.00005.

You are charged for postings that come back, not for boards that are empty or unreachable.

### Compliance

Public endpoints only — the HN Algolia API and V2EX's public API. No login, no rate-limit circumvention, no scraping of private data. `contactEmail` is taken solely from addresses that companies published themselves in the body of a hiring post.

# Actor input Schema

## `sources` (type: `array`):

Which public sources to pull from.

## `month` (type: `string`):

Match a specific month for the HN 'Who is hiring?' thread, e.g. 'October 2026'. Leave empty for the latest.

## `onlyRemote` (type: `boolean`):

Keep only postings that read as remote.

## `excludeUsOnly` (type: `boolean`):

Drop postings that require US work authorization.

## `requireEmail` (type: `boolean`):

Keep only postings whose text contains a plain email address. Useful for outreach lists.

## `roleType` (type: `array`):

Leave empty for all. Options: engineering, design/content, other.

## `maxItems` (type: `integer`):

Hard cap on returned postings.

## Actor input object example

```json
{
  "sources": [
    "hn-who-is-hiring",
    "v2ex-jobs"
  ],
  "onlyRemote": false,
  "excludeUsOnly": false,
  "requireEmail": false,
  "roleType": [],
  "maxItems": 1000
}
```

# Actor output Schema

## `postings` (type: `string`):

One row per posting, in the run's default dataset.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "sources": [
        "hn-who-is-hiring",
        "v2ex-jobs"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("fei.yang/remote-tech-jobs-aggregator").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "sources": [
        "hn-who-is-hiring",
        "v2ex-jobs",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("fei.yang/remote-tech-jobs-aggregator").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "sources": [
    "hn-who-is-hiring",
    "v2ex-jobs"
  ]
}' |
apify call fei.yang/remote-tech-jobs-aggregator --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,fei.yang/remote-tech-jobs-aggregator"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/pwYbWcGr0LzlKzeFe/builds/5uJFk4Pwikmm5yDpE/openapi.json
