Skip to content
Fiber AI Help Center
Fiber AI Help Center

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:

  1. Refresh — re-checks the current state of every entity you're tracking, at the cadence you set.

  2. Compare — diffs the fresh data against what it last saw for that entity.

  3. 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:

  1. Create a tracker list — a named container that holds tracked entities and one or more rules.

  2. Add entities — add companies (by LinkedIn URL, slug, or org ID) or people (by LinkedIn URL, slug, or user ID).

  3. Define rules — each rule watches for a specific type of change (e.g., "headcount crossed 100," "person changed company").

  4. Fiber monitors automatically — at the refresh interval you set (1–30 days), Fiber re-checks each entity and evaluates your rules.

  5. 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 trackingRules to replace the entire rule set. Passing an empty array clears all rules.

  • Granular — use addRules and/or removeRuleIds to 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

threshold

integer

Yes

The headcount number to watch for crossing

direction

"above" or "below"

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

minPercentChange

number (1–1000)

Yes

Minimum percent change to trigger (e.g., 20 = 20%)

direction

"grew", "shrank", or "either"

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

milestone

integer

Yes

Employee count milestone to watch

direction

"above" or "below"

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

department

string

Yes

Department name (e.g., "Engineering", "Sales")

threshold

integer

Yes

Employee count threshold

direction

"above" or "below"

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

titleKeywords

string[]

Yes

Title keywords to match (e.g., ["VP Sales", "Head of"])

minNewHires

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

minAbsoluteGrowth

integer

No

Minimum absolute follower increase. Omit for any increase.

minPercentGrowth

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

minAmountUsd

number

No

Only alert for rounds above this amount. Omit for any.

roundTypes

string[]

No

Filter by round type. Options: pre_seed, seed, angel, series_a through series_g, private_equity, debt_financing, grant, convertible_note, corporate_round, undisclosed. Omit for any.

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

toStages

string[]

No

Only alert for these target stages. Options: pre_seed, seed, series_a through series_g, private_equity, public, acquired. Omit for any.

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

minPriceUsd

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

investorTypes

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

keywords

string[]

Yes

Alert when a job title contains any of these

seniorityLevels

string[]

No

Filter by seniority level. Omit for any.

locationTypes

string[]

No

Filter by location type: "Remote", "On-site", "Hybrid". Omit for any.

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

jobFunctions

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

minArticles

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

keywords

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

minReactions

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

keywords

string[]

No

Keywords to match.

minReactions

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

toStatuses

string[]

No

Target statuses: "operating", "acquired", "closed", "ipo", "subsidiary". Omit for any change.

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

technologies

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

keywords

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

countries

string[]

No

Only alert for offices in these countries. Omit for any.

cities

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

toCompanies

string[]

No

Only alert if they moved TO one of these companies (domains or slugs). Omit for any.

fromCompanies

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

titleKeywords

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

seniorityKeywords

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

toTypes

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

direction

"entered", "exited", or "either"

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

direction

"started", "stopped", or "either"

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

direction

"started", "stopped", or "either"

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

keywords

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

keywords

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

toCountries

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

skills

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

certificationKeywords

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

tags

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

minReactions

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

keywords

string[]

No

Keywords to match in post content.

minReactions

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

threshold

integer

Yes

Connection count to watch for

direction

"above" or "below"

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

threshold

integer

Yes

Follower count to watch for

direction

"above" or "below"

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: eventId is 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.isDummy is true for 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

since

ISO 8601 timestamp. Only return signals observed after this time.

cursor

Pagination cursor returned as cursor in the previous response.

limit

Page size, 1–100 (default 50).

includeDummy

When true, includes test signals. Excluded by default.

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 changes with a since timestamp 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 signalsPOST /v1/tracker/fire-dummy/:listId. Mark one or more rules on a list with isDummy: true, then call this endpoint. Each dummy rule produces a synthetic signal and dispatches a real webhook to your endpoint, with signal.isDummy: true in 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 pass includeDummy=true. There's no cooldown — fire them as often as you need while debugging.

  • Preview a signal payloadPOST /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

/v1/tracker/company-lists

List company lists

GET

/v1/tracker/company-lists

Get company list

GET

/v1/tracker/company-lists/:listId

Update company list

PATCH

/v1/tracker/company-lists/:listId

Delete company list

DELETE

/v1/tracker/company-lists/:listId

Add companies

PUT

/v1/tracker/company-lists/:listId/companies

Remove companies

DELETE

/v1/tracker/company-lists/:listId/companies

Create person list

POST

/v1/tracker/person-lists

List person lists

GET

/v1/tracker/person-lists

Get person list

GET

/v1/tracker/person-lists/:listId

Update person list

PATCH

/v1/tracker/person-lists/:listId

Delete person list

DELETE

/v1/tracker/person-lists/:listId

Add people

PUT

/v1/tracker/person-lists/:listId/people

Remove people

DELETE

/v1/tracker/person-lists/:listId/people

List changes (signals)

GET

/v1/tracker/changes/:listId

Tracker overview

GET

/v1/tracker/overview

Fire dummy signals

POST

/v1/tracker/fire-dummy/:listId

Preview a signal payload

POST

/v1/tracker/rules/preview-signal