Tracker
The Tracker feature lets you monitor companies and people on LinkedIn for specific changes. You add the entities you care about to a list, choose the changes you want to watch for, and Fiber re-checks each entity on a schedule. Whenever our system detects a change that matches one of your rules, it delivers a signal so you can act on it immediately.
This is also known as the "signals," "subscriptions," or "watchers" product. Note that saved searches are distinct from this.
Overview
At its core, Tracker does three things on a repeating cycle:
Refresh — re-checks the current state of every entity you're tracking, at the cadence you set.
Compare — diffs the fresh data against what it last saw for that entity.
Alert — when a difference matches one of your rules, it emits a signal (delivered by webhook and stored for you to read via the API).
You don't need to poll LinkedIn, diff profiles, or filter out noise yourself. You declare what you care about (the rules) and how often to look (the refresh interval), and Tracker handles the monitoring.
Typical workflow:
Create a tracker list — a named container that holds tracked entities and one or more rules.
Add entities — add companies (by LinkedIn URL, slug, or org ID) or people (by LinkedIn URL, slug, or user ID).
Define rules — each rule watches for a specific type of change (e.g., "headcount crossed 100," "person changed company").
Fiber monitors automatically — at the refresh interval you set (1–30 days), Fiber re-checks each entity and evaluates your rules.
Receive signals — when a rule fires, Fiber sends a webhook and records the signal so you can also fetch it via the API.
Core Concepts
Tracker has a simple hierarchy. Everything hangs off a list:
List ──▶ Entities (the companies or people being watched) └─▶ Rules (the changes you want to be alerted about) │ ▼ Signals (fired when a rule matches a detected change)
Concept | What it is |
|---|---|
List | A named group of entities that share the same set of rules and the same refresh cadence. A list is either a company list or a person list — you can't mix entity types in one list. |
Entity | A single company or person being tracked. Each entity has its own monitoring history and its own "last checked" clock. |
Rule | A condition evaluated on each refresh — for example, "headcount grew 20%" or "person changed company." A list can have up to 10 rules. Rules are sometimes called subscriptions. |
Signal | A detected change that matched one of your rules. Signals are delivered via webhook and stored so you can fetch them through the API. |
Refresh interval | How often (in days) Fiber re-checks the entities in a list. Minimum 1, maximum 30. |
Lookback period | Optional, per-rule. Compare against a snapshot from ~N days ago instead of the most recent check. Maximum 90 days. |
A rule fires a signal only when the entity's data actually changes in a way that matches the rule. If nothing relevant changed at a given refresh, no signal is produced.
How Monitoring Works
The baseline check
This is the single most important thing to understand about Tracker.
When you add an entity to a list, the first check captures its current state as a baseline. No signals fire on that first check — there's nothing yet to compare against. Signals begin firing from the second check onward, once there's a prior state to diff against.
So if you add companies to a list with a 1-day refresh interval and don't see signals immediately, that's expected: the first cycle is establishing the baseline. You'll start seeing signals from the next cycle, whenever a tracked attribute changes.
Refresh cadence is per-entity
Each entity is checked independently, based on when it was last refreshed — not on a single list-wide timer.
A list with a 7-day interval doesn't re-check every entity at the same moment. Instead, each entity is refreshed roughly 7 days after its own last check. Two practical consequences:
Newly added entities are picked up on the next scheduled cycle, not instantly. There can be a short delay before an entity's baseline is captured.
Adding new entities to an existing list does not reset or delay the entities already in it. Each clock runs on its own.
Refresh behavior at a glance
When | What happens |
|---|---|
Entity first added | Captured on the next cycle as a baseline. No signal. |
Each subsequent refresh | Current state is compared to the previous state. Matching changes fire signals. |
Entity paused or removed | No further refreshes; no further charges. Past signal history is kept. |
Limits & Quotas
Limit | Value |
|---|---|
Companies per list | 1,000 |
People per list | 10,000 |
Rules per list | 10 |
Entities per add/remove call | 100 |
Refresh interval | 1–30 days |
Lookback period | 1–90 days |
Billing & Credits
Each entity check costs 2 credits per refresh. For example, a list of 500 companies refreshed every 7 days costs 500 × 2 = 1,000 credits per week.
Credits are consumed only on entity refreshes. Adding entities, reading signals, managing lists, firing dummy signals, and previewing payloads are all free.
Charges happen when an entity is refreshed — not per signal. A refresh that fires several signals costs the same as one that fires none.
Use the Tracker Overview endpoint (GET /v1/tracker/overview) to forecast spend before you scale. It returns every list, the rules on each, an upcomingRefreshes timeline (earliest first), and aggregate estimated daily and monthly credit burn across all your lists.
To stop charges on a list without losing anything, pause it or remove entities (see Managing Lists).
Lookback Period
By default, each refresh compares the current snapshot of an entity to the most recent previous snapshot (i.e., what changed since the last check).
With the optional lookbackDays field (1–90), a rule instead compares against a snapshot from approximately N days ago. This is useful for:
Detecting changes over a longer window regardless of how often you refresh
"Did X happen in the past 30 days?"-style alerts
Avoiding missed signals when you change your refresh cadence
If no historical snapshot from N days ago is available yet (e.g., the entity was added recently), the rule falls back to comparing against the most recent previous snapshot.
{ "type": "headcount_growth_percent", "entityType": "company", "minPercentChange": 20, "direction": "grew", "lookbackDays": 30 }
Rule Mechanics
Beyond the catalog of rule types below, a few mechanics apply across all rules and aren't obvious from the catalog alone.
Per-item vs. aggregated signals
This affects how many signals (and webhooks) you receive from a single refresh.
Per-item rules emit one signal per detected item. If a company published three relevant posts, opened two offices, or you're tracking new job postings, news, funding rounds, or social posts, each item produces its own signal. This keeps each signal specific and actionable.
Aggregated rules bundle a change into one signal per entity per refresh — for example, a headcount change or a title change produces a single summarizing signal.
If you're sizing webhook volume, assume content- and activity-style rules (posts, news, job postings, funding, new offices) can fan out into multiple signals per refresh, while profile- and metric-style rules produce one.
Managing rules: replace-all vs. granular
When updating a list you have two mutually-exclusive ways to change its rules:
Replace all — pass
trackingRulesto replace the entire rule set. Passing an empty array clears all rules.Granular — use
addRulesand/orremoveRuleIdsto add or remove specific rules without touching the rest.
You cannot combine these in the same request. Sending trackingRules together with addRules/removeRuleIds returns a 400. This guard exists so you don't accidentally wipe your rule set while trying to make a small edit. If you just want to add one rule, use addRules — don't re-send the full trackingRules array.
Company Rules (24 types)
Headcount & Growth
headcount_crossed_threshold
Fires when a company's employee count crosses a specific number going up or down.
Field | Type | Required | Description |
|---|---|---|---|
| integer | Yes | The headcount number to watch for crossing |
|
| Yes | Alert when crossing up or down |
Use case: Get notified when a prospect company grows past 50 employees (likely ready for enterprise tools) or shrinks below 20 (may be downsizing).
{ "type": "headcount_crossed_threshold", "entityType": "company", "direction": "above", "threshold": 100 }
headcount_growth_percent
Fires when headcount grows or shrinks by at least a given percentage.
Field | Type | Required | Description |
|---|---|---|---|
| number (1–1000) | Yes | Minimum percent change to trigger (e.g., 20 = 20%) |
|
| Yes | Direction of change |
Use case: Catch fast-growing startups (grew 30%+) or companies in trouble (shrank 20%+).
{ "type": "headcount_growth_percent", "entityType": "company", "minPercentChange": 25, "direction": "grew" }
employee_count_milestone
Fires when a company's employee count crosses a specific milestone (e.g., 100, 500, 1000).
Field | Type | Required | Description |
|---|---|---|---|
| integer | Yes | Employee count milestone to watch |
|
| Yes | Alert when crossing up or down |
Use case: Similar to headcount_crossed_threshold but semantically represents major milestones for segmentation.
{ "type": "employee_count_milestone", "entityType": "company", "milestone": 500, "direction": "above" }
department_size_threshold
Fires when a specific department's headcount crosses a threshold.
Field | Type | Required | Description |
|---|---|---|---|
| string | Yes | Department name (e.g., "Engineering", "Sales") |
| integer | Yes | Employee count threshold |
|
| Yes | Alert when crossing up or down |
Use case: Alert when a company's engineering team grows past 20 — they're likely investing in building and may need dev tools.
{ "type": "department_size_threshold", "entityType": "company", "department": "Engineering", "threshold": 20, "direction": "above" }
recently_hired_with_title
Fires when a company makes a new hire whose title matches your keywords.
Field | Type | Required | Description |
|---|---|---|---|
| string[] | Yes | Title keywords to match (e.g., ["VP Sales", "Head of"]) |
| integer | No | Minimum new hires to trigger. Default: 1. |
Use case: Know when a target account hires a new VP of Sales (your buyer persona) or a new CTO (decision-maker for your product).
{ "type": "recently_hired_with_title", "entityType": "company", "titleKeywords": ["VP Sales", "Head of Sales", "CRO"], "minNewHires": 1 }
follower_count_growth
Fires when a company's LinkedIn follower count grows significantly.
Field | Type | Required | Description |
|---|---|---|---|
| integer | No | Minimum absolute follower increase. Omit for any increase. |
| number | No | Minimum percent increase. Omit for any increase. |
Use case: Identify companies gaining social traction — often a leading indicator of brand momentum or viral marketing.
{ "type": "follower_count_growth", "entityType": "company", "minAbsoluteGrowth": 1000, "minPercentGrowth": 10 }
Funding & Financials
new_funding_round
Fires when a company raises a new round of funding.
Field | Type | Required | Description |
|---|---|---|---|
| number | No | Only alert for rounds above this amount. Omit for any. |
| string[] | No | Filter by round type. Options: |
Use case: Get notified when tracked companies raise Series B+ rounds above $10M — they now have budget to spend.
{ "type": "new_funding_round", "entityType": "company", "minAmountUsd": 10000000, "roundTypes": ["series_b", "series_c", "series_d"] }
funding_stage_changed
Fires when a company moves to a new funding stage.
Field | Type | Required | Description |
|---|---|---|---|
| string[] | No | Only alert for these target stages. Options: |
Use case: Detect companies progressing to Series A — transitioning from founder-led to building a proper GTM team.
{ "type": "funding_stage_changed", "entityType": "company", "toStages": ["series_a", "series_b"] }
acquired_company
Fires when a company makes an acquisition.
Field | Type | Required | Description |
|---|---|---|---|
| number | No | Only alert for acquisitions above this price. Omit for any. |
Use case: Acquisitions often trigger technology consolidation and vendor re-evaluation — a prime selling window.
{ "type": "acquired_company", "entityType": "company", "minPriceUsd": 5000000 }
new_investor
Fires when a new investor is added to a company's profile.
Field | Type | Required | Description |
|---|---|---|---|
| string[] | No | Only alert for these investor types (e.g., "venture_capital"). Omit for any. |
Use case: When a strategic investor joins the cap table, it often signals a new direction or partnership opportunity.
{ "type": "new_investor", "entityType": "company" }
Hiring & Job Postings
job_posting_with_keyword
Fires when a company posts a job whose title contains your keywords.
Field | Type | Required | Description |
|---|---|---|---|
| string[] | Yes | Alert when a job title contains any of these |
| string[] | No | Filter by seniority level. Omit for any. |
| string[] | No | Filter by location type: |
Use case: A company posting for "data engineer" or "ML engineer" likely needs data infrastructure tools.
{ "type": "job_posting_with_keyword", "entityType": "company", "keywords": ["data engineer", "machine learning", "ML engineer"], "seniorityLevels": ["Senior", "Lead"] }
job_posting_in_function
Fires when a company posts a job in a specific department/function.
Field | Type | Required | Description |
|---|---|---|---|
| string[] | Yes | Department or function names (e.g., "Engineering", "Sales") |
Use case: A company hiring heavily in Sales means they're scaling revenue — they may need CRM, sales enablement, or marketing tools.
{ "type": "job_posting_in_function", "entityType": "company", "jobFunctions": ["Sales", "Business Development"] }
News & Content
company_news
Fires when any news article is published about the company.
Field | Type | Required | Description |
|---|---|---|---|
| integer | No | Only alert if at least this many articles found. Omit for any. |
Use case: Stay informed about companies in your pipeline — news is a natural conversation starter.
{ "type": "company_news", "entityType": "company", "minArticles": 2 }
news_with_keyword
Fires when a news article about the company matches specific keywords.
Field | Type | Required | Description |
|---|---|---|---|
| string[] | Yes | Match against article title or summary |
Use case: Track when target accounts are mentioned in news related to expansion, layoffs, product launches, or specific technologies.
{ "type": "news_with_keyword", "entityType": "company", "keywords": ["expansion", "launch", "partnership", "contract"] }
company_posted
Fires when the company publishes a LinkedIn post.
Field | Type | Required | Description |
|---|---|---|---|
| integer | No | Only alert for posts with at least this many reactions. Omit for any. |
Use case: High-engagement posts from target companies can reveal priorities, wins, or challenges that make great outreach hooks.
{ "type": "company_posted", "entityType": "company", "minReactions": 50 }
company_posted_with_keyword
Fires when a company post matches specific keywords.
Field | Type | Required | Description |
|---|---|---|---|
| string[] | No | Keywords to match. |
| integer | No | Minimum reactions. Omit for any. |
Use case: Know when a company posts about hiring, product launches, or topics relevant to your solution.
{ "type": "company_posted_with_keyword", "entityType": "company", "keywords": ["hiring", "scaling", "AI", "automation"] }
Company Profile Changes
hq_location_changed
Fires when a company's headquarters location changes. No additional fields — triggers on any HQ move.
Use case: Relocations often signal growth (moving to a bigger market) or downsizing. Either way, it's a trigger event for outreach.
{ "type": "hq_location_changed", "entityType": "company" }
company_status_changed
Fires when a company's operating status changes.
Field | Type | Required | Description |
|---|---|---|---|
| string[] | No | Target statuses: |
Use case: Know when a tracked prospect gets acquired (new buyer), goes public (bigger budget), or shuts down (remove from pipeline).
{ "type": "company_status_changed", "entityType": "company", "toStatuses": ["acquired", "ipo"] }
technology_added
Fires when a company adopts new technologies in their stack.
Field | Type | Required | Description |
|---|---|---|---|
| string[] | No | Only alert for these technologies. Omit for any new tech. |
Use case: If a company adds a competing technology, it's too late. If they add a complementary one, it's the perfect time to reach out.
{ "type": "technology_added", "entityType": "company", "technologies": ["Snowflake", "dbt", "Databricks"] }
company_name_changed
Fires when a company changes its name. No additional fields.
Use case: Name changes often signal rebranding, pivots, or post-acquisition integration.
{ "type": "company_name_changed", "entityType": "company" }
company_description_changed
Fires when a company changes its LinkedIn description/tagline.
Field | Type | Required | Description |
|---|---|---|---|
| string[] | No | Only alert if new description contains one of these keywords. Omit for any change. |
Use case: Description changes reflect strategic pivots — a company adding "AI-powered" to their description may be a fit for your ML tools.
{ "type": "company_description_changed", "entityType": "company", "keywords": ["AI", "machine learning", "automation"] }
company_logo_changed
Fires when a company updates its logo. No additional fields.
Use case: Logo changes are often part of a broader rebrand — a company reinventing itself may be evaluating new vendors.
{ "type": "company_logo_changed", "entityType": "company" }
company_went_inactive
Fires when a company's LinkedIn page appears to have gone inactive. No additional fields.
Use case: Detect companies that may be winding down operations, allowing you to clean your pipeline or adjust outreach.
{ "type": "company_went_inactive", "entityType": "company" }
new_office_location
Fires when a company opens a new office.
Field | Type | Required | Description |
|---|---|---|---|
| string[] | No | Only alert for offices in these countries. Omit for any. |
| string[] | No | Only alert for offices in these cities. Omit for any. |
Use case: A company opening an office in your city creates a local relationship opportunity.
{ "type": "new_office_location", "entityType": "company", "countries": ["US", "UK"], "cities": ["San Francisco", "New York"] }
Person Rules (19 types)
Career Changes
person_changed_company
Fires when a person moves to a different company.
Field | Type | Required | Description |
|---|---|---|---|
| string[] | No | Only alert if they moved TO one of these companies (domains or slugs). Omit for any. |
| string[] | No | Only alert if they moved FROM one of these companies. Omit for any. |
Use case: Your champion at a customer account just moved to a new company — follow them and sell into their new org.
{ "type": "person_changed_company", "entityType": "person" }
person_title_changed
Fires when a person changes their job title.
Field | Type | Required | Description |
|---|---|---|---|
| string[] | No | Only alert if new title contains these keywords. Omit for any title change. |
Use case: Detect when contacts get promoted to decision-making roles (VP, Director, C-level).
{ "type": "person_title_changed", "entityType": "person", "titleKeywords": ["VP", "Director", "Head of", "Chief"] }
person_got_promoted
Fires when a person gets promoted (stays at the same company but gets a more senior title).
Field | Type | Required | Description |
|---|---|---|---|
| string[] | No | Only alert if new title contains these seniority keywords. Omit for any promotion. |
Use case: A newly promoted VP often gets new budget authority and wants to make their mark — ideal for outreach.
{ "type": "person_got_promoted", "entityType": "person", "seniorityKeywords": ["VP", "SVP", "Director", "Chief"] }
person_started_company
Fires when a person starts their own company. No additional fields.
Use case: Track former champions or industry contacts who start companies — they'll need tools from day one.
{ "type": "person_started_company", "entityType": "person" }
person_employment_type_changed
Fires when a person's employment type changes (e.g., full-time to contract).
Field | Type | Required | Description |
|---|---|---|---|
| string[] | No | Only alert for these types (e.g., "Contract", "Part-time"). Omit for any change. |
Use case: Someone going from full-time to contract/consulting may be available as an advisor or buyer at a new client.
{ "type": "person_employment_type_changed", "entityType": "person", "toTypes": ["Contract", "Self-employed"] }
Status Signals
person_stealth_changed
Fires when a person enters or exits stealth mode (hides their activity/profile).
Field | Type | Required | Description |
|---|---|---|---|
|
| Yes | Which transition to watch |
Use case: Someone entering stealth may be preparing to change jobs or start a company — reach out before the news breaks.
{ "type": "person_stealth_changed", "entityType": "person", "direction": "entered" }
person_open_to_work
Fires when a person starts or stops signaling they're open to new opportunities.
Field | Type | Required | Description |
|---|---|---|---|
|
| Yes | Which transition to watch |
Use case: A VP of Engineering who just started "Open to Work" will soon land somewhere and need to evaluate vendors — get on their radar early.
{ "type": "person_open_to_work", "entityType": "person", "direction": "started" }
person_is_hiring
Fires when a person starts or stops signaling they're hiring.
Field | Type | Required | Description |
|---|---|---|---|
|
| Yes | Which transition to watch |
Use case: When your champion signals "Hiring" — they have budget and headcount. Great time to pitch solutions that help their growing team.
{ "type": "person_is_hiring", "entityType": "person", "direction": "started" }
person_became_verified
Fires when a person gets LinkedIn verification. No additional fields.
Use case: Verified profiles often belong to high-profile individuals gaining influence — may indicate leadership visibility.
{ "type": "person_became_verified", "entityType": "person" }
Profile Changes
person_headline_changed
Fires when a person updates their LinkedIn headline.
Field | Type | Required | Description |
|---|---|---|---|
| string[] | No | Only alert if new headline contains these keywords. Omit for any change. |
Use case: Headline changes often signal career transitions, new responsibilities, or personal branding shifts.
{ "type": "person_headline_changed", "entityType": "person", "keywords": ["looking for", "advisor", "consultant", "building"] }
person_summary_changed
Fires when a person updates their LinkedIn summary/about section.
Field | Type | Required | Description |
|---|---|---|---|
| string[] | No | Only alert if new summary contains these keywords. Omit for any change. |
Use case: Summary updates signal a person is actively curating their professional image — often precedes or follows a career change.
{ "type": "person_summary_changed", "entityType": "person", "keywords": ["open to", "seeking", "building"] }
person_location_changed
Fires when a person's location changes.
Field | Type | Required | Description |
|---|---|---|---|
| string[] | No | Only alert if moved to one of these country codes. Omit for any relocation. |
Use case: Detect when contacts relocate to your target geography — opens door for local meetups and relationship building.
{ "type": "person_location_changed", "entityType": "person", "toCountries": ["US", "GB", "DE"] }
Skills & Activity
person_skills_added
Fires when a person adds new skills to their profile.
Field | Type | Required | Description |
|---|---|---|---|
| string[] | No | Only alert for these specific skills. Omit for any new skill. |
Use case: Someone adding "Kubernetes" or "Terraform" to their skills may be starting a cloud migration — relevant for infrastructure vendors.
{ "type": "person_skills_added", "entityType": "person", "skills": ["Kubernetes", "Terraform", "AWS"] }
person_new_certification
Fires when a person earns a new certification.
Field | Type | Required | Description |
|---|---|---|---|
| string[] | No | Only alert for certifications matching these keywords. Omit for any new cert. |
Use case: A new AWS or Azure certification suggests the person is investing in a technology — they may be evaluating complementary tools.
{ "type": "person_new_certification", "entityType": "person", "certificationKeywords": ["AWS", "Azure", "GCP", "Kubernetes"] }
person_tag_gained
Fires when a person gains a system-assigned tag.
Field | Type | Required | Description |
|---|---|---|---|
| string[] | Yes | Tags to watch for |
Use case: Track when contacts gain specific organizational or behavioral tags within Fiber's enrichment system.
{ "type": "person_tag_gained", "entityType": "person", "tags": ["founder", "investor"] }
Social Activity
person_posted
Fires when a person publishes a LinkedIn post.
Field | Type | Required | Description |
|---|---|---|---|
| integer | No | Only alert for posts with at least this many reactions. Omit for any. |
Use case: Monitor decision-makers' posts for engagement opportunities. Commenting on their posts builds relationship before pitching.
{ "type": "person_posted", "entityType": "person", "minReactions": 10 }
person_posted_with_keyword
Fires when a person posts about a specific topic.
Field | Type | Required | Description |
|---|---|---|---|
| string[] | No | Keywords to match in post content. |
| integer | No | Minimum reactions. Omit for any. |
Use case: Know when your buyer posts about pain points your product solves — the most timely, relevant outreach possible.
{ "type": "person_posted_with_keyword", "entityType": "person", "keywords": ["struggling with", "looking for", "evaluating", "scaling challenges"] }
Growth Metrics
person_connections_milestone
Fires when a person's connection count crosses a threshold.
Field | Type | Required | Description |
|---|---|---|---|
| integer | Yes | Connection count to watch for |
|
| Yes | Alert when crossing up or down |
Use case: Track influencers growing their network — crossing 10K+ connections means broader reach for potential partnerships.
{ "type": "person_connections_milestone", "entityType": "person", "threshold": 10000, "direction": "above" }
person_follower_milestone
Fires when a person's follower count crosses a threshold.
Field | Type | Required | Description |
|---|---|---|---|
| integer | Yes | Follower count to watch for |
|
| Yes | Alert when crossing up or down |
Use case: Track contacts becoming thought leaders — crossing 50K followers means they're gaining significant influence.
{ "type": "person_follower_milestone", "entityType": "person", "threshold": 50000, "direction": "above" }
Creative Use Cases: Combining Rules
The real power of Tracker comes from combining multiple rules on the same list to catch complex signals. Here are proven strategies.
1. Buying Intent Detection (Company List)
Combine hiring signals with growth signals to find companies actively investing:
[ { "type": "job_posting_with_keyword", "entityType": "company", "keywords": ["data engineer", "analytics"] }, { "type": "headcount_growth_percent", "entityType": "company", "minPercentChange": 15, "direction": "grew" }, { "type": "new_funding_round", "entityType": "company", "minAmountUsd": 5000000 } ]
Any one of these firing means the company is likely spending — all three together is a very strong signal.
2. Champion Tracking (Person List)
Track your existing champions and power users for career moves:
[ { "type": "person_changed_company", "entityType": "person" }, { "type": "person_got_promoted", "entityType": "person" }, { "type": "person_open_to_work", "entityType": "person", "direction": "started" }, { "type": "person_is_hiring", "entityType": "person", "direction": "started" } ]
When a champion changes companies, you have a warm intro to their new org. When they get promoted, they have more authority to expand your contract.
3. Competitive Intelligence (Company List)
Monitor competitors for strategic moves:
[ { "type": "technology_added", "entityType": "company", "technologies": ["React", "Next.js"] }, { "type": "recently_hired_with_title", "entityType": "company", "titleKeywords": ["VP Product", "CTO"] }, { "type": "acquired_company", "entityType": "company" }, { "type": "company_description_changed", "entityType": "company" } ]
4. Market Expansion Detection (Company List)
Identify companies entering new markets:
[ { "type": "new_office_location", "entityType": "company", "countries": ["US"] }, { "type": "job_posting_with_keyword", "entityType": "company", "keywords": ["country manager", "regional director"] }, { "type": "hq_location_changed", "entityType": "company" } ]
5. Pre-Churn Risk Detection (Person List)
Monitor key contacts at existing customers for early churn signals:
[ { "type": "person_open_to_work", "entityType": "person", "direction": "started" }, { "type": "person_stealth_changed", "entityType": "person", "direction": "entered" }, { "type": "person_changed_company", "entityType": "person" }, { "type": "person_headline_changed", "entityType": "person", "keywords": ["looking for", "open to"] } ]
If your main point of contact is leaving, you need to build a new relationship before the handoff.
6. Fundraise Timing (Company List + Lookback)
Use lookback periods to detect sustained growth patterns that predict upcoming fundraises:
[ { "type": "headcount_growth_percent", "entityType": "company", "minPercentChange": 30, "direction": "grew", "lookbackDays": 90 }, { "type": "job_posting_in_function", "entityType": "company", "jobFunctions": ["Finance", "Legal"] }, { "type": "recently_hired_with_title", "entityType": "company", "titleKeywords": ["CFO", "VP Finance", "Controller"] } ]
30%+ headcount growth over 90 days combined with finance hires often precedes a fundraise announcement.
7. Decision-Maker Identification (Person List)
Track people for signals they've become decision-makers:
[ { "type": "person_got_promoted", "entityType": "person", "seniorityKeywords": ["VP", "C-level", "Director"] }, { "type": "person_is_hiring", "entityType": "person", "direction": "started" }, { "type": "person_follower_milestone", "entityType": "person", "threshold": 5000, "direction": "above" } ]
8. Technology Adoption Timing (Company List)
Catch companies at the exact moment they're evaluating new tech:
[ { "type": "technology_added", "entityType": "company", "technologies": ["Snowflake"] }, { "type": "job_posting_with_keyword", "entityType": "company", "keywords": ["Snowflake", "data warehouse", "dbt"] }, { "type": "recently_hired_with_title", "entityType": "company", "titleKeywords": ["Data Engineer", "Analytics Engineer"] } ]
If they're adding Snowflake, hiring data engineers, AND posting data jobs — they're building a data stack right now.
Signals & Noise
Tracker is conservative by design: it aims to alert you on real changes and stay quiet otherwise.
What fires a signal
A signal fires when a refresh detects a change that matches one of your rules — and only then. A refresh that finds nothing relevant produces nothing.
Noise suppression
Several safeguards reduce false or low-value alerts:
Small fluctuations are filtered. Minor wobble in metrics like headcount or follower count won't trigger a signal — a change has to be meaningful before it counts. (For example, a one-person headcount change won't fire a growth rule.)
Temporary data gaps don't masquerade as changes. If a piece of data is briefly unavailable, Tracker treats it as "unknown," not as "went to zero." This prevents false "person left their company" or "company went inactive" alerts caused by transient gaps.
Promotions and demotions are AI-verified. Title-change signals that look like a promotion or demotion are checked for accuracy before firing, so cosmetic or lateral title edits don't get mislabeled.
Signal confidence
Each signal carries a confidence score between 0 and 1. Deterministic rules (e.g., "headcount crossed a threshold") report 1.0. Rules that involve interpretation report the model's confidence, so you can decide how to weight them in your own automations.
Consuming Signals
There are two ways to receive signals, and they work together: webhooks for real-time push, and the changes API as a durable record you can poll.
Webhooks
When a rule fires, Fiber delivers a tracker.signal_detected webhook. The payload is a self-contained envelope — you can act on it without calling back:
{ "success": true, "eventId": "evt_...", "occurredAt": "2026-06-02T12:00:00.000Z", "entity": { "type": "company", "identifiers": { "linkedinOrgId": "1441", "linkedinSlug": "example-co", "domain": "example.com", "linkedinUserId": null, "name": "Example Co" } }, "subscription": { "id": "rule_...", "type": "headcount_crossed_threshold", "listId": "list_...", "listName": "Target Accounts" }, "signal": { "type": "headcount_crossed_threshold", "summary": "Headcount crossed 100 (now 104)", "changeData": [ { "...": "shape depends on signal type" } ], "confidence": 1.0, "isDummy": false }, "billing": { "creditsCharged": 0, "billingMethod": "per_check" } }
Deduplication:
eventIdis stable across retries — use it to dedupe.Retries: Webhook delivery is retried automatically on failure. If all retries are exhausted, the signal is still stored (see below) and its delivery status is recorded as failed.
Test signals:
signal.isDummyistruefor synthetic test signals (see Dummy & preview signals).
Configure your webhook URL in the Fiber dashboard under Tracker settings.
API polling (the reliable fallback)
Every signal is stored regardless of whether you have a webhook configured. If no webhook is set up, signals are still recorded and fully available through the API. This makes polling a reliable fallback (or primary method) for consuming signals.
GET /v1/tracker/changes/:listId
The same endpoint serves both company and person lists. Useful query parameters:
Parameter | Description |
|---|---|
| ISO 8601 timestamp. Only return signals observed after this time. |
| Pagination cursor returned as |
| Page size, 1–100 (default 50). |
| When |
Each returned change includes id, entityId, entityType, linkedinIdentifier, type, summary, changeData, observedAt, deliveryStatus, and isDummy. The response also returns cursor (null when there are no more pages) and hasMore. Reading changes is free.
Tip: a robust integration listens for webhooks for real-time reaction and periodically polls
changeswith asincetimestamp to backfill anything a webhook endpoint may have missed.
Dummy & preview signals
Two free tools help you build and test before real signals start flowing:
Fire dummy signals —
POST /v1/tracker/fire-dummy/:listId. Mark one or more rules on a list withisDummy: true, then call this endpoint. Each dummy rule produces a synthetic signal and dispatches a real webhook to your endpoint, withsignal.isDummy: truein the payload so you can tell test signals apart. Dummy rules are never evaluated during normal scheduled runs, and dummy signals don't appear in your regular changes feed unless you passincludeDummy=true. There's no cooldown — fire them as often as you need while debugging.Preview a signal payload —
POST /v1/tracker/rules/preview-signal. Pass a rule config and get back an example signal payload. No signal is created, no webhook is sent, and no entity is required — it's purely for seeing the shape of a signal before you create rules.
Managing Lists
Pause and resume
Set isActive: false on a list to pause it. Refreshes stop, so credit charges stop too — but the list's configuration (rules, refresh interval) and all of its signal history are preserved. Set isActive: true to resume. This is the lightweight, fully reversible way to stop spend temporarily.
Removing entities
Removing an entity from a list stops future refreshes and charges for that entity. Its signal history is preserved and remains readable via the changes API.
Removal deactivates the entity rather than hard-deleting it. Note that re-adding the same entity to the same list does not reactivate it or reset its baseline — the previous (deactivated) record remains as-is. A genuinely new entity always starts with a fresh baseline.
Deleting a list
Deleting a list deactivates the list along with all of its entities and rules. Signal history is retained.
API Quick Reference
All routes are under the /v1/ prefix (e.g., https://api.fiber.ai/v1/tracker/company-lists).
Operation | Method | Path |
|---|---|---|
Create company list | POST |
|
List company lists | GET |
|
Get company list | GET |
|
Update company list | PATCH |
|
Delete company list | DELETE |
|
Add companies | PUT |
|
Remove companies | DELETE |
|
Create person list | POST |
|
List person lists | GET |
|
Get person list | GET |
|
Update person list | PATCH |
|
Delete person list | DELETE |
|
Add people | PUT |
|
Remove people | DELETE |
|
List changes (signals) | GET |
|
Tracker overview | GET |
|
Fire dummy signals | POST |
|
Preview a signal payload | POST |
|