Job changes
Find out when the people you care about change jobs. Use Tracker for new integrations; job-change lists stay available for existing ones.
Job changes
Knowing when a champion, customer or past buyer changes jobs is one of the most useful signals in sales. We recommend Tracker for it. Tracker is where we ship improvements to job-change detection first, it watches for promotions and company moves alongside every other person signal, and it's the monitoring API we support most actively.
Job-change lists, our earlier API for the same question, keep working for existing integrations. If you're building something new, start with Tracker.
Track job changes with Tracker
- Create a person tracker list with the job-change rules you care about and a refresh interval.
- Add the people to watch by LinkedIn URL, slug or numeric ID.
- When someone moves, a
tracker.signal_detectedwebhook delivers the change, with the old and new company and title inchangeData. Every signal is also stored for the API.
# 1. Create a person list that checks weekly for company moves and promotions
curl -X POST https://api.fiber.ai/v1/tracker/person-lists \
-H "Content-Type: application/json" \
-d '{
"apiKey": "sk_live_xxx",
"name": "Q3 champions",
"refreshIntervalDays": 7,
"trackingRules": [
{ "type": "person_changed_company", "entityType": "person" },
{ "type": "person_got_promoted", "entityType": "person" }
]
}'
# 2. Add people
curl -X PUT https://api.fiber.ai/v1/tracker/person-lists/LIST_ID/people \
-H "Content-Type: application/json" \
-d '{
"apiKey": "sk_live_xxx",
"people": [
{ "linkedinUrl": "https://www.linkedin.com/in/example-one" },
{ "linkedinUrl": "https://www.linkedin.com/in/example-two" }
]
}'What Tracker gives you on top of a plain "who moved?" list:
- Narrower alerts. Only fire when someone moves to or from specific companies, lands a title with certain keywords, or is promoted into a seniority you sell to.
- More than job moves. Add title changes, open-to-work, stealth moves and posting activity to the same list.
- Your cadence. Pick how often each list is re-checked, and refresh on demand when you need an answer now.
- A structured diff. Each signal carries the before and after, a confidence score, and sources.
Rules, filters, pricing and the full changeData shape for company moves
are on the Tracker page.
Job-change lists (existing integrations)
If you already use job-change lists, nothing changes: lists you've set up keep being checked. This section is the reference for maintaining them.
- Lists are created inactive. Add profiles, then set
isActive: true. - We check active lists weekly. Paused lists aren't checked or billed.
- Each profile's movement history comes back from the profiles read, most
recent first, and moves are pushed by the
job.changedwebhook.
Movement fields
| Field | What it tells you |
|---|---|
movement | promoted, lateral-move, new-role, changed, or no-change |
discoveredAt | When we detected the movement |
newCompanyName, newCompanyDomain, newCompanyLiSlug, newCompanyOrgId, newCompanyLogoUrl | The employer they're at now |
newJobTitle | Their current title |
oldCompanyName, oldCompanyDomain, oldCompanyLiSlug, oldCompanyOrgId, oldCompanyLogoUrl | The employer they came from |
oldJobTitle | Their previous title |
startedInRoleAt, startedAtCompanyAt | When the current role and the current company tenure began |
Operations
All operations are POST under /v1/job-changes/….
| Operation | What it does | Reference |
|---|---|---|
| Create a job-change list | /create-list. Takes a name; returns the list id, created inactive | createJobChangeList |
| Add profiles | /add-profiles. 1–5,000 LinkedIn URLs per call; returns invalidProfiles | addProfilesToList |
| Get a list | /get-list. Name, status, isActive, createdAt; use it to track an upload | getJobChangeList |
| List all lists | /list-all. Every job-change list in your org, cursor-paginated (pageSize 1–100, default 100) | listAllJobChangeLists |
| Read profiles and movements | /list-all-profiles. Each profile with its full movement history; filter by movements, pageSize 1–100 (default 100) | listAllProfilesFromJobChangeList |
| Update a list | /update-list. Rename (newName) or switch tracking on and off (isActive) | updateJobChangeList |
| Remove profiles | /delete-profiles. 1–100 profile ids per call; returns numDeleted | deleteProfilesFromJobChangeList |
| Delete a list | /delete-list. Deletes the list and stops tracking everyone on it | deleteJobChangeList |
Example
Create a list, load it, switch it on, then read back the promotions and new roles:
# 1. Create (returns output.id)
curl -X POST https://api.fiber.ai/v1/job-changes/create-list \
-H "Content-Type: application/json" \
-d '{ "apiKey": "sk_live_xxx", "name": "Q3 champions" }'
# 2. Add profiles
curl -X POST https://api.fiber.ai/v1/job-changes/add-profiles \
-H "Content-Type: application/json" \
-d '{
"apiKey": "sk_live_xxx",
"jobChangeListId": "LIST_ID",
"profiles": [
{ "linkedinUrl": "https://www.linkedin.com/in/example-one" },
{ "linkedinUrl": "https://www.linkedin.com/in/example-two" }
]
}'
# 3. Activate
curl -X POST https://api.fiber.ai/v1/job-changes/update-list \
-H "Content-Type: application/json" \
-d '{ "apiKey": "sk_live_xxx", "jobChangeListId": "LIST_ID", "isActive": true }'
# 4. Read the moves you care about
curl -X POST https://api.fiber.ai/v1/job-changes/list-all-profiles \
-H "Content-Type: application/json" \
-d '{
"apiKey": "sk_live_xxx",
"jobChangeListId": "LIST_ID",
"movements": ["promoted", "new-role"]
}'Webhooks
| Event | Fires when |
|---|---|
job.changed | Tracked profiles changed jobs |
job_changes.profiles_added | Profiles were added to a job-change list |
job.changed carries a profiles array and no success or error
fields, so don't route it through a handler that expects the standard
completion envelope.
Cost
Tracking costs 1 credit per profile per month, billed a quarter at each weekly check. Creating, reading, updating and deleting lists and profiles is free. Rate limits: 60 requests/minute for adding profiles, 120 requests/minute for every other job-change operation. See Billing & credits.
Moving to Tracker
Create a person tracker list with person_changed_company and
person_got_promoted, add the same LinkedIn URLs, and point your webhook
handler at tracker.signal_detected. Once Tracker signals are flowing, pause
the old list with isActive: false.
Related
- Tracker: rule-based monitoring for people and companies
- Webhooks: endpoint setup, signatures, retries
- Contact Reveal: get a new email for someone who just moved
In-app notifications
Every background job, scheduled run, and credit alert lands in a shared team inbox in the dashboard — zero setup, visible to your whole organization.
Market Intelligence APIs
Hotels, Booking.com stays, flights and fare deals, live market quotes, and North American real estate listings, returned as JSON from the same Fiber API.