# Hiring Signals API — turn a company domain into a hiring snapshot: ATS provider, open-role counts, departments, seniority, remote ratio and tech-stack signals

> domain → company hiring snapshot: ATS provider + direct open-roles count, per-source counts (deduped), departments/seniority/remote-ratio/tech-signals, entity-confirm, honest snapshot intensity
> ReefAPI engine `enrich-hiring` · 3 endpoints · clean JSON, no scraping or browsers to manage.

## How to call
- **Endpoint:** `POST https://api.reefapi.com/enrich-hiring/v1/<action>` with a JSON body.
- **Auth:** header `x-api-key: <YOUR_REEFAPI_KEY>` — create one free (1,000 credits, no card): https://reefapi.com/signup
- **Response (every call):** `{ ok: boolean, data: ..., meta: { record_count, credits, ... }, error: { code, message } }` — branch on `ok`. Failed or blocked calls are free.
- **One key + one shared credit pool** across every ReefAPI API. Per-call credits are listed on each endpoint below.
- **Use it from an AI agent (MCP):** connect `https://api.reefapi.com/mcp` (remote streamable-http, `Authorization: Bearer <key>`) and your assistant can call these actions directly.

## Endpoints

### POST /enrich-hiring/v1/hiring_signal — 6 credits
domain → company hiring snapshot: ATS provider + direct open-roles count, per-source counts (deduped), departments/seniority/remote-ratio/tech-signals, entity-confirm, honest snapshot intensity

**Parameters:**
- `domain` (string, optional) — Company website domain (bare host like stripe.com; a full URL or leading www. is accepted and normalized). The ATS board slug is derived from the domain stem. Provide `domain` OR `company_name` (domain gives the strongest entity anchor).
- `company_name` (string, optional) — Company name, used when no domain is available (entity-match is weaker without a domain). Also seeds the ATS slug guess.
- `ats_slug` (string, optional) — Advanced: force the ATS board token/subdomain (skips slug auto-detect). Use when the board slug differs from the domain stem (e.g. a parent-company board).
- `ats_provider` (enum, optional) — Advanced: force the ATS provider (skips the parallel probe). One of greenhouse / lever / ashby / workable. [one of: greenhouse, lever, ashby, workable]
- `countries` (array, optional) — Optional country hints for the keyword job sources (best-effort location filter; ATS count is global).

**Returns:** entity{input, resolved_name, confidence, match: ats-board|name-only, evidence[]}, ats{provider, slug, direct_jobs_count, matched}, jobs{count_by_source{ats,linkedin,indeed}, dedup_count, deduplicated_total, sample[]{title,location,department,seniority,remote,source,url,posted}}, departments[]{name,count,pct}, seniority_mix[]{level,count,pct}, remote_ratio, tech_signals[]{name,count}, current_hiring_intensity{level,basis,open_jobs}, coverage[]{source,status,count,note}, freshness; meta.extra.subcalls[] (contributing sources, customer-safe)

**Example request body:**
```json
{
  "domain": "stripe.com"
}
```

### POST /enrich-hiring/v1/hiring_signal_rich — 10 credits
everything in hiring_signal + employer firmographics (linkedin company / glassdoor employer: industry, employee_count, HQ, founded, rating) which anchor a headcount-relative intensity (open-roles-to-headcount ratio)

**Parameters:**
- `domain` (string, optional) — Company website domain (bare host like stripe.com; a full URL or leading www. is accepted and normalized). The ATS board slug is derived from the domain stem. Provide `domain` OR `company_name` (domain gives the strongest entity anchor).
- `company_name` (string, optional) — Company name, used when no domain is available (entity-match is weaker without a domain). Also seeds the ATS slug guess.
- `ats_slug` (string, optional) — Advanced: force the ATS board token/subdomain (skips slug auto-detect). Use when the board slug differs from the domain stem (e.g. a parent-company board).
- `ats_provider` (enum, optional) — Advanced: force the ATS provider (skips the parallel probe). One of greenhouse / lever / ashby / workable. [one of: greenhouse, lever, ashby, workable]
- `countries` (array, optional) — Optional country hints for the keyword job sources (best-effort location filter; ATS count is global).

**Returns:** hiring_signal payload + employer{linkedin{industry,employee_count,company_size,headquarters,founded,specialties}, glassdoor{industry,size,overall_rating,review_count}}; current_hiring_intensity gains open_to_headcount_ratio when a headcount is known

### POST /enrich-hiring/v1/batch — 5 credits
hiring_signal for up to 10 domains in one call (cache-first, per-item ok/error)

**Parameters:**
- `domains` (array, required) — Up to 10 domains (array or comma-separated). Each gets a hiring_signal snapshot; per-item ok/error, cache-first.

**Returns:** results[] (one hiring_signal payload or {ok:false,error} per input), count, ok_count

**Example request body:**
```json
{
  "domains": [
    "d0.example",
    "d1.example",
    "d2.example",
    "d3.example",
    "d4.example",
    "d5.example",
    "d6.example",
    "d7.example",
    "d8.example",
    "d9.example",
    "d10.example"
  ]
}
```

## More
- Try it live, no code: https://reefapi.com/playground?engine=enrich-hiring
- Human docs page: https://reefapi.com/docs/enrich-hiring
- Every ReefAPI API in one file (for your AI): https://reefapi.com/llms-full.txt
