Account Hiring Watch

live$0.01/posting changeSignal Detection

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.

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

domainsarrayrequired

Company 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_namestringoptional

Watch 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_categoriesarrayoptional

Role 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_keywordsarrayoptional

Custom 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_hintsarrayoptional

Job 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_modestringoptional

First 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_daysstringoptional

First run window (days). With First run set to Recent: how many days back counts as recent. 1 to 30.

closed_after_missesstringoptional

Close 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_daysstringoptional

Repost window (days). A closed posting that comes back inside this many days is reported as reposted, not new. 7 to 60.

include_job_descriptionstringoptional

Include full job description. Adds the full description text to new and reposted rows. Closed rows carry no description.

description_max_charsstringoptional

Description length cap (characters). Longest description kept per row. job_description_chars always reports the full length. 500 to 100000.

webhook_urlstringoptional

Webhook 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_secretstringoptional

Webhook 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_modestringoptional

Webhook 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_storestringoptional

State 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_domainsstringoptional

Maximum domains per run. Domains past this number are skipped. 1 to 2000.

max_charge_usdstringoptional

Maximum 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

json
{
  "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

$0.01per posting change

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.

Available on