> ## Documentation Index
> Fetch the complete documentation index at: https://jobo.world/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Track hiring signals

> Read company-level hiring events (a surge, a new country, a leadership search, a new technology) from the API, or have alerts deliver them to you.

A hiring signal is one event at one company, detected from its job postings: it posted far more jobs than usual, opened its first role in a country, started a leadership search. [`GET /api/signals`](https://jobo.world/docs/api-reference/signals/list-hiring-signals) returns them newest first.

```bash curl theme={null}
curl -G "https://connect.jobo.world/api/signals" \
  -H "X-Api-Key: $JOBO_API_KEY" \
  --data-urlencode "types=hiring_surge,new_country" \
  --data-urlencode "min_strength=70" \
  --data-urlencode "exclude_agencies=true"
```

```json Response theme={null}
{
  "signals": [
    {
      "id": "0d0f5c1e-7a52-4f0e-9d3b-2f6f1c7a9b10",
      "type": "hiring_surge",
      "detected_on": "2026-11-10",
      "created_at": "2026-11-11T02:14:09Z",
      "window_start": "2026-11-04",
      "window_end": "2026-11-10",
      "strength": 88,
      "company": {
        "id": "6c1f0a9e-3b7d-4c55-8e21-5a4d9f0b7c33",
        "name": "Northwind Health",
        "domain": "northwind.example",
        "country_code": "US",
        "industry": "Hospitals and Health Care",
        "is_agency": false
      },
      "details": {
        "new_jobs": 42,
        "baseline_weekly_avg": 9,
        "ratio": 4.7,
        "open_roles": 187
      },
      "evidence_job_ids": ["a41c7e02-58b1-4d0f-b6c9-0e2f7d5a1c88"]
    }
  ],
  "next_cursor": "eyJkIjoiMjAyNi0xMS0xMCJ9",
  "has_more": true
}
```

`strength` runs from 1 to 100 and compares signals of the same type. `details` holds the facts behind the signal and differs by type. `evidence_job_ids` lists up to five jobs you can read with [`GET /api/jobs/{id}`](https://jobo.world/docs/api-reference/jobs/retrieve-a-job).

## Signal types

| `type` | Fires when |
| - | - |
| `hiring_surge` | New jobs this week are far above the company's own eight-week average. |
| `function_surge` | One job category is posting well above its own norm at that company. |
| `hiring_resumed` | The first new job after two months or more without one. |
| `new_country` | A first job in a country the company has not posted in for six months. |
| `new_city` | First jobs in a city away from everywhere it already hires. |
| `new_function` | A first job in a job category it has not hired for in six months. |
| `first_role` | A first posting for an occupation, inside a function it already hires for. |
| `leadership_hire` | A newly posted director, VP, head-of or C-level role. |
| `leadership_role_closed` | A senior role that was open for weeks, closed and stayed closed. |
| `new_technology` | A first mention of a product or tool from a curated technology list. |
| `new_skill` | A hard skill several new jobs ask for, for the first time in six months. |
| `hiring_slowdown` | Open roles are well down on eight weeks ago, with few new postings. |
| `hard_to_fill` | A job is still open after weeks, or was posted again after it closed. |

More types may be added. Ignore a `type` you do not know instead of failing on it.

## Watch specific companies

Pass up to 100 `domains` or `company_ids`, or read one company with [`GET /api/companies/{id}/signals`](https://jobo.world/docs/api-reference/signals/list-a-companys-hiring-signals).

```bash curl theme={null}
curl -G "https://connect.jobo.world/api/signals" \
  -H "X-Api-Key: $JOBO_API_KEY" \
  --data-urlencode "domains=stripe.com,shopify.com" \
  --data-urlencode "detected_after=2026-11-01"
```

To describe companies instead of naming them, combine `countries`, `company_sizes`, `industries` and `categories`.

## Poll for new signals

Signals are added through the day, within minutes of a job changing, and once more each night. To read only what is new:

1. Store the newest `created_at` you have received.
2. Call `GET /api/signals` with `created_after` set to that value, minus five minutes.
3. Page with `cursor` until `has_more` is `false`, and skip any `id` you already hold.

The five-minute overlap covers signals that were being stored while your last poll ran. Overlapping signals are charged again, so keep the overlap short.

## Get signals without polling

In the dashboard, **Data Platform → Hiring Signals** lets you save an alert: a list of companies, or filters that describe them, plus the signal types you care about. The preview shows what the alert would have matched over the last 30 days and what that would have cost. An alert delivers to a feed in the dashboard and, if you turn it on, a daily or weekly email digest.

## Pricing

| What | Price |
| - | - |
| A signal returned by the API | \$0.03 (30 credits) |
| A signal matched to an alert | \$0.03 (30 credits) |
| Creating, editing and previewing alerts | Free |
| A request or an alert run that finds nothing | Free |

Signals are charged to your wallet. No plan includes them, and included jobs do not apply. Each alert charges a signal once, however it is delivered. A signal read again through the API is charged again.

An alert matches only what your wallet covers, strongest signals first. With an empty wallet it pauses, and signals from the paused days are not delivered later. Top up under **Account → Billing** to resume. See [Billing](https://jobo.world/docs/billing.md).


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.