# LinkedIn Jobs to Company Hiring Signals (`seasons-ai/jobs-to-hiring-signals`) Actor

Turn a LinkedIn jobs dataset into one sales profile per company: hiring velocity, tools, quoted buying signals, an ICP fit score and a why-now angle.

- **URL**: https://apify.com/seasons-ai/jobs-to-hiring-signals.md
- **Developed by:** [Seasons AI](https://apify.com/seasons-ai) (community)
- **Categories:** AI, Lead generation, Jobs
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $10.00 / 1,000 company profiles

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

## Job Posts to Company Hiring Signals

Turn a LinkedIn jobs scrape into a ranked list of sales prospects. This Actor takes the dataset of your jobs scraper run and builds **one profile per company**:

- **Hiring velocity by function**: postings per department, the last 30 days, postings per week, seniority mix
- **Tools and tech in use**: every product, platform and language the postings name, with counts
- **Buying signals with quoted evidence**, e.g. "implementing Salesforce", "building a data platform", "first security hire". Each signal comes with an exact quote from the posting.
- **Fit score from 0 to 100** against your ICP, with the reasons for it
- **A two-sentence "why now" angle** addressed to the company, ready to adapt for an opener

You get a dataset row per company, a CSV and a Markdown report, all sorted by fit score.

It works at company level only. Recruiter and poster names, profile links, photos and any other personal contact fields in the scraper data are never read or output. Emails, phone numbers and links found inside job descriptions are masked before analysis.

### How to use it

1. Run a jobs scraper from the Apify Store, for example `curious_coder/linkedin-jobs-scraper`, `bebity/linkedin-jobs-scraper` or `valig/linkedin-jobs-scraper`. Search for the roles that show demand for what you sell, like "data engineer", "Salesforce administrator" or "security engineer".
2. Open this Actor and choose that run's dataset in **Jobs dataset**.
3. In **Your ICP and offer**, describe what you sell, who buys it and what makes a company a good fit right now.
4. Start the run. The Actor only reads your dataset and never changes it.

You can also skip the dataset. Paste postings as JSON, or give the URL of a JSON or CSV file. Each row needs at least `companyName` and `title`. `description`, `location` and `postedAt` make the results better.

#### Supported field names

The Actor reads the common field names of the popular jobs scrapers and ignores the rest:

| What | Field names read |
|---|---|
| Company | `companyName`, `company`, `employer`, `organization` |
| Title | `title`, `jobTitle`, `positionName` |
| Description | `descriptionText`, `description`, `descriptionHtml` |
| Posted date | `postedAt`, `postedDate`, `publishedAt`, `datePosted`, `postedTimeAgo` |
| Location | `location`, `jobLocation` |
| Company facts | `companyLinkedinUrl` / `companyUrl` (company pages only), `companyWebsite`, `industries` / `sector`, `companyEmployeesCount`, `companyAddress` |
| Hints | `seniorityLevel` / `experienceLevel`, `jobFunction`, `employmentType` / `contractType` |

### Input

| Field | Default | Notes |
|---|---|---|
| Jobs dataset | – | Pick the dataset of your scraper run |
| Jobs file URL | – | Public JSON, JSON Lines or CSV, up to 50 MB |
| Job postings as JSON | sample | Used only when no dataset or URL is given |
| Your ICP and offer | sample | Up to 2,000 characters |
| Max postings to analyse | 200 | 1–5,000 unique postings per run |
| Max postings per company | 20 | The newest postings are analysed first. Older postings still count toward velocity, at no charge |
| Max companies | 100 | Companies with the most postings come first |
| Min postings per company | 1 | Set it to 2 or more to focus on companies hiring repeatedly |
| Only these companies | – | Filter by words in the company name |
| Include the job list per company | on | Adds the analysed postings to each row |

### Output

One dataset row per company, sorted by fit score (trimmed example):

```json
{
  "rank": 1,
  "company": "Northwind Analytics",
  "fitScore": 95,
  "whyNow": "You are building a new cloud data platform and migrating your legacy Oracle warehouse to Snowflake. You are also scaling your analytics engineering team and defining data contracts, indicating an immediate need for robust data pipeline monitoring.",
  "fitReasons": ["Building a new cloud data platform and migrating to Snowflake.", "Scaling analytics engineering team from 2 to 8 people."],
  "postingsInInput": 2,
  "postingsLast30Days": 2,
  "postingsPerWeek": 2,
  "hiringByFunction": [{ "department": "Data & Analytics", "postings": 1, "last30Days": 1, "teams": ["Analytics Engineering"], "seniority": { "manager": 1 } }],
  "topTools": [{ "tool": "dbt", "postings": 2 }, { "tool": "Snowflake", "postings": 2 }, { "tool": "Looker", "postings": 1 }],
  "signals": [
    { "category": "migration", "signal": "Migrate legacy Oracle warehouse to Snowflake", "evidence": "migrate our legacy Oracle warehouse to Snowflake", "jobTitle": "Senior Data Engineer", "postedAt": "2026-10-20" }
  ],
  "likelyStaffingAgency": false,
  "companyWebsite": null,
  "jobs": [{ "title": "Senior Data Engineer", "department": "Engineering", "seniority": "senior", "location": "Austin, TX", "postedAt": "2026-10-20" }]
}
```

The run's key-value store also holds:

- `companies.csv`: one row per company, ready for a CRM import or a spreadsheet
- `report.md`: a ranked summary with the why-now line, reasons, functions, tools and quoted signals for each company
- `OUTPUT`: run totals and links

### Pricing

Pay per event. You only pay for work that was delivered:

| Event | Price | When |
|---|---|---|
| `posting-analyzed` | $0.002 | One unique job posting classified and mined for tools and signals |
| `company-profile` | $0.01 | One company aggregated, scored against your ICP, with a why-now angle |

Example: 200 postings from 60 companies cost 200 × $0.002 + 60 × $0.01 = **$1.00**.

- Identical re-posts are analysed and charged once. This covers the same title and text posted in several cities.
- Postings or companies that fail are free.
- Before it starts, the Actor checks that the run's maximum cost covers the whole job. If it does not, the run stops without charging and tells you the amount to set.

### Limits and accuracy

- The first 6,000 characters of each description are analysed (2,500 for CJK and other dense scripts).
- Signals are kept only when their quote is found in the posting text. Tools are kept only when the posting names them. Anything the model made up is dropped.
- Classification, fit score and why-now text are AI-generated decision support. Check them before outreach. The score reflects the postings in your input only, not funding, revenue or news.
- Velocity is measured against the newest posting in your input, so scrape recent postings for current numbers.
- Consultancies and staffing agencies often post roles for their clients. These rows are flagged (`likelyStaffingAgency`), and the scoring prompt treats them accordingly.
- Up to 20,000 items are read from a dataset.

Available on paid Apify plans.

### Good to know

- On the free Apify plan the Actor returns a short preview with an example result and prices instead of running.

# Actor input Schema

## `datasetId` (type: `string`):

Pick the dataset of your LinkedIn jobs scraper run (curious_coder/linkedin-jobs-scraper, bebity/linkedin-jobs-scraper, valig/linkedin-jobs-scraper and similar). Any jobs dataset works if each item has a company name and a job title; the description and posting date make the analysis and the velocity work. When set, the file URL and pasted items are ignored. The Actor only reads this dataset.

## `itemsUrl` (type: `string`):

Instead of a dataset: a public link to a JSON array, JSON Lines or CSV file with one posting per row (columns such as companyName, title, description, location, postedAt). Up to 50 MB.

## `items` (type: `array`):

Instead of a dataset or file: paste postings as a JSON array of objects with companyName, title, description, location and postedAt. Used only when no dataset or file URL is given.

## `icpDescription` (type: `string`):

Who you sell to and what you sell, in a few sentences: product, target industries, company size, the teams that buy, and what makes a company a good fit now. Used for the fit score and the why-now angle. Up to 2,000 characters.

## `maxPostings` (type: `integer`):

Cap on unique postings analysed (and charged) in this run, 1 to 5,000. Identical re-posts of one role (same title and text) are analysed once.

## `maxPostingsPerCompany` (type: `integer`):

The newest postings of each company are analysed first; older ones over this cap still count in the hiring velocity, free.

## `maxCompanies` (type: `integer`):

Cap on company profiles (and charges) in this run. Companies with the most postings come first.

## `minPostingsPerCompany` (type: `integer`):

Skip companies with fewer postings than this in the input (e.g. 2 to focus on companies hiring repeatedly).

## `companies` (type: `array`):

Analyse only companies whose name contains one of these words, e.g. Acme, Northwind.

## `includeJobs` (type: `boolean`):

Adds the analysed postings (title, department, seniority, location, date, link) to each company row.

## Actor input object example

```json
{
  "items": [
    {
      "companyName": "Northwind Analytics",
      "title": "Senior Data Engineer",
      "location": "Austin, TX",
      "postedAt": "2026-10-20",
      "description": "Northwind Analytics is building a new cloud data platform from the ground up. You will migrate our legacy Oracle warehouse to Snowflake, build ELT pipelines in dbt and Airflow, and set up data quality monitoring. This is one of the first hires on our new data platform team. Experience with Python, SQL and AWS required."
    },
    {
      "companyName": "Northwind Analytics",
      "title": "Analytics Engineering Manager",
      "location": "Remote, US",
      "postedAt": "2026-10-24",
      "description": "We are scaling our analytics engineering function from 2 to 8 people over the next year. You will own our dbt project, define data contracts and roll out Looker as our company-wide BI tool. Our stack: Snowflake, dbt, Fivetran, Looker."
    },
    {
      "companyName": "Bluefin Logistics",
      "title": "Salesforce Administrator",
      "location": "Chicago, IL",
      "postedAt": "2026-10-18",
      "description": "Bluefin Logistics is implementing Salesforce Sales Cloud for our 120-person sales team. As our first Salesforce Administrator you will configure objects, build reports and dashboards, and integrate Salesforce with NetSuite and HubSpot."
    }
  ],
  "icpDescription": "We sell a data observability platform that catches broken pipelines and bad data before it reaches dashboards. Best fit: B2B companies with 200-5,000 employees building or scaling a modern data stack (Snowflake, BigQuery, Databricks, dbt, Airflow). Buyers: Head of Data, data platform and analytics engineering teams. Strong signals: new data platform team, warehouse migration, data quality or data contracts initiatives.",
  "maxPostings": 200,
  "maxPostingsPerCompany": 20,
  "maxCompanies": 100,
  "minPostingsPerCompany": 1,
  "includeJobs": true
}
```

# Actor output Schema

## `companies` (type: `string`):

No description

## `csv` (type: `string`):

No description

## `report` (type: `string`):

No description

# 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 = {
    "items": [
        {
            "companyName": "Northwind Analytics",
            "title": "Senior Data Engineer",
            "location": "Austin, TX",
            "postedAt": "2026-10-20",
            "description": "Northwind Analytics is building a new cloud data platform from the ground up. You will migrate our legacy Oracle warehouse to Snowflake, build ELT pipelines in dbt and Airflow, and set up data quality monitoring. This is one of the first hires on our new data platform team. Experience with Python, SQL and AWS required."
        },
        {
            "companyName": "Northwind Analytics",
            "title": "Analytics Engineering Manager",
            "location": "Remote, US",
            "postedAt": "2026-10-24",
            "description": "We are scaling our analytics engineering function from 2 to 8 people over the next year. You will own our dbt project, define data contracts and roll out Looker as our company-wide BI tool. Our stack: Snowflake, dbt, Fivetran, Looker."
        },
        {
            "companyName": "Bluefin Logistics",
            "title": "Salesforce Administrator",
            "location": "Chicago, IL",
            "postedAt": "2026-10-18",
            "description": "Bluefin Logistics is implementing Salesforce Sales Cloud for our 120-person sales team. As our first Salesforce Administrator you will configure objects, build reports and dashboards, and integrate Salesforce with NetSuite and HubSpot."
        }
    ],
    "icpDescription": "We sell a data observability platform that catches broken pipelines and bad data before it reaches dashboards. Best fit: B2B companies with 200-5,000 employees building or scaling a modern data stack (Snowflake, BigQuery, Databricks, dbt, Airflow). Buyers: Head of Data, data platform and analytics engineering teams. Strong signals: new data platform team, warehouse migration, data quality or data contracts initiatives."
};

