# ats-jobs-public

> "What jobs does this company have open on its public Greenhouse or Lever job board?" Optionally filtered by a keyword in the title, location or team.

- Status: MCP package (hosted access coming soon)

## What question it answers

"What jobs does this company have open on its public Greenhouse or Lever job board?" Optionally filtered by a keyword in the title, location or team.

## Sources

- **Greenhouse** public Job Board API: allowed.
- **Lever** public Postings API: allowed.
- **Ashby**: not supported. Requests for Ashby boards are refused on purpose (terms).

## When to use it

- Sourcing or monitoring roles at a named employer that uses Greenhouse or Lever.
- An agent needs a clean list: id, title, URL, location, remote guess.

## When not to

- Not a job search engine: you must name the employer's board (a slug or board URL).
- Not for employers on other systems (Ashby, Workday, etc.).
- The `remote` flag is a text guess, not data from the employer.
- Job titles and locations are the employer's own words; no salary, no description text is returned.

## Example (MCP tool `ats_search_jobs`, or CLI)

```bash
npx tsx src/cli.ts search airbnb engineer 10
npx tsx src/cli.ts list lever:activecampaign 5
```
`target` can be `airbnb` (Greenhouse is the default), `lever:activecampaign`, `greenhouse:slug`, or a board URL.

Trimmed output (shape from `samples/greenhouse-airbnb.json`):
```json
{
  "tool": "ats-jobs-public",
  "version": "0.2.0",
  "kind": "greenhouse",
  "company": "airbnb",
  "boardUrl": "https://boards-api.greenhouse.io/v1/boards/airbnb/jobs",
  "totalCached": 202,
  "returned": 15,
  "remoteOnly": false,
  "jobs": [
    {
      "id": "8306554",
      "title": "AirCover Specialist, Claims Experience",
      "url": "https://careers.airbnb.com/positions/8306554?gh_jid=8306554",
      "location": "Canada",
      "updatedAt": "2026-10-28T10:52:05-04:00",
      "remote": false,
      "source": "greenhouse",
      "company": "airbnb"
    }
  ],
  "termsChecked": { "id": "greenhouse", "checkedAt": "2026-10-31", "termsUrls": ["..."] },
  "billing": { "sku": "ats_jobs_list", "plannedPriceUsd": 0.03, "x402Enabled": false }
}
```
Lever rows also carry `team` and `commitment`. Searches add `query`. Every response also lists the source allowlist and a `note`.

## Data source and licence

Each employer's public board JSON from Greenhouse or Lever. The postings belong to the employers. The tool's allowlist records the terms pages reviewed on 2026-10-31 (Greenhouse job board docs and MSA; Lever postings API docs and terms). That record is not legal advice; check the terms for your own use.

## Freshness and limits

- Board data cached 1 hour, so a new posting can take up to an hour to appear.
- `list`: 1 to 5,000 rows. `search`: scans up to 5,000 rows, returns up to 200. No `truncated` flag if a board is larger than 5,000.
- Unknown prefixes such as `foo:acme` are treated as Greenhouse.
- Lever EU-hosted boards are not supported.
- 20 s timeout, 5 MB response cap per fetch.
