Signals

Create Account Watchlist signal

Upload your accounts once and hear about everything that happens to them - one list, one daily budget, one set of destinations.

Every other watchlist answers one question about your accounts: did they raise, are they hiring, did someone join. This one asks all of them at once, so you stop maintaining the same company list in a dozen places and stop reconciling a dozen webhooks.

Input: companies (a name, a domain, or a LinkedIn company URL per entry - send the LinkedIn URL whenever you have it, it is the only one of the three that separates two companies sharing a name - or an object {name, domain, linkedinUrl} carrying all three; strings and objects can be mixed), sources (which events to watch - omit it for the defaults), firstRunLookbackDays (default 180), dailyLeadLimit, plus persona and enrichment flags (targetPersonas, getEmails, getPhones) which apply to every event.

Events you can switch on, as keys of sources: fundraising, mergers_acquisitions, forecasted_funding, forecasted_ipo, forecasted_acquisition, forecasted_growth, public_tenders, job_offers, recruitment_campaign, new_decision_makers, company_post_reactions, competitor_social_reactions, competitor_connections, company_news. Each entry is an object taking enabled. Every event except company_news is on by default, so omit sources to watch for all of them and send it only to switch some off. company_news (funding, acquisitions, new locations, leadership changes, launches, contracts, restructuring and upcoming trade shows reported in the news, each checked against the article itself) is off unless you send {"company_news": {"enabled": true}}. competitor_connections is the slowest to produce - the relationships it reports build over weeks - so expect it to be quiet at first.

Output: every event at a watched company is pushed to your webhookUrl as an ordinary lead. signal.id and signal.type always identify THIS watchlist, whichever event fired, so one handler covers the whole list; signal.last_signal names the event, and is the field to switch on. company is always populated; contact is the empty string for company-level events (a funding round, a tender) and a contact object for person-level ones (a new decision maker, a post reactor, or any event with persona targeting on).

Billing: a flat 3 credits per lead, whichever event produced it. The dailyLeadLimit is ONE budget across every event you enabled, not one per event.

The first check reaches back firstRunLookbackDays and delivers the matching events from that window, so an uploaded list is worth something the same day; later checks deliver only what is new. It is bounded on purpose - an unbounded first run would bill you for years of history the moment you save.

companies 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}/companies, and add or remove companies with POST / DELETE on the same path.

post/api/v1/signals/account-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/account-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": {
    "companies": [
      "https://www.linkedin.com/company/doctolib",
      {
        "domain": "payfit.com",
        "linkedinUrl": "https://www.linkedin.com/company/payfit",
        "name": "PayFit"
      },
      "Lemlist"
    ],
    "firstRunLookbackDays": 180,
    "getEmails": true,
    "sources": {
      "competitor_connections": {
        "enabled": false
      },
      "fundraising": {
        "enabled": true
      },
      "job_offers": {
        "enabled": true
      },
      "mergers_acquisitions": {
        "enabled": true
      },
      "new_decision_makers": {
        "enabled": true
      }
    },
    "targetPersonas": [
      "Sales Director"
    ]
  },
  "dailyLeadLimit": 50,
  "name": "My key accounts",
  "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.