// Run the Actor and wait for it to finish
const run = await client.actor("seasons-ai/jobs-to-hiring-signals").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 = {
    "items": [
        {
            "companyName": "Northwind Analytics",
            "title": "Senior Data Engineer",
            "location": "Austin, TX",
            "postedAt": "2026-10-20",
            "description": "Northwind Analytics is building a new cloud data platform from the ground up. You will migrate our legacy Oracle warehouse to Snowflake, build ELT pipelines in dbt and Airflow, and set up data quality monitoring. This is one of the first hires on our new data platform team. Experience with Python, SQL and AWS required.",
        },
        {
            "companyName": "Northwind Analytics",
            "title": "Analytics Engineering Manager",
            "location": "Remote, US",
            "postedAt": "2026-10-24",
            "description": "We are scaling our analytics engineering function from 2 to 8 people over the next year. You will own our dbt project, define data contracts and roll out Looker as our company-wide BI tool. Our stack: Snowflake, dbt, Fivetran, Looker.",
        },
        {
            "companyName": "Bluefin Logistics",
            "title": "Salesforce Administrator",
            "location": "Chicago, IL",
            "postedAt": "2026-10-18",
            "description": "Bluefin Logistics is implementing Salesforce Sales Cloud for our 120-person sales team. As our first Salesforce Administrator you will configure objects, build reports and dashboards, and integrate Salesforce with NetSuite and HubSpot.",
        },
    ],
    "icpDescription": "We sell a data observability platform that catches broken pipelines and bad data before it reaches dashboards. Best fit: B2B companies with 200-5,000 employees building or scaling a modern data stack (Snowflake, BigQuery, Databricks, dbt, Airflow). Buyers: Head of Data, data platform and analytics engineering teams. Strong signals: new data platform team, warehouse migration, data quality or data contracts initiatives.",
}

