Signals

Create Job Change Watchlist signal

Watch a fixed list of people and get a lead the moment one of them changes job - reach your champion in their new seat while they still have a mandate to change things.

Where the Job Changes signal DISCOVERS movers matching a persona, this one starts from your list: your champions, your buyers, your lapsed prospects.

Input: profiles - the people to watch. Each entry is either a LinkedIn profile URL on its own, or an object {url, currentTitle, currentCompany} carrying the role you already have on file; both forms can be mixed. Send the role when you have it. Every check is billed, the first one included. With a role on file, the first check compares against it and reports any change straight away. With a bare URL, the first check can only report a move made in the last 6 months (it compares the current job with the one before it); anyone who moved earlier stays invisible - recorded as they stand today - and a later move is reported at the next check - one cadenceHours later, a week by default. A bare URL with cadenceHours: 0 therefore only ever reports moves from the last 6 months. Then detectionMode (company - default - fires only on an employer change; title on a new role at the same employer; both), cadenceHours (how often each person is re-checked: 24, 168 - the default - 360, 720, 1080, 1440 or 2160; 0 checks the list once and never again), addedProfilesLookback (first_run - default - gives a bare URL added later the same 6-month look-back as the initial list; recent_only only records where they stand and reports moves from the next check on), plus enrichment flags (getEmails, getPhones).

Output: the create response carries a watchlist object telling you how many profiles are actually being watched and how many were rejected. From then on, each confirmed change is delivered to your webhookUrl as a person-lead: signal carries previous_title / previous_company alongside new_title / new_company, new_job_started_on ("MM/YYYY", the date to test a change against - previous_job_ended_on differs whenever there was a gap between the two jobs), new_job_start_month (the same month as "YYYY-MM", sortable) and change_type (company, title or both), while contact and company describe the person in their NEW role. The previous_* / new_* / change_type keys are a stable contract: present on every change, never renamed or null, "" when a value is unknown - safe to map straight into your CRM. A change is delivered once, and the new role becomes the baseline for the next check.

profiles is consumed into the watchlist, so it is NOT echoed back in the config of this or any later response — the watched list has exactly one home. Read it with GET /api/v1/watchlists/{signalId}/profiles, and add or remove people with POST / DELETE on the same path, without recreating the signal.

Use cases:

  • Follow your champions - when someone who already bought from you moves to a new company, you get a warm intro into an account with a decision-maker who has used your product before.
  • Protect renewals - when your day-to-day contact leaves an account, you learn the day it happens instead of at renewal, in time to build a relationship with their replacement.
  • Re-time a dead deal - a prospect who said no because of budget or an incumbent tool arrives somewhere new with a fresh stack and a mandate to change things; the objection left with the old job.
post/api/v1/signals/job-change-watchlist

Request

  • Base URL: https://api.rodz.io (the document declares no server; this is the origin it was published from)
  • URL: https://api.rodz.io/api/v1/signals/job-change-watchlist
  • Auth: HTTP bearer

Request body

namestring required

Name for this signal

webhookUrlstring nullable

Where each lead is POSTed as it is produced. Optional (since 2026-09-23): omit it when you read leads with GET /api/v1/signals/{signalId}/leads or route them to a connected CRM or sequencer with destinations on PATCH /api/v1/signals/{signalId}.

dailyLeadLimitinteger

Max leads per day

statusstring nullable

Initial status (default: draft).

Example request

{
  "config": {
    "cadenceHours": 168,
    "detectionMode": "company",
    "getEmails": true,
    "profiles": [
      {
        "currentCompany": "Lemlist",
        "currentTitle": "Head of Sales",
        "url": "https://www.linkedin.com/in/marie-dupont"
      },
      "https://www.linkedin.com/in/jean-martin"
    ]
  },
  "dailyLeadLimit": 20,
  "name": "My champions",
  "status": "active",
  "webhookUrl": "https://example.com/webhooks/rodz"
}

Response

Signal created

idstring required
namestring required
statusstring required
signalTypeIdstring required
webhookUrlstring nullable
configobject nullable

Signal-specific configuration

dailyLeadLimitinteger required
leadsTodayinteger required
leadsTotalinteger required
duplicateHandlingstring required

Duplicate lead handling: 'refuse' (never accept), 'allow' (always accept), or 'Xd' (accept after X days)

createdAtstring required
updatedAtstring required
lastLeadAtstring nullable
appliedobject

Settings this signal runs with where they differ from config, keyed like config. {} when every stored setting is applied as stored. A null value means the stored field is not used by this signal. Every entry is explained by a warning naming the same field.

Example response

{
  "applied": {
    "allowUnknownCompanySize": false,
    "maxJobAgeDays": 180
  },
  "config": {
    "companySizeFilters": [
      "201-500",
      "501-1000"
    ],
    "getEmails": true,
    "jobTitles": [
      "CTO"
    ],
    "locations": [
      "France"
    ],
    "maxJobAgeDays": 90
  },
  "createdAt": "2026-01-15T10:30:00Z",
  "dailyLeadLimit": 50,
  "duplicateHandling": "refuse",
  "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "lastLeadAt": "2026-03-15T14:22:00Z",
  "leadsToday": 3,
  "leadsTotal": 127,
  "name": "CTOs changing jobs in France",
  "signalTypeId": "job_changes",
  "status": "active",
  "updatedAt": "2026-03-16T08:00:00Z",
  "warnings": [
    {
      "code": "VALUE_BELOW_MINIMUM",
      "field": "maxJobAgeDays",
      "message": "`maxJobAgeDays` is 90; this signal applies 180. Job changes are delivered up to 180 days after the start date, and a shorter window is raised to that minimum.",
      "severity": "info",
      "values": [
        "90"
      ]
    }
  ],
  "webhookUrl": "https://your-server.com/webhooks/rodz"
}

Changes

No recorded changes to this operation across all 1 revision of this API.