Company Signals Monitor: Hiring, Ads, Tech and News Changes avatar

Company Signals Monitor: Hiring, Ads, Tech and News Changes

Pricing

from $15.20 / 1,000 company checkeds

Go to Apify Store
Company Signals Monitor: Hiring, Ads, Tech and News Changes

Company Signals Monitor: Hiring, Ads, Tech and News Changes

Turn company domains into an account watchlist: one row per company with what changed since the last run. Buying signals from hiring and ads changes, tech stack moves and news. Alerts to Slack, Discord or Telegram, or to Google Sheets or Clay. Only companies a signal answered for are billed.

Pricing

from $15.20 / 1,000 company checkeds

Rating

0.0

(0)

Developer

Adrian Voss

Adrian Voss

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

Paste a list of company domains. Every run comes back with one row per company saying what that company is doing now and what moved since the last time you checked: roles opened and closed, ad platforms switched on and off, technologies added and dropped, and the news published in between. One number per company, 0 to 100, ranks the list for you.

Who it's for

Anyone who keeps a list of companies and needs to know when something happens on it.

  • Sales and account research. 200 target accounts, checked every morning. The four that started hiring salespeople and switched on LinkedIn ads this week are the four worth a call today.
  • Agencies and consultancies. A prospect that just added HubSpot, started running Google Ads and opened three marketing roles is buying the thing you sell, this quarter.
  • Competitive watching. Where is a competitor hiring, what did they just put on their site, and when did they start advertising.
  • Recruiters. Companies opening roles in your niche, with the board link and the department mix on the row.
  • Anyone building a list. Feed it the output of a company-finding step and let it score and re-score the list on a schedule.

What a watchlist run gives you

The first run for a company is its baseline: you get the current picture, the changes are empty, and firstRun is true. From the second run on, every row carries both.

NowSince the last run
Hiringopen roles, top departments, the job board link, the job systemroles added, roles closed, the percentage change
Adsrunning on Google / LinkedIn / Meta, and how many ads eachplatforms newly started, platforms stopped
Techthe technologies on the homepageadded, removed
Newsthe three newest headlines with links and dateshow many articles since the last check

Plus signalScore (0 to 100), changedSignals (which of the four moved), lastCheckedAt, and a plain-English note whenever anything about the row needs explaining.

The four signals

Hiring. We find the company's job board ourselves from its own website: a board link or embed on the homepage, then /careers, /jobs, /karriere, /join-us and careers-looking links, then, if nothing names a board, one probe per job system with a name derived from the domain. Ten systems are read: Greenhouse, Lever, Ashby, Workable, SmartRecruiters, Personio, Recruitee, Teamtailor, Workday and iCIMS. A board found by probing that turns out to belong to a different company is rejected, not reported.

Ads. Google's own Ads Transparency Center (by domain, which is exact), the LinkedIn Ad Library (by brand name) and Meta's Ad Library API (by brand name, and only with your own token). Each platform answers for itself: one being rate-limited never affects the other two.

Tech. The company's homepage HTML and its response headers, matched against 37 high-precision fingerprints across ecommerce, CMS, frameworks, analytics, marketing, chat, CDN, hosting, payments and bot protection. A page that merely mentions a product is not a match; the fingerprint has to be a real asset path, script variable or header.

News. Google News, searched for the company's name and its domain together, over exactly the window since your last check (capped at one week). A quiet week comes back as 0, which is a real answer, not a blank.

The signal score, in full

0 to 100, and deliberately split in two halves so you can read it at a glance.

The first 40 points describe the company as it is now. They are available on the very first run, when there is nothing to compare against:

ComponentMaxHow
Open roles151 point per open role, capped at 15
Ad platforms live105 points per platform running ads, capped at 10
News this window155 points per article since the last check, capped at 15

The other 60 points describe movement since the previous run, and are 0 on a first run:

ComponentMaxHow
Roles added306 points per new open role, capped at 30
Ad platforms newly started2010 points per platform that switched ads on, capped at 20
Tech stack moved105 points per technology added or removed, capped at 10

So a score at or below 40 means nothing moved — it is just the current picture — and every point above 40 is a real change since you last looked. firstRun on the row tells you which of the two a score belongs to.

Roles closed and ad platforms stopped are reported on the row but score nothing. They are the interesting half of a churn story, but they are not buying signals, and counting them would let a company shedding its whole engineering team outrank one that is hiring.

What "changed" is allowed to mean

A monitor is only as good as its willingness to say "I don't know". Three rules, and there are unit tests for each of them:

  1. A signal that could not be read is never a change. If the LinkedIn Ad Library returns 403, that company did not "stop advertising on LinkedIn" — the column comes back empty, adsStopped stays empty, and the note says LinkedIn did not answer. The previous answer is kept, so the run after the failure can still report a real change.
  2. Roles closed is withheld unless both runs read the whole board. On a board bigger than the pages we read, a role sliding onto a later page would look closed. rolesRemovedSinceLast comes back empty instead, and the note says why. Roles added is still reported, because a new posting id is a new posting id either way.
  3. A company that moves to a different job board re-baselines. The old and new boards have completely different posting ids, so comparing them would report every role as both closed and new at once. Hiring re-baselines for that company, and the note says so.

