# B2B Buying Signals: Hiring, Ads, Press & Products (`precious_bathmat/b2b-company-signals`) Actor

Which companies on your list are worth a call this week? Checks five public signals per company: hiring, Google ads, press coverage, Shopify store and mobile apps. No LinkedIn, no data broker, no API keys.

- **URL**: https://apify.com/precious\_bathmat/b2b-company-signals.md
- **Developed by:** [Mariam Ahmed](https://apify.com/precious_bathmat) (community)
- **Categories:** Lead generation, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$30.00 / 1,000 company reports

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

## B2B Buying Signals: Hiring, Ads, Press & Products

**Which companies on your list are worth a call this week?** Give it a list of companies and it checks five public signals for each one: who is hiring and for what, who is advertising on Google, who is in the news, who runs a Shopify store and who ships mobile apps.

No LinkedIn, no data broker, no API keys, no account. Every number comes with the source behind it.

### What does this do?

Sales intelligence tools charge per seat to tell you a company "shows intent". This one shows you the evidence instead, from sources anyone can check.

```mermaid
flowchart LR
    A[Your company list] --> B[Careers boards<br/>10 systems]
    A --> C[Google ad library]
    A --> D[Google News]
    A --> E[Shopify catalogue]
    A --> F[Apple App Store]
    B --> G[One row per company:<br/>graded signals<br/>with the evidence]
    C --> G
    D --> G
    E --> G
    F --> G
```

### Who is it for?

| You are | You use it to |
|---|---|
| **B2B sales and BD** | Work a target list in order: the companies hiring hard and spending on ads are the ones with budget moving |
| **Agencies** | Spot brands that just started advertising, or launched a store, and pitch while it is live |
| **Recruiters** | Find the companies hiring in volume this month, and what they are hiring for |
| **Investors and analysts** | Track hiring, ad spend and press across a portfolio or a sector, weekly |
| **Anyone qualifying inbound** | Check in seconds whether a company that filled in your form is actually active |

### What data do you get?

One row per company:

| Field | Meaning |
|---|---|
| `activityLevel`, `activityScore` | busy, active, quiet or nothing found — and the 0–11 score behind it |
| `signals` | The plain-English list: what is happening at this company right now |
| `hiringSignal`, `openRoles`, `rolesPostedLast30Days`, `hiringFor` | How hard they are hiring, and for what, from their own careers board |
| `careersBoard`, `careersBoardSystem` | Which board, and a link — Greenhouse, Ashby, Lever, Workable, Recruitee, SmartRecruiters, Personio, Breezy HR, Teamtailor or Workday |
| `advertisingSignal`, `adsRunning`, `adFormats`, `adsUrl` | How many Google ads they are running, the text/image/video split, and the link to see them |
| `pressSignal`, `articlesLast30Days`, `topOutlets`, `latestHeadlines` | Coverage in the last 30 and 90 days, with the outlets and the actual headlines |
| `shopifyStore`, `shopifyProducts`, `shopifyNewProducts30Days` | Whether they run a public Shopify catalogue and whether it is moving |
| `mobileApps`, `appNames` | Apps published under the company's own name |
| `whyUnknown` | Why any signal could not be read, so a blank is never mistaken for a zero |

### Example: five companies, September 2026

One run from Apify's servers, 8.4 seconds:

| Company | Level | What it found |
|---|---|---|
| **stripe.com** | busy (10) | 665 open roles, 100 posted in 30 days · 600–700 Google ads · 68 articles in 30 days · 3 apps |
| **figma.com** | busy (10) | 152 open roles, 33 posted in 30 days · 400–500 ads · strong press · 2 apps |
| **gymshark.com** | busy (10) | 24 open roles, **21 posted in 30 days** · 3,000–4,000 ads · Shopify store · 2 apps |
| **posthog.com** | active (7) | 9 open roles, 5 posted in 30 days · 200–300 ads · moderate press |
| **tarsnap.com** | nothing found (0) | No public board, no ads, no recent coverage |

Gymshark is the interesting row: a small board, but 21 of its 24 roles were posted in the last month and it is running thousands of ads. That is a company in motion, and a headcount number alone would have missed it.

### How the grading works, and what it refuses to do

- **Each signal is graded on what was observed**: strong, moderate, light, none — or **unknown**, which is different. A company with no findable careers board is not "not hiring"; `whyUnknown` says so in words. Unknown never counts towards the score.
- **Advertising uses the low end of Google's range.** Google publishes "600–700 ads", so the grade is based on 600: the number we can stand behind.
- **Press means the last 30 days**, because that is what being in the news means. The 90-day figure is there for context.
- **The bands are calibrated against a real spread**, not invented: Tarsnap and SourceHut score 0, Pinboard 3, Basecamp and PostHog 7, Stripe and Figma 10. "Busy" is reserved for 8 and above so it keeps meaning something.
- **Long lists should turn the ad format split off.** The ad count costs one request per company; splitting it into text, image and video costs three more, and Google starts refusing a server after roughly a hundred requests. A 24-company run with the split on came back with 14 advertising signals unreadable; the same list with **Split ads into text, image and video** turned off came back with none. The split is never fetched for a company running no ads.
- **The score compares companies read the same way.** Change the country or turn off a signal and the scores shift; compare within a run, not across runs with different settings.

### What it does not do

It does not name people, find email addresses or read LinkedIn. Every source here is a company's own public output: its careers board, its ads, its press, its catalogue, its apps. That is a deliberate limit — it is what keeps the Actor working without logins, proxies or a data broker's terms of use.

### Popular signal reports

Ready-made runs you can open and start, or copy as a starting point:

- [SaaS Buying Signals: Who Is Hiring and Advertising](https://apify.com/precious_bathmat/b2b-company-signals/examples/saas-companies-hiring-and-advertising)
- [Ecommerce Brand Signals: Ads, Stores and Hiring](https://apify.com/precious_bathmat/b2b-company-signals/examples/ecommerce-brands-buying-signals)
- [Fintech Buying Signals: Hiring, Ads and Press](https://apify.com/precious_bathmat/b2b-company-signals/examples/fintech-companies-buying-signals)
- [AI Company Signals: Who Is Hiring and Spending](https://apify.com/precious_bathmat/b2b-company-signals/examples/ai-companies-hiring-signals)
- [Which Companies Are Hiring Right Now, and For What](https://apify.com/precious_bathmat/b2b-company-signals/examples/companies-hiring-in-volume)
- [Who Is Advertising on Google, and How Heavily](https://apify.com/precious_bathmat/b2b-company-signals/examples/who-is-advertising-on-google)
- [UK Company Signals: Hiring, Ads and Press](https://apify.com/precious_bathmat/b2b-company-signals/examples/uk-companies-buying-signals)
- [German Company Signals: Hiring, Ads and Press](https://apify.com/precious_bathmat/b2b-company-signals/examples/german-companies-buying-signals)
- [Shopify Brands: Catalogue Size and New Products](https://apify.com/precious_bathmat/b2b-company-signals/examples/shopify-brands-adding-products)
- [Which Companies Are in the News This Month](https://apify.com/precious_bathmat/b2b-company-signals/examples/companies-in-the-news-this-month)
- [HR Tech Buying Signals: Hiring, Ads and Press](https://apify.com/precious_bathmat/b2b-company-signals/examples/hr-tech-companies-signals)
- [Developer Tools Signals: Hiring, Ads and Press](https://apify.com/precious_bathmat/b2b-company-signals/examples/devtools-companies-signals)
- [Travel Company Signals: Ads, Hiring and Press](https://apify.com/precious_bathmat/b2b-company-signals/examples/travel-companies-buying-signals)
- [Agency Prospecting: Brands That Just Started Advertising](https://apify.com/precious_bathmat/b2b-company-signals/examples/agency-prospecting-signals)
- [Portfolio Monitoring: Hiring, Ads and Press Weekly](https://apify.com/precious_bathmat/b2b-company-signals/examples/portfolio-monitoring-signals)

### Pricing

**$0.03 per company report**, whatever it finds. All five signals are included; a company where nothing is found still costs $0.03, because the checks were still run — but a run that hits your spending limit stops rather than charging past it.

A hundred companies cost $3.00. The example run above used under a cent of platform usage at 512 MB.

### Input

| Setting | What it does |
|---|---|
| **Companies** | One per line. A website works best; a name also works, and a Workday careers link is read directly |
| **Signals to read** | Any of hiring, advertising, press, Shopify, apps — fewer signals means a faster, cheaper run |
| **Country** | Which country's Google ads, news and app store to read |
| **Roles to read per company** | How many open roles to read when working out what they are hiring for |
| **Split ads into text, image and video** | On by default; turn it off for lists longer than about twenty companies |

### Integrations

Runs on a schedule and connects to Google Sheets, Slack, Zapier, Make or your own code through the Apify API. A weekly run over the same list turns these snapshots into a change feed: who started hiring, who started advertising, who went quiet.

# Actor input Schema

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

One company per line. A website works best ("figma.com"); a name also works, and a Workday careers link is read directly.

## `signals` (type: `array`):

Each one is a separate source, so fewer signals means a faster, cheaper run.

## `country` (type: `string`):

Which country's Google ads, news and app store to read.

## `maxRolesPerCompany` (type: `integer`):

How many open roles to read when working out what a company is hiring for. The open-role count itself comes from the board and does not depend on this.

## `adFormatBreakdown` (type: `boolean`):

On by default. It costs three extra requests per advertising company, and Google starts refusing a server after about a hundred — turn it off for lists longer than about twenty companies to keep every advertising signal readable.

## Actor input object example

```json
{
  "companies": [
    "monday.com",
    "gymshark.com"
  ],
  "signals": [
    "hiring",
    "advertising",
    "press",
    "shopify",
    "apps"
  ],
  "country": "US",
  "maxRolesPerCompany": 200,
  "adFormatBreakdown": true
}
```

# Actor output Schema

## `signals` (type: `string`):

Hiring, advertising, press, store and app signals per company.

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

What was found per company.

# 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 = {
    "companies": [
        "figma.com",
        "notion.so",
        "ramp.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("precious_bathmat/b2b-company-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 = { "companies": [
        "figma.com",
        "notion.so",
        "ramp.com",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("precious_bathmat/b2b-company-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 '{
  "companies": [
    "figma.com",
    "notion.so",
    "ramp.com"
  ]
}' |
apify call precious_bathmat/b2b-company-signals --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,precious_bathmat/b2b-company-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/kx4bQ1iVP29JuU7Vj/builds/l68o5S6a5dJAODoMs/openapi.json
