Search Contacts
Find contacts by person, role, tenure, geography, industry, company size, company type, and recent job change.
Overview
Use contact search to find people at target accounts through connected sources such as LinkedIn Sales Navigator.
You can search named accounts or find whitespace prospects. Use role filters to define the person. Use industry, company headcount, and company type to define the market.
Recommended workflow
- Confirm that the Sales Navigator connector is active.
- Define the audience with company, role, tenure, and firmographic filters.
- Review the returned role tenure and company tenure.
- Save useful results into a Contact List.
- Run contact signals or enrichment before outreach.
Search strategy
For named-account prospecting, pass companyLinkedInUrls. For whitespace prospecting, omit company URLs and combine industries, companyHeadcounts, and companyTypes.
Use an exact value from the Sales Navigator industry reference. The API rejects unknown industry labels.
Good contact search filters usually include:
- Target companies or firmographic criteria.
- Role or department criteria.
- Seniority constraints.
- Geography or region when territory matters.
- Tenure criteria when timing matters.
Recent movers
Set recentlyChangedJobs: true to use Sales Navigator's Changed jobs filter. LinkedIn controls its rolling window and provides no caller-selected start date. Approximately 90 days is an unverified working assumption.
You can also use yearsInCurrentPosition to define a wider or narrower candidate pool. Run separate searches with Changed jobs, short role tenure, and both filters if you need to compare their coverage.
Each returned position includes:
tenureAtPosition: Time in this current role.tenureAtCompany: Total time at this employer across current and earlier roles.tenureInMonths: the existing collapsed value, kept for compatibility.moveType: our classification of the position. See below.
The two tenure values are returned independently, so you can compare them without a loss of supplier data.
Move classification
moveType tells you if a position looks like a recent move, and which kind. It has four values.
| Value | Meaning |
|---|---|
moved_internally | A new role at an employer the person already worked for. |
joined_new_employer | The tenure values do not show earlier time at this employer. This can also be a missed internal move. |
no_recent_move | The person has held the role for more than 12 months. |
unknown | The tenure data cannot show a direction. |
The classification applies to one position, not to the person. A person can hold more than one current position, and each position gets its own value.
People with several current positions
Some people hold several current roles at once. For example, they can have a main job and a board or advisory role.
The top-level role and companyName fields summarize the current position with the latest startedOn date. A start date with a year but no month counts as January. A dated position wins over an undated position. If dates are equal, or every date is absent, the first position in the response wins.
The summary selection does not reorder or remove anything from positions[]. Use positions[] when you need every current position returned by the search.
The yearsInCurrentPosition, yearsAtCurrentCompany, seniorityLevels, and departments filters match the person. They do not identify which current position matched. A person can match through one position while role and companyName summarize a different, newer position.
Sales Navigator can return a different set or order of current positions for the same person in different searches. When you combine companyLinkedInUrls and jobTitles, Saber can move the matching position to the front of positions[]. The top-level summary still names the position with the latest start date.
We calculate moveType from the two tenure values. A position is a recent move if the person has held the role for 12 months or less. It is an internal move if the company tenure is 1 month or more than the position tenure.
How accurate it is
We measured the classification against 795 people, and compared 175 of them with their full work history.
- Where we gave
moved_internally, it was correct in all 72 cases. It made no false claim. - It finds approximately 2 of each 3 internal moves.
Known limit
Some people do not put an end date on their previous role at the same employer. Sales Navigator then shows only the new role, and decreases the company tenure to agree with the position tenure. That person gets joined_new_employer, although the person moved internally.
This is a limit of the supplier data. Do not read joined_new_employer as proof that the person came from a different employer.
Not a promotion
moveType tells you that the person changed role. It does not tell you that the new role is more senior. We tested a comparison of job titles for this, and it was not reliable.
Sales Navigator does not provide sort control for this search. Keep your own deduplication key across repeated runs.
Pagination
Each request returns one page. The default page size is 25 contacts. The maximum is 100.
Start with your search filters and a limit:
{
"jobTitles": ["Engineering Manager"],
"countries": ["US"],
"limit": 25
}If the response includes nextCursor, send a second request with that value. Repeat the same filters and limit:
{
"jobTitles": ["Engineering Manager"],
"countries": ["US"],
"limit": 25,
"cursor": "djI6MjU6Y29ubmVjdG9yLTEyMw"
}Continue until nextCursor is absent or hasMore is false. Do not calculate the number of pages from total. Only the first 1,000 results are available. Narrow the filters when you need results beyond that limit.
Use cursor for pagination. Saber keeps all pages in one pagination session on the same Sales Navigator connector. The older offset field remains available for compatibility, but it does not keep this connector continuity.
If that connector becomes unavailable, the API returns 422 with error.errorCode: "PAGINATION_SOURCE_UNAVAILABLE". The same response can occur during a service update when an older service version cannot preserve connector continuity; in that case, error.details.reason is "connector_affinity_unsupported". Restart the search without a cursor.
If the API returns 429, wait for the number of seconds in the Retry-After response header. Then retry the same cursor with the same filters and limit.
An unexpected connector mismatch returns 500 with error.code: "PAGINATION_CONNECTOR_AFFINITY_INVALID". Restart the search without a cursor. Contact support if the error repeats.
An invalid, expired, or older cursor returns 422 with error.code: "INVALID_CURSOR". Restart the search without a cursor.
Each successful page costs 0.5 credits. Failed requests do not use Saber credits.
Connector dependency
Contact search depends on connected data sources. If a search returns connector-related errors, check the connector page before changing the filter.
Related workflows
Connectors
Confirm that required data sources are connected.
Contact Lists
Save matched contacts for reuse.
Contact Signals
Research individual contacts after search.