Signals

Create Competitor Social Reactions signal

Discover prospects your competitors' GTM teams are actively paying attention to by monitoring the posts their sales, customer success, business development, operations, and founder employees engage with.

Input: competitor LinkedIn company URLs (linkedinCompanyUrls, up to 50), time window for engagement detection (postedLimit), engagement types to surface as leads (engagementTypes — e.g. ["poster"] for post authors only, or ["likes", "comments"] for engagers only; defaults to ["poster", "likes", "comments"]), minimum engagement threshold (minEngagement), and standard ICP filters (targetPersonas, companySizeFilters, locations, etc.). Optional excludedCommentKeywords skips people whose comment is only a polite reaction — e.g. ["félicitations", "bravo", "congrats"] on a post announcing a new job; matched as whole words, ignoring case and accents; reactions are never affected.

Output: each surfaced post creates one or more leads (the post author plus engagers matching your engagementTypes config). Every lead is pushed to your webhookUrl as it is detected, filtered by your persona and ICP config. The webhook payload includes signal.tracked_company (which competitor URL surfaced it), signal.tracked_contact (the LinkedIn URL of the specific competitor employee whose like/comment exposed the post), and signal.post_url with engagement details — so your team can trace each lead back to a named buyer at the competitor and frame outreach accordingly.

Use cases:

  • Warm-intent outreach — engagers are actively interested in your category; open with the exact topic they engaged on.
  • Retargeting audiences — build a lookalike / ad-retargeting list from the engagers.
  • Author-first prospecting — the post authors are influential voices in the competitor's orbit and high-value contacts.
post/api/v1/signals/competitor-social-reactions

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-social-reactions
  • 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": [],
    "customPersonaTitles": [],
    "engagementTypes": [
      "likes",
      "comments"
    ],
    "excludedCommentKeywords": [
      "félicitations",
      "bravo",
      "congrats"
    ],
    "excludedCompanySizeFilters": [],
    "excludedCompanyUrls": [],
    "excludedIndustryFilters": [],
    "excludedLocations": [],
    "excludedTitles": [],
    "getEmails": true,
    "getPhones": false,
    "industryFilters": [],
    "linkedinCompanyUrls": [
      "https://www.linkedin.com/company/lemlist/",
      "https://www.linkedin.com/company/salesloft/",
      "https://www.linkedin.com/company/outreachio/"
    ],
    "locations": [],
    "maxPosts": 0,
    "minEngagement": 5,
    "postedLimit": "week",
    "targetPersonas": []
  },
  "dailyLeadLimit": 50,
  "name": "What lemlist's GTM team is reading",
  "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.