Alerts to Discord, Slack or Telegram

Paste a Discord or Slack webhook, a Telegram bot link, or any https link of your own into Send an alert to this link, and every company whose signals moved is posted there as it is found, with the score, what changed and the newest headline. Companies with nothing new are never posted.

Alerts are free and never change what a run costs. The link is stored encrypted, never written into your results, and stripped out of every message this actor writes. Above the per-run cap, the rest are folded into one "+N more" summary message.

What a run costs, and how to control it

The price is per company, and the same whichever signals you keep — but dropping a signal is what makes a run cheaper and faster, because the requests behind it are simply not made. Hiding a column is not: it only changes what the table shows.

  • Only want new job postings? Keep hiring and drop the other three.
  • Only want ad changes? Keep ads.
  • Watching a long list? hiring and tech share one request to the company's homepage between them, so keeping both costs barely more than keeping one.

A quiet re-check is charged the same as a busy one: the same requests to the same four targets were made either way, and "nothing changed this week" is the answer you are paying for. What is never charged is a company where every selected signal failed to answer — that row comes back found: false with a message saying what each one reported, and costs nothing.

How to use

  1. In the Apify Console. Open the actor page and click Start — the domains field is already pre-filled with a working example. Results land in the run's dataset as soon as each item is found.
  2. Via the API. Call it directly with a POST request — no Console needed once you have an API token:
    curl "https://api.apify.com/v2/acts/accountable_eel~company-signals-monitor/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \
    -X POST \
    -H "Content-Type: application/json" \
    -d '{"domains":["notion.com","hubspot.com"]}'
  3. On a schedule. Save this actor as an Apify Task with the input you want, then add a Schedule (hourly, daily, weekly) so it runs on its own — no server of your own required.

Input

{
"domains": [
"notion.com",
"hubspot.com"
]
}

One company domain per line. A careers-page URL or a job-board URL works too. Run the same list on a schedule and every row tells you what changed since the run before. Accepted formats: notion.com, https://www.hubspot.com, https://stripe.com/jobs.

Three more things worth filling in:

  • Watchlist name. This is what keeps two schedules apart. Two lists sharing a name share one memory, so each would tell the other's companies that everything changed.
  • Company names, one per domain, in the same order. LinkedIn and Meta match ads by brand name rather than by domain, and Google News searches better with a real name.
  • Which signals to check. All four by default.

Output

One row per company.

queryfoundstatusdomaincompanyNameopenRolesrolesAddedSinceLastrolesRemovedSinceLasthiringGrowthPcttopHiringDepartmentscareersUrlatsNameadsGoogleadsLinkedinadsMetaadsStartedadsStoppedadsCountssampleAdUrlstechStacktechAddedtechRemovednewsCountSinceLastlatestHeadlinesnewsWindowHourssignalScorechangedSignalsfirstRunhiringStatusadsStatustechStatusnewsStatuslastCheckedAtnotenotifyErrorsscrapedAt
notion.comtrueOK<change in open roles (%)><running google ads?><running linkedin ads?><running meta ads?><news window (hours)><signal score (0 to 100)><first run for this company?>1970-01-01T00:00:00.000Z

A company where every selected signal failed comes back as a row with "found": false, a message saying what each one reported, and no charge.

Two ready-made views on the results: Signals now (the current picture) and What changed (the delta columns only).

Example runs

Three inputs that need no credentials of any kind and return rows as they stand. Paste one into the Input tab and press Start.

1. A morning watchlist over your target accounts

{
"domains": ["notion.com", "hubspot.com", "figma.com"],
"deltaName": "target-accounts"
}

2. New job postings only, across a list of companies

{
"domains": ["notion.com", "hubspot.com", "stripe.com", "canva.com"],
"signals": ["hiring"],
"deltaName": "hiring-watch"
}

3. Who just started advertising

{
"domains": ["hubspot.com", "notion.com", "monday.com"],
"signals": ["ads", "news"],
"deltaName": "ads-watch"
}

Run any of them twice, a day or a week apart, and the second run is where the change columns fill in.

Pricing

Pay-per-event. A flat per-run fee covers session/proxy warmup; each independent source is billed under its own event, only when that source actually returns data — see .actor/pay_per_event.json for exact prices. A miss is never charged.

Concretely: one charge per company, once, when at least one of the signals you selected returned data. A company where every selected signal failed to answer is billed nothing. A quiet re-check is billed the same as a busy one, because the same checks were made.

Use it from Clay, n8n, Make, or an AI agent

This actor runs synchronously over plain HTTP — call it directly from a script, a workflow tool, or an AI agent, no Apify Console needed once you have an API token.

curl "https://api.apify.com/v2/acts/accountable_eel~company-signals-monitor/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \
-X POST \
-H "Content-Type: application/json" \
-d '{"domains":["notion.com","hubspot.com"]}'

n8n. Add an HTTP Request node: Method POST, URL https://api.apify.com/v2/acts/accountable_eel~company-signals-monitor/run-sync-get-dataset-items?token=<YOUR_TOKEN>, Body Content Type JSON, JSON Body {"domains":["notion.com","hubspot.com"]} (swap in an expression from an earlier node for a real value).

Clay. Add an "HTTP API" column: Method POST, URL https://api.apify.com/v2/acts/accountable_eel~company-signals-monitor/run-sync-get-dataset-items?token=<YOUR_TOKEN>, Body {"domains":["{{company}}"]}, mapping the row's company into the domains array.

MCP. In Claude, Cursor, or any MCP client with the Apify MCP server, ask for "Company buying signals: hiring, ads, tech and news" — the agent will find and run this actor.

vs. the alternatives

What it doesWhat it doesn't
This actorFour signals per company in one row, plus what changed since your last run, plus a score and a webhook alertIt is a watchlist, not a database: it reads the four sources live on every run, so the first run is always a baseline
A hiring-signal or ads-presence tool on its ownOne signal, in more depth (every job row, every ad creative)No cross-signal view, and no notion of "since last time"
A sales-intelligence platformFirmographics, contacts, intent data, a seat-priced subscriptionRarely tells you what changed this week on your own list, and never for a fraction of a cent per company
A tech-stack lookupA broader fingerprint listOne reading, no history, no hiring or ads

Limits, stated plainly

  • The first run for a company is always a baseline. There is nothing to compare it against. Schedule the same input and the second run onwards is where the value is.
  • A named watchlist is how the memory works. Two different lists under the same name will tell each other's companies that everything changed. Name them separately.
  • News reaches back one week at most, even if the watchlist has not run for a month.
  • Meta needs your own Ad Library API token. Without one the Meta column stays empty. Outside the EU and UK, Meta's official API only covers political and issue ads, not ordinary commercial ones.
  • LinkedIn and Meta match by brand name, not by domain, so fill in the company names for a company whose brand does not match its domain.
  • Workday boards are only found from a link on the company's own site. Paste the careers-page URL for a company you know is on Workday.
  • The tech reading is of the homepage, not of every page on the site, and covers 37 fingerprints rather than every product on the market.
  • Open roles can be an estimate on a very large board, and the row says so.

Data and privacy

Everything read here is public company information: a company's own website and careers pages, its job board's public listing feed, the ad-transparency libraries the platforms publish by law, and Google News. No personal data about individuals is collected, and nothing is read behind a login.

Your Meta token and your alert link are both stored encrypted, are never written into your results, and are stripped out of every message and error this actor produces. The watchlist memory stores only what it needs to compare two runs: job posting ids, which ad platforms were running, technology names, and a timestamp.

FAQ

Why is my first run's score so low? Because 60 of the 100 points measure change, and a first run has nothing to change against. A first run maxes out at 40. Run it again tomorrow.

Can I get an alert only when something happens? Yes, two ways, and they are independent. Turn on Only return companies where something changed to leave quiet companies out of the results, and paste a webhook link to have the changed ones pushed to Discord, Slack or Telegram as they are found.

Does hiding columns make it cheaper? No. Dropping a signal does, because the requests behind it are not made. Columns only change what the table shows.

Why does a company show no job board when I know it is hiring? Most often it is on Workday, which can only be found from a link on the company's own site. Paste the careers-page URL instead of the bare domain. Occasionally a company's careers page is built so that its board is loaded by a script we cannot see, and the note will say how many pages were read.

Is adsMeta empty because the company runs no Meta ads? Only if you supplied a token. Without one, the column is empty because the check could not be made, and the note says so. Empty never means "no" on any of the three ad columns: a platform that did not answer is empty, and only a platform that answered gets a true or a false.

Can two schedules share a watchlist name? They can, but they should not. The name is the memory, so two lists sharing one would each report the other's companies as changed.

How often should I run it? Daily is the sweet spot for hiring and ads. Weekly is plenty for tech stacks. Anything less often than weekly and the news window starts truncating.

  • Company Hiring Signals — the hiring signal on its own, in full depth: every open role as its own row, locations, remote share and posting ages.
  • Ads Presence Unified Lookup — Google, LinkedIn and Meta ad presence on its own, with counts and sample creatives per platform.
  • Website Tech Stack Detector — the tech reading on its own, with the category of every technology found.
  • Google News Lookup — any Google News search as a list of articles, with its own monitoring mode.
  • Company Domain Enrichment — the step before this one: turn a company name into a domain, then watch it here.