# Robotics & AI Hiring Tracker: Jobs at 97 Companies (`phaux/robotics-ai-hiring-tracker`) Actor

Track open jobs at 97 AI and robotics companies (OpenAI, Anthropic, Waymo...) from official job boards, with first-seen and closed dates across runs. Use for hiring signals or job alerts. Input: companyGroups, outputMode (all/changes), filters. Output per job: title, company, location, URL, status.

- **URL**: https://apify.com/phaux/robotics-ai-hiring-tracker.md
- **Developed by:** [Phaux](https://apify.com/phaux) (community)
- **Categories:** Jobs, AI, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.40 / 1,000 jobs

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## Robotics & AI Hiring Tracker: Jobs at 97 Companies

A daily **AI jobs** and **robotics jobs** feed with history: this **hiring tracker** covers humanoid-robot, robotics, autonomous-vehicle, AI-lab, AI-infrastructure and AI-application companies.

Track who is hiring at **97 robotics and AI companies**, every day, and see **when each job opened and when it closed**.

The Actor reads the companies' own public job boards on Greenhouse, Lever and Ashby. Each run saves every open job with three dates:

- `first_seen`: the first run that saw the job open;
- `last_seen`: the last run that saw it open;
- `closed_at`: the run that first found it gone from the board.

Open and close dates cannot be downloaded later: once a job is taken down, it is gone. They only exist if someone checks every day. Schedule this Actor daily and it builds that history for you, in your own Apify account.

### Quick start for AI agents and API users

- **What it does:** Track open jobs at 97 AI and robotics companies (OpenAI, Anthropic, Waymo...) from official job boards, with first-seen and closed dates across runs.
- **When to use it:** For hiring signals or job alerts.
- **Example input** (the form's prefill; it finishes in under a minute):

```json
{
  "companyGroups": [
    "humanoids"
  ],
  "maxItems": 50
}
```

- **Example output:** one real dataset row from run `JXvaoWKYfV1PcMR5v` (2026-10-23), with long fields shortened and empty fields left out. Fields not shown are listed in the output table below.

```json
{
  "status": "open",
  "company": "Figure AI",
  "title": "Accounts Payable Specialist",
  "location": "Brazil, CDMX",
  "first_seen": "2026-10-22T03:03:50Z",
  "last_seen": "2026-10-23T13:11:46Z",
  "days_open": 1.42,
  "is_baseline": false,
  "first_seen_source": "archive",
  "company_group": "humanoids",
  "platform": "greenhouse",
  "company_token": "figureai",
  "job_id": "4720359006",
  "job_key": "greenhouse:figureai:4720359006",
  "all_locations": [
    "Brazil, CDMX",
    "Brazil",
    "..."
  ],
  "is_remote": false
}
```

- **Cost (pay per event, Free-plan prices):** job $0.002. Failed items are not charged.
- **From an AI agent:** with the Apify MCP server, call `call-actor` with actor `phaux/robotics-ai-hiring-tracker`, or load it as its own tool with `https://mcp.apify.com?tools=phaux/robotics-ai-hiring-tracker`. Read results with `get-dataset-items`.

### What you get

- **Job posts** from Figure AI, Agility Robotics, 1X, Physical Intelligence, Anduril, Shield AI, Skydio, Zipline, Waymo, Zoox, Wayve, OpenAI, Anthropic, Cohere, CoreWeave, Cerebras, Databricks and 80 more.
- **New and closed jobs since your last run**, with a per-company summary (open, new, reopened, closed).
- **Changes only mode**: get, and pay for, only the jobs that are new, reopened or closed since your last run.
- **Your own companies**: add any Greenhouse, Lever or Ashby board next to the built-in lists.
- **Clean data**: one schema across the three ATSs: title, location, remote flag, department, employment type, salary range when published, posting date, link and description.
- **No personal data**: emails, phone numbers and recruiter or hiring-manager names are removed from every field, including inside the description HTML.

### Who it is for

- Investors and analysts who watch hiring as a growth signal at robotics and AI companies.
- Recruiters and job seekers who want to know the day a role opens, and how long roles stay open.
- Researchers who need a clean, dated history of job posts in robotics and AI.

### How to use it

1. Pick one or more **company groups** (or "All 97 companies"), and optionally add your own boards.
2. Choose **Output**: "All open jobs" or "Changes only".
3. Run it. Then create a **schedule** (for example, daily at 06:00) so it keeps the history going.

The first run for a company records the baseline: every job is marked `new` with `is_baseline: true`, because the Actor cannot know how long it was open before. From the second run on, `new` really means new, and closed jobs appear with `closed_at` filled in.

#### Where the history is kept

The tracker remembers jobs in a **named key-value store in your own Apify account** (default name `robotics-ai-hiring-tracker-state`). Nobody else can read or change it, and nobody else's runs affect it. Use a different **Tracker name** to keep separate trackers (for example, one per client). If you delete that store, the tracker starts again from a new baseline.

### Tutorial: a weekly robotics & AI hiring digest with "Changes only"

Goal: once a week, get only the roles that **opened** or **closed** at the companies you care about, and pay only for those rows.

**1. Record a baseline, for free.** Run once with:

```json
{
  "companyGroups": ["all"],
  "outputMode": "changes",
  "includeBaselineInChanges": false,
  "includeDescription": false
}
```

With `includeBaselineInChanges: false` the first run only stores today's jobs in your tracker state (key-value store `robotics-ai-hiring-tracker-state`). It saves nothing to the dataset and charges nothing.

**2. Schedule it.** In Apify Console, go to *Schedules → Create*, pick this Actor with the same input, and set it to run weekly (for example, Monday 07:00). Daily gives more exact `closed_at` dates (to about a day). Weekly is enough for a digest.

**3. Read the digest.** Open the run's **Changes digest: new, reopened & closed** dataset view, or the `SUMMARY` record for per-company counts. Export it as CSV/Excel, or send it to Google Sheets or Slack with an Apify integration.

**What one cycle looked like (real data).** We took a baseline on 22 Oct 2026 at about 12:00 AM ET and ran "Changes only" on all 97 companies about 23 hours later (10:52 PM ET). Two runs (`h2ks6F9cxyCyG24gM`, which stopped at a $0.50 max-charge cap, and `oVZQgLDFdMDXeSkw8`, which covered the rest) found 436 unique changes. One World Labs row was cut off by the cap in the first run and was saved again in the second, because a company that doesn't fit isn't marked as seen:

| | New | Closed |
|---|---:|---:|
| Humanoid robots (6) | 8 | 8 |
| Robotics, drones & defense (35) | 66 | 52 |
| Autonomous vehicles (15) | 22 | 20 |
| AI labs (15) | 48 | 58 |
| AI infrastructure (16) | 34 | 31 |
| AI applications (10) | 57 | 32 |
| **Total** | **235** | **201** |

The companies with the most movement: Anduril Industries (39 new / 40 closed), OpenAI (13 / 26), Sierra (26 / 4), Anthropic (13 / 9), Glean (16 / 5), ElevenLabs (7 / 11), Databricks (11 / 7) and Waymo (9 / 5). New humanoid-robot roles that day included Figure AI's "Systems Integration Engineer - Hand Subsystem", 1X's "Staff Systems Engineer - Camera" and Humanoid's "Chief Scientist" (London).

**Cost.** The 436 change rows cost 436 × $0.002 = **$0.87** at the Free-plan price. Saving all 13,293 open jobs in "All open jobs" mode would have cost about $26.59. A week usually has more changes than one day, so cap spending with **Max items per run** or a maximum cost per run. Companies that don't fit in the cap aren't marked as seen, so their changes come back on the next run.

**Narrow it down.** Add `"keyword": "engineer, research"`, `"location": "San Francisco, remote"` or `"companyGroups": ["humanoids", "robotics"]`. Filters only narrow what is saved. Every job on every board is still tracked, so closures are never missed.

### Company groups

- **Humanoid robots** (`humanoids`, 6): Figure AI, Agility Robotics, Apptronik, 1X Technologies, The Bot Company, Humanoid
- **Robotics, drones & defense autonomy** (`robotics`, 35): Physical Intelligence, Generalist AI, Field AI, Dexterity, Standard Bots, Collaborative Robotics, Formic, Bright Machines, Path Robotics, Locus Robotics, Serve Robotics, Zipline, Wing, Skydio, Anduril Industries, Shield AI, Saronic, Gecko Robotics, Carbon Robotics, Mujin, Viam, ANYbotics, Nimble Robotics, Pickle Robot, Ambi Robotics, Robust.AI, Cobalt Robotics, Brain Corp, Diligent Robotics, Contoro Robotics, Sereact, Foxglove, Merlin Labs, Skyryse, Neuralink
- **Autonomous vehicles** (`autonomous_vehicles`, 15): Waymo, Nuro, Zoox, Wayve, Kodiak, Applied Intuition, Waabi, Stack AV, May Mobility, Motional, Torc Robotics, Avride, Outrider, Vay, Glydways
- **AI labs & model makers** (`ai_labs`, 15): OpenAI, Anthropic, xAI, Cohere, Perplexity, Thinking Machines Lab, Reflection AI, World Labs, Black Forest Labs, ElevenLabs, Character.AI, Luma AI, Pika, Suno, Stability AI
- **AI infrastructure, chips & compute** (`ai_infrastructure`, 16): Databricks, Scale AI, Together AI, CoreWeave, Lambda, Cerebras, SambaNova, Tenstorrent, Etched, Lightmatter, Crusoe, Modal, Baseten, Fireworks AI, Pinecone, LangChain
- **AI applications** (`ai_applications`, 10): Cursor, Cognition, Harvey, Glean, Sierra, Decagon, Replit, Writer, Abridge, Hebbia

The list was checked on 2026-10-21: every board token returned live jobs from its official API. If a company later moves its board, the run reports it in `BOARD_ERRORS` and leaves its history untouched; you are not charged for it.

### Input example

```json
{
  "companyGroups": ["humanoids", "robotics"],
  "outputMode": "changes",
  "ashbyBoards": ["https://jobs.ashbyhq.com/yourcompany"],
  "keyword": "engineer, research",
  "includeDescription": false
}
```

Filters (title keywords, location, remote only, department, posted since) only narrow what is saved. Tracking always covers every job on each board, so a closed job is caught even if it did not match your filters the day before.

### Output example

Two real rows from a "Changes only" run on 22 Oct 2026 at 10:52 PM ET (run on all 97 companies, descriptions off). The first is a job that appeared since the previous run. The second is one that was taken down:

```json
{
  "status": "new",
  "company": "Figure AI",
  "title": "Manufacturing Quality Engineer BotQ",
  "location": "San Jose, CA",
  "first_seen": "2026-10-23T02:52:30Z",
  "last_seen": "2026-10-23T02:52:30Z",
  "closed_at": null,
  "days_open": 0,
  "is_baseline": false,
  "company_group": "humanoids",
  "platform": "greenhouse",
  "job_key": "greenhouse:figureai:4724194006",
  "posted_at": "2026-10-22T20:20:37Z",
  "job_url": "https://job-boards.greenhouse.io/figureai/jobs/4724194006"
}
```

```json
{
  "status": "closed",
  "company": "1X Technologies",
  "title": "Senior Audio Systems Engineer, Robot Head",
  "location": "San Carlos, CA",
  "first_seen": "2026-10-22T03:40:40Z",
  "last_seen": "2026-10-22T04:00:15Z",
  "closed_at": "2026-10-23T02:52:30Z",
  "days_open": 0.97,
  "is_baseline": false,
  "company_group": "humanoids",
  "platform": "ashby",
  "department": "Hardware Engineering",
  "posted_at": "2026-06-17T20:24:56.533000Z",
  "job_url": "https://jobs.ashbyhq.com/1x/fbe6dc39-da2e-4d64-a660-f9a38454a93e"
}
```

`days_open` counts from the tracker's `first_seen`. For a job that was already on the board when tracking started, use `posted_at` to see its full age: the 1X role above was posted on 17 Jun 2026, about four months before it closed.

`status` is one of `new`, `open`, `reopened` or `closed`. Open jobs also carry department, employment type, salary, posting date, apply link and the description.

The run's key-value store also holds `SUMMARY` (open, new, reopened and closed jobs per company) and `BOARD_ERRORS`. Both are free.

### Pricing

You pay per job saved to the dataset, and nothing else: no start fee, and no charge for the summary, for failed boards, or for jobs your filters leave out. In "Changes only" mode you pay only for new, reopened and closed jobs. Set **Max items per run** or a maximum cost per run to cap spending. A company whose jobs did not all fit is not marked as seen, so its changes come back on the next run.

### Good to know

- `closed_at` is the time of the run that first noticed the job missing. With a daily schedule it is accurate to about a day.
- A job that disappears and comes back within 90 days (configurable) is reported as `reopened`, keeping its original `first_seen`.
- If a board that had jobs suddenly returns none, the Actor treats it as an outage and closes nothing (you can change this).
- For three Greenhouse boards (Figure AI, Agility Robotics, Apptronik) the Actor ships an earlier snapshot from 22 Oct 2026, 03:03 UTC. Jobs in it get that time as `first_seen`, with `first_seen_source: "archive"`.

### Data sources and limits

Only the official public job-board APIs are called:

- Greenhouse `boards-api.greenhouse.io`;
- Lever `api.lever.co` / `api.eu.lever.co`;
- Ashby `api.ashbyhq.com`.

No login, no company websites, no proxies. A job appears only if the company lists it on its public board. Companies on Workday or their own career sites (for example Boston Dynamics, Google DeepMind, Mistral AI) are not covered.

### FAQ

**How often should I run it?**
Daily. `closed_at` is the time of the run that first noticed a job missing, so a daily schedule makes it accurate to about a day.

**Why is every job `new` on my first run?**
The first run for a company records the baseline (`is_baseline: true`), because the Actor cannot know how long a job was open before. From the second run on, `new` really means new.

**How do I pay only for changes?**
Set *Output* to "Changes only". You then get, and pay for, only new, reopened and closed jobs.

**Can I track companies that are not in the built-in lists?**
Yes, if they use Greenhouse, Lever or Ashby. Add their board names or board URLs in the "Add your own companies" fields.

**Which companies are not covered?**
Companies on Workday or their own career sites (for example Boston Dynamics, Google DeepMind, Mistral AI), because only the official Greenhouse, Lever and Ashby APIs are used.

**Does the output contain personal data?**
No. Emails, phone numbers and recruiter or hiring-manager names are removed from every field.

**Something isn't working?**
Open an issue on the Actor's Issues tab with the run ID.

# Actor input Schema

## `companyGroups` (type: `array`):

Built-in company lists to track (see the README for every company). Clear it to track only the companies you add below. Example: \["humanoids", "ai_labs"]. Default: \["humanoids"].

## `outputMode` (type: `string`):

'Changes only' saves (and charges) only jobs that are new, reopened or closed since your previous run. On the first run for a company every job is new. Default: "all".

## `greenhouseBoards` (type: `array`):

Board tokens (e.g. 'anthropic') or URLs like https://job-boards.greenhouse.io/anthropic.

## `leverCompanies` (type: `array`):

Lever site names (e.g. 'zoox') or URLs like https://jobs.lever.co/zoox.

## `ashbyBoards` (type: `array`):

Ashby board names (e.g. 'openai') or URLs like https://jobs.ashbyhq.com/openai.

## `careerUrls` (type: `array`):

Any Greenhouse, Lever or Ashby board URL; the platform is detected from the URL. Example: \["https://boards.greenhouse.io/anthropic"].

## `keyword` (type: `string`):

Comma-separated; a job matches if its title contains any of them. Tracking still covers every job on the board. Example: "robotics".

## `keywordInDescription` (type: `boolean`):

Also search the description text (open jobs only). Default: false.

## `location` (type: `string`):

Comma-separated, e.g. 'San Francisco, Boston, remote'.

## `remoteOnly` (type: `boolean`):

Keep only jobs marked remote. Default: false.

## `department` (type: `string`):

Comma-separated, e.g. 'engineering, research'.

## `postedSince` (type: `string`):

A date (2026-10-01) or a period ('7 days', '24 hours'). Example: "2026-10-01".

## `includeDescription` (type: `boolean`):

Job description as HTML and plain text, with emails and phone numbers removed. Turn off for smaller, faster runs. Default: true.

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

0 = no limit. Companies whose items did not all fit are not marked as seen, so nothing is lost: they show up again next run. Default: 0.

## `stateStoreName` (type: `string`):

Name of the key-value store in YOUR Apify account that remembers which jobs were seen. Use different names to keep separate trackers. Letters, digits and '-' only. Example: "my-hiring-tracker". Default: "robotics-ai-hiring-tracker-state".

## `includeBaselineInChanges` (type: `boolean`):

In 'Changes only' mode, the first run for a company marks every job as new. Turn off to record that baseline silently (nothing saved or charged for it). Default: true.

## `keepClosedDays` (type: `integer`):

How long a closed job is kept in the state, so that a reposted job is reported as 'reopened' rather than new. Default: 90.

## `closeOnEmptyBoard` (type: `boolean`):

Off (safer): if a board that had jobs returns zero, it is treated as an outage and nothing is marked closed. Default: false.

## `maxConcurrency` (type: `integer`):

1-10. Default: 6.

## `minRequestIntervalSecs` (type: `string`):

Politeness delay per API host. Default: "0.4".

## Actor input object example

```json
{
  "companyGroups": [
    "humanoids"
  ],
  "outputMode": "all",
  "keywordInDescription": false,
  "remoteOnly": false,
  "includeDescription": true,
  "maxItems": 50,
  "stateStoreName": "robotics-ai-hiring-tracker-state",
  "includeBaselineInChanges": true,
  "keepClosedDays": 90,
  "closeOnEmptyBoard": false,
  "maxConcurrency": 6,
  "minRequestIntervalSecs": "0.4"
}
```

# Actor output Schema

## `jobs` (type: `string`):

Jobs saved by the run.

## `summary` (type: `string`):

SUMMARY record.

## `digest` (type: `string`):

Same jobs, digest columns.

## `boardErrors` (type: `string`):

BOARD_ERRORS record.

# 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 = {
    "companyGroups": [
        "humanoids"
    ],
    "maxItems": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("phaux/robotics-ai-hiring-tracker").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 = {
    "companyGroups": ["humanoids"],
    "maxItems": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("phaux/robotics-ai-hiring-tracker").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 '{
  "companyGroups": [
    "humanoids"
  ],
  "maxItems": 50
}' |
apify call phaux/robotics-ai-hiring-tracker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,phaux/robotics-ai-hiring-tracker"
        }
    }
}
```

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/Vg4DloR7J7ITvYUbD/builds/6GKGHcWY1hFdPh2KS/openapi.json
