Is Kendo-Linkedin Email Finder safe?
Kendo-Linkedin Email Finder auto-pages LinkedIn search results and uploads every listed member's profile data to its own server.
When the user clicks "Build Email List," the extension repeatedly pages through LinkedIn or Sales Navigator search results, pulling each visible member's name, LinkedIn ID, profile URL, title, company and location from LinkedIn's own page data. It batches this data and sends it to kendoemailapp.com, which returns matched emails and phone numbers billed against the user's purchased credits. Between pages the extension waits a randomized interval and fires synthetic mouse-move events timed to mimic normal browsing before clicking to the next page.
Who publishes itkendo - no other listings under this identity, 5 shared hostnames
kendo - no other listings under this identity, 5 shared hostnames
What this publisher told the store about itself, and the other listings that told it the same thing.
Shared hosts - 5 hostnames
Hostnames hardcoded in this extension that few other listings call. That can mean one operator behind both, and it can equally mean a small shared vendor, so it is context rather than a conclusion. Hosts that many listings call are left out: they are services, not connections.
AI-generated. Findings may contain errors. Those marked Verified have been manually reviewed.
Publishers can request a review.
Findings
Kendo Email Finder auto-scrapes LinkedIn search results and evades bot checks
Code analysis shows Kendo Email Finder auto-paginates LinkedIn/Sales Navigator results, scraping each member's ID, name, URL, title, company, location, then uploads batches to kendoemailapp.com timing mouse moves to evade bot detection.
You click the extension's 'BUILD EMAIL LIST' button on a LinkedIn or Sales Navigator people-search results page.
The extension repeatedly scrapes every visible search result, auto-advances to the next results page, and uploads each batch to the vendor's backend.
This continues unattended until pagination runs out or you click 'STOP PROCESS'.
| Field | Value | Why it matters | |
|---|---|---|---|
LinkedIn member ID | 554382190 | The numeric ID LinkedIn assigns internally to that person's account. | |
Full name | Priya Shah | The member's displayed name. | |
Profile URL | priya-shah-9b21 | The member's public LinkedIn profile slug. | |
Headline/title | VP of Marketing | Their current job title as shown in the search result. | |
Company | Acme Corp | Their current employer as shown in the search result. | |
Location | San Francisco Bay Area | Their listed geographic region. |
Between pages, the extension waits 60-95 seconds (30-45s on the 8th cycle, 200-230s on the 24th) while dispatching a synthetic mousemove event once a second, then auto-clicks the next-page control at the 5-second mark.
content.js: the wait/evade/auto-paginate loop that runs after each scraped batch
loadSearchEmails3(mbrList2, (result) => {
if (result) {
CTACredit = result.credit;
var found = sessionStorage.getItem("loadingfound") ? parseInt(sessionStorage.getItem("loadingfound")) : 0;
found += result.found;
sessionStorage.setItem(`loadingfound`, found.toString());
$(`#${widgetConfig.whid}twit2`).html(`Moving to next page<br>Credit:${CTACredit} / Found:${found}<br>Please wait`);
if ((mbrList2.length > 9 || $(".search-result__wrapper").length > 9 ||
$(".reusable-search__result-container").length > 9 ||
$(".search-results__result-list").length > 24) && !stopLoadSearchEmails) {
var randWait = Math.floor(Math.random() * 35 + 60);
var cnt = parseInt(sessionStorage.getItem("loadingcnt"));
if (!cnt)
cnt = 1;
else
cnt++;
sessionStorage.setItem("loadingcnt", cnt.toString());
if (cnt % 8 == 7)
randWait = 30 + Math.floor(Math.random() * 15);
if (cnt % 24 == 20)
randWait = 200 + Math.floor(Math.random() * 30);
sessionStorage.setItem("loadingdt", "start");
const its = setInterval(() => {
randWait--;
if (randWait > 0 && !stopLoadSearchEmails) {
const event = $.Event("mousemove");
event.pageX = 100;
event.pageY = Math.random() * 1000;
$(document).trigger(event);
$(`#${widgetConfig.whid}twit2`).html(`Waiting ${randWait} seconds<br>Credit: ${CTACredit} / Found: ${found}<br>Please wait`);
if (randWait == 5) {
//linkedin
if ($(".artdeco-pagination__button--next,.next").length > 0 || $(".artdeco-pagination__button--previous,.prev").length > 0) {
if ($(".artdeco-pagination__button--next,.next").length > 0)
$(".artdeco-pagination__button--next,.next").click();
else
StopSearchEmails(true);
}
//sales nav
if ($(".search-results__pagination-next-button").length > 0) {
if ($(".search-results__pagination-next-button").prop("disabled"))
StopSearchEmails(true);
else
$(".search-results__pagination-next-button").click();
}
}
}
else {
clearInterval(its);
}
}, 1000);
return setTimeout(() => {
if (!stopLoadSearchEmails) {
$(`#${widgetConfig.whid}twit2`).html(`Moving to next page <br>Credit:${CTACredit} / Found:${found}<br>Please wait`);
$("html, body").animate({ scrollTop: 4000 }, Math.random() * 5000 + 2000).promise().then(() => {
location.reload();
});
}
}, (randWait + 1) * 1000);
}
}
StopSearchEmails(true);
});
- kendoemailapp.com
The extension vendor's own backend for its paid 'email finder' product; receives each scraped batch and returns matched emails/phone numbers against the account's credit balance.
Static analysis finding. This behaviour was identified by reading the shipped extension code and has not yet been reproduced in a live run. The trigger conditions and the exact data sent are read from the code, not from an observed capture.
What it can do
Permissions this extension asks for, as declared in version 2.0.271. Asking for a permission is not a finding on its own - it is what the extension can do if it chooses to.
Read and change your data on www.linkedin.com
https://www.linkedin.com/*
Read and change your data on kendoemailapp.com
https://kendoemailapp.com/*
Store data in your browser
storage
Keep running in the background while your browser is open
background
Where it sends data
Destinations our analysis observed Kendo-Linkedin Email Finder contacting. Sending data somewhere is not a finding on its own - an extension that syncs your settings has to talk to its own server - but it is where your data can go, and who else it goes to.
- kendoemailapp.com
Kendo-Linkedin Email Finder sends data to kendoemailapp.com. No other extension we have analysed sends data here.