Signals

Create Company Followers signal

Get the people who follow a company page — a warm audience that has already raised its hand for that company's content.

Input: linkedinCompanyUrls (the pages to extract from), plus targetPersonas and the firmographic filters to keep only the followers matching your ICP. targetCompanies narrows further to followers who currently work at one of the companies you name (LinkedIn company URLs, up to 50) — use it to watch a page's audience for your own target accounts only.

Output: person-level leads — name, title, LinkedIn URL, company.

⚠️ In icp mode (the default) this signal is quote-based and does not start on its own. It can be active and still deliver nothing: extraction begins only once the follower volume has been priced and the quote accepted. Until then its responses carry a QUOTE_REQUIRED warning. Three ways to start it:

  • call POST /api/v1/signals/{signal_id}/extraction/quote (free), read creditsQuoted, then POST .../extraction/accept (holds the quoted credits; you are charged for the leads delivered);
  • or create it with config.autoQuote: true and a config.maxCredits budget: the quote is requested as soon as the signal is active and accepted for you when it costs no more than maxCredits — above that, it waits for your accept;
  • or accept the quote in the dashboard.

Follow the extraction with GET /api/v1/signals/{signal_id}/extraction. In count mode (extractionMode: "count", extractionLimit followers, unfiltered) there is no quote: activating the signal starts the extraction. extractionLimit must be at least 100: a lower value is refused with 422 and error.code EXTRACTION_LIMIT_TOO_LOW, on create and on a PATCH that sets it.

Company pages are checked. A linkedinCompanyUrls entry that does not exist on LinkedIn is refused with 422 and error.code COMPANY_PAGE_UNAVAILABLE (error.companyUrls lists the pages), on create and on a PATCH that adds it — nothing is created or charged. A page we cannot verify at that moment is accepted with a COMPANY_PAGE_UNVERIFIED warning; if it turns out not to exist, its extraction stops without using credits and the signal carries a COMPANY_PAGE_UNAVAILABLE warning.

Use cases:

  • Competitor audience — the people following a rival already care about the category.
  • Event and community follow-up — reach an audience that opted into a page.
  • ICP validation — who actually follows a company tells you who buys from it.
post/api/v1/signals/company-followers

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/company-followers
  • 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": {
    "getEmails": true,
    "linkedinCompanyUrls": [
      "https://www.linkedin.com/company/lemlist"
    ],
    "locations": [
      "France"
    ],
    "targetPersonas": [
      "HR Director"
    ]
  },
  "dailyLeadLimit": 50,
  "name": "Followers of a competitor page (FR, HR personas)",
  "status": "draft",
  "webhookUrl": "https://your-server.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.