Signals

Create Warm Intros signal

Get your team's warm intros: the people of your ICP who already worked alongside one of your people - an employee, a founder, a happy client - at the same company and at the same time, so the first message is a referral instead of a cold one. Name the people who can introduce you, or simply give your company page: we read where each of them worked and when, and deliver the former colleagues who now hold the roles you sell to. One lead per person, however many of your people know them, with every introduction path (who, where, how long together) and a strength score to start with the warmest.

Input: sourceProfiles (LinkedIn profile URLs of the people who can introduce you, up to 500; linkedinProfileUrls, the name the other people-based signals use, is accepted as the same field) and/or sourceCompany (a LinkedIn company page, usually yours: its employees become introducers; partners, agencies, freelancers, consultants, ambassadors, affiliates, advisors and board members shown on the page are left out) - at least one of the two is required; minOverlapMonths (minimum months worked at the same company at the same time, 3-120, defaults to 6); includeCurrentCompanies (also use the companies your introducers work at today; defaults to false, since their current colleagues are usually your own team or your client); oneTimeExtractCount (how many people to deliver once, counted in leads delivered after your filters; 0-25,000, defaults to 500; not metered by dailyLeadLimit); dailyNewIntros (true to keep delivering newly found introductions afterwards, up to dailyLeadLimit a day; defaults to false, which stops the signal once the one-time extract is complete); optional persona targeting (targetPersonas, customPersonaTitles); optional ICP filters (companySizeFilters, locations, industryFilters, excludedLocations, excludedCompanySizeFilters, excludedIndustryFilters, excludedTitles, excludedCompanyUrls); optional restrictToCompanies / restrictToProfiles to deliver only people at your target accounts or on your list; optional enrichment toggles (getEmails, getPhones, getSireneData, detectTechnologies, getHomepageContent); webhookUrl, dailyLeadLimit, duplicateHandling, status. At a company over 1,000 people a person counts only if they worked in the same function as your introducer there; over 10,000, also in the same place and for at least 12 months together. People currently working with one of your introducers (your own team) are never delivered. Each lead is billed as it is delivered, once whatever the number of paths: 3 credits per lead for the one-time extract, then 5 credits per lead for the daily new introductions. Activating with status: active checks that your balance covers the one-time extract (oneTimeExtractCount x 3 credits) and answers 402 with the estimate when it does not.

Output: each person is pushed to your webhookUrl as an enriched person lead: the contact (name, email if enriched, phone if enriched, title, location, LinkedIn profile URL, matched persona), their employer today (company name, website, LinkedIn URL), and in signal: intro_paths - every way to be introduced, best first, each with via (the introducer: name, LinkedIn URL, title), entity (the company you share: name, LinkedIn URL, employee count), overlap (start and end as YYYY-MM, months), same_function and strength (0-100: more months together, a smaller company and the same function score higher); intro_strength and intro_tier (strong 70+, likely 50-69, possible) for the best path; intro_reason, that path in one sentence ready for a message or a CRM note; tracked_contact (the best introducer's LinkedIn profile URL) and tracked_company (the shared company's page); and the best path again as flat fields, under the names the alumni signals use, for merge tags, sheet columns and CRM fields: introducer_name, introducer_title, affiliation_name (the shared company), affiliation_started and affiliation_ended (YYYY-MM), overlap_months, same_function. Text that is unknown is ``, never null. The same intro fields reach Google Sheets as columns and outbound tools as merge tags (introReason, introStrength, introTier, introducerName, introducerTitle, affiliationName, affiliationStarted, affiliationEnded, overlapMonths, sameFunction). The single-signal responses report progress in applied.oneTimeExtract (target, delivered, status).

Use cases:

  • Your team's warm intros - give your company page and get the people of your ICP who worked alongside one of your employees, with who can introduce you, where and for how long, so the first touch is a referral instead of a cold message.
  • Happy-client referrals - name your best customers and reach their former colleagues who now hold the roles you sell to, then ask the client for the intro.
  • Account-based prospecting - restrict to your target accounts and see, account by account, which of your people already know someone inside.
  • Prioritised outreach - sort by intro_strength and start with the strongest paths (years together, a small company, the same function).
post/api/v1/signals/warm-intros

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/warm-intros
  • 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 for the daily part (dailyNewIntros). The one-time extract is bounded by oneTimeExtractCount instead.

duplicateHandlingstring nullable

Duplicate lead handling: 'refuse' (never accept), 'allow' (always accept), or 'Xd' (accept a duplicate after X days, e.g. '7d'). Optional. Whatever the setting, one person found through several introducers is ONE lead.

statusstring nullable

Initial status (default: draft). Accepts draft, active, or paused. If active, the config is validated and the balance must cover the one-time extract (oneTimeExtractCount x the price per lead), otherwise 402.

Example request

{
  "config": {
    "companySizeFilters": [
      "11-50",
      "51-200",
      "201-500",
      "501-1000"
    ],
    "dailyNewIntros": true,
    "getEmails": true,
    "oneTimeExtractCount": 2000,
    "sourceCompany": "https://www.linkedin.com/company/lemlist/",
    "targetPersonas": [
      "Sales Director",
      "Head of Growth"
    ]
  },
  "dailyLeadLimit": 50,
  "name": "Warm intros from our team",
  "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.