# Run the Actor and wait for it to finish
run = client.actor("seasons-ai/jobs-to-hiring-signals").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 '{
  "items": [
    {
      "companyName": "Northwind Analytics",
      "title": "Senior Data Engineer",
      "location": "Austin, TX",
      "postedAt": "2026-10-20",
      "description": "Northwind Analytics is building a new cloud data platform from the ground up. You will migrate our legacy Oracle warehouse to Snowflake, build ELT pipelines in dbt and Airflow, and set up data quality monitoring. This is one of the first hires on our new data platform team. Experience with Python, SQL and AWS required."
    },
    {
      "companyName": "Northwind Analytics",
      "title": "Analytics Engineering Manager",
      "location": "Remote, US",
      "postedAt": "2026-10-24",
      "description": "We are scaling our analytics engineering function from 2 to 8 people over the next year. You will own our dbt project, define data contracts and roll out Looker as our company-wide BI tool. Our stack: Snowflake, dbt, Fivetran, Looker."
    },
    {
      "companyName": "Bluefin Logistics",
      "title": "Salesforce Administrator",
      "location": "Chicago, IL",
      "postedAt": "2026-10-18",
      "description": "Bluefin Logistics is implementing Salesforce Sales Cloud for our 120-person sales team. As our first Salesforce Administrator you will configure objects, build reports and dashboards, and integrate Salesforce with NetSuite and HubSpot."
    }
  ],
  "icpDescription": "We sell a data observability platform that catches broken pipelines and bad data before it reaches dashboards. Best fit: B2B companies with 200-5,000 employees building or scaling a modern data stack (Snowflake, BigQuery, Databricks, dbt, Airflow). Buyers: Head of Data, data platform and analytics engineering teams. Strong signals: new data platform team, warehouse migration, data quality or data contracts initiatives."
}' |
apify call seasons-ai/jobs-to-hiring-signals --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,seasons-ai/jobs-to-hiring-signals"
        }
    }
}
```

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/lqsXqu2eSVJCbPoNW/builds/vXEbpFdkhx3zb05qh/openapi.json
