Signals

Create Competitor Connections signal

Identify every new 1st-degree connection to your competitors' sales and business teams — typically the prospects and customers your competitors are actively engaging, and often the highest-intent leads in your market. Reach them the moment they enter your competitors' network within your target market.

Input: one or more competitor LinkedIn company URLs (linkedinCompanyUrls), optional LinkedIn profile URLs to track directly (linkedinProfileUrls, up to 500 — each named person produces leads only once they have accepted our connection request; a PATCH with a new list starts watching added people and stops watching removed ones); optional enrichment toggles (getEmails, getPhones, getSireneData, detectTechnologies, getHomepageContent); optional persona targeting (targetPersonas, customPersonaTitles); optional ICP filters (companySizeFilters, locations, industryFilters, excludedLocations, excludedTitles, excludedCompanyUrls).

Output: every new 1st-degree connection detected at a tracked competitor, if it matches your filters (persona + ICP), is pushed to your webhookUrl as an enriched person lead; non-matching connections are filtered out. Each webhook payload includes the contact (name, email if enriched, phone if enriched, title, location, LinkedIn profile URL, matched persona), their employer (company name, website, LinkedIn URL, plus detected tech stack and homepage content when those enrichments are enabled), the competitor company URL where the 1st-degree connection was detected (signal.tracked_company, empty when you only watch individual profiles), and the LinkedIn URL of the watched person the lead connected with (signal.tracked_contact) — so a signal watching several people tells you which one produced each lead.

Use cases:

  • Competitor displacement — these people are already evaluating solutions in your category; trigger a differentiation-led outbound sequence the day they connect, while intent is highest.
  • CRM enrichment & routing — push the enriched contact + firmographics (size, industry, tech stack) into your CRM to auto-score and route to the right rep.
  • Account-based triggers — when several people at one target account connect with a competitor, fire an ABM play (ads + SDR + exec outreach) on that account.
  • Win-back watch — cross-reference against your own customer list to spot accounts drifting toward a competitor.
post/api/v1/signals/competitor-connections

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/competitor-connections
  • 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

duplicateHandlingstring nullable

Duplicate lead handling: 'refuse' (never accept), 'allow' (always accept), or 'Xd' (accept a duplicate after X days, e.g. '7d'). Optional — defaults to 'allow', so a contact who triggers this signal a second time is delivered a second time.

statusstring nullable

Initial status (default: draft). Accepts draft, active, or paused. If active, mandatory config fields are validated.

Example request

{
  "config": {
    "companySizeFilters": [
      "51-200",
      "201-500",
      "501-1000"
    ],
    "customPersonaTitles": [
      "VP of Growth",
      "Chief Revenue Officer"
    ],
    "detectTechnologies": false,
    "excludedCompanySizeFilters": [
      "Self-employed",
      "1-10"
    ],
    "excludedCompanyUrls": [],
    "excludedIndustryFilters": [
      "Financial Services"
    ],
    "excludedLocations": [
      "Paris"
    ],
    "excludedTitles": [
      "Intern",
      "Junior"
    ],
    "getEmails": true,
    "getHomepageContent": false,
    "getPhones": false,
    "getSireneData": false,
    "industryFilters": [
      "Technology, Information and Internet",
      "Software Development"
    ],
    "linkedinCompanyUrls": [
      "https://www.linkedin.com/company/lemlist",
      "https://www.linkedin.com/company/la-growth-machine"
    ],
    "locations": [
      "France"
    ],
    "targetPersonas": [
      "Sales Director",
      "Marketing Director"
    ]
  },
  "dailyLeadLimit": 50,
  "name": "Tech competitors in France",
  "status": "active",
  "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.