Account Hiring Watch
Last updated October 15, 2026
Watch company domains and get only what changed since the last run: new, closed, and reposted job postings read live from 17 job boards, Greenhouse, Lever, Ashby, and Workday among them. Each row has the full job description, a stable posting key, and 30 day hiring velocity. Flat rows or a webhook.
Install
npx @mambalabsdev/mcp-account-hiring-watchEvery tool here also runs hosted, with no install at all, through Apify's MCP endpoint.
Features
- Returns only what changed since the last run: new, closed, and reposted job postings, read live from 17 job boards.
- Each row has the full job description, a stable posting key, and 30 day hiring velocity per company.
- First run rows set the baseline and are never charged.
- Pay per event: Posting change at $0.01.
Input
domainsarrayrequiredCompany domains to watch. Company website domains, one per line (for example stripe.com). The watch reads each company's own job board and returns only what changed since the last run with the same watch name. Up to 2,000 per run.
watch_namestringoptionalWatch name. Keeps separate watch lists apart. Use one name per list or client. Changing the name starts a new watch, and its first run sets the baseline.
keyword_categoriesarrayoptionalRole categories. Only changes to postings whose title matches these categories are returned and charged. All returns every posting change. Every posting still counts toward hiring velocity.
custom_keywordsarrayoptionalCustom title keywords. Extra title keywords, matched on whole words. Prefix with T1: for the strongest tier or T3: for the weakest; no prefix is tier 2. Adding any keyword also adds the Custom category.
board_hintsarrayoptionalJob board hints. Optional. Point a domain at its job board when the watch cannot find it, as domain=provider:slug. Examples: acme.com=greenhouse:acmeinc, acme.com=workday:acme.wd5/External. Providers: greenhouse, lever, ashby, workable, smartrecruiters, personio, recruitee, workday, rippling.
first_run_modestringoptionalFirst run. What a domain's first run returns. Recent returns postings the board dates inside the last N days. Baseline only returns the summary row. All open returns every open posting. First run changes are marked is_backfill and are never charged.
first_run_recent_daysstringoptionalFirst run window (days). With First run set to Recent: how many days back counts as recent. 1 to 30.
closed_after_missesstringoptionalClose after missed reads. A posting closes after this many complete board reads without it. On Greenhouse, Lever, SmartRecruiters, Workable, and Recruitee a 404 from the posting itself closes it on the first miss. A partial read never counts. 1 to 5.
repost_window_daysstringoptionalRepost window (days). A closed posting that comes back inside this many days is reported as reposted, not new. 7 to 60.
include_job_descriptionstringoptionalInclude full job description. Adds the full description text to new and reposted rows. Closed rows carry no description.
description_max_charsstringoptionalDescription length cap (characters). Longest description kept per row. job_description_chars always reports the full length. 500 to 100000.
webhook_urlstringoptionalWebhook URL. Optional HTTPS endpoint. Changes are sent as signed Standard Webhooks requests. With a webhook set, a change is charged only after your endpoint answers 2xx; until then its dataset row is pending, without the description and URL, and it is retried first on the next run.
webhook_secretstringoptionalWebhook signing secret. Required with a webhook URL. Used to sign each request (HMAC SHA256). A whsec_ prefixed secret is base64 decoded per the Standard Webhooks spec.
webhook_batch_modestringoptionalWebhook batching. Batch sends up to 50 changes per request, grouped by company. Per change sends one request per change, for tools where one request is one row (Clay table webhooks, Zapier).
state_storestringoptionalState store (optional). Optional key value store that holds the watch state. Leave empty to use the store account-hiring-watch-state in your own account.
max_domainsstringoptionalMaximum domains per run. Domains past this number are skipped. 1 to 2000.
max_charge_usdstringoptionalMaximum charge for this run (USD). Optional. When the next change would take this run's charges over this amount, the remaining changes are held and delivered first on the next run. Leave empty to rely only on the maximum cost per run you set in Apify.
Output schema
{
"row_type": "string",
"watch_name": "string",
"company_domain": "string",
"company_name": "string or null",
"posting_key": "string or null",
"event_id": "string or null",
"change_type": "string or null",
"is_backfill": "boolean or null",
"job_title": "string or null",
"job_title_key": "string or null",
"job_location": "string or null",
"location_key": "string or null",
"secondary_locations": "string or null",
"is_remote": "boolean or null",
"job_department": "string or null",
"job_url": "string or null",
"source_board": "string or null",
"also_seen_on": "string or null",
"board_native_ids": "string or null",
"opening_count": "integer or null",
"matched_categories": "string or null",
"matched_keyword": "string or null",
"keyword_tier": "integer or null",
"posted_at": "string or null",
"first_seen_at": "string or null",
"last_seen_at": "string or null",
"closed_at": "string or null",
"days_open": "integer or null",
"reposted_from_closed_at": "string or null",
"job_description": "string or null",
"job_description_chars": "integer or null",
"job_description_truncated": "boolean or null",
"delivery_status": "string or null",
"open_postings": "integer or null",
"open_postings_matched": "integer or null",
"new_postings_30d": "integer or null",
"new_postings_30d_matched": "integer or null",
"prior_postings_30d": "integer or null",
"prior_postings_30d_matched": "integer or null",
"closed_postings_30d": "integer or null",
"closed_postings_30d_matched": "integer or null",
"reposted_postings_30d": "integer or null",
"reposted_postings_30d_matched": "integer or null",
"velocity_change_pct": "integer or null",
"hiring_direction": "string or null",
"surge_flag": "boolean or null",
"velocity_basis": "string or null",
"history_days": "integer or null",
"undated_postings": "integer or null",
"changes_new": "integer or null",
"changes_closed": "integer or null",
"changes_reposted": "integer or null",
"board_provider": "string or null",
"board_slug": "string or null",
"board_match_confidence": "string or null",
"board_total": "integer or null",
"board_truncated": "boolean or null",
"is_baseline": "boolean",
"webhook_expired_changes": "integer or null",
"degraded": "boolean",
"degradation_reason": "string or null",
"row_status": "string",
"error_reason": "string or null",
"billable_events_json": "string",
"source": "string or null",
"source_date": "string",
"read_at": "string"
}Pricing
Pay-per-event billing on the Apify platform. You are charged only when the actor returns a result. No subscription, no seat license.
Free-tier Apify accounts include monthly free compute. Upgrade for higher concurrency and volume.