Career Change Signal Engine

v1.0.1$0.02/contactContact Discovery

Last updated October 14, 2026

Send the contacts you watch and get back only what changed: who left, who landed where, who replaced them, and who started after a role closed. Each row has evidence, a source date, a segment, a first line draft, and Slack, HubSpot, HeyReach, and Instantly payloads. Runs on your own data and keys.

Install

bash
npx @mambalabsdev/mcp-career-change-signal-engine

Every tool here also runs hosted, with no install at all, through Apify's MCP endpoint.

Features

  • Each row has evidence, a source date, a segment, a first line draft, and Slack, HubSpot, HeyReach, and Instantly payloads.
  • Runs on your own data and keys.
  • Pay per event: Contact checked at $0.02.
  • Pay per event: Signal delivered at $0.068.

Input

peoplearrayrequired

Your watch list, one object per person: name, company domain and name, title, work email, relationship, optional ids, and an optional known role history.

watch_list_idstringoptional

Names the list. State is kept per watch list id when state_source is actor.

state_sourcestringoptional

actor: the engine keeps state between runs in a named store. caller: you send last_reading per person and keep state yourself.

read_modestringoptional

stored_first: your known_history first, then your keys. live_only: ignore known_history. stored_only: only known_history, no key calls.

first_run_modestringoptional

report: the first run returns every change it finds. baseline: the first run stores state and returns nothing, charging only contact_checked.

max_people_per_runintegeroptional

A list longer than this fails the run before any read or charge.

providerKeysobjectoptional

Your own keys: serper or serpapi (web search), prospeo, bounceban (verifier), findymail, exa.

linkedin_reader_dataset_idstringoptional

Optional: the dataset id of a LinkedIn reader run on the same Apify account.

repliesarrayoptional

Optional reply texts: external_id or work_email or profile_url, text, received_at, channel, is_auto_reply.

bouncesarrayoptional

Optional bounces: work_email, bounce_type, smtp_code, smtp_text, bounced_at.

posting_changesarrayoptional

Optional Account Hiring Watch rows. A closed posting starts a new hire search at that company.

suppressionobjectoptional

emails, profile_urls, opted_out_emails, opted_out_profile_urls, company_domains, company_names.

icp_tiersobjectoptional

Optional map of company domain to tier, shown on landed rows.

featuresobjectoptional

Switches: replacement, closed_posting, contact_data, first_line, icp, include_promotions.

sender_contextstringoptional

Optional topic phrase for the first line draft, for example: content production at scale.

max_replacement_candidatesintegeroptional

Candidates proposed per leaver. A person confirms each.

max_spend_usdintegeroptional

Stops the run before a charge that would cross it.

sweep_interval_daysintegeroptional

With state_source actor, a person read within this many days is skipped.

concurrencyintegeroptional

People read at once.

webhook_urlstringoptional

Optional: signed Standard Webhooks POST of up to 100 signal rows per request.

webhook_secretstringoptional

Signing secret; a whsec_ value is base64 decoded.

Output schema

json
{
  "signal_id": "string",
  "watch_list_id": "string",
  "run_id": "string",
  "signal_type": "string",
  "segment": "string or null",
  "row_status": "string",
  "error_reason": "string or null",
  "external_id": "string or null",
  "person_key": "string or null",
  "crm_id": "string or null",
  "deal_id": "string or null",
  "relationship": "string or null",
  "person_name": "string or null",
  "profile_url": "string or null",
  "work_email_last_known": "string or null",
  "previous_company_name": "string or null",
  "previous_company_domain": "string or null",
  "previous_title": "string or null",
  "left_month": "string or null",
  "employment_status": "string",
  "current_company_name": "string or null",
  "current_company_domain": "string or null",
  "current_company_linkedin_url": "string or null",
  "current_title": "string or null",
  "start_month": "string or null",
  "start_month_precision": "string or null",
  "days_in_role": "string or null",
  "in_first_90_days": "string or null",
  "move_type": "string or null",
  "move_type_reason": "string or null",
  "open_to_work": "string or null",
  "fractional_or_self": "string or null",
  "leaver_confidence": "string or null",
  "identity_match": "string",
  "needs_confirmation": "boolean",
  "evidence": "array",
  "reply_class": "string or null",
  "trigger": "string or null",
  "trigger_ref": "string or null",
  "replacement_for_person_key": "string or null",
  "replacement_for_name": "string or null",
  "replacement_for_profile_url": "string or null",
  "replacement_for_title": "string or null",
  "candidate_rank": "string or null",
  "candidate_score": "string or null",
  "match_reasons": "array",
  "confirm_ref": "string or null",
  "new_company_icp_tier": "string or null",
  "new_company_icp_score": "string or null",
  "icp_source": "string or null",
  "work_email": "string or null",
  "work_email_status": "string or null",
  "phone": "string or null",
  "contact_source": "string or null",
  "first_line_draft": "string or null",
  "first_line_method": "string or null",
  "slack_card_json": "string or null",
  "hubspot_properties_json": "string or null",
  "instantly_custom_variables_json": "string or null",
  "heyreach_custom_fields_json": "string or null",
  "heyreach_tags": "array",
  "instantly_tags": "array",
  "webhook_status": "string",
  "source": "string",
  "source_detail": "string or null",
  "source_date": "string or null",
  "source_age_days_inferred": "string or null",
  "read_at": "string",
  "role_history": "array",
  "state_mode": "string",
  "billable_events_json": "string",
  "people_in_input": "integer",
  "people_due": "integer",
  "people_read": "integer",
  "contacts_checked": "integer",
  "signals_emitted": "integer",
  "suppressed_count": "integer",
  "suppression_screened": "boolean",
  "suppressed_by_reason_json": "string",
  "estimated_charge_usd": "integer",
  "stopped_at_cap": "boolean",
  "errors": "array",
  "provider_usage_json": "string"
}

Pricing

$0.02per contact